Blog d'un développeur multi-support

[DIM] pour les intimes :)

Framework Java pour le jeux

Introduction

Dans le cadre de ma formation « développeur informatique multi-support » on nous a demandé de créer un en en 2D de type « mario » ou plutôt de modifier un existant en vue d’apprendre par nous même le java et d’en voir un coté plus sexy que les habituelles programmes en ligne de commande.

Voici l’url que l’on nous a donné : http://fivedots.coe.psu.ac.th/~ad/jg/ch062/index.html. Ce chapitre est un extrait du livre Killer Game Programming in Java présenté par son auteur sur le site http://fivedots.coe.psu.ac.th/~ad/jg. Sur ce dernier vous trouverez d’autres jeux et d’autres chapitres intéressant.

Seulement je n’ai pas pour habitude d’apprendre en traficotant des exemples de . Je le faisais quand je débutais en programmation, mais maintenant je pense être capable d’apprendre par moi même et de partir sur une base propre. Comme un par exemple !!

Les Frameworks Java

L’idée d’utiliser un framework java et capitaliser le temps des cours en une expérience riche m’est venu en regardant l’écran de Clément Biron et Romain pouclet qui s’intéressaient tout deux aux frameworks « processing » et à  « PulpCore ». (Il faut toujours cité ses sources :))

Alors pour maximiser nos découvertes je suis parti dans la découverte d’un troisième framework nommé Slick. Voila un bref apercu de ces frameworks après une journé à les regarder.

Processing

En un mot : Enorme. Le couteau suisse par exellence, ce framework s’adresse à tout le monde :

 » for people who want to program images, animation, and interactions. It is used by students, artists, designers, researchers, and hobbyists for learning, prototyping, and production. »

Personnellement, j’ai été bluffé par Processing quand j’ai vu cette :

http://bricktable.wordpress.com/about/what-is-roots/ Du java rapide O_o wahou !

Bien sur cela ne se limite pas qu’à ça :) Il y a quand même 6 livres qui sont sorties sur ce framework ! « Ça envoie du lourd » comme dirait certains :)

Pulpcore

Pulpcore je le vois plutôt comme un moyen d’embarquer du java dans des pages web de façon transparente et se rapproche plus de Flash. Exemple ici et un autre exemple là.

Bien que jeune, ce framework  tant à se faire connaitre avec son slogan provocateurs « Applets are back » :)

A la base, on nous a demandé de faire un jeux. Processing étant quand même énorme, et pulcore un peu trop limitatif, il fallait que je trouve un framework « médiant ». Hors Slick se positionne exclusivement comme étant LE framework dédié aux jeux 2D en java.  Great !

En gros, il fournit tout ce qu’on a besoin pour un jeux : gestion du clavier, gestion des collisions, gestion des cartes via Tiled

Tiled, Le Map editor supporté par Slick

Je reviendrais en détail sur ce framework en expliquant comment créer un jeux, ou du moins je mettrais le code source à disposition. Mais vous pouvez voir un exemple de code source ici : Un tank se déplacement sur une carte avec gestions des collisions !

Et vous ?

Si on vous demandez de faire un jeux Java en 2D, vous partiriez sur quoi ?

Tags : , , , ,

Et un framework un !

Aller sur http://blog.jaysalvat.com/articles/model-baker-une-interface-graphique-a-la-creation-dapplications-cakephp.php ou regarder simplement son screencast :

Model Baker in action from Jay Salvat on Vimeo.

Ca a l’air génial :) Dommage que ça soit seulement pour mac pour l’instant, mais c’est très prometteurs ! Apres un tour sur Symfony, sur Zend, faudrait que j’aille voir CakePHP donc :)

Tags : , , , ,

Utiliser une procédure stocké mysql avec Zend !

Dans un article précédent, je créais la « import », voilà comment je l’utilise dans Zend.

Je n’invente rien, j’ai trouvé la manip sur http://www.ericmery.fr/blog/zend_db-sql-server-procedure-stockee.

1
2
3
4
5
6
7
8
9
10
$registry = Zend_Registry::getInstance();
$config = $registry->get("config");
 
$db = Zend_Db::factory($config->db);
 
$stmt = $db->prepare("call import(?,?,?);");
$stmt->bindParam(1, $param1, PDO::PARAM_STR,1000);
$stmt->;bindParam(2, $param2, PDO::PARAM_STR, 255);
$stmt->bindParam(3, $param3, PDO::PARAM_STR, 255);
$res = $stmt->execute();

Magie, c’est la même chose. On remercie PDO et son abstracteur de base de donnée utilisé !

Tags : , , , ,

[Mysql] Procédure Stocké

Pour un projet d’annuaire de Flux RSS, j’ai du faire en sorte que l’on puisse importer ses Flux dans l’annuaire via un fichier XML opml que tout bon agrégateur (google reader, netvibes) fournit. Donc admettons que l’on a 100 flux RSS à importer il faut pour chaque flux vérifier si le flux n’existe pas déjà sinon le créer en base. Donc il faut prévoir un maximum de 200 requêtes SQL.

Seulement voilà, si on fait les instructions de test d’existence et d’insertion au niveau , cela fait 200 aller retour entre et la base . Hors ce qui plombe un script c’est souvent ces aller retour incessants .. Un moyen d’optimiser ce traitement a été de créer une qui prend en paramètre le fichier XML (où plutôt une représentation épuré plus strict), et de faire exécuter les 200 requêtes DANS . Chouette non ? Plus rapide, plus stable, plus optimisé .. que du bonheur.

