<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://air.imag.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=RICM4-prj14-grp12</id>
	<title>air - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://air.imag.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=RICM4-prj14-grp12"/>
	<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php/Special:Contributions/RICM4-prj14-grp12"/>
	<updated>2026-05-30T20:46:26Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22613</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22613"/>
		<updated>2015-03-28T13:25:03Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart] (Pour des raisons de confidentialité, une seule partie du code (celle du Tiled Display) est accessible)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) délivrée par un serveur Express (NodeJS) connecté à un port précis.&lt;br /&gt;
&lt;br /&gt;
La communication entre les clients et le serveur se fait grâce au module &#039;&#039;&#039;NowJS : https://github.com/Flotype/now/&#039;&#039;&#039; qui est basé sur des socket.io :&lt;br /&gt;
&lt;br /&gt;
* Les clients et le serveur vont partager un composant Now qui peut contenir des méthodes ou des variables.&lt;br /&gt;
* Les méthodes sont implémentées dans ce composant, côté client et côté serveur. &lt;br /&gt;
* Lorsqu&#039;un client veut appeler la méthode d&#039;un ou plusieurs ou tous les clients (lui compris ou non), il appelle une méthode de now implémentée côté serveur, et c&#039;est ce dernier qui est chargé d&#039;appeler le ou les méthodes des clients.&lt;br /&gt;
* NowJs fonctionne sur le principe de groupe. Le premier groupe nommé &amp;quot;everyone&amp;quot; contient tous les clients. On peut ensuite créer des sous-groupes et y ajouter les clients au fur et à mesure. Cela rend facile la sélection des clients pour l&#039;appel de méthode.&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Prérequis - Projet Table Tactile =&lt;br /&gt;
* Le serveur peut accueillir au maximum quatre clients&lt;br /&gt;
* Les tables doivent être disposées en carré et orientées vers l&#039;extérieur, de sorte que l&#039;on puisse tourner autour du carré et être dans le bon sens de lecture&lt;br /&gt;
* Le serveur distingue quatre orientations : Nord-Ouest, Nord-Est, Sud-Ouest, Sud-Est.&lt;br /&gt;
* A chaque fois qu&#039;un client se connecte, le serveur lui attribue la première orientation disponible suivant l&#039;ordre ci-dessus.&lt;br /&gt;
* Utiliser Google Chrome de préférence&lt;br /&gt;
* Activer les événements tactiles pour le navigateur Google Chrome (chrome://flags/#touch-events)&lt;br /&gt;
* Pour chaque table, le mode plein écran doit être lancé manuellement (F11) pour le mode Tiled Display (sinon la taille maximale du média sera celle du Body)&lt;br /&gt;
* Pour lancer une vidéo, utiliser les fichiers .mp4 (chrome uniquement), .ogg, .webm&lt;br /&gt;
&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images, ou la capture en temps-réel d&#039;une vidéo HTML5 dans un canvas toutes les 1000/n millisecondes (n = 60, 30 ... fps) &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
ATTENTION: Nous avons effectué des modifications dans ce module pour définir nous-même les limites de déplacement des objets. Les modifications commencent à l&#039;endroit (LIGNE 866 -&amp;gt; 912) où est indiqué le commentaire : /*AJOUT FONCTIONNALITE SUPPLEMENTAIRE*/&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi ajouté d&#039;autres options.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
&#039;&#039;&#039;Ping-pong&#039;&#039;&#039; :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drawing&#039;&#039;&#039; : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;br /&gt;
&lt;br /&gt;
= Gestion de projet =&lt;br /&gt;
==Management et leadership==&lt;br /&gt;
Nous avons décidé, malgré la séparation du projet en deux sous parties (et donc notre division en deux groupes de deux personnes), de travailler ensemble au même endroit tous les jours ouvrables de la semaine. Cela avait pour but de nous permettre à tout instant de connaître l’état d’avancement des deux projets. Les caractéristiques de chacun étaient ainsi bien exploitées. La communication interpersonnelle se faisait donc en continu (utilisation de réseaux sociaux les week-ends), afin que nul ne reste bloqué trop longtemps sur un problème. Issus de milieux très différents, la présence d’un arbitre a parfois été nécessaire. Le moindre conflit était immédiatement contrôlé par la présence d’une troisième personne prenant le rôle d’arbitre (les rôles ont tournés au cours du projet). Ces conflits étaient souvent dûs à la trop longue durée de côtoiement, côtoiement qui paradoxalement nous permettait aussi de progresser bien plus vite pour la réalisation des tâches.&lt;br /&gt;
&lt;br /&gt;
Afin d&#039;être le plus productif possible nous nous sommes séparés en deux groupes selon le sujet sur lequel chacun souhaitait travailler. De plus, nous avons organisé certaines activités hors travail (repas, bowling) afin de renforcer les liens ainsi que le respect mutuel.&lt;br /&gt;
&lt;br /&gt;
Les premières semaines ont été marquées par la présence de nombreux brainstormings, afin de cibler et séparer intelligemment les taches. Par la suite, ces séances se sont plus espacées et étaient propres à chaque partie du projet.&lt;br /&gt;
&lt;br /&gt;
Un autre aspect management de notre projet était la gestion des deux étudiants de DUT. Afin de les motiver au maximum, nous leur avons laissé le choix du projet. Nous organisions ensuite des réunions hebdomadaires en fonction de leurs disponibilités. Les tâches qui leur étaient proposées devaient permettre des résultats visibles assez rapides (toujours dans le but de les motiver).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notre groupe a la particularité d’être scindée en deux. De ce fait un leadership globale ne peut pas être mis en place. On a donc plutôt affaire à un management participatif qui implique que chaque membre va détailler le travail réalisé à son binôme. En d’autres termes, le second membre est chargé de superviser et d’apporter sa vision et son jugement sur le travail de son collègue. Par la suite, ils vont présenter à intervalles moins réguliers l’état d’avancement des objectifs principaux (sprint) à l’autre binôme. L’objectif était qu’un groupe pouvait solliciter temporairement l’aide d’un membre de l’autre groupe, pour effectuer une tâche complexe.&lt;br /&gt;
&lt;br /&gt;
A chaque objectif principal à réaliser, nous avons décidé de définir des sous objectifs pour chaque membre en restreignant les interdépendances. Cela a permis d’éviter les conflits au maximum.&lt;br /&gt;
Pour résoudre les conflits, nous avons sollicité un intervenant extérieur qui était au courant de l’avancement détaillé de notre projet.&lt;br /&gt;
&lt;br /&gt;
==Diagramme de Gantt==&lt;br /&gt;
[[File:GanttDiagram.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
==Gestion des risques==&lt;br /&gt;
Notre projet étant pour l’instant à but non lucratif, il  est soumis principalement à des risques techniques, matériels et de délais. Pour les identifier nous avons défini la matrice des risques ci-dessous :&lt;br /&gt;
[[File:MatriceRisques.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=Récapitulatif=&lt;br /&gt;
Ce projet de fin d’étude, qui s’est étalé sur deux mois, est le plus gros projet que nous avons eu à réaliser durant notre cursus à Polytech. Ces deux mois nous ont donc poussé à nous poser de nouvelles questions sur la gestion d’un groupe de personnes travaillant sur un même sujet mais avec deux directions différentes. Le groupe était composé de quatre étudiants RICM5 ainsi que de deux DUTs. Le cours de Management pour l&#039;innovation nous a permis de découvrir de nouvelles techniques qui nous ont permis de gérer ces deux situations. Il nous a permis d’approfondir et de mettre en pratique des notions que nous avons abordées lors des années précédentes.&lt;br /&gt;
&lt;br /&gt;
Nous avons suivi le cahier des charges et effectué l’ensemble des tâches à réaliser grâce à une bonne motivation, une entraide journalière et une répartition intelligente et concertée des tâches. Nous avons aussi pu éviter les conflits en évitant qu’ils s’enveniment et en promulguant de multiples activités hors travail.&lt;br /&gt;
D’un point de vue personnel, ce projet nous a tous permis d’élargir nos compétences et de découvrir de nouvelles technologies et procédés.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML&amp;diff=22612</id>
		<title>Proj-2014-2015-SmartClassRoom/UML</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML&amp;diff=22612"/>
		<updated>2015-03-28T13:23:33Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Architecture */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Diagrammes projet Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Use Case===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:caseDiag.jpg | 400px| center| thumb | Diagramme de cas d&#039;utilisation]]&lt;br /&gt;
&lt;br /&gt;
===Architecture===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:archiDiag.jpg | 800px| center| thumb | Architecture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sequence===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:tacheDiag.jpg | 600px| center| thumb | Affichage vidéo en tiled display]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Diagrammes projet Tableau interactif==&lt;br /&gt;
===Use Case===&lt;br /&gt;
coming soon&lt;br /&gt;
&lt;br /&gt;
===Classes===&lt;br /&gt;
coming soon&lt;br /&gt;
&lt;br /&gt;
===Sequence===&lt;br /&gt;
coming soon&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML&amp;diff=22611</id>
		<title>Proj-2014-2015-SmartClassRoom/UML</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML&amp;diff=22611"/>
		<updated>2015-03-28T13:23:10Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Diagrammes projet Tableau interactif */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Diagrammes projet Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Use Case===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:caseDiag.jpg | 400px| center| thumb | Diagramme de cas d&#039;utilisation]]&lt;br /&gt;
&lt;br /&gt;
===Architecture===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:archiDiag.jpg | 800px| center| thumb | Architecture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sequence===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:tacheDiag.jpg | 600px| center| thumb | Affichage vidéo en tiled display]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Diagrammes projet Tableau interactif==&lt;br /&gt;
===Use Case===&lt;br /&gt;
coming soon&lt;br /&gt;
&lt;br /&gt;
===Architecture===&lt;br /&gt;
coming soon&lt;br /&gt;
&lt;br /&gt;
===Sequence===&lt;br /&gt;
coming soon&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML&amp;diff=22610</id>
		<title>Proj-2014-2015-SmartClassRoom/UML</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML&amp;diff=22610"/>
		<updated>2015-03-28T13:22:58Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Diagrammes projet Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Use Case===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:caseDiag.jpg | 400px| center| thumb | Diagramme de cas d&#039;utilisation]]&lt;br /&gt;
&lt;br /&gt;
===Architecture===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:archiDiag.jpg | 800px| center| thumb | Architecture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sequence===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:tacheDiag.jpg | 600px| center| thumb | Affichage vidéo en tiled display]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Diagrammes projet Tableau interactif==&lt;br /&gt;
===Use Case===&lt;br /&gt;
coming soon&lt;br /&gt;
&lt;br /&gt;
===Architecture===&lt;br /&gt;
coming soon&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sequence===&lt;br /&gt;
coming soon&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML&amp;diff=22609</id>
		<title>Proj-2014-2015-SmartClassRoom/UML</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML&amp;diff=22609"/>
		<updated>2015-03-28T13:18:14Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Use Case */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Diagrammes projet Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Use Case===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:caseDiag.jpg | 400px| center| thumb | Diagramme de cas d&#039;utilisation]]&lt;br /&gt;
&lt;br /&gt;
===Architecture===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:archiDiag.jpg | 800px| center| thumb | Architecture]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Sequence===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:tacheDiag.jpg | 600px| center| thumb | Affichage vidéo en tiled display]]&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=File:MatriceRisques.png&amp;diff=22608</id>
		<title>File:MatriceRisques.png</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=File:MatriceRisques.png&amp;diff=22608"/>
		<updated>2015-03-28T13:15:05Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22607</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22607"/>
		<updated>2015-03-28T13:14:23Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Gestion de projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart] (Pour des raisons de confidentialité, une seule partie du code (celle du Tiled Display) est accessible)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) délivrée par un serveur Express (NodeJS) connecté à un port précis.&lt;br /&gt;
&lt;br /&gt;
La communication entre les clients et le serveur se fait grâce au module &#039;&#039;&#039;NowJS : https://github.com/Flotype/now/&#039;&#039;&#039; qui est basé sur des socket.io :&lt;br /&gt;
&lt;br /&gt;
* Les clients et le serveur vont partager un composant Now qui peut contenir des méthodes ou des variables.&lt;br /&gt;
* Les méthodes sont implémentées dans ce composant, côté client et côté serveur. &lt;br /&gt;
* Lorsqu&#039;un client veut appeler la méthode d&#039;un ou plusieurs ou tous les clients (lui compris ou non), il appelle une méthode de now implémentée côté serveur, et c&#039;est ce dernier qui est chargé d&#039;appeler le ou les méthodes des clients.&lt;br /&gt;
* NowJs fonctionne sur le principe de groupe. Le premier groupe nommé &amp;quot;everyone&amp;quot; contient tous les clients. On peut ensuite créer des sous-groupes et y ajouter les clients au fur et à mesure. Cela rend facile la sélection des clients pour l&#039;appel de méthode.&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Prérequis - Projet Table Tactile =&lt;br /&gt;
* Le serveur peut accueillir au maximum quatre clients&lt;br /&gt;
* Les tables doivent être disposées en carré et orientées vers l&#039;extérieur, de sorte que l&#039;on puisse tourner autour du carré et être dans le bon sens de lecture&lt;br /&gt;
* Le serveur distingue quatre orientations : Nord-Ouest, Nord-Est, Sud-Ouest, Sud-Est.&lt;br /&gt;
* A chaque fois qu&#039;un client se connecte, le serveur lui attribue la première orientation disponible suivant l&#039;ordre ci-dessus.&lt;br /&gt;
* Utiliser Google Chrome de préférence&lt;br /&gt;
* Activer les événements tactiles pour le navigateur Google Chrome (chrome://flags/#touch-events)&lt;br /&gt;
* Pour chaque table, le mode plein écran doit être lancé manuellement (F11) pour le mode Tiled Display (sinon la taille maximale du média sera celle du Body)&lt;br /&gt;
* Pour lancer une vidéo, utiliser les fichiers .mp4 (chrome uniquement), .ogg, .webm&lt;br /&gt;
&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images, ou la capture en temps-réel d&#039;une vidéo HTML5 dans un canvas toutes les 1000/n millisecondes (n = 60, 30 ... fps) &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
ATTENTION: Nous avons effectué des modifications dans ce module pour définir nous-même les limites de déplacement des objets. Les modifications commencent à l&#039;endroit (LIGNE 866 -&amp;gt; 912) où est indiqué le commentaire : /*AJOUT FONCTIONNALITE SUPPLEMENTAIRE*/&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi ajouté d&#039;autres options.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
&#039;&#039;&#039;Ping-pong&#039;&#039;&#039; :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drawing&#039;&#039;&#039; : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;br /&gt;
&lt;br /&gt;
= Gestion de projet =&lt;br /&gt;
==Management et leadership==&lt;br /&gt;
Nous avons décidé, malgré la séparation du projet en deux sous parties (et donc notre division en deux groupes de deux personnes), de travailler ensemble au même endroit tous les jours ouvrables de la semaine. Cela avait pour but de nous permettre à tout instant de connaître l’état d’avancement des deux projets. Les caractéristiques de chacun étaient ainsi bien exploitées. La communication interpersonnelle se faisait donc en continu (utilisation de réseaux sociaux les week-ends), afin que nul ne reste bloqué trop longtemps sur un problème. Issus de milieux très différents, la présence d’un arbitre a parfois été nécessaire. Le moindre conflit était immédiatement contrôlé par la présence d’une troisième personne prenant le rôle d’arbitre (les rôles ont tournés au cours du projet). Ces conflits étaient souvent dûs à la trop longue durée de côtoiement, côtoiement qui paradoxalement nous permettait aussi de progresser bien plus vite pour la réalisation des tâches.&lt;br /&gt;
&lt;br /&gt;
Afin d&#039;être le plus productif possible nous nous sommes séparés en deux groupes selon le sujet sur lequel chacun souhaitait travailler. De plus, nous avons organisé certaines activités hors travail (repas, bowling) afin de renforcer les liens ainsi que le respect mutuel.&lt;br /&gt;
&lt;br /&gt;
Les premières semaines ont été marquées par la présence de nombreux brainstormings, afin de cibler et séparer intelligemment les taches. Par la suite, ces séances se sont plus espacées et étaient propres à chaque partie du projet.&lt;br /&gt;
&lt;br /&gt;
Un autre aspect management de notre projet était la gestion des deux étudiants de DUT. Afin de les motiver au maximum, nous leur avons laissé le choix du projet. Nous organisions ensuite des réunions hebdomadaires en fonction de leurs disponibilités. Les tâches qui leur étaient proposées devaient permettre des résultats visibles assez rapides (toujours dans le but de les motiver).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notre groupe a la particularité d’être scindée en deux. De ce fait un leadership globale ne peut pas être mis en place. On a donc plutôt affaire à un management participatif qui implique que chaque membre va détailler le travail réalisé à son binôme. En d’autres termes, le second membre est chargé de superviser et d’apporter sa vision et son jugement sur le travail de son collègue. Par la suite, ils vont présenter à intervalles moins réguliers l’état d’avancement des objectifs principaux (sprint) à l’autre binôme. L’objectif était qu’un groupe pouvait solliciter temporairement l’aide d’un membre de l’autre groupe, pour effectuer une tâche complexe.&lt;br /&gt;
&lt;br /&gt;
A chaque objectif principal à réaliser, nous avons décidé de définir des sous objectifs pour chaque membre en restreignant les interdépendances. Cela a permis d’éviter les conflits au maximum.&lt;br /&gt;
Pour résoudre les conflits, nous avons sollicité un intervenant extérieur qui était au courant de l’avancement détaillé de notre projet.&lt;br /&gt;
&lt;br /&gt;
==Diagramme de Gantt==&lt;br /&gt;
[[File:GanttDiagram.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
==Gestion des risques==&lt;br /&gt;
Notre projet étant pour l’instant à but non lucratif, il  est soumis principalement à des risques techniques, matériels et de délais. Pour les identifier nous avons défini la matrice des risques ci-dessous :&lt;br /&gt;
[[File:MatriceRisques.png|500px|thumb|center]]&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22606</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22606"/>
		<updated>2015-03-28T13:08:17Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Management et leadership */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart] (Pour des raisons de confidentialité, une seule partie du code (celle du Tiled Display) est accessible)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) délivrée par un serveur Express (NodeJS) connecté à un port précis.&lt;br /&gt;
&lt;br /&gt;
La communication entre les clients et le serveur se fait grâce au module &#039;&#039;&#039;NowJS : https://github.com/Flotype/now/&#039;&#039;&#039; qui est basé sur des socket.io :&lt;br /&gt;
&lt;br /&gt;
* Les clients et le serveur vont partager un composant Now qui peut contenir des méthodes ou des variables.&lt;br /&gt;
* Les méthodes sont implémentées dans ce composant, côté client et côté serveur. &lt;br /&gt;
* Lorsqu&#039;un client veut appeler la méthode d&#039;un ou plusieurs ou tous les clients (lui compris ou non), il appelle une méthode de now implémentée côté serveur, et c&#039;est ce dernier qui est chargé d&#039;appeler le ou les méthodes des clients.&lt;br /&gt;
* NowJs fonctionne sur le principe de groupe. Le premier groupe nommé &amp;quot;everyone&amp;quot; contient tous les clients. On peut ensuite créer des sous-groupes et y ajouter les clients au fur et à mesure. Cela rend facile la sélection des clients pour l&#039;appel de méthode.&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Prérequis - Projet Table Tactile =&lt;br /&gt;
* Le serveur peut accueillir au maximum quatre clients&lt;br /&gt;
* Les tables doivent être disposées en carré et orientées vers l&#039;extérieur, de sorte que l&#039;on puisse tourner autour du carré et être dans le bon sens de lecture&lt;br /&gt;
* Le serveur distingue quatre orientations : Nord-Ouest, Nord-Est, Sud-Ouest, Sud-Est.&lt;br /&gt;
* A chaque fois qu&#039;un client se connecte, le serveur lui attribue la première orientation disponible suivant l&#039;ordre ci-dessus.&lt;br /&gt;
* Utiliser Google Chrome de préférence&lt;br /&gt;
* Activer les événements tactiles pour le navigateur Google Chrome (chrome://flags/#touch-events)&lt;br /&gt;
* Pour chaque table, le mode plein écran doit être lancé manuellement (F11) pour le mode Tiled Display (sinon la taille maximale du média sera celle du Body)&lt;br /&gt;
* Pour lancer une vidéo, utiliser les fichiers .mp4 (chrome uniquement), .ogg, .webm&lt;br /&gt;
&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images, ou la capture en temps-réel d&#039;une vidéo HTML5 dans un canvas toutes les 1000/n millisecondes (n = 60, 30 ... fps) &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
ATTENTION: Nous avons effectué des modifications dans ce module pour définir nous-même les limites de déplacement des objets. Les modifications commencent à l&#039;endroit (LIGNE 866 -&amp;gt; 912) où est indiqué le commentaire : /*AJOUT FONCTIONNALITE SUPPLEMENTAIRE*/&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi ajouté d&#039;autres options.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
&#039;&#039;&#039;Ping-pong&#039;&#039;&#039; :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drawing&#039;&#039;&#039; : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;br /&gt;
&lt;br /&gt;
= Gestion de projet =&lt;br /&gt;
==Management et leadership==&lt;br /&gt;
Nous avons décidé, malgré la séparation du projet en deux sous parties (et donc notre division en deux groupes de deux personnes), de travailler ensemble au même endroit tous les jours ouvrables de la semaine. Cela avait pour but de nous permettre à tout instant de connaître l’état d’avancement des deux projets. Les caractéristiques de chacun étaient ainsi bien exploitées. La communication interpersonnelle se faisait donc en continu (utilisation de réseaux sociaux les week-ends), afin que nul ne reste bloqué trop longtemps sur un problème. Issus de milieux très différents, la présence d’un arbitre a parfois été nécessaire. Le moindre conflit était immédiatement contrôlé par la présence d’une troisième personne prenant le rôle d’arbitre (les rôles ont tournés au cours du projet). Ces conflits étaient souvent dûs à la trop longue durée de côtoiement, côtoiement qui paradoxalement nous permettait aussi de progresser bien plus vite pour la réalisation des tâches.&lt;br /&gt;
&lt;br /&gt;
Afin d&#039;être le plus productif possible nous nous sommes séparés en deux groupes selon le sujet sur lequel chacun souhaitait travailler. De plus, nous avons organisé certaines activités hors travail (repas, bowling) afin de renforcer les liens ainsi que le respect mutuel.&lt;br /&gt;
&lt;br /&gt;
Les premières semaines ont été marquées par la présence de nombreux brainstormings, afin de cibler et séparer intelligemment les taches. Par la suite, ces séances se sont plus espacées et étaient propres à chaque partie du projet.&lt;br /&gt;
&lt;br /&gt;
Un autre aspect management de notre projet était la gestion des deux étudiants de DUT. Afin de les motiver au maximum, nous leur avons laissé le choix du projet. Nous organisions ensuite des réunions hebdomadaires en fonction de leurs disponibilités. Les tâches qui leur étaient proposées devaient permettre des résultats visibles assez rapides (toujours dans le but de les motiver).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notre groupe a la particularité d’être scindée en deux. De ce fait un leadership globale ne peut pas être mis en place. On a donc plutôt affaire à un management participatif qui implique que chaque membre va détailler le travail réalisé à son binôme. En d’autres termes, le second membre est chargé de superviser et d’apporter sa vision et son jugement sur le travail de son collègue. Par la suite, ils vont présenter à intervalles moins réguliers l’état d’avancement des objectifs principaux (sprint) à l’autre binôme. L’objectif était qu’un groupe pouvait solliciter temporairement l’aide d’un membre de l’autre groupe, pour effectuer une tâche complexe.&lt;br /&gt;
&lt;br /&gt;
A chaque objectif principal à réaliser, nous avons décidé de définir des sous objectifs pour chaque membre en restreignant les interdépendances. Cela a permis d’éviter les conflits au maximum.&lt;br /&gt;
Pour résoudre les conflits, nous avons sollicité un intervenant extérieur qui était au courant de l’avancement détaillé de notre projet.&lt;br /&gt;
&lt;br /&gt;
==Diagramme de Gantt==&lt;br /&gt;
[[File:GanttDiagram.png|500px|thumb|center]]&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=File:GanttDiagram.png&amp;diff=22605</id>
		<title>File:GanttDiagram.png</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=File:GanttDiagram.png&amp;diff=22605"/>
		<updated>2015-03-28T12:57:15Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22604</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22604"/>
		<updated>2015-03-28T12:56:12Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Diagramme de Gantt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart] (Pour des raisons de confidentialité, une seule partie du code (celle du Tiled Display) est accessible)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) délivrée par un serveur Express (NodeJS) connecté à un port précis.&lt;br /&gt;
&lt;br /&gt;
La communication entre les clients et le serveur se fait grâce au module &#039;&#039;&#039;NowJS : https://github.com/Flotype/now/&#039;&#039;&#039; qui est basé sur des socket.io :&lt;br /&gt;
&lt;br /&gt;
* Les clients et le serveur vont partager un composant Now qui peut contenir des méthodes ou des variables.&lt;br /&gt;
* Les méthodes sont implémentées dans ce composant, côté client et côté serveur. &lt;br /&gt;
* Lorsqu&#039;un client veut appeler la méthode d&#039;un ou plusieurs ou tous les clients (lui compris ou non), il appelle une méthode de now implémentée côté serveur, et c&#039;est ce dernier qui est chargé d&#039;appeler le ou les méthodes des clients.&lt;br /&gt;
* NowJs fonctionne sur le principe de groupe. Le premier groupe nommé &amp;quot;everyone&amp;quot; contient tous les clients. On peut ensuite créer des sous-groupes et y ajouter les clients au fur et à mesure. Cela rend facile la sélection des clients pour l&#039;appel de méthode.&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Prérequis - Projet Table Tactile =&lt;br /&gt;
* Le serveur peut accueillir au maximum quatre clients&lt;br /&gt;
* Les tables doivent être disposées en carré et orientées vers l&#039;extérieur, de sorte que l&#039;on puisse tourner autour du carré et être dans le bon sens de lecture&lt;br /&gt;
* Le serveur distingue quatre orientations : Nord-Ouest, Nord-Est, Sud-Ouest, Sud-Est.&lt;br /&gt;
* A chaque fois qu&#039;un client se connecte, le serveur lui attribue la première orientation disponible suivant l&#039;ordre ci-dessus.&lt;br /&gt;
* Utiliser Google Chrome de préférence&lt;br /&gt;
* Activer les événements tactiles pour le navigateur Google Chrome (chrome://flags/#touch-events)&lt;br /&gt;
* Pour chaque table, le mode plein écran doit être lancé manuellement (F11) pour le mode Tiled Display (sinon la taille maximale du média sera celle du Body)&lt;br /&gt;
* Pour lancer une vidéo, utiliser les fichiers .mp4 (chrome uniquement), .ogg, .webm&lt;br /&gt;
&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images, ou la capture en temps-réel d&#039;une vidéo HTML5 dans un canvas toutes les 1000/n millisecondes (n = 60, 30 ... fps) &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
ATTENTION: Nous avons effectué des modifications dans ce module pour définir nous-même les limites de déplacement des objets. Les modifications commencent à l&#039;endroit (LIGNE 866 -&amp;gt; 912) où est indiqué le commentaire : /*AJOUT FONCTIONNALITE SUPPLEMENTAIRE*/&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi ajouté d&#039;autres options.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
&#039;&#039;&#039;Ping-pong&#039;&#039;&#039; :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drawing&#039;&#039;&#039; : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;br /&gt;
&lt;br /&gt;
= Gestion de projet =&lt;br /&gt;
==Management et leadership==&lt;br /&gt;
Nous avons décidé, malgré la séparation du projet en deux sous parties (et donc notre division en deux groupes de deux personnes), de travailler ensemble au même endroit tous les jours ouvrables de la semaine. Cela avait pour but de nous permettre à tout instant de connaître l’état d’avancement des deux projets. Les caractéristiques de chacun étaient ainsi bien exploitées. La communication interpersonnelle se faisait donc en continu (utilisation de réseaux sociaux les week-ends), afin que nul ne reste bloqué trop longtemps sur un problème. Issus de milieux très différents, la présence d’un arbitre a parfois été nécessaire. Le moindre conflit était immédiatement contrôlé par la présence d’une troisième personne prenant le rôle d’arbitre (les rôles ont tournés au cours du projet). Ces conflits étaient souvent dûs à la trop longue durée de côtoiement, côtoiement qui paradoxalement nous permettait aussi de progresser bien plus vite pour la réalisation des tâches.&lt;br /&gt;
&lt;br /&gt;
Afin d&#039;être le plus productif possible nous nous sommes séparés en deux groupes selon le sujet sur lequel chacun souhaitait travailler. De plus, nous avons organisé certaines activités hors travail (repas, bowling) afin de renforcer les liens ainsi que le respect mutuel.&lt;br /&gt;
&lt;br /&gt;
Les premières semaines ont été marquées par la présence de nombreux brainstormings, afin de cibler et séparer intelligemment les taches. Par la suite, ces séances se sont plus espacées et étaient propres à chaque partie du projet.&lt;br /&gt;
&lt;br /&gt;
Un autre aspect management de notre projet était la gestion des deux étudiants de DUT. Afin de les motiver au maximum, nous leur avons laissé le choix du projet. Nous organisions ensuite des réunions hebdomadaires en fonctions de leurs disponibilités. Les tâches qui leur étaient proposées devaient permettre des résultats visibles assez rapides (toujours dans le but de les motiver).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notre groupe a la particularité d’être scindée en deux. De ce fait un leadership globale ne peut pas être mis en place. On a donc plutôt affaire à un management participatif qui implique que chaque membre va détailler le travail réalisé à son binôme. En d’autres termes, le second membre est chargé de superviser et d’apporter sa vision et son jugement sur le travail de son collègue. Par la suite, ils vont présenter à intervalles moins réguliers l’état d’avancement des objectifs principaux (sprint) à l’autre binôme. L’objectif était qu’un groupe pouvait solliciter temporairement l’aide d’un membre de l’autre groupe, pour effectuer une tâche complexe.&lt;br /&gt;
&lt;br /&gt;
A chaque objectif principal à réaliser, nous avons décidé de définir des sous objectifs pour chaque membre en restreignant les interdépendances. Cela a permis d’éviter les conflits au maximum.&lt;br /&gt;
Pour résoudre les conflits, nous avons sollicité un intervenant extérieur qui était au courant de l’avancement détaillé de notre projet.&lt;br /&gt;
&lt;br /&gt;
==Diagramme de Gantt==&lt;br /&gt;
[[File:GanttDiagram.png|500px|thumb|center]]&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22603</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22603"/>
		<updated>2015-03-28T12:55:07Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Gestion de projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart] (Pour des raisons de confidentialité, une seule partie du code (celle du Tiled Display) est accessible)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) délivrée par un serveur Express (NodeJS) connecté à un port précis.&lt;br /&gt;
