Minbif 1.0alpha

Je vous parlais dans un autre billet du projet précédemment appelé BitlBee2, qui est une passerelle IRC vers des réseaux de messagerie instantanée.

Sur le site du projet se trouvent l'annonce de la release, incluant le ChangeLog et l'archive de la release.

Je dis précédemment appelé bitlbee2, tout simplement parce qu'en raison d'un conflit avec Wilmer, un des auteurs de BitlBee, suite à quelques échanges par email, puis des commentaires de sa part peu cordiaux sur mon autre billet, le projet a été amené à être renommé.

Cette version alpha a pour but de présenter le projet qui se trouve être dans un état utilisable, reprenant les principales fonctionnalités de BitlBee.

Du caca dans bitlbee

MAJ: Ainsi que l'on peut le voir dans les commentaires, j'ai tenté de contacter par email Wilmer, un des auteurs de bitlbee, afin de lui parler du projet et d'avoir son avis concernant l'éventuelle utilisation du nom bitlbee2 pour le projet. L'accueil a été très cassant, me demandant de changer le nom, et cherchant à critiquer le projet plutôt que de voir les bonnes idées que j'essaie de pratiquer dans ce projet.
Je reviendrai sur cette histoire dans un billet prochain. En attendant, le projet s'appelle maintenant Minbif.

Tout le monde connaît bitlbee, cette passerelle IRC vers des protocoles d'IM, qui a été créée il y a sept ans et qui est connu notamment pour son support Jabber désastreux.

Lorsqu'il fut créé, ce projet avait pompé du code de GAIM, un logiciel de messagerie instantanée d'abord orienté AIM puis qui est devenu multi-protocole. Bien évidemment, les récupérations upstreams se sont avérées faibles ou inexistantes, ainsi bitlbee bénéficie d'un support de très peu de protocoles : MSN Messenger, AIM, Yahoo et Jabber. En plus de ça, le code des protocoles de bitlbee est hacké de tous les côtés, et le support Jabber a mis très longtemps avant de devenir stable, même si il reste incomplet.
En outre, bitlbee ne supporte qu'une ancienne version du protocole de MSN Messenger (MSNP8 alors qu'on en est à MSNP15), qui ne supporte pas les transferts de fichiers, et est très peu robuste. Un patch avait été établi sur une ancienne version de bitlbee pour supporter le protocole MSN9 et MSN Plus!, mais il ne fut pas intégré à bitlbee, notamment en raison de fonctionnalités potentiellement coûteuses comme le transfert de fichier, posant d'éventuels problèmes sur leur serveur bitlbee public.

Ayant une installation propre de bitlbee, ne supportant plus les limitations de bitlbee, ne souhaitant pas m'attaquer au code incompréhensible (que j'avais eu l'occasion d'appercevoir lorsque j'avais fais un patch), et ayant du temps à perdre (bon ce n'est pas tout à fait vrai), je me suis donc lancé dans l'écriture d'une version 2 de bitlbee from scratch.

Écrit en C++, le grand apport de Bitlbee 2 est d'utiliser la libpurple, cette bibliothèque en C (avec la Glib) créée par et pour Pidgin, le nouveau nom de GAIM après un litige avec AOL, offre toute l'API nécessaire et suffisante pour créer des comptes permettant de se connecter à n'importe lequel des 13 protocoles supportés de base (sans compter les plugins) de façon transparente, gérer la liste des contacts, le transfert de fichier, etc.

