Skip to content
Snippets Groups Projects
Select Git revision
  • master
1 result

life_project

  • Projet : le jeu de la vie pour plusieurs éditeurs

    Le jeu de la vie FAIT PAR MEHDI et Ibrahim

    Lire la section “Règles” sur la page wiki: https://fr.wikipedia.org/wiki/Jeu_de_la_vie

    Malgré sa simplicité le jeu de la vie est très puissant et permet d‘“exécuter” tous les algorithmes que l’on connaît, on dit qu’il est Turing-complet :

    • une vidéo de Science étonnante sur le sujet : https://www.youtube.com/watch?v=S-W0NX97DB0
    • une vidéo où le jeu de la vie se simule lui-même : https://www.youtube.com/watch?v=xP5-iIeKXE8

    Exécution

    ./gradlew run
    

    Rendez-vous sur http://localhost:8081/

    Objectifs

    Le but de ce TP est de développer un éditeur coopératif pour le jeu de la vie. Il s’agira d’utiliser judicieusement un système de base de données (ici postgresql) pour que les accès et modifications concurrentes faits sur le jeu se fasse de manière cohérente.

    Il faudra remplir les objectifs suivants :

    Configurer votre espace de travail

    Il vous faut outil de développement en Java, mais surtout l’accès à un serveur postgresql. Deux choix s’offrent à vous :

    1. programmer sur votre machine personnelle et installer posgresql dessus
    2. installer postgresql sur votre machine virtuelle en suivant la section suivante “Configuration de Postgresql”.

    Pour configurer l’accès à la base de données, aller dans la classe “com.uca.dao._Connector” et modifier les valeurs suivantes, suivant votre choix précédent :

    1. postgres sur votre machine personnelle :
      • url devient “jdbc:postgresql://localhost/life”
      • user devient “votre_login”
      • passwd devient “votre_mot_de_passe_pg”
    2. postgres sur votre machine virtuelle :
      • url devient “jdbc:postgresql://vm-etu-votre_login.local.isima.fr/life”
      • user devient “votre_login”
      • passwd devient “votre_mot_de_passe_pg”

    Initialiser la base de donnée

    Modifier le code de la classe “com.uca.dao._Initializer” pour initialiser une table dans le cas, où elle n’existe pas. On veut que cette table :

    • représente une grille carré
    • contienne trois colonnes (deux coordonnées entières et un état pour chaque cellule)

    Il faut aussi choisir une clé primaire pour cette table.

    Puis, il faut remplir la table avec un état initial. On ajoute des cellules mortes sur un carré finie (par exemple 100 cases de côté) à partir de la coordonnée (0, 0).

    Remarque: Vous devez, dès que cela est pertinent, interagir avec la base de données en créant des transactions. Pour cela, vous devez utiliser les méthodes setAutoCommit, commit et rollback de l’objet Connection. Chaque connection peut être vu comme une session des précédents TPs. N’oubliez pas non plus de choisir un niveau d’isolation des transactions avec la méthode setTransactionIsolation.

    Rafraîchir la grille

    Il s’agit de coder le fonctionnement du bouton “rafraichir” de l’interface Web, qui fait une requête GET sur le chemin /grid. Observer la gestion du chemin dans la classe “com.uca.StartServer” et modifier le reste du projet pour retourner la grille stockée dans la base de données.

    Pour tester, modifier des cellules pour les rendre vivante en utilisant psql et observer les depuis la page Web.

    Changer l’état d’une cellule

    Il s’agit de coder le fonctionnement du clic sur la grille depuis l’interface Web, qui fait une requête PUT sur le chemin /grid/change. On souhaite que l’état de la cellule cliquée soit inversé.

    Sauvegarder/annuler plusieurs changements d’état

    Il s’agit de coder le fonctionnement du formulaire avec le bouton “sauvegarde” et “annuler”, qui fait une requête POST sur le chemin /grid/save et /grid/cancel. On souhaite que les modifications de chaque utilisateur (chaque onglet ouvert) se fasse de manière isolée.

    Il faut ici porter une attention particulière à créer des transactions différentes pour chaque utilisateur. Pour cela, il faut :

    • utiliser la méthode getSession de la classe StartServer pour identifier chaque utilisateur,
    • créer/utiliser une différente Connexion pour chaque utilisateur.

    Importer un fichier RLE à partir d’un URL

    Il s’agit de coder le fonctionnement du formulaire avec le bouton “importer”, qui fait une requête PUT sur le chemin /grid/rle. On souhaite que le fichier RLE soit lu et importer sur la grille. Des URL de fichiers RLE de différents objets du jeu de vie sont disponibles sur LifeWiki dans la boîte d’information sous “Pattern files”. Par exemple, l’URL de la destruction de spaceship 60P5H2V0 mentionné dans la vidéo de Science étonnante est disponible sur cette page avec l’URL : https://www.conwaylife.com/patterns/60p5h2v0eaten.rle.

    Pour cela, vous pouvez utiliser la méthode decodeRLEUrl dans la classe GridCore.

    Réinitialiser l’état de la grille

    Il s’agit de coder le fonctionnement du bouton “vider” depuis l’interface Web, qui fait une requête POST sur le chemin /grid/empty.

    Calculer la génération suivante de la grille

    Il s’agit de coder le fonctionnement du bouton “suivant”, qui fait une requête POST sur le chemin /grid/next. Le bouton “lecture”, répète le fonctionnement de “suivant” à intervalle plus ou moins long en fonction de la “vitesse” choisie.

    Gérer des grilles infinies (bonus)

    Il s’agit de changer la représentation de la grille pour qu’elle ne contienne pas de taille fixée à l’initialisation. Plusieurs solutions sont possibles.

    Configuration de Postgresql

    Pour développer, il faudra ouvrir une connection avec un serveur postgres, qui sera installé sur votre machine virtuelle étudiante (celle nommée vm-etu-votre_login.local.isima.fr).

    Vous utiliserez donc deux machines en parallèle la machine virtuelle avec le serveur postgresql et la machine sur laquelle vous développez le projet qui se connecte à postgresql.

    Installation de postgresql depuis votre machine virtuelle

    sudo apt install postgresql
    

    Configurer votre utilisateur et votre base de données

    Connectez vous au serveur postgres via le client psql:

    sudo su postgres
    psql
    

    Créer votre utilisateur avec votre login avec le mot de passe de votre choix:

    CREATE USER votre_login WITH PASSWORD 'choissisez un mot de passe (pas votre mp UCA !!!!)';
    

    Créer la base de donnée que vous allez utiliser durant le projet :

    CREATE DATABASE life;
    

    Accorder tous les droits à votre utilisateur sur cette base :

    GRANT ALL PRIVILEGES ON DATABASE life TO votre_login;
    

    Quitter le client psql avec la commande \q. Et déconnectez vous du login postgres depuis bash.

    Connectez-vous à votre base de données avec votre nouvel utilisateur :

    psql -U votre_login -d life
    

    Configuration de postgres pour qu’il soit accessible depuis l’intranet de l’ISIMA

    Changer dans le ficher de configuration /etc/postgresql/13/main/postgresql.conf, ~listen_addresses = ‘localhost’~ en ~listen_addresses = ‘*’~ pour que le serveur postgres soit accessible depuis l’intranet. Vous pouvez utiliser l’éditeur nano :

    sudo nano /etc/postgresql/13/main/postgresql.conf
    

    Ajouter la ligne suivante à la fin du fichier /etc/postgresql/13/main/pg_hba.conf pour l’identification avec mot de passe soit autorisée depuis l’intranet :

    host    all             all             0.0.0.0/0               md5
    

    Puis redémarrer le serveur postgres pour que vos modifications soit prises en compte:

    sudo systemctl restart postgresql
    

    Depuis votre machine de développement (celle avec le code et un IDE), essayez de vous connecter de vous connecter au serveur posgresql avec :

    psql -h vm-etu-votre_login.local.isima.fr -U votre_login -d life -W
    

    Commandes utiles dans le client psql

    Contrairement au client Oracle, l’auto commit est activé dans psql, ce qui signifie que :

    • les transactions doivent explicitement débuter par le mot-clé BEGIN
    • les requêtes en dehors de transaction sont automatiquement validé à la fin de l’exécution, s’il n’y pas d’erreur.
    • \q quitter
    • \dt lister les tables de la base de données courante
    • \c autre_base se connecter à une autre base de données

    Sources

    • https://www.bigbinary.com/blog/configure-postgresql-to-allow-remote-connection
    • https://www.ibm.com/docs/fr/urbancode-deploy/6.2.2?topic=configuration-configuring-postgresql-database-blueprint-design-server