Une présentation qui sort de l’ordinaire

Jusqu’à présent, les quelques présentations que j’ai eu l’occasion de faire se limitaient à de simples powerpoints. Mais si ce mode de présentation fonctionne relativement bien avec de la mise en page d’idées, le parcours de schéma n’est pas indiqué. En fait, il est peut-être possible de s’en sortir, mais je n’en sais pas plus à ce sujet.

Ce qui m’intéresse beaucoup plus, ce sont les possibilités de faire des présentations dynamiques et originales avec des outils libres bien sûr. J’ai donc découvert Impress.js qui semble être un moyen intéressant quoiqu’un peu technique de créer une présentation. Néanmoins, ayant besoin de créer un schéma, j’ai préféré laissé cette solution de côté pour me tourner vers Inkscape.

Pourquoi Inkscape me direz-vous. Eh bien, l’idée d’utiliser ce logiciel libre pour réaliser ma présentation me vient de René Méroux avec qui j’ai pu discuter  lors des éditions 2011 et 2012 des RMLL. Dans la présentation qu’il a effectué concernant sa carte du logiciel libre, René présentait en effet la version 6-alpha. C’est là que j’ai découvert la possibilité de faire une présentation en utilisant Inkscape. Cette version de la carte donne d’ailleurs un bon aperçu de ce qu’il est possible de faire. Vous trouverez la carte dans un grand nombre de langues sur le serveur suivant: http://es.gnu.org/~reneme/fsmap/ .

Revenons donc à Inkscape. Pour réaliser la présentation, il est nécessaire d’ajouter une extension appelée Sozi. On réalise donc en premier lieu son schéma, sa présentation avec les outils d’Inkscape, en appréciant bien la puissance du dessin vectoriel qui permet de redimensionner facilement tous les objets graphiques. Une fois cette étape terminée, nous allons dessiner un rectangle correspondant à la première image, le premier slide de notre présentation. Il suffit ensuite d’aller dans le menu Extensions puis Sozi. Lorsque la fenêtre de Sozi s’ouvre, cliquer sur Créer, l’élément SVG sélectionné correspond au rectangle qui vient d’être créer. Modifier les options à votre goût puis valider. Il suffit ensuite de créer un nouveau rectangle pour délimiter votre deuxième image, refaire la procédure via Sozi et ainsi de suite jusqu’à ce que vous soyez satisfait. Pour visualiser sa création, il suffit d’enregistrer son travail et d’ouvrir le fichier avec un navigateur récent, Firefox faisant très bien l’affaire. La navigation s’effectue au choix avec la souris ou via les flèches droite et gauche du clavier.

Voilà donc un moyen de créer une présentation originale en bénéficiant de la puissance du dessin vectoriel, mais qui nécessite un peu plus de temps pour prendre en main le logiciel. L’installation de Sozi est très bien décrite sur le site de l’extension et ne devrait pas poser de problème. Une expérience intéressante donc, qui donne envie d’utiliser plus souvent Inkscape, avec à la clé un résultat concluant.

Le fond de cet exemple tiré du site de Sozi étant transparent, l’animation n’est pas très visible sur ce fond gris, mais reste lisible.

Mocha: path to mocha.opts with -f

Mocha is a wonderful (:D) test framework which allows you to write really understandable tests in JavaScript. I’ve already introduced it in a previous article, so today I’ll focus on a pull request I’ve proposed.

Like other programs, you can pass arguments to mocha, like for instance –reporter used to specified a way to display test results. By the way, you should try once the nyan reporter. Concerning mocha, it’s also possible to set arguments in a file named « mocha.opts ». Interesting feature, but the file must absolutely be stored in your test directory.

So the idea is to add an argument: -f, –fileconf <path>. Furthermore, the –fileconf option allows you to specify the configuration file that will be used, by default “/test/mocha.opts”; allowing you to store your configuration file anywhere you wanted. This modification is very useful if you make tests using the same configuration file in many directories. Without –fileconf, you have to copy your file in each directory, and even a small modification must be done on each file. Using -f, you store the mocha.opts file in a unique place, so that any modifications of the file would immediatly impact all tests.

About the code

Add the parameter with commander:

.option('-f,--config <path>','specify the path to configuration file')

Load the file using commander to parse the command line:

//-f, --config
program.parse(process.argv);
var pathConf = 'test/mocha.opts';
if (program.config && exists(program.config)) {
  pathConf = program.config;
}
try {
  var opts = fs.readFileSync(pathConf, 'utf8')
    .trim()
    .split(/\s+/);

  process.argv = process.argv
    .slice(0, 2)
    .concat(opts.concat(process.argv.slice(2)));
} catch (err) {
  // ignore
}

