mind.dump()

Random thoughts...

From Dotclear to Octopress

| Comments

After more than four years of inactivity on my personal blog (I’ve been busy blogging professionally in the meantime), I’ve decided to migrate my old blog to Octopress.

Several reasons for this. The first one is mostly that I don’t believe Dotclear has a future anymore. At the time I chose Dotclear over Wordpress, it was in very active development, going from 1.x to 2.x with regular release and a very active community: it was a promising software that could have fought side by side with wordpress. Morevoer, it was a french software.

However, Dotclear is probably to much of a carbon copy of wordpress: same technology (PHP), same admin architecture, … to make the difference. Wordpress is backed by a dedicated compagny, and Dotclear which is made as a hobby project just can’t catch up. As a consequence, there is no technical reason to use dotclear over wordpress anymore: the later has a much more active development pace, a wide ecosystem and a very active community… Dotclear has been completely forgotten: only its own community care about it. Tools such as Disqus don’t provide any integrated solution for dotclear, leaving users to hack the code of their theme if they wish to integrate that kind of service. Even tools that aims at providing migration utility to other blogging platform don’t list Dotclear as a source platform.

The second reason is that I find it completely overkill to run some PHP to serve a near-static content. My blog has not been update for 4 years, but every time someone reads a page, it goes through some PHP. PHP may be (have been) great for dynamic sites, but not for delivering content: it consumes resources and may contain security hole. The sole dynamic part of the site that is user-facing is the comment system… however nowadays services like Disqus, Google or Facebook can be integrated in your site for this in just a few lines of HTML/javascript (and by selling your soul to the devil): you may have an interactive site with only static pages.

