- par balbinus, le mercredi 6 février 2008 à 18:19 dans « Programmation »
I've done a little benchmark of PHP5's hashing functions, and especially the two most widely used hashing algorithms: MD5 and SHA-1. Results are surprising: PHP's default methods (namely, md5() and sha1()), aren't optimal at all... although there are faster equivalents included in one of the modules activated by default since PHP 5.1.2! The hash module offers functions to compute hashes of strings (hash()) or files (hash_file()), and even incremental (streaming) hashes, or HMAC keyed hashes!
My benchmark was done on a quad-Xeon machine, running Debian, with many custom-built packages; so take the results for what they are: the representation of a particular situation. The general conclusions drawn from the test are widely-applicable, though. SHA-256 hashing is included to show that even more complex hashing algorithms are executed faster than simpler ones using the default PHP functions. Please note that there is no "native" function to compute SHA-256 hashes in PHP.

Lire la suite
- par balbinus, le lundi 26 novembre 2007 à 17:35 dans « Programmation »
Petit mémo rapide sur comment transférer un dépôt Subversion entre deux machines (par exemple) :
svnadmin dump /chemin/actuel/du/dépôt > dépôt.dump
Cette commande crée un "dump" du dépôt, qui inclue tous les fichiers et toutes les révisions (et donc peut être assez long à générer et conséquent en taille).
On transfère ensuite le fichier (scp, FTP, clé USB, pigeon voyageur...), et sur l'hôte de destination :
svnadmin create /chemin/du/nouveau/dépôt
svnadmin load /chemin/du/nouveau/dépôt < dépôt.dump
Et voilà !
- par balbinus, le samedi 24 novembre 2007 à 17:03 dans « Programmation »
Une erreur idiote sur les requêtes MySQL : faire des calculs à la seconde près alors qu'on en a pas besoin.
Je m'explique. Soit une table d'article, on veut ceux de la semaine en cours :
SELECT * FROM articles
WHERE created_at >= <debut de semaine>;
On peut calculer <debut de semaine> de la manière suivante avec MySQL :
SELECT DATE(NOW() - INTERVAL WEEKDAY(NOW()) DAY)
AS debut_semaine;
En gros, on cherche la date (ie YYYY-mm-dd) du lundi comme la date du jour (NOW()) à laquelle on soustrait n jours, n étant égal au jour de la semaine (la numérotation commence à 0 pour le lundi). La fonction DATE() qui englobe le tout permet de comparer par rapport au lundi à minuit (par défaut, sans heure précisée, une date est considérée comme prise à minuit).
C'est bien joli tout ça... Mais les performances sont pourries. La requête prend chez moi 0.45 ms en moyenne, contre 0.15 ms pour les autres requêtes, qui sont parfois plus compliquées que cette requête. Pourquoi donc ?
Tout simplement parce que les autres requêtes sont effectuées contre le cache de MySQL, alors que celle-ci doit être recalculée à chaque fois. Pourquoi donc ?
A cause de NOW(), qui impose une précision inutile à la seconde (ou pire)... NOW() doit donc nécessairement être recalculée à chaque requête.
En pratique, est-ce que nous avons besoin d'une précision à la seconde ? Non. On cherche juste les articles de la semaine, donc qui datent de lundi minuit au maximum. Deux solutions s'offrent à nous : précalculer dans notre code la valeur de cette date butoir, ou bien utiliser CURDATE(), qui ne renvoie que la date actuelle, à la place de NOW(). Je précise que je n'ai pas testé la deuxième solution. J'ai choisi la première qui, codée en PHP, présente l'avantage d'être plus élégante.
- par balbinus, le samedi 24 novembre 2007 à 14:41 dans « Programmation »
Installing MySQL on Ubuntu, the NSFW work way par Mark Pilgrim.
Bon, les remarques sur MySQL sur Mac OS X sont pas très intéressantes (non, sérieux, Mac, c'est pas fait pour en faire un serveur... un peu comme Windows, mais pas du tout pour les mêmes raisons).
En fait, c'est rarement Linux même qui est compliqué (un kernel, hein...
), mais bien les logiciels qui vont autour qui ne sont pas toujours intuitifs. C'est, bien sûr, un défaut platform-independant. Mais pour le voir, il faudrait sortir de l'image "Linux == compliqué". Et ça, c'est une autre histoire.
A lire, histoire de rétablir un peu l'équilibre : oui, Linux, ça peut être compliqué. Bordélique même (via le lien ci-dessus).
- par balbinus, le vendredi 17 août 2007 à 22:26 dans « Programmation »