&lt;br /&gt;
La communication entre les clients et le serveur se fait grâce au module &#039;&#039;&#039;NowJS : https://github.com/Flotype/now/&#039;&#039;&#039; qui est basé sur des socket.io :&lt;br /&gt;
&lt;br /&gt;
* Les clients et le serveur vont partager un composant Now qui peut contenir des méthodes ou des variables.&lt;br /&gt;
* Les méthodes sont implémentées dans ce composant, côté client et côté serveur. &lt;br /&gt;
* Lorsqu&#039;un client veut appeler la méthode d&#039;un ou plusieurs ou tous les clients (lui compris ou non), il appelle une méthode de now implémentée côté serveur, et c&#039;est ce dernier qui est chargé d&#039;appeler le ou les méthodes des clients.&lt;br /&gt;
* NowJs fonctionne sur le principe de groupe. Le premier groupe nommé &amp;quot;everyone&amp;quot; contient tous les clients. On peut ensuite créer des sous-groupes et y ajouter les clients au fur et à mesure. Cela rend facile la sélection des clients pour l&#039;appel de méthode.&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Prérequis - Projet Table Tactile =&lt;br /&gt;
* Le serveur peut accueillir au maximum quatre clients&lt;br /&gt;
* Les tables doivent être disposées en carré et orientées vers l&#039;extérieur, de sorte que l&#039;on puisse tourner autour du carré et être dans le bon sens de lecture&lt;br /&gt;
* Le serveur distingue quatre orientations : Nord-Ouest, Nord-Est, Sud-Ouest, Sud-Est.&lt;br /&gt;
* A chaque fois qu&#039;un client se connecte, le serveur lui attribue la première orientation disponible suivant l&#039;ordre ci-dessus.&lt;br /&gt;
* Utiliser Google Chrome de préférence&lt;br /&gt;
* Activer les événements tactiles pour le navigateur Google Chrome (chrome://flags/#touch-events)&lt;br /&gt;
* Pour chaque table, le mode plein écran doit être lancé manuellement (F11) pour le mode Tiled Display (sinon la taille maximale du média sera celle du Body)&lt;br /&gt;
* Pour lancer une vidéo, utiliser les fichiers .mp4 (chrome uniquement), .ogg, .webm&lt;br /&gt;
&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images, ou la capture en temps-réel d&#039;une vidéo HTML5 dans un canvas toutes les 1000/n millisecondes (n = 60, 30 ... fps) &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
ATTENTION: Nous avons effectué des modifications dans ce module pour définir nous-même les limites de déplacement des objets. Les modifications commencent à l&#039;endroit (LIGNE 866 -&amp;gt; 912) où est indiqué le commentaire : /*AJOUT FONCTIONNALITE SUPPLEMENTAIRE*/&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi ajouté d&#039;autres options.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
&#039;&#039;&#039;Ping-pong&#039;&#039;&#039; :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drawing&#039;&#039;&#039; : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;br /&gt;
&lt;br /&gt;
= Gestion de projet =&lt;br /&gt;
==Management et leadership==&lt;br /&gt;
Nous avons décidé, malgré la séparation du projet en deux sous parties (et donc notre division en deux groupes de deux personnes), de travailler ensemble au même endroit tous les jours ouvrables de la semaine. Cela avait pour but de nous permettre à tout instant de connaître l’état d’avancement des deux projets. Les caractéristiques de chacun étaient ainsi bien exploitées. La communication interpersonnelle se faisait donc en continu (utilisation de réseaux sociaux les week-ends), afin que nul ne reste bloqué trop longtemps sur un problème. Issus de milieux très différents, la présence d’un arbitre a parfois été nécessaire. Le moindre conflit était immédiatement contrôlé par la présence d’une troisième personne prenant le rôle d’arbitre (les rôles ont tournés au cours du projet). Ces conflits étaient souvent dûs à la trop longue durée de côtoiement, côtoiement qui paradoxalement nous permettait aussi de progresser bien plus vite pour la réalisation des tâches.&lt;br /&gt;
&lt;br /&gt;
Afin d&#039;être le plus productif possible nous nous sommes séparés en deux groupes selon le sujet sur lequel chacun souhaitait travailler. De plus, nous avons organisé certaines activités hors travail (repas, bowling) afin de renforcer les liens ainsi que le respect mutuel.&lt;br /&gt;
&lt;br /&gt;
Les premières semaines ont été marquées par la présence de nombreux brainstormings, afin de cibler et séparer intelligemment les taches. Par la suite, ces séances se sont plus espacées et étaient propres à chaque partie du projet.&lt;br /&gt;
&lt;br /&gt;
Un autre aspect management de notre projet était la gestion des deux étudiants de DUT. Afin de les motiver au maximum, nous leur avons laissé le choix du projet. Nous organisions ensuite des réunions hebdomadaires en fonctions de leurs disponibilités. Les tâches qui leur étaient proposées devaient permettre des résultats visibles assez rapides (toujours dans le but de les motiver).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notre groupe a la particularité d’être scindée en deux. De ce fait un leadership globale ne peut pas être mis en place. On a donc plutôt affaire à un management participatif qui implique que chaque membre va détailler le travail réalisé à son binôme. En d’autres termes, le second membre est chargé de superviser et d’apporter sa vision et son jugement sur le travail de son collègue. Par la suite, ils vont présenter à intervalles moins réguliers l’état d’avancement des objectifs principaux (sprint) à l’autre binôme. L’objectif était qu’un groupe pouvait solliciter temporairement l’aide d’un membre de l’autre groupe, pour effectuer une tâche complexe.&lt;br /&gt;
&lt;br /&gt;
A chaque objectif principal à réaliser, nous avons décidé de définir des sous objectifs pour chaque membre en restreignant les interdépendances. Cela a permis d’éviter les conflits au maximum.&lt;br /&gt;
Pour résoudre les conflits, nous avons sollicité un intervenant extérieur qui était au courant de l’avancement détaillé de notre projet.&lt;br /&gt;
&lt;br /&gt;
==Diagramme de Gantt==&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22602</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22602"/>
		<updated>2015-03-28T12:54:24Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Management et leadership */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart] (Pour des raisons de confidentialité, une seule partie du code (celle du Tiled Display) est accessible)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) délivrée par un serveur Express (NodeJS) connecté à un port précis.&lt;br /&gt;
&lt;br /&gt;
La communication entre les clients et le serveur se fait grâce au module &#039;&#039;&#039;NowJS : https://github.com/Flotype/now/&#039;&#039;&#039; qui est basé sur des socket.io :&lt;br /&gt;
&lt;br /&gt;
* Les clients et le serveur vont partager un composant Now qui peut contenir des méthodes ou des variables.&lt;br /&gt;
* Les méthodes sont implémentées dans ce composant, côté client et côté serveur. &lt;br /&gt;
* Lorsqu&#039;un client veut appeler la méthode d&#039;un ou plusieurs ou tous les clients (lui compris ou non), il appelle une méthode de now implémentée côté serveur, et c&#039;est ce dernier qui est chargé d&#039;appeler le ou les méthodes des clients.&lt;br /&gt;
* NowJs fonctionne sur le principe de groupe. Le premier groupe nommé &amp;quot;everyone&amp;quot; contient tous les clients. On peut ensuite créer des sous-groupes et y ajouter les clients au fur et à mesure. Cela rend facile la sélection des clients pour l&#039;appel de méthode.&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Prérequis - Projet Table Tactile =&lt;br /&gt;
* Le serveur peut accueillir au maximum quatre clients&lt;br /&gt;
* Les tables doivent être disposées en carré et orientées vers l&#039;extérieur, de sorte que l&#039;on puisse tourner autour du carré et être dans le bon sens de lecture&lt;br /&gt;
* Le serveur distingue quatre orientations : Nord-Ouest, Nord-Est, Sud-Ouest, Sud-Est.&lt;br /&gt;
* A chaque fois qu&#039;un client se connecte, le serveur lui attribue la première orientation disponible suivant l&#039;ordre ci-dessus.&lt;br /&gt;
* Utiliser Google Chrome de préférence&lt;br /&gt;
* Activer les événements tactiles pour le navigateur Google Chrome (chrome://flags/#touch-events)&lt;br /&gt;
* Pour chaque table, le mode plein écran doit être lancé manuellement (F11) pour le mode Tiled Display (sinon la taille maximale du média sera celle du Body)&lt;br /&gt;
* Pour lancer une vidéo, utiliser les fichiers .mp4 (chrome uniquement), .ogg, .webm&lt;br /&gt;
&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images, ou la capture en temps-réel d&#039;une vidéo HTML5 dans un canvas toutes les 1000/n millisecondes (n = 60, 30 ... fps) &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
ATTENTION: Nous avons effectué des modifications dans ce module pour définir nous-même les limites de déplacement des objets. Les modifications commencent à l&#039;endroit (LIGNE 866 -&amp;gt; 912) où est indiqué le commentaire : /*AJOUT FONCTIONNALITE SUPPLEMENTAIRE*/&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi ajouté d&#039;autres options.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
&#039;&#039;&#039;Ping-pong&#039;&#039;&#039; :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drawing&#039;&#039;&#039; : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;br /&gt;
&lt;br /&gt;
= Gestion de projet =&lt;br /&gt;
==Management et leadership==&lt;br /&gt;
Nous avons décidé, malgré la séparation du projet en deux sous parties (et donc notre division en deux groupes de deux personnes), de travailler ensemble au même endroit tous les jours ouvrables de la semaine. Cela avait pour but de nous permettre à tout instant de connaître l’état d’avancement des deux projets. Les caractéristiques de chacun étaient ainsi bien exploitées. La communication interpersonnelle se faisait donc en continu (utilisation de réseaux sociaux les week-ends), afin que nul ne reste bloqué trop longtemps sur un problème. Issus de milieux très différents, la présence d’un arbitre a parfois été nécessaire. Le moindre conflit était immédiatement contrôlé par la présence d’une troisième personne prenant le rôle d’arbitre (les rôles ont tournés au cours du projet). Ces conflits étaient souvent dûs à la trop longue durée de côtoiement, côtoiement qui paradoxalement nous permettait aussi de progresser bien plus vite pour la réalisation des tâches.&lt;br /&gt;
&lt;br /&gt;
Afin d&#039;être le plus productif possible nous nous sommes séparés en deux groupes selon le sujet sur lequel chacun souhaitait travailler. De plus, nous avons organisé certaines activités hors travail (repas, bowling) afin de renforcer les liens ainsi que le respect mutuel.&lt;br /&gt;
&lt;br /&gt;
Les premières semaines ont été marquées par la présence de nombreux brainstormings, afin de cibler et séparer intelligemment les taches. Par la suite, ces séances se sont plus espacées et étaient propres à chaque partie du projet.&lt;br /&gt;
&lt;br /&gt;
Un autre aspect management de notre projet était la gestion des deux étudiants de DUT. Afin de les motiver au maximum, nous leur avons laissé le choix du projet. Nous organisions ensuite des réunions hebdomadaires en fonctions de leurs disponibilités. Les tâches qui leur étaient proposées devaient permettre des résultats visibles assez rapides (toujours dans le but de les motiver).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Notre groupe a la particularité d’être scindée en deux. De ce fait un leadership globale ne peut pas être mis en place. On a donc plutôt affaire à un management participatif qui implique que chaque membre va détailler le travail réalisé à son binôme. En d’autres termes, le second membre est chargé de superviser et d’apporter sa vision et son jugement sur le travail de son collègue. Par la suite, ils vont présenter à intervalles moins réguliers l’état d’avancement des objectifs principaux (sprint) à l’autre binôme. L’objectif était qu’un groupe pouvait solliciter temporairement l’aide d’un membre de l’autre groupe, pour effectuer une tâche complexe.&lt;br /&gt;
&lt;br /&gt;
A chaque objectif principal à réaliser, nous avons décidé de définir des sous objectifs pour chaque membre en restreignant les interdépendances. Cela a permis d’éviter les conflits au maximum.&lt;br /&gt;
Pour résoudre les conflits, nous avons sollicité un intervenant extérieur qui était au courant de l’avancement détaillé de notre projet.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22601</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22601"/>
		<updated>2015-03-28T12:52:11Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Gestion de projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart] (Pour des raisons de confidentialité, une seule partie du code (celle du Tiled Display) est accessible)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) délivrée par un serveur Express (NodeJS) connecté à un port précis.&lt;br /&gt;
&lt;br /&gt;
La communication entre les clients et le serveur se fait grâce au module &#039;&#039;&#039;NowJS : https://github.com/Flotype/now/&#039;&#039;&#039; qui est basé sur des socket.io :&lt;br /&gt;
&lt;br /&gt;
* Les clients et le serveur vont partager un composant Now qui peut contenir des méthodes ou des variables.&lt;br /&gt;
* Les méthodes sont implémentées dans ce composant, côté client et côté serveur. &lt;br /&gt;
* Lorsqu&#039;un client veut appeler la méthode d&#039;un ou plusieurs ou tous les clients (lui compris ou non), il appelle une méthode de now implémentée côté serveur, et c&#039;est ce dernier qui est chargé d&#039;appeler le ou les méthodes des clients.&lt;br /&gt;
* NowJs fonctionne sur le principe de groupe. Le premier groupe nommé &amp;quot;everyone&amp;quot; contient tous les clients. On peut ensuite créer des sous-groupes et y ajouter les clients au fur et à mesure. Cela rend facile la sélection des clients pour l&#039;appel de méthode.&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Prérequis - Projet Table Tactile =&lt;br /&gt;
* Le serveur peut accueillir au maximum quatre clients&lt;br /&gt;
* Les tables doivent être disposées en carré et orientées vers l&#039;extérieur, de sorte que l&#039;on puisse tourner autour du carré et être dans le bon sens de lecture&lt;br /&gt;
* Le serveur distingue quatre orientations : Nord-Ouest, Nord-Est, Sud-Ouest, Sud-Est.&lt;br /&gt;
* A chaque fois qu&#039;un client se connecte, le serveur lui attribue la première orientation disponible suivant l&#039;ordre ci-dessus.&lt;br /&gt;
* Utiliser Google Chrome de préférence&lt;br /&gt;
* Activer les événements tactiles pour le navigateur Google Chrome (chrome://flags/#touch-events)&lt;br /&gt;
* Pour chaque table, le mode plein écran doit être lancé manuellement (F11) pour le mode Tiled Display (sinon la taille maximale du média sera celle du Body)&lt;br /&gt;
* Pour lancer une vidéo, utiliser les fichiers .mp4 (chrome uniquement), .ogg, .webm&lt;br /&gt;
&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images, ou la capture en temps-réel d&#039;une vidéo HTML5 dans un canvas toutes les 1000/n millisecondes (n = 60, 30 ... fps) &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
ATTENTION: Nous avons effectué des modifications dans ce module pour définir nous-même les limites de déplacement des objets. Les modifications commencent à l&#039;endroit (LIGNE 866 -&amp;gt; 912) où est indiqué le commentaire : /*AJOUT FONCTIONNALITE SUPPLEMENTAIRE*/&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi ajouté d&#039;autres options.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
&#039;&#039;&#039;Ping-pong&#039;&#039;&#039; :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drawing&#039;&#039;&#039; : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;br /&gt;
&lt;br /&gt;
= Gestion de projet =&lt;br /&gt;
==Management et leadership==&lt;br /&gt;
Nous avons décidé, malgré la séparation du projet en deux sous parties (et donc notre division en deux groupes de deux personnes), de travailler ensemble au même endroit tous les jours ouvrables de la semaine. Cela avait pour but de nous permettre à tout instant de connaître l’état d’avancement des deux projets. Les caractéristiques de chacun étaient ainsi bien exploitées. La communication interpersonnelle se faisait donc en continu (utilisation de réseaux sociaux les week-ends), afin que nul ne reste bloqué trop longtemps sur un problème. Issus de milieux très différents, la présence d’un arbitre a parfois été nécessaire. Le moindre conflit était immédiatement contrôlé par la présence d’une troisième personne prenant le rôle d’arbitre (les rôles ont tournés au cours du projet). Ces conflits étaient souvent dûs à la trop longue durée de côtoiement, côtoiement qui paradoxalement nous permettait aussi de progresser bien plus vite pour la réalisation des tâches.&lt;br /&gt;
&lt;br /&gt;
Afin d&#039;être le plus productif possible nous nous sommes séparés en deux groupes selon le sujet sur lequel chacun souhaitait travailler. De plus, nous avons organisé certaines activités hors travail (repas, bowling) afin de renforcer les liens ainsi que le respect mutuel.&lt;br /&gt;
&lt;br /&gt;
Les premières semaines ont été marquées par la présence de nombreux brainstormings, afin de cibler et séparer intelligemment les taches. Par la suite, ces séances se sont plus espacées et étaient propres à chaque partie du projet.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22600</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22600"/>
		<updated>2015-03-28T12:52:01Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Gestion de projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart] (Pour des raisons de confidentialité, une seule partie du code (celle du Tiled Display) est accessible)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) délivrée par un serveur Express (NodeJS) connecté à un port précis.&lt;br /&gt;
&lt;br /&gt;
La communication entre les clients et le serveur se fait grâce au module &#039;&#039;&#039;NowJS : https://github.com/Flotype/now/&#039;&#039;&#039; qui est basé sur des socket.io :&lt;br /&gt;
&lt;br /&gt;
* Les clients et le serveur vont partager un composant Now qui peut contenir des méthodes ou des variables.&lt;br /&gt;
* Les méthodes sont implémentées dans ce composant, côté client et côté serveur. &lt;br /&gt;
* Lorsqu&#039;un client veut appeler la méthode d&#039;un ou plusieurs ou tous les clients (lui compris ou non), il appelle une méthode de now implémentée côté serveur, et c&#039;est ce dernier qui est chargé d&#039;appeler le ou les méthodes des clients.&lt;br /&gt;
* NowJs fonctionne sur le principe de groupe. Le premier groupe nommé &amp;quot;everyone&amp;quot; contient tous les clients. On peut ensuite créer des sous-groupes et y ajouter les clients au fur et à mesure. Cela rend facile la sélection des clients pour l&#039;appel de méthode.&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Prérequis - Projet Table Tactile =&lt;br /&gt;
* Le serveur peut accueillir au maximum quatre clients&lt;br /&gt;
* Les tables doivent être disposées en carré et orientées vers l&#039;extérieur, de sorte que l&#039;on puisse tourner autour du carré et être dans le bon sens de lecture&lt;br /&gt;
* Le serveur distingue quatre orientations : Nord-Ouest, Nord-Est, Sud-Ouest, Sud-Est.&lt;br /&gt;
* A chaque fois qu&#039;un client se connecte, le serveur lui attribue la première orientation disponible suivant l&#039;ordre ci-dessus.&lt;br /&gt;
* Utiliser Google Chrome de préférence&lt;br /&gt;
* Activer les événements tactiles pour le navigateur Google Chrome (chrome://flags/#touch-events)&lt;br /&gt;
* Pour chaque table, le mode plein écran doit être lancé manuellement (F11) pour le mode Tiled Display (sinon la taille maximale du média sera celle du Body)&lt;br /&gt;
* Pour lancer une vidéo, utiliser les fichiers .mp4 (chrome uniquement), .ogg, .webm&lt;br /&gt;
&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images, ou la capture en temps-réel d&#039;une vidéo HTML5 dans un canvas toutes les 1000/n millisecondes (n = 60, 30 ... fps) &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
ATTENTION: Nous avons effectué des modifications dans ce module pour définir nous-même les limites de déplacement des objets. Les modifications commencent à l&#039;endroit (LIGNE 866 -&amp;gt; 912) où est indiqué le commentaire : /*AJOUT FONCTIONNALITE SUPPLEMENTAIRE*/&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi ajouté d&#039;autres options.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
&#039;&#039;&#039;Ping-pong&#039;&#039;&#039; :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drawing&#039;&#039;&#039; : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;br /&gt;
&lt;br /&gt;
= Gestion de projet =&lt;br /&gt;
==Management et leadership&lt;br /&gt;
Nous avons décidé, malgré la séparation du projet en deux sous parties (et donc notre division en deux groupes de deux personnes), de travailler ensemble au même endroit tous les jours ouvrables de la semaine. Cela avait pour but de nous permettre à tout instant de connaître l’état d’avancement des deux projets. Les caractéristiques de chacun étaient ainsi bien exploitées. La communication interpersonnelle se faisait donc en continu (utilisation de réseaux sociaux les week-ends), afin que nul ne reste bloqué trop longtemps sur un problème. Issus de milieux très différents, la présence d’un arbitre a parfois été nécessaire. Le moindre conflit était immédiatement contrôlé par la présence d’une troisième personne prenant le rôle d’arbitre (les rôles ont tournés au cours du projet). Ces conflits étaient souvent dûs à la trop longue durée de côtoiement, côtoiement qui paradoxalement nous permettait aussi de progresser bien plus vite pour la réalisation des tâches.&lt;br /&gt;
&lt;br /&gt;
Afin d&#039;être le plus productif possible nous nous sommes séparés en deux groupes selon le sujet sur lequel chacun souhaitait travailler. De plus, nous avons organisé certaines activités hors travail (repas, bowling) afin de renforcer les liens ainsi que le respect mutuel.&lt;br /&gt;
&lt;br /&gt;
Les premières semaines ont été marquées par la présence de nombreux brainstormings, afin de cibler et séparer intelligemment les taches. Par la suite, ces séances se sont plus espacées et étaient propres à chaque partie du projet.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22599</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22599"/>
		<updated>2015-03-28T12:48:43Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart] (Pour des raisons de confidentialité, une seule partie du code (celle du Tiled Display) est accessible)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) délivrée par un serveur Express (NodeJS) connecté à un port précis.&lt;br /&gt;
&lt;br /&gt;
La communication entre les clients et le serveur se fait grâce au module &#039;&#039;&#039;NowJS : https://github.com/Flotype/now/&#039;&#039;&#039; qui est basé sur des socket.io :&lt;br /&gt;
&lt;br /&gt;
* Les clients et le serveur vont partager un composant Now qui peut contenir des méthodes ou des variables.&lt;br /&gt;
* Les méthodes sont implémentées dans ce composant, côté client et côté serveur. &lt;br /&gt;
* Lorsqu&#039;un client veut appeler la méthode d&#039;un ou plusieurs ou tous les clients (lui compris ou non), il appelle une méthode de now implémentée côté serveur, et c&#039;est ce dernier qui est chargé d&#039;appeler le ou les méthodes des clients.&lt;br /&gt;
* NowJs fonctionne sur le principe de groupe. Le premier groupe nommé &amp;quot;everyone&amp;quot; contient tous les clients. On peut ensuite créer des sous-groupes et y ajouter les clients au fur et à mesure. Cela rend facile la sélection des clients pour l&#039;appel de méthode.&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Prérequis - Projet Table Tactile =&lt;br /&gt;
* Le serveur peut accueillir au maximum quatre clients&lt;br /&gt;
* Les tables doivent être disposées en carré et orientées vers l&#039;extérieur, de sorte que l&#039;on puisse tourner autour du carré et être dans le bon sens de lecture&lt;br /&gt;
* Le serveur distingue quatre orientations : Nord-Ouest, Nord-Est, Sud-Ouest, Sud-Est.&lt;br /&gt;
* A chaque fois qu&#039;un client se connecte, le serveur lui attribue la première orientation disponible suivant l&#039;ordre ci-dessus.&lt;br /&gt;
* Utiliser Google Chrome de préférence&lt;br /&gt;
* Activer les événements tactiles pour le navigateur Google Chrome (chrome://flags/#touch-events)&lt;br /&gt;
* Pour chaque table, le mode plein écran doit être lancé manuellement (F11) pour le mode Tiled Display (sinon la taille maximale du média sera celle du Body)&lt;br /&gt;
* Pour lancer une vidéo, utiliser les fichiers .mp4 (chrome uniquement), .ogg, .webm&lt;br /&gt;
&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images, ou la capture en temps-réel d&#039;une vidéo HTML5 dans un canvas toutes les 1000/n millisecondes (n = 60, 30 ... fps) &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
ATTENTION: Nous avons effectué des modifications dans ce module pour définir nous-même les limites de déplacement des objets. Les modifications commencent à l&#039;endroit (LIGNE 866 -&amp;gt; 912) où est indiqué le commentaire : /*AJOUT FONCTIONNALITE SUPPLEMENTAIRE*/&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi ajouté d&#039;autres options.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
&#039;&#039;&#039;Ping-pong&#039;&#039;&#039; :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drawing&#039;&#039;&#039; : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;br /&gt;
&lt;br /&gt;
= Gestion de projet =&lt;br /&gt;
Nous avons décidé, malgré la séparation du projet en deux sous parties (et donc notre division en deux groupes de deux personnes), de travailler ensemble au même endroit tous les jours de semaine. Cela avait pour but de nous permettre à tout instant de connaître l’état d’avancement des deux projets. Les caractéristiques de chacun étaient ainsi bien exploitées car proposées au&lt;br /&gt;
moindre problème. La communication interpersonnelle se faisait donc en continue (utilisation&lt;br /&gt;
de réseaux sociaux les week-ends), afin que nul ne reste bloqué trop longtemps.&lt;br /&gt;
Issus de milieux très différents, la présence d’un arbitre a parfois été nécessaire. Le moindre&lt;br /&gt;
conflit était immédiatement contrôlé par la présence d’une troisième personne prenant le rôle&lt;br /&gt;
d’arbitre (les rôles ont tournés au cours du projet). Ces conflits étaient souvent dû à la trop&lt;br /&gt;
longue durée de côtoiement, côtoiement qui paradoxalement nous permettait aussi de&lt;br /&gt;
progresser bien plus vite pour la réalisation des taches.&lt;br /&gt;
Afin de nous rendre le plus productif possible nous nous sommes séparés en deux groupes&lt;br /&gt;
selon le sujet sur lequel chacun souhaitait travaillé. De plus, nous nous sommes organisé&lt;br /&gt;
certaines activités hors travail (repas, bowling) afin de renforcer les liens ainsi que le respect&lt;br /&gt;
mutuel.&lt;br /&gt;
&lt;br /&gt;
Les premières semaines ont été marqué par la présence de nombreux brainstormings, afin de&lt;br /&gt;
cibler et séparer intelligemment les taches. Par la suite, ces séances se sont plus espacées et&lt;br /&gt;
étaient propre à chaque partie du projet.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22576</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22576"/>
		<updated>2015-03-26T11:09:54Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Documents liés */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart] (Pour des raisons de confidentialité, une seule partie du code (celle du Tiled Display) est accessible)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) délivrée par un serveur Express (NodeJS) connecté à un port précis.&lt;br /&gt;
&lt;br /&gt;
La communication entre les clients et le serveur se fait grâce au module &#039;&#039;&#039;NowJS : https://github.com/Flotype/now/&#039;&#039;&#039; qui est basé sur des socket.io :&lt;br /&gt;
&lt;br /&gt;
* Les clients et le serveur vont partager un composant Now qui peut contenir des méthodes ou des variables.&lt;br /&gt;
* Les méthodes sont implémentées dans ce composant, côté client et côté serveur. &lt;br /&gt;
* Lorsqu&#039;un client veut appeler la méthode d&#039;un ou plusieurs ou tous les clients (lui compris ou non), il appelle une méthode de now implémentée côté serveur, et c&#039;est ce dernier qui est chargé d&#039;appeler le ou les méthodes des clients.&lt;br /&gt;
* NowJs fonctionne sur le principe de groupe. Le premier groupe nommé &amp;quot;everyone&amp;quot; contient tous les clients. On peut ensuite créer des sous-groupes et y ajouter les clients au fur et à mesure. Cela rend facile la sélection des clients pour l&#039;appel de méthode.&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Prérequis - Projet Table Tactile =&lt;br /&gt;
* Le serveur peut accueillir au maximum quatre clients&lt;br /&gt;
* Les tables doivent être disposées en carré et orientées vers l&#039;extérieur, de sorte que l&#039;on puisse tourner autour du carré et être dans le bon sens de lecture&lt;br /&gt;
* Le serveur distingue quatre orientations : Nord-Ouest, Nord-Est, Sud-Ouest, Sud-Est.&lt;br /&gt;
* A chaque fois qu&#039;un client se connecte, le serveur lui attribue la première orientation disponible suivant l&#039;ordre ci-dessus.&lt;br /&gt;
* Utiliser Google Chrome de préférence&lt;br /&gt;
* Activer les événements tactiles pour le navigateur Google Chrome (chrome://flags/#touch-events)&lt;br /&gt;
* Pour chaque table, le mode plein écran doit être lancé manuellement (F11) pour le mode Tiled Display (sinon la taille maximale du média sera celle du Body)&lt;br /&gt;
* Pour lancer une vidéo, utiliser les fichiers .mp4 (chrome uniquement), .ogg, .webm&lt;br /&gt;
&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images, ou la capture en temps-réel d&#039;une vidéo HTML5 dans un canvas toutes les 1000/n millisecondes (n = 60, 30 ... fps) &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
ATTENTION: Nous avons effectué des modifications dans ce module pour définir nous-même les limites de déplacement des objets. Les modifications commencent à l&#039;endroit (LIGNE 866 -&amp;gt; 912) où est indiqué le commentaire : /*AJOUT FONCTIONNALITE SUPPLEMENTAIRE*/&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi ajouté d&#039;autres options.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
&#039;&#039;&#039;Ping-pong&#039;&#039;&#039; :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drawing&#039;&#039;&#039; : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22575</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22575"/>
		<updated>2015-03-26T11:09:27Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Documents liés */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart] (Pour des raisons de confidentialité, une seule partie du code (celle du Tiled Display) est accessible)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) délivrée par un serveur Express (NodeJS) connecté à un port précis.&lt;br /&gt;