Cherchant à éviter les défauts conceptuels de bitlbee, les changements fonctionnels seront (en partie) les suivants :

  • Suppression du robot root. Tout passe maintenant exclusivement par des commandes IRC.
  • Un compte est représenté par un serveur IRC. Ceux qui ignorent l'architecture d'un réseau IRC, celui-ci est composé de plusieurs serveurs reliés les uns aux autres, généralement en étoile.
  • La commande /map est utilisée pour lister les comptes, mais aussi en rajouter, en supprimer ou en modifier.
  • Pour se connecter à un compte, la commande à utiliser est naturellement /sconnect, et /squit pour s'y déconnecter.
  • Remplaçant l'identifiant numérique unique de bitlbee1, il y a maintenant deux manières de représenter un compte. L'identifiant court se présente sous forme <proto><num> ou sous forme longue (utilisée pour les serveurs) <username>:<proto><num>. Par exemple, romain@example.com:jabber0.
  • Chaque compte a son propre salon de statut. Il est également possible de faire partager le même salon de statut à plusieurs comptes.
  • Les salons de statut débutent par '&' alors que les salons sur IM débutent par '#'.
  • La commande /invite sera utilisée sur le salon de statut pour ajouter quelqu'un dans ses contacts.
  • La commande /kick pourra être utilisée pour retirer quelqu'un de ses contacts, et /ban pour bloquer le contact.

Le but à terme est de réimplémenter toutes les fonctionnalités de bitlbee à travers les commandes IRC, et des extra. Je me suis par exemple intéressé ce matin à réaliser ceci :

rendu ASCII-art de l'avatar avec libcaca

Malheureusement, libpurple ne supporte pas la webcam, ce qui est fort dommage, mais j'ai d'autres idées sympa en tête.

[C++] Des défauts du C++ (Part 2) : pointeurs de fonctions

Faisant suite au précédent billet, celui-ci va pointer une grande difficulté du C++, qui est la gestion des pointeurs de fonctions sur les objets.
Continue reading '[C++] Des défauts du C++ (Part 2) : pointeurs de fonctions'

blogit.vim

Cela faisait un moment que j'en avais marre de passer par mon navigateur pour écrire mes billets sur ce blog. Les raisons sont simples, tout d'abord j'utilise communément vim comme éditeur de texte, et il m'est assez insupportable d'écrire du texte dans les textarea Qt où je ne bénéficie pas des raccourcis et de ma configuration de vim. En outre, j'ai horreur du web, et je ne supporte pas de passer par l'interface d'administration de Wordpress que je trouve lourde de javascript.

C'est pourquoi lorsque pankkake m'a appris l'existence d'un script vim pour publier des billets Wordpress par XML-RPC, je fus enchanté.

Cependant, certaines choses de ce script ne me satisfaisaient pas. D'une part, je n'aimais pas la syntaxe des meta-data, je préférais afficher celles-ci dans le style mail, afin que cela me rapproche plus de l'écriture d'un e-mail avec mutt.
En outre, après édition du code source (qui, agréable surprise, est en Python), j'ai vu des horreurs du code, du style :

("".zfill(size-len(p["postid"])).replace("0", " ")+p["postid"])

Qui a en fait pour but de faire, en se compliquant la vie, ceci :

'%5d' % int(p["postid"])
# Ou pour être exact :
('%%%dd' % size) % int(p["postid"])

Il a également eu la bonne manie d'entourer chacune de ses fonctions par :

try:
    # ...
except:
    sys.stderr.write("An error occured")

Ce qui est très laid.

En bref, vu l'horreur que cela représente, j'ai décidé d'écrire un plugin de zéro afin de rendre ça un peu plus agréable à utiliser et le code un peu plus propre.