Procédure Stocké en Mysql

Vous allez rire, mais d’après mes recherches googlidiennes très peu de personnes font des procédures en Mysql. Cela vient sans doute du fait qu’elles sont apparru avec mysql 5 et que c’est encore « neuf ».

Tous les exemples que l’on trouve sur le sujet sont pour SQL serveur PRo, donc du transact-SQL. Et le souci c’est qu’il n’y pas forcement d’équivalence entre les fonctions transact-SQL et les fonctions mysql. La synthaxe n’est décidement pas la même.

Outil utilisé

Mysql query browser !

L’exemple que je donne n’est valable qu’a travers sont interface .. zarb.. m’enfin c’est un très bon outil quand même, rien à voir avec un phpMyAdmin tout POURRI !

Création de la requête

Voilà la précédure allégé que j’ai crée (je fais d’autres test en version un peu plus lourde). Je vais essayer de la commenter au mieux.

La procédure s’appelle import, elle est dans la base de donné nommé « Fluxe » et on l’appelle et l’utilise comme ceci

1
2
3
4
call import(
"premier flux|http://monsite|http://monsite/fluxrss|description;
deuxieme flix|http://monsite2|http://www.google.fr/bidule.xml|autre description;
troisieme|http://monsite3|http://monsite2/rss.xml|description;",3);

Le premier paramètre est la chaine retravaillé coté PHP qui correspond à chaque ligne de l’XML, et le deuxième paramètre est le nombre de flux. Une entré se fini via un « ; » et chaque colonne est séparé via un  » | « . Bon je sais, mes délimiteurs ne sont pas assez complexe dans cet exemple et cela serait risque de bug si une description ou url comporterait des points virgules et des pipes…

Voici la requête :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
DELIMITER $$  -- pas trop compris l'interet O_o
DROP PROCEDURE IF EXISTS `fluxe`.`import` $$
-- Supprime la procédure si elle existe (je suis fort en anglais hein ? ^^) 
 
CREATE DEFINER=`root`@`localhost` PROCEDURE `import`(In myCsv Text, In nbElement Int)
-- crée la procédure avec deux paramètres "IN" de type Text et Int. C'est à dire que c'est deux paramètres obligatoires pour exécuter la requête.  
 
BEGIN -- Debut de la procédure
 
-- Declare mes variables correspondant aux colonnes de ma table Flux
DECLARE nom varchar(255);
DECLARE urlSite varchar(255);
DECLARE myurlFlux varchar(255);
DECLARE description text;
DECLARE  ligne_flux VARCHAR(1000); -- correspondra à une ligne de Flux
DECLARE cpt int; -- un petit compteur pour faire une jolie boucle While
 
set cpt = nbElement;  -- / !  Voilà comment on définit une variable SET var = valeur; 
 
WHILE cpt <= nbElement and cpt > 0 do  -- j'aurais pu utiliser une boucle Loop aussi.
 
  select replace(substring(substring_index(myCsv, ';', cpt), length(substring_index(myCsv, ';', cpt - 1)) + 1), ';', '') as ligne into ligne_flux;
 
  -- Outch "KEKECER ?" vous devez vous pausez comme question :)
  -- c'est simple, je découpe le premier paramètre In pour en extraire la 1er ligne trouvé.
  -- Les fonctions appellés ne sont pas du php mais bien du SQL ! Puissant non ?
  -- l'idée de récupèrer la 1er ligne DANS une variable "ligne_flux", d'où le "select ... INTO variable" 
 
  -- Parsage de la chaine "ligne_flux" pour en extraire les colonnes, rebelote quoi ..
  select  replace(substring(substring_index(ligne_flux, '|', 1), length(substring_index(ligne_flux, '|', 1 - 1)) + 1), '|', '') into nom;
  select  replace(substring(substring_index(ligne_flux, '|', 2), length(substring_index(ligne_flux, '|', 2 - 1)) + 1), '|', '') into urlSite;
  select  replace(substring(substring_index(ligne_flux, '|', 3), length(substring_index(ligne_flux, '|', 3 - 1)) + 1), '|', '') into myurlFlux;
  select  replace(substring(substring_index(ligne_flux, '|', 4), length(substring_index(ligne_flux, '|', 4 - 1)) + 1), '|', '') into description;
 
  -- Insertion que si la ligne n'existe pas. Le critère est l'url du flux.
  if(NOT EXISTS (select * from flux where urlFlux = myurlFlux)) THEN
       insert into flux (nom,urlSite,urlFlux,description) values (nom,urlSite,myurlFlux,description);
   end if;
 
 -- on décrémente le compteur
 set cpt = cpt - 1;
end while;
 
END $$
DELIMITER ;

Et voilà c’est fini !

Lien de référence

La base :http://dev.mysql.com/doc/refman/5.0/fr/stored-procedure-syntax.html

les variables : http://dev.mysql.com/doc/refman/5.0/fr/variables-in-stored-procedures.html
If, while, case, et tous les contrôles : http://dev.mysql.com/doc/refman/5.0/fr/flow-control-constructs.html

Mis à part la documentation officiel, j’ai rien trouvé d’autres à me mettre sous la dent ..

Tags : , , , ,