vendredi 23 décembre 2005

Petit remède anti-spam de commentaires pour Dotclear

Comme vous l'avez peut-être lu un peu partout, le SPAM de commentaires sur les blogs devient de plus en plus monnaie courrante [1], y compris sur Dotclear qui était jusque là relativement épargné.

Un plugin a été développé pour tenter d'enrayer ce phénomène : Spamplemousse. S'il est très efficace, il semble parfois faire un peu trop de zèle.

Il est également possible d'utiliser le principe des CAPTCHA afin de s'assurer que le commentateur est bien un être humain et non un bot à la solde du grand capital. Un plugin existe même déjà. Je n'ai pas personnellement essayé ce plugin, mais je n'aime pas trop l'idée d'avoir à saisir des choses inutiles pour valider quelque chose...

Pour ma part, j'ai découvert que le fait d'avoir mis en place la nécessité de prévisualisation des commentaires avant validation [2] enrayait le problème sur ce blog... alors que j'avais mis en place ce système pour m'assurer que les commentateurs vérifiaient bien la bonne mise en forme de leur commentaires au format WIKI avant validation [3].

Pour ceux que ça interesse, voici les opérations à effectuer pour mettre en place ce dispositif [4] :

Dans le fichier template.php de votre thème courant, remplacez le contenu existant entre les lignes :

<?php elseif ($preview) : /* Si on demande la previsualisation d'un commentaire */?>

et :

<?php elseif ($mode != 'post') : /* Si aucune erreur et mode != post on affiche une liste de billets */?>

par :

<div id="preview">
	<h3>Commentaire pour <?php dcPostTitle(); ?></h3>
	<?php if (dc_wiki_comments) : ?>
		<p>Merci de prendre le temps de v&eacute;rifier la bonne mise en forme de
		votre commentaire&nbsp;:</p>
	<?php endif; ?>
	<div id="comment-preview">
		<blockquote><?php dcCommentPreview(); ?></blockquote>
	</div>
	<h3>Changer le commentaire</h3>
	<?php include dirname(__FILE__).'/form.php'; ?>
</div>

Dans le fichier form.php de votre thème courant, après la ligne <p><input type="submit" class="preview" name="preview" value="Pr&eacute;visualiser" /> :

<?php if (array_key_exists('preview', $_POST)) : ?>
	<input type="submit" class="submit" value="Envoyer" />
<?php endif; ?>

Il ne vous restera plus qu'à styliser l'affichage du bloc de prévisualisation au moyen de CSS ;-)

Edit du 25/12 : Apparemment, les spams ne sont pas arrêtés par ce stratagème. Je réfléchis à une autre solution.

Notes

[1] Voir billet précédent

[2] Oui, je sais bien que ça en ennerve certains d'entre vous :-/

[3] Echec total sur ce point là :dent:

[4] N'oubliez pas de faire une sauvegarde au préalable ;)

samedi 3 décembre 2005

Pelletée d'extensions Firefox

Firefox Suite à précédents billets sur la question, voici une petite revue des extensions Firefox que j'utilise actuellement au quotidien.

Attention, certaines ne sont compatibles qu'avec la dernière mouture du navigateur, la 1.5.

Lire la suite...

mardi 22 novembre 2005

Animations Flash à l'échelle en CSS

Peut-être cette astuce est-elle archi connue, mais je ne l'ai jamais vue auparavant.

Peut-être avez-vous déjà voulu réaliser un modèle de mise en page scalable [1] en CSS contenant des animations Flash. Et peut-être avez-vous pesté contre l'impossibilité apparente de gérer en valeurs relatives la taille desdits objets, puisque les attributs width et height d'une balise <object> sont par définition exprimées en pixels, la largeur et la hauteur restant alors desespéremment fixes lors de l'augmentation de la taille du texte et des éléments de mise en page...

Pour remédier à ce problème, ma solution réside dans l'application de valeurs proportionnelles (exprimées en em) à l'objet Flash via CSS.

Prenons par exemple ce code XHTML affichant une animation Flash de 320px par 240px:

<object id="swf_banner" type="application/x-shockwave-flash" data="swf/ban_home.swf" width="320" height="240">
	<param name="movie" value="swf/ban_home.swf" />
	<img id="img_banner" src="swf/alt/ban_home.jpg" alt="banner" />
</object>

En appliquant les règles CSS suivantes au corps du document et à l'objet, la taille de ce dernier devient fluide !

body {
	font-size: 100%; /* Autorise le redimensionnement de texte pour MSIE */
}
html > body {
	font-size: 16px; /* Pour les autres navigateurs */
}
#swf_banner {
	width: 20em;
	height: 15em;
}

Et voila, en jouant des combinaisons de touches <Ctrl> + "+" et <Ctrl> + "-" dans Firefox [2], votre objet flash est maintenant redimensionné à l'échelle, au même titre que le reste des éléments du document dont les dimensions sont exprimées en valeurs proportionnelles.

Conversion des valeurs px en em

Mais - allez-vous me dire - comment convertir mes valeurs de taille d'objet Flash, exprimées en pixels, en valeurs proportionnelles (em) ? Pour cela, il existe une astuce consistant à définir une taille par défaut de la police de caractère du document courant, et de lui appliquer un ratio multiplicateur pour en obtenir les valeurs proportionnelles correspondantes.

Dans notre exemple, l'objet Flash fait 320 par 240 pixels. Fixons la taille de police par défaut de notre document à 16px.

body {
	font-size: 100%; /* Autorise le redimensionnement de texte pour MSIE */
}
html > body {
	font-size: 16px; /* Pour les autres navigateurs */
}

