dimanche 31 août 2008

Icônes

M'intéressant maintenant à une barre d'outils digne de ce nom, je me suis attaqué à la création d'icônes. Malgré de très bon tutoriaux, mon oeuvre demeure du "programmer's art", mais au moins, la bonne idée à piocher, c'est d'utiliser Inkscape. Voilà donc une icône censée représenter un carnet:



Et voilà la grande taille, éditée avec Inkscape:

mercredi 20 août 2008

Être ou ne pas être thread safe

Je codais il y a de cela quelques jours une petite interface pour visualiser nos queues de messages. En programmeur soucieux de la réactivité de mon interface graphique, je me décidais de placer chaque connexion vers chaque queue dans son propre thread.

O tempora, O mores, que n'avais-je pas fait là! Après quelques minutes de tests, des crash intempestifs sont venus me rappeler que les threads ne pardonnent pas l'à-peu-près. En plongeant dans le débuggeur, je n'ai pas tardé à trouver que chaque connexion, apparemment indépendante de ses copines, se retrouvait de fait référencée dans une obscure map au fin fond d'un singleton (argh!), et que cela me mettait dedans.

En effet, la libraire d'accès aux queues, en C, avait été gentiment wrappée en C++, ce qui est bien, mais avec de discutables (et impossibles à désactiver) optimisations qui partagent la connexion sous-jacente, ce qui est moins bien. Kaboum, donc.

Je suis donc revenu à un design bâtard, où les connexions sont toutes dans le même thread, séparé du thread principal de l'interface. C'est donc moche, et vachement moins efficace. Grrr!

samedi 16 août 2008

rdbuf

Mieux vaut tard que jamais, après quand même un bon paquet d'années à codouiller en C++, l'on vient enfin de me faire découvrir une bonne manière de balancer un fichier dans une chaîne. Jusqu'ici, je faisais:


std::ifstream str("input.txt");
std::string s;
std::getline(str, s, '\0');

Ça fonctionne à peu près, sauf si le fichier contient un beau nul. Pour le texte, ça va, mais c'est encore un peu long. Entre le rdbuf!

std::string s =
boost::lexical_cast(std::ifstream("input.txt").rdbuf());

Voilà. C'est quand même plus simple, non?

mardi 12 août 2008

Postgis

J'ai pas mal taquiné Postgis, récemment. Postgis, c'est un ensemble d'add-ons à Postgres, qui permettent de charger et de traiter des données géographiques.



Voici par exemple ce que cela donne en sauvant des donnés d'Amérique du nord dans Postgres, et en les chargeant ensuite dans qgis.

L'add-on va fournir à Postgres des types supplémentaires, de nombreuses fonctions géométriques, et un autre type d'arbre permettant d'indexer très efficacement les données géographiques.

Je me suis dit que ce genre d'environnement me semblait particulièrement adapté à la programmation de wargames! En cherchant un peu sur le net, l'on peut trouver des cartes du monde tout à fait raisonnables. Ensuite, la base de données se charge de trouver, pour une position donnée, si elle est située dans un pays ou sur l'eau, si elle est à distance d'un "point d'intérêt" (une unité, par exemple, ou une ville?). De même, il est alors trivial de définir un chemin à faire suivre par une unité, et à détecter à quel moment l'unité passe la frontière, ou se retrouve sur l'eau.

Ajoutez une petite couche applicative, un client web ou lourd (j'aurais une petite préférence pour le lourd, mais le web rend l'ensemble bien plus accessible... Une applet Java, peut-être?), et l'on a un bon départ pour un jeu de stratégie léger et fun.

Connaissez-vous Colonial Conquest? J'y ai passé de nombreuses heures de ma tendre enfance, sur Atari ST.



Un des points forts du jeu était de pouvoir effectivement conquérir le monde, en plaçant sous son égide des territoires qui correspondaient à quelque chose. Pas très éthique, peut-être, mais très bon pour la géographie, en tous cas!

Postgis fournit la plupart des briques de base pour le back-end d'un jeu de ce type (le seul point difficile étant de gérer les pays limitrophes, et les pays ayant un accès à la mer, mais il doit y avoir moyen). Qui se lancera?

Peu de liens directs avec AdH, en tout état de cause. Il faut dire, ce n'est pas vraiment la même échelle! Cependant, l'on pourrait probablement l'utiliser pour gérer la carte. Dans tous les cas, c'était très instructif.

(Capture de Colonial Conquest piquée ici)

vendredi 8 août 2008

Retour de vacances



Je vais donc pouvoir me remettre doucement au système des marchés!