&lt;br /&gt;
La communication entre les clients et le serveur se fait grâce au module &#039;&#039;&#039;NowJS : https://github.com/Flotype/now/&#039;&#039;&#039; qui est basé sur des socket.io :&lt;br /&gt;
&lt;br /&gt;
* Les clients et le serveur vont partager un composant Now qui peut contenir des méthodes ou des variables.&lt;br /&gt;
* Les méthodes sont implémentées dans ce composant, côté client et côté serveur. &lt;br /&gt;
* Lorsqu&#039;un client veut appeler la méthode d&#039;un ou plusieurs ou tous les clients (lui compris ou non), il appelle une méthode de now implémentée côté serveur, et c&#039;est ce dernier qui est chargé d&#039;appeler le ou les méthodes des clients.&lt;br /&gt;
* NowJs fonctionne sur le principe de groupe. Le premier groupe nommé &amp;quot;everyone&amp;quot; contient tous les clients. On peut ensuite créer des sous-groupes et y ajouter les clients au fur et à mesure. Cela rend facile la sélection des clients pour l&#039;appel de méthode.&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Prérequis - Projet Table Tactile =&lt;br /&gt;
* Le serveur peut accueillir au maximum quatre clients&lt;br /&gt;
* Les tables doivent être disposées en carré et orientées vers l&#039;extérieur, de sorte que l&#039;on puisse tourner autour du carré et être dans le bon sens de lecture&lt;br /&gt;
* Le serveur distingue quatre orientations : Nord-Ouest, Nord-Est, Sud-Ouest, Sud-Est.&lt;br /&gt;
* A chaque fois qu&#039;un client se connecte, le serveur lui attribue la première orientation disponible suivant l&#039;ordre ci-dessus.&lt;br /&gt;
* Utiliser Google Chrome de préférence&lt;br /&gt;
* Activer les événements tactiles pour le navigateur Google Chrome (chrome://flags/#touch-events)&lt;br /&gt;
* Pour chaque table, le mode plein écran doit être lancé manuellement (F11) pour le mode Tiled Display (sinon la taille maximale du média sera celle du Body)&lt;br /&gt;
* Pour lancer une vidéo, utiliser les fichiers .mp4 (chrome uniquement), .ogg, .webm&lt;br /&gt;
&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images, ou la capture en temps-réel d&#039;une vidéo HTML5 dans un canvas toutes les 1000/n millisecondes (n = 60, 30 ... fps) &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
ATTENTION: Nous avons effectué des modifications dans ce module pour définir nous-même les limites de déplacement des objets. Les modifications commencent à l&#039;endroit (LIGNE 866 -&amp;gt; 912) où est indiqué le commentaire : /*AJOUT FONCTIONNALITE SUPPLEMENTAIRE*/&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi ajouté d&#039;autres options.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
&#039;&#039;&#039;Ping-pong&#039;&#039;&#039; :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drawing&#039;&#039;&#039; : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22574</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22574"/>
		<updated>2015-03-26T11:08:48Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Documents liés */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
Pour des raisons de confidentialité, une seule partie du code (celle du Tiled Display) est accessible&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) délivrée par un serveur Express (NodeJS) connecté à un port précis.&lt;br /&gt;
&lt;br /&gt;
La communication entre les clients et le serveur se fait grâce au module &#039;&#039;&#039;NowJS : https://github.com/Flotype/now/&#039;&#039;&#039; qui est basé sur des socket.io :&lt;br /&gt;
&lt;br /&gt;
* Les clients et le serveur vont partager un composant Now qui peut contenir des méthodes ou des variables.&lt;br /&gt;
* Les méthodes sont implémentées dans ce composant, côté client et côté serveur. &lt;br /&gt;
* Lorsqu&#039;un client veut appeler la méthode d&#039;un ou plusieurs ou tous les clients (lui compris ou non), il appelle une méthode de now implémentée côté serveur, et c&#039;est ce dernier qui est chargé d&#039;appeler le ou les méthodes des clients.&lt;br /&gt;
* NowJs fonctionne sur le principe de groupe. Le premier groupe nommé &amp;quot;everyone&amp;quot; contient tous les clients. On peut ensuite créer des sous-groupes et y ajouter les clients au fur et à mesure. Cela rend facile la sélection des clients pour l&#039;appel de méthode.&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Prérequis - Projet Table Tactile =&lt;br /&gt;
* Le serveur peut accueillir au maximum quatre clients&lt;br /&gt;
* Les tables doivent être disposées en carré et orientées vers l&#039;extérieur, de sorte que l&#039;on puisse tourner autour du carré et être dans le bon sens de lecture&lt;br /&gt;
* Le serveur distingue quatre orientations : Nord-Ouest, Nord-Est, Sud-Ouest, Sud-Est.&lt;br /&gt;
* A chaque fois qu&#039;un client se connecte, le serveur lui attribue la première orientation disponible suivant l&#039;ordre ci-dessus.&lt;br /&gt;
* Utiliser Google Chrome de préférence&lt;br /&gt;
* Activer les événements tactiles pour le navigateur Google Chrome (chrome://flags/#touch-events)&lt;br /&gt;
* Pour chaque table, le mode plein écran doit être lancé manuellement (F11) pour le mode Tiled Display (sinon la taille maximale du média sera celle du Body)&lt;br /&gt;
* Pour lancer une vidéo, utiliser les fichiers .mp4 (chrome uniquement), .ogg, .webm&lt;br /&gt;
&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images, ou la capture en temps-réel d&#039;une vidéo HTML5 dans un canvas toutes les 1000/n millisecondes (n = 60, 30 ... fps) &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
ATTENTION: Nous avons effectué des modifications dans ce module pour définir nous-même les limites de déplacement des objets. Les modifications commencent à l&#039;endroit (LIGNE 866 -&amp;gt; 912) où est indiqué le commentaire : /*AJOUT FONCTIONNALITE SUPPLEMENTAIRE*/&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi ajouté d&#039;autres options.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
&#039;&#039;&#039;Ping-pong&#039;&#039;&#039; :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drawing&#039;&#039;&#039; : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Projets_2014-2015&amp;diff=22573</id>
		<title>Projets 2014-2015</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Projets_2014-2015&amp;diff=22573"/>
		<updated>2015-03-25T19:34:17Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Projet Semestre S10 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;&amp;lt;[[Projets 2013-2014]] [[Projets|^Projets^]] [[Projets 2015-2016]]&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=RICM=&lt;br /&gt;
==RICM3==&lt;br /&gt;
&lt;br /&gt;
==RICM4==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Evaluation à mi-parcours le lundi 2 mars&#039;&#039;&#039;: Format: 10min (5min de présentation 3 slides au plus, 5min de discussion). Cette évaluation sera prise en compte dans la note finale.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Consignes générales:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Vous devez être pro-actifs !!!&#039;&#039;&#039;: Si des points sont pas ou mals spécifiés, vous le faîtes et vous justifiez vos choix. Pour les problèmes techniques éventuels vous pouvez: vous creusez la question, vous contactez l&#039;auteur du code si il y a lieux, vous faites un rapport de bug (&#039;&#039;&#039;Attention:&#039;&#039;&#039; ca se prépare !), vous soumettez un patch, vous contactez l&#039;enseignant ou la personne suivant le projet.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Vous devez maintenir une fiche de suivi de projet&#039;&#039;&#039;: elle doit être mise à jour chaque semaine, elle rassemble les élements essentiels du projet, elle &lt;br /&gt;
indique les évolutions du projet et présente sa feuille de route. &#039;&#039;&#039;Note:&#039;&#039;&#039; le nom de la fiche doit être composé du nom du projet et suffixé par ricm4_2014_2015.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Vous devez utiliser un logiciel de gestion de version&#039;&#039;&#039; pour vos développements comme [http://en.wikipedia.org/wiki/Git_%28software%29 git ] et nous vous conseillons d&#039;utiliser le site [https://github.com github] pour l&#039;hébergement de votre dépôt public.&lt;br /&gt;
&lt;br /&gt;
* Les document public (exemple sur github) doivent être rédigés en anglais (README, documentation, commentaires de code, nom de variables et de fonctions). Une bonnification sera accordée si le rapport et les transparents sont en anglais (la soutenance sera en francais).&lt;br /&gt;
&lt;br /&gt;
 {|class=&amp;quot;wikitable alternance&amp;quot;&lt;br /&gt;
 |+ Affectation des projets RICM4 2014-2015&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Sujet&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Etudiants&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Enseignant(s)&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Fiche de suivi&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Dépot git&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
 | [[Projet de monoski intelligent]]&lt;br /&gt;
 | Blondet, Torck&lt;br /&gt;
 | Didier Donsez, Pascal Jay, David Eon&lt;br /&gt;
 | [[Proj-2014-2015-MonoskiIntelligent| &#039;&#039;&#039;Fiche&#039;&#039;&#039;]] [[Proj-2014-2015-MonoskiIntelligent/SRS| &#039;&#039;&#039;SRS&#039;&#039;&#039;]]==== Sprint 5 ====&lt;br /&gt;
----&lt;br /&gt;
Sprint Duration&lt;br /&gt;
===== Sprint goals =====&lt;br /&gt;
&lt;br /&gt;
===== Sprint Backlog =====&lt;br /&gt;
 [[Proj-2014-2015-MonoskiIntelligent/UML| &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039;]] [[Proj-2014-2015-MonoskiIntelligent/Scrum| &#039;&#039;&#039;Scrum&#039;&#039;&#039;]] ([https://waffle.io/quentin74/monoski Waffle])&lt;br /&gt;
 | [https://github.com/quentin74/application-monoski &#039;&#039;&#039;github&#039;&#039;&#039;]&lt;br /&gt;
 | [[Media:ProjetXYZ/Rapport|rapport]] - [[Media:ProjetXXX-transparents.pdf|transparents]] - [[Media:ProjetXXX-flyer.pdf|flyer]] - [[Media:ProjetXXX-poster.pdf|poster]] - [http://youtube.com Video ou Screencast]&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
 | [[Smart Classroom]]&lt;br /&gt;
 | Darrigol, Badamo, Damotte, Leonard&lt;br /&gt;
 | Didier Donsez, Vivien Quema, Jérome Maisonnasse&lt;br /&gt;
 | [[Proj-2014-2015-SmartClassroom| &#039;&#039;&#039;Fiche&#039;&#039;&#039;]] [[Proj-2014-2015-SmartClassroom/SRS| &#039;&#039;&#039;SRS&#039;&#039;&#039;]] [[Proj-2014-2015-SmartClassroom/UML| &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039;]] [[Proj-2014-2015-SmartClassroom/Scrum| &#039;&#039;&#039;Scrum&#039;&#039;&#039;]]&lt;br /&gt;
 | [https://github.com/AlanDamotte/auth &#039;&#039;&#039;github&#039;&#039;&#039;]&lt;br /&gt;
 | [[Media:Proj-2014-2015-SmartClassroom/Rapport|rapport]] - [[Media:Proj-2014-2015-SmartClassroom-transparents.pdf|transparents]] - [[Media:Proj-2014-2015-SmartClassroom-flyer.pdf|flyer]]  [[Media:ProjetXXX-poster.pdf|poster]] - [http://youtube.com Video ou Screencast]&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
!scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
 | [[RobAIR]] et [[STM32 Nucleo]]&lt;br /&gt;
 | Hammerer, Michel, Klipffel, Viallet     **&lt;br /&gt;
 | Didier Donsez&lt;br /&gt;
 | [[Projet-2014-2015-RobAIR| &#039;&#039;&#039;Fiche&#039;&#039;&#039;]] [[Projet-2014-2015-RobAIR/SRS| &#039;&#039;&#039;SRS&#039;&#039;&#039;]] [[Projet-2014-2015-RobAIR/UML| &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039;]] [[Projet-2014-2015-RobAIR/Scrum| &#039;&#039;&#039;Scrum&#039;&#039;&#039;]]&lt;br /&gt;
 | [https://github.com/teiroy/RobAIR &#039;&#039;&#039;github&#039;&#039;&#039;]&lt;br /&gt;
 | [[Media:Projet-2014-2015-RobAIR/Rapport|rapport]] - [[Media:Projet-2014-2015-RobAIR-transparents.pdf|transparents]] - [[Media:ProjetXXX-flyer.pdf|flyer]]  [[Media:Projet-2014-2015-RobAIR-poster.pdf|poster]] - [http://youtube.com Video ou Screencast]&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
!scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
 | [[IDS|Interactive Digitale Signage]]&lt;br /&gt;
 | Adam, Zhang&lt;br /&gt;
 | Didier Donsez&lt;br /&gt;
 | [[Proj-2014-2015-Interactive_Digitale_Signage| &#039;&#039;&#039;Fiche&#039;&#039;&#039;]] [[Projet-2014-2015-Interactive_Digitale_Signage/SRS| &#039;&#039;&#039;SRS&#039;&#039;&#039;]] [[Projet-2014-2015-Interactive_Digitale_Signage/UML| &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039;]] [[Projet-2014-2015-Interactive_Digitale_Signage/Scrum| &#039;&#039;&#039;Scrum&#039;&#039;&#039;]]&lt;br /&gt;
 | [https://github.com/zhangzhengmeng/ProjetIDS2015.git &#039;&#039;&#039;github&#039;&#039;&#039;]&lt;br /&gt;
 | [[Media:Proj-2014-2015-Interactive_Digitale_Signage/Rapport|rapport]] - [[Media:Proj-2014-2015-Interactive_Digitale_Signage-transparents.pdf|transparents]] - [[Media:Proj-2014-2015-Interactive_Digitale_Signage-flyer.pdf|flyer]]  [[Media:ProjetXXX-poster.pdf|poster]] - [http://youtube.com Video ou Screencast]&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
!scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
 | [[Régie vidéo autonome et mobile multi-caméra]]&lt;br /&gt;
 | Zominy, Bodard, Qian&lt;br /&gt;
 | Didier Donsez, Thierry C.&lt;br /&gt;
 | [[Proj-2014-2015-RegieVideoAutonomeEtMobileMulticamera| &#039;&#039;&#039;Fiche&#039;&#039;&#039;]] [[Proj-2014-2015-Regie_Video_Autonome_Et_Mobile_Multicamera/SRS| &#039;&#039;&#039;SRS&#039;&#039;&#039;]] [[Proj-2014-2015-Regie_Video_Autonome_Et_Mobile_Multicamera/UML| &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039;]] [[Proj-2014-2015-Regie_Video_Autonome_Et_Mobile_Multicamera/Scrum| &#039;&#039;&#039;Scrum&#039;&#039;&#039;]]&lt;br /&gt;
 | [https://github.com/kurisuter/Regie-video-autonome-&#039;&#039;&#039;github&#039;&#039;&#039;]&lt;br /&gt;
 | [[Media:Projet-2014-2015-RegieVideoAutonomeEtMobileMulticamera/Rapport|rapport]] - [[Media:ProjetXXX-transparents.pdf|transparents]] - [[Media:ProjetXXX-flyer.pdf|flyer]] - [[Media:ProjetXXX-poster.pdf|poster]] - [http://youtube.com Video ou Screencast]&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
!scope=&amp;quot;row&amp;quot;| 6&lt;br /&gt;
 | OpenHAB Extended GUI ([[IFTTT]] et à la [[Node-RED]] ou [[Flowhub]] pour [[OpenHAB]], Découverte [[UPnP]] des équipements)&lt;br /&gt;
 | Toussaint, Saussac&lt;br /&gt;
 | Didier Donsez&lt;br /&gt;
 | [[Proj-2014-2015-OpenHAB-ExtendedGUI| &#039;&#039;&#039;Fiche&#039;&#039;&#039;]] [[Projet-2014-2015-OpenHAB-ExtendedGUI/SRS| &#039;&#039;&#039;SRS&#039;&#039;&#039;]] [[Projet-2014-2015-OpenHAB-ExtendedGUI/UML| &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039;]] [[Projet-2014-2015-OpenHAB-ExtendedGUI/Scrum| &#039;&#039;&#039;Scrum&#039;&#039;&#039;]]&lt;br /&gt;
 | [https://github.com/saussact/projet &#039;&#039;&#039;github&#039;&#039;&#039;]&lt;br /&gt;
 | [[Media:Proj-2014-2015-OpenHAB-ExtendedGUI/Rapport|rapport]] - [[Media:Proj-2014-2015-OpenHAB-ExtendedGUI-transparents.pdf|transparents]] - [[Media:PProj-2014-2015-OpenHAB-ExtendedGUI-flyer.pdf|flyer]] - [[Media:ProjetXXX-poster.pdf|poster]] - [http://youtube.com Video ou Screencast]&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
!scope=&amp;quot;row&amp;quot;| 7&lt;br /&gt;
 | [[CannonBall de voitures autonomes|CannonBall de voitures autonomes, Edition 2015]] &lt;br /&gt;
 | Le-Jean, Mammar, Pelloux-Prayer, Rodrigues &lt;br /&gt;
 | Didier Donsez &amp;amp; Vivien Quema&lt;br /&gt;
 | [[Project-2014-2015-CannonBall| &#039;&#039;&#039;Fiche&#039;&#039;&#039;]][[Project 2014-2015-CannonBall/SRS| &#039;&#039;&#039;SRS&#039;&#039;&#039;]][[Project 2014-2015-CannonBall/UML| &#039;&#039;&#039;UML&#039;&#039;&#039;]][[Project 2014-2015-CannonBall/Scrum| &#039;&#039;&#039;Scrum&#039;&#039;&#039;]][[Project 2014-2015-CannonBall/DesignPatterns| &#039;&#039;&#039;DesignPatterns&#039;&#039;&#039;]]&lt;br /&gt;
 | [https://github.com/malek0512/2014_2015_ricm4_cannon_ball &#039;&#039;&#039;github&#039;&#039;&#039;]&lt;br /&gt;
 | [[Media:ProjetXYZ/Rapport|rapport]] - [[Media:ProjetXXX-transparents.pdf|transparents]] - [[Media:ProjetXXX-flyer.pdf|flyer]]- [[Media:ProjetXXX-poster.pdf|poster]] - [http://youtube.com Video ou Screencast]&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
!scope=&amp;quot;row&amp;quot;| 8&lt;br /&gt;
 | [[Navigation et Montre connectée]]&lt;br /&gt;
 | Hamdani, Mesnier, Yao&lt;br /&gt;
 | Jacques Lemordant&lt;br /&gt;
  | [[Proj-2014-2015-Montreconnectée| &#039;&#039;&#039;Fiche&#039;&#039;&#039;]] [[Proj-2014-2015-Montreconnectée/SRS| &#039;&#039;&#039;SRS&#039;&#039;&#039;]] [[Proj-2014-2015-Montreconnectée/UML| &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039;]] [[Proj-2014-2015-Montreconnectée/Scrum| &#039;&#039;&#039;Scrum&#039;&#039;&#039;]][[Proj-2014-2015-Montreconnectée/DesignPattern| &#039;&#039;&#039;DesignPattern&#039;&#039;&#039;]]&lt;br /&gt;
 | [https://github.com/vince0508/MontreConnectee &#039;&#039;&#039;github&#039;&#039;&#039;]&lt;br /&gt;
 | [[Media:ProjetXYZ/Rapport|rapport]] - [[Media:ProjetXXX-transparents.pdf|transparents]] - [[Media:ProjetXXX-flyer.pdf|flyer]]- [[Media:ProjetXXX-poster.pdf|poster]] - [http://youtube.com Video ou Screencast]&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
!scope=&amp;quot;row&amp;quot;| 9&lt;br /&gt;
 | [[Python sur ESP8266]]&lt;br /&gt;
 | Libralesso, Soldano&lt;br /&gt;
 | Olivier Richard&lt;br /&gt;
 | [[Project-2014-2015-ESP8266| &#039;&#039;&#039;Fiche&#039;&#039;&#039;]] - [[Proj-2014-2015-ESP8266/SRS| &#039;&#039;&#039;SRS&#039;&#039;&#039;]] - [[Proj-2014-2015-ESP8266/UML| &#039;&#039;&#039;UML diagrams&#039;&#039;&#039;]] - [[Proj-2014-2015-ESP8266/Scrum| &#039;&#039;&#039;Scrum&#039;&#039;&#039;]]&lt;br /&gt;
 | [https://github.com/librallu/RICM4Projet/ &#039;&#039;&#039;github&#039;&#039;&#039;]&lt;br /&gt;
 | [[Media:ProjetXYZ/Rapport|rapport]] - [[Media:ProjetXXX-transparents.pdf|transparents]] - [[Media:ProjetXXX-flyer.pdf|flyer]]- [[Media:ProjetXXX-poster.pdf|poster]] - [http://youtube.com Video ou Screencast] - [http://librallu.github.io/RICM4Projet/ &#039;&#039;&#039;website&#039;&#039;&#039;]&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
!scope=&amp;quot;row&amp;quot;| 10&lt;br /&gt;
 | [[Serious Game: Handicap, parole et geste v2]]&lt;br /&gt;
 | Aissanou, Codazzi, Guo&lt;br /&gt;
 | Olivier Richard&lt;br /&gt;
 | [[Proj-2014-2015-SeriousGamev2| &#039;&#039;&#039;Fiche&#039;&#039;&#039;]][[Proj-2014-2015-SeriousGamev2/SRS| &#039;&#039;&#039;SRS&#039;&#039;&#039;]][[Proj-2014-2015-SeriousGamev2/Scrum| &#039;&#039;&#039;Scrum&#039;&#039;&#039;]] [[Projet-2014-2015-SeriousGamev2/Diagrammes| &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039;]]&lt;br /&gt;
 | [https://github.com/wizardkeven/SeriousGameV2 &#039;&#039;&#039;github&#039;&#039;&#039;] &lt;br /&gt;
 | [[Media:ProjetXYZ/Rapport|rapport]] - [[Media:ProjetXXX-transparents.pdf|transparents]] - [[Media:ProjetXXX-flyer.pdf|flyer]]- [[Media:ProjetXXX-poster.pdf|poster]] - [http://youtube.com Video ou Screencast]&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
!scope=&amp;quot;row&amp;quot;| 11&lt;br /&gt;
 | [[Plateforme d&#039;expérimentation mini-datacentre]] Système&lt;br /&gt;
 | Fotsing, Morison&lt;br /&gt;
 | Olivier Richard&lt;br /&gt;
 | [[Proj-2014-2015-Mini_DataCenter_Systeme| &#039;&#039;&#039;Fiche&#039;&#039;&#039;]][[Proj-2014-2015-Mini_datacenter_Systeme_SRS| &#039;&#039;&#039;SRS&#039;&#039;&#039;]] [[Proj-2014-2015-Mini_datacenter_Systeme_scrum| &#039;&#039;&#039;Scrum&#039;&#039;&#039;]]&lt;br /&gt;
 | [https://github.com/ &#039;&#039;&#039;github&#039;&#039;&#039;]&lt;br /&gt;
 | [[Media:ProjetMini_DataCenter_Systeme/Rapport|rapport]] - [[Media:ProjetMini_DataCenter_Systeme-transparents.pdf|transparents]] - [[Media:ProjetMini_DataCenter_Systeme-flyer.pdf|flyer]]- [[Media:ProjetMini_DataCenter_Systeme-poster.pdf|poster]] - [http://youtube.com Video ou Screencast]&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
!scope=&amp;quot;row&amp;quot;| 12&lt;br /&gt;
 | [[Plateforme d&#039;expérimentation mini-datacentre]] Portail&lt;br /&gt;
 | Rossi, Eudes&lt;br /&gt;
 | Olivier Richard&lt;br /&gt;
 | [[Proj-2014-2015-Mini_datacenter_portail| &#039;&#039;&#039;Fiche&#039;&#039;&#039;]] [[Proj-2014-2015-Mini_datacenter_portail_SRS| &#039;&#039;&#039;SRS&#039;&#039;&#039;]] [[Proj-2014-2015-Mini_datacenter_portail_scrum| &#039;&#039;&#039;Scrum&#039;&#039;&#039;]]  [[Proj-2014-2015-Mini_datacenter_portail_uml| &#039;&#039;&#039;UML&#039;&#039;&#039;]]&lt;br /&gt;
 | [https://github.com/EudesRobin/webui-oardocker &#039;&#039;&#039;github&#039;&#039;&#039;]&lt;br /&gt;
 | [[Media:Projet_Projet_Mini_datacenter_portail/Rapport|rapport]] - [[Media:Projet_Mini_datacenter_portail-transparents.pdf|transparents]] - [[Media:Projet_Mini_datacenter_portail-flyer.pdf|flyer]]- [[Media:ProjetXXX-poster.pdf|poster]] - [http://youtube.com Video ou Screencast]&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Projet de monoski intelligent]] (RICM4 et 3I4 et Matériaux) pour le [http://www.defi-foly-laclusaz.com/ défi Foly 2015] : Didier Donsez, Pascal Jay, David Eon (2 élèves)&lt;br /&gt;
* [[Smart Classroom]] (avec ENSIMAG) Didier Donsez, Vivien Quema, Jérome Maisonnasse  (4 élèves)&lt;br /&gt;
* Robot [[RobAIR]]  à base de [[STM32 Nucleo]] (+ cartes additionnelles MEMS BLE4) et de téléphones [[Firefox OS]]. Didier Donsez (4 élèves)&lt;br /&gt;
* [[StartAIR]] (Fabrice Dubost) (2 élèves)&lt;br /&gt;
* [[IDS|Interactive Digitale Signage]] avec [[Reveal.js]], [[Kinect]], [[WebRTC]], [[Node.js]], [[Open Data]], [[NFC]], [[Miracast]] [http://blueimp.github.io/Bootstrap-Image-Gallery/ Bootstrap Gallery]... (Didier Donsez) (2 élèves)&lt;br /&gt;
* [[Régie vidéo autonome et mobile multi-caméra]] (Didier Donsez, Thierry C.) (2 élèves)&lt;br /&gt;
* Interface HTML5 à la [[IFTTT]] et à la [[Node-RED]] ou [[Flowhub]] pour [[OpenHAB]] (2 élèves)&lt;br /&gt;
* [[Intégration d&#039;Espruino à RIOT OS]] sur [[STM32 Nucleo]]: Application à la robotique [[RobAIR]] (Didier Donsez) (2 élèves)&lt;br /&gt;
* [[Inventaire Forestier]] sous Android (3I4 ou 5, RICM4) Emmanuel Promayon (2 élèves)&lt;br /&gt;
* [[Navigation indoor basé iBeacons]], Jacques Lemordant (2 élèves)&lt;br /&gt;
* [[Navigation et Montre connectée]], Jacques Lemordant (2 élèves)&lt;br /&gt;
* [[Projets Sitra avec la région Rhône-Alpes]], Jacques Lemordant (2 élèves)&lt;br /&gt;
* [[CannonBall de voitures autonomes|CannonBall de voitures autonomes, Edition 2015]] Didier Donsez &amp;amp; Vivien Quema (piste  [[Star War Drone Race]]) (2 élèves)&lt;br /&gt;
* [[Python sur ESP8266]] Olivier Richard  (2 élèves)&lt;br /&gt;
* [[Serious Game: Handicap, parole et geste v2]], edition 2015, Olivier Richard (2 élèves)&lt;br /&gt;
* [[Plateforme d&#039;expérimentation mini-datacentre]] édition 2015, Olivier Richard (2 élèves)&lt;br /&gt;
&lt;br /&gt;
==RICM5==&lt;br /&gt;
===Projet Semestre S10===&lt;br /&gt;
Démarrage : Lundi 26/01 à 8H00-12H00, P257 (Rendez-vous devant la salle AIR)&lt;br /&gt;
&lt;br /&gt;
Soutenance : Mercredi 25/03 à 9H00-12H00, Salle à confirmer&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable alternance&amp;quot;&lt;br /&gt;
 |+ Affectation des projets RICM5 2014-2015&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Sujet&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Etudiants&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Enseignant(s)&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Fiche de suivi&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Dépot git&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
 | [[iRock]] :Plateforme Ubilitics pour la surveillance des risques naturelles (déploiement grande échelle de capteurs [[LoRa]] sur le terrain pour l&#039;observation de glissement de terrain) .&lt;br /&gt;
 | Peyre, Guo, Ginoux, Boey&lt;br /&gt;
 | Didier Donsez &amp;amp; Denis Jongmans &amp;amp; Georges-Pierre Bonneau&lt;br /&gt;
 | [[Proj-2014-2015-iRock| &#039;&#039;&#039;Fiche&#039;&#039;&#039;]] [[Proj-2014-2015-iRock/SRS| &#039;&#039;&#039;SRS&#039;&#039;&#039;]] [[Proj-2014-2015-iRock/UML| &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039;]] [[Proj-2014-2015-iRock/Scrum| &#039;&#039;&#039;Scrum&#039;&#039;&#039;]]&lt;br /&gt;
 | [https://github.com/fpeyre/IRock_2015&#039;&#039;&#039;github&#039;&#039;&#039;]&lt;br /&gt;
 | [[Media:Proj-2014-2015-iRock-Rapport|rapport]] - [[Media:Proj-2014-2015-iRock-transparents.pdf|transparents]] - [[Media:Proj-2014-2015-iRock-flyer.pdf|flyer]] - [[Media:Proj-2014-2015-iRock-poster.pdf|poster]] - [[Proj-2014-2015-iRock-media.pdf|Video ou Screencast]]&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| 2&lt;br /&gt;
 | Plateforme Ubilitics pour [[SmartCampus 2015]] : (déploiement grande échelle de capteurs [[LoRa]]) (voir [[OpenBAS]]).&lt;br /&gt;
 | Sambe, Husson, Labat, Fréby, Barbier&lt;br /&gt;
 | Didier Donsez &amp;amp; Vivien Quema &lt;br /&gt;
 | [[Proj-2014-2015-SmartCampus2015| &#039;&#039;&#039;Fiche&#039;&#039;&#039;]] [[Proj-2014-2015-SmartCampus2015/SRS| &#039;&#039;&#039;SRS&#039;&#039;&#039;]] [[Proj-2014-2015-SmartCampus2015#G.C3.A9nie_Logiciel| &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039;]] [[Proj-2014-2015-SmartCampus2015#Organisation_du_projet| &#039;&#039;&#039;Scrum&#039;&#039;&#039;]]&lt;br /&gt;
 | [https://github.com/nexucis/SmartCampus &#039;&#039;&#039;github&#039;&#039;&#039;]&lt;br /&gt;
 | [[Media:Proj-2014-2015-SmartCampus2015-Rapport|rapport]] - [[Media:Proj-2014-2015-SmartCampus2015-transparents.pdf|transparents]] - [[Media:Proj-2014-2015-SmartCampus2015-flyer.pdf|flyer]] - [[Media:Proj-2014-2015-SmartCampus2015-poster.pdf|poster]] - [http://youtube.com Video ou Screencast]&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| 3&lt;br /&gt;
 | [[Extensions XBMC Sujet 2015]]&lt;br /&gt;
 | Valentin, Bobo, Legros, Gabin Teulon (DUT1 R&amp;amp;T)&lt;br /&gt;
 | Nicolas Palix&lt;br /&gt;
 | [[Extensions_XBMC_2015| &#039;&#039;&#039;Fiche&#039;&#039;&#039;]] [[Proj-2014-2015-Ext_XBMC/SRS| &#039;&#039;&#039;SRS&#039;&#039;&#039;]] [[Proj-2014-2015-Ext_XBMC/UML| &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039;]] [[Proj-2014-2015-Ext_XBMC/Scrum| &#039;&#039;&#039;Scrum&#039;&#039;&#039;]]&lt;br /&gt;
 | [https://github.com/ &#039;&#039;&#039;github&#039;&#039;&#039;]&lt;br /&gt;
 | [[Media:Proj-2014-2015-xbmc-rapport.pdf|rapport]] - [[Media:Proj-2014-2015-Ext_XBMC2015-transparents.pdf|transparents]] - [[Media:Proj-2014-2015-xbmc-flyer.png|flyer]] - [[Media:Proj-2014-2015-xbmc-poster.png|poster]]&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| 4&lt;br /&gt;
 | [[Smart Classroom]]  : tables tactiles en mode [[Tiled Display]], Murs interactifs, Robots de Téléprésence, ...&lt;br /&gt;
 | Benyounes, Fall, Tiamiou, Perruche, Quentin Fombaron (DUT1 R&amp;amp;T), Lucas Reygrobellet (DUT1 R&amp;amp;T)&lt;br /&gt;
 | Didier Donsez &amp;amp; Vivien Quema &amp;amp; Jérome Maisonnasse&lt;br /&gt;
 | [[Proj-2014-2015-SmartClassRoom| &#039;&#039;&#039;Fiche&#039;&#039;&#039;]] [[Proj-2014-2015-SmartClassRoom/SRS| &#039;&#039;&#039;SRS&#039;&#039;&#039;]] [[Proj-2014-2015-SmartClassRoom/UML| &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039;]] [[Proj-2014-2015-SmartClassRoom/Scrum| &#039;&#039;&#039;Scrum&#039;&#039;&#039;]]&lt;br /&gt;
 | [https://github.com/falle38/SmartClassroom-TiledDisplayPart &#039;&#039;&#039;github&#039;&#039;&#039;]&lt;br /&gt;
 | [[Media:Proj-2014-2015-SmartClassRoom-Rapport|rapport]] - [[Media:Proj-2014-2015-SmartClassRoom-transparents.pdf|transparents]] - [[Media:Proj-2014-2015-SmartClassRoom-flyer.pdf|flyer]] - [[Media:Proj-2014-2015-SmartClassRoom-poster.pdf|poster]] - [http://youtube.com Video ou Screencast]&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| 5&lt;br /&gt;
 | Défi H 2015 : Rééducation de la main&lt;br /&gt;
 | Mariage, Perea, Clerc-Ghérardi, Arredondo (TIS5)&lt;br /&gt;
 | Didier Donsez &amp;amp; Alessandro Semere &amp;amp; Nicolas Vuillerme + Pierre-Yves Thomas (tuteur Sogeti)&lt;br /&gt;
 | &#039;&#039;&#039;Sur DropBox&#039;&#039;&#039; : [[HandTrainer| &#039;&#039;&#039;Fiche&#039;&#039;&#039;]] [[HandTrainer-SRS| &#039;&#039;&#039;SRS&#039;&#039;&#039;]] [[Proj-2014-2015-ReducMain/UML| &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039;]] [[Proj-2014-2015-ReducMain/Scrum| &#039;&#039;&#039;Scrum&#039;&#039;&#039;]]&lt;br /&gt;
 | [https://github.com/ &#039;&#039;&#039;github&#039;&#039;&#039;]&lt;br /&gt;
 | [[Media:Proj-2014-2015-ReducMain-Rapport|rapport]] - [[Media:Proj-2014-2015-ReducMain-transparents.pdf|transparents]] - [[Media:Proj-2014-2015-SmartClassRoom-flyer.pdf|flyer]] - [[Media:Proj-2014-2015-ReducMain-poster.pdf|poster]] - [http://youtube.com Video ou Screencast]&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Rappel: les séances de MPI (Management de Projet Innovant) auront lieu les jours suivants (salles sur ADE) :&lt;br /&gt;
* Mardi 27/01 après-midi  (Stéphanie Diligent)&lt;br /&gt;
* Lundi 2/02 matin (Emmanuelle Tréhoust)&lt;br /&gt;
* Lundi 9/02 matin (Emmanuelle Tréhoust)&lt;br /&gt;
* Lundi 23/02 matin (Stéphanie Diligent)&lt;br /&gt;
* Mardi 17/03 matin (Stéphanie Diligent+Emmanuelle Tréhoust)&lt;br /&gt;
&lt;br /&gt;
Remarque: il y à 3 étudiants PEIP D de l&#039;IUT 1 R&amp;amp;T qui participeront aux projets.&lt;br /&gt;
&lt;br /&gt;
===Projet Biométrie===&lt;br /&gt;
Démarrage : Lundi 26/01 à 8H00-9H45&lt;br /&gt;
&lt;br /&gt;
Voir Laurent Besacier &amp;amp; François Portet&lt;br /&gt;
&lt;br /&gt;
=3I=&lt;br /&gt;
==3I3==&lt;br /&gt;
&lt;br /&gt;
==3I4==&lt;br /&gt;
&lt;br /&gt;
==3I5==&lt;br /&gt;
* Carte d&#039;extension Semtech [[LoRa]] pour [[Arduino]] et [[STM32 Nucleo]] (Didier Donsez)&lt;br /&gt;
&lt;br /&gt;
===Projet Semestre 10===&lt;br /&gt;
Démarrage : 26/01/2015&lt;br /&gt;
Soutenance: 26/03/2015 &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable alternance&amp;quot;&lt;br /&gt;
 |+ Affectation des projets 3I5 2014-2015&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Sujet&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Etudiants&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Enseignant(s)&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Fiche de suivi&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Dépot git&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Docs.&lt;br /&gt;
 |-&lt;br /&gt;
&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| 1&lt;br /&gt;
 | [[Projet Cannonball - Intégration d&#039;une caméra auto-directive| &#039;&#039;&#039;Projet Cannonball&#039;&#039;&#039;]] : Intégration d&#039;une caméra auto-directive.&lt;br /&gt;
 | Alwan, Laurent, Cottin Bizonne&lt;br /&gt;
 | Alina Voda &amp;amp; Ahmad Farhat&lt;br /&gt;
 | [[Fiche de suivi Projet Cannonball 2015| &#039;&#039;&#039;Fiche de suivi&#039;&#039;&#039;]]&lt;br /&gt;
 | [https://github.com/Jerome-Laurent/CannonBall-Nucleo-STM32F401 &#039;&#039;&#039;github&#039;&#039;&#039;]&lt;br /&gt;
 | [[Media:Rapport_Cannonball2015.pdf‎|Rapport]] - [[Media:Poster_Project_Cannonball.pdf|Poster]] - [https://www.youtube.com/watch?v=44PW_EM8MZ0| Vidéo ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=M2PGI=&lt;br /&gt;
* Extensions à [[SmartCampus]]&lt;br /&gt;
&lt;br /&gt;
=Bachelor Summer Program=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Année A définir=&lt;br /&gt;
* [[GeoDiff]] Production, visualisation, fusion de variations (diff) sur de l&#039;information géocodée : Nicolas Palix&lt;br /&gt;
* [[Smart campus augmenté et contributif]]&lt;br /&gt;
* [[Intégration OpenHAB / OpenTele]]&lt;br /&gt;
* [[Client MQTT pour OBD]] sur Android&lt;br /&gt;
* [[Sommeilomètre]] (Michael Perin, Didier Donsez)&lt;br /&gt;
* [[Open DynDNS]]&lt;br /&gt;
* [[IllumiRoom]]&lt;br /&gt;
* [[Emergency mobile app]] Nicolas Palix pour TIS, PRI et RICM&lt;br /&gt;
* [[OwnPOI]] ownCloud plugin and osmand plugin to share POI and favorite positions. Nicolas Palix.&lt;br /&gt;
* [[OwnList]] ownCloud plugin and Android app to share a TODO list. Nicolas Palix.&lt;br /&gt;
* [[floatingimage UPnP feed]] Nicolas Palix&lt;br /&gt;
* [[XBMC Reflexive Remote]] Dynamic remote control for XBMC. Nicolas Palix.&lt;br /&gt;
* [http://intgat.tigress.co.uk/rmy/uml/index.html Zerofree] Portage de zerofree pour d&#039;autres systèmes de fichiers que ext2/3/4 (notamment Unix FS). Voir également la page [http://packages.qa.debian.org/z/zerofree.html QA de Debian]. Nicolas Palix.&lt;br /&gt;
* [[Bracelet électronique de monitoriing de l&#039;alcoolémie]]&lt;br /&gt;
* [[Oxymètre DIY]]&lt;br /&gt;
* [[PinSound]]&lt;br /&gt;
* [[Extension du support STM32Fx-Discovery dans libopencm3]] : Olivier Richard&lt;br /&gt;
* [[Arduino et libopencm3]] : Olivier Richard&lt;br /&gt;
* [[Data Acquisition System et Stm32f4-Discovery]] : Olivier Richard&lt;br /&gt;
* [[Distributed Data Storage System]] : Olivier Richard&lt;br /&gt;
* [[Dashboard based on w2ui]]&lt;br /&gt;
* [[Environnement logiciel pour FabLab]] : Olivier Richard&lt;br /&gt;
* [[Environnement logiciel pour le Live Programming]] : Olivier Richard&lt;br /&gt;
* [[VirtualPinball]]&lt;br /&gt;
* Tondeuse dessinatrice&lt;br /&gt;
* [[ImmersiveDog]] Nicolas Glade, Didier Donsez&lt;br /&gt;
* Projet avec [[OpenROV]] ???? : Didier Donsez&lt;br /&gt;
* [[Sphero]] malin (Michael Périn) (2 etudiants)&lt;br /&gt;
* [[Drone paramoteur]] ???&lt;br /&gt;
* [[IRock : Surveillance Géotechnique LoRa|iRock]]: Plateforme Ubilitics pour la surveillance des risques naturelles (déploiement grande échelle de capteurs [[LoRa]] sur le terrain pour l&#039;observation de glissement de terrain) en commun avec Geotech (à confirmer) : Didier Donsez &amp;amp; Denis Jongmans&lt;br /&gt;
* [[Optimisation de l&#039;énergie pour cyclotouriste électrique]]&lt;br /&gt;
* [[SmartSelfService|Smart Self-Service 2015]] Didier Donsez &amp;amp; Vivien Quema&lt;br /&gt;
* [[Station Météo LoRa]] : contribution au projet [[LoRA-Fabian]] (Didier Donsez)&lt;br /&gt;
&lt;br /&gt;
=Réserve (boite à idées)=&lt;br /&gt;
&lt;br /&gt;
# [[Tag et Paint Ball en réalité augmentée]] (Michaël Périn) &lt;br /&gt;
# [[Passe moi ton fichier]] (Michaël Périn) &lt;br /&gt;
# [[Extensions à Fab Server]] (Jean-Michel Molenaar) sous reserve (CM ou SR)&lt;br /&gt;
# [[Table multijeux de café 2.0]]&lt;br /&gt;
# [[ GPIO_Qemu_RasPI| Emulation des GPIO dans QEMU pour le carte Raspberry Pi]] (Olivier Richard)&lt;br /&gt;
# [[ Qemu et STM32F0-Discovery ]] (Olivier Richard)&lt;br /&gt;
# [[Serrure à clé MIDI multifactorielle]] (Didier Donsez)&lt;br /&gt;
# [[Table interactive musicale]] (Didier Donsez)&lt;br /&gt;
# [[iMailbox]] (Didier Donsez)&lt;br /&gt;
# [[AmILight]] (eclairage d&#039;ambience intelligent) (Didier Donsez)&lt;br /&gt;
# [[PDAmeetPDA]] (synchronisation d&#039;agenda) (Michaël Périn)&lt;br /&gt;
# [[1 000 000 VMs]] (expérimentation d&#039;application distribuée à très grande échelle) (Olivier Richard) (2-3 RICM4)&lt;br /&gt;
# [[Multiple Kinect]] (utilisation simultanée de plusieurs Kinect) (Olivier Richard) (RICM ou 3I)&lt;br /&gt;
# [[Kinect musicale]] (Didier Donsez) (RICM)&lt;br /&gt;
# [[Ktechlab Simavr Arduino | Ktechlab et integration de Simavr(Arduino)]] (Olivier Richard) (2-3 RICM4-SR)&lt;br /&gt;
# Ocaml on AVR (Arduino)&lt;br /&gt;
# Ocaml on Cortex-M3&lt;br /&gt;
# [[Arduino on STM32 Discovery]]&lt;br /&gt;
# [[Reverse Geocache Puzzle Box]]&lt;br /&gt;
# [[OSGi ME]] (Didier Donsez)&lt;br /&gt;
# [[Affichage Etudiant à Polytech]]&lt;br /&gt;
# Synthèse 3D + motion capture Kinect&lt;br /&gt;
# Logiciel d&#039;[[apprentissage du calcul]] sur tablette Android (reconnaissance de chiffres manuscrits)&lt;br /&gt;
# Plancher de verre (saint gobain) à la [http://www.wat.tv/video/mickael-jackson-billie-jean-oewj_2ey2h_.html Mickael Jackson dans Billie Jean] ! woo&lt;br /&gt;
# [[Ktechlab Simavr Arduino | Ktechlab et integration de Simavr(Arduino)]] (Olivier Richard) (2-3 RICM4-SR)&lt;br /&gt;
# [[CNC]]&lt;br /&gt;
# [[Idées en Vrac]]&lt;br /&gt;
# Scheme Everywhere (Olivier Richard) (2-3 RICM4-SR)&lt;br /&gt;
# [[Projet Station Météo]]&lt;br /&gt;
# Ocaml on AVR (Arduino)&lt;br /&gt;
# [[Table interactive musicale]] (Didier Donsez)&lt;br /&gt;
# [[AmILight]] (eclairage d&#039;amnbience intelligent) (Didier Donsez)&lt;br /&gt;
# [[Cube pointeur]] d&#039;activité ingénieur&lt;br /&gt;
# [http://www.instructables.com/id/Puppeteer-Motion-Capture-Costume/ Puppeteer Motion-Capture Costume]&lt;br /&gt;
# [[Musical Staircase]] @ Polytech (Didier Donsez, 1 RICM4 + 1 3I4)&lt;br /&gt;
# [[Total Recall]] (Didier Donsez)&lt;br /&gt;
# [[SoundMachine]]&lt;br /&gt;
# [[IGN-OSM|Importation de données IGN publiques dans OSM]]&lt;br /&gt;
# [[Speed-limit-OSM|Analyse de traces GPX pour déterminer les limitations de vitesse]]&lt;br /&gt;
# [[Multi perceptual cameras]] (Didier Donsez)&lt;br /&gt;
# [[Photomaton 3D]] (Didier Donsez)&lt;br /&gt;
# [[ArduCopter]]&lt;br /&gt;
# [[Parking Intelligent]]&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=File:Proj-2014-2015-SmartClassRoom-transparents.pdf&amp;diff=22572</id>
		<title>File:Proj-2014-2015-SmartClassRoom-transparents.pdf</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=File:Proj-2014-2015-SmartClassRoom-transparents.pdf&amp;diff=22572"/>
		<updated>2015-03-25T19:27:56Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=File:Proj-2014-2015-SmartClassRoom-Rapport.pdf&amp;diff=22566</id>
		<title>File:Proj-2014-2015-SmartClassRoom-Rapport.pdf</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=File:Proj-2014-2015-SmartClassRoom-Rapport.pdf&amp;diff=22566"/>
		<updated>2015-03-25T19:13:28Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=File:EA2014-OpinionMining-Pres.pdf&amp;diff=22524</id>
		<title>File:EA2014-OpinionMining-Pres.pdf</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=File:EA2014-OpinionMining-Pres.pdf&amp;diff=22524"/>
		<updated>2015-03-25T08:34:29Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Opinion_Mining_et_Sentiment_Analysis&amp;diff=22458</id>
		<title>Opinion Mining et Sentiment Analysis</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Opinion_Mining_et_Sentiment_Analysis&amp;diff=22458"/>
		<updated>2015-03-25T06:40:34Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Démo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
* Enseignants : Didier Donsez ([[EA2015]])&lt;br /&gt;
* Sujet : Opinion Mining and Sentiment Analysis&lt;br /&gt;
* Date : 25 mars 2015&lt;br /&gt;
* Auteur : Benoit Perruche&lt;br /&gt;
* Lien vers les slides de la présentation : []&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Opinion mining is sentiment analysis from dematerialized textual sources on large amounts of data (big data).&lt;br /&gt;
This process appears in the early 2000s and knows a growing success due to the abundance of data provided by the social network Twitter.&lt;br /&gt;
The objective of the opinion mining is to analyze large amounts of data in order to deduce the different feelings that are expressed. The extracted feelings can then be subject of statistics on a community overall feeling.&lt;br /&gt;
&lt;br /&gt;
=== Key Words===&lt;br /&gt;
&lt;br /&gt;
big data, social networks, feelings, statistics, forecast&lt;br /&gt;
&lt;br /&gt;
= Synthèse =&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que l&#039;Opinion Mining ? ==&lt;br /&gt;
* une discipline récente basée sur des méthodes de programmation issues de neuro-linguistique, d&#039;intelligence artificielle et/ou de spectrocospie infrarouge pour l&#039;extraction d&#039;opinions.&lt;br /&gt;
* de manière plus conventionnelle, l&#039;opinion mining traite de l&#039;extraction de sentiments ou d&#039;opinions à partir d&#039;un texte.&lt;br /&gt;
* Internet aujourd&#039;hui et le nombre toujours croissant de personnes utilisant les réseaux sociaux fourni une quantité astronomique de données texte traitant de différents sujets comme l&#039;appréciation d&#039;un produit ou d&#039;une personne par exemple.&lt;br /&gt;
* ces sources d&#039;information intéressent evidemment les entreprises, mais aussi les possibles acheteurs d&#039;un produit qui souhaiteraient connaitre les appréciations des utilisateurs.&lt;br /&gt;
&lt;br /&gt;
== Motivations ==&lt;br /&gt;
Le but est de savoir ce qu&#039;une personne pense en fonction de ce qu&#039;elle a écrit. Tous les utilisateurs ne désirent pas la même chose d&#039;un produit (certains seront plus intéréssés par la durée de vie, d&#039;autres par un prix avantageux, ou encore la vitesse de livraison).&lt;br /&gt;
Prenons l&#039;exemple d&#039;amazon, un acheteur potentiel va normalement se renseigner sur le produit et jeter un oeil aux différents commentaires. Une personne qui vient d&#039;acheter ce produit va parler de son expérience et exprimer son ressenti. C&#039;est donc dans l&#039;interet de l&#039;entreprise de rester au courant et d&#039;analyser les retours que les acheteurs font, afin d&#039;améliorer leurs produits et ajuster leur stratégie de marketing.&lt;br /&gt;
&lt;br /&gt;
== Marché ==&lt;br /&gt;
Il existe déjà plusieurs applications analysant les sentiments de commentaires sur certains réseaux sociaux :&lt;br /&gt;
* Twitter sentiment : http://twittersentiment.appspot.com/ (nécessite un compte twitter)&lt;br /&gt;
* SocialMention: http://socialmention.com/&lt;br /&gt;
Ces applications permettent une recherche d&#039;opinions facile pour des personnalitées ou des marques connues, recherche bien plus compliquée pour des sujets plus abstraits.&lt;br /&gt;
Ces applications, basées essentiellement sur l&#039;analyse de la positivité ou négativité d&#039;un terme (utilisation d&#039;un dictionnaire attribuant un score positif ou negatif aux mots), ne fonctionnent pas bien :&lt;br /&gt;
* analyse des tweets possédant le mot-clé, pas des tweets dont le mot-clé en est le thème.&lt;br /&gt;
* il n&#039;y a pas de corrélation entre le tweet et le mot-clé, le sentiment du tweeter s&#039;attribue à l&#039;ensemble du commentaire.&lt;br /&gt;
&lt;br /&gt;
Derwent Capital Markets est une entreprise pionière pour l&#039;utilisation de l&#039;analyse de sentiments dans les réseaux sociaux afin d&#039;élaborer des prédictions sur le cours de la bourse. Ils ont en effet établi certaines corrélations entre des mots à caractères émotionnels apparaissant dans les posts de Twitter et les variations de l&#039;indice boursier. S&#039;attendant au résultat selon lequel une baisse de l&#039;indice boursier induisait une dégradation de l&#039;humeur des gens sur Twitter, DCM ne s&#039;attendait pas à découvrir que c&#039;était la baisse de l&#039;humeur des gens qui précédait une chute du cours boursiers.&lt;br /&gt;
Cependant, leurs résultats doivent être pris avec précautions. En effet, les résultats proposés par Derwent Capital Markets comporteraient de nombreuses failles. S&#039;il était vraiment possible de prévoir les variations de l&#039;indice boursier avec cette méthode, son utilisation serait beaucoup plus répandue.&lt;br /&gt;
&lt;br /&gt;
== Méthode pour l&#039;analyse d&#039;opinion ==&lt;br /&gt;
S&#039;en tenir à l&#039;opinion d&#039;un spécialiste pour répondre à une question technique est plus sûr que l&#039;opinion générale. L&#039;opinion mining doit donc seulement être utilisé pour certaines tâches.&lt;br /&gt;
Mais si l&#039;on se retrouve en présence de plusieurs spécialistes, certaines études montrent que l&#039;on aurait tendance à attribuer plus de poids au spécialiste le plus crédible qu&#039;à la majorité. Des notions comme la confiance, l&#039;autorité et l&#039;influence sont donc relatées à l&#039;opinion mining.&lt;br /&gt;
Il est nécessaire de séparer confiance relationnelle et confiance par réputation.&lt;br /&gt;
&lt;br /&gt;
L&#039;enjeu dans un tweet est d&#039;extraire la partie représentant l&#039;opinion. La deuxième étape est l&#039;extraction de la polarité (positif, neutre, negatif ou bien à l&#039;aide d&#039;une échelle numérique) de l&#039;opinion. Pour finir, la somme globale des scores sur les opinions représentera le sentiment général sur ce sujet.&lt;br /&gt;
La première amélioration consiste à déterminer dans un texte quelle opinion est attribuée à quelle caractéristique.Il est important de connaitre la source (la personne à l&#039;origine) et la cible (le sujet) de chaque opinion.&lt;br /&gt;
&lt;br /&gt;
L&#039;un des problème à résoudre lors de l&#039;analyse de sentiments est la détection de spams. En effet, c&#039;est une pratique assez répandu chez les entreprises de payer certaines personnes pour écrire des commentaires positifs (ou négatifs) sur un produit, une entreprise ou même un gouvernement. &lt;br /&gt;
&lt;br /&gt;
Les réseaux sociaux fournissent trois types d&#039;intérêts à propos d&#039;un utilisateur :&lt;br /&gt;
* explicite : la personne aime le cinéma.&lt;br /&gt;
* implicite : quelqu&#039;un aimant les sports extrèmes aura tendance à aimer prendre des risques.&lt;br /&gt;
* associatif : les gens qui achètent des produits de la marque Zara auront aussi tendance à acheter des produits Apple.&lt;br /&gt;
Le but est de définir des clusters d&#039;intérêts et d&#039;opinions sur de larges groupes de personnes. En effet, les entreprises pourront ensuite cibler leur publicité aux différents groupes de personnes.&lt;br /&gt;
&lt;br /&gt;
= Démo =&lt;br /&gt;
&lt;br /&gt;
Etude des sentiments sur la personne Bill Gates:&lt;br /&gt;
* [http://www.sentiment140.com/search?query=Bill+Gates&amp;amp;hl=en  Sur Twitter]&lt;br /&gt;
* [http://socialmention.com/search?t=all&amp;amp;q=Bill+Gates&amp;amp;btnG=Search  Posts hors réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
Exemple d&#039;application attribuant un score aux termes à caractères émotionnels dans un texte :&lt;br /&gt;
[https://semantria.com/demo  Avec le texte Wikipedia sur Bill Gates]&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* [http://www.cs.cornell.edu/home/llee/omsa/omsa.pdf  Etude1 sur l&#039;Opinion Mining]&lt;br /&gt;
* [http://www.cs.uic.edu/~liub/FBS/Sentiment-Analysis-tutorial-AAAI-2011.pdf  Etude2 sur L&#039;OM]&lt;br /&gt;
* [http://fr.wikipedia.org/wiki/Opinion_mining  Opinion Mining Wikipedia]&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Opinion_Mining_et_Sentiment_Analysis&amp;diff=22457</id>
		<title>Opinion Mining et Sentiment Analysis</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Opinion_Mining_et_Sentiment_Analysis&amp;diff=22457"/>
		<updated>2015-03-25T06:40:10Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
* Enseignants : Didier Donsez ([[EA2015]])&lt;br /&gt;
* Sujet : Opinion Mining and Sentiment Analysis&lt;br /&gt;
* Date : 25 mars 2015&lt;br /&gt;
* Auteur : Benoit Perruche&lt;br /&gt;
* Lien vers les slides de la présentation : []&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Opinion mining is sentiment analysis from dematerialized textual sources on large amounts of data (big data).&lt;br /&gt;
This process appears in the early 2000s and knows a growing success due to the abundance of data provided by the social network Twitter.&lt;br /&gt;
The objective of the opinion mining is to analyze large amounts of data in order to deduce the different feelings that are expressed. The extracted feelings can then be subject of statistics on a community overall feeling.&lt;br /&gt;
&lt;br /&gt;
=== Key Words===&lt;br /&gt;
&lt;br /&gt;
big data, social networks, feelings, statistics, forecast&lt;br /&gt;
&lt;br /&gt;
= Synthèse =&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que l&#039;Opinion Mining ? ==&lt;br /&gt;
* une discipline récente basée sur des méthodes de programmation issues de neuro-linguistique, d&#039;intelligence artificielle et/ou de spectrocospie infrarouge pour l&#039;extraction d&#039;opinions.&lt;br /&gt;
* de manière plus conventionnelle, l&#039;opinion mining traite de l&#039;extraction de sentiments ou d&#039;opinions à partir d&#039;un texte.&lt;br /&gt;
* Internet aujourd&#039;hui et le nombre toujours croissant de personnes utilisant les réseaux sociaux fourni une quantité astronomique de données texte traitant de différents sujets comme l&#039;appréciation d&#039;un produit ou d&#039;une personne par exemple.&lt;br /&gt;
* ces sources d&#039;information intéressent evidemment les entreprises, mais aussi les possibles acheteurs d&#039;un produit qui souhaiteraient connaitre les appréciations des utilisateurs.&lt;br /&gt;
&lt;br /&gt;
== Motivations ==&lt;br /&gt;
Le but est de savoir ce qu&#039;une personne pense en fonction de ce qu&#039;elle a écrit. Tous les utilisateurs ne désirent pas la même chose d&#039;un produit (certains seront plus intéréssés par la durée de vie, d&#039;autres par un prix avantageux, ou encore la vitesse de livraison).&lt;br /&gt;
Prenons l&#039;exemple d&#039;amazon, un acheteur potentiel va normalement se renseigner sur le produit et jeter un oeil aux différents commentaires. Une personne qui vient d&#039;acheter ce produit va parler de son expérience et exprimer son ressenti. C&#039;est donc dans l&#039;interet de l&#039;entreprise de rester au courant et d&#039;analyser les retours que les acheteurs font, afin d&#039;améliorer leurs produits et ajuster leur stratégie de marketing.&lt;br /&gt;
&lt;br /&gt;
== Marché ==&lt;br /&gt;
Il existe déjà plusieurs applications analysant les sentiments de commentaires sur certains réseaux sociaux :&lt;br /&gt;
* Twitter sentiment : http://twittersentiment.appspot.com/ (nécessite un compte twitter)&lt;br /&gt;
* SocialMention: http://socialmention.com/&lt;br /&gt;
Ces applications permettent une recherche d&#039;opinions facile pour des personnalitées ou des marques connues, recherche bien plus compliquée pour des sujets plus abstraits.&lt;br /&gt;
Ces applications, basées essentiellement sur l&#039;analyse de la positivité ou négativité d&#039;un terme (utilisation d&#039;un dictionnaire attribuant un score positif ou negatif aux mots), ne fonctionnent pas bien :&lt;br /&gt;
* analyse des tweets possédant le mot-clé, pas des tweets dont le mot-clé en est le thème.&lt;br /&gt;
* il n&#039;y a pas de corrélation entre le tweet et le mot-clé, le sentiment du tweeter s&#039;attribue à l&#039;ensemble du commentaire.&lt;br /&gt;
&lt;br /&gt;
Derwent Capital Markets est une entreprise pionière pour l&#039;utilisation de l&#039;analyse de sentiments dans les réseaux sociaux afin d&#039;élaborer des prédictions sur le cours de la bourse. Ils ont en effet établi certaines corrélations entre des mots à caractères émotionnels apparaissant dans les posts de Twitter et les variations de l&#039;indice boursier. S&#039;attendant au résultat selon lequel une baisse de l&#039;indice boursier induisait une dégradation de l&#039;humeur des gens sur Twitter, DCM ne s&#039;attendait pas à découvrir que c&#039;était la baisse de l&#039;humeur des gens qui précédait une chute du cours boursiers.&lt;br /&gt;
Cependant, leurs résultats doivent être pris avec précautions. En effet, les résultats proposés par Derwent Capital Markets comporteraient de nombreuses failles. S&#039;il était vraiment possible de prévoir les variations de l&#039;indice boursier avec cette méthode, son utilisation serait beaucoup plus répandue.&lt;br /&gt;
&lt;br /&gt;
== Méthode pour l&#039;analyse d&#039;opinion ==&lt;br /&gt;
S&#039;en tenir à l&#039;opinion d&#039;un spécialiste pour répondre à une question technique est plus sûr que l&#039;opinion générale. L&#039;opinion mining doit donc seulement être utilisé pour certaines tâches.&lt;br /&gt;
Mais si l&#039;on se retrouve en présence de plusieurs spécialistes, certaines études montrent que l&#039;on aurait tendance à attribuer plus de poids au spécialiste le plus crédible qu&#039;à la majorité. Des notions comme la confiance, l&#039;autorité et l&#039;influence sont donc relatées à l&#039;opinion mining.&lt;br /&gt;
Il est nécessaire de séparer confiance relationnelle et confiance par réputation.&lt;br /&gt;
&lt;br /&gt;
L&#039;enjeu dans un tweet est d&#039;extraire la partie représentant l&#039;opinion. La deuxième étape est l&#039;extraction de la polarité (positif, neutre, negatif ou bien à l&#039;aide d&#039;une échelle numérique) de l&#039;opinion. Pour finir, la somme globale des scores sur les opinions représentera le sentiment général sur ce sujet.&lt;br /&gt;
La première amélioration consiste à déterminer dans un texte quelle opinion est attribuée à quelle caractéristique.Il est important de connaitre la source (la personne à l&#039;origine) et la cible (le sujet) de chaque opinion.&lt;br /&gt;
&lt;br /&gt;
L&#039;un des problème à résoudre lors de l&#039;analyse de sentiments est la détection de spams. En effet, c&#039;est une pratique assez répandu chez les entreprises de payer certaines personnes pour écrire des commentaires positifs (ou négatifs) sur un produit, une entreprise ou même un gouvernement. &lt;br /&gt;
&lt;br /&gt;
Les réseaux sociaux fournissent trois types d&#039;intérêts à propos d&#039;un utilisateur :&lt;br /&gt;
* explicite : la personne aime le cinéma.&lt;br /&gt;
* implicite : quelqu&#039;un aimant les sports extrèmes aura tendance à aimer prendre des risques.&lt;br /&gt;
* associatif : les gens qui achètent des produits de la marque Zara auront aussi tendance à acheter des produits Apple.&lt;br /&gt;
Le but est de définir des clusters d&#039;intérêts et d&#039;opinions sur de larges groupes de personnes. En effet, les entreprises pourront ensuite cibler leur publicité aux différents groupes de personnes.&lt;br /&gt;
&lt;br /&gt;
= Démo =&lt;br /&gt;
&lt;br /&gt;
Etude des sentiments sur la personne Bill Gates:&lt;br /&gt;
* [http://www.sentiment140.com/search?query=Bill+Gates&amp;amp;hl=en  Sur Twitter]&lt;br /&gt;
* [http://socialmention.com/search?t=all&amp;amp;q=Bill+Gates&amp;amp;btnG=Search  Posts hors réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
Exemple d&#039;application attribuant un score aux termes à caractères émotionnels dans un texte :&lt;br /&gt;
[https://semantria.com/demo  Wikipedia sur Bill Gates]&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* [http://www.cs.cornell.edu/home/llee/omsa/omsa.pdf  Etude1 sur l&#039;Opinion Mining]&lt;br /&gt;
* [http://www.cs.uic.edu/~liub/FBS/Sentiment-Analysis-tutorial-AAAI-2011.pdf  Etude2 sur L&#039;OM]&lt;br /&gt;
* [http://fr.wikipedia.org/wiki/Opinion_mining  Opinion Mining Wikipedia]&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Opinion_Mining_et_Sentiment_Analysis&amp;diff=22451</id>
		<title>Opinion Mining et Sentiment Analysis</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Opinion_Mining_et_Sentiment_Analysis&amp;diff=22451"/>
		<updated>2015-03-25T00:32:41Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Présentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
* Enseignants : Didier Donsez ([[EA2015]])&lt;br /&gt;
* Sujet : Opinion Mining and Sentiment Analysis&lt;br /&gt;
* Date : 25 mars 2015&lt;br /&gt;
* Auteur : Benoit Perruche&lt;br /&gt;
* Lien vers les slides de la présentation : []&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Opinion mining is sentiment analysis from dematerialized textual sources on large amounts of data (big data).&lt;br /&gt;
This process appears in the early 2000s and knows a growing success due to the abundance of data provided by the social network Twitter.&lt;br /&gt;
The objective of the opinion mining is to analyze large amounts of data in order to deduce the different feelings that are expressed. The extracted feelings can then be subject of statistics on a community overall feeling.&lt;br /&gt;
&lt;br /&gt;
=== Key Words===&lt;br /&gt;
&lt;br /&gt;
big data, social networks, feelings, statistics, forecast&lt;br /&gt;
&lt;br /&gt;
= Synthèse =&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que l&#039;Opinion Mining ? ==&lt;br /&gt;
* une discipline récente basée sur des méthodes de programmation issues de neuro-linguistique, d&#039;intelligence artificielle et/ou de spectrocospie infrarouge pour l&#039;extraction d&#039;opinions.&lt;br /&gt;
* de manière plus conventionnelle, l&#039;opinion mining traite de l&#039;extraction de sentiments ou d&#039;opinions à partir d&#039;un texte.&lt;br /&gt;
* Internet aujourd&#039;hui et le nombre toujours croissant de personnes utilisant les réseaux sociaux fourni une quantité astronomique de données texte traitant de différents sujets comme l&#039;appréciation d&#039;un produit ou d&#039;une personne par exemple.&lt;br /&gt;
* ces sources d&#039;information intéressent evidemment les entreprises, mais aussi les possibles acheteurs d&#039;un produit qui souhaiteraient connaitre les appréciations des utilisateurs.&lt;br /&gt;
&lt;br /&gt;
== Motivations ==&lt;br /&gt;
Le but est de savoir ce qu&#039;une personne pense en fonction de ce qu&#039;elle a écrit. Tous les utilisateurs ne désirent pas la même chose d&#039;un produit (certains seront plus intéréssés par la durée de vie, d&#039;autres par un prix avantageux, ou encore la vitesse de livraison).&lt;br /&gt;
Prenons l&#039;exemple d&#039;amazon, un acheteur potentiel va normalement se renseigner sur le produit et jeter un oeil aux différents commentaires. Une personne qui vient d&#039;acheter ce produit va parler de son expérience et exprimer son ressenti. C&#039;est donc dans l&#039;interet de l&#039;entreprise de rester au courant et d&#039;analyser les retours que les acheteurs font, afin d&#039;améliorer leurs produits et ajuster leur stratégie de marketing.&lt;br /&gt;
&lt;br /&gt;
== Marché ==&lt;br /&gt;
Il existe déjà plusieurs applications analysant les sentiments de commentaires sur certains réseaux sociaux :&lt;br /&gt;
* Twitter sentiment : http://twittersentiment.appspot.com/ (nécessite un compte twitter)&lt;br /&gt;
* SocialMention: http://socialmention.com/&lt;br /&gt;
Ces applications permettent une recherche d&#039;opinions facile pour des personnalitées ou des marques connues, recherche bien plus compliquée pour des sujets plus abstraits.&lt;br /&gt;
Ces applications, basées essentiellement sur l&#039;analyse de la positivité ou négativité d&#039;un terme (utilisation d&#039;un dictionnaire attribuant un score positif ou negatif aux mots), ne fonctionnent pas bien :&lt;br /&gt;
* analyse des tweets possédant le mot-clé, pas des tweets dont le mot-clé en est le thème.&lt;br /&gt;
* il n&#039;y a pas de corrélation entre le tweet et le mot-clé, le sentiment du tweeter s&#039;attribue à l&#039;ensemble du commentaire.&lt;br /&gt;
&lt;br /&gt;
Derwent Capital Markets est une entreprise pionière pour l&#039;utilisation de l&#039;analyse de sentiments dans les réseaux sociaux afin d&#039;élaborer des prédictions sur le cours de la bourse. Ils ont en effet établi certaines corrélations entre des mots à caractères émotionnels apparaissant dans les posts de Twitter et les variations de l&#039;indice boursier. S&#039;attendant au résultat selon lequel une baisse de l&#039;indice boursier induisait une dégradation de l&#039;humeur des gens sur Twitter, DCM ne s&#039;attendait pas à découvrir que c&#039;était la baisse de l&#039;humeur des gens qui précédait une chute du cours boursiers.&lt;br /&gt;
Cependant, leurs résultats doivent être pris avec précautions. En effet, les résultats proposés par Derwent Capital Markets comporteraient de nombreuses failles. S&#039;il était vraiment possible de prévoir les variations de l&#039;indice boursier avec cette méthode, son utilisation serait beaucoup plus répandue.&lt;br /&gt;
&lt;br /&gt;
== Méthode pour l&#039;analyse d&#039;opinion ==&lt;br /&gt;
S&#039;en tenir à l&#039;opinion d&#039;un spécialiste pour répondre à une question technique est plus sûr que l&#039;opinion générale. L&#039;opinion mining doit donc seulement être utilisé pour certaines tâches.&lt;br /&gt;
Mais si l&#039;on se retrouve en présence de plusieurs spécialistes, certaines études montrent que l&#039;on aurait tendance à attribuer plus de poids au spécialiste le plus crédible qu&#039;à la majorité. Des notions comme la confiance, l&#039;autorité et l&#039;influence sont donc relatées à l&#039;opinion mining.&lt;br /&gt;
Il est nécessaire de séparer confiance relationnelle et confiance par réputation.&lt;br /&gt;
&lt;br /&gt;
L&#039;enjeu dans un tweet est d&#039;extraire la partie représentant l&#039;opinion. La deuxième étape est l&#039;extraction de la polarité (positif, neutre, negatif ou bien à l&#039;aide d&#039;une échelle numérique) de l&#039;opinion. Pour finir, la somme globale des scores sur les opinions représentera le sentiment général sur ce sujet.&lt;br /&gt;
La première amélioration consiste à déterminer dans un texte quelle opinion est attribuée à quelle caractéristique.Il est important de connaitre la source (la personne à l&#039;origine) et la cible (le sujet) de chaque opinion.&lt;br /&gt;
&lt;br /&gt;
L&#039;un des problème à résoudre lors de l&#039;analyse de sentiments est la détection de spams. En effet, c&#039;est une pratique assez répandu chez les entreprises de payer certaines personnes pour écrire des commentaires positifs (ou négatifs) sur un produit, une entreprise ou même un gouvernement. &lt;br /&gt;
&lt;br /&gt;
Les réseaux sociaux fournissent trois types d&#039;intérêts à propos d&#039;un utilisateur :&lt;br /&gt;
* explicite : la personne aime le cinéma.&lt;br /&gt;
* implicite : quelqu&#039;un aimant les sports extrèmes aura tendance à aimer prendre des risques.&lt;br /&gt;
* associatif : les gens qui achètent des produits de la marque Zara auront aussi tendance à acheter des produits Apple.&lt;br /&gt;
Le but est de définir des clusters d&#039;intérêts et d&#039;opinions sur de larges groupes de personnes. En effet, les entreprises pourront ensuite cibler leur publicité aux différents groupes de personnes.&lt;br /&gt;
&lt;br /&gt;
= Démo =&lt;br /&gt;
&lt;br /&gt;
Etude des sentiments sur la personne Bill Gates:&lt;br /&gt;
* [http://www.sentiment140.com/search?query=Bill+Gates&amp;amp;hl=en  Sur Twitter]&lt;br /&gt;
* [http://socialmention.com/search?t=all&amp;amp;q=Bill+Gates&amp;amp;btnG=Search  Posts hors réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
Exemple d&#039;application attribuant un score aux termes à caractères émotionnels dans un texte :&lt;br /&gt;
[https://semantria.com/demo  Wikipedia sur Bill Gates]&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* [http://www.cs.cornell.edu/home/llee/omsa/omsa.pdf  Etude sur l&#039;Opinion Mining]&lt;br /&gt;
* [http://fr.wikipedia.org/wiki/Opinion_mining  Opinion Mining Wikipedia]&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Opinion_Mining_et_Sentiment_Analysis&amp;diff=22450</id>
		<title>Opinion Mining et Sentiment Analysis</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Opinion_Mining_et_Sentiment_Analysis&amp;diff=22450"/>
		<updated>2015-03-25T00:31:59Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Présentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
* Enseignants : Didier Donsez ([[EA2014]])&lt;br /&gt;
* Sujet : Opinion Mining and Sentiment Analysis&lt;br /&gt;
* Date : 25 mars 2015&lt;br /&gt;
* Auteur : Benoit Perruche&lt;br /&gt;
* Lien vers les slides de la présentation : []&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Opinion mining is sentiment analysis from dematerialized textual sources on large amounts of data (big data).&lt;br /&gt;
This process appears in the early 2000s and knows a growing success due to the abundance of data provided by the social network Twitter.&lt;br /&gt;
The objective of the opinion mining is to analyze large amounts of data in order to deduce the different feelings that are expressed. The extracted feelings can then be subject of statistics on a community overall feeling.&lt;br /&gt;
&lt;br /&gt;
=== Key Words===&lt;br /&gt;
&lt;br /&gt;
big data, social networks, feelings, statistics, forecast&lt;br /&gt;
&lt;br /&gt;
= Synthèse =&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que l&#039;Opinion Mining ? ==&lt;br /&gt;
* une discipline récente basée sur des méthodes de programmation issues de neuro-linguistique, d&#039;intelligence artificielle et/ou de spectrocospie infrarouge pour l&#039;extraction d&#039;opinions.&lt;br /&gt;
* de manière plus conventionnelle, l&#039;opinion mining traite de l&#039;extraction de sentiments ou d&#039;opinions à partir d&#039;un texte.&lt;br /&gt;
* Internet aujourd&#039;hui et le nombre toujours croissant de personnes utilisant les réseaux sociaux fourni une quantité astronomique de données texte traitant de différents sujets comme l&#039;appréciation d&#039;un produit ou d&#039;une personne par exemple.&lt;br /&gt;
* ces sources d&#039;information intéressent evidemment les entreprises, mais aussi les possibles acheteurs d&#039;un produit qui souhaiteraient connaitre les appréciations des utilisateurs.&lt;br /&gt;
&lt;br /&gt;
== Motivations ==&lt;br /&gt;
Le but est de savoir ce qu&#039;une personne pense en fonction de ce qu&#039;elle a écrit. Tous les utilisateurs ne désirent pas la même chose d&#039;un produit (certains seront plus intéréssés par la durée de vie, d&#039;autres par un prix avantageux, ou encore la vitesse de livraison).&lt;br /&gt;
Prenons l&#039;exemple d&#039;amazon, un acheteur potentiel va normalement se renseigner sur le produit et jeter un oeil aux différents commentaires. Une personne qui vient d&#039;acheter ce produit va parler de son expérience et exprimer son ressenti. C&#039;est donc dans l&#039;interet de l&#039;entreprise de rester au courant et d&#039;analyser les retours que les acheteurs font, afin d&#039;améliorer leurs produits et ajuster leur stratégie de marketing.&lt;br /&gt;
&lt;br /&gt;
== Marché ==&lt;br /&gt;
Il existe déjà plusieurs applications analysant les sentiments de commentaires sur certains réseaux sociaux :&lt;br /&gt;
* Twitter sentiment : http://twittersentiment.appspot.com/ (nécessite un compte twitter)&lt;br /&gt;
* SocialMention: http://socialmention.com/&lt;br /&gt;
Ces applications permettent une recherche d&#039;opinions facile pour des personnalitées ou des marques connues, recherche bien plus compliquée pour des sujets plus abstraits.&lt;br /&gt;
Ces applications, basées essentiellement sur l&#039;analyse de la positivité ou négativité d&#039;un terme (utilisation d&#039;un dictionnaire attribuant un score positif ou negatif aux mots), ne fonctionnent pas bien :&lt;br /&gt;
* analyse des tweets possédant le mot-clé, pas des tweets dont le mot-clé en est le thème.&lt;br /&gt;
* il n&#039;y a pas de corrélation entre le tweet et le mot-clé, le sentiment du tweeter s&#039;attribue à l&#039;ensemble du commentaire.&lt;br /&gt;
&lt;br /&gt;
Derwent Capital Markets est une entreprise pionière pour l&#039;utilisation de l&#039;analyse de sentiments dans les réseaux sociaux afin d&#039;élaborer des prédictions sur le cours de la bourse. Ils ont en effet établi certaines corrélations entre des mots à caractères émotionnels apparaissant dans les posts de Twitter et les variations de l&#039;indice boursier. S&#039;attendant au résultat selon lequel une baisse de l&#039;indice boursier induisait une dégradation de l&#039;humeur des gens sur Twitter, DCM ne s&#039;attendait pas à découvrir que c&#039;était la baisse de l&#039;humeur des gens qui précédait une chute du cours boursiers.&lt;br /&gt;
Cependant, leurs résultats doivent être pris avec précautions. En effet, les résultats proposés par Derwent Capital Markets comporteraient de nombreuses failles. S&#039;il était vraiment possible de prévoir les variations de l&#039;indice boursier avec cette méthode, son utilisation serait beaucoup plus répandue.&lt;br /&gt;
&lt;br /&gt;
== Méthode pour l&#039;analyse d&#039;opinion ==&lt;br /&gt;
S&#039;en tenir à l&#039;opinion d&#039;un spécialiste pour répondre à une question technique est plus sûr que l&#039;opinion générale. L&#039;opinion mining doit donc seulement être utilisé pour certaines tâches.&lt;br /&gt;
Mais si l&#039;on se retrouve en présence de plusieurs spécialistes, certaines études montrent que l&#039;on aurait tendance à attribuer plus de poids au spécialiste le plus crédible qu&#039;à la majorité. Des notions comme la confiance, l&#039;autorité et l&#039;influence sont donc relatées à l&#039;opinion mining.&lt;br /&gt;
Il est nécessaire de séparer confiance relationnelle et confiance par réputation.&lt;br /&gt;
&lt;br /&gt;
L&#039;enjeu dans un tweet est d&#039;extraire la partie représentant l&#039;opinion. La deuxième étape est l&#039;extraction de la polarité (positif, neutre, negatif ou bien à l&#039;aide d&#039;une échelle numérique) de l&#039;opinion. Pour finir, la somme globale des scores sur les opinions représentera le sentiment général sur ce sujet.&lt;br /&gt;
La première amélioration consiste à déterminer dans un texte quelle opinion est attribuée à quelle caractéristique.Il est important de connaitre la source (la personne à l&#039;origine) et la cible (le sujet) de chaque opinion.&lt;br /&gt;
&lt;br /&gt;
L&#039;un des problème à résoudre lors de l&#039;analyse de sentiments est la détection de spams. En effet, c&#039;est une pratique assez répandu chez les entreprises de payer certaines personnes pour écrire des commentaires positifs (ou négatifs) sur un produit, une entreprise ou même un gouvernement. &lt;br /&gt;
&lt;br /&gt;
Les réseaux sociaux fournissent trois types d&#039;intérêts à propos d&#039;un utilisateur :&lt;br /&gt;
* explicite : la personne aime le cinéma.&lt;br /&gt;
* implicite : quelqu&#039;un aimant les sports extrèmes aura tendance à aimer prendre des risques.&lt;br /&gt;
* associatif : les gens qui achètent des produits de la marque Zara auront aussi tendance à acheter des produits Apple.&lt;br /&gt;
Le but est de définir des clusters d&#039;intérêts et d&#039;opinions sur de larges groupes de personnes. En effet, les entreprises pourront ensuite cibler leur publicité aux différents groupes de personnes.&lt;br /&gt;
&lt;br /&gt;
= Démo =&lt;br /&gt;
&lt;br /&gt;
Etude des sentiments sur la personne Bill Gates:&lt;br /&gt;
* [http://www.sentiment140.com/search?query=Bill+Gates&amp;amp;hl=en  Sur Twitter]&lt;br /&gt;
* [http://socialmention.com/search?t=all&amp;amp;q=Bill+Gates&amp;amp;btnG=Search  Posts hors réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
Exemple d&#039;application attribuant un score aux termes à caractères émotionnels dans un texte :&lt;br /&gt;
[https://semantria.com/demo  Wikipedia sur Bill Gates]&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* [http://www.cs.cornell.edu/home/llee/omsa/omsa.pdf  Etude sur l&#039;Opinion Mining]&lt;br /&gt;
* [http://fr.wikipedia.org/wiki/Opinion_mining  Opinion Mining Wikipedia]&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22449</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22449"/>
		<updated>2015-03-25T00:04:43Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Conception : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) délivrée par un serveur Express (NodeJS) connecté à un port précis.&lt;br /&gt;
&lt;br /&gt;
La communication entre les clients et le serveur se fait grâce au module &#039;&#039;&#039;NowJS : https://github.com/Flotype/now/&#039;&#039;&#039; qui est basé sur des socket.io :&lt;br /&gt;
&lt;br /&gt;
* Les clients et le serveur vont partager un composant Now qui peut contenir des méthodes ou des variables.&lt;br /&gt;
* Les méthodes sont implémentées dans ce composant, côté client et côté serveur. &lt;br /&gt;
* Lorsqu&#039;un client veut appeler la méthode d&#039;un ou plusieurs ou tous les clients (lui compris ou non), il appelle une méthode de now implémentée côté serveur, et c&#039;est ce dernier qui est chargé d&#039;appeler le ou les méthodes des clients.&lt;br /&gt;
* NowJs fonctionne sur le principe de groupe. Le premier groupe nommé &amp;quot;everyone&amp;quot; contient tous les clients. On peut ensuite créer des sous-groupes et y ajouter les clients au fur et à mesure. Cela rend facile la sélection des clients pour l&#039;appel de méthode.&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Prérequis - Projet Table Tactile =&lt;br /&gt;
* Le serveur peut accueillir au maximum quatre clients&lt;br /&gt;
* Les tables doivent être disposées en carré et orientées vers l&#039;extérieur, de sorte que l&#039;on puisse tourner autour du carré et être dans le bon sens de lecture&lt;br /&gt;
* Le serveur distingue quatre orientations : Nord-Ouest, Nord-Est, Sud-Ouest, Sud-Est.&lt;br /&gt;
* A chaque fois qu&#039;un client se connecte, le serveur lui attribue la première orientation disponible suivant l&#039;ordre ci-dessus.&lt;br /&gt;
* Utiliser Google Chrome de préférence&lt;br /&gt;
* Activer les événements tactiles pour le navigateur Google Chrome (chrome://flags/#touch-events)&lt;br /&gt;
* Pour chaque table, le mode plein écran doit être lancé manuellement (F11) pour le mode Tiled Display (sinon la taille maximale du média sera celle du Body)&lt;br /&gt;
* Pour lancer une vidéo, utiliser les fichiers .mp4 (chrome uniquement), .ogg, .webm&lt;br /&gt;
&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images, ou la capture en temps-réel d&#039;une vidéo HTML5 dans un canvas toutes les 1000/n millisecondes (n = 60, 30 ... fps) &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
ATTENTION: Nous avons effectué des modifications dans ce module pour définir nous-même les limites de déplacement des objets. Les modifications commencent à l&#039;endroit (LIGNE 866 -&amp;gt; 912) où est indiqué le commentaire : /*AJOUT FONCTIONNALITE SUPPLEMENTAIRE*/&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi ajouté d&#039;autres options.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
&#039;&#039;&#039;Ping-pong&#039;&#039;&#039; :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drawing&#039;&#039;&#039; : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Opinion_Mining_et_Sentiment_Analysis&amp;diff=22448</id>
		<title>Opinion Mining et Sentiment Analysis</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Opinion_Mining_et_Sentiment_Analysis&amp;diff=22448"/>
		<updated>2015-03-25T00:02:37Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
* Enseignants : Didier Donsez ([[EA2014]])&lt;br /&gt;
* Sujet : Opinion Mining and Sentiment Analysis&lt;br /&gt;
* Date : 25 mars 2015&lt;br /&gt;
* Auteur : Benoit Perruche&lt;br /&gt;
* Lien vers les slides de la présentation : [http://slides.com/darkskull/firefoxos#/ slides]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Opinion mining is sentiment analysis from dematerialized textual sources on large amounts of data (big data).&lt;br /&gt;
This process appears in the early 2000s and knows a growing success due to the abundance of data provided by the social network Twitter.&lt;br /&gt;
The objective of the opinion mining is to analyze large amounts of data in order to deduce the different feelings that are expressed. The extracted feelings can then be subject of statistics on a community overall feeling.&lt;br /&gt;
&lt;br /&gt;
=== Key Words===&lt;br /&gt;
&lt;br /&gt;
big data, social networks, feelings, statistics, forecast&lt;br /&gt;
&lt;br /&gt;
= Synthèse =&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que l&#039;Opinion Mining ? ==&lt;br /&gt;
* une discipline récente basée sur des méthodes de programmation issues de neuro-linguistique, d&#039;intelligence artificielle et/ou de spectrocospie infrarouge pour l&#039;extraction d&#039;opinions.&lt;br /&gt;
* de manière plus conventionnelle, l&#039;opinion mining traite de l&#039;extraction de sentiments ou d&#039;opinions à partir d&#039;un texte.&lt;br /&gt;
* Internet aujourd&#039;hui et le nombre toujours croissant de personnes utilisant les réseaux sociaux fourni une quantité astronomique de données texte traitant de différents sujets comme l&#039;appréciation d&#039;un produit ou d&#039;une personne par exemple.&lt;br /&gt;
* ces sources d&#039;information intéressent evidemment les entreprises, mais aussi les possibles acheteurs d&#039;un produit qui souhaiteraient connaitre les appréciations des utilisateurs.&lt;br /&gt;
&lt;br /&gt;
== Motivations ==&lt;br /&gt;
Le but est de savoir ce qu&#039;une personne pense en fonction de ce qu&#039;elle a écrit. Tous les utilisateurs ne désirent pas la même chose d&#039;un produit (certains seront plus intéréssés par la durée de vie, d&#039;autres par un prix avantageux, ou encore la vitesse de livraison).&lt;br /&gt;
Prenons l&#039;exemple d&#039;amazon, un acheteur potentiel va normalement se renseigner sur le produit et jeter un oeil aux différents commentaires. Une personne qui vient d&#039;acheter ce produit va parler de son expérience et exprimer son ressenti. C&#039;est donc dans l&#039;interet de l&#039;entreprise de rester au courant et d&#039;analyser les retours que les acheteurs font, afin d&#039;améliorer leurs produits et ajuster leur stratégie de marketing.&lt;br /&gt;
&lt;br /&gt;
== Marché ==&lt;br /&gt;
Il existe déjà plusieurs applications analysant les sentiments de commentaires sur certains réseaux sociaux :&lt;br /&gt;
* Twitter sentiment : http://twittersentiment.appspot.com/ (nécessite un compte twitter)&lt;br /&gt;
* SocialMention: http://socialmention.com/&lt;br /&gt;
Ces applications permettent une recherche d&#039;opinions facile pour des personnalitées ou des marques connues, recherche bien plus compliquée pour des sujets plus abstraits.&lt;br /&gt;
Ces applications, basées essentiellement sur l&#039;analyse de la positivité ou négativité d&#039;un terme (utilisation d&#039;un dictionnaire attribuant un score positif ou negatif aux mots), ne fonctionnent pas bien :&lt;br /&gt;
* analyse des tweets possédant le mot-clé, pas des tweets dont le mot-clé en est le thème.&lt;br /&gt;
* il n&#039;y a pas de corrélation entre le tweet et le mot-clé, le sentiment du tweeter s&#039;attribue à l&#039;ensemble du commentaire.&lt;br /&gt;
&lt;br /&gt;
Derwent Capital Markets est une entreprise pionière pour l&#039;utilisation de l&#039;analyse de sentiments dans les réseaux sociaux afin d&#039;élaborer des prédictions sur le cours de la bourse. Ils ont en effet établi certaines corrélations entre des mots à caractères émotionnels apparaissant dans les posts de Twitter et les variations de l&#039;indice boursier. S&#039;attendant au résultat selon lequel une baisse de l&#039;indice boursier induisait une dégradation de l&#039;humeur des gens sur Twitter, DCM ne s&#039;attendait pas à découvrir que c&#039;était la baisse de l&#039;humeur des gens qui précédait une chute du cours boursiers.&lt;br /&gt;
Cependant, leurs résultats doivent être pris avec précautions. En effet, les résultats proposés par Derwent Capital Markets comporteraient de nombreuses failles. S&#039;il était vraiment possible de prévoir les variations de l&#039;indice boursier avec cette méthode, son utilisation serait beaucoup plus répandue.&lt;br /&gt;
&lt;br /&gt;
== Méthode pour l&#039;analyse d&#039;opinion ==&lt;br /&gt;
S&#039;en tenir à l&#039;opinion d&#039;un spécialiste pour répondre à une question technique est plus sûr que l&#039;opinion générale. L&#039;opinion mining doit donc seulement être utilisé pour certaines tâches.&lt;br /&gt;
Mais si l&#039;on se retrouve en présence de plusieurs spécialistes, certaines études montrent que l&#039;on aurait tendance à attribuer plus de poids au spécialiste le plus crédible qu&#039;à la majorité. Des notions comme la confiance, l&#039;autorité et l&#039;influence sont donc relatées à l&#039;opinion mining.&lt;br /&gt;
Il est nécessaire de séparer confiance relationnelle et confiance par réputation.&lt;br /&gt;
&lt;br /&gt;
L&#039;enjeu dans un tweet est d&#039;extraire la partie représentant l&#039;opinion. La deuxième étape est l&#039;extraction de la polarité (positif, neutre, negatif ou bien à l&#039;aide d&#039;une échelle numérique) de l&#039;opinion. Pour finir, la somme globale des scores sur les opinions représentera le sentiment général sur ce sujet.&lt;br /&gt;
La première amélioration consiste à déterminer dans un texte quelle opinion est attribuée à quelle caractéristique.Il est important de connaitre la source (la personne à l&#039;origine) et la cible (le sujet) de chaque opinion.&lt;br /&gt;
&lt;br /&gt;
L&#039;un des problème à résoudre lors de l&#039;analyse de sentiments est la détection de spams. En effet, c&#039;est une pratique assez répandu chez les entreprises de payer certaines personnes pour écrire des commentaires positifs (ou négatifs) sur un produit, une entreprise ou même un gouvernement. &lt;br /&gt;
&lt;br /&gt;
Les réseaux sociaux fournissent trois types d&#039;intérêts à propos d&#039;un utilisateur :&lt;br /&gt;
* explicite : la personne aime le cinéma.&lt;br /&gt;
* implicite : quelqu&#039;un aimant les sports extrèmes aura tendance à aimer prendre des risques.&lt;br /&gt;
* associatif : les gens qui achètent des produits de la marque Zara auront aussi tendance à acheter des produits Apple.&lt;br /&gt;
Le but est de définir des clusters d&#039;intérêts et d&#039;opinions sur de larges groupes de personnes. En effet, les entreprises pourront ensuite cibler leur publicité aux différents groupes de personnes.&lt;br /&gt;
&lt;br /&gt;
= Démo =&lt;br /&gt;
&lt;br /&gt;
Etude des sentiments sur la personne Bill Gates:&lt;br /&gt;
* [http://www.sentiment140.com/search?query=Bill+Gates&amp;amp;hl=en  Sur Twitter]&lt;br /&gt;
* [http://socialmention.com/search?t=all&amp;amp;q=Bill+Gates&amp;amp;btnG=Search  Posts hors réseaux sociaux]&lt;br /&gt;
&lt;br /&gt;
Exemple d&#039;application attribuant un score aux termes à caractères émotionnels dans un texte :&lt;br /&gt;
[https://semantria.com/demo  Wikipedia sur Bill Gates]&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* [http://www.cs.cornell.edu/home/llee/omsa/omsa.pdf  Etude sur l&#039;Opinion Mining]&lt;br /&gt;
* [http://fr.wikipedia.org/wiki/Opinion_mining  Opinion Mining Wikipedia]&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22447</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22447"/>
		<updated>2015-03-25T00:01:19Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Technologies utilisées : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) délivrée par un serveur Express (NodeJS) connecté à un port précis.&lt;br /&gt;
&lt;br /&gt;
La communication entre les clients et le serveur se fait grâce au module &#039;&#039;&#039;NowJS : https://github.com/Flotype/now/&#039;&#039;&#039; qui est basé sur des socket.io :&lt;br /&gt;
&lt;br /&gt;
* Les clients et le serveur vont partager un composant Now qui peut contenir des méthodes ou des variables.&lt;br /&gt;
* Les méthodes sont implémentées dans ce composant, côté client et côté serveur. &lt;br /&gt;
* Lorsqu&#039;un client veut appeler la méthode d&#039;un ou plusieurs ou tous les clients (lui compris ou non), il appelle une méthode de now implémentée côté serveur, et c&#039;est ce dernier qui est chargé d&#039;appeler le ou les méthodes des clients.&lt;br /&gt;
* NowJs fonctionne sur le principe de groupe. Le premier groupe nommé &amp;quot;everyone&amp;quot; contient tous les clients. On peut ensuite créer des sous-groupes et y ajouter les clients au fur et à mesure. Cela rend facile la sélection des clients pour l&#039;appel de méthode.&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Prérequis - Projet Table Tactile =&lt;br /&gt;
* Le serveur peut accueillir au maximum quatre clients&lt;br /&gt;
* Les tables doivent être disposées en carré et orientées vers l&#039;extérieur, de sorte que l&#039;on puisse tourner autour du carré et être dans le bon sens de lecture&lt;br /&gt;
* Le serveur distingue quatre orientations : Nord-Ouest, Nord-Est, Sud-Ouest, Sud-Est.&lt;br /&gt;
* A chaque fois qu&#039;un client se connecte, le serveur lui attribue la première orientation disponible suivant l&#039;ordre ci-dessus.&lt;br /&gt;
* Utiliser Google Chrome de préférence&lt;br /&gt;
* Activer les événements tactiles pour le navigateur Google Chrome (chrome://flags/#touch-events)&lt;br /&gt;
* Pour chaque table, le mode plein écran doit être lancé manuellement (F11) pour le mode Tiled Display (sinon la taille maximale du média sera celle du Body)&lt;br /&gt;
* Pour lancer une vidéo, utiliser les fichiers .mp4 (chrome uniquement), .ogg, .webm&lt;br /&gt;
&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
ATTENTION: Nous avons effectué des modifications dans ce module pour définir nous-même les limites de déplacement des objets. Les modifications commencent à l&#039;endroit (LIGNE 866 -&amp;gt; 912) où est indiqué le commentaire : /*AJOUT FONCTIONNALITE SUPPLEMENTAIRE*/&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi ajouté d&#039;autres options.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
&#039;&#039;&#039;Ping-pong&#039;&#039;&#039; :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drawing&#039;&#039;&#039; : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22446</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22446"/>
		<updated>2015-03-25T00:00:49Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Technologies utilisées : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) délivrée par un serveur Express (NodeJS) connecté à un port précis.&lt;br /&gt;
&lt;br /&gt;
La communication entre les clients et le serveur se fait grâce au module &#039;&#039;&#039;NowJS : https://github.com/Flotype/now/&#039;&#039;&#039; qui est basé sur des socket.io :&lt;br /&gt;
&lt;br /&gt;
* Les clients et le serveur vont partager un composant Now qui peut contenir des méthodes ou des variables.&lt;br /&gt;
* Les méthodes sont implémentées dans ce composant, côté client et côté serveur. &lt;br /&gt;
* Lorsqu&#039;un client veut appeler la méthode d&#039;un ou plusieurs ou tous les clients (lui compris ou non), il appelle une méthode de now implémentée côté serveur, et c&#039;est ce dernier qui est chargé d&#039;appeler le ou les méthodes des clients.&lt;br /&gt;
* NowJs fonctionne sur le principe de groupe. Le premier groupe nommé &amp;quot;everyone&amp;quot; contient tous les clients. On peut ensuite créer des sous-groupes et y ajouter les clients au fur et à mesure. Cela rend facile la sélection des clients pour l&#039;appel de méthode.&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Prérequis - Projet Table Tactile =&lt;br /&gt;
* Le serveur peut accueillir au maximum quatre clients&lt;br /&gt;
* Les tables doivent être disposées en carré et orientées vers l&#039;extérieur, de sorte que l&#039;on puisse tourner autour du carré et être dans le bon sens de lecture&lt;br /&gt;
* Le serveur distingue quatre orientations : Nord-Ouest, Nord-Est, Sud-Ouest, Sud-Est.&lt;br /&gt;
* A chaque fois qu&#039;un client se connecte, le serveur lui attribue la première orientation disponible suivant l&#039;ordre ci-dessus.&lt;br /&gt;
* Utiliser Google Chrome de préférence&lt;br /&gt;
* Activer les événements tactiles pour le navigateur Google Chrome (chrome://flags/#touch-events)&lt;br /&gt;
* Pour chaque table, le mode plein écran doit être lancé manuellement (F11) pour le mode Tiled Display (sinon la taille maximale du média sera celle du Body)&lt;br /&gt;
* Pour lancer une vidéo, utiliser les fichiers .mp4 (chrome uniquement), .ogg, .webm&lt;br /&gt;
&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
ATTENTION: Nous avons effectué des modifications dans ce module pour définir nous-même les limites de déplacement des objets. Les modifications commencent à l&#039;endroit (LIGNE 866 -&amp;gt; 912) où est indiqué le commentaire : /*AJOUT FONCTIONNALITE SUPPLEMENTAIRE*/&lt;br /&gt;
Nous avons aussi ajouté d&#039;autres options.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
&#039;&#039;&#039;Ping-pong&#039;&#039;&#039; :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drawing&#039;&#039;&#039; : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22445</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22445"/>
		<updated>2015-03-24T23:54:36Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Interface Graphique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) délivrée par un serveur Express (NodeJS) connecté à un port précis.&lt;br /&gt;
&lt;br /&gt;
La communication entre les clients et le serveur se fait grâce au module &#039;&#039;&#039;NowJS : https://github.com/Flotype/now/&#039;&#039;&#039; qui est basé sur des socket.io :&lt;br /&gt;
&lt;br /&gt;
* Les clients et le serveur vont partager un composant Now qui peut contenir des méthodes ou des variables.&lt;br /&gt;
* Les méthodes sont implémentées dans ce composant, côté client et côté serveur. &lt;br /&gt;
* Lorsqu&#039;un client veut appeler la méthode d&#039;un ou plusieurs ou tous les clients (lui compris ou non), il appelle une méthode de now implémentée côté serveur, et c&#039;est ce dernier qui est chargé d&#039;appeler le ou les méthodes des clients.&lt;br /&gt;
* NowJs fonctionne sur le principe de groupe. Le premier groupe nommé &amp;quot;everyone&amp;quot; contient tous les clients. On peut ensuite créer des sous-groupes et y ajouter les clients au fur et à mesure. Cela rend facile la sélection des clients pour l&#039;appel de méthode.&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Prérequis - Projet Table Tactile =&lt;br /&gt;
* Le serveur peut accueillir au maximum quatre clients&lt;br /&gt;
* Les tables doivent être disposées en carré et orientées vers l&#039;extérieur, de sorte que l&#039;on puisse tourner autour du carré et être dans le bon sens de lecture&lt;br /&gt;
* Le serveur distingue quatre orientations : Nord-Ouest, Nord-Est, Sud-Ouest, Sud-Est.&lt;br /&gt;
* A chaque fois qu&#039;un client se connecte, le serveur lui attribue la première orientation disponible suivant l&#039;ordre ci-dessus.&lt;br /&gt;
* Utiliser Google Chrome de préférence&lt;br /&gt;
* Activer les événements tactiles pour le navigateur Google Chrome (chrome://flags/#touch-events)&lt;br /&gt;
* Pour chaque table, le mode plein écran doit être lancé manuellement (F11) pour le mode Tiled Display (sinon la taille maximale du média sera celle du Body)&lt;br /&gt;
* Pour lancer une vidéo, utiliser les fichiers .mp4 (chrome uniquement), .ogg, .webm&lt;br /&gt;
&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
&#039;&#039;&#039;Ping-pong&#039;&#039;&#039; :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drawing&#039;&#039;&#039; : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22444</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22444"/>
		<updated>2015-03-24T23:41:44Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Tiled Display */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) délivrée par un serveur Express (NodeJS) connecté à un port précis.&lt;br /&gt;
&lt;br /&gt;
La communication entre les clients et le serveur se fait grâce au module &#039;&#039;&#039;NowJS : https://github.com/Flotype/now/&#039;&#039;&#039; qui est basé sur des socket.io :&lt;br /&gt;
&lt;br /&gt;
* Les clients et le serveur vont partager un composant Now qui peut contenir des méthodes ou des variables.&lt;br /&gt;
* Les méthodes sont implémentées dans ce composant, côté client et côté serveur. &lt;br /&gt;
* Lorsqu&#039;un client veut appeler la méthode d&#039;un ou plusieurs ou tous les clients (lui compris ou non), il appelle une méthode de now implémentée côté serveur, et c&#039;est ce dernier qui est chargé d&#039;appeler le ou les méthodes des clients.&lt;br /&gt;
* NowJs fonctionne sur le principe de groupe. Le premier groupe nommé &amp;quot;everyone&amp;quot; contient tous les clients. On peut ensuite créer des sous-groupes et y ajouter les clients au fur et à mesure. Cela rend facile la sélection des clients pour l&#039;appel de méthode.&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Interface Graphique =&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
&#039;&#039;&#039;Ping-pong&#039;&#039;&#039; :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drawing&#039;&#039;&#039; : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22443</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22443"/>
		<updated>2015-03-24T23:25:54Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Architecture Générale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) connectée à un serveur Exress (NodeJS).&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Interface Graphique =&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
&#039;&#039;&#039;Ping-pong&#039;&#039;&#039; :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drawing&#039;&#039;&#039; : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22442</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22442"/>
		<updated>2015-03-24T23:22:15Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Conception : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|600px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) connectée à un serveur Exress (NodeJS).&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Interface Graphique =&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
&#039;&#039;&#039;Ping-pong&#039;&#039;&#039; :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Drawing&#039;&#039;&#039; : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22441</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22441"/>
		<updated>2015-03-24T23:21:07Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Conception : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|600px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) connectée à un serveur Exress (NodeJS).&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Interface Graphique =&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
&#039;&#039;&#039;Ping-pong&#039;&#039;&#039; :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Drawing : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22440</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22440"/>
		<updated>2015-03-24T23:20:50Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Conception : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|600px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) connectée à un serveur Exress (NodeJS).&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Interface Graphique =&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Ping-pong :  Changement effectués : &lt;br /&gt;
* Chaque client ne bouge qu&#039;une seule barre (celle du bas) et envoie les coordonnées du mouvements à l&#039;autre client. En d&#039;autre termes, la barre du haut pour chaque client est bougé par l&#039;autre client.&lt;br /&gt;
* Le client à avoir lancé le jeu est le maître, il calcule les interactions entre les objets (balle, barre, mur...) et envoie les événements à l&#039;autre client.&lt;br /&gt;
* Etant donné que chaque client bouge la barre du bas, il faut que le client non maître bouge la balle dans la direction et sens opposé à ceux du clients maître.&lt;br /&gt;
* Découpage de la canvas pour n&#039;afficher que la moitié inférieure du terrain&lt;br /&gt;
* Ajout d&#039;un bouton QUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Drawing : Chaque client effectuant un tracé envoie les coordonnées et la couleur du tracé à tous les autres clients.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22439</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22439"/>
		<updated>2015-03-24T23:18:19Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Architecture Générale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|600px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Les deux entités du projet communiquent via des sockets de connexion.&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) connectée à un serveur Exress (NodeJS).&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Interface Graphique =&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Ping-pong : jeux de ping-pong basique en javascript jouable sur deux tables en face à face, le joueur déplace son doigt afin de déplacer la barre permettant de faire rebondir la balle.&lt;br /&gt;
Drawing : fenêtre partagée par plusieurs tables dans laquelle chaque client peut réaliser des dessins.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22438</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22438"/>
		<updated>2015-03-24T23:17:04Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Architecture Générale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|600px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) connectée à un serveur Exress (NodeJS).&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Interface Graphique =&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Ping-pong : jeux de ping-pong basique en javascript jouable sur deux tables en face à face, le joueur déplace son doigt afin de déplacer la barre permettant de faire rebondir la balle.&lt;br /&gt;
Drawing : fenêtre partagée par plusieurs tables dans laquelle chaque client peut réaliser des dessins.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=File:ArchiGeneral.png&amp;diff=22437</id>
		<title>File:ArchiGeneral.png</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=File:ArchiGeneral.png&amp;diff=22437"/>
		<updated>2015-03-24T23:16:39Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22436</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22436"/>
		<updated>2015-03-24T23:13:48Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Technologies utilisées : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|400px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) connectée à un serveur Exress (NodeJS).&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Interface Graphique =&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;Ping Pong Game&#039;&#039;&#039; : http://cssdeck.com/labs/ping-pong-game-tutorial-with-html5-canvas-and-sounds &lt;br /&gt;
Nous nous sommes inspirés de ce jeu en effectuant le minimum de changement possible pour le rendre multijoueur en Tiled Display&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Ping-pong : jeux de ping-pong basique en javascript jouable sur deux tables en face à face, le joueur déplace son doigt afin de déplacer la barre permettant de faire rebondir la balle.&lt;br /&gt;
Drawing : fenêtre partagée par plusieurs tables dans laquelle chaque client peut réaliser des dessins.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22435</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22435"/>
		<updated>2015-03-24T23:11:50Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Objectif : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|400px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) connectée à un serveur Exress (NodeJS).&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Interface Graphique =&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong&#039;&#039;&#039; : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Application Drawing&#039;&#039;&#039; : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Ping-pong : jeux de ping-pong basique en javascript jouable sur deux tables en face à face, le joueur déplace son doigt afin de déplacer la barre permettant de faire rebondir la balle.&lt;br /&gt;
Drawing : fenêtre partagée par plusieurs tables dans laquelle chaque client peut réaliser des dessins.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22434</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22434"/>
		<updated>2015-03-24T23:11:19Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Objectif : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|400px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) connectée à un serveur Exress (NodeJS).&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Interface Graphique =&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
&#039;&#039;&#039;Jeux Ping-pong : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
&#039;&#039;&#039;Application Drawing : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Ping-pong : jeux de ping-pong basique en javascript jouable sur deux tables en face à face, le joueur déplace son doigt afin de déplacer la barre permettant de faire rebondir la balle.&lt;br /&gt;
Drawing : fenêtre partagée par plusieurs tables dans laquelle chaque client peut réaliser des dessins.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22433</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22433"/>
		<updated>2015-03-24T23:10:27Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Objectif : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|400px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) connectée à un serveur Exress (NodeJS).&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Interface Graphique =&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
L&#039;objectif est de réaliser une application multiutilisateur avec une gestion de l&#039;affichage en tiled display si besoin.&lt;br /&gt;
Jeux Ping-pong : Application se jouant à deux, sur deux tables tactiles en face à face, et chaque table affiche la moitié du terrain de jeux.&lt;br /&gt;
Application Drawing : Les utilisateurs se partage une zone de dessin à la manière d&#039;un Google Doc.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Ping-pong : jeux de ping-pong basique en javascript jouable sur deux tables en face à face, le joueur déplace son doigt afin de déplacer la barre permettant de faire rebondir la balle.&lt;br /&gt;
Drawing : fenêtre partagée par plusieurs tables dans laquelle chaque client peut réaliser des dessins.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Opinion_Mining_et_Sentiment_Analysis&amp;diff=22432</id>
		<title>Opinion Mining et Sentiment Analysis</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Opinion_Mining_et_Sentiment_Analysis&amp;diff=22432"/>
		<updated>2015-03-24T23:08:35Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Méthode pour l&amp;#039;analyse d&amp;#039;opinion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
* Enseignants : Didier Donsez ([[EA2014]])&lt;br /&gt;
* Sujet : Opinion Mining and Sentiment Analysis&lt;br /&gt;
* Date : 25 mars 2015&lt;br /&gt;
* Auteur : Benoit Perruche&lt;br /&gt;
* Lien vers les slides de la présentation : [http://slides.com/darkskull/firefoxos#/ slides]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Opinion mining is sentiment analysis from dematerialized textual sources on large amounts of data (big data).&lt;br /&gt;
This process appears in the early 2000s and knows a growing success due to the abundance of data provided by the social network Twitter.&lt;br /&gt;
The objective of the opinion mining is to analyze large amounts of data in order to deduce the different feelings that are expressed. The extracted feelings can then be subject of statistics on a community overall feeling.&lt;br /&gt;
&lt;br /&gt;
=== Key Words===&lt;br /&gt;
&lt;br /&gt;
big data, social networks, feelings, statistics, forecast&lt;br /&gt;
&lt;br /&gt;
= Synthèse =&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que l&#039;Opinion Mining ? ==&lt;br /&gt;
* une discipline récente basée sur des méthodes de programmation issues de neuro-linguistique, d&#039;intelligence artificielle et/ou de spectrocospie infrarouge pour l&#039;extraction d&#039;opinions.&lt;br /&gt;
* de manière plus conventionnelle, l&#039;opinion mining traite de l&#039;extraction de sentiments ou d&#039;opinions à partir d&#039;un texte.&lt;br /&gt;
* Internet aujourd&#039;hui et le nombre toujours croissant de personnes utilisant les réseaux sociaux fourni une quantité astronomique de données texte traitant de différents sujets comme l&#039;appréciation d&#039;un produit ou d&#039;une personne par exemple.&lt;br /&gt;
* ces sources d&#039;information intéressent evidemment les entreprises, mais aussi les possibles acheteurs d&#039;un produit qui souhaiteraient connaitre les appréciations des utilisateurs.&lt;br /&gt;
&lt;br /&gt;
== Motivations ==&lt;br /&gt;
Le but est de savoir ce qu&#039;une personne pense en fonction de ce qu&#039;elle a écrit. Tous les utilisateurs ne désirent pas la même chose d&#039;un produit (certains seront plus intéréssés par la durée de vie, d&#039;autres par un prix avantageux, ou encore la vitesse de livraison).&lt;br /&gt;
Prenons l&#039;exemple d&#039;amazon, un acheteur potentiel va normalement se renseigner sur le produit et jeter un oeil aux différents commentaires. Une personne qui vient d&#039;acheter ce produit va parler de son expérience et exprimer son ressenti. C&#039;est donc dans l&#039;interet de l&#039;entreprise de rester au courant et d&#039;analyser les retours que les acheteurs font, afin d&#039;améliorer leurs produits et ajuster leur stratégie de marketing.&lt;br /&gt;
&lt;br /&gt;
== Marché ==&lt;br /&gt;
Il existe déjà plusieurs applications analysant les sentiments de commentaires sur certains réseaux sociaux :&lt;br /&gt;
* Twitter sentiment : http://twittersentiment.appspot.com/ (nécessite un compte twitter)&lt;br /&gt;
* SocialMention: http://socialmention.com/&lt;br /&gt;
Ces applications permettent une recherche d&#039;opinions facile pour des personnalitées ou des marques connues, recherche bien plus compliquée pour des sujets plus abstraits.&lt;br /&gt;
Ces applications, basées essentiellement sur l&#039;analyse de la positivité ou négativité d&#039;un terme (utilisation d&#039;un dictionnaire attribuant un score positif ou negatif aux mots), ne fonctionnent pas bien :&lt;br /&gt;
* analyse des tweets possédant le mot-clé, pas des tweets dont le mot-clé en est le thème.&lt;br /&gt;
* il n&#039;y a pas de corrélation entre le tweet et le mot-clé, le sentiment du tweeter s&#039;attribue à l&#039;ensemble du commentaire.&lt;br /&gt;
&lt;br /&gt;
Derwent Capital Markets est une entreprise pionière pour l&#039;utilisation de l&#039;analyse de sentiments dans les réseaux sociaux afin d&#039;élaborer des prédictions sur le cours de la bourse. Ils ont en effet établi certaines corrélations entre des mots à caractères émotionnels apparaissant dans les posts de Twitter et les variations de l&#039;indice boursier. S&#039;attendant au résultat selon lequel une baisse de l&#039;indice boursier induisait une dégradation de l&#039;humeur des gens sur Twitter, DCM ne s&#039;attendait pas à découvrir que c&#039;était la baisse de l&#039;humeur des gens qui précédait une chute du cours boursiers.&lt;br /&gt;
Cependant, leurs résultats doivent être pris avec précautions. En effet, les résultats proposés par Derwent Capital Markets comporteraient de nombreuses failles. S&#039;il était vraiment possible de prévoir les variations de l&#039;indice boursier avec cette méthode, son utilisation serait beaucoup plus répandue.&lt;br /&gt;
&lt;br /&gt;
== Méthode pour l&#039;analyse d&#039;opinion ==&lt;br /&gt;
S&#039;en tenir à l&#039;opinion d&#039;un spécialiste pour répondre à une question technique est plus sûr que l&#039;opinion générale. L&#039;opinion mining doit donc seulement être utilisé pour certaines tâches.&lt;br /&gt;
Mais si l&#039;on se retrouve en présence de plusieurs spécialistes, certaines études montrent que l&#039;on aurait tendance à attribuer plus de poids au spécialiste le plus crédible qu&#039;à la majorité. Des notions comme la confiance, l&#039;autorité et l&#039;influence sont donc relatées à l&#039;opinion mining.&lt;br /&gt;
Il est nécessaire de séparer confiance relationnelle et confiance par réputation.&lt;br /&gt;
&lt;br /&gt;
L&#039;enjeu dans un tweet est d&#039;extraire la partie représentant l&#039;opinion. La deuxième étape est l&#039;extraction de la polarité (positif, neutre, negatif ou bien à l&#039;aide d&#039;une échelle numérique) de l&#039;opinion. Pour finir, la somme globale des scores sur les opinions représentera le sentiment général sur ce sujet.&lt;br /&gt;
La première amélioration consiste à déterminer dans un texte quelle opinion est attribuée à quelle caractéristique.Il est important de connaitre la source (la personne à l&#039;origine) et la cible (le sujet) de chaque opinion.&lt;br /&gt;
&lt;br /&gt;
L&#039;un des problème à résoudre lors de l&#039;analyse de sentiments est la détection de spams. En effet, c&#039;est une pratique assez répandu chez les entreprises de payer certaines personnes pour écrire des commentaires positifs (ou négatifs) sur un produit, une entreprise ou même un gouvernement. &lt;br /&gt;
&lt;br /&gt;
Les réseaux sociaux fournissent trois types d&#039;intérêts à propos d&#039;un utilisateur :&lt;br /&gt;
* explicite : la personne aime le cinéma.&lt;br /&gt;
* implicite : quelqu&#039;un aimant les sports extrèmes aura tendance à aimer prendre des risques.&lt;br /&gt;
* associatif : les gens qui achètent des produits de la marque Zara auront aussi tendance à acheter des produits Apple.&lt;br /&gt;
Le but est de définir des clusters d&#039;intérêts et d&#039;opinions sur de larges groupes de personnes. En effet, les entreprises pourront ensuite cibler leur publicité aux différents groupes de personnes.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* [http://www.cs.cornell.edu/home/llee/omsa/omsa.pdf  Etude sur l&#039;Opinion Mining]&lt;br /&gt;
* [http://fr.wikipedia.org/wiki/Opinion_mining  Opinion Mining Wikipedia]&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22431</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22431"/>
		<updated>2015-03-24T23:08:28Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Architecture Générale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
L&#039;architecture générale peut être décrite comme-suit :&lt;br /&gt;
[[File:ArchiGeneral.png|400px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) connectée à un serveur Exress (NodeJS).&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Interface Graphique =&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
Réalisation d&#039;applications utilisables sur plusieurs tables à la fois.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Ping-pong : jeux de ping-pong basique en javascript jouable sur deux tables en face à face, le joueur déplace son doigt afin de déplacer la barre permettant de faire rebondir la balle.&lt;br /&gt;
Drawing : fenêtre partagée par plusieurs tables dans laquelle chaque client peut réaliser des dessins.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Opinion_Mining_et_Sentiment_Analysis&amp;diff=22430</id>
		<title>Opinion Mining et Sentiment Analysis</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Opinion_Mining_et_Sentiment_Analysis&amp;diff=22430"/>
		<updated>2015-03-24T23:08:10Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Présentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
* Enseignants : Didier Donsez ([[EA2014]])&lt;br /&gt;
* Sujet : Opinion Mining and Sentiment Analysis&lt;br /&gt;
* Date : 25 mars 2015&lt;br /&gt;
* Auteur : Benoit Perruche&lt;br /&gt;
* Lien vers les slides de la présentation : [http://slides.com/darkskull/firefoxos#/ slides]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Opinion mining is sentiment analysis from dematerialized textual sources on large amounts of data (big data).&lt;br /&gt;
This process appears in the early 2000s and knows a growing success due to the abundance of data provided by the social network Twitter.&lt;br /&gt;
The objective of the opinion mining is to analyze large amounts of data in order to deduce the different feelings that are expressed. The extracted feelings can then be subject of statistics on a community overall feeling.&lt;br /&gt;
&lt;br /&gt;
=== Key Words===&lt;br /&gt;
&lt;br /&gt;
big data, social networks, feelings, statistics, forecast&lt;br /&gt;
&lt;br /&gt;
= Synthèse =&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que l&#039;Opinion Mining ? ==&lt;br /&gt;
* une discipline récente basée sur des méthodes de programmation issues de neuro-linguistique, d&#039;intelligence artificielle et/ou de spectrocospie infrarouge pour l&#039;extraction d&#039;opinions.&lt;br /&gt;
* de manière plus conventionnelle, l&#039;opinion mining traite de l&#039;extraction de sentiments ou d&#039;opinions à partir d&#039;un texte.&lt;br /&gt;
* Internet aujourd&#039;hui et le nombre toujours croissant de personnes utilisant les réseaux sociaux fourni une quantité astronomique de données texte traitant de différents sujets comme l&#039;appréciation d&#039;un produit ou d&#039;une personne par exemple.&lt;br /&gt;
* ces sources d&#039;information intéressent evidemment les entreprises, mais aussi les possibles acheteurs d&#039;un produit qui souhaiteraient connaitre les appréciations des utilisateurs.&lt;br /&gt;
&lt;br /&gt;
== Motivations ==&lt;br /&gt;
Le but est de savoir ce qu&#039;une personne pense en fonction de ce qu&#039;elle a écrit. Tous les utilisateurs ne désirent pas la même chose d&#039;un produit (certains seront plus intéréssés par la durée de vie, d&#039;autres par un prix avantageux, ou encore la vitesse de livraison).&lt;br /&gt;
Prenons l&#039;exemple d&#039;amazon, un acheteur potentiel va normalement se renseigner sur le produit et jeter un oeil aux différents commentaires. Une personne qui vient d&#039;acheter ce produit va parler de son expérience et exprimer son ressenti. C&#039;est donc dans l&#039;interet de l&#039;entreprise de rester au courant et d&#039;analyser les retours que les acheteurs font, afin d&#039;améliorer leurs produits et ajuster leur stratégie de marketing.&lt;br /&gt;
&lt;br /&gt;
== Marché ==&lt;br /&gt;
Il existe déjà plusieurs applications analysant les sentiments de commentaires sur certains réseaux sociaux :&lt;br /&gt;
* Twitter sentiment : http://twittersentiment.appspot.com/ (nécessite un compte twitter)&lt;br /&gt;
* SocialMention: http://socialmention.com/&lt;br /&gt;
Ces applications permettent une recherche d&#039;opinions facile pour des personnalitées ou des marques connues, recherche bien plus compliquée pour des sujets plus abstraits.&lt;br /&gt;
Ces applications, basées essentiellement sur l&#039;analyse de la positivité ou négativité d&#039;un terme (utilisation d&#039;un dictionnaire attribuant un score positif ou negatif aux mots), ne fonctionnent pas bien :&lt;br /&gt;
* analyse des tweets possédant le mot-clé, pas des tweets dont le mot-clé en est le thème.&lt;br /&gt;
* il n&#039;y a pas de corrélation entre le tweet et le mot-clé, le sentiment du tweeter s&#039;attribue à l&#039;ensemble du commentaire.&lt;br /&gt;
&lt;br /&gt;
Derwent Capital Markets est une entreprise pionière pour l&#039;utilisation de l&#039;analyse de sentiments dans les réseaux sociaux afin d&#039;élaborer des prédictions sur le cours de la bourse. Ils ont en effet établi certaines corrélations entre des mots à caractères émotionnels apparaissant dans les posts de Twitter et les variations de l&#039;indice boursier. S&#039;attendant au résultat selon lequel une baisse de l&#039;indice boursier induisait une dégradation de l&#039;humeur des gens sur Twitter, DCM ne s&#039;attendait pas à découvrir que c&#039;était la baisse de l&#039;humeur des gens qui précédait une chute du cours boursiers.&lt;br /&gt;
Cependant, leurs résultats doivent être pris avec précautions. En effet, les résultats proposés par Derwent Capital Markets comporteraient de nombreuses failles. S&#039;il était vraiment possible de prévoir les variations de l&#039;indice boursier avec cette méthode, son utilisation serait beaucoup plus répandue.&lt;br /&gt;
&lt;br /&gt;
== Méthode pour l&#039;analyse d&#039;opinion ==&lt;br /&gt;
S&#039;en tenir à l&#039;opinion d&#039;un spécialiste pour répondre à une question technique est plus sûr que l&#039;opinion générale. L&#039;opinion mining doit donc seulement être utilisé pour certaines tâches.&lt;br /&gt;
Mais si l&#039;on se retrouve en présence de plusieurs spécialistes, certaines études montrent que l&#039;on aurait tendance à attribuer plus de poids au spécialiste le plus crédible qu&#039;à la majorité. Des notions comme la confiance, l&#039;autorité et l&#039;influence sont donc relatées à l&#039;opinion mining.&lt;br /&gt;
Il est nécessaire de séparer confiance relationnelle et confiance par réputation.&lt;br /&gt;
&lt;br /&gt;
L&#039;enjeu dans un tweet est d&#039;extraire la partie représentant l&#039;opinion. La deuxième étape est l&#039;extraction de la polarité (positif, neutre, negatif ou bien à l&#039;aide d&#039;une échelle numérique) de l&#039;opinion. Pour finir, la somme globale des scores sur les opinions représentera le sentiment général sur ce sujet.&lt;br /&gt;
La première amélioration consiste à déterminer dans un texte quelle opinion est attribuée à quelle caractéristique.Il est important de connaitre la source (la personne à l&#039;origine) et la cible (le sujet) de chaque opinion.&lt;br /&gt;
&lt;br /&gt;
L&#039;un des problème à résoudre lors de l&#039;analyse de sentiments est la détection de spams. En effet, c&#039;est une pratique assez répandu chez les entreprises de payer certaines personnes pour écrire des commentaires positifs (ou négatifs) sur un produit, une entreprise ou même un gouvernement. &lt;br /&gt;
&lt;br /&gt;
Les réseaux sociaux fournissent trois types d&#039;intérêts à propos d&#039;un utilisateur :&lt;br /&gt;
- explicite : la personne aime le cinéma.&lt;br /&gt;
- implicite : quelqu&#039;un aimant les sports extrèmes aura tendance à aimer prendre des risques.&lt;br /&gt;
- associatif : les gens qui achètent des produits de la marque Zara auront aussi tendance à acheter des produits Apple.&lt;br /&gt;
Le but est de définir des clusters d&#039;intérêts et d&#039;opinions sur de larges groupes de personnes. En effet, les entreprises pourront ensuite cibler leur publicité aux différents groupes de personnes.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* [http://www.cs.cornell.edu/home/llee/omsa/omsa.pdf  Etude sur l&#039;Opinion Mining]&lt;br /&gt;
* [http://fr.wikipedia.org/wiki/Opinion_mining  Opinion Mining Wikipedia]&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Opinion_Mining_et_Sentiment_Analysis&amp;diff=22429</id>
		<title>Opinion Mining et Sentiment Analysis</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Opinion_Mining_et_Sentiment_Analysis&amp;diff=22429"/>
		<updated>2015-03-24T23:07:11Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Abstract */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
* Enseignants : Georges-Pierre Bonneau, Didier Donsez ([[EA2014]])&lt;br /&gt;
* Sujet : FirefoxOS&lt;br /&gt;
* Date : 4 octobre 2014&lt;br /&gt;
* Auteur : Flavien Peyre &amp;lt;Firstname DOT Name AT e DOT ujf-grenoble DOT fr&amp;gt;&lt;br /&gt;
* Lien vers les slides de la présentation : [http://slides.com/darkskull/firefoxos#/ slides]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Opinion mining is sentiment analysis from dematerialized textual sources on large amounts of data (big data).&lt;br /&gt;
This process appears in the early 2000s and knows a growing success due to the abundance of data provided by the social network Twitter.&lt;br /&gt;
The objective of the opinion mining is to analyze large amounts of data in order to deduce the different feelings that are expressed. The extracted feelings can then be subject of statistics on a community overall feeling.&lt;br /&gt;
&lt;br /&gt;
=== Key Words===&lt;br /&gt;
&lt;br /&gt;
big data, social networks, feelings, statistics, forecast&lt;br /&gt;
&lt;br /&gt;
= Synthèse =&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que l&#039;Opinion Mining ? ==&lt;br /&gt;
* une discipline récente basée sur des méthodes de programmation issues de neuro-linguistique, d&#039;intelligence artificielle et/ou de spectrocospie infrarouge pour l&#039;extraction d&#039;opinions.&lt;br /&gt;
* de manière plus conventionnelle, l&#039;opinion mining traite de l&#039;extraction de sentiments ou d&#039;opinions à partir d&#039;un texte.&lt;br /&gt;
* Internet aujourd&#039;hui et le nombre toujours croissant de personnes utilisant les réseaux sociaux fourni une quantité astronomique de données texte traitant de différents sujets comme l&#039;appréciation d&#039;un produit ou d&#039;une personne par exemple.&lt;br /&gt;
* ces sources d&#039;information intéressent evidemment les entreprises, mais aussi les possibles acheteurs d&#039;un produit qui souhaiteraient connaitre les appréciations des utilisateurs.&lt;br /&gt;
&lt;br /&gt;
== Motivations ==&lt;br /&gt;
Le but est de savoir ce qu&#039;une personne pense en fonction de ce qu&#039;elle a écrit. Tous les utilisateurs ne désirent pas la même chose d&#039;un produit (certains seront plus intéréssés par la durée de vie, d&#039;autres par un prix avantageux, ou encore la vitesse de livraison).&lt;br /&gt;
Prenons l&#039;exemple d&#039;amazon, un acheteur potentiel va normalement se renseigner sur le produit et jeter un oeil aux différents commentaires. Une personne qui vient d&#039;acheter ce produit va parler de son expérience et exprimer son ressenti. C&#039;est donc dans l&#039;interet de l&#039;entreprise de rester au courant et d&#039;analyser les retours que les acheteurs font, afin d&#039;améliorer leurs produits et ajuster leur stratégie de marketing.&lt;br /&gt;
&lt;br /&gt;
== Marché ==&lt;br /&gt;
Il existe déjà plusieurs applications analysant les sentiments de commentaires sur certains réseaux sociaux :&lt;br /&gt;
* Twitter sentiment : http://twittersentiment.appspot.com/ (nécessite un compte twitter)&lt;br /&gt;
* SocialMention: http://socialmention.com/&lt;br /&gt;
Ces applications permettent une recherche d&#039;opinions facile pour des personnalitées ou des marques connues, recherche bien plus compliquée pour des sujets plus abstraits.&lt;br /&gt;
Ces applications, basées essentiellement sur l&#039;analyse de la positivité ou négativité d&#039;un terme (utilisation d&#039;un dictionnaire attribuant un score positif ou negatif aux mots), ne fonctionnent pas bien :&lt;br /&gt;
* analyse des tweets possédant le mot-clé, pas des tweets dont le mot-clé en est le thème.&lt;br /&gt;
* il n&#039;y a pas de corrélation entre le tweet et le mot-clé, le sentiment du tweeter s&#039;attribue à l&#039;ensemble du commentaire.&lt;br /&gt;
&lt;br /&gt;
Derwent Capital Markets est une entreprise pionière pour l&#039;utilisation de l&#039;analyse de sentiments dans les réseaux sociaux afin d&#039;élaborer des prédictions sur le cours de la bourse. Ils ont en effet établi certaines corrélations entre des mots à caractères émotionnels apparaissant dans les posts de Twitter et les variations de l&#039;indice boursier. S&#039;attendant au résultat selon lequel une baisse de l&#039;indice boursier induisait une dégradation de l&#039;humeur des gens sur Twitter, DCM ne s&#039;attendait pas à découvrir que c&#039;était la baisse de l&#039;humeur des gens qui précédait une chute du cours boursiers.&lt;br /&gt;
Cependant, leurs résultats doivent être pris avec précautions. En effet, les résultats proposés par Derwent Capital Markets comporteraient de nombreuses failles. S&#039;il était vraiment possible de prévoir les variations de l&#039;indice boursier avec cette méthode, son utilisation serait beaucoup plus répandue.&lt;br /&gt;
&lt;br /&gt;
== Méthode pour l&#039;analyse d&#039;opinion ==&lt;br /&gt;
S&#039;en tenir à l&#039;opinion d&#039;un spécialiste pour répondre à une question technique est plus sûr que l&#039;opinion générale. L&#039;opinion mining doit donc seulement être utilisé pour certaines tâches.&lt;br /&gt;
Mais si l&#039;on se retrouve en présence de plusieurs spécialistes, certaines études montrent que l&#039;on aurait tendance à attribuer plus de poids au spécialiste le plus crédible qu&#039;à la majorité. Des notions comme la confiance, l&#039;autorité et l&#039;influence sont donc relatées à l&#039;opinion mining.&lt;br /&gt;
Il est nécessaire de séparer confiance relationnelle et confiance par réputation.&lt;br /&gt;
&lt;br /&gt;
L&#039;enjeu dans un tweet est d&#039;extraire la partie représentant l&#039;opinion. La deuxième étape est l&#039;extraction de la polarité (positif, neutre, negatif ou bien à l&#039;aide d&#039;une échelle numérique) de l&#039;opinion. Pour finir, la somme globale des scores sur les opinions représentera le sentiment général sur ce sujet.&lt;br /&gt;
La première amélioration consiste à déterminer dans un texte quelle opinion est attribuée à quelle caractéristique.Il est important de connaitre la source (la personne à l&#039;origine) et la cible (le sujet) de chaque opinion.&lt;br /&gt;
&lt;br /&gt;
L&#039;un des problème à résoudre lors de l&#039;analyse de sentiments est la détection de spams. En effet, c&#039;est une pratique assez répandu chez les entreprises de payer certaines personnes pour écrire des commentaires positifs (ou négatifs) sur un produit, une entreprise ou même un gouvernement. &lt;br /&gt;
&lt;br /&gt;
Les réseaux sociaux fournissent trois types d&#039;intérêts à propos d&#039;un utilisateur :&lt;br /&gt;
- explicite : la personne aime le cinéma.&lt;br /&gt;
- implicite : quelqu&#039;un aimant les sports extrèmes aura tendance à aimer prendre des risques.&lt;br /&gt;
- associatif : les gens qui achètent des produits de la marque Zara auront aussi tendance à acheter des produits Apple.&lt;br /&gt;
Le but est de définir des clusters d&#039;intérêts et d&#039;opinions sur de larges groupes de personnes. En effet, les entreprises pourront ensuite cibler leur publicité aux différents groupes de personnes.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* [http://www.cs.cornell.edu/home/llee/omsa/omsa.pdf  Etude sur l&#039;Opinion Mining]&lt;br /&gt;
* [http://fr.wikipedia.org/wiki/Opinion_mining  Opinion Mining Wikipedia]&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22428</id>
		<title>Proj-2014-2015-SmartClassRoom</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom&amp;diff=22428"/>
		<updated>2015-03-24T23:06:29Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Envoi d’une fenêtre vers une autre table */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. &lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
Ce projet est donc principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
Ce projet se divise en deux grandes parties  :&lt;br /&gt;
*Tableau interactif &lt;br /&gt;
*Tiled Display sur les tables tactiles&lt;br /&gt;
&lt;br /&gt;
= Equipe =&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Superviseurs:&#039;&#039;&#039; Didier DONSEZ&lt;br /&gt;
*&#039;&#039;&#039;Intervenants extérieurs&#039;&#039;&#039; : Jérôme MAISONNASSE et Amr AL-YAFI.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Etudiants RICM5:&#039;&#039;&#039; Radhouane BEN YOUNES, El Hadji Malick FALL, Benoît PERRUCHE, Adam TIAMIOU&lt;br /&gt;
*&#039;&#039;&#039;Etudiants DUT R&amp;amp;T 1ère année:&#039;&#039;&#039; Quentin FOMBARON et Lucas REYGROBELLET &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Département :&#039;&#039;&#039; [http://www.polytech-grenoble.fr/ricm.html RICM 5], [[Polytech Grenoble]]&lt;br /&gt;
&lt;br /&gt;
= Documents liés =&lt;br /&gt;
* Le SRS (Software Requirements Specification) est accessible [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom/SRS ici]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Github repository&#039;&#039;&#039; : [https://github.com/falle38/SmartClassroom-TiledDisplayPart]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Diagrammes UML&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/UML]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scrum&#039;&#039;&#039; : [http://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/Scrum]&lt;br /&gt;
&lt;br /&gt;
=Objectifs=&lt;br /&gt;
== Tableau interactif ==&lt;br /&gt;
Pour cette partie, nous sommes partis d’un projet déjà développé par des étudiants de l’ENSIMAG : le mur digital interactif. Le but de ce projet était d&#039;ajouter des fonctionnalités électroniques à un tableau blanc ordinaire. L&#039;utilisateur travaille sur le tableau, écrivant ou dessinant avec des feutres classiques. L&#039;idée était de de permettre à l&#039;utilisateur de prendre des copies numériques des éléments du tableau, et de lui renvoyer cette copie à la place de l&#039;élément original. Celui-ci peut ensuite être effacé du tableau et l&#039;utilisateur interagit alors uniquement avec la version numérique. Il peut ainsi faire toutes sortes de manipulations comme dupliquer l&#039;objet, le déplacer, l&#039;élargir, le réduire…&lt;br /&gt;
&lt;br /&gt;
Nous devions apporter des améliorations à cette implémentation déjà fonctionnelle. Pour cela nous devions rajouter les fonctionnalités suivantes :&lt;br /&gt;
*Projection de la  traduction du texte écrit au tableau suivant la langue choisie&lt;br /&gt;
*Résolution automatique d’une équation et tracé de courbe de la fonction&lt;br /&gt;
&lt;br /&gt;
== Tiled display avec les tables ==&lt;br /&gt;
&lt;br /&gt;
Les tables fournies par Digitale dont nous disposons possèdent une sur-couche linux SPHER OS dont nous devrons nous débarrasser afin de créer notre propre interface. &lt;br /&gt;
&lt;br /&gt;
Dans le but d’effectuer un Tiled display sur les quatre tables, nous avons imaginer créer un serveur depuis l’une des tables. Chacun des écrans afficherait ensuite une page web représentant une partie de l’image globale. &lt;br /&gt;
&lt;br /&gt;
Nous avons tout d’abord lister les différents déplacements possibles d’entités, ainsi que les moyens de communications entre les tables. Nous avons ensuite diviser le travail en trois parties : une portant sur le codage du moteur physique qui devra nous permettre de réaliser nos interactions, une autre sur la création du serveur et de la page web globale, et une dernier tournée vers la communication entre les tables à l’aide de sockets web ou par un bus de diffusion.&lt;br /&gt;
&lt;br /&gt;
Suite à notre recherche sur les différents logiciels existants pour faire du tiling display, nous sommes tombé sur Sage2, un html viewer utilisé pour afficher de nombreux éléments dans de multiples fenêtres. Basé sur node.js, nous rencontrons des problèmes lors de l’installation de npm.&lt;br /&gt;
&lt;br /&gt;
Le problème rencontré est le même sous windows ou linux.&lt;br /&gt;
&lt;br /&gt;
====Les objectifs d’interactions à réaliser dans notre interface sont les suivants:====&lt;br /&gt;
*pouvoir déplacer les fenêtres &lt;br /&gt;
*zoomer / dezoomer sur plusieurs tables&lt;br /&gt;
*afficher un contenu statique, puis le répliquer dans les différentes fenêtres&lt;br /&gt;
*une touche pour un affichage plein écran (sur toutes les tables)&lt;br /&gt;
*la possibilité de faire tourner une fenêtre sur elle-même (ou rotation 90° à chaque coup)&lt;br /&gt;
*réaliser des applications en commun (par exemple un cours d’anatomie)&lt;br /&gt;
*proposer une représentation spatiale des tables afin de prévoir à l’avance les zones affichables&lt;br /&gt;
*prévoir les distances d’écartements entre les tables (prévoir les bordures)&lt;br /&gt;
&lt;br /&gt;
=Architecture Générale =&lt;br /&gt;
==Tiled Display==&lt;br /&gt;
Chaque client affiche une page web (interface) connectée à un serveur Exress (NodeJS).&lt;br /&gt;
&lt;br /&gt;
==Tableau interactif==&lt;br /&gt;
En résumé, après la capture de l&#039;image d&#039;entrée, suite à une action au niveau de l&#039;interface, le Backend Java amorce la détection du texte. Différents traitements sont ensuite appliquées puis les scripts batch correspondants sont exécutés avec les paramètres requis. Ceux là contiennent les différents appels aux scripts Python associés et/ou à bibliothèque de transformation en image. Si une erreur survient, une exception est levée. Sinon on obtient bien une image de sortie (qui peut être erronée si le résultat de la détection n&#039;est  pas correct par exemple).&lt;br /&gt;
&lt;br /&gt;
= Interface Graphique =&lt;br /&gt;
= Implémentation des fonctionnalités =&lt;br /&gt;
&lt;br /&gt;
==Partie Tableau interactif==&lt;br /&gt;
&lt;br /&gt;
===Mise en place d&#039;un OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est d&#039;être capable de récupérer du texte à partir d&#039;une image donnée en entrée. Ce texte est destiné à être sauvegardé dans un fichier qui sera exploité par les prochains modules.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tess4J :&#039;&#039;&#039; http://sourceforge.net/projects/tess4j/&lt;br /&gt;
&lt;br /&gt;
C&#039;est un wrapper Java JNA pour l&#039;API de &#039;&#039;&#039;Tesseract&#039;&#039;&#039;. Tess4J est distribué sous la licence Apache, v2.0.&lt;br /&gt;
Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin de faire de la récupération de texte sur des images, nous avons choisi d&#039;utiliser Tess4J.&lt;br /&gt;
Ce choix a été fait par recommandation et par analyse comparative. Nous avons tout d&#039;abord contacter Mr Laurent BESACIER qui nous a recommandé Tesseract. Puis nous avons fait un benchmark des différents OCR Open Source. Le choix de l&#039;OCR est très important pour le procédé de traduction que nous comptons mettre en place.&lt;br /&gt;
&lt;br /&gt;
Nous avons successivement testé &#039;&#039;&#039;Tesseract&#039;&#039;&#039;, &#039;&#039;&#039;GOCR&#039;&#039;&#039;, &#039;&#039;&#039;javaocr-source&#039;&#039;&#039;, &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; (qui détecte même des codes barres et QR Codes). &#039;&#039;&#039;Tesseract&#039;&#039;&#039; et &#039;&#039;&#039;Asprise OCR&#039;&#039;&#039; sont ressortis comme les plus concluants pour la détection mais malheureusement le second n&#039;est pas Open Source.&lt;br /&gt;
Toutefois comme le code développé par les étudiants de l&#039;ENSIMAG était en JAVA, plutôt que de faire un appel système, nous avons sauté sur l&#039;occasion d&#039;utiliser &#039;&#039;&#039;Tess4J&#039;&#039;&#039; qui était une implémentation de Tesseract en Java. En effet il a été très facile de l&#039;intégrer dans le code existant et de le lier aux différentes fonctions déjà présentes. Il s&#039;agissait juste d&#039;insérer un nouveau package.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
L&#039;intégration de Tess4J au projet existant a été plutôt simple. Toutefois cette librairie est seulement utilisable sur Windows et pas sur Linux à cause des &#039;&#039;&#039;DLL&#039;&#039;&#039;.&lt;br /&gt;
Le problème rencontré était plutôt liée aux performances de l&#039;OCR lui-même. Il faut respecter une certaine syntaxe pour avoir une détection idéale. Certains caractères ne sont pas en effet reconnus ou confondus. Par exemple si un &#039;&#039;&#039;&#039;r&#039;&#039;&#039;&#039; est trop proche d&#039;un &#039;&#039;&#039;&#039;v&#039;&#039;&#039;&#039; il peut être interpréter comme un &#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;.&lt;br /&gt;
Le temps de détection n&#039;est pas optimal. Cela se ressent quand le texte est trop long.&lt;br /&gt;
&lt;br /&gt;
===Intégration d&#039;un module de traduction à l&#039;OCR===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est de traduire le texte récupéré par Tesseract et de le convertir en image de sortie qui sera affiché à l&#039;utilisateur sur le tableau.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Python Goslate:&#039;&#039;&#039; http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Pour mettre en place la traduction, nous commençons tout d&#039;abord par récupérer le String renvoyé par Tess4J dans un fichier intitulé &#039;&#039;&#039;entree.txt&#039;&#039;&#039;. Le script que nous avons implémenté en python effectue tout d&#039;abord une lecture de ce fichier dans son ensemble (et non pas mot par mot sinon nous n&#039;obtiendrons pas une traduction fidèle). La traduction est ensuite renvoyée dans un fichier de sortie &#039;&#039;&#039;sortie.txt&#039;&#039;&#039;. Grâce à Image Magick, ce fichier de sortie est convertie en image PNG qui va être projetée sur le tableau par le vidéo-projecteur.&lt;br /&gt;
Pour plus de facilité, nous avons limité le choix des langues à cinq : &#039;&#039;&#039;français (&#039;fr&#039;), anglais (&#039;en&#039;), espagnol (&#039;es&#039;) , italien (&#039;it&#039;) et allemand (&#039;de&#039;)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Le premier problème rencontrée est que Tess4J détecte plus facilement les caractères en majuscule. Cependant, ces derniers ne sont pas très adaptés pour une traduction. De ce fait, au niveau du Java, lorsque nous récupérons le String résultat nous le transformons en minuscule grâce à la méthode &#039;&#039;&#039;toLowerCase()&#039;&#039;&#039;. A ce String nous appliquons au préalable un traitement  de « nettoyage » avec la méthode &#039;&#039;&#039;trim()&#039;&#039;&#039; qui permet d&#039;éliminer les éventuels caractères spéciaux qui se rajoutent et qui sont invisibles à l’œil nu. Il est nécessaire d&#039;avoir une bonne connexion pour accélérer le processus de traduction.&lt;br /&gt;
&lt;br /&gt;
Le passage du paramètre de la langue de traduction du code Java au script Python était plutôt délicat.&lt;br /&gt;
&lt;br /&gt;
===Intégration à l&#039;OCR d&#039;un module de résolution d&#039;équations et de calculs élémentaires===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
L&#039;objectif est que l&#039;utilisateur écrive au tableau soit une opération élémentaire (addition, soustraction, multiplication et division), soit une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et obtienne soit le résultat, soit la courbe de la fonction, par affichage.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies de Python :&#039;&#039;&#039; &lt;br /&gt;
*&#039;&#039;&#039;MatplotLib 1.2.0 :&#039;&#039;&#039; https://cloud.github.com/downloads/matplotlib/matplotlib/matplotlib-1.2.0.win32-py2.7.exe &lt;br /&gt;
*&#039;&#039;&#039;Numpy 1.9.2 :&#039;&#039;&#039; http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Visual Studio 2008 :&#039;&#039;&#039; http://download.microsoft.com/download/A/5/4/A54BADB6-9C3F-478D-8657-93B3FC9FE62D/vcsetup.exe&lt;br /&gt;
&lt;br /&gt;
====Conceptions:====&lt;br /&gt;
Pour intégrer le module de résolution d&#039;équation, nous reprenons le même modèle que pour la traduction &#039;&#039;&#039;(fichier entrée/fichier sortie)&#039;&#039;&#039; mais avec quelques particularités. &lt;br /&gt;
Nous avons conçu trois options pour les équations qui sont associés aux trois méthodes que nous avons implémentées pour elles :&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -r&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation(equ)&#039;&#039;&#039;&#039;&#039;. Cette méthode prend en paramètre une équation du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et retourne la valeur de x , Pour la résolution on considère implicitement &#039;&#039;&#039;ax+b=0&#039;&#039;&#039;. Nous avons défini une expression régulière (&#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;) qui nous permet  avec la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; de récupérer les coefficients a et b et de résoudre l&#039;équation. Le résultat de X avec 3 chiffres après la virgule est écrit dans le fichier de sortie puis affiché.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -rs&#039;&#039;&#039; :&lt;br /&gt;
Elle est associée à la méthode &#039;&#039;&#039;&#039;&#039;solve_linear_equation_with_result(equ)&#039;&#039;&#039;&#039;&#039;. Elle reprend la même idée que l&#039;option précédente sauf que dans ce cas précis, on a un élément en plus qui correspond au résultat. On a ainsi des équations du type &#039;&#039;&#039;ax+b=c&#039;&#039;&#039;. L&#039;expression régulière appliquée devient ainsi &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)=(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
*&#039;&#039;&#039;L&#039;option -p&#039;&#039;&#039; :&lt;br /&gt;
Elle correspond à la méthode &#039;&#039;&#039;&#039;&#039;plot_equation(formula, x_range)&#039;&#039;&#039;&#039;&#039; et prend en entrée une formule du type &#039;&#039;&#039;ax+b&#039;&#039;&#039; et un intervalle d&#039;affichage que nous avons fixé par défaut à &#039;&#039;&#039;[-10,11]&#039;&#039;&#039;. Elle permet l&#039;affichage de la courbe de la fonction. Cette méthode n&#039;implique pas l&#039;édition d&#039;un fichier de sortie. La courbe de la fonction est directement enregistré dans un &#039;&#039;&#039;fichier png&#039;&#039;&#039;. Toutes ces opérations (&#039;&#039;&#039;&#039;&#039;tracé, enregistrement&#039;&#039;&#039;&#039;&#039;) sont possibles grâce à des méthodes inhérentes aux librairies Matplotlib et Numpy (&#039;&#039;&#039;&#039;&#039;eval, plot, savefig&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
	Pour toutes ces options le format des équations doit être scrupuleusement respecté : pas d&#039;espace, pas de nombres décimaux, pas de nombres négatifs. Il convient aussi de choisir la bonne équation pour le bon format d&#039;entrée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;L&#039;option -o&#039;&#039;&#039; :&lt;br /&gt;
Elle fait appel à la méthode &#039;&#039;&#039;&#039;&#039;solve_operation(formula)&#039;&#039;&#039;&#039;&#039;. Celle-ci permet d&#039;effectuer les opérations élémentaires : addition, soustraction, multiplication et division entre deux nombres. Ce format d&#039;entrée est spécifié par l&#039;expression régulière &#039;&#039;&#039;r&amp;quot;(\d*)[xX]\+(\d+)&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés :====&lt;br /&gt;
Le problème majeur était lié à l&#039;installation de la librairie &#039;&#039;&#039;Numpy&#039;&#039;&#039; sur Windows qui s&#039;est avérée plus compliquée que prévue. Pour se faire nous avons dû installer &#039;&#039;&#039;Microsoft Visual Studio 2008&#039;&#039;&#039; pour pouvoir répondre à toutes les exigences de compilation pour intégrer cette bibliothèque à Python 2.7.&lt;br /&gt;
&lt;br /&gt;
Dans une moindre mesure, concernant les options &#039;&#039;&#039;-r&#039;&#039;&#039; et &#039;&#039;&#039;-rs&#039;&#039;&#039; il fallait prendre en compte le cas où &#039;&#039;&#039;x=1&#039;&#039;&#039; dans l&#039;expression &#039;&#039;&#039;ax+b&#039;&#039;&#039;. Nous avons juste rajouté la condition selon laquelle si le premier caractère renvoyé par la méthode &#039;&#039;&#039;&#039;&#039;group()&#039;&#039;&#039;&#039;&#039; valait &#039;&#039;&#039;&amp;quot;&amp;quot; (c’est-à-dire vide)&#039;&#039;&#039; , le nombre associé est &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce problème est réapparu dans l&#039;option &#039;&#039;&#039;-p&#039;&#039;&#039;. Pour faire appel à la méthode &#039;&#039;&#039;&#039;&#039;eval()&#039;&#039;&#039;&#039;&#039; le format de la formule ne doit plus être &#039;&#039;&#039;ax+b&#039;&#039;&#039; mais &#039;&#039;&#039;a*x+b&#039;&#039;&#039;. La transformation est plutôt facile au niveau du Java grâce à la fonction &#039;&#039;&#039;&#039;&#039;replace(&amp;quot;x&amp;quot;, &amp;quot;*x&amp;quot;)&#039;&#039;&#039;&#039;&#039; mais elle ne doit se faire dans le cas où on a affaire à  une équation du type &#039;&#039;&#039;x+b (&amp;quot;x\\+(\\d+)&amp;quot;)&#039;&#039;&#039; pour éviter les erreurs (la formule &#039;&#039;&#039;x+1&#039;&#039;&#039; devient &#039;&#039;&#039;*x+1&#039;&#039;&#039; et n&#039;est plus interprétée correctement).&lt;br /&gt;
&lt;br /&gt;
==Partie Tiled Display==&lt;br /&gt;
&lt;br /&gt;
===Lecture d’une vidéo (pdf, images etc...) en Tiled Display===&lt;br /&gt;
&lt;br /&gt;
====Objectif :====&lt;br /&gt;
&lt;br /&gt;
Afficher une video sur plusieurs tables tactiles, sans qu&#039;il y est de latence entre les écrans.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées : ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module NowJS : https://github.com/Flotype/now/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module node-demux : https://github.com/tmarrinan/node-demux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Module fluent-ffmpeg : https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les son. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Nous avons estimé que le module fluent-ffmpeg serait suffisant pour que chaque client reçoivent les données vidéos en temps-réel.&lt;br /&gt;
Ce module est capable de décoder la video en format .flv et de piper les données dans un tuyau (stream) lu en sortie par un lecteur flowplayer. En gros, le client lance une méthode “get”, le serveur pipe les données dans la variable “res” qui est le résultat du “get”. Ensuite, côté client le lecteur flowplayer lit les données qui sont délivrées en continu.&lt;br /&gt;
&lt;br /&gt;
Le problème est que le format .flv est non open-source et le lecteur Flowplayer ne permet pas d’utiliser les données une fois interprété. Par exemple, il nous était impossible de capturer chaque images du lecteur et des les copier dans un nouveau canvas; l’idée étant de pouvoir redimensionner les images à notre guise.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Afin que chaque client puisse recevoir en temps-réel les données de la vidéo et puisse les traiter pour faire du Tiled Display, nous avons décidé d&#039;utiliser :&lt;br /&gt;
*le module node-demux pour délivrer les images &lt;br /&gt;
*le module fluent-ffmpeg pour délivrer la partie audio&lt;br /&gt;
&lt;br /&gt;
Les images délivrées sont traitées et redimensionnées par le client (cf: afficher une partie de la vidéo) et copiées dans un “canvas” spécifique.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie audio, chaque client possède un lecteur Flowplayer non visible et connecté par un tuyau au Serveur. Le module fluent-ffmpeg va ainsi permettre de délivrer toute sorte de données audio dans chaque tuyau de chaque client. &lt;br /&gt;
A noter que ce module peut délivrer la partie audio d’un fichier vidéo à partir d’un temps précis (par exemple à partir de la dixième minute); permettant ainsi de synchroniser les données lorsqu’un utilisateur avance ou recule la vidéo.&lt;br /&gt;
&lt;br /&gt;
===Envoi d’une fenêtre vers une autre table, Rotation, Resize===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
&lt;br /&gt;
Permettre à l&#039;utilisateur d&#039;envoyer par drag &amp;amp; drop un objet (video, pdf, image...) sur une autre table accolée à la sienne.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&#039;&#039;&#039;jquery.pep.js : http://pep.briangonzalez.org/     https://github.com/briangonzalez/jquery.pep.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet de faire du Drag and Drop sur des objets HTML. Il permet de calculer la vélocité du geste à tout moment et notamment lorsque l’utilisateur lâche l’objet.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;interact.js : http://interactjs.io/     https://github.com/taye/interact.js&#039;&#039;&#039;&lt;br /&gt;
Ce module permet d&#039;appliquer une rotation sur un objet et de changer ses dimensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;jester.js : https://github.com/plainview/Jester&lt;br /&gt;
Ce module permet d&#039;utiliser les évènements &amp;quot;doubletap&amp;quot;&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Il a tout d&#039;abord fallu adapter notre moteur physique à la sensibilité tactile des tables. Nous avons aussi dû préférer chrome à mozilla car firefox ne permettait pas de manipulation tactile performante.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Dans un premier temps, à chaque fois qu&#039;un client crée une fenêtre, il prévient tous les autres clients qui vont aussi la créer et la cacher. Dès qu&#039;un client bouge une fenêtre, il envoie les coordonnées du mouvements aux autres clients. Ces derniers vont ensuite calculer ces coordonnées par rapport à l&#039;orientation de la table (Nord-Est, Nord-Sud etc...). Par exemple, si l&#039;utilisateur envoie la fenêtre à droite en dehors du cadre, la table tactile à droite affichera la fenêtre. Si il n&#039;y a pas de table tactique à une orientation, alors la fenêtre ne peut sortir du cadre, il y a un mur.&lt;br /&gt;
&lt;br /&gt;
A chaque fois que l&#039;utilisateur fait un &amp;quot;doubletap&amp;quot; sur le header de la fenêtre, il se repositionne à son état angulaire d&#039;origine, c&#039;est-à-dire, comme si il n&#039;y avait jamais eu de rotation.&lt;br /&gt;
&lt;br /&gt;
===Jeux ping-pong et drawing===&lt;br /&gt;
&lt;br /&gt;
====Objectif : ====&lt;br /&gt;
Réalisation d&#039;applications utilisables sur plusieurs tables à la fois.&lt;br /&gt;
&lt;br /&gt;
====Technologies utilisées :====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Problèmes rencontrés:====&lt;br /&gt;
Adaptation de la sensibilité et gestion des bordures.&lt;br /&gt;
&lt;br /&gt;
====Conception :====&lt;br /&gt;
Ping-pong : jeux de ping-pong basique en javascript jouable sur deux tables en face à face, le joueur déplace son doigt afin de déplacer la barre permettant de faire rebondir la balle.&lt;br /&gt;
Drawing : fenêtre partagée par plusieurs tables dans laquelle chaque client peut réaliser des dessins.&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/SRS&amp;diff=22427</id>
		<title>Proj-2014-2015-SmartClassRoom/SRS</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2014-2015-SmartClassRoom/SRS&amp;diff=22427"/>
		<updated>2015-03-24T23:01:16Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* 4. Product evolution */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The document provides a template of the Software Requirements Specification (SRS). It is inspired of the IEEE/ANSI 830-1998 Standard.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  {|class=&amp;quot;wikitable alternance&amp;quot;&lt;br /&gt;
 |+ Document History&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Version&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Date&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Authors&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Description&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Validator&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Validation Date&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot; |&lt;br /&gt;
 | 0.1.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
0.1.1&lt;br /&gt;
&lt;br /&gt;
1.0.1&lt;br /&gt;
 | &lt;br /&gt;
&lt;br /&gt;
March 2014&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
March 2014&lt;br /&gt;
&lt;br /&gt;
March 2014&lt;br /&gt;
 | El Hadji Malick Fall&lt;br /&gt;
Benoît Perruche&lt;br /&gt;
&lt;br /&gt;
El Hadji Malick Fall&lt;br /&gt;
&lt;br /&gt;
Benoît Perruche&lt;br /&gt;
 | First description&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Second description&lt;br /&gt;
&lt;br /&gt;
Third description&lt;br /&gt;
 | El Hadji Malick Fall&lt;br /&gt;
Benoit Perruche&lt;br /&gt;
&lt;br /&gt;
Benoit Perruche&lt;br /&gt;
&lt;br /&gt;
El Hadji Malick Fall&lt;br /&gt;
 | &lt;br /&gt;
March, 14th 2015&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
March, 16th 2014&lt;br /&gt;
&lt;br /&gt;
March, 19th 2014&lt;br /&gt;
&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=1.   Introduction=&lt;br /&gt;
==1.1   Purpose of the requirements document==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les principaux objectifs de ce document qui décrit notre projet &#039;&#039;&#039;SmartClassroom&#039;&#039;&#039; sont:&lt;br /&gt;
*permettre aux lecteurs d&#039;identifier les différentes parties de notre projet&lt;br /&gt;
*permettre aux lecteurs de découvrir les technologies que nous avons développer&lt;br /&gt;
*expliquer l&#039;approche adoptée et les solutions que nous avons proposées &lt;br /&gt;
*fournir une base de travail pour de futures améliorations&lt;br /&gt;
&lt;br /&gt;
==1.2   Scope of the product==&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettent d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours. On peut ainsi imaginer des activités pédagogiques interactives comme des évaluations fournissant des réponses instantanées et permettant ainsi aux enseignants de voir quand un concept doit être révisé ou quand ils doivent davantage aider les élèves.&lt;br /&gt;
&lt;br /&gt;
==1.3   Definitions, acronyms and abbreviations==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;OCR&#039;&#039;&#039;&lt;br /&gt;
::La reconnaissance optique de caractères (ROC, en anglais optical character recognition : OCR) désigne les procédés informatiques pour la traduction d&#039;images de textes imprimés ou dactylographiés en fichiers de texte.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Goslate&#039;&#039;&#039;&lt;br /&gt;
::C&#039;est une API gratuite en python qui fournit un service de traduction de Google en interrogeant le service de Google Traduction.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tesseract&#039;&#039;&#039;&lt;br /&gt;
::Tesseract est un moteur open source de reconnaissance optique de caractères qui peut être utilisé :&lt;br /&gt;
*soit directement, en ligne de commandes soit par l&#039;intermédiaire d&#039;une interface graphique pour reconnaitre du texte avec mise en page basique ; cet usage est déjà fonctionnel.&lt;br /&gt;
*soit avec des surcouches gérant les mises en page complexes, etc., comme ocropus (encore en version beta).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tiled Display&#039;&#039;&#039;&lt;br /&gt;
::Le principe est de créer un écran géant composé de plusieurs écrans plus petits :&lt;br /&gt;
N&#039;importe quel écran peut être utilisé pour un wall display (il est tout de même nécessaire d&#039;adapter ensuite la technologie et les outils utilisés). Par exemple il est possible d&#039;utiliser :&lt;br /&gt;
*les écrans d&#039;ordinateurs ou de télévisions&lt;br /&gt;
*plusieurs vidéoprojecteurs&lt;br /&gt;
*les écrans de téléphone mobile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NowJS&#039;&#039;&#039;&lt;br /&gt;
::Ce module utilise les socket.io et permet de créer des applications web fonctionnant en temps-réel.&lt;br /&gt;
Fonctionnement : Un composant “now” est partagé entre le serveur et tous les clients. On peut ainsi lancer une fonction implémentée sur le serveur à partir d’un client, et aussi avoir accès à tous les composants déposés dans “now”.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;node-demux&#039;&#039;&#039;&lt;br /&gt;
::Ce module permet de décoder en temps-réel une video en images brutes. Il utilise la technologie ffmpeg.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;fluent-ffmpeg&#039;&#039;&#039;&lt;br /&gt;
::Ce module très puissant permet d’utiliser la technologie ffmpeg sur NodeJS. Contrairement à node-demux, il permet de décoder des videos en temps-réel et en plusieurs formats, comme .flv, en incluant les sons. Il permet aussi de décoder uniquement la partie audio d’un fichier vidéo. Ce module est très efficace pour faire du streaming vidéo.&lt;br /&gt;
&lt;br /&gt;
==1.4   References==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;General :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce projet est un projet de fin d&#039;étude, qui se déroule à Polytech Grenoble, et soutenu par la Fabmstic. La page du projet sur le wiki air est disponible via ce lien [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom ProjetSmartClassroom]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Technical :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Le Tiled Display - http://air.imag.fr/index.php/Tiled_Display&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Librairies:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tess4J - http://tess4j.sourceforge.net/&lt;br /&gt;
&lt;br /&gt;
ImageMagick - http://www.imagemagick.org/&lt;br /&gt;
&lt;br /&gt;
Goslate: Free Google Translate API - http://pythonhosted.org/goslate/&lt;br /&gt;
&lt;br /&gt;
NowJS - https://github.com/Flotype/now/&lt;br /&gt;
&lt;br /&gt;
node-demux - https://github.com/tmarrinan/node-demux&lt;br /&gt;
&lt;br /&gt;
fluent-ffmpeg - https://github.com/fluent-ffmpeg/node-fluent-ffmpeg&lt;br /&gt;
&lt;br /&gt;
==1.5   Overview of the remainder of the document==&lt;br /&gt;
&lt;br /&gt;
Le reste de ce document présente les caractéristiques techniques du projet telles que les exigences et les contraintes, ainsi que les caractéristiques nécessaires à l&#039;utilisateur.&lt;br /&gt;
La section 3 décrit les exigences détaillées, spécifiques et fonctionnelles, de performance, système et autres exigences relatives au projet. Des renseignements complémentaires sur les annexes sont également fournis dans cette même section.&lt;br /&gt;
&lt;br /&gt;
=2.   General description=&lt;br /&gt;
L&#039;objectif à long terme de ce projet est de mettre en place des technologies qui permettront d&#039;améliorer les techniques d&#039;enseignement dans les salles de cours.&lt;br /&gt;
&lt;br /&gt;
Ce projet se divise en deux parties :&lt;br /&gt;
* Tableau interactif avec numérisation de l&#039;information&lt;br /&gt;
* Tiled display sur tables tactiles&lt;br /&gt;
&lt;br /&gt;
==2.1   Product perspective==&lt;br /&gt;
Nous devons en effet tenir compte de l&#039;évolution possible de ce projet.&lt;br /&gt;
Pour le tableau interactif, l&#039;utilisateur effectue une manipulation virtuelle de données sur un tableau blanc physique. En effet il écrit son texte et la traduction de celui-ci est projeté dans la langue qu&#039;il a choisie parmi celles proposées. Une idée d&#039;amélioration est d&#039;intégrer de la résolution automatique d&#039;équations et d&#039;animations de schémas physiques. &lt;br /&gt;
Pour la table, on pourrait imaginer la réalisation d&#039;applications communes (par exemple un cours d’anatomie) pouvant tirer profit du tiling display.&lt;br /&gt;
&lt;br /&gt;
==2.2   Product functions==&lt;br /&gt;
===2.2.1 Interactive board===&lt;br /&gt;
&#039;&#039;&#039;Text detection&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, à partir d&#039;un vidéo projecteur placé en face du tableau, il est possible en temps réel de:&lt;br /&gt;
* Capturer des images des textes manuscrits&lt;br /&gt;
* Récupérer des strings à partir de ces images  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Translation or arithmetic and conversion&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dans un second temps, le résultat de la sortie récupérée est projetée sur le tableau.&lt;br /&gt;
Deux étapes sont nécessaires :&lt;br /&gt;
*Traitement&lt;br /&gt;
*Conversion&lt;br /&gt;
Si la sortie correspond à une opération mathématique ou une équation, son résultat (ou sa courbe) est affichée avec au préalable. Sinon si elle correspond à un texte, elle est d&#039;abord traduite puis le texte traduit est converti en format image.&lt;br /&gt;
&lt;br /&gt;
===2.2.2 Touch tables===&lt;br /&gt;
&#039;&#039;&#039;Tiled display&#039;&#039;&#039;&lt;br /&gt;
Une fois le serveur lancé et les clients connectés, chaque utilisateur (un par table tactile par exemple), a la possibilité de :&lt;br /&gt;
* Créer un objet (charger une video, une image, un pdf)&lt;br /&gt;
* Définir si cet objet est créé localement ou bien sur toutes les tables&lt;br /&gt;
* Réaliser de multiples interactions avec cet objet (mise en plein écran, déplacement d&#039;une table à une autre, rotation,...)&lt;br /&gt;
&lt;br /&gt;
==2.3   User characteristics==&lt;br /&gt;
Ce projet est principalement destiné aux enseignants. Il leur permettra de passer d&#039;un type d&#039;enseignement à un autre plus évolué, c&#039;est à dire gérer plus efficacement leurs classes, et évaluer la compréhension des élèves durant le cours. On distingue ensuite les élèves qui pourront entre autres organiser leurs propres fichiers multimédias, prendre des notes, collaborer avec d&#039;autres élèves ou partager des fichiers avec les enseignants.&lt;br /&gt;
&lt;br /&gt;
Toutefois, on peut les distinguer des utilisateurs développeurs qui pourront ajouter de nouvelles fonctionnalités au projet.&lt;br /&gt;
&lt;br /&gt;
==2.4   General constraints==&lt;br /&gt;
* L&#039;image capturée du tableau ne doit pas être vide ou corrompue&lt;br /&gt;
* Pour les fichiers d&#039;entrée et de sortie le format est &#039;&#039;&#039;.txt&#039;&#039;&#039;&lt;br /&gt;
* Le format de sortie des images est &#039;&#039;&#039;.png&#039;&#039;&#039; (peu importe leur format d&#039;entrée)&lt;br /&gt;
* Le script de traduction est écrit en Python&lt;br /&gt;
* Une connexion internet est nécessaire pour l’exécution du script&lt;br /&gt;
&lt;br /&gt;
==2.5   Assumptions and dependencies==&lt;br /&gt;
* Une connexion haut-débit est requise pou accélérer le processus de traduction de Goslate et la projection de vidéos HD en tiled display  &lt;br /&gt;
* Pour bénéficier de cette connexion, des dongles wifi sont nécéssaires &lt;br /&gt;
* Pour la capture d&#039;images et la projection il faut respectivement un appareil photo et un vidéo projecteur&lt;br /&gt;
&lt;br /&gt;
=3.Specific requirements, covering functional, non-functional and interface requirements=&lt;br /&gt;
* document external interfaces,&lt;br /&gt;
* describe system functionality and performance&lt;br /&gt;
* specify logical database requirements,&lt;br /&gt;
* design constraints,&lt;br /&gt;
* emergent system properties and quality characteristics.&lt;br /&gt;
&lt;br /&gt;
==3.1 Requirement X.Y.Z (in Structured Natural Language)==&lt;br /&gt;
&lt;br /&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi imperdiet dignissim mi et venenatis. Proin dictum ligula odio, ut fringilla nulla tincidunt in. Maecenas eu euismod augue, ut mollis libero.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;image&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nullam pulvinar sagittis orci nec cursus. Donec non sodales ipsum. Phasellus eleifend lobortis tortor, ut vulputate nisi interdum non. Fusce nec commodo tortor, id varius ante. Cras tincidunt tellus porta egestas bibendum.&lt;br /&gt;
&lt;br /&gt;
=== 3.1.1 Text detection ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;: Le texte écrit sur le tableau  est capturé et extrait à partir d&#039;une image&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Inputs&#039;&#039;&#039;: Image récupéré du tableau&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Source&#039;&#039;&#039;: Appareil photo et SDK gphoto2&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Outputs&#039;&#039;&#039;: Fichier texte contenant le texte écrit au tableau&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Destination&#039;&#039;&#039;: Le script de traduction Python&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Action&#039;&#039;&#039;:&lt;br /&gt;
L&#039;appareil capture la surface manuscrite délimitée par les jetons. La bibliothèque Tess4J lance une détection sur l&#039;image générée et insère le texte trouvé dans un fichier.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Non functional requirements&#039;&#039;&#039;: L&#039;extraction du texte doit être fait en temps réel et rapidement&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pre-condition&#039;&#039;&#039;: Disposer d&#039;un appareil photo et installer les librairies gphoto2 et Tess4J&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Post-condition&#039;&#039;&#039;: Le texte doit être bien reconnu&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Side-effects&#039;&#039;&#039;: Échec dans la détection du texte, Image d&#039;entrée floue&lt;br /&gt;
&lt;br /&gt;
=== 3.1.2 Translation and text projection ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;: Le fichier de sortie de Tess4J est traduit puis transformé en image pour être projeté &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Inputs&#039;&#039;&#039;: Un fichier texte &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Source&#039;&#039;&#039;: Script de traduction Python Goslate&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Outputs&#039;&#039;&#039;: Une image contenant le texte traduit&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Destination&#039;&#039;&#039;: Le vidéo-projecteur&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Action&#039;&#039;&#039;:&lt;br /&gt;
Le fichier de sortie de Tess4J est donnée en entrée au script Python qui procède à sa traduction. Le nouveau fichier obtenu est ensuite transformé en image grâce à la bibliothèque ImageMagick. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Non functional requirements&#039;&#039;&#039;: La traduction du texte doit être parfaite. La durée d’exécution du script ne doit pas être longue.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pre-condition&#039;&#039;&#039;: Avoir un vidéo projecteur et installer Python 2.7 et la librairie Goslate.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Post-condition&#039;&#039;&#039;: Le texte de sortie n&#039;est pas vide&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Side-effects&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
=== 3.1.3 Tiled Display (video example) ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;:  Affichage d&#039;une vidéo en tiling display sur deux tables tactiles accolées&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Inputs&#039;&#039;&#039;: vidéo .mp4&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Source&#039;&#039;&#039;: tables tactiles&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Outputs&#039;&#039;&#039;: chaque table affiche sa moitié de la vidéo&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Destination&#039;&#039;&#039;: affichage des tables&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Action&#039;&#039;&#039;: un client charge la vidéo et décide de l&#039;afficher en tiling display. Le serveur envoie toutes les 50ms l&#039;image que chaque client doit afficher.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Non functional requirements&#039;&#039;&#039;: il ne doit pas y avoir de latence entre l&#039;affichage des deux tables&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pre-condition&#039;&#039;&#039;: tables connectées au serveur, présence de l&#039;ensemble des librairies ainsi que du projet sur les deux tables, fichier video présent sur la table qui charge l&#039;objet&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Post-condition&#039;&#039;&#039;: affichage en plein écran sur les deux tables qui doivent toujours rester connectées au serveur&lt;br /&gt;
&lt;br /&gt;
=== 3.1.4 Translation from the teacher to the students ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;:  Capture du texte et envoie de la traduction aux tables tactiles&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Inputs&#039;&#039;&#039;: image du tableau&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Source&#039;&#039;&#039;: appareil photo&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Outputs&#039;&#039;&#039;: texte &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Destination&#039;&#039;&#039;: affichage tables tactiles&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Action&#039;&#039;&#039;: le texte est détecté, traduit, puis envoyé sur le serveur auquel sont connectées les tables&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Non functional requirements&#039;&#039;&#039;: réseau local entre les tables et le pc réalisant l&#039;analyse d&#039;image et la traduction&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pre-condition&#039;&#039;&#039;: tables et ordinateur du tableau interactif connectés au serveur&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Post-condition&#039;&#039;&#039;: affichage de la traduction sur les tables&lt;br /&gt;
&lt;br /&gt;
=4. Product evolution=&lt;br /&gt;
*Résolution d&#039;équations plus complexes&lt;br /&gt;
*Animation de figures avec moteurs physiques&lt;br /&gt;
*Sélection de données à distance à partir d&#039;une tablette&lt;br /&gt;
&lt;br /&gt;
=5. Appendices=&lt;br /&gt;
==5.1 Specification ==&lt;br /&gt;
* La page principale du projet peut être trouvée [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassRoom ici]&lt;br /&gt;
* Un autre groupe en RICM4 travaille aussi sur ce projet. Leur page wiki est accessible via le lien ci-dessous:&lt;br /&gt;
:- [http://air.imag.fr/index.php/Proj-2014-2015-SmartClassroom Proj-2014-2015-SmartClassroom]&lt;br /&gt;
&lt;br /&gt;
=6. Index=&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Opinion_Mining_et_Sentiment_Analysis&amp;diff=22426</id>
		<title>Opinion Mining et Sentiment Analysis</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Opinion_Mining_et_Sentiment_Analysis&amp;diff=22426"/>
		<updated>2015-03-24T22:58:06Z</updated>

		<summary type="html">&lt;p&gt;RICM4-prj14-grp12: /* Documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Présentation =&lt;br /&gt;
&lt;br /&gt;
* Enseignants : Georges-Pierre Bonneau, Didier Donsez ([[EA2014]])&lt;br /&gt;
* Sujet : FirefoxOS&lt;br /&gt;
* Date : 4 octobre 2014&lt;br /&gt;
* Auteur : Flavien Peyre &amp;lt;Firstname DOT Name AT e DOT ujf-grenoble DOT fr&amp;gt;&lt;br /&gt;
* Lien vers les slides de la présentation : [http://slides.com/darkskull/firefoxos#/ slides]&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
Open data is any content that people are free to use, re-use and redistribute — without any legal, technological or social restriction.&lt;br /&gt;
It is the idea that certain data should be freely available to everyone to use and republish as they wish, without restrictions from copyright, patents or other mechanisms of control.[ The goals of the open data movement are similar to those of other &amp;quot;Open&amp;quot; movements such as open source.&lt;br /&gt;
Equality, Collobaration and innovation.&lt;br /&gt;
&lt;br /&gt;
=== Mots-clés; Key Words===&lt;br /&gt;
&lt;br /&gt;
ouverture, transparence, licence, W3C, Web des données, RDF, public, Tim Berners&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Synthèse =&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est-ce que l&#039;Opinion Mining ? ==&lt;br /&gt;
* une discipline récente basée sur des méthodes de programmation issues de neuro-linguistique, d&#039;intelligence artificielle et/ou de spectrocospie infrarouge pour l&#039;extraction d&#039;opinions.&lt;br /&gt;
* de manière plus conventionnelle, l&#039;opinion mining traite de l&#039;extraction de sentiments ou d&#039;opinions à partir d&#039;un texte.&lt;br /&gt;
* Internet aujourd&#039;hui et le nombre toujours croissant de personnes utilisant les réseaux sociaux fourni une quantité astronomique de données texte traitant de différents sujets comme l&#039;appréciation d&#039;un produit ou d&#039;une personne par exemple.&lt;br /&gt;
* ces sources d&#039;information intéressent evidemment les entreprises, mais aussi les possibles acheteurs d&#039;un produit qui souhaiteraient connaitre les appréciations des utilisateurs.&lt;br /&gt;
&lt;br /&gt;
== Motivations ==&lt;br /&gt;
Le but est de savoir ce qu&#039;une personne pense en fonction de ce qu&#039;elle a écrit. Tous les utilisateurs ne désirent pas la même chose d&#039;un produit (certains seront plus intéréssés par la durée de vie, d&#039;autres par un prix avantageux, ou encore la vitesse de livraison).&lt;br /&gt;
Prenons l&#039;exemple d&#039;amazon, un acheteur potentiel va normalement se renseigner sur le produit et jeter un oeil aux différents commentaires. Une personne qui vient d&#039;acheter ce produit va parler de son expérience et exprimer son ressenti. C&#039;est donc dans l&#039;interet de l&#039;entreprise de rester au courant et d&#039;analyser les retours que les acheteurs font, afin d&#039;améliorer leurs produits et ajuster leur stratégie de marketing.&lt;br /&gt;
&lt;br /&gt;
== Marché ==&lt;br /&gt;
Il existe déjà plusieurs applications analysant les sentiments de commentaires sur certains réseaux sociaux :&lt;br /&gt;
* Twitter sentiment : http://twittersentiment.appspot.com/ (nécessite un compte twitter)&lt;br /&gt;
* SocialMention: http://socialmention.com/&lt;br /&gt;
Ces applications permettent une recherche d&#039;opinions facile pour des personnalitées ou des marques connues, recherche bien plus compliquée pour des sujets plus abstraits.&lt;br /&gt;
Ces applications, basées essentiellement sur l&#039;analyse de la positivité ou négativité d&#039;un terme (utilisation d&#039;un dictionnaire attribuant un score positif ou negatif aux mots), ne fonctionnent pas bien :&lt;br /&gt;
* analyse des tweets possédant le mot-clé, pas des tweets dont le mot-clé en est le thème.&lt;br /&gt;
* il n&#039;y a pas de corrélation entre le tweet et le mot-clé, le sentiment du tweeter s&#039;attribue à l&#039;ensemble du commentaire.&lt;br /&gt;
&lt;br /&gt;
Derwent Capital Markets est une entreprise pionière pour l&#039;utilisation de l&#039;analyse de sentiments dans les réseaux sociaux afin d&#039;élaborer des prédictions sur le cours de la bourse. Ils ont en effet établi certaines corrélations entre des mots à caractères émotionnels apparaissant dans les posts de Twitter et les variations de l&#039;indice boursier. S&#039;attendant au résultat selon lequel une baisse de l&#039;indice boursier induisait une dégradation de l&#039;humeur des gens sur Twitter, DCM ne s&#039;attendait pas à découvrir que c&#039;était la baisse de l&#039;humeur des gens qui précédait une chute du cours boursiers.&lt;br /&gt;
Cependant, leurs résultats doivent être pris avec précautions. En effet, les résultats proposés par Derwent Capital Markets comporteraient de nombreuses failles. S&#039;il était vraiment possible de prévoir les variations de l&#039;indice boursier avec cette méthode, son utilisation serait beaucoup plus répandue.&lt;br /&gt;
&lt;br /&gt;
== Méthode pour l&#039;analyse d&#039;opinion ==&lt;br /&gt;
S&#039;en tenir à l&#039;opinion d&#039;un spécialiste pour répondre à une question technique est plus sûr que l&#039;opinion générale. L&#039;opinion mining doit donc seulement être utilisé pour certaines tâches.&lt;br /&gt;
Mais si l&#039;on se retrouve en présence de plusieurs spécialistes, certaines études montrent que l&#039;on aurait tendance à attribuer plus de poids au spécialiste le plus crédible qu&#039;à la majorité. Des notions comme la confiance, l&#039;autorité et l&#039;influence sont donc relatées à l&#039;opinion mining.&lt;br /&gt;
Il est nécessaire de séparer confiance relationnelle et confiance par réputation.&lt;br /&gt;
&lt;br /&gt;
L&#039;enjeu dans un tweet est d&#039;extraire la partie représentant l&#039;opinion. La deuxième étape est l&#039;extraction de la polarité (positif, neutre, negatif ou bien à l&#039;aide d&#039;une échelle numérique) de l&#039;opinion. Pour finir, la somme globale des scores sur les opinions représentera le sentiment général sur ce sujet.&lt;br /&gt;
La première amélioration consiste à déterminer dans un texte quelle opinion est attribuée à quelle caractéristique.Il est important de connaitre la source (la personne à l&#039;origine) et la cible (le sujet) de chaque opinion.&lt;br /&gt;
&lt;br /&gt;
L&#039;un des problème à résoudre lors de l&#039;analyse de sentiments est la détection de spams. En effet, c&#039;est une pratique assez répandu chez les entreprises de payer certaines personnes pour écrire des commentaires positifs (ou négatifs) sur un produit, une entreprise ou même un gouvernement. &lt;br /&gt;
&lt;br /&gt;
Les réseaux sociaux fournissent trois types d&#039;intérêts à propos d&#039;un utilisateur :&lt;br /&gt;
- explicite : la personne aime le cinéma.&lt;br /&gt;
- implicite : quelqu&#039;un aimant les sports extrèmes aura tendance à aimer prendre des risques.&lt;br /&gt;
- associatif : les gens qui achètent des produits de la marque Zara auront aussi tendance à acheter des produits Apple.&lt;br /&gt;
Le but est de définir des clusters d&#039;intérêts et d&#039;opinions sur de larges groupes de personnes. En effet, les entreprises pourront ensuite cibler leur publicité aux différents groupes de personnes.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* [http://www.cs.cornell.edu/home/llee/omsa/omsa.pdf  Etude sur l&#039;Opinion Mining]&lt;br /&gt;
* [http://fr.wikipedia.org/wiki/Opinion_mining  Opinion Mining Wikipedia]&lt;/div&gt;</summary>
		<author><name>RICM4-prj14-grp12</name></author>
	</entry>
</feed>