Archive for February, 2009

Compiler GoatTracker sous FreeBSD

Saturday, February 28th, 2009

GoatTracker est un tracker produisant de la musique pour le Commodore 64. Il est disponible sous license GNU et est multiplate-forme.

Cependant, il n’a pas été porté sous FreeBSD, bien qu’il fonctionne bien sous Linux. Heureusement, grâce à quelques hacks simples, il est possible d’utiliser GoatTracker sous FreeBSD.

Avant tout, vérifiez que vous avez les ports/packages SDL d’installés, ainsi que GNU Make (“gmake”) différent du BSD Make par défaut (“make”). Il y a quelques différences dans la structure des Makefiles donc il faut utiliser l’un ou l’autre en fonction de ce qu’on compile.

Ensuite, procurez vous GoatTracker à cette adresse : http://covertbitops.c64.org/ (rubrique “Tools”).

Unzippez les sources dans un répertoire spécial crée à cette occasion, et placez vous dedans.

Avant de compiler GoatTracker, il faut compiler 2 outils qui seront nécessaires : datafile et dat2inc.

Placez vous donc dans le répertoire src/bme. Avant de lancer gmake, il faut modifier le Makefile car il est adapté à une machine Linux. Or, les machines Linux n’utilisent quasiment pas le préfixe /usr/local pour les includes. Le Makefile va donc chercher SDL_types.h dans /usr/include, alors qu’il est situé dans /usr/local/include. Pour corriger cela, il suffit d’ajouter ceci aux CFLAGS : -I/usr/local/include. Le makefile étant ici extrêmement simple, rajoutez cela aux deux appels à gcc.

Vous pouvez ensuite lancer la compilation avec gmake. Une fois que c’est terminé, vous devez copier ces deux exécutables produits dans votre $PATH, donc en gros vous devez copier les fichiers datafile et dat2inc dans /usr/local/bin.

Ensuite, placez vous dans le répertoire src. Cette fois, le Makefile est un peu plus complexe, vous devez rajouter -I/usr/local/include à la fin de la ligne CFLAGS= dans le fichier makefile.common. La compilation se passe ensuite sans problèmes.

Vous pouvez enfin jouer avec GoatTracker, l’exécutable étant situé dans le sous dossier linux/ et commencant par gt2. Enfin, voici une preuve que ça fonctionne :

GoatTracker

Related Posts:

Réfléxion à propos des includes (PHP)

Sunday, February 15th, 2009

Parlons includes. En général, lorsqu’on réalise un projet en PHP, on découpe le travail en plusieurs parties qui se répartissent donc logiquement en plusieurs fichiers. Pourquoi ? Parce que c’est en général plus simple de savoir où on est quand on manipule un fichier dont le nombre de lignes se rapproche plus de la centaine que du millier.

Cependant, gérer plusieurs fichiers est parfois délicat : on se retrouve confronté à des problèmes de répertoire, de path relatif difficile à prévoir et toutes ces subtilités. Et comme on décide de l’architecture d’un projet avant même de commencer le gros du code, on a vite fait de tout foutre en l’air à cause d’une mauvaise organisation. Evidemment, on ne peut jamais prévoir totalement les problèmes que causeront notre architecture choisie. Donc, au lieu de prévoir tous les problèmes possibles qui pourraient arriver, il est bien plus pratique de prévoir un système de base d’includes qui est flexible, c’est à dire que les modifications seront simples à effectuer. Changer 50 fichiers car on a besoin d’en renommer un autre est un gros problème de flexibilité par exemple. Il y a donc une bonne et une mauvaise façon de gérer ses includes.

The Bad Way

Cette méthode est malheureusement retrouvée parmi les débutants, car on la retrouve dans beaucoup de cours. C’est une mauvaise habitude pour des projets conséquents. Voyons pourquoi.

Imaginons cette architecture simple, retrouvée dans un paquet de projets (les noms sont fictifs) :

/lib
----/myFunctions.php
----/BDD.php
----/template.php
----/otherStuff.php
/requireMe.php
/index.php
/pageUn.php
/pageDeux.php
/pageTrois.php
/.htaccess

Dans cette organisation, on accède aux pages directement via leur URL (/index.php) ou via un URL Rewriting qui effectue une redirection silencieuse en arrière plan (c’est équivalent à la première méthode). Chaque page inclut le fichier requireMe.php, qui inclut les fichiers annexes contenus dans /lib. Donc, chaque page accède bien au code qui est commun.

Cette méthode est très rapide à mettre en oeuvre et très simple : elle est bien adaptée à l’Extreme Programming mais malheuresement elle n’est pas vraiment flexible. En effet, pour l’instant c’est simple, mais imaginez que vous ayez 50 pages à la racine. Si, un jour, vous avez besoin de changer quelque chose qui a un rapport avec requireMe.php (comme son nom, son emplacement, …), vous devrez modifier 50 fichiers. Amusez-vous bien à perdre du temps.

The Good Way

Maintenant, on passe à une méthode que je qualifie de “bonne”, enfin c’est mon avis subjectif. Il est quand même certain qu’elle est plus flexible que la mauvaise méthode.

On a une architecture de ce type :

/lib
----/myFunctions.php
----/BDD.php
----/template.php
----/otherStuff.php
/pages
------/index.php
------/pageUn.php
------/pageDeux.php
------/pageTrois.php
/main.php
/.htaccess

On accède aux pages via URL Rewriting uniquement. Cela permet de placer les pages dans un dossier spécial. Ce qui est important ici, c’est qu’on redirige TOUTES les requêtes au script main.php. Cela permet de n’avoir qu’une ligne dans le .htaccess, peu importe le nombre de pages. Et ça, c’est flexible.

Mais qu’est-ce qui change ? Tout le système est inversé, en fait. Le fichier main.php va analyser $_SERVER['REQUEST_URI'], inclure la bonne page (ou générer une erreur du type 404 ou autre), éventuellement utiliser des regex sur cette variable pour les URI du type /Article-27/1991/Janvier/27/ et inclure en plus des fichiers annexes contenus dans /lib. On ne retrouve donc aucun include dans les fichiers des pages : tout est regroupé dans le fichier main.php ; grâce à quelques constantes bien choisies, on peut s’adapter à, à peu près n’importe quoi en changeant un minimum de choses. Le système est inversé car ce n’est plus la page qui inclut les fichiers annexes, c’est un fichier annexe qui inclut la bonne page. Il n’y a dont plus qu’un seul fichier qui gère les inclusions : système souple.

Alors certes, je n’ai rien trouvé de révolutionnaire. Mais en général, quand on se rend compte que l’architecture est à chier, c’est trop tard. Il faut faire quelques bons choix dès le tout début. En résumé : n’incluez pas les fichiers annexes dans vos pages, incluez la page dans un fichier annexe spécial !

Related Posts: