lundi 31 octobre 2011

Mélanger pqxx et wxWidgets

Une part non négligeable du boulot de développeur est de convertir des données d'un format vers un autre pour faire causer deux composants séparés.

Alors, pour une fois que c'est simple, l'on ne va pas bouder notre plaisir. C'est que le concepteur de libpqxx a eu la bonne idée de fournir des type traits pour passer ses propres types à la base de données pour les requêtes préparées.

Si l'on veut donc pouvoir sauver des chaînes de caractères wxWidgets (wxString) ou des dates (wxDateTime), il suffit d'implémenter le trait qui va bien. Cela ressemble à ça:


namespace pqxx
{
template<> struct PQXX_LIBEXPORT string_traits<wxString>
{
static const char * name() { return "wxString"; }
static bool has_null() { return false; }
static bool is_null(const wxString &) { return false; }
static wxString null()
{ internal::throw_null_conversion(name()); return wxString(); }
static void from_string(const char Str[], wxString & Obj)
{ Obj = wxString(Str, wxConvUTF8); }
static PGSTD::string to_string(const wxString & Obj)
{ return std::string(Obj.mb_str(wxConvUTF8)); }
};

template<> struct PQXX_LIBEXPORT string_traits<wxDateTime>
{
static const char * name() { return "wxDateTime"; }
static bool has_null() { return false; }
static bool is_null(const wxDateTime &)
{ return false; }
static wxDateTime null()
{ internal::throw_null_conversion(name()); return wxDateTime(); }
static void from_string(const char Str[], wxDateTime & Obj)
{ Obj.ParseDateTime(wxString(Str, wxConvUTF8)); }
static PGSTD::string to_string(const wxDateTime & Obj)
{ return std::string(Obj.Format().mb_str(wxConvUTF8)); }
};
}


L'on indique simplement comment convertir une PGSTD::string (qui est en fait une bête std::string) dans le type de travail, et basta, avec ça, les appels du type
T.prepared("statement")(wxString1)(wxString2)(wxDateTime1).exec();
passent comme une lettre à la poste.

dimanche 30 octobre 2011

La punchcard de github

J'aime bien le graphique "punchcard" de github. Pour Médoc, par exemple, l'on voit bien que je ne suis pas un matinal, et que je code le week-end et en soirée (forcément, le reste du temps, je code pour manger). Plus étrange, il semble que je sois plus productif en début de semaine qu'en fin.

L'on pourra comparer (façon de parler...) avec la punchcard du noyau linux, où les développeurs travaillent principalement la semaine entre 9h et 17h.

Je suis plutôt satisfait de GitHub, non que j'utilise plus d'un pouillème de ses fonctionnalités. Le push est très rapide, le site réactif, et les stats rigolotes.

samedi 22 octobre 2011

std::lower_bound

Imaginons que l'on veuille enregistrer une série de segments [a; b[, et à partir d'un point donné, rapidement retrouver le segment auquel il appartient. Typiquement: sachant que chaque événement court entre deux dates, pour une date donnée, trouver de quel événement il s'agit.

  • Comment donc placer ses segments dans une structure pour s'y retrouver simplement et efficacement?

  • Et comment gérer plusieurs segments qui se chevauchent?

mardi 18 octobre 2011

Médoc - Dernières nouvelles

Belles améliorations ce week-end de la partie import. J'ai découvert que je m'étais planté sur le nombre d'options disponibles, et qu'il y en avait de fait bien plus. Deux options en particulier:

  • La length-measurement: mon scanner HP considère (et renvoie via l'API) que la longueur de la page est environ deux fois plus grande que la largeur. Par défaut (l'option Padded), il ajoute donc une grande bande blanche en dessous de la page standard 210x297. Mais en mode Approximate, il me renvoie un signal de fin de données lorsqu'il arrive à la vraie fin de la page.

  • Le batch-scan: sans cette option, le scan à plat fonctionne normalement, mais le scan déroulant pour plusieurs documents s'y perd, et après la dernière page se met à scanner des pages vides jusqu'à ce que l'on termine le job manuellement. Avec l'option, il s'arrête à la dernière page, mais c'est alors le scan à plat qui refuse d'avancer! Il n'est pas sûr que j'arrive à trouver la combinaison d'options qui marche tout le temps, donc il va peut-être falloir que l'utilisateur indique s'il compte scanner une seule ou plusieurs pages.

Ceci dit, et pour peu que l'on fasse attention aux options, l'import est parfaitement fonctionnel. Quelques options supplémentaires, comme le réarrangement des pages, ou la rotation d'une image, seront utiles, bien sûr. Mais maintenant, le minimum nécessaire pour rendre l'outil utile est d'implémenter les fonctions d'export, vers une base de données Médoc, ou vers un pdf.

jeudi 13 octobre 2011

Et Jira se facebookise

Décidément, c'est la saison.

