Déploiement du Machiabot à l'um2
|
|
- Jérôme Ménard
- il y a 8 ans
- Total affichages :
Transcription
1 Déploiement du Machiabot à l'um2 Projet tutoré M1 IC Parcours CCI Encadré par : Eric BOURREAU et Pierre POMPIDOR Réalisé par : Gaël GONZALEZ Yvan SERIEYE Avec la participation de : Guillaume Tisserant Mai 2011
2 2 Table des matières Partie 1 : Rappels et présentation du projet Introduction Objectifs Principaux résultats... 5 Partie 2 : Le modèle MVC et son implémentation pour notre projet Présentation J2EE, TomCat, modèle MVC et le rôle de web.xml Notre implémentation : servlet Jouer.java, les modèles (Gestionnaire.java, Machiabot, Pierres) et vue jeu.jsp Partie 3 : Le modèle fondamental : la classe Machiabot.java Les Threads et le lancement du process de communication avec Machiabot La classe Machiabot.java La méthode jouer(string coup)...21 Partie 4 : Les sessions Rôle des SESSIONS: Les attributs de session Partie 5 : L'interface WEB La base en HTML/CSS L'amélioration avec Javascript Un nouveau modèle : algorithmes de retrait de Pierres Les dernières touches avec Ajax...31 Partie 6 : Principaux problèmes rencontrés Les erreurs Java Le cas du serveur Les améliorations à apporter...37 Conclusion Annexes Annexe 1 : la conférence à Paris...39 Annexe 2 : le code... 40
3 Partie 1 : Rappels et présentation du projet 3 Partie 1 : Rappels et présentation du projet 1.1 Introduction Au cours du dernier semestre, nous avions réalisé une étude préalable pour mettre en place une application WEB servant à utiliser un programme installé sur un serveur à l'université. Le programme en question est le Machiabot : une intelligence artificielle qui permet de joueur au jeu de GO contre une machine ; ce programme ayant été développé l'année précédente par des étudiants du Master IFPRU. Au cours de ce semestre notre projet a été très intéressant mais aussi difficile à mettre en place car il concernait de nombreuses personnes: 2 enseignants chercheurs encadrant les différents projets (E. Bourreau et P. Pompidor); un étudiant en M2 IFPRU (G. Tisserant créateur du Machiabot actuellement en stage de recherche au LIRMM pour améliorer le programme); 3 étudiants en M1 IFPRU (initialement chargés d'aider G. Tisserant et de développer des modules complémentaires pour ajouter des fonctionnalités au bot et dont nous n'avons plus de nouvelles depuis quelques mois); ainsi que nous: 2 étudiants en M1 IC (chargés de l'application WEB). (plus l'administrateur réseau de l'université A. Weisseldinger quand il était disponible pour la mise en place du serveur de projet) 1.2 Objectifs Les objectifs n'ont pas put être défini clairement à l'avance car ils dépendaient de plusieurs paramètres: les difficultés et ralentissements que nous rencontrions, les besoins de Guillaume Tisserant, la disponibilité du serveur. Mais malgré tout nous avions quelques pistes dès le départ: il fallait faire un site pour jouer en ligne avec le Machiabot qui serait hébergé sur un serveur de projet à l'université et si possible intégrer au bot un aspect didactique pour aider les nouveaux joueurs. A la fin du dernier semestre nous pensions coder en C++ pour nous adapter au code du Machiabot mais nous avons changé d'avis car on avait trop peu de temps pour apprendre un nouveau langage et le maitriser. De même nous avons abandonné l'idée des sockets car nous avons trouvé une méthode plus adaptée à nos besoins et à nos connaissance: le pattern MVC en Java JEE, qui utilise le langage JAVA que nous utilisons depuis quelques mois et que nous commençons à maîtriser. Ce pattern MVC correspondait à ce que l'on cherchait car il peut prendre en compte la communication avec un programme (avec une classe Java et des Threads) et la création de pages en HTML qui peuvent servir d'ihm pour envoyer des informations au programme.
4 Partie 1 : Rappels et présentation du projet 1.3 Principaux résultats Voici un aperçu de ce que nous avons obtenu : 4
5 Partie 1 : Rappels et présentation du projet 5 Après 4 mois de travail nous avons: Un site qui permet de jouer contre le Machiabot, cela comprends: de la programmation en Java : générer un goban sous forme de tableau et le mettre à jour avec Java JEE et les servlets lancer le programme et communiquer avec lui à l'aide de Threads vérification chaque coup donné pour éviter qu'un utilisateur malveillant entre un coup impossible directement dans l'url capturer les erreurs pouvant se produire et afficher une page d'erreur propre (on évite les pages automatiques du genre ERREUR ) gérer les cas d'abandon ou de passage de tour visualiser la partie en cours s'il y en a une (sans pouvoir cliquer sur le goban) avec différenciation des utilisateurs grâce aux Sessions affichage de l'état final du goban quand la partie est finie bloquer les liens quand on vient de jouer (pour ne pas renvoyer un deuxième coup au bot quand il réfléchit) gérer la capture des pierres (calcul de libertés) de l'utilisation des technologies du WEB (HTML/CSS et Javascript) : les différentes pages sont en HTML (avec un formulaire de connexion,...) afficher le goban en HTML actualiser le goban en Javascript (pose de la pierre au clic et pas seulement au rechargement de la page) affichage de différent messages pour avertir l'utilisateur des action du Machiabot (initialisation, réflexion,...) retirer les pierres capturées calculer le score (nombre de pierres capturées) et l'afficher et même l'utilisation d'ajax : un chat qui permet le dialogue entre l'utilisateur qui joue et ceux qui regardent la partie (limité à 5 messages affichés)
6 Partie 2 : Le modèle MVC et son implémentation pour notre projet 6 Partie 2 : Le modèle MVC et son implémentation pour notre projet 2.1 Présentation J2EE, TomCat, modèle MVC et le rôle de web.xml Comme expliqué précédemment, nous avons découvert et implémenté un nouveau concept servant à réaliser des applications WEB en Java, l'architecture J2EE. Le J2EE signifie Java 2 Entreprise Edition. Cette architecture est très utilisée dans le milieu professionnel car elle offre des possibilités de développement et une robustesse d'applications incomparables. Le J2EE fonctionne avec ce qu'on pourrait assimiler ou comparer à un serveur WEB qui comprendrait notre code JAVA et nous générerait le code HTML de la page WEB demandée. Cela est le cas en PHP, le client demande une page *.php et le serveur se charge de récupérer par exemple des informations dans une base de données et de générer le code HTML de la page web en réponse. Par analogie au PHP, nous pourrions dire que nous utilisons un serveur qui génère les pages HTML. Cependant, il offre des possibilités bien plus importantes qu'un serveur PHP. Nous y reviendrons. En java, le principe, bien qu'il y ait un serveur qui génère la page de réponse, est totalement différent. Le J2EE est bâti sur le principe du modèle MVC pour Modèle Vue Contrôleur. Le modèle M, peut être une ou plusieurs classes JAVA. Et c'est là toute la puissance du J2EE par rapport à par exemple PHP qui seul peut générer des pages. Là notre modèle peut être un jeu, une application JAVA quelconque qui effectue des traitements, une classe permettant de gérer des bases de données...n'importe quoi...du moment qu'il s'agit de classes JAVA. Nous avons donc un modèle (rappel : des classes JAVA) qui effectue des traitements. Il faut maintenant que notre client (utilisateur) ait une interface lui permettant d'accéder aux informations de notre modèle. C'est le rôle des VUES. Par analogie encore au PHP, elles seraient similaires à des fichiers PHP. Sauf, qu'il s'agit de pages *.jsp pour JAVA SERVER PAGE. Elles permettent de récupérer la réponse du serveur à une requête et d'envoyer une requête au serveur. C'est ici qu'intervient le dernier élément du modèle MVC, les CONTROLEURS. Il s'agit de classes JAVA particulières héritant de la classe HttpServlet des packages javax.servlet.http inclus dans les classes JAVA de base. Ces classes qui héritent de HttpServlet s'appellent des Servlets. Elles implémentent des attributs (qui peuvent être des objets de nos modèles pour récupérer des données), et surtout une méthode principale doget(..) prenant comme paramètres deux objets très importants : HttpServletRequest request (la requête demandée par une page.jsp), HttpServletResponse response (la réponse qui va être générée dans cette méthode).
7 Partie 2 : Le modèle MVC et son implémentation pour notre projet 7 Un point s'avère nécessaire ici afin de bien résumer les nouvelles notions que nous venons d'aborder : J2EE est le diminutif de Java 2 Entreprise Edition. Cela est une architecture qui permet de générer des pages HTML tout en effectuant des traitements dans des classes Java. Pour cela, J2EE implémente le modèle MVC (Modèle Vue Contrôleur). Le modèle emmagasine des classes Java quelconques faisant divers traitements souhaité, comme des accès à des bases de données, le lancement d'un jeu, une application de comptabilité La vue consiste en des pages.jsp (Java Server Pages) qui contiennent du code HTML et du code JAVA qui sera transformé par le serveur en HTML. Au final, après traitement par le serveur, la page ne contiendra que du code HTML (adapté à un simple navigateur WEB). Et finalement, des contrôleurs appelés Servlet qui font le lien entre notre client et ses vues (ce que l'utilisateur voit) et ses demandes (exemple : calculer sa paye de ce mois ci...il envoie sa requête par un fichier paye.jsp, un contrôleur Servlet calcul_paye.java va recevoir sa requête et aller consulter le bon modèle qui serait par exemple une application de gestion des employés dans une entreprise et qui contient l'information. Une fois que la servlet calcul_paye a trouvé l'information, elle redirige la requête vers une réponse qui sera dirigée vers une page (vue) de réponse resultat.jsp). Le schéma ci dessous récapitule ce que nous venons d'aborder :
8 Partie 2 : Le modèle MVC et son implémentation pour notre projet 8 Nous avons introduit le modèle MVC, mais il faut maintenant posséder, comme en PHP, un serveur pouvant implémenter notre modèle MVC. On parle en langage informatique dans le domaine J2EE de «serveur d'applications». Il en existe plusieurs : JBoss ; Apache TomCat WebSphere ; GlassFish ; WebLogic server ;... Tous ces serveurs d'applications possèdent les mêmes spécifications! Ce sont tous des conteneurs de servlets, mais seulement certains d'entre eux peuvent contenir ce qu'on appelle des EJB (Enterprise JavaBeans) cf. ci dessous. Dans notre application Machiaconnect, nous avons utilisé Tomcat. Pour informations, TomCat n'est considéré que comme un simple «conteneur de servlet» car il permet de gérer le modèle MVC mais ne propose pas de fonctionnalités plus poussées telles que la gestion d'ejb (Enterprise JavaBeans) qui permettent de développer certains modèles sur des serveurs distants indépendants... Dans notre cas, notre serveur qui gère notre modèle (le Machiabot ) se trouve sur la même machine que l'application Machiabot, nous ne nécessitions donc pas de gestion d'ejb. C'est pourquoi, nous avons utilisé TomCat comme environnement d'exécution de notre application J2EE. Ces conteneurs de servlet permettent de faire le lien entre nos Modèles Vue Contrôleurs grâce à un petit fichier xml bien pratique : web.xml. Le fichier web.xml contient les informations pour rediriger les requêtes. Par exemple, le joueur clique sur le goban, il sera redirigé vers partie.do ce qui correspond à la servlet Jouer.java. Cela se fait grâce aux balises <servlet> et <servlet mapping>. <servlet> <servlet class>com.servlet.machiaconnect.jouer</servlet class> <servlet name>jouer</servlet name> </servlet> <servlet mapping> <servlet name>jouer</servlet name> <url pattern>/partie.do</url pattern> </servlet mapping>
9 Partie 2 : Le modèle MVC et son implémentation pour notre projet 9 Le nom qui sera affiché à l'utilisateur dans l'url apparaît dans la balise <url pattern>. Ce nom est totalement arbitraire, mais il peut s'avérer utilise de nommer les pages de traitements par un suffixe «.do» pour indiquer que l'on va vers une page de traitement (une servlet qui cherchera une information dans un modèle). 2.2 Notre implémentation : servlet Jouer.java, les modèles (Gestionnaire.java, Machiabot, Pierres) et vue jeu.jsp. Comme nous avons suivi le modèle MVC, notre application possède des vues JSP, des modèles (gestion d'une partie, lancement du Machiabot, communication avec lui) et des contrôleurs objets Servlet. Pour simplifier, nous allons présenter seulement les classes fondamentales à notre application. Le contrôleur principal est la classe Jouer.java héritant de la classe HttpServlet. Le modèle principal est une classe Gestionnaire.java qui permet de gérer la partie (les coups joués, le score, l'envoi à Machiabot du coup...) La vue principale est jeu.jsp qui affiche le goban mis à jour, les coups joués et d'autres informations. Procédons par ordre, l'utilisateur vient de s'identifier au travers d'une page d'authentification, si ses informations de compte sont valides (login, password), il est alors redirigé vers notre contrôleur Jouer.java. Tout se passe ensuite dans la méthode principale (rappel : la méthode doget est la méthode principale d'une servlet) doget(...). public void doget( HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ Dès que nous sommes redirigés par une vue (rappel : un fichier.jsp) vers partie.do, l'ensemble de la méthode doget(...) est exécuté. if(partie==null){ initialisation() ; Si aucune partie n'est en cours, on initialise une partie. L'initialisation consiste en l'instanciation d'un nouveau Gestionnaire dans l'attribut Gestionnaire partie. Le gestionnaire s'occupe de lancer Machiabot, du déroulement de la partie et du calcul des coups. Il fait le lien entre notre servlet Jouer.java et le jeu machiabot en lui même. Nous verrons après comment Machiabot tourne dans un processus et comment un modèle communique avec lui et envoie/reçoit les informations du Gestionnaire.
10 Partie 2 : Le modèle MVC et son implémentation pour notre projet 10 La servlet Jouer effectue diverses vérifications, c'est son rôle de contrôleur. Elle regarde si un coup est demandé, si la partie est finie, etc. Il est facile de passer des paramètres de requêtes par URL à la servlet en indiquant dans l'url par exemple partie.do?param1=xxx¶m2=yyyyy. Par exemple, si un coup a été joué par l'utilisateur, le paramètre coupp est renseigné et dans ce cas, on envoie ce coup au Gestionnaire qui se chargera de communiquer avec l'instance du processus Machiabot. //on récupère le coup joué par le joueur s'il y en a un String coup = request.getparameter("coupp"); //on teste ici si le coup est valide ou non (utilisateur qui rentre dans l'url des coupp) if( partie!=null && partie.coupvalide(coup) &&!partie.getpartiefinie()){ coup=partie.jouer(coup); Rappel : Nous sommes dans Jouer.java et l'attribut partie est un objet de type Gestionnaire. Ensuite le goban mis à jour par le gestionnaire est récupéré. HashMap<String, Boolean> goban = this.partie.getgoban(); HashMap<String, String> played = this.partie.getplayed(); Puis, il est passé en attribut de requête pour qu'il puisse être utilisé par la vue (la.jsp) où sera redirigée la réponse. request.setattribute("goban", goban); request.setattribute("played", played); Ensuite, une fois le goban mis à jour passé en paramètre pour la réponse, nous pouvons rediriger la requête vers la JSP d'affichage principal jeu.jsp. request.getrequestdispatcher("jeu.jsp").forward(request, response); La vue jeu.jsp est capable de récupérer nos attributs goban et played pour afficher le goban mis à jour. Contenu extrait de jeu.jsp : <%HashMap<String, Boolean> goban = (HashMap<String,Boolean>)request.getAttribute("goban"); %> Les balises <% %> permettent d'insérer du code JAVA au sein du code HTML de la page JSP.
11 Partie 2 : Le modèle MVC et son implémentation pour notre projet 11 Le goban est ensuite affiché en fonction des informations contenues dans l'attribut goban. <% if((boolean)goban.get(colonne[j]+ligne[i])==false){ out.print("<a name=\"casevide\" href=\"#\" onclick=\"refresh_div_goban('"+colonne[j]+ligne[i]+"'); clicked('"+colonne[j]+ligne[i]+"', 'numcoup');return false;\" >"); %> On voit bien que la vue (.jsp) possède du HTML et génère aussi du HTML à partir de code JAVA d'où son nom de Java Server Page (JSP). Nous arrivons à l'affichage du résultat suivant : Ce screenshot représente la vue jeu.jsp pendant une partie. Lors du clic sur une intersection du goban, la requête de l'utilisateur sera redirigée vers Jouer.java (servlet) qui la traitera comme nous venons de le voir et renverra de nouveau vers jeu.jsp.
12 Partie 2 : Le modèle MVC et son implémentation pour notre projet 12 Le principe reste identique pour chaque fonctionnalité! Nous implémentons bel et bien le modèle MVC. Cependant, nous venons de voir le contrôleur (servlet) Jouer.java et la vue jeu.jsp mais, même si nous en avons parlé, il nous reste à voir un peu plus en détail un des modèles principaux : le modèle Gestionnaire. Ce modèle permet comme dit précédemment de gérer l'ensemble d'une partie, l'envoi des coups au bot, la récupération de la réponse du bot mais surtout il permet à notre Servlet Jouer.java de récupérer ses informations pour mettre la vue jeu.jsp à jour au fur et à mesure. Cette classe Gestionnaire possède un attribut de type Machiabot qui permet de lancer le Thread du jeu Machiabot. private Machiabot machiabot; private Thread m; Et donc, dans la méthode initialisation() de la classe contrôleur (servlet) Jouer.java instancie un nouveau Gestionnaire() qui lui lance le Thread de Machiabot (l'instance du programme Machiabot). Voici le constructeur de Gestionnaire() : machiabot = new Machiabot(); m = new Thread(machiabot); m.setpriority(thread.max_priority); m.start(); Une explication plus détaillée du fonctionnement des Threads sera faite à la partie suivante. Le schéma suivant résume le fonctionnement (très simplifié) de notre application. Un dernier modèle est présent dans notre application. Il s'agit de Pierre.java qui permet de calculer les pierres à enlever quand elles n'ont plus de libertés. Nous ne détaillons pas ici cette classe car elle fera l'objet d'une partie dans ce rapport par la suite.
13 Partie 3 : Le modèle fondamental : la classe Machiabot.java 13 Partie 3 : Le modèle fondamental : la classe Machiabot.java 3.1 Les Threads et le lancement du process de communication avec Machiabot. Afin d'exécuter des tâches en parallèle, JAVA nous donne la possibilité d'exécuter des Processus (Threads) grâce à des objets de la classe Thread. La classe Thread se compose comme une classe classique. Elle peut posséder des attributs, des méthodes private ou public mais l'essentiel réside dans sa méthode run(). C'est dans cette méthode que se font les traitements souhaités dans un processus séparé du Thread principal. Le Thread principal est par exemple pour une application classique la classe contenant la méthode main(). Pour créer un Thread, il faut créer un type d'objet héritant de la classe Thread. Exemple : public class Maclasse extends Thread{ private Type1 attribut1 ; private Type2 attribut2; private Type3 attribut3 ; public void methode1() {.. private void methode2(){.. public void run(){ /* Ici les actions qui seront traitées dans un processus différent */ Dans la classe appelant le thread (le démarrant), il faut instancier notre objet et démarrer le thread. Dans notre application il s'agit du Gestionnaire qui instancie un Thread de Machiabot. Cela se fait de la manière suivante : Dans la classe Appelante : Thread monthread = new Machiabot() ; monthread.start() ;
14 Partie 3 : Le modèle fondamental : la classe Machiabot.java 14 A l'appel de la méthode start(), le contenu de la méthode run() est exécuté dans un processus séparé. Le processus est tué une fois la méthode run() dépilée. Voici les explications importantes : Avant tout, il faut savoir que l'ordre d'exécution d'un Thread, si on en a plusieurs de lancés par leur méthode run(), est totalement aléatoire! Ceci car Java utilise un ordonnanceur. Il faut savoir également que si plusieurs threads sont lancés dans une application, ils ne s'exécuteront pas en même temps. Java utilise un ordonnanceur qui va gérer de façon aléatoire l'accès aux méthodes run() des différents Threads. Admettons, nous avons trois threads appelés t1, t2 et t3. Dans la classe appelante nous lançons les trois threads en même temps : t1.start() ; t2.start() ; t3.start() ; Là, trois processus sont créés et chacun va réaliser les instructions de leur méthode run(). Admettons que notre méthode run() de t1 possède 10 lignes, celle de t2, 15 lignes, et celle de t3, 20 lignes. Alors l'ordonnanceur va utiliser un des Threads, pendant un certain laps de temps, puis va passer à un autre, puis revenir à t1 et cela jusqu'à ce que toutes les instructions des méthodes run() de chaque thread soit terminée! Par exemple, t1 va voir 5 lignes exécutées, ensuite l'ordonnanceur passe à t2 et lance 8 lignes, revient à t1 et execute 2 lignes, ensuite passe à t3 et exécute 4 lignes...tout cela de façons aléatoires tant que chaque méthode run() n'est pas dépilée. Quand l'ordonnanceur passe d'un Thread à l'autre, le thread interrompu est mis en sommeil durant tout le temps où l'autre est en éveil. Voici les différents états que peut prendre un thread : NEW : quand il est instanciée Thread t1 = new Thread() ; RUNNABLE : quand la méthode start() est invoquée, il commence à s'exécuter méthode run(). TERMINATED : une fois que les tâches (toutes les lignes) de la méthode run() sont totalement exécutées, le Thread est mort. Subtilité, un thread mort ne peut pas être relancé par sa méthode start(). TIMED_WAITING : lorsque il est en en pause méthode sleep(). WAITING : il est en attente indéfinie... BLOCKED : c'est l'état qu'utilise l'ordonnanceur pour le mettre en sommeil le temps d' en utiliser un autre.
15 Partie 3 : Le modèle fondamental : la classe Machiabot.java 15 Comme dit précédemment : un thread est considéré comme terminé (MORT), seulement lorsque sa méthode run() est dépilée de la pile d exécutions! Le schéma précédent explique bien le rôle que jouent les Threads et comment ceux ci sont exécutés par l'ordonnanceur. Java nous propose également une interface pour rendre plus robuste l'utilisation de Threads. Il s'agit de l'interface Runnable. Cette classe se trouve également dans le package java.lang. L'interface Runnable permet d'éviter l'héritage systématique à la classe Thread dans le cas d'un Thread classique. Cela permet d'utiliser des objets qui héritent de n'importe quelle classe et il suffit d'implémenter l'interface Runnable. Surtout que le langage Java ne gère pas l'héritage multiple donc il est très facile de se retrouver coincé si nous voulons créer un Thread qui hérite d'une classe quelconque. Runnable règle le problème. Exemple : public Maclasse extends Maclasse2 implements Runnable{ /* Mes attributs et méthodes de classe */ public void run(){...
16 Partie 3 : Le modèle fondamental : la classe Machiabot.java 16 Le fait d'implémenter l'interface Runnable permet d'utiliser notre objet comme un objet quelconque tout en pouvant l'utiliser comme un Thread de la manière suivante : Thread t1 = new Thread(new Maclasse()) ; Notre application peut donc utiliser un ou plusieurs objets de type Thread. Nous avons vu que nos Thread sont exécutés de manière aléatoire. Il existe cependant une façon de synchroniser nos Threads. La solution consiste en prévenir l'ordonnanceur qu'un thread a besoin ou doit utiliser des données qu'un autre thread utilise ou a utilisé ou est en train d'utiliser. Lorque l'ordonnanceur mettra en sommeil un Thread t1 qui utilisait par exemple un objet o1, si pendant ce temps le Thread t2 veut accéder à ce même objet, il ne pourra pas si on synchronise les méthodes d'accès à notre objet o1. Tant que l'ordonnanceur ne reviendra pas sur le Thread t1 pour finir les traitements qu'il effectuait dessus, les autres Threads, ici t2, ne pourront pas y accéder. Cette technique s'appelle la synchronisation de Threads. Pour synchroniser des Threads il suffit de rajouter le mot clé synchronized devant les méthodes que l'on veut synchroniser. Cela se fait lors de la déclaration de la méthode, de la manière suivante : public synchronized void setobjet1(object po1){ o1 = po1 ;
17 Partie 3 : Le modèle fondamental : la classe Machiabot.java La classe Machiabot.java Maintenant que nous avons vu comment fonctionnent les Threads et surtout à quoi servent ils, nous pouvons maintenant voir en détails le modèle Machiabot.java qui implémente l'interface runnable. Nous savons (vu précédemment) que le modèle Gestionnaire.java possède un attribut de type Thread prenant comme objet un Machiabot. Cet objet Machiabot implémente l'interface Runnable pour lancer le programme Machiabot dans un Thread à partir de la classe Gestionnaire durant la durée de la partie. Nous allons voir en détails maintenant comment ce Thread est lancé et comment la communication se fait avec lui. Tout le voyage commence au niveau du constructeur de Gestionnaire qui lance le Thread Machiabot et effectue Machiabot.start() ; Si vous avez bien suivi notre explication sur les Threads citée précédemment, l'exécution de Machiabot.start() lance donc la méthode run() de la classe Machiabot.java dans un processus séparé. Cette méthode run() contient une boucle infinie. Le thread Machiabot se terminera une fois la fin de partie décelée par le gestionnaire. while(!gestionnaire.getfinpartie()){ PrintStream monfichier = new PrintStream(os); System.setOut(monfichier); this.process = new ProcessLauncher(os, os, this.fis); this.process.exec("../../../machiabot/trunk/expertbot/expertbot"); Le programme physique (exécutable) du jeu Machiabot est lancé par l'instruction this.process.exec(«chemin absolu ou relatif de l'exécutable» ). La partie est ainsi lancée, et nous utilisons des PrintStream (flux) pour communiquer avec le Machiabot (cette instance de process). Il faut noter que la méthode ne s'arrête jamais sauf si finpartie devient vrai ou que le process s'arrête (Machiabot plante, ou autre arrêt forcé de Machiabot...). Une méthode permet de passer finpartie à true pour arrêter le process, il s'agit de la méthode killmachiabot() de la classe Gestionnaire.
18 Partie 3 : Le modèle fondamental : la classe Machiabot.java 18 Nous allons voir maintenant dans le détail l'envoi et la réception des coups par Machiabot au travers des PrintStreams. Cela se déroule dans la méthode jouer() de la classe Gestionnaire qui est surchargée dans la classe Machiabot. 3.3 La méthode jouer(string coup) Elle est définie dans Gestionnaire puis dans Machiabot. Elle permet d'envoyer et de récupérer les coups de Machiabot. Voici le détail de la méthode setenvoi(coup) : public void setenvoi(string penvoi){ FileInputStream fis; try { fis = new FileInputStream(new File(pEnvoi)); this.process.setinputstream(fis); process.createstreamthread(fis, process.getprocess().getoutputstream()); catch (FileNotFoundException e) { e.printstacktrace(); fis = null; int nbreponses = this.reponses.size();
19 Partie 3 : Le modèle fondamental : la classe Machiabot.java 19 while(this.reponses.size()<(nbreponses+4)){ updatereponse(); System.out.println("nbRep"+nbReponses+"vector"+this.reponses.size() +this.reponses); updatereponse(); La méthode setenvoi(coup) utilise un FileInputStream pour communiquer avec le process physique Machiabot en définissant cet InputStream comme Entrée Standard du process Machiabot. process.createstreamthread(fis, process.getprocess().getoutputstream()); Un Thread est ainsi créé et enverra à Machiabot le coup. Ensuite on effectue des updatereponse() tant que le jeu Machiabot n'a pas répondu. while(this.reponses.size()<(nbreponses+4)){ updatereponse(); Une fois la réponse obtenu, le Gestionnaire l'aura automatiquement car sa méthode jouer(coup) fonctionne ainsi : Elle exécute setenvoi(coup) ; dernierereponse = machiabot.getreponse() ; Puis, elle attend la réponse while(!machiabot.getreponse()!=dernierereponse){ dernierereponse = machiabot.getreponse() ; Une fois que le Gestionnaire a récupéré la réponse, vous connaissez la suite. La méthode doget(..) de la servlet Jouer passe en attribut de requête la réponse et ensuite redirige vers la vue jeu.jsp.
20 Partie 4 : Les sessions 20 Partie 4 : Les sessions 4.1 Rôle des SESSIONS: Une des problématiques du projet était de pouvoir observer une partie quand quelqu'un joue, mais sans que l'on puisse jouer sur le même goban; il fallait donc pouvoir identifier les utilisateurs, et nous avons décidé d'utiliser les sessions. Une session est un objet Java HttpSession qui est valable tant que l'on ne ferme pas le navigateur ou que l'on ne l'invalide pas. Dès que l'on utilise une application Java, une session est créée automatiquement. La session créée possède un identifiant du type: "D3F760B4E2CD223C681B0CE17FFAA7C3" qui est unique mais dans une servlet, on peut récupérer cet objet HttpSession : HttpSession session=request.getsession(); On peut ensuite créer des attributs dans cette session qui seront donc transmis avec la session dans les autres servlets et valables durant toute la durée de la visite de l'utilisateur. Cela permet de retrouver, par exemple, le login que l'utilisateur a rentré pour se connecter. Comme tout objet Java, les Sessions ont un grand nombre de méthodes prédéfinies qui permettent de faire toutes sortes de traitements, mais pour notre projet nous n'en avons utilisé que 4 : getid(): pour récupérer l'identifiant; getattribute('nomattribut'): pour récupérer la valeur d'un attribut; setattribute('nomattribut', 'valeur'): pour créer ou modifier un attribut existant en lui attribuant une valeur ou un objet Java; invalidate(): pour clore la session (quand l'utilisateur se déconnecte "manuellement"). Il existe aussi une méthode setmaxinactiveinterval(int temps) qui permet de définir le temps d'inactivité avant que la session ne soit invalidée par le conteneur de servlet mais il existe d'autres moyens de paramétrer cela.
21 Partie 4 : Les sessions 21 Avec Tomcat, une session est invalidée automatiquement après 30 minutes d'inactivité mais nous avons réduit ce temps à 10 minutes en modifiant le fichier web.xml, qui vous a déjà été présenté, en ajoutant : <session config> <session timeout>10</session timeout> </session config> Comme une session doit pouvoir être invalidée à la demande de l'utilisateur sans que celui ci ne soit obligé de fermer son navigateur, nous avons créé une servlet FinSession.java contenant dans la méthode doget() : HttpSession session=request.getsession(); session.invalidate(); Suivi d'une redirection vers une jsp indiquant que le session a été fermée. Une nouvelle session est automatiquement créée pour succéder à la première mais elle ne contient aucun attribut concernant l'utilisateur. La principale utilité est pour reconnaître un utilisateur et savoir s'il est celui qui joue ou s'il regarde la partie. Dans la classe Jouer.java (servlet qui nous permet de jouer), quand on lance une partie on met la session en attribut : HttpSession sessionpartie = request.getsession(); On y met l'objet HttpSession, cela nous permet d'avoir l'identifiant et les attribut avec les différentes méthodes get(). Quand un joueur se connecte, on teste alors sa session pour savoir si la session sur laquelle il est connectée est celle qui a commencé la partie; si c'est le joueur on le redirige vers jeu.jsp, sinon on le redirige vers la page de visualisation de partie partieencours.jsp. Mais si la session qui a commencé la partie est invalidée, on ne pourra plus commencer de partie (car quand une session est close, la classe Jouer.java ne remet pas la session en attribut à NULL). La solution trouvée a été de créer une classe sessioncounter qui est un Listener qui peut réaliser une action à chaque ouverture et/ou fermeture de session.
22 Partie 4 : Les sessions 22 Nous l'avons codé de façon à ce que quand une session s'ouvre, on la récupère et on la met dans un tableau; et quand une session se ferme (manuellement ou par timeout), on la supprime du tableau. Ce tableau représente donc les sessions actives et on peut le récupérer dans la classe Jouer.java. //On récupère la liste des sessions actives ArrayList<HttpSession> listesessions = SessionCounter.getList(); //On teste si la session est nulle ou si elle a expiré if(this.sessionpartie == null!listesessions.contains(this.sessionpartie)){ A chaque fois que quelqu'un se connecte, on regarde si la session de la personne qui joue est encore active ou s'il est déconnecté. Dans ce dernier cas, on redémarre une partie (nouvelle instanciation de Gestionnaire, remise à zéro des variables score, goban,...) en mettant la session de celui qui vient de se connecter en attribut dans sessionpartie de Jouer.java. 4.2 Les attributs de session Comme nous l'avons vu, nous pouvons aussi mettre des attributs dans une session : Le fait de mettre un attribut de session "login" a plusieurs utilités: cela permet de vérifier que la session a été initialisée par un utilisateur qui s'est connecté. Car dès que l'on arrive sur la page d'accueil du site on a une session qui n'a qu'un identifiant tant qu'on ne se connecte pas, et tant qu'on ne se connecte pas on ne devrait pas avoir accès au site. Mais si on entre l'adresse d'une page telle que jeu.jsp dans l'url on pourrait y accéder si il n'y avait pas de vérification de la présence de l'attribut "login". cet attribut sert aussi à afficher le nom du joueur dans l'affichage du score de la partie et dans le chat, il est donc nécessaire que tous ceux qui observent la partie soient enregistrés pour être identifiable quand ils discutent. Sur le même principe, nous avons passé en attribut de session les gobans (donnés sous forme de tableau par Jouer.java) pour pouvoir les retrouver dans les JSP. // dans Jouer.java on met les attributs HashMap<String, Boolean> goban = this.partie.getgoban(); HashMap<String, String> played = this.partie.getplayed();
23 Partie 4 : Les sessions 23 request.getsession().setattribute("goban", goban); request.getsession().setattribute("played", played); // dans jeu.jsp on les récupère <%HashMap<String, Boolean> goban = (HashMap<String, Boolean>)request.getSession().getAttribute("goban"); %> <%HashMap<String, String> played = (HashMap<String, String>)request.getSession().getAttribute("played"); %> Une fois que l'on a les gobans sous forme de tableau dans les jsp, il est facile de les générer sous une forme plus explicite avec des images comme nous le verrons plus tard. Les dernières améliorations de notre application nous ont permis de rajouter quelques attributs pour les sessions qui seront abordés dans la partie sur l'interface WEB : Le dernier coup envoyé par le joueur, Le score (les pierres capturées) qui est calculé par la classe Pierre.java, Le tableau qui contient les messages du «chat».
24 Partie 5 : L'interface WEB 24 Partie 5 : L'interface WEB 5.1 La base en HTML/CSS Pour la partie WEB, nous avons donc utilisé le langage HTML avec un fichier CSS pour la présentation. La principale fonction de l'interface a été la génération d'un goban avec des images : <%String[] ligne = {"9", "8", "7", "6", "5", "4", "3", "2", "1"; String[] colonne = {"A", "B", "C", "D", "E", "F", "G", "H", "J"; %> <table cellspacing="0" cellpadding="0" > <tr> <td></td> // Première ligne on met les lettres <%for(int i=0; i<colonne.length; i++){ out.println("<td><div align=\"center\">"); out.print(colonne[i]+"</div></td>"); %> </tr> // puis pour chaque ligne suivante <%for(int i=0; i<ligne.length; i++){ out.println("<tr>"); // première colonne on met le chiffre correspondant à la ligne out.print("<td>"+ligne[i]+"</td>"); for(int j=0; j<colonne.length; j++){ out.print("<td>"); // si la case est libre (d'après le tableau goban) if((boolean)goban.get(colonne[j]+ligne[i])==false){ // on met le lien qui permettra de jouer sur cette case (représentant une intersection) out.print("<a name=\"casevide\" href=\"#\" onclick=\"fonctionsjavascript\" >"); // et on met l'image d'un intersection libre out.print("<img id=\""+colonne[j]+ligne[i]+"\" src=\"intersection.png\" />"); out.print("</a>"); else{ // sinon on regarde la couleur de la pierre (tableau played) et on met l'image //correspondante if((played.get(colonne[j]+ligne[i])).equals("black")){ out.print("<img src=\"intersection_b.png\" />"); else{
25 Partie 5 : L'interface WEB 25 out.print("<img src=\"intersection_w.png\" />"); out.print("</td>"); out.println("</tr>"); out.print("<br />"); %> </table> Cela nous génère donc un tableau d'images dont certaines ont des liens, et qui est mis en page avec quelques lignes de CSS (pour supprimer les marges et avoir un goban qui semble être en une pièce). Nous ne présenterons pas ici le reste du code HTML qui n'a que peu d'intérêt. 5.2 L'amélioration avec Javascript page. Le langage javascript nous a été utile pour améliorer l'affichage sans recharger une La première fonction que l'on a mise est celle qui affiche un message quand un utilisateur se connecte et que le Machiabot s'initialise (car cela prends plus de 10 secondes et l'utilisateur peut cliquer plusieurs fois si rien ne l'averti que le programme a bien reçu la demande de connexion). Il était inutile de rediriger l'utilisateur vers une page d'attente qui n'aurait rien apporté de plus. Là où le javascript est essentiel, c'est dans la fonction suivante: <script language=javascript> var click = new Boolean(); click=false; function clicked(coord, numcoup){
26 Partie 5 : L'interface WEB 26 document.getelementbyid('message').innerhtml="<h3> Machiabot réfléchit, merci de ne pas rafraichir la page</h3>"; // si premier clic if (click==false){ click=true; //actualisation au clic du coup joué et de l'image du goban //(sans attendre le rechargement de la page) document.getelementbyid(numcoup).innerhtml=" played "+coord; if(coord!="pass"){ document.getelementbyid(coord).setattribute("src", "intersection_w.png"); // désactivation de tous les liens de goban document.getelementsbyname("casevide").removeattribute("href"); </script> Cette fonction est appelée à chaque clic sur une position possible du goban ou sur le bouton "passer son tour". Dès que l'on a cliqué un message s'affiche pour prévenir le joueur, avec la fonction innerhtml; on met à jour les coordonnées du coup joué (affiché au dessus du score) et si le coup n'est pas "passer" on place la pierre sur le goban (en fait on change l'attribut "src" qui correspondait à une image d'intersection vide pour mettre une image d'intersection avec une pierre blanche). Nous ne le faisons pas pour les pierres noires car quand Machiabot envoie sa réponse on actualise le goban (et donc remise à "" du message et à false de la variable click). La dernière partie de la fonction sert à "désactiver" les liens: on retire les attributs "href" et donc si l'utilisateur clique dessus il ne se passe plus rien.
27 Partie 5 : L'interface WEB 27 Et si l'utilisateur est malveillant et entre un coup dans l'url quand Machiabot cherche un coup, c'est la servlet Jouer.java que le redirigera vers une page d'erreur qui réaffichera le goban quand Machiabot aura répondu. 5.3 Un nouveau modèle : algorithmes de retrait de Pierres. Nous avions terminé l'application mais cette dernière ne retirait pas les pierres et ne comptait pas le score. Si vous avez bien suivi et compris notre partie sur J2EE, vous devez deviner de quel type une classe retirant les pierres (Pierre.java) est? (Modèle, Vue ou Contrôleur)... Bien sur, il s'agit d'un modèle. Ce modèle s'appelle Pierre.java. Il est appelé et instancié par la méthode jouer(coup) du contrôleur (servlet) Jouer.java. la pierre noire est retirée quand 4 pierres blanches l'entourent totalement: elle n'a plus de liberté. Et cela se fait de manière récursive. Si une pierre est entourée, nous regardons d'abord si cette pierre possède des libertés (aucune pierre sur une intersection), sinon si elle possède une pierre de même couleur, et si c'est le cas nous relançons l'algorithme sur la pierre voisine jusqu'à ce qu'une liberté soit trouvée.
28 Partie 5 : L'interface WEB 28 Quand une pierre blanche sera posée sur l'intersection distinguée par la flèche rouge, toutes les pierres noires présentes sur l'image ci dessus seront retirées. Si une liberté est trouvée, la pierre (ou l'ensemble de pierres) n'est pas retirée ; sinon la pierre (ou l'ensemble de pierres) est retirée du Goban et le score mis à jour du nombre de Pierres retirées. Notre objet instancié du modèle Pierre.java met à jour le score automatiquement. Il remet à jour l'état du goban aussi dans le Gestionnaire de la partie avant que le contrôleur Jouer.java ne le transmette à la vue jeu.jsp. Le détail de notre algorithme et son implémentation est disponible en annexes dans le code de la classe Pierre.java. 5.4 Les dernières touches avec Ajax Une fois notre application fonctionnelle, nous avons voulu ajouter un module de Chat permettant aux utilisateurs (le joueur et les éventuels observateurs) de dialoguer entre eux. Le chat a été créé de la manière suivante : Un joueur saisit un message dans la zone input texte du formulaire. Il appuie sur entrée ou clique sur valider pour envoyer son message. La validation de ce formulaire ne redirige pas vers une page de traitement. La validation déclenche une fonction JavaScript AJAX qui va envoyer au serveur le message saisi et mettre à jour seulement le contenu de la balise <div id='message'></div>. Tout cela paraît simple dans le principe, mais voyons comment fonctionne l'ajax. Le principe de l'ajax est simple. Ajax est l'acronyme de ASYNCHRONOUS JavaScript And XML. Pour simplifier, il s'agit d'utiliser du XML de manière asynchrone pour communiquer avec le serveur sans avoir à recharger une page. Il faut savoir que l'ajax n'est pas un langage de programmation ni une technologie. Il s'agit d'un concept de programmation pour le Web qui évite le rechargement d'une page. L'information est mise à jour en temps réel et cette mise à jour est totalement transparente pour l'utilisateur. Ce dernier voit l'information apparaître sans qu'il n'ait à intervenir.
29 Partie 5 : L'interface WEB 29 Cela explique pourquoi JavaScript est utilisé dans l'ajax, car il permet de mettre à jour le contenu d'une division, d'un formulaire...grâce à l'arbre DOM. La méthode AJAX est simple, il suffit de déclarer une méthode JavaScript qui instancie un objet XMLHttpRequest. C'est cet objet qui transmettra au serveur sous forme de flux XML nos données et récupérera l'information de ce dernier. (En fait, comme si nous avions rechargé la page). L'objet XMLHttpRequest s'instancie de la manière suivante : var xhr = new XMLHttpRequest(); Pour rappel : le JavaScript possède des variables transtypés. C'est à dire, il n'y a pas de type associé aux variables JavaScript. Il y a une variante à l'objet XMLHttpRequest à ne pas négliger, car elle est indispensable sous Internet Explorer. Merci encore à Microsoft de compliquer les tâches! Tous les navigateurs utilisent XMLHttpRequest alors que sous Internet Explorer il faut utiliser un objet ActiveXObject.
30 Partie 5 : L'interface WEB 30 Il est donc nécessaire avant toute action, de détecter le navigateur de l'utilisateur. if (window.xmlhttprequest window.activexobject) { if (window.activexobject) { try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); catch(e) { xhr = new ActiveXObject("Microsoft.XMLHTTP"); else { xhr = new XMLHttpRequest(); On rafraichit la page en AJAX en récupérant les informations de XMLHttpRequest par une Java Server Page (JSP) chat.jsp qui elle récupère dans le contrôleur (servlet) adéquat le contenu des messages de chat. Voici la fonction JavaScript AJAX s'occupant de mettre à jour nos informations de chat : function refresh_div(message) { var xhr_object = null; if(window.xmlhttprequest) { // Firefox xhr_object = new XMLHttpRequest(); else if(window.activexobject) { // Internet Explorer xhr_object = new ActiveXObject('Microsoft.XMLHTTP'); var method = 'GET'; var filename = 'display.do?'; filename+="chat=ok"; if(message!=null)filename+="&chat_message="+message; if(navigator.appname=='microsoft Internet Explorer'){
31 Partie 5 : L'interface WEB 31 var dattmp = new Date(); filename+="&dattmp="+dattmp; xhr_object.open("get", filename, false); else{ xhr_object.open(method, filename, true); xhr_object.onreadystatechange = function() { if(xhr_object.readystate == 4) { var tmp = xhr_object.responsetext; document.getelementbyid('tchat middle').innerhtml = tmp; xhr_object.send(null); settimeout('refresh_div()', 2000); Pour finir, on demande au navigateur de relancer cette méthode JavaScript AJAX toutes les 2 secondes pour actualiser le chat. settimeout('refresh_div()', 2000); Nous utilisons également l'ajax pour mettre à jour le score de la même manière.
32 Partie 6 : Principaux problèmes rencontrés 32 Partie 6 : Principaux problèmes rencontrés 6.1 Les erreurs Java En programmant notre application, nous avons eu un certain nombre d'erreurs Java qui redirigeaient vers une page du type : Ce type de message d'erreur n'est pas pratique pour un utilisateur car il n'a pas d'autres choix que de cliquer sur la touche retour du navigateur ou d'entrer une autre adresse dans l'url. Notre application est maintenant fonctionnelle et ne devrait plus renvoyer d'erreurs, cependant nous ne sommes pas à l'abri d'un dysfonctionnement du serveur (empêchant de lancer le programme) ou d'un plantage de Machiabot en cours de partie. Nous avons donc mis en place des structures try/catch à toutes les étapes susceptibles de renvoyer une erreur dans Jouer.java : try { initialisation(); request.getrequestdispatcher("jeu.jsp").forward(request, response); catch (InitException e) { e.printstacktrace(); detruire(); request.setattribute("exception", e); request.getrequestdispatcher("exception.jsp").forward(request, response);
33 Partie 6 : Principaux problèmes rencontrés 33 Dans cet exemples, le programme va essayer de lancer la méthode initialisation(), si ça marche, il redirige vers la page jeu.jsp ; sinon, il «catch» l'erreur, l'imprime dans un journal d'erreur de Tomcat (avec e.printstacktrace()) puis détruit la partie en cours (qui est pour le moment irrécupérable en cas de bug) et envoie l'erreur vers une page exception.jsp qui l'affichera comme cela : L'utilisateur est toujours ennuyé mais il a la possibilité de recommencer une partie (sans avoir à se reconnecter) ou de se déconnecter pour quitter l'application. 6.2 Le cas du serveur Nous avons aussi eu de nombreux problèmes avec la mise en place du serveur de projets. C'est un serveur destiné au étudiants du Master IC que devait mettre en place l'administrateur réseau de l'université. Ce dernier étant très pris par la gérance du réseau UFR, il était peu disponible pour nous recevoir et pour nous renseigner sur les conditions nécessaires au déploiement de notre application. Nous avons donc installé notre application mi avril et découvert de nombreux dysfonctionnements que nous n'avions pas en faisant tourner l'application sur nos machines. Après avoir corrigé la quasi totalité des bugs apparus, nous avons remarqué que le serveur rebootait quand nous lancions le Machiabot (trop gourmand en mémoire semble t il). Il a donc fallu que Guillaume Tisserant modifie son programme pour pouvoir paramétrer la mémoire nécessaire au fonctionnement du jeu.
34 Partie 6 : Principaux problèmes rencontrés 34 Et une fois que nous avons eu ce programme «allégé» et les clés pour accéder au serveur, il semblerai que nous n'ayons plus les droit pour mettre le nouveau programme sur le serveur ; et donc à l'heure qu'il est notre application qui fonctionne sans problème en réseau local sur nos machines personnelles, tourne avec un générateur de coups aléatoires sur le serveur de projets, ce qui permet de tester toutes les fonctionnalités présentées dans ce rapport. 6.3 Les améliorations à apporter Malgré le temps passé sur le projet, nous nous sommes rendu compte qu'il y aurait encore beaucoup d'améliorations à faire et cela pourrait même être l'objet de prochains TER : lier l'application avec une base de données (pour l'instant seuls 3 utilisateurs sont enregistrés : Gael, Yvan et invite), garder un historique des messages du chat, sauvegarder les parties terminées(au format SGF), ajouter un forum pour pouvoir discuter des parties jouées, ajout d un module servant de Modèle d analyse des coups (pour intégrer un aspect didactique et aider les joueurs débutants), sauvegarder une partie en cours pour la reprendre plus tard (ou sauver la partie en cas de plantage de Machiabot), afficher plusieurs gobans, dont celui généré par le Machiabot qui affiche les pondérations de chaque intersection en fonction des probabilités de victoire, créer un fichier de configuration pour pouvoir changer la configuration du goban (9*9, 13*13 ou 19*19) sans avoir à chaque fois à chercher dans tous le code là ou il faut modifier des valeurs, ou encore améliorer l'affichage des bords du goban... Ce sont des pistes auxquelles nous avons pensé mais que nous n'avons pas eu le temps de mettre en place.
35 Conclusion 35 Conclusion Malgré la difficulté du sujet et les problèmes rencontrés, notre motivation a été récompensée. Ce projet nous a appris de nombreuses choses que nous ne verrons peut être pas en cours et qui pourrons nous être très utiles, comme la programmation d'application WEB en Java JEE, la communication avec un programme lancé par un Thread, les bases de l'ajax ainsi que l'utilisation d'un conteneur de servlet. Nous avons également eu un aperçu d'un congrès scientifique sur l'intelligence informatique en allant à Paris pour l'ieee SSCI (détails en annexe), ce qui nous a introduit aux méthodes de calculs de l'intelligence Artificielle (principalement pour le jeu de GO mais aussi pour d'autres applications).
36 Annexes 36 Annexes Annexe 1 : la conférence à Paris Les 13 et 14 avril dernier, nous sommes allés à Paris pour la conférence SSCI (Symposium Series on Computational Intelligence), dont une partie était dédiée à l'homme contre l'intelligence artificielle dans le jeu de GO. Cela ne nous a pas aidé dans notre projet mais nous avons assisté à un tutoriel, présenté par Chang Shing Lee et Olivier Teytaud, qui nous a permis de comprendre un peu mieux quelles sont les différentes méthodes de calculs des coups et surtout, cela nous a permis de voir plus en détails comment fonctionne le Machiabot en combinant plusieurs techniques : UCT et le système expert.
1. Introduction... 2. 2. Création d'une macro autonome... 2. 3. Exécuter la macro pas à pas... 5. 4. Modifier une macro... 5
1. Introduction... 2 2. Création d'une macro autonome... 2 3. Exécuter la macro pas à pas... 5 4. Modifier une macro... 5 5. Création d'une macro associée à un formulaire... 6 6. Exécuter des actions en
Plus en détailServeur d'application Client HTML/JS. Apache Thrift Bootcamp
Serveur d'application Client HTML/JS Apache Thrift Bootcamp Pré-requis La liste ci-dessous de logiciels doit être installée et opérationnelle sur la machine des participants : Compilateur thrift http://thrift.apache.org/
Plus en détailTP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet
TP Composants Java ME - Java EE Vous allez, dans ce TP, construire une architecture client serveur, plus précisément MIDlet cliente, servlet serveur. Pour cela, on va d'abord installer la partie serveur
Plus en détailDOM - Document Object Model
DOM - Document Object Model 1 But de DOM Interfacer les langages de programmation avec les documents XML en les associant avec un modèle orienté objet DOM permet aux programmes et scripts : d'accéder et
Plus en détailUn ordonnanceur stupide
Un ordonnanceur simple Université Paris Sud L objet des exercices qui suivent est de créer un ordonanceur implantant l algorithme du tourniquet ( round-robin scheduler ). La technique utilisée pour élire
Plus en détailChapitre 2. Classes et objets
Chapitre 2: Classes et Objets 1/10 Chapitre 2 Classes et objets Chapitre 2: Classes et Objets 2/10 Approche Orientée Objet Idée de base de A.O.O. repose sur l'observation de la façon dont nous procédons
Plus en détailTP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.
ASTRIUM - Toulouse JEE Formation 2013 TP JEE Développement Web en Java Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web. Figure 1 Architecture
Plus en détailRafraichissement conditionné d'une page en.net
Rafraichissement conditionné d'une page en.net Test avec AJAX pour rafraichissement En utilisant AJAX, voici une possibilité de faire un rafraichissement conditionné. Nous verrons dans cet article une
Plus en détailLe meilleur de l'open source dans votre cyber cafe
Le meilleur de l'open source dans votre cyber cafe Sommaire PRESENTATION...1 Fonctionnalités...2 Les comptes...3 Le système d'extensions...4 Les apparences...5 UTILISATION...6 Maelys Admin...6 Le panneau
Plus en détail1. Installation d'un serveur d'application JBoss:
EPITA Ala Eddine BEN SALEM App-Ing2 J2EE T.P. 4 EJB3, Serveur d'application JBoss 1. Installation d'un serveur d'application JBoss: télécharger l'archive du serveur JBoss à l'adresse: http://sourceforge.net/projects/jboss/files/jboss/jboss-5.0.0.ga/jboss-5.0.0.ga.zip/download
Plus en détailAssistance à distance sous Windows
Bureau à distance Assistance à distance sous Windows Le bureau à distance est la meilleure solution pour prendre le contrôle à distance de son PC à la maison depuis son PC au bureau, ou inversement. Mais
Plus en détailWeb Tier : déploiement de servlets
Web Tier : déploiement de servlets 1 / 35 Plan 1 Introduction 2 Servlet : Principe de fonctionnement 3 Création et développement sur un serveur JEE 4 Quelques méthodes de l API des servlets 5 Utilisation
Plus en détailSommaire Introduction... 3 Le but du projet... 3 Les moyens utilisés... 3 Informations sur le client FTP... 4 Pourquoi une version Linux et
Licence 3 CDA 2010/2011 Client FTP Java Maxence Jaouan Sommaire Introduction... 3 Le but du projet... 3 Les moyens utilisés... 3 Informations sur le client FTP... 4 Pourquoi une version Linux et Windows?...
Plus en détailSHERLOCK 7. Version 1.2.0 du 01/09/09 JAVASCRIPT 1.5
SHERLOCK 7 Version 1.2.0 du 01/09/09 JAVASCRIPT 1.5 Cette note montre comment intégrer un script Java dans une investigation Sherlock et les différents aspects de Java script. S T E M M E R I M A G I N
Plus en détailPour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère
L'héritage et le polymorphisme en Java Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère En java, toutes les classes sont dérivée de la
Plus en détailProgrammation Objet - Cours II
Programmation Objet - Cours II - Exercices - Page 1 Programmation Objet - Cours II Exercices Auteur : E.Thirion - Dernière mise à jour : 05/07/2015 Les exercices suivants sont en majorité des projets à
Plus en détailet Groupe Eyrolles, 2006, ISBN : 2-212-11747-7
Tsoft et Groupe Eyrolles, 2006, ISBN : 2-212-11747-7 OEM Console Java OEM Console HTTP OEM Database Control Oracle Net Manager 6 Module 6 : Oracle Enterprise Manager Objectifs Contenu A la fin de ce module,
Plus en détailAvant-propos 1. Avant-propos...3 2. Organisation du guide...3 3. À qui s'adresse ce guide?...4
Les exemples cités tout au long de cet ouvrage sont téléchargeables à l'adresse suivante : http://www.editions-eni.fr. Saisissez la référence ENI de l'ouvrage EP5EJAV dans la zone de recherche et validez.
Plus en détailTAGREROUT Seyf Allah TMRIM
TAGREROUT Seyf Allah TMRIM Projet Isa server 2006 Installation et configuration d Isa d server 2006 : Installation d Isa Isa server 2006 Activation des Pings Ping NAT Redirection DNS Proxy (cache, visualisation
Plus en détailMicrosoft OSQL OSQL ou l'outil de base pour gérer SQL Server
Microsoft OSQL OSQL ou l'outil de base pour gérer SQL Server Suite à mon précédent article concernant MSDE, je me suis rendu compte à partir des commentaires que de nombreux utilisateurs avaient des problèmes
Plus en détail1. Installation du Module
1 sur 10 Mise en place du Module Magento V 1.5.7 1. Installation du Module Vous pouvez installer le module de deux façons différentes, en passant par Magento Connect, ou directement via les fichiers de
Plus en détailUtilisation de GalaxShare
Utilisation de GalaxShare Tutoriel accessible en ligne sur http://galaxair.com/tuto/aidegalaxshare.html Le Porte-Document GalaxShare est un logiciel web de partage de documents, avec une gestion fine des
Plus en détailApplication web de gestion de comptes en banques
Application web de gestion de comptes en banques Objectif Réaliser une application Web permettant à un client de gérer ses comptes en banque Diagramme de cas d'utilisation 1 Les cas d'utilisation Connexion
Plus en détailCréation d'un site dynamique en PHP avec Dreamweaver et MySQL
Création d'un site dynamique en PHP avec Dreamweaver et MySQL 1. Création et configuration du site 1.1. Configuration de Dreamweaver Avant de commencer, il est nécessaire de connaître l'emplacement du
Plus en détailMEDIAplus elearning. version 6.6
MEDIAplus elearning version 6.6 L'interface d administration MEDIAplus Sommaire 1. L'interface d administration MEDIAplus... 5 2. Principes de l administration MEDIAplus... 8 2.1. Organisations et administrateurs...
Plus en détailFORMATION PcVue. Mise en œuvre de WEBVUE. Journées de formation au logiciel de supervision PcVue 8.1. Lieu : Lycée Pablo Neruda Saint Martin d hères
FORMATION PcVue Mise en œuvre de WEBVUE Journées de formation au logiciel de supervision PcVue 8.1 Lieu : Lycée Pablo Neruda Saint Martin d hères Centre ressource Génie Electrique Intervenant : Enseignant
Plus en détailInfo0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java
Info0604 Programmation multi-threadée Cours 5 Programmation multi-threadée en Java Pierre Delisle Université de Reims Champagne-Ardenne Département de Mathématiques et Informatique 18 février 2015 Plan
Plus en détailEdutab. gestion centralisée de tablettes Android
Edutab gestion centralisée de tablettes Android Résumé Ce document présente le logiciel Edutab : utilisation en mode enseignant (applications, documents) utilisation en mode administrateur (configuration,
Plus en détailClasse ClInfoCGI. Fonctions membres principales. Gestion des erreurs
Utilisation des classes de PourCGI par Michel Michaud, version 2002-11-23 Les fichiers PourCGI.h et PourCGI.cpp rendent disponibles deux classes et une fonction libre qui permettent de faire facilement
Plus en détailSage CRM. 7.2 Guide de Portail Client
Sage CRM 7.2 Guide de Portail Client Copyright 2013 Sage Technologies Limited, éditeur de ce produit. Tous droits réservés. Il est interdit de copier, photocopier, reproduire, traduire, copier sur microfilm,
Plus en détailTeamViewer 9 Manuel Management Console
TeamViewer 9 Manuel Management Console Rév 9.2-07/2014 TeamViewer GmbH Jahnstraße 30 D-73037 Göppingen www.teamviewer.com Sommaire 1 A propos de la TeamViewer Management Console... 4 1.1 A propos de la
Plus en détailComment bien démarrer avec. NetAirClub GUIDE ADMINISTRATEUR V1.5. Table des matières
Comment bien démarrer avec NetAirClub GUIDE ADMINISTRATEUR V1.5 Table des matières 1 TELECHARGEMENT...3 2 PREMIERE CONNEXION...4 2.1 Paramétrage du temps d'inactivité...4 2.2 Création de votre fiche membre
Plus en détailApplication de lecture de carte SESAM-Vitale Jeebop
Application de lecture de carte SESAM-Vitale Jeebop Présentation Le module de lecture de carte SESAM-Vitale Jeebop est une application Java Web Start, c'est à dire une application Java qui se télécharge
Plus en détailLe stockage local de données en HTML5
Le stockage local HTML5, pourquoi faire? Dans une optique de réduction des couts de maintenance, de déploiement, beaucoup d'entreprises ont fait le choix de migrer leurs applicatifs (comptables, commerciales,
Plus en détailTP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile
TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile Dans ce TP, vous apprendrez à définir le type abstrait Pile, à le programmer en Java à l aide d une interface
Plus en détailModule SMS pour Microsoft Outlook MD et Outlook MD Express. Guide d'aide. Guide d'aide du module SMS de Rogers Page 1 sur 40 Tous droits réservés
Module SMS pour Microsoft Outlook MD et Outlook MD Express Guide d'aide Guide d'aide du module SMS de Rogers Page 1 sur 40 Table des matières 1. Exigences minimales :...3 2. Installation...4 1. Téléchargement
Plus en détailMicrosoft Application Center Test
Microsoft Application Center Test L'outil de Test de performance des Sites Web Avec Visual Studio.NET, il est fourni une petite application qui permet de valider la performance de son site Internet ou
Plus en détailCyberclasse L'interface web pas à pas
Cyberclasse L'interface web pas à pas Version 1.4.18 Janvier 2008 Remarque préliminaire : les fonctionnalités décrites dans ce guide sont celles testées dans les écoles pilotes du projet Cyberclasse; il
Plus en détailManuel d'utilisation
Manuel d'utilisation Version 1.0 Le 25/09/2014 par i-médias, service commun informatique et multimédia Pôle Services numériques Pôle Applications & Développements I-médias Manuel d'utilisation de l'application
Plus en détailAuthentification avec CAS sous PRONOTE.net 2011. Version du lundi 19 septembre 2011
1 Authentification avec CAS sous PRONOTE.net 2011 Version du lundi 19 septembre 2011 2 1 - Vocabulaire employé et documentation... 3 1.1 - SSO (Single Sign-On)... 3 1.2 - CAS (Central Authentication Service)...
Plus en détailJavaServer Pages (JSP)
JavaServer Pages (JSP) XVIII-1 Prérequis pour ce cours Ce cours a trait à la programmation Java coté serveur Il faut connaître un minimum de technologie J2EE Il faut connaître les servlets XVIII-2 Motivation
Plus en détailFormation. Module WEB 4.1. Support de cours
Formation Module WEB 4.1 Support de cours Rédacteur Date de rédaction F.CHEA 08/02/2012 Les informations contenues dans ce document pourront faire l'objet de modifications sans préavis Sauf mention contraire,
Plus en détailSage CRM. Sage CRM 7.3 Guide du portable
Sage CRM Sage CRM 7.3 Guide du portable Copyright 2014 Sage Technologies Limited, éditeur de ce produit. Tous droits réservés. Il est interdit de copier, photocopier, reproduire, traduire, copier sur
Plus en détailLes messages d erreur d'applidis Client
Fiche technique AppliDis Les messages d erreur d'applidis Client Fiche IS00313 Version document : 1.00 Diffusion limitée : Systancia, membres du programme Partenaires AppliDis et clients ou prospects de
Plus en détailGuide d utilisation. Table des matières. Mutualisé : guide utilisation FileZilla
Table des matières Table des matières Généralités Présentation Interface Utiliser FileZilla Connexion FTP Connexion SFTP Erreurs de connexion Transfert des fichiers Vue sur la file d'attente Menu contextuel
Plus en détailTrier les ventes (sales order) avec Vtiger CRM
Trier les ventes (sales order) avec Vtiger CRM Dans l'activité d'une entreprise, on peut avoir besoin d'un outil pour trier les ventes, ce afin de réaliser un certain nombre de statistiques sur ces ventes,
Plus en détailInstallation d'un serveur DHCP sous Windows 2000 Serveur
Installation d'un serveur DHCP sous Windows 2000 Serveur Un serveur DHCP permet d'assigner des adresses IP à des ordinateurs clients du réseau. Grâce à un protocole DHCP (Dynamic Host Configuration Protocol),
Plus en détailUne introduction à la technologie EJB (2/3)
Une introduction à la technologie EJB (2/3) 1 Les singletons des EJB 3.1 1.1 Synchronisation gérée manuellement Depuis la version 3.1, des EJB Statless à instance unique sont maintenant disponibles : ce
Plus en détailclaroline classroom online
de la plate-forme libre d'apprentissage en ligne Claroline 1.4 Manuel Révision du manuel: 06/2003 Créé le 07/09/2003 12:02 Page 1 Table des matières 1) INTRODUCTION...3 2) AFFICHER LA PAGE DE DEMARRAGE...3
Plus en détailMise en service HORUS version HTTP
HTTP 1 / 8 Mise en service HORUS version HTTP Date Indice Nature des modifications Rédaction Nom/visa 03/05/06 A Première rédaction XI Vérification Nom/visa Approbation Nom/visa HTTP 2 / 8 SOMMAIRE 1)
Plus en détail7.0 Guide de la solution Portable sans fil
7.0 Guide de la solution Portable sans fil Copyright 2010 Sage Technologies Limited, éditeur de ce produit. Tous droits réservés. Il est interdit de copier, photocopier, reproduire, traduire, copier sur
Plus en détailTP réseau Android. Bidouilles Tomcat. a) Installer tomcat : il suffit de dézipper l'archive apache-tomcat-8.0.15-windowsx64.zip.
TP réseau Android Ce TP utilise tomcat 8, sous windows et des.bat windows. On peut trouver ce serveur web et conteneur d'applications web à http://tomcat.apache.org/download-80.cgi. Il se trouve dans l'archive
Plus en détailHP Data Protector Express Software - Tutoriel 4. Utilisation de Quick Access Control (Windows uniquement)
HP Data Protector Express Software - Tutoriel 4 Utilisation de Quick Access Control (Windows uniquement) Que contient ce tutoriel? Quick Access Control est une application qui s'exécute indépendamment
Plus en détailE-mail : contact@nqicorp.com - Web : http://www.nqicorp.com
- 5, rue Soutrane - 06560 Valbonne Sophia-Antipolis E-mail : contact@nqicorp.com - Web : http://www.nqicorp.com NQI Orchestra 3.3 - Guide d'installation Windows.................................................................
Plus en détailStockage du fichier dans une table mysql:
Stockage de fichiers dans des tables MYSQL avec PHP Rédacteur: Alain Messin CNRS UMS 2202 Admin06 30/06/2006 Le but de ce document est de donner les principes de manipulation de fichiers dans une table
Plus en détailCONNECTEUR PRESTASHOP VTIGER CRM
CONNECTEUR PRESTASHOP VTIGER CRM Page 1 / 14 Vtiger CRM - Prestashop Connector Pour PRESTASHOP version 1.4.x et 1.5.x Pour vtiger CRM version 5.1, 5.2.0, 5.2.1, 5.3 et 5.4 Introduction En tant que gérant
Plus en détailProjet Active Object
Projet Active Object TAO Livrable de conception et validation Romain GAIDIER Enseignant : M. Noël PLOUZEAU, ISTIC / IRISA Pierre-François LEFRANC Master 2 Informatique parcours MIAGE Méthodes Informatiques
Plus en détail1 / Introduction. 2 / Gestion des comptes cpanel. Guide débuter avec WHM. 2.1Créer un package. 2.2Créer un compte cpanel
Guide débuter avec WHM 1 / Introduction WHM signifie Web Host Manager (ou gestionnaire d'hébergement web). WHM va donc vous permettre de gérer des comptes d'hébergement pour vos clients. (création de compte,
Plus en détailADO.NET. Ado.net propose deux modes d'accès, le mode connecté et le mode déconnecté.
ADO.NET Ado.net est une technologie d'accès aux données qui fournit un ensemble des classes permettant d'accéder aux données relationnelles. Même si Microsoft a repris le nom d'ado, déjà présent en VB6,
Plus en détailComment développer et intégrer un module à PhpMyLab?
Comment développer et intégrer un module à PhpMyLab? La structure du fichier Afin de conserver une homogénéité et une cohérence entre chaque module, une structure commune est utilisée pour chacun des modules
Plus en détailGuide Utilisateur - Guide général d'utilisation du service via Zdesktop ou Webmail v.8. Powered by. - media-2001.communication &.
Guide Utilisateur - Guide général d'utilisation du service via Zdesktop ou Webmail v.8 Powered by - media-2001.communication &.networks 1 Version 3.0 Sommaire Introduction... 3 1. Configuration du logiciel
Plus en détail2010 Ing. Punzenberger COPA-DATA GmbH. Tous droits réservés.
2010 Ing. Punzenberger COPA-DATA GmbH Tous droits réservés. La distribution et/ou reproduction de ce document ou partie de ce document sous n'importe quelle forme n'est autorisée qu'avec la permission
Plus en détailSIO-65291 Page 1 de 5. Applications Web dynamiques. Prof. : Dzenan Ridjanovic Assistant : Vincent Dussault
SIO-65291 Page 1 de 5 1- Objectifs généraux Applications Web dynamiques Prof. : Dzenan Ridjanovic Assistant : Vincent Dussault acquérir les principes et concepts fondamentaux dans le domaine d'applications
Plus en détailwww.systhag-online.cm PREINSCRIPTION EN LIGNE
UNIVERSITE DE DOUALA THE UNIVERSITY OF DOUALA www.systhag-online.cm PREINSCRIPTION EN LIGNE Guide de l'utilisateur Part. 1 (Mise à jour: 26 septembre 2012) 1 TABLE DES MATIERES I- AVANT DE COMMENCER 3
Plus en détailMettre à jour PrestaShop
Mettre à jour PrestaShop De nouvelles versions de PrestaShop sortent régulièrement. Certaines sont des versions majeures, la plupart sont mineures, mais toutes apportent leur lot d'innovation, d'amélioration
Plus en détailGuide d'utilisation du Serveur USB
Guide d'utilisation du Serveur USB Copyright 20-1 - Informations de copyright Copyright 2010. Tous droits réservés. Avis de non responsabilité Incorporated ne peut être tenu responsable des erreurs techniques
Plus en détailProtocoles DHCP et DNS
Protocoles DHCP et DNS DHCP (Dynamic Host Configuration Protocol) est un protocole qui permet à un serveur DHCP (Unix, Windows, AS400...) d'affecter des adresses IP temporaires (et d'autres paramètres)
Plus en détailLangage HTML (2 partie) <HyperText Markup Language> <tv>lt La Salle Avignon BTS IRIS</tv>
Langage HTML (2 partie) «Je n'ai fait que prendre le principe d - hypertexte et le relier au principe du TCP et du DNS et alors boum! ce fut le World Wide Web!» Tim Berners-Lee
Plus en détailREALISER UN SITE INTERNET AVEC IZISPOT SOMMAIRE
REALISER UN SITE INTERNET AVEC IZISPOT Voici un tutoriel pour vous aider à réaliser un petit site internet (4 pages) à l'aide du logiciel gratuit IZISPOT. Dans l'exemple qui suit, il s'agit de mettre en
Plus en détailPremiers pas sur e-lyco
Premiers pas sur e-lyco A destination des parents, ce document présente les premiers éléments pour accéder aux services de l'ent e-lyco d'un lycée. Que signifient ENT et e-lyco? ENT = Espace ou Environnement
Plus en détail1. Introduction...2. 2. Création d'une requête...2
1. Introduction...2 2. Création d'une requête...2 3. Définition des critères de sélection...5 3.1 Opérateurs...5 3.2 Les Fonctions...6 3.3 Plusieurs critères portant sur des champs différents...7 3.4 Requête
Plus en détailPage 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>
Page 1 sur 5 TP3 Lectures préalables : l Java_II l tutorial Interfaces Thèmes du TP : l la classe Object l Vector l Stack Une pile d'objects Les éléments de la classe Pile sont maintenant des instances
Plus en détail24/11/2011. Cours EJB/J2EE Copyright Michel Buffa. Plan du cours. EJB : les fondamentaux. Enterprise Java Bean. Enterprise Java Bean.
Plan du cours 2 Introduction générale : fondamentaux : les fondamentaux Michel Buffa (buffa@unice.fr), UNSA 2002, modifié par Richard Grin (version 1.1, 21/11/11), avec emprunts aux supports de Maxime
Plus en détailGestion du parc informatique des collèges du département du Cher. Manuel d utilisation de la solution de gestion de Parc
Gestion du parc informatique des collèges du département du Cher Manuel d utilisation de la solution de gestion de Parc Table des matières 1. Préambule... 3 2. Pré requis... 3 3. Objectifs... 3 4. Connexion
Plus en détailHelpAndManual_unregistered_evaluation_copy GESTIONNAIRE D'ALARMES CENTRALISE OPTIM'ALARM. Manuel d'utilisation
HelpAndManual_unregistered_evaluation_copy GESTIONNAIRE D'ALARMES CENTRALISE OPTIM'ALARM Manuel d'utilisation OPTIMALOG 2008 Table des matières I Table des matières Part I Gestionnaire d'alarmes Optim'Alarm
Plus en détailPour paramétrer l'extranet Pré-inscription, sélectionner Pré-inscriptions dans le menu Paramètre.
I Généralités Ce module permet la gestion des pré-inscriptions en ligne par les futurs élèves non déjà inscrits dans l'établissement ou par le personnel administratif (différent du module de réinscription
Plus en détailDidacticiel de mise à jour Web
Didacticiel de mise à jour Web Copyright 1995-2012 Esri All rights reserved. Table of Contents Didacticiel : Création d'une application de mise à jour Web.................. 0 Copyright 1995-2012 Esri.
Plus en détailAcronis Backup & Recovery 10 Advanced Server Virtual Edition. Guide de démarrage rapide
Acronis Backup & Recovery 10 Advanced Server Virtual Edition Guide de démarrage rapide Ce document explique comment installer et utiliser Acronis Backup & Recovery 10 Advanced Server Virtual Edition. Copyright
Plus en détailVtiger CRM - Prestashop Connector
Vtiger CRM - Prestashop Connector Pour PRESTASHOP version 1.4.x Pour vtiger CRM version 5.1, 5.2.0 et 5.2.1 Introduction En tant que gestionnaire d'une boutique en ligne, vous cherchez constamment de meilleurs
Plus en détailInstallation et utilisation d'un certificat
1 IceWarp Merak Mail Server Installation et utilisation d'un certificat Icewarp France octobre 2007 2 Icewarp Merak Mail Serveur : Guide de mises à jour à la version 9 Sommaire Introduction...3 Situation
Plus en détailGénéralités sur le Langage Java et éléments syntaxiques.
Généralités sur le Langage Java et éléments syntaxiques. Généralités sur le Langage Java et éléments syntaxiques....1 Introduction...1 Genéralité sur le langage Java....1 Syntaxe de base du Langage...
Plus en détailDirXML License Auditing Tool version 1.1 - Guide de l'utilisateur
DirXML License Auditing Tool version 1.1 - Guide de l'utilisateur Présentation Installation DirXML License Auditing Tool (DLAT) vous permet de déterminer le nombre de licences DirXML utilisées dans une
Plus en détailGuide utilisateur Archivage intermédiaire Messagerie. Enterprise Connect pour Outlook 2010 EC 10.2.1 V 1.0
Guide utilisateur Archivage intermédiaire Messagerie Enterprise Connect pour Outlook 2010 EC 10.2.1 V 1.0 Page : 2/38 Table des matières 1. Introduction... 3 2. L'interface Livelink dans MS Outlook...
Plus en détailSauvegarde des bases SQL Express
Sauvegarde des bases SQL Express Sauvegarder les bases de données avec SQL Express Dans les différents articles concernant SQL Server 2005 Express Edition, une problématique revient régulièrement : Comment
Plus en détailFreeway 7. Nouvelles fonctionnalités
! Freeway 7 Nouvelles fonctionnalités À propos de ce guide... 3 Nouvelles fonctionnalités en un coup d'oeil... 3 À propos de la conception d'un site web réactif... 3 Travailler avec les pages pour créer
Plus en détailGESTION DES BONS DE COMMANDE
GESTION DES BONS DE COMMANDE P1 P2 Table des Matières LA GESTION DES BONS DE COMMANDE 4 PREMIERE EXECUTION DU LOGICIEL 5 DEFINITION DES PARAMETRES 8 Services 9 Comptes Utilisateurs 10 Adresse de livraison
Plus en détailInstallation et configuration de Vulture Lundi 2 février 2009
Installation et configuration de Vulture Lundi 2 février 2009 V1.0 Page 1/15 Tables des matières A. Informations (Page. 3/15) B. Installation (Page. 3/15) 1- Téléchargement des paquets nécessaires. 2-
Plus en détailUn serveur web, difficile?
Un serveur web, difficile? Belle question, mais d'abord qu'est-ce qu'un serveur web et à quoi cela peut-il servir? C'est un ensemble de programmes qui sont installés sur un ordinateur et qui servent à
Plus en détailEXTRANET STUDENT. Qu'est ce que Claroline?
EXTRANET STUDENT http://extranet.arts2.be http://extranet.artsaucarre.be Les bases de l'utilisation de la plateforme Claroline, l'extranet d'arts² Qu'est ce que Claroline?... 1 Débuter... 2 Créer un compte...
Plus en détailA DESTINATION DES SERVICES TIERS. Editeurs d applications et ressources pédagogiques connectées à l ENT
DOCUMENTATION CAS A DESTINATION DES SERVICES TIERS Titre descriptif du document Référence du document REFO-DT-ENTV2-ServeurCAS-v1.2.docx Nom du fichier REFO-DT-ENTV2-ServeurCAS-v1.2.docx Version du document
Plus en détailJava 7 Les fondamentaux du langage Java
184 Java 7 Les fondamentaux du langage Java 1.1 Les bibliothèques graphiques Le langage Java propose deux bibliothèques dédiées à la conception d'interfaces graphiques. La bibliothèque AWT et la bibliothèque
Plus en détailLe générateur d'activités
Le générateur d'activités Tutoriel Mise à jour le 09/06/2015 Sommaire A. Mise en route du Générateur d'activité... 2 1. Installation de Page... 2 2. Création des bases du générateur d'activités... 3 3.
Plus en détailInternet : Naviguer en toute sérénité
Internet 01 Mozilla Firefox Internet : Naviguer en toute sérénité Tutoriel Pratique 2 : «Internet : naviguer en toute sérénité» Durée de la séance : 2h tout public prérequis : - Connaître et utiliser les
Plus en détailProgrammation Orientée Objet en C#
Programmation Orientée Objet en C# 1 Introduction 1.1 Présentation Tout bon développeur le sait, le code d'un programme doit être propre, commenté, facile à maintenir et à améliorer. Vous êtes adepte de
Plus en détailPlateforme PAYZEN. Intégration du module de paiement pour la plateforme Magento version 1.3.x.x. Paiement en plusieurs fois. Version 1.
Plateforme PAYZEN Intégration du module de paiement pour la plateforme Magento version 1.3.x.x Paiement en plusieurs fois Version 1.4a Guide d intégration du module de paiement Multiple Magento 1/24 SUIVI,
Plus en détailipra*cool v 1.08 guide de l utilisateur ipra*cool v.1-08 Guide de l'utilisateur ipra*cool v 1.08 1
ipra*cool v.1-08 Guide de l'utilisateur ipra*cool v 1.08 1 Sommaire 1 ipra*cool en bref 2 Démarrage d' ipra*cool 2.1 Initialisation du logiciel ipra*cool ( sur MOBILE et PC) 2.1.1 Vérification des connexions
Plus en détailProgrammation Web. Madalina Croitoru IUT Montpellier
Programmation Web Madalina Croitoru IUT Montpellier Organisation du cours 4 semaines 4 ½ h / semaine: 2heures cours 3 ½ heures TP Notation: continue interrogation cours + rendu à la fin de chaque séance
Plus en détail