my blog

Sunday 4 June 2006

Mangez du spam avec vos commentaires

Depuis que je me suis attaqué au problème du spam sur mes rétroliens, je n'ai plus aucun spam de rétrolien qui arrive à passer sur ce journal. Mais des spams de commentaire commençaient à être pénibles. J'ai donc ajouté deux petites modifications violentes, sans trop réfléchir :

  • la première avait été trouvée sur ce billet et l'idée est assez simple. J'ai légèrement divergé, en modifiant le contenu du commentaire HTML et en ne modifiant pas le code de DotClear (voir ci-dessous).
  • la seconde modifiction est un captcha tout bête. Je n'ai même pas cherché à regarder s'il y avait un greffon qui implémentait cette fonctionnalité (ce qui est le cas).

À noter qu'on peut créer un fichier postcon.php dans le thème utilisé pour exécuter du code avant que le commentaire soit accepté par DotClear (ou traité par spamplemousse). La mini-astuce consiste à donner une valeur à la variable $_POST['preview'] lorsque le commentaire ne passe pas les épreuves (le captcha et le commentaire HTML). Cela permet de bloquer le commentaire temporairement (comme s'il s'agissait d'une prévisualisation) et évite d'avoir à modifier le code de DotClear. Concrètement, mon postcon.php contient :

if ($mode == 'post' && $post_id) {
	$news = $blog->getPostByID($post_id);
	if (!$news->isEmpty() && $news->openComment() && !empty($_POST['redir']) && empty($_POST['preview'])) {
		if ($_POST['c_anti'] != "antipasti") {
			$form_err = __('Please fill the <q>antipasti</q> entry.');
			$_POST['preview'] = "preview";
		}
		if (isset ($_POST['c_contre'])) {
			$form_err = __('The HTML parser of your browser is broken.');
			$_POST['preview'] = "preview";
		}
	}
	unset($news);
}

Et après cinq minutes pour modifier ce qu'il fallait, j'ai pu profiter d'un calme relatif. Je précise relatif car je dois toujours penser à modérer ma file spamplemousse de temps en temps...

Saturday 3 June 2006

Do you speak english?

Depuis un certain temps, certaines pages de mon site sont disponibles en anglais (bon, il faut que je traduise celles qui ne le sont pas quand j'aurais deux minutes). Il y avait tout de même deux points qui m'embêtaient.

Le premier est de permettre l'accès aux deux langues par un petit lien. Mais comment structure le site ? Est-ce mieux d'avoir https://www.vuntz.net/en/page/, https://www.vuntz.net/page/en/, https://www.vuntz.net/page/index.en.php, https://www.vuntz.net/page/index.php.en ? Le choix est important car il est préférable de toujours garder les mêmes adresses. J'aurais tendance à pencher vers https://www.vuntz.net/en/page/ mais cela ne colle pas trop avec la structure des fichiers. Et je traîne donc des pieds...

Le second point était que toutes les pages de mon journal étaient en français car la version actuelle de DotClear ne permet pas d'adapter la langue de la page à la personne qui la regarde. Après avoir eu droit à une ou deux petites remarques (but what does 'Merci d'écrire dans un Français correct et lisible' mean?), je me suis attelé à la tâche. Comme tout le monde devrait le savoir, la négociation de la langue utilisée a lieu par l'intermédiaire de HTTP_ACCEPT_LANGUAGE. Avec une fonction toute simple en PHP, on peut récupérer la valeur, et en fonction de celle-ci utiliser un fichier au lieu d'un autre.

Concrètement, mon fichier template.php contient :

<?php
require_once ("i18n.php");
$zen_lang = get_language ();
if ($zen_lang == "french") {
	include ("template.fr.php");
} else {
	include ("template.en.php");
}
?>

Il suffit de faire de même avec tous les autres fichiers. La fonction get_language() étant définie comme ceci :

// Taken from: http://www-128.ibm.com/developerworks/web/library/wa-apac.html

function get_language()
{
  global $HTTP_ACCEPT_LANGUAGE;
  $language_pages = array(
                      "en"=>"english",
                      "fr"=>"french"
                    );
  $language_default = "english";
  $language_nofound = "english";
  // get preferred languages in the "Accept-Language" header
  if($HTTP_ACCEPT_LANGUAGE == "")
  {
    // no preference set
    return $language_default;
  }
  // form an array of preferred languages
  $accept_language = str_replace(" ", "", $HTTP_ACCEPT_LANGUAGE);
  $languages = explode(",", $accept_language);
  // check for a recognised language
  for($i = 0; $i < sizeof($languages); $i++)
  {
    $pref = explode(";", $languages[$i]);
    if($language_pages[$pref[0]] != "")
    {
      // found a preferred language
      return $language_pages[$pref[0]];
    }
  }
  return $language_nofound;
}

Et voilà, le tour est joué. Il reste quelques petits problèmes (les dates sont en français, les greffons affichent aussi des chaînes en français, etc.), mais rien de grave.

Thursday 1 June 2006

Hero of the day #2

I'm pretty sure people don't know all the hard work Elijah is doing.

He's always here for the GNOME releases: he's creating the modulesets, he's smoketesting the releases and he does all the hard work. But he always tries to avoid sending the announce for a release. I'm glad that he did send the 2.14.2 announce.

And, well, he wouldn't be so unique without his bugzilla skills. 26 points. Isn't this impressive?

Elijah is a rocking release manager! Buy him a drink at GUADEC!

Hero of the day

I proposed two sessions for GUADEC, but my schedule makes it hard for me to be sure to be available for them.

Enter Quim.

He managed to find volunteers for both sessions while I wasn't able to do so. Sometimes, I'm wondering if he's human.

Friday 26 May 2006

Everyone wants to see them rocking!

If you're interested to see who will work on the Summer of Code for GNOME, run to the Planet GNOME Summer of Code 2006! I guess this will be the best place to monitor all the cool work that will happen in the next three months. There's also #soc on irc.gnome.org, so feel free to join. Some discussion will also happen on gnome-soc-list, where all the students and the mentors should be subscribed, but this will most probably be some administrative discussions.

It looks like I'll mentor Ryan and Etienne for GNOME. Ryan will work on the applets and I believe the result will be amazing. It might look like a project that will only have an impact on developers, but in the end, it will change the way we work with the applets and, hopefully, the notification area. Etienne will provide a library to use scanners, based on SANE, but with real UI love. The library should of course be dead-easy to use it in your application.

I'll also help Sébastien mentor Peter Moberg for an Ubuntu project. Peter will work on two small applications (and maybe more, if he has time), the main idea behind them being that it should be easy to save, restore, and maybe even share your GNOME configuration. Like, for example, sharing your panel layout, or restoring the initial configuration of GNOME. I know I'll use this when smoketesting GNOME!

Some of the students will go to GUADEC. This is good news since they should all feel part of our community. I hope they'll be able to show us some of their work they've done.

I nearly forgot the teaser: expect some other good news related to the Summer of Code in the next few days ;-)

- page 42 of 119 -

by Vincent