Atlassian Software est une petite boite australienne qui a fait son trou dans les outils collaboratifs, et notamment Jira, qui est un outil web de suivi de bugs, plutôt bien fait d'ailleurs.

Nous avons bondi de la version 3.7 à la version 4.4, et là, c'est le drame. Cette transition corrige quelques défauts qui étaient certes ennuyeux, mais mineurs, mais surtout propulse le système de suivi à l'ère Facebook. Fausse bonne idée? Probablement.

Flux RSS de partout, avatars personnalisés, aucun doute, c'est du Web 2.0.

Que vous aimiez Ajax ou pas, vous aller en manger. L'ensemble de la plateforme, et plus particulièrement l'écran principal (le "dashboard") est maintenant asynchrone. Au démarrage, plutôt que de voir ses filtres habituels (typiquement, la liste des bugs assignés), l'on a droit à des panneaux vides avec des petites barres de progression type enseigne de barbier, pour finalement afficher quelque chose d'intéressant plusieurs secondes plus tard. C'est la même chose pour ajouter un commentaire à un ticket, ou enregistrer son temps de travail. Le javascript est présent en doses pour rhinocéros, chaque menu est dynamique, chaque panneau ou section du bug peut se replier ou se déplier, et les différentes sections de la page peuvent être réarrangées par glisser déposer.

Le résultat, c'est un site beaucoup plus lent sous Firefox, et à peu près inutilisable sous Internet Explorer 8.

Mais c'est joli, ce qui a probablement été suffisant pour convaincre le manager kivabien de procéder à la mise à jour.

mercredi 12 octobre 2011

Project Euler fait peau neuve

Le site de Project Euler, le site de problèmes informatico-mathématiques, faisait un peu figure de dinosaure du Web. Eh bien, c'est fini, à la mi-Septembre le site web a été refondu en une version bien plus Web 2.0.

Le style est plus aéré, les statistiques ont été légèrement modifiés, et il y a maintenant un système de médailles basé sur les problèmes résolus, comme par exemple avoir résolu 50 problèmes liés aux nombres premiers, ou d'avoir résolu 12 problèmes au dessus du centième. L'on notera également un système de suivi permet de tenir ses amis à l’œil.

Les performances semblent avoir décru, et le site parait vraiment ramer. C'était parfois le cas avec l'ancien, donc difficile de savoir si c'est dû à une plus grande popularité, ou que le nouveau site cause une charge plus importante sur leurs serveurs. Ce n'est de toutes façons pas très gênant, ce n'est pas comme si je résolvais les problèmes si vite que leur chargement devienne fastidieux.

samedi 8 octobre 2011

Médoc et wxWidgets

Il est tentant de vouloir adapter les bibliothèques, au passé souvent chargé, aux concepts et techniques du C++ moderne. Et pourtant, principalement pour les projets assez indépendants, il vaut mieux s'asseoir un peu sur ses principes, et utiliser la bibliothèque de la manière qu'elle a été pensée.

Prenons la bonne vieille wxWidgets, avec laquelle je suis en train de créer mon client lourd Médoc. Elle utilise sa propre classe de chaines de caractères, afin de supporter plusieurs types d'encodage, ses propres tableaux dynamiques en place du bon vieux std::vector, et utilise des macros un peu partout.

J'ai tendance à importer immédiatement quelques utilitaires de base que je garde dans un coin, du genre conversion entre wxString et std::string. Mais pour Médoc, je crois bien pouvoir m'en passer: mes entrées comme mes sorties passant soit par wxWidgets elle-même, soit par des bibliothèques en C pur, il est plus cohérent de simplement utiliser des wxString partout.

Voilà donc, en 300 lignes, un programme qui permet de charger des images dans une liste, et de les afficher en cliquant dessus:



C'est maintenant que ça se gâte: remplacer la liste d'images par une vraie galerie, permettant d'afficher une miniature de l'image, et d'en changer l'ordre par du glisser-déposer.

lundi 3 octobre 2011

4 ans...

Je postais mon premier message sur ce blog le 1er Octobre 2007. 4 ans et 324 messages plus tard, les thématiques n'ont pas beaucoup changé (C++, OCaml, Postgresql, jeux vidéos). On a causé C++0x, on a causé Blender, on a même causé Emacs et astuces Debian.

Merci à mes lecteurs de chez l'université de Metz, de chez LinuxFR, de chez le "site du zéro", de chez Identi.ca (des Adaistes...) et de partout ailleurs de leur assiduité. Je leur souhaite de vouloir me lire encore pendant de nombreuses années, parce que j'ai bien des choses à dire!

Entre le C++0x qui va commencer à arriver en production dans divers systèmes à travers le monde, des nouveautés attendues dans Postgresql (je pense notamment aux ranges, qui je l'espère permettront de simplifier les bases de données historiques), les nombreux jeux que j'attends de pied ferme (Skyrim!), et diverses bêtises à partager, nous en avons pour un petit bout de temps.

@+!