Catégorie : développement – divers

Trackmania 2 / ManiaScript, ManiaPlanet et Labyrinthes : génération automatique

Vous avez peut-être vu que j’avais écrit un générateur de labyrinthes en C, qui créait en bout de course un fichier Autohotkey (là aussi je vous laisse vous renseigner). Ce fichier Autohotkey lançait Trackmania United Forever et automatisait la pose de blocs, et au final il y avait une course dans… un labyrinthe de blocs de course. J’avais donc modifié Trackmania afin d’en faire un outil pour jouer dans des labyrinthes !

Trackmania 2 est sorti, en version bêta, avec achat pour 0.01 € de moins.
Comme c’était une offre extraordinaire, j’ai sauté sur l’occasion.

Et dans Trackmania 2, ils ont fait très fort (même si ça n’est pas encore 100 % terminé, c’est déjà très abouti) : dans leur éditeur de maps, ils ont fait un langage de programmation qui leur est propre, une sorte de fils caché entre le JavaScript et XML, avec quelques attouchements de C et de « principes objet ».
Je trouve que ça n’est pas très lisible, et encore moins maintenable, mais bon, c’est pour un jeu, alors il faut pas en demander trop, surtout quand on voit qu’on n’est pas que joueur, mais qu’on peut être acteur !
Ce pseudo-langage de programmation s’appelle «ManiaScript».

Je me suis dit : je vais refaire mon générateur de labyrinthes, mais pour «ManiaScript».
J’ai donc commencé à préparer le terrain en «ManiaScript» : j’ai préparé des routines de poses de blocs, des routines pour poser les montées, etc. J’en ai profité pour faire une petite copie d’écran que je vous livre avec plaisir (cliquez dessus pour agrandir) :

Image Trackmania de Labyrinthes

Puis j’en ai profité pour me repencher sur mon ancien générateur, et je me suis dit : je vais le reprendre, afin de lui faire générer des scripts «ManiaScript».

C’est ce que j’ai fait, et au bout de deux soirées passées à tout ré-analyser ce que j’avais fait (même si je mets des tonnes de commentaires, mon générateur est en C pur, donc c’est très dur (pour moi en tous les cas) de me replonger dans le bain), j’ai enfin pu recompiler et générer quelque chose. J’en ai donc fait une copie d’écran que je vous livre avec plaisir (cliquez dessus pour agrandir) :

Image Trackmania de Labyrinthes

Et puis j’ai repassé toute une soirée à réussir à lier les deux. Le plus gros problème vient du fait que je prends les repères mathématiques «classiques» c’est à dire en vertical, Y, à l’horizontal X, et en profondeur Z. Dans Trackmania, le Y et Z sont inversés. Bonjour le casse tête mais je n’étais pas à ça près. J’ai donc réussi : j’ai fait une copie d’écran que je vous livre avec un bien plus grand plaisir que les deux précédents (cliquez dessus pour agrandir) :

Image Trackmania de Labyrinthes

La pose des montées se fait avant la pose des blocs principaux. C’est assez marrant à voir, et comme je suis gentil, je vous ai même fait une copie d’écran (cliquez dessus pour agrandir) :
Image Trackmania de Labyrinthes

Ensuite, j’ai voulu tester les limites de ma machine, et j’ai crée le plus grand labyrinthe possible pour Trackmania 2, et à mon grand plaisir, le jeu n’a pas explosé, comme il le faisait pour Trackmania United. Mattez moi ça (cliquez dessus pour agrandir) :
Image Trackmania de Labyrinthes

Trackmania 2 a une nouveauté extraordinaire : ils précalculent les ombres avec un réalisme époustouflant, et j’ai donc demandé de précalculer avec le maximum de précision (il y a six niveaux, et le plus détaillé prend plusieurs heures de calcul), et voilà ce que ça a donné (cliquez dessus pour agrandir) :
Image Trackmania de Labyrinthes

Ensuite, je me suis dit que les labyrinthes c’est bien joli, mais uniquement des blocs carrés, c’est pas très marrant. Donc j’ai décidé d’améliorer le tout, et j’ai trouvé un truc : après que le labyrinthe ait été posé par le script, j’ai imaginé rajouter en «ManiaScript» du code qui « décore » le labyrinthe. Par exemple, pour les tournants, j’ai mis des blocs de type « route », et j’ai ajouté un bloc « carré » pour terminer tous les cul-de-sac (cliquez dessus pour agrandir) :
Image Trackmania de Labyrinthes