Ceci a abouti à ce super script blogit.vim, qui possède l'API suivante :

  • :Blogit ls — affiche la liste des articles (entrée sur un article l'édite)
  • :Blogit new — créer un nouvel article
  • :Blogit edit <id> — édite un article
  • :Blogit commit — enregistre l'article courant
  • :Blogit push — publie l'article courant
  • :Blogit unpush — retire la publication de l'article
  • :Blogit categories — liste les catégories
  • :Blogit rm <id> — supprime un article

blogit.vim est releasée en version 1.0.

Ce présent billet est d'ailleurs le premier écrit avec ce script, et j'espère que sa commodité d'utilisation m'incitera à écrire plus fréquemment :

screenshot
Billet écrit avec vim : coloration syntaxique, correction orthographique, fonction undo/redo, etc.

Où en est Peerfuse

Cela fait quelques temps que je n'ai pas donné de nouvelles de Peerfuse, je vais donc corriger ceci.

Un été actif

Ainsi que je l'avais raconté dans un billet précédent, il se trouve qu'une nouvelle version du protocole a été définie, plus sécurisée, utilisant moins de bande passante et ne nécessitant pas pour chaque pair à connaître tous ceux du réseau, ce qui permet d'avoir des réseaux de tailles non négligeables.

Le travail a débuté cet été avec l'aide de Eld et tito, le premier spécialiste des réseaux peer-to-peer, qui m'a aidé dans la réalisation du protocole, et le second contributeur plus connu pour avoir été président de l'association de jeux vidéos libres Nekeme Prod. (oui leur site est down), et qui a réalisé entre autres un serveur XML-RPC inclus dans Peerfuse, qui permettra à l'avenir de développer des frontends (graphiques ou non) avec une interaction plus user friendly avec Peerfuse.

Une charge de travail assez importante a été réalisée, et la DHT Chimera a été correctement importée. D'ailleurs, je pense que le mot « réécrite » corresponds davantage à ce qui a été effectué. En effet, tout d'abord la DHT était écrite en C, et j'ai adapté tout le code afin de correspondre au style C++ du projet.

En outre, j'ai séparé la partie réseau de la partie DHT, en réécrivant entièrement le moteur réseau de Peerfuse, beaucoup plus souple et extensible.
Ainsi, la DHT s'allège du code réseau de Chimera qui était, il faut bien l'avouer, complètement moisi (voir ici).

Peerfuse bénéficie d'ailleurs maintenant d'une meilleure architecture. Chaque partie de l'ancien common (la partie de code commune à peerfuse-net et peerfuse-lan) a été transformée en petites bibliothèques indépendantes. Ainsi nous trouvons maintenant :

  • util — Diverses classes génériques, pour gérer les threads, la config, les mutex, le logging, etc.
  • net — Contient la classe Network ainsi que diverses autres classes qui constituent la fondation du moteur réseau de Peerfuse.
  • dht — La fameuse DHT écrite à partir de Chimera, et qui est entièrement fonctionnelle.
  • ssl — Des classes faisant couche d'abstraction d'OpenSSL, afin d'assurer la sécurité des transmissions dans Peerfuse
  • scheduler — Un système de tâches planifiées qui a été amélioré afin de tourner sur plusieurs threads
  • files — Les classes qui gèrent les dossiers et les fichiers, ainsi que leurs contenus et diverses méthodes d'abstraction autour des transferts
  • fuse — Ce sont les handlers de la libfuse et qui appellent les fonctions Peerfuse

Un intérêt à la séparation des différentes petites libs, c'est que j'ai pu tester la DHT avec le moteur réseau et la libutil, de façon totalement indépendante dans un programme de test, et que ça marche.

Le desert

Malheureusement, à partir d'octobre, la dépression causée par divers évènements personnels ma conduit à m'intéresser moins au projet.

Le travail qui reste à faire est plus chiant qu'autre chose, c'est à dire réécrire une partie du code de Peerfuse pour supporter la nouvelle API réseau et protocolaire (DHT).

Le souci, c'est que Peerfuse en lui même ne compile pas du tout (contrairement aux mini libs), et que cela ne facilite pas le travail des quelques contributeurs intéressés par le projet, et qui du coup n'en foutent pas une.

Donc je pense qu'il me faudrait un bon coup de remotivation pour reprendre le travail que j'ai laissé inachevé en automne dernier. Ça va être dur, parce que j'avais trouvé un moyen pour me pousser à me remettre au travail, mais les quelques conquetes féminines n'ont pas suffit à me remotiver :)

Les six derniers mois

Ça fait longtemps que j'ai pas raconté ma vie ici, donc je vais en profiter, histoire de.

Tout d'abord, j'ai commencé un nouveau projet que je garde secret pour le moment, mais que certaines personnes connaissent sous le nom d'AuM. Ce projet est écrit en Python, utilise les libs mechanize et html5lib, je vous laisse imaginer quel genre d'utilité cela peut avoir.
Mais je reviendrai dessus dans un billet futur, quand sera venu le moment adéquat pour en parler. Je ferai peut-être une conférence dessus fin mai aux PyCon 2009.

