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 :
- programmer sur votre machine personnelle et installer posgresql dessus
- 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 :
- postgres sur votre machine personnelle :
-
url
devient “jdbc:postgresql://localhost/life” -
user
devient “votre_login” -
passwd
devient “votre_mot_de_passe_pg”
-
- 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 classeStartServer
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