Et puis je me suis aperçu que les blocs avaient la possibilité d’avoir des néons incrustés, et que les tournants étaient éclairés, j’ai essayé de voir ce que ça donnait en mode nuit, et c’est vraiment beau (cliquez dessus pour agrandir) :
Image Trackmania de Labyrinthes

J’ai recalculé le même labyrinthe afin que vous puissiez comparer avec et sans les améliorations (cliquez dessus pour agrandir) :
Image Trackmania de Labyrinthes
Image Trackmania de Labyrinthes

Et le même labyrinthe en mode nuit (cliquez dessus pour agrandir) :
Image Trackmania de Labyrinthes

Ensuite, j’ai trouvé d’autres types de blocs dont j’ai pu me servir pour améliorer encore le rendu, et faire des tunnels. Le rendu de nuit des tunnels est encore plus joli (cliquez dessus pour agrandir) :
Image Trackmania de Labyrinthes

Et puis les dernières captures, qui concernent le seul circuit que j’ai entièrement validé, sur douze étages (cliquez dessus pour agrandir) :
Image Trackmania de Labyrinthes

Et comble de joie, le dernier étage a en plus le tout dernier type de tunnels que j’avais implémenté, mais il ne sort que très rarement sur les labyrinthes qui ne sont pas très larges (celui ci fait 4×4) (cliquez dessus pour agrandir) :
Image Trackmania de Labyrinthes

Gimp, scripting et Python-fu : exemple par la transformation d’une image PNG en image transparente

J’ai été plus loin dans l’automatisation de Gimp.

J’ai voulu reprendre mes deux articles qui parlaient de Script-fu : le premier pour débuter ici, et le second qui passe à peine à la vitesse supérieure, qui explique l’assignation des variables ici.

Mais comme je suis un grand fan de Python et que tout a été fait pour pousser Python en avant dans Gimp, j’en ai profité.
Trois heures de travail avant d’y arriver.

Première chose à savoir :

On parle de script Python, mais ce sont des plugins.
Donc, lorsqu’on les installe, il faut les mettre dans le répertoire ~/.gimp/plug-ins/ et non pas ~/.gimp/scripts/.

Deuxième chose :

Ils doivent être exécutables. Donc :

chmod +x ~/.gimp/plug-ins/monscript.py

Troisième chose :

Enfin, allez chercher des exemples ici : http://registry.gimp.org/

Vous les installez et vous les lancez à partir de là vous avez tout ce qu’il vous faut.
Si vous avez lu ces trois informations avant de vous lancez dans l’aventure je vous aurais probablement fait gagner au moins une demi-journée.

Enfin, pour que la ligne de commande fonctionne sur les dernières versions de Gimp (2.6.8) à l’heure de l’écriture de cet article, il y a plein d’articles obsolètes sur le net. Je vais encore vous faire gagner des heures de recherche :

Voici un exemple complet d’un lancement en ligne de commande qui fonctionne :

gimp -i --batch '(python-fu-batch-to-transparent-indexed RUN-NONINTERACTIVE "/home/olivier/Bureau/france.php.png" "/home/olivier/Bureau/france.2.php.png")' -b '(gimp-quit 0)'

Et voici mon plugin tout simple que j’ai codé en 15 minutes, mais avant d’arriver là j’ai cherché pendant six heures…

Cliquez ici pour le télécharger.

Ce plugin transforme une image PNG en la même image, mais en transparente et en couleurs indexée.
Il n’est pas 100% terminé, car la couleur de transparence est codée en dur, mais il fonctionne très bien pour peu que votre couleur soit le blanc 🙂

Pour ce qui est de la méthode, je me suis très fortement inspiré de ce site.

Si je vous ai aidé n’hésitez pas à me laisser un message !

Awstats et activation de plugins

Lorsque vous installez awstats (un outil pour faire des jolies statistiques de fréquentation), certains plugins sont désactivés par défaut :

  • decodeutfkeys
  • ipv6

(entre autres).

L’astuce est extrêmement simple :

Il suffit de lire les commentaires dans le fichier et de lire les modules requis :

Cherchez # REQUIRED MODULES

Respectivement, pour les deux modules :

  • Encode and URI::Escape
  • Net::IP and Net::DNS

En gros il faut installer ces « plugins Perl » Encode, URI::Escape, Net::IP et Net::DNS.