In fact, this code is not available in mocha yet since « parsing twice might have some strange side-effects »…

An other way to augment argv without using commander:

//-f, --config

var pathConf = 'test/mocha.opts'
  , fIndex = process.argv.indexOf('-f')
  , configIndex = process.argv.indexOf('--config');

if(fIndex !== -1 && exists(process.argv[fIndex + 1]) ) {
  pathConf = process.argv[fIndex + 1];
}

if(configIndex !== -1 && exists(process.argv[configIndex + 1]) ) {
  pathConf = process.argv[configIndex + 1];
}

And I’ll finished this article by quoting visionmedia:

Maybe it’s ok but that’s still pretty hacky.

Node-Elastical: Delete by query option

What is Elastical?

Elastical is a Node.js client library for the ElasticSearch REST API.

That’s it for the presentation.

Until a few weeks ago, it wasn’t possible to delete data by query without using a hack. The hack was the following:

client.delete('twitter', 'tweet', '', {q: 'user:Shay'} );

Here, we set id to an empty string and we use the options parameter to perform a search on user with value Shay. Not so practical at all.

Using curl to interact with ElasticSearch, it is possible to delete by query:

curl -XDELETE 'http://localhost:9200/twitter/tweet/_query' -d ' 
  { "term" : { "user" : "kimchy" } 
}
'

This handy way of deleting things in ElasticSearch was not possible with Elastical (unless, you managed to use the hack above).

So I’ve added a new parameter options.query which allow us to perform such a query more easily.

client.delete('twitter', 'tweet', '', {query:
  { "term" : { "user" : "kimchy" } } 
});

When using the query parameter, id and all other options except ignoreMissing will be ignored.

Let’s take a quick look at the code involved:

if(params.query) {
  url = '/' + encode(this.name) + '/' + encode(type) + '/_query';

  this.client._request(url, {method: 'DELETE', json: params.query}
  , function (err, res) {
    if (err) {
      if (ignoreMissing && res && res.found === false) {
        return callback(null, res), undefined;
      } else {
        return callback(err, res), undefined;
      }
    }
    callback(null, res);
  });
} else {

It’s pretty simple. First, we need to build the url, then we’re requesting ElasticSearch on the given url, passing the query in the json parameter. If options.query doesn’t exist, then the original code is used.

As a conclusion, delete by query is now available in Elastical and you should use it!

 

ElasticSearch: Delete By Query API

Combattre le spam

S’il y a bien une chose de désagréable lorsqu’un met en place un site web, avec des formulaires de commentaires à la disposition des visiteurs, c’est vous l’avez deviné… le spam. Ça commence par un commentaire de temps en temps, puis un commentaire par jour, puis deux, puis trois et leur nombre augmente encore.

Pour lutter, j’avais donc mis en place le plugin Akismet, qui fait du bon travail, il faut bien le reconnaître. Néanmoins, je préfèrerais me passer de 251 commentaires classés indésirables en moins d’une journée. C’est pourquoi, après quelques recherches, j’ai trouvé le plugin GrowMap Anti-Spambot. Ce plugin ajoute une case à cocher pour confirmer que le visiteur n’est pas un spammeur, si la case n’est pas coché, le commentaire n’est pas sauvegardé. GrowMap ajoute également un champ de formulaire invisible pour les visiteurs mais visible pour un bot lisant le code source de la page. Le bot de spam va donc compléter le champ et identifier ainsi le commentaire comme étant du spam.

Je viens donc de désactiver Askimet pour tester GrowMap pendant quelques jours afin de juger son efficacité. Curieux de voir le résultat.

Pull Request: Remarques

Quelques bons usages qui peuvent faciliter l’acceptation d’une Pull Request sur Github et que j’ai découvert après quelques Pull Request.

  • Toujours décrire la fonctionnalité que vous ajoutez du mieux possible.
  • Faire des Pull Request contenant peu de fichier. On gagne ici en lisibilité. En effet, une Pull Request ajoutant 50 000 fichiers à cause de nouvelles dépendances, à beaucoup de chance de rebuter le développeur. En conclusion, faire quelque chose de clair!
  • Utiliser les outils de tests du projet. Cela nécessite peut-être de prendre en main des nouveaux outils mais augmente grandement les chances de faire accepter votre demande. Et surtout, vous évitez les commit de plusieurs milliers de fichiers.
  • Ça peut sembler idiot, mais utiliser le mécanisme de test du projet libre à la place de tester seulement son cas de test à la main peut vous évitez de chercher pendant des heures pourquoi cela ne marche pas comme vous le pensez.