En outre, j'ai remis en place Men Are Ants, à sa version 0.4, qui était plus abouti, et abandonne la réalisation de la version 3D isométrique, l'intérêt étant réduit, et n'ayant plus vraiment envie de m'investir dans ce projet. Je corrigerai sans doute néanmoins les quelques bugs que j'ai remarqué lors d'une partie récente avec pankkake.

J'ai finalement envoyé mes patches pour ncmpc upstream, le projet ayant été depuis repris par un des principaux développeurs de MPD. Il se trouve que la personne, Max Kellermann, a été très intéressé par mes patches, m'a demandé d'en faire d'autres, et m'a très gentilment proposé de devenir contributeur, chose que j'ai accepté avec enthousiasme. En effet, je prends plaisir à participer, pour une fois, à un projet d'envergure et que j'utilise tous les jours.

Je n'ai pas encore eu pour le moment l'occasion de faire grand chose, mais je suis intéressé par la réalisation d'un système de plugins chargés dynamiquement, qui permettrait d'étendre les possibilités offertes par MPD, et de rendre plus propre la gestion des modules de sortie audio.

Enfin, je me suis mis en tête de réaliser un agrégateur de flux RSS deux-tiers (comme disent les décideurs), avec un backend qui récupère les données, et un frontend en ncurses (il pourrait y en avoir d'autres) qui se synchronise et (très important) peut récupérer les articles en local, permettant de les lire même en étant offline.

Ceci résoudrait le problème que j'ai à ne pas pouvoir lire mes flux RSS au boulot, puisque j'utilise Akregator, qui est une application graphique KDE qui ne me permet pas de gérer la synchronisation avec mon PC du boulot.

Je n'ai pas encore commencé, mais avec un peu de motivation ça peut le faire.

Conclusion

J'ai donc pas mal de projets en attente, qui sont tous aussi intéressants les uns que les autres, et j'espère ne pas tomber dans le schéma lodesi, qui a beaucoup d'idées mais jamais le courage de les réaliser jusqu'au bout.

Des chansons d’anthologie

Afin de mettre un peu de culture dans ce blog qui en manque cruellement, voici une petite note pour parler d'un site que ma femme pankkake vient d'ouvrir, favorisant l'émancipation musicale dans un monde où les majors du disque passent leur temps à essayer de sauver leurs parts de marchés en attaquant la liberté d'échanger du Britney Spears sur Internet.

Je vous présente, donc :

Gronipute

AdopteUneFillette

Veron (8 ans, Paris 8e) vient d'adopter un mec en ile-de-france

Bépo — c’est bon

La majeure partie des ordinateurs francophones disposent d'un clavier de type azerty ou plus rarement qwerty. Nous allons voir que ces dispositions sont anti-ergonomiques et qu'il existe des dispositions optimisées pour augmenter la vitesse de frappe tout en réduisant l'effort.

Continue reading 'Bépo — c’est bon'

Peerfuse, Chimera, git, mailman et redmine

L'activité de Peerfuse reprends de plein pied.

Chimera

Le but du mois de juillet était de convertir la DHT Pastry (écrite en Java) pour l'intégrer au code C++ de Peerfuse. La flemme et la laideur du code Java n'aidant pas, les choses étaient restées en état jusqu'il y a deux semaines...

En effet, il y a deux semaines, j'apprends l'existence d'une DHT similaire à Pastry (plus légère), écrite en C, nommée Chimera.

Le portage a débuté la semaine dernière, et je peux dire que je me suis amusé... Ça a bien avancé, la quasi totalité du code se trouve dans diverses classes, mais j'ai été confronté à certains problèmes...

Je dirais que le plus chiant, était ce qui est résumé par une phrase sur le site de Chimera :

Thanks to Perry Lorier for a patch to make Chimera compatible w/ 64 Bit machines!

Non, je ne le remercie pas. En effet, quand on voit qu'ils stockent l'ID dans des unsigned long, type dont la taille varie suivant l'architecture, et qu'ils font diverses opérations de bits en considérant qu'il s'agit de uint32_t, on peut aisément deviner pourquoi ça ne marche pas.

En outre, toujours un problème similaire :

 
/* encode the message */
type = htonl ((unsigned long) message->type);
memcpy (data, &type, sizeof (unsigned long));
size = htonl ((unsigned long) message->size);
memcpy (data + sizeof (unsigned long), &size, sizeof (unsigned long));
memcpy (data + (2 * sizeof (unsigned long)),
                get_key_string (&message->dest),
                strlen (get_key_string (&message->dest)));
memcpy (data + HEADER_SIZE, message->payload, message->size);
size = HEADER_SIZE + message->size;     /*reset due to htonl */
 

Il est facile de comprendre que si on connecte un chimera x86 sur un chimera x86_64, ils risquent de ne pas parler la même langue...

Bref, j'ai fais remonté l'info à Chimera et pour ma part j'ai corrigé tout ça dans Peerfuse...

Git

Afin de développer au mieux le portage de Chimera, j'ai profité des joies de git et ai créé une branche chimera sur mon dépôt local. C'est un vrai bonheur. D'autant plus qu'on peut travailler à plusieurs sur cette branche.

Depuis peu, deux nouveaux contributeurs se sont joint sur Peerfuse, l'un a déjà travaillé sur une implantation de XML-RPC dans Peerfuse afin de faire communiquer le démon peerfuse avec des frontends (en console ou graphiques), le second a pour le moment la tâche de porter peerfuse en ipv6.

Chacun des développeurs de Peerfuse s'est vu doter d'une dépôt public chacun ainsi qu'on peut le voir : http://git.peerfuse.org/

Je trouve vraiment sympatique cette façon de travailler, même si c'est un peu déroutant au départ pour l'utilisateur de Subversion que je suis habituellement.

Mailing lists

La mailing list a été réinstallée, et une seconde spécifique au développement a été créée.

Pour plus d'informations : http://lists.peerfuse.org

Redmine

Enfin, il semblerait que les fichiers TASKS et BUGS présents dans les sources n'étaient pas satisfaisants pour les contributeurs de Peerfuse, ainsi j'ai été contraint d'installer Redmine, une alternative très sympatique à Trac.

Ça donne ceci : http://dev.peerfuse.org.

Conclusion

Peerfuse reprends son souffle et on devrait maintenant avoir tout ce qui faut pour pouvoir travailler vite. Il ne manque plus qu'à remettre en place les buildbots, mais il faudra de toute façon encore quelques semaines avant de retrouver un état stable.

Peerfuse aux RMLL

Le futur de Peerfuse s'annonce radieux. Après plus d'un mois de discussions, une nouvelle version du protocole permettant de meilleurs performances est définie, et va se baser sur Pastry, une DHT qui corresponds à ce que l'on souhaite implémenter.

Le nouveau protocole a été décrit (grossièrement) dans la présentation de Peerfuse aux RMLL08, dont vous pouvez retrouver les slides ici.

Malheureusement, ceci implique une importation de Pastry, qui est écrit en Java, vers le langage utilisé pour Peerfuse qui est le C++.

C'est un travail monstrueux, et malgré la propagande faite par hydromiel et moi aux RMLL, personne ne s'est senti de m'aider à cette tâche. D'ailleurs, dans les discussions que j'ai pu avoir, il semblerait que l'utilisation du langage C++ soit un vrai frein pour les contributeurs (à moins que ça ne soit qu'un prétexte).
Je n'ose imaginer comment ça serait si on avait écrit Peerfuse, comme j'avais soulevé l'idée au départ, en langage D.

Notez que le projet utilise maintenant Git, que le site peerfuse.org est temporairement mort, et que vous êtes donc bien invité de venir sur le canal IRC #peerfuse@freenode si vous souhaitez suivre l'évolution.