Les ordres à taper sont hyper simples : il vous suffit, en ligne de commande, de :

  • lancer la console d’outils Perl
    (ce n’est peut-être pas exactement cela, mais je le vois comme ça) : tapez
    cpan
  • puis tapez install "nom du module"
  • install Encode
  • install URI::Escape
  • install Net::IP
  • install Net::DNS

Et à chaque ordre, lorsque vous validez par la touche entrée, toute une liste de modules s’installent, et à la fin… tout fonctionne comme par magie !

ExtJS et PhoneGap : une nouvelle façon de voir les choses

Comme je l’ai toujours dit, ExtJS est une librairie JavaScript extrêmement puissante.
Le seul problème c’est qu’elle est dure à maitriser… mais les résultats obtenus sont incroyablement beaux par rapport au temps de développement.

La même société, Sencha, qui n’est constituée – apparemment – que de personnes très compétentes, a développé le même système, mais pour téléphones portables : le Sencha Touch.

Et ils se sont penchés sur ce que j’appellerai le site du moment : PhoneGap.

Ils ont fait un tutoriel qui vous permet de combiner la puissance de PhoneGap et de Sencha Touch :

http://www.sencha.com/learn/a-sencha-touch-mvc-application-with-phonegap

J’expliquerai plus en détail dans un prochain article comment fonctionne PhoneGap, mais à mon avis, c’est l’avenir pour des développeurs comme moi qui n’ont pas le temps de se pencher sur les plateformes mobiles spécifiques : je n’ai pas le temps d’apprendre tout iOS et je n’ai pas le temps d’apprendre Android. Par contre je connais bien JavaScript, je commence à bien connaitre HTML5, et grâce à PhoneGap, on peut aller loin, très loin 😉

YSlow : Utiliser des domaines sans Cookie : traduction

Je viens de traduire un gros morceau du texte ici.

Lorsque le navigateur fait une requête pour une image statique, il envoie tout de même les cookies dans la requête. Le serveur ne se sert absolument pas de ces cookies. Ils créent donc un traffic supplémentaire totalement inutile. Il faut s’assurer que tous les composants statiques tels que les images sont récupérés sur des domaines sans cookie. Par exemple, il suffit de créer un sous-domaine static, et d’y mettre les composants adéquats.
Par exemple, si le domaine est www.example.org, il suffit de mettre les composants statiques sur static.example.org. Néanmoins, si vous avez déjà mis en place des requêtes sur le domaine de plus haut niveau, soit example.org, alors les cookies suivront tout de même sur static.example.org. Une solution est d’acheter un nom de domaine dédié.
Par exemple, Yahoo! utilise yimg.com, Youtube utilise ytimg.com et Amazon utilise images-amazon.com.
Un autre bénéfice concerne les proxies : certains proxies refusent de mettre en cache des composants qui ont été demandés avec des cookies. Pour la note, si vous vous demandez s’il vaut mieux utiliser example.org ou www.example.org pour votre page de base, pensez à l’impact des cookies. Le fait de supprimer www ne vous laissera pas d’autre choix que d’écrire des cookies qui seront tous diffusés sur *.example.org.
Donc, pour des raisons de performance, c’est mieux d’utiliser le sous domaine « www » et d’écrire les cookies pour ce sous-domaine.


Vous ne voyez pas que je suis en train de pleurer ? J’ai tout faux sur la plupart des sites Internet que j’ai crée. Bon, aujourd’hui c’est nettement moins problématique que si nous étions dix ans en arrière, mais c’est très agaçant de savoir que tout le travail mis en place est à revoir (règles de réécriture, traducteur, etc)… et le discours que je tenais qui va avec (pas la peine des www). On en apprend tous les jours !

Delphi Embarcadero et RxLib : comment installer les composants

Il risque de vous afficher un problème de SizeOf :
Il vous faut juste préciser que c’est le SizeOf de l’unité Systems, donc :

System.SizeOf()

Puis ouvrez le fichier RxConst.pas :

Il manque simplement le define 220 : ajoutez après tous les define jusqu’au 210 :

{$IFDEF VER220}
const
SDelphiKey = 'Software\Embarcadero\BDS\8.0';
{$ENDIF}

Et vous pourrez compiler puis installer les composants.
Ce sont deux petites astuces simples, mais si je les avais eues, j’aurais gagné… deux heures 😉

Windows Vista / Seven : fichier hosts introuvable : la solution