Pour calculer la hauteur de notre objet Flash en em, on effectue une simple opération :

<taille_en_pixels_du_flash> / <taille_de_police_du_body_en_pixels> = <valeur_en_em>

Soit pour la largeur :

320 / 16 = 20em

Et pour la hauteur :

240 / 16 = 15em

Note : MSIE ne permet pas par défaut le redimensionnement de police ; il faut pour cela utiliser un subterfuge, sous cette forme :

body {
	font-size: 100%; /* Autorise le redimensionnement de texte pour MSIE */
}

Opera quand à lui propose en natif le zoom à l'échelle, quelles que soient les métriques utilisées.

Pour finir, voila un exemple concret.

Notes

[1] Je suis preneur d'une traduction de ce terme :)

[2] On peut aussi utiliser la combinaison <Ctrl> + molete de la souris

vendredi 18 novembre 2005

Telecharger un lien d'un clic avec Firefox

Vous allez rire, mais je ne connaissais pas cette fonctionnalité de Firefox, le navigateur le plus génial de la Terre : la combinaison <Alt> + clic sur un lien permet d'en enregistrer la cible directement sur le bureau (ou dans votre répertoire de téléchargement défini par défaut).

It's a great day :)

samedi 12 novembre 2005

Dépôts PLF chez Free et Backports officiels

Bonne nouvelle, Free.fr est desormais mirroir officiel des dépôts PLF. Freeboxés, ça va pulser ;)

deb ftp://ftp.free.fr/pub/Distributions_Linux/plf/ubuntu/plf/ breezy free non-free
deb-src ftp://ftp.free.fr/pub/Distributions_Linux/plf/ubuntu/plf/ breezy free non-free

D'autre part, le frigo a parlé : les backports officiels pour Breezy sont disponibles.

deb http://archive.ubuntu.com/ubuntu breezy-backports main restricted universe multiverse
deb http://ubuntu-backports.mirrormax.net/ breezy-extras main restricted universe multiverse

Pour prendre en charge ces dépôts, ajoutez ces lignes dans votre fichier /etc/apt/sources.list ou dans Synaptic via Catégories > Dépôts > Ajouter > Personnalisés, puis effectuez une mise à jour de la distribution.

dimanche 30 octobre 2005

Citer proprement un mail

Ce billet en fera certainement sourire plus d'un (vétérans d'Usenet, bonsoir), mais au vu du nombre de mails difficilement déchiffrables que je reçois, je me dis que ça peut faire avancer le schmilblick.

Quand on répond à un mail, que l'on soit en mode texte ou en HTML, une bonne pratique est de quoter (citer) le message initial de l'éxpéditeur, afin par exemple de lui répondre point par point. Pour cela, il existe quelques conventions qui ne sont pas compliquées à mettre en place et qui peuvent grandement simplifier le suivi des propos échangés.

Lire la suite...

mercredi 5 octobre 2005

Finalement... finally ?

En PHP5, j'utilise les blocs try et catch pour intercepter mes exceptions. Mais qu'en est-il de finally, permettant d'effectuer une opération malgré les exceptions et existant dans d'autres langages comme Java ? La fonction ne semble pas implémentée en PHP...

En l'occurence, il s'agit de fermer une connexion au SGBD si d'autres opérations que la connexion elle-même ont généré des exceptions... bloquantes. ce qui laisse une connexion non-fermée - ce qui est mal. En même temps, gérer la fermeture propre de la connexion dans la classe de gestion d'exceptions, c'est pas très propre, et ça peut vite devenir le bazar si on veut effectuer d'autres opérations dans le même genre ?

Des idées, suggestions pour pallier à ce souci ? :)

Note : le premier qui me répond Passer à Java, je le mord :green:

mercredi 17 août 2005

Redéfinir de force le mot de passe root de MySQL

Il peut arriver d'oublier son mot de passe root MySQL [1], n'est-ce pas blowup ? :p

C'est très embêtant car pour redéfinir un nouveau mot de passe root, il faut entrer le mot de passe... root, et réinventer ainsi le mouvement perpétuel...

Voici une méthode pour lancer MySQL sans requérir d'authentification, et ainsi pouvoir assigner un mot de passe à l'utilisateur root. Attention, cette méthode ne doit pas être utilisée sur des serveurs de production et/ou sensibles, car à ce moment toutes vos bases sont accessibles à tous les utilisateurs MySQL.

Dans un shell, entrez la séquence de commandes suivante :

$ sudo -s
# /etc/init.d/mysql stop
# mysqld -u mysql --skip-grant

Attention, maintenant MySQL est lancé sans authentification, c'est à dire qu'il est ouvert à tous les utilisateurs. Vous pouvez également arrêter Apache2 afin de limiter les possibilité d'execution de scripts accédant à des bases non autorisées :

# apache2ctl stop

Note : Si vous utilisez d'autres services permettant l'accès à MySQL, je vous recommande fortement de les arrêter de même. Vous pourrez les relancer à la fin de l'opération.

Là, ouvrir un nouveau shell pour définir un nouveau mot de passe root/MySQL (CTRL + Shift + T dans gnome-terminal)

# mysqladmin -u root flush-privileges password "nouveau_mot_de_passe"

Fermer le premier shell, et tuez le daemon mysql ignorant l'authentification, puis relancez mysql au moyen de la commande :

# /etc/init.d/mysql restart

Si vous aviez stoppé Apache, voire d'autres services, il est tant de les relancer :

# apache2ctl start
# ...

Normalement, ça devrait rouler...

Notes

[1] qui, rappelons-le, n'est pas le même que l'utilisateur root du système

- page 3 de 6 -