So, its done, my site has been migrated to a new static platform and is hosted by github (which wasn’t mandatory but frees me from a bit of system administration). I couldn’t find any packaged tool to perform the migration so I wrote one small script by myself. If the script is of interest for you here is how to proceed:

  • export the database and the media library of your blog from Dotclear maintenance page
  • unpack the media library in the source/assets directory of Octopress
  • run the Python script on the database export (which should be named python dotclear-octopress.py <date>-<blogname>-<backup>.txt (the scripts runs in Python and requires pip install phpserialize)
  • the script should have generated a new directory that contains a series of .csv file and a subdirectory called _posts that contains the markdown pages for your old blog posts.
  • copy the content of _posts to source/_posts of Octopress.

At this point, the result is not perfect (but I’m sure the script can be improved), you’ll still have to go through your posts and check that they were properly markdownified (Dotclear source text is in a Dotclear-specific wiki syntax, the script tries to do the conversion, but it is not 100% accurate and will miss some corner cases).

The script also dump a file rss.xml that contains the extended RSS format that can be used to import discussions on Disqus.

Yet Another Policy Daemon for Postfix

| Comments

MadCoder announced it months ago, he has been working on the pfixtools. The second tool of the postfix-related toolsuite is named postlicyd.

postlicyd is a versatile policy daemon written in C. It does greylisting (far faster than postgrey), it performs R(H)BL access (both locally directly from rbldns zone files and remotely by using DNS), … So, it can be used as a replacement for whitelister and postgrey with a significant improvement of the performances.

On the same server (with the same email trafic), postlicyd is more than 20 times faster than postgrey:

  • Process load: postgrey ~20% CPU, postlicyd less than 1% CPU
  • Data base cleanup for 1M entries: postgrey 20 minutes, postlicyd 40 seconds

Moreover, it is aware of the ‘session’ feature of the POLICY protocol. Thus, you can write complex configurations and define policies that do not depend on a single SMTP command (like RCPT) but on the whole SMTP transaction…

More informations: [http://pfixtools.mymind.fr]

Polytechnique.org Lance Son Blog

| Comments

Voilà… cela fait assez longtemps que nous recevons des demandes d’utilisateurs pour la mise en place de blog via Polytechnique.org. Afin de préparer la mise en place de ce service, Polytechnique.org lance son blog. Cela permettra à la fois :

  • de tester l’outil d’intégration de l’authentification de Polytechnique.org dans Dotclear.
  • d’offrir une nouvelle plateforme souple et conviviale pour informer nos utilisateurs.

Je ne vais pas m’étendre davantage vu que ce ne serait que recopier le post d’Aymeric

Vieux Trucs

| Comments

Un peu de nostalgie. Je suis retombé sur de vieux programmes que j’avais fait pour ma calculatrice (TI-92) quand j’étais en 1ère/Terminale. A mon époque (pas si lointaine… j’ai passé mon bac en 2001), ces outils couvraient le programme de Terminal S (spécialité maths) avec :

Encodage Et Terminal

| Comments

Beaucoup de personnes avec qui je discute sur IRC ont des problèmes avec l’encodage de leur terminal, de leur shell, de leur irssi, ou de tout autre logiciel en “ligne de commande”. Comme j’en ai un peu marre d’expliquer la même chose toutes les semaines, voici une petite mise au point sur les réglages à faire pour travailler efficacement en ligne de commande.

Afficher Des Discussions

| Comments

Lorsqu’un logiciel a pour vocation d’afficher des discussions, on attend de sa part qu’il nous permette de voir simplement qui répond à qui, dans quel contexte… Ce n’est pas toujours ce qui est le mieux fait. Par exemple, les programmes de fora en ligne à la mode (phpBB par exemple) affiche les discussion comme une succession de rectangles juxtaposés et seul le contenu du message permet de voir qu’il en cite un autre. D’autres logiciels comme Mail.app ont ce défaut et parfois la fâcheuse manie de ne pas vouloir corriger ce problème.

L’affichage de l’arborescence dans Banana est une des fonctionnalités clés… et elle va beaucoup changer dans la prochaine version.

15 000

| Comments

Ca y est… 15 000 inscrits à Polytechnique.org.

15.000 inscrits

Si l’ascension continue, nous devrions atteindre les 16 000 l’année prochaine.

Compter Les Fichiers

| Comments

C’est un peu la suite de mon post “Outils pratiques” où je donnais deux scripts permettant de rendre les commandes SVN plus conviviales. Encore une fois, je réinvente sans doute la roue (des outils équivalents doivent déjà exister… sans doute en mieux), mais je pense que chercher ce genre d’outils sur internet m’aurait pris plus de temps que ce qu’il m’a fallu pour le développer.

En ce moment je manipule des fichiers, beaucoup de fichiers (et même, beaucoup de gros fichiers), que j’ouvre, rouvre, et ferme et puis referme. Et à force d’ouvrir, on oublie parfois de refermer, et là, c’est comme une fuite de mémoire, sauf que le nombre limite de fichiers ouverts est beaucoup plus rapidement atteinte que la limite de mémoire… dans la configuration de base sur un linux, un programme n’a le droit qu’à 1024 descripteurs de fichiers. D’où mon problème : comment traquer les “file-handle leaks” ?

Templates en C

| Comments

En C++, il existe un mécanisme extrêmement pratique pour généré du code générique : les templates. Une fonction templatée est une fonction dont le code comporte un trou qui sera remplacé à la compilation par le nom d’un type, ou une valeur… Par exemple :

template <class T> 
T read(const char *buffer) 
{
    T val;
    memcpy(&val, buffer, sizeof(T));
    return val;
} 

Cette fonction lit un objet de type T sur un buffer. L’intérêt de cette fonction est très compréhensible : quel que soit le type qu’on fournit à la fonction, elle va fonctionner, en adaptant la taille à lire au type. C’est donc beaucoup plus rapide que d’écrire une fonction pour chaque type… et l’utilisation est également très simple :

read<int>(const char* buffer) // lit un entier sur le buffer
read<double>(const char* buffer) // lit un double sur le buffer
read<MaClass>(const char* buffer) // lit un objet de type "MaClass"

Mais cette syntaxe n’est qu’un sucre syntaxique, car en fait, on peut également faire des templates en C…

Comprendre Du Code

| Comments

J’ai tenté cet après-midi une petite expérience sur IRC. J’ai posté 3 lignes de code en demandant “que font ces trois lignes”. Après quelques minutes (sans doute trop peu), j’ai donné la solution car personne n’avait vraiment trouvé. En effet, même si on réussi facilement à lire le code et à reconstituer la suite d’opération qu’il génère, il est très difficile de vraiment comprendre ce qu’il fait, d’imaginer son application dans un contexte et d’en déduire son usage.

Juste pour continuer à m’amuser, et pour amuser ceux qui se perdraient ici, voici le code en question.