Vous n’arrivez pas à ouvrir le fichier hosts pour y rajouter ce que vous voulez ?
Très simple pourtant… quand on connait l’astuce !

Tout d’abord, si vous essayez d’ouvrir le fichier hosts, il faut aller dans le dossier
[disque:][répertoire windows]\system32\drivers\etc
en général, comme pour moi c’est :
C:\Windows\system32\drivers\etc
Mais si vous essayez d’ouvrir, vous allez voir que le répertoire n’existe pas !
En fait il est caché, il est invisible :
Windows dossier etc invisible

Il vous suffit juste de taper à la main « etc », comme si vous saviez qu’il était la :
Windows dossier etc invisible et il faut taper etc

Et de la même façon, le fichier hosts est invisible :
Windows fichiers hosts invisible

Il vous suffit juste de taper à la main « hosts », comme si vous saviez qu’il était la :
Windows fichier hosts invisible et il faut taper hosts

Ensuite, une fois que vous l’aurez ouvert dans votre éditeur favori (beaucoup utilisent Notepad++, moi c’est Pspad, mais c’est la même chose dirons-nous), vous ne pourrez pas sauvegarder tant que vous n’aurez pas modifié les autorisations. Comment faire ? C’est très simple, le résumé en image :

Windows comment modifier les autorisations du fichier hosts

Explication : il faut cliquer avec le bouton droit sur le fichier, choisir « propriétés », puis changer les autorisations, et mettre « contrôle total » pour tous les utilisateurs.

Attention, c’est assez dangereux, cela signifie que tout le monde peut écrire dedans, et si vous installez un virus, il pourra écrire dedans, comme tout le monde.

A vous de voir, mais je n’ai jamais eu, en 17 ans de développement, de virus… enfin il faut dire que j’utilise Linux 50 % du temps aussi !

Comme d’habitude, j’espère avoir apporté un peu de savoir à la communauté et que je vous aurai évité de perdre du temps dans des choses inutiles !

vim : exemple concret de conversion de fichier C en fichier Pascal

Voici un aperçu des petites choses possibles avec les macros vim.
J’avais un énorme fichier include (fichier fmod.h) à convertir en Pascal, afin de pouvoir accéder à l’extraordinaire librairie de fmod. Pour information, cette librairie est gratuite et redistribuable en tant que telle si votre produit est gratuit et ne vous rapporte rien. Donc profitez en c’est une librairie aussi simple d’utilisation que puissante et stable.

Je vous explique juste le principe de base, avec un exemple concret, et vous verrez qu’il vous suffit de faire pareil pour les quelques autres conversions, et vous gagnerez quelques minutes, voire comme dans mon cas, quelques heures de travail (que vous auriez inévitablement perdues avec un autre éditeur) :

Voici un exemple de déclaration C :

typedef FMOD_RESULT
  (F_CALLBACK *FMOD_FILE_OPENCALLBACK)
    (const char *name, int unicode,
      unsigned int *filesize, void **handle, void **userdata);

La fonction finale déclarée en Pascal doit être ainsi :

FMOD_FILE_OPENCALLBACK =
  function (
    const name:Pchar; unicode:Integer;
    var filesize: Cardinal; handle:Pointer;
    userdata:Pointer):FMOD_RESULT;

Je vais vous expliquer les premiers pas : il faut convertir ces paramètres :
void **handle, void **userdata)
en :
handle:Pointer; userdata:Pointer)

Le principe des macros avec les expressions régulières est très simple, je vais la construire pas à pas :

– Va chercher la première chaine qui est void ** :
void \*\*\
Notez bien que comme les étoiles * sont des caractères d’expression régulière, il faut mettre un antislash \ pour qu’elles ne soient pas interprétées.

– Va chercher la première chaine qui est void ** et qui est suivie d’une chaine composée de au moins un caractère minuscule comprise entre a et z :
void \*\*\([a-z]\+\)
Au même titre que les étoiles *, et les antislashes \, les parenthèses () sont des caractères d’expression régulière, il faut mettre un antislash \ pour qu’elles ne soient pas interprétées.
Oui je le concède ça rend la lecture un peu difficile. Mais le temps gagné en vaut la chandelle croyez moi.
– Va chercher la première chaine qui est void ** et qui est suivie d’une chaine composée de au moins un caractère minuscule comprise entre a et z, et qui se termine par une virgule :
void \*\*\([a-z]\+\)\(,\{1\}\)
Ici aussi notez le \{1\} : ici, les crochets \{\} sont des caractères d’expression régulière donc il ne faudrait pas mettre d’antislash, mais comme il sont dans une expression qu’on recherche, il les faut. Bref, essayez une fois avec, une fois sans, et l’un des deux fonctionnera !