One annoying thing with Munin is that if you have more than one Munin central node to process the individual Munin nodes data, it's quite a pain in the neck to go and check them all.
Here comes munin-merger that takes as an input a list of Munin summary pages (accessible through HTTP, optionally password-protected), and output a merged version of the summary, containing every host analyzed by every Munin server, grouped by domain name.
You can download version 1.0 here: TAR.GZ | README.
- par balbinus, le vendredi 10 février 2006 à 14:15 dans « Programmation »
Nouvelle boulette :
"Dans une table d'inoeuds [sic], on stocke la taille d'un fichier en nombre de caractères.
- Et si c'est une image, le fichier ?
- Oh euh, eh bien je suppose que le système s'arrangera !"
OK. J'admets, c'est une simplification ASCII-iste qu'on fait souvent : un octet = un caractère (c'est faux depuis la venue de l'Unicode). Donc qu'on fasse une telle simplification s'explique. Mais qu'on ne sache pas ensuite expliquer que la taille est en octets ! (vérifiable sur Wikipedia). Même si c'est bien sûr dépendant du système de fichiers utilisé, je ne pense pas qu'il y en ait un où on compte en nombre de caractères !
"De toute façon moi j'utilise Windows pour les images."
Oui, c'est toujours une citation d'une prof d'Unix.
- par balbinus, le mardi 31 janvier 2006 à 22:13 dans « Programmation »
Quand apt-get update vous sort des messages du genre :
W: GPG error: http://security.debian.org testing/updates Release: Les signatures suivantes n'ont pas pu être vérifiées car la clé publique n'est pas disponible : NO_PUBKEY numéro-de-clé
La solution est sur le wiki Debian :
$ gpg --keyserver pgpkeys.mit.edu --recv-key numéro-de-clé
gpg: requesting key numéro-de-clé from hkp server pgpkeys.mit.edu
gpg: key numéro-de-clé: public key "Debian Archive Automatic Signing Key (2006) <ftpmaster@debian.org>" imported
gpg: Total number processed: 1
gpg: imported: 1
$ gpg -a --export numéro-de-clé | sudo apt-key add -
gpg: no ultimately trusted keys found
OK
Transcription :
- On cherche la clé numéro machin sur un serveur de clés. Attention ! La clé donnée par
apt-get est souvent plus longue que nécessaire : il faut se fier au numéro donné par la première commande en sortie (c'est la fin du numéro donné par apt).
- On exporte ensuite la clé, et on la donne à manger à
apt-key, qui gère les clés GPG d'apt.
Et voilà !
- par balbinus, le vendredi 30 décembre 2005 à 01:11 dans « Programmation »
Alors voilà, j'arrive à compiler ça (syntaxe Pseudo-Pascal) :
algorithme Carre
(* Demande un nombre, et calcule son carré *)
var n:entier
debut
lire(n);
ecrire(n*n);
n := n*n;
ecrire(n);
fin
Et en gros ça fait ça :
$ ./di20 carre.dcode
Entrez un entier : 4
16
16
Et là je suis vachement complètement fier. OK, il reste encore à traduire le langage compilé en Assembleur pour pouvoir ensuite le refourguer à GCC pour pouvoir se passer de l'interpréteur, mais bon... voilà quoi !
[NB]: Le premier qui me casse ma joie...
- par balbinus, le lundi 21 novembre 2005 à 19:09 dans « Programmation »
J'ai suivi le tutoriel pas à pas. J'ai gagné la manche. Waou.
C'est vraiment très compliqué.

Heureusement, à ce qu'il paraît, après, ça se complique.
- par balbinus, le mardi 4 octobre 2005 à 00:47 dans « Programmation »
Bon, désolé pour ce titre raccoleur...
Les VPN, ça a l'air bien. C'est sécurisé, et ça permet de faire des tas de choses. Mais le problème, c'est le temps qu'il faut pour générer les bases cryptographiques.
Un exemple ? Les paramètres de Diffie-Hellman.
Alors déjà, ça sert à quoi ? A permettre à deux personnes de s'échanger une clé secrète sur un canal non-protégé sans qu'ils aient partagé aucun autre secret. Retrouvons nos amis Alice et Bob qui vont nous expliquer tout ça.

Alors comment vont-ils faire ? La réponse au prochain épisode ! C'est bien simple : ils utilisent le protocole d'échange de clés de Diffie-Hellman. Le protocole est, dans l'idée, assez simple. On part de deux paramètres, p et g. Ils sont tous les deux publics, et peuvent être utilisés par plusieurs personnes en même temps. p est un nombre premier, et g (pour "générateur") est un entier inférieur à p, tel que pour tout entier n (1 <= n <= p-1), il existe une puissance de g égale à n modulo p.
Voici comment cela se passe en détail :

Alice et Bob génèrent chacun de leur côté un entier aléatoire (a pour Alice et b pour Bob). Ils calculent ensuite un nombre public, en utilisant p, g, et leur nombre privé. La valeur utilisée par Alice est g puissance a modulo p, et celle de Bob g puissance b modulo p. Ils échangent leurs valeurs publiques sur le canal non sécurisé.
Alice calcule ensuite g à la puissance (ab), ce qui est égal (modulo p) à g à la puissance b à la puissance a, et Bob calcule le contraire, soit g à la puissance a à la puissance b (modulo p). Or g à la puissance (ab) = k, donc Alice et Bob ont échangé une clé secrète k.

Tout ça c'est très drôle... mais ce que l'histoire ne dit pas, c'est que c'est très long de calculer des paramètres de Diffie-Hellman sur un Pentium III 600 MHz pour aller avec des clés de 2048 bits. La preuve : vous voyez ce que j'ai le temps de faire pendant ce temps ?
[PS] je crois qu'il faudrait que je fasse des miniatures de mes images. Mais en 1280*1024, ça passe parfaitement 