Expression finale :

Remplace toutes les chaines de type void **[caractères de a à z], par [caractères de a à z]: Pointer;  :
:%s/void \*\*\([a-z]\+\)\(,\{1\}\)/\1: Pointer;/g

Ainsi :
void **handle,
donnera :
handle: Pointer;.

Mais (et c’est là où c’est génial) :
void **autrenomdevariable,
donnera :
autrenomdevariable: Pointer;.

Et cela s’appliquera sur tout le fichier, quel que soit le nom de la variable.

Ensuite, il vous suffit de vous concocter toute votre séance de petites macros, et de les mettre dans un fichier.
Puis vous appelez :

vim -s macro_vim.cmd [nom du fichier]

et vim jouera la macro dessus.

WordPress, Php et XML rpc – how-to. Explication

WordPress est un outil formidable. Il offre la possibilité d’envoyer des articles à distance.
Pour ce faire, entre autres, les développeurs ont crée une page qu’il faut appeler en lui passant les paramètres adéquats.
Cette page est située à la racine de l’installation de votre site WordPress. Par exemple si vous avez installé WordPress sur http://monsite.com/wordpress/, il faudra appeler la page http://monsite.com/wordpress/xmlrpc.php

Passons maintenant aux choses sérieuses : comment automatiser un envoi d’articles en php ?
C’est extrêmement simple. Je vous donne les indices, et à partir de là, à vous de finir de développer afin d’atteindre votre objectif.

Première chose : il faut que le PC qui doit envoyer les articles ait Php d’installé, avec le support XML rpc. Dit autrement, il faut qu’il soit compilé avec l’option --with-xmlrpc, ce qui n’est pas le cas par défaut. A vous de vous débrouiller tout seul pour arriver à activer l’option. Si vous êtes sous Linux, et que vous avez tout compilé à la main, comme un bon guerrier que vous êtes, il vous suffit d’afficher une page qui éxecute "phpinfo();" et Php vous affichera la ligne de compilation, il vous suffira de recompiler avec l’option --with-xmlrpc.

Une fois cette tâche terminée, il vous faudra activer sur le site WordPress concerné, l’option XML rpc. Il faut se connecter en tant qu’administrateur, aller dans le menu Réglagles » Ecriture » Publication à distance et cocher l’option XML-RPC.

Enfin on y arrive, le code qui se connecte et envoie quelque chose !

  1 <?php
  2 /* Exemple WordPress, Php et XML rpc  */
  3
  4 $request =
  5   xmlrpc_encode_request(
  6     "wp.getUsersBlogs",
  7     array("nom_d_utilisateur", "mot_de_passe")
  8   );
  9 $context =
 10   stream_context_create(array('http' => array(
 11     'method' => "POST",
 12     'header' => "Content-Type: text/xml",
 13     'content' => $request
 14   )));
 15 $file = file_get_contents(
 16   "http://monsite.com/wordpress/xmlrpc.php", false,
 17   $context);
 18
 19 $response = xmlrpc_decode($file);
 20
 21 if ($response && xmlrpc_is_fault($response)) {
 22     print(utf8_encode(
 23       "xmlrpc: $response[faultString] ($response[faultCode])"
 24     ));
 25 } else {
 26     print_r($response);
 27 }
 28 ?>

Donc là vous avez le code.
Pour terminer, toutes les fonctions disponibles sont ici : http://codex.wordpress.org/XML-RPC_wp.
Elles ne semblent pas trop à jour, alors si vous voulez la liste réelle, regardez votre dans le blog, le fichier ./wp-includes/class-wp-xmlrpc-server.php, la fonction wp_xmlrpc_server().
Vous y verrez toutes les fonctions que vous pourrez appeler en XML RPC.

C’est tout de même bien mieux de se faire son outil qui fait les envois d’articles à distance, plutôt que d’en acheter un, non 🙂 ?

Facebook en ligne de commande : le howto !

Traduction de l’article ici :
http://fbcmd.dtompkins.com/

C’est tout simplement un bon script en php, à lancer en ligne de commandes. Bon, comme le dit l’auteur, il ne faut surtout pas en abuser et faire un bot qui irait aspirer plein d’informations, hein !