Les problèmes rencontrés avec Amavis

Standard

Au cours des derniers mois, j’ai rencontré plusieurs problèmes sur mes différentes machines qui ont été causés par Amavis et qui ont été difficile à réparer pour. Dans cet article, je vais vous détailler les problèmes que j’ai rencontré et les solutions que j’ai trouvé pour y venir à bout, en espérant que ceci vous soit utile !

Amavis, c’est quoi ?

Amavis est un filtre pour les emails. Il est open source et est écrit en Perl. Il est souvent associé à Postfix pour l’envoi d’emails qui est très utilisé dans les systèmes UNIX. Amavis peut être utilisé pour :

  • détecter les virus, spam et les erreurs de syntaxe ;
  • bloquer, rediriger ou transférer des emails ;
  • mettre en quarantaine ou archiver des emails ;
  • bien d’autres choses que je ne connais pas…

Amavis et les inodes

Par défaut, Amavis stocke les emails qu’il a détecté comme virus ou spams dans un dossier spécifique. Sous Debian, celui-ci se trouve à /var/lib/amavis/virusmails. Le problème est qu’Amavis ne vide jamais ce répertoire… Ceci peut être très problématique car au fil du temps le dossier se remplit encore et encore et il peut parfois saturer votre quota d’inodes sur votre serveur. En effet, si vous envoyez quelques milliers d’emails par jour depuis votre serveur, il est probable que vous ailliez ce problème un jour ou l’autre. Dans mon cas, le dossier utilisé par Amavis /var/lib/amavis/virusmails comptait plus de 50 000 inodes ! Un problème qui peut complètement saturer votre /var sans que vous compreniez d’où vient le soucis.

Le problème avait été reporté, et malheureusement l’équipe d’Amavis ne veut pas mettre en place une suppression automatique tous les 15 / 30 jours de ce dossier. Personnellement, je ne comprends pas cette logique. Connaissez-vous un administrateur système qui souhaite garder une trace de tout ce qui a été considéré comme “spam” pendant plusieurs années ? Vous pouvez trouver cette discussion à l’adresse suivante : http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=569150.

Quoi qu’il en soit, si vous voulez éviter d’avoir ce problème, il va falloir agir. La solution proposée par Thomas Goirand sur Debian me parait être une excellente solution. Il suffit de mettre en place une tâche cron tous les X jours exécutant la commande suivante :
L’autre solution, moins classe, consiste à supprimer le répertoire /var/lib/amavis/virusmailsquand votre nombre d’inodes commence à vraiment augmenter. Vous devrez ensuite exécuter les commandes suivantes :

Bonus, si vous voulez savoir combien d’inodes vous avez dans des sous-répertoires, il vous faut taper la commande suivante :
Ceci risque de prendre un certain temps si vous faites ceci dans un répertoire comptant une longue arborescence !

Quels symptômes pour un problème avec Amavis ?

Les problèmes que vous pouvez rencontrer à cause d’Amavis peuvent avoir des conséquences importantes mais sont parfois difficiles à identifier. Si vous rencontrez les problèmes suivants, il faudra regarder du côté d’Amavis :

  • Aucun email n’est envoyé depuis votre serveur. Les emails s’entassent dans la mail queue.
  • Votre nombre d’inodes est très important alors que votre disque comporte encore beaucoup d’espace.

Dans le premier cas, regardez d’abord au niveau de vos logs de mail si vous pouvez obtenir des informations complémentaires. Si le problème vient d’Amavis, pensez à le désactiver (voir étape suivante). Avant de prendre des décisions radicales, vous pouvez rajouter les emails en attente dans la mail queue et demander à Postfix de les envoyer en tapant les commandes suivantes :

Pour le second soucis, vous pouvez déterminer immédiatement si Amavis est responsable de cette augmentation du nombre de vos inodes. Rendez-vous dans le dossier /var/lib/amavis/ et exécutez la commande indiquée précédemment permettant de voir combien d’inodes comptent vos sous-répertoires.

Désactiver Amavis

Vous aurez beau vous acharnez, parfois il faut mieux désactiver Amavis pour être tranquille. Si vous voulez faire ceci, voici les étapes qu’il vous faudra suivre.

Tout d’abord, il va falloir vous rendre dans le fichier de configuration de Postfix se trouvant dans /etc/postfix/ et se nommant main.cf en commentant une ligne ressemblant à la suivante. Pour ma part, elle indique à Postfix d’envoyer les emails sur localhost en utilisant le port 10024.

Vous pouvez également faire référence à Amavis dans le même dossier, mais dans le fichier master.cf. Il faudra commenter les lignes suivantes :

Parfait ! Il ne reste maintenant plus qu’à recharger les fichiers de configuration de Postfix, rajouter les emails dans la mail queue et tenter de les envoyer à nouveau. Ceci se fait avec les commandes suivantes :

Dernière étape, ne plus démarrer Amavis automatiquement au démarrage. Ceci se fait avec la commande :

Vous voilà débarrassé d’Amavis !

[CODE] Internet Facts

Standard

Logo Internet Facts
Aujourd’hui je voudrais vous présenter un projet que j’ai réalisé en quelques jours cet été, et dont je suis particulièrement fier au point de vue de la technique pure. En effet, le code est particulièrement propre, plutôt court et intelligemment pensé ! Vous devez trouver ça plutôt habituel, mais je vous assure qu’il m’arrive souvent d’écrire du code “rafistolé avec du scotch” : qui fonctionne, mais qui n’est pas optimisé. De plus, Internet Facts utilise des effets intéressants de jQuery, le CDN d’OVH, de beaux CSS sprites, des modules Facebook et Twitter, du HTML5 et du CSS3. En clair un condensé de belles choses pour avoir un site agréable !

Internet Facts, c’est quoi ?

Le concept du site peut sembler similaire à un autre de mes projets : Teen Quotes et Kotado. Les fonctions principales sont l’affichage des citations, que l’on peut ensuite commenter, trier en fonction de l’auteur, afficher aléatoirement, s’inscrire à une newsletter etc.

Internet Facts présente des faits étonnants sur le monde qui nous entoure. Ces informations ont été trouvées le plus généralement sur Wikipédia. D’ailleurs, Internet Facts est associé au compte Twitter @FactsWikipedia pour proposer du contenu.

Le code peut donc se reprendre facilement pour un autre site qui propose des citations en ligne.

Le mieux étant encore de voir le site directement : internet-facts.com.

Et le code, il est où ?

L’intégralité du code (à l’exception du fichier de configuration) est disponible sur mon GitHub (comme beaucoup de mes projets) : https://github.com/AntoineAug/internet-facts.

Bien évidemment, si vous avez des remarques ou des questions, je vous invite à me les poser.

Le CDN (Content Delivery Network) d’OVH

Standard

CDN OVH

Un CDN, c’est quoi ?

Un Content Delivery Network (CDN) est constitué d’ordinateurs reliés en réseau à travers Internet et qui coopèrent afin de mettre à disposition du contenu ou des données (généralement volumineuses ou statiques) à des utilisateurs. Le réseau est constitué :

  • De serveurs d’origines, où les contenus sont injectés dans le CDN pour y être repliqués (les serveurs maîtres) ;
  • De noeuds répartis géographiquement où les contenus sont repliqués (le CDN) ;
  • D’un mécanisme de routage permettant à une requête utilisateur sur un contenu d’être servie par le noeud “le plus proche” dans le but d’optimiser la transmission des données.

L’optimisation se traduit par une réduction des coûts de bande passante sur vos serveurs maîtres (le contenu statique, les images, les feuilles de style, le JS et les vidéos sont gérées par le CDN) et de l’amélioration de l’expérience utilisateur (le site est chargé plus rapidement).

Pour donner un exemple concret, les vidéos de YouTube sont répliquées dans des dizaines de milliers d’ordinateurs répartis en réseau dans le monde. Ainsi, lorsque vous chargez une vidéo, le groupe d’ordinateurs le plus proche va se charger de vous transmettre la vidéo. Ainsi, la bande passante globale est partagée entre plusieurs milliers d’ordinateurs et le contenu est acheminé plus rapidement.

Le CDN d’OVH

OVH propose un CDN gratuitement, même si vous ne possédez ni hébergement, ni serveur dédié, ni nom de domaine chez eux. Exceptionnel, n’est-ce pas ? La seule condition est d’avoir un compte chez eux, c’est tout. OVH met à disposition son infrastructure de serveurs à travers le monde pour répliquer votre contenu et s’occupe du mécanisme permettant de rediriger vers le point géographique le plus proche ou vers vos serveurs maîtres si le contenu n’est pas hébergé sur le CDN.

Concernant la présence géographique, elle est assez impressionnante. Vous pouvez regarder la carte tout en haut de cet article pour visualiser ceci. Le réseau CDN d’OVH est disponible :

  • En Europe. Paris, Milan, Madrid, Amsterdam, Londres, Francfort, Varsovie ;
  • En Amérique. Chicago, Dallas, Newark, New York, San José, Ashburn, Atlanta, Los Angeles, Miami, Seattle, Palo Alto, Toronto ;
  • En Asie. Hong Kong, Tokyo, Singapour.

Voilà déjà de quoi vous offrir une présence géographique mondiale plutôt efficace. Vous avez accès à l’ensemble de ces villes pour votre CDN. Merveilleux n’est-ce pas ?

CDN ou serveurs maîtres ?

Voici un petit schéma explicatif récapitulant la procédure qui est exécutée à chaque requête HTTP. Le schéma provient du site d’OVH :
CDN OVH

Temps de vie des fichiers

Vous pouvez paramétrer un temps de vie par fichier, par extension ou par dossier sur votre hébergement. Le CDN d’OVH gardera sur les différents serveurs dans sa cache locale les fichiers pendant le temps spécifié par la règle de chaque fichier. Une fois ce temps écoulé, chaque fichier sera redemandé à votre serveur maître afin d’être répliqué à nouveau sur l’ensemble des serveurs du CDN.

Méthode d’utilisation

La meilleure utilisation possible consiste à placer toutes vos ressources statiques sur un sous-domaine de la forme static.votresuperdomaine.com : images, feuilles de style, JavaScript, vidéos, animations Flash. Tout ce qui n’est pas du contenu dynamique en clair, qui n’est pas amené à changer. Lorsqu’un visiteur arrive sur votre site, CDN charge immédiatement les contenus statiques tels que les images sur static : <img src=”static.votresuperdomaine.com/images/…” alt=”” />

Votre hébergement ne s’occupe plus que de vos contenus dynamiques.

Utiliser le CDN d’OVH

Pour utiliser le CDN d’OVH il faut d’abord se rendre sur www.ovh.com/fr/cdn/fr, renseigner vos identifiants OVH puis le nom de domaine sur lequel vous souhaitez mettre en place le CDN. Un email vous sera envoyé et vous devrez changer l’adresse IP du champ A de votre domaine ou de votre sous-domaine par celle qui est inscrite dans cet email pour activer le CDN. Vous n’avez rien à changer dans votre code. La configuration du temps de vie par type de fichier se fait via un manager proposé par OVH, en français, facile d’utilisation.

Rendu en production

J’ai testé le CDN d’OVH sur plusieurs de mes domaines, pas encore sur de gros sites en production. J’ai obtenu des résultats très intéressants sur un site qui héberge du contenu multimédia. J’ai réussi à économiser 93 % de ma bande passante. Un chiffre assez impressionnant !
CDN OVH

Conseils d’utilisation

Attention, le CDN d’OVH n’est pas à utiliser sur un projet encore en développement. Vous allez vite être embêtés par la gestion des caches alors que vous modifiez régulièrement des images, des feuilles de style… Même si OVH propose de vider le cache du CDN et de répliquer une nouvelle version des fichiers, vous pouvez avoir des soucis avec le cache de votre navigateur ensuite. Le CDN d’OVH est donc très utile sur un site déjà en production, où les changements sont très rares.

Bonne utilisation !

[Code] L’Euromillions

Standard

Euromillions
Hier, le 10 août 2012, un britannique a remporté le plus gros gain du célèbre jeu de loterie européen : la bagatelle de 190 millions d’euros. De quoi s’offrir de belles choses. Cela faisait 10 tirages consécutifs que personne n’avait réussi à trouver les 5 bons numéros parmi les 50 et les 2 étoiles parmi les 11. Et pourtant, beaucoup de personnes jouent ? Il devrait y avoir un moyen ? Et bien en se basant sur les mathématiques, la probabilité d’avoir ces 5 numéros et ces 2 étoiles n’est que de 0,000 000 858 %. Pour autant, le phénomène de société du “et pourquoi pas moi ?” fait que l’Euromillions reste un jeu très populaire, plus encore quand la cagnotte atteint son plafond de 190 millions.

Etudions un petit peu ce jeu, d’un point de vue des probabilités. Je vous propose ensuite un petit code PHP qui permet de générer des grilles d’Euromillions et d’en sortir quelques statistiques intéressantes. Hier, je me suis amusé à tirer 100 000 grilles aléatoirement. Et bien figurez-vous que je n’ai pas trouvé la bonne combinaison !

Probabilités

Pour calculer les différentes probabilités d’atteindre les différents rangs de gain de l’Euromillions, on utilise les combinaisons (l’ordre de sortie des numéros ne compte pas).
Combinaison probabilités
Ainsi la probabilité d’obtenir les 5 bons numéros et les 2 bonnes étoiles est donnée par la formule :
Combinaison probabilités
Soit de 1 chance sur 116 531 800.

Voici un tableau qui résume les probabilités pour les différents rangs, trouvé sur Wikipédia :
Probabilités Euromillions
En résumé, une personne aura 7,81 % de chance (soit environ une chance sur treize) de remporter un gain sur chaque combinaison jouée à 2 € la combinaison. À titre de comparaison, au Loto, un joueur a 16,7 % de chance (environ une chance sur six) de remporter un gain sur une combinaison simple.

Code PHP

Le code PHP suivant permet d’effectuer un tirage aléatoire d’une grille d’Euromillions. Les résultats sont ensuite enregistrés dans une base de données, pour un futur traitement. A noter qu’avant d’être enregistré, les nombres et les étoiles du tirage sont rangés dans un ordre croissant, ceci afin de faciliter la sélection dans la table plus tard. Le code PHP devrait être suffisamment commenté (en anglais !) pour que vous le compreniez facilement.

Et voici le code SQL permettant de créer la table associée au précédent code :

Vous obtiendrez quelque chose de cette forme après avoir lancé le code PHP :
Combinaison probabilités

Project Euler

Standard

Euler
Project Euler est un site web proposant de nombreux problèmes d’algorithmique à résoudre. La difficulté des 388 problèmes proposés à ce jour est croissante et mettra à contribution vos méninges. La résolution du problème se fait généralement par une réflexion mathématique puis par une programmation de son idée pour obtenir le résultat attendu. Pas besoin d’avoir un super calculateur de la Nasa pour obtenir le résultat, les problèmes peuvent être résolus en “moins d’une minute” de calcul par un ordinateur domestique. Il est précisé qu’il faudra néanmoins parfois quelques heures de réflexion pour arriver à calculer un résultat, une optimisation de l’algorithme étant nécessaire pour rentrer dans des délais de calcul acceptés par l’ordinateur.

Résolution d’un problème

Tous les langages de programmation et tous les logiciels sont acceptés pour résoudre le problème. Le résultat de chaque problème demandé est un nombre, il ne faudra donc pas soumettre les méthodes de calcul de votre algorithme mais uniquement le résultat. Voici un net avantage pour vous :

  • Vous pouvez utiliser toutes les méthodes que vous souhaitez pour résoudre un problème.
  • Vous n’avez pas besoin d’attendre une quelconque validation de votre algorithme par quelqu’un de l’équipe.
  • Vous savez tout de suite si vous avez le bon résultat (ou si vous devez encore vous creuser la tête…).

Après avoir résolu un problème, vous avez la possibilité de consulter le forum associé à ce problème (et surtout pas avant l’avoir résolu !). Dans ce forum vous trouverez les solutions proposées par d’autres programmeurs qui sont arrivés au même résultat que vous, mais avec d’autres méthodes et d’autres langages. Une excellente opportunité pour découvrir de nouvelles techniques ou des optimisations très ingénieuses. Si vous vous sentez prêt, vous pouvez aussi exposer votre algorithme afin de partager votre technique avec les autres membres !

Statistiques

Quelques chiffres, pour vous donner envie de participer vous aussi :

  • 231 349 personnes ont résolu au moins un problème.
  • 3 700 797 résultats justes ont été proposés, avec une moyenne de 16 par membre.
  • 41 090 personnes ont résolu au moins 25 problèmes, ce qui représente 18 % de la totalité des membres.
  • 113 personnes ont résolu plus de 350 problèmes.

Vous pouvez trouver des statistiques sur les langages de programmation utilisés juste ici : projecteuler.net/languages.

Je veux participer !

Vous aussi vous souhaitez vous arracher les cheveux sur des problèmes mathématiques pendant des heures et exploser de joie lorsque vous aurez trouvé le bon résultat ? L’inscription se fait à cette adresse : projecteuler.net/register.

Nous participons actuellement en équipe à la résolution de ces problèmes, si vous souhaitez voir ce que nous faisons ou partager vos algorithmes avec nous : @AntoineAugusti et @ThibaudDauce sur Twitter. Et nos codes source sur GitHub : https://github.com/AntoineAug/Euler. Nous avancerons beaucoup plus durant le mois de juillet et d’août.

Bonne chance à vous dans la résolution des problèmes !

[Maths et code] Le classement Elo

Standard

Nombres
Le classement Elo est un système d’évaluation du niveau de capacités relatif d’un joueur d’échecs ou d’autres jeux à deux joueurs. Il doit son nom à Arpad Elo (1903-1992), un professeur de physique et excellent joueur d’échecs américain d’origine hongroise qui l’a mis au point. Plus généralement, il peut servir à comparer deux joueurs d’une partie, et est utilisé par de nombreux jeux en ligne. World Of Wacraft l’utilise notamment pour les cotes en arène et Mark Zuckerberg a utilisé cet algorithme pour établir un classement des filles d’Harvard (si vous avez vu The Social Network). C’est un algorithme très répandu, très utilisé et il est relativement facile à mettre en place.

Je vais vous détailler son fonctionnement mathématique puis vous expliquer comment l’implanter en PHP.

Elo, côté mathématique

Il existe plusieurs variantes du classement Elo, je vais vous en détailler une que j’ai choisi arbitrairement (il ressemble au modèle de World Of Warcraft). Vous pourrez l’adapter facilement.

Le classement Elo est un classements par points. Au début, chaque joueur commence avec 1500 points (on dit aussi une cote de 1500 ou un rang). Ce rang va évoluer selon les résultats des matchs du joueur. Schématiquement, le rang du joueur augmente quand il remporte un match et diminue lorsqu’il perd. L’augmentation ou la diminution du rang ne sera pas la même selon la difficulté du match.

Après chaque match on recalcule son rang selon la formule suivante :
Classement Elo

Résultat indique le résultat du match opposant le joueur P1 au joueur P2 :
Classement Elo

K est un paramètre permettant de régler la vitesse d’augmentation ou de diminution du rang du joueur. Dans mon modèle, j’ai choisi une ascension rapide en dessous de 1000, normale entre 1000 et 2000 et diminuée au-dessus de 2000. Vous pouvez tout à fait modifier comme vous voulez ce paramètre K en introduisant une constante ou en changeant la valeur de K selon l’intervalle que vous définissez.

J’utilise les valeurs de K suivantes :
Classement Elo

Enfin on calcule la probabilité de gagner du joueur P1 contre le joueur P2 avec la formule suivante :
Classement Elo

Rien de très compliqué ! A noter que j’ai utilisé l’excellent éditeur de texte LyX (www.lyx.org), version Linux qui se base sur le LaTeX pour créer les images des formules mathématiques.

Exemple

Dans cet exemple le paramètre est fixé tel que K = 16. Soit deux joueurs, Anne de rang 2300 et Michel de rang 1800. Calculons l’estimation de chaque joueur puis son nouveau rang en cas de victoire ou de défaite.

Classement Elo
Lorsque Anne gagne, le classement des joueurs ne change pratiquement pas vu que le résultat corrobore le classement établi. Dans le cas où Michel gagne, le classement des joueurs change de façon significative car le résultat ne correspond pas au classement établi.

Elo, côté PHP

Après avoir vu comment se comportait le classement Elo de manière mathématique, il est temps de le transformer en code PHP pour pouvoir l’utiliser.

Je vous fourni une version beaucoup commentée et affichant des statistiques volontairement pour bien comprendre le fonctionnement de l’algorithme. Dans une version de production, le code source peut (et doit) être beaucoup plus court. La seule chose à changer pour tester est la valeur des cotes des joueurs P1 et P2 et le résultat du match les opposant.

Au final on obtient quelque chose de ce style quand on exécute le script :
Classement Elo

J’espère que vous vous amuserez bien avec ceci ! Il y a de beaux projets à réaliser.

Les joies du code

Standard

Joies du code
Vous codez ? Vous passez plusieurs heures par jour à débuguer ? Vous avez envie d’exploser votre ordinateur quand votre projet ne compile pas ? Le “parse error” est votre religion ? Vous allez adorer lesjoiesducode.tumblr.com qui regroupe tous les ennuis qui rapprochent tous les développeurs. Notre quotidien, en images : nos moments de joie et nos pires cauchemars.

Créé par Nicolas Lecointre (@nlecointre), de nouvelles images sont régulièrement publiées ! Une adresse à ajouter dans ses bookmarks et un twittos à suivre.

Je partage avec vous quelques images, et je vous invite à lire l’intégralité du Tumblr ensuite !

Quand un client change le cahier des charges tous les jours

Les joies du code

Quand le binome m’annonce qu’il est prêt a coder ce truc horrible auquel je ne voulais pas toucher

Les joies du code

Quand je pense avoir trouvé une solution

Les joies du code

Quand je code sans musique

Les joies du code

Quand je vois du code mal indenté

Les joies du code

quand j’essaie de gérer les encodages de caractères spéciaux et que je regrette d’être français

Les joies du code

L’intégralité des images sur lesjoiesducode.tumblr.com.

Créer des raccourcis clavier sur son site

Standard

Keyboard
Les raccourcis clavier nous font gagner un temps précieux lorsque nous utilisons notre ordinateur. Pour aller vite, il faut être un fainéant intelligent. Les raccourcis clavier ont été créés dans cette optique. De nombreux sites les utilisent (Facebook ou Twitter par exemple) et ils facilitent grandement la navigation. Dès lors, pourquoi ne pas créer ses propres raccourcis sur son site web, pour faciliter la vie de vos utilisateurs habitués à les utiliser ?

Le processus de création est très simple, et je vais vous le détailler.

Javascript

J’ai trouvé l’astuce sur le site www.catswhocode.com/blog/ qui propose de nombreuses astuces en terme de développement web. On utilise bien évidemment du Javascript pour les raccourcis clavier, car c’est une action côté client. Des solutions proposées par ce blog, j’ai choisi d’utiliser la solution faisant appel à la bibliothèque jQuery, je pense qu’elle est largement utilisée sur vos sites (en tout cas, si vous ne le faites pas, vous ratez quelque chose !).

Avant de se lancer dans la rédaction du code, réfléchissons aux raccourcis clavier que nous allons mettre en place. La première idée serait d’utiliser une combinaison du type : “Ctrl + touche”, car c’est le type de raccourcis que nous utilisons le plus fréquemment. Comme ceci est fréquemment utilisé par votre système d’exploitation et votre navigateur, c’est donc une excellente raison de ne pas utiliser cette combinaison pour ne pas faire de confusions (ou prendre la place d’un raccourci déjà utilisé).

J’ai choisi de suivre les raccourcis mis en place par Twitter pour naviguer d’une page à une autre : “G + touche”. Le G symbolise “Go to” et on choisit l’initiale du nom de la page pour l’autre touche.
Deux avantages :

  • la touche G est située au milieu du clavier, ce qui permet de choisir n’importe quelle combinaison de touches.
  • Vous n’avez aucun risque de créer un raccourci déjà utilisé par vos logiciels.

On pensera à désactiver tous les raccourcis clavier quand l’utilisateur se trouve dans un input ou une textarea, pour éviter toute redirection non voulue lorsqu’il frappe au clavier.

Passons maintenant au code, je vous rappelle que vous devez avoir jQuery sur votre site et placer ce bout de code avant la fin de balise head :
Mais c’est quoi ces numéros que tu utilises ? Pas de panique à bord, voici les correspondances :

Key Keyboard code
Backspace 8
Tab 9
Enter 13
Shift 16
Ctrl 17
Alt 18
Pause 19
Capslock 20
Esc 27
Page up 33
Page down 34
End 35
Home 36
Left arrow 37
Up arrow 38
Right arrow 39
Down arrow 40
Insert 45
Delete 46
0 48
1 49
2 50
3 51
4 52
5 53
6 54
7 55
8 56
9 57
a 65
b 66
c 67
d 68
e 69
f 70
g 71
h 72
i 73
j 74
k 75
l 76
m 77
n 78
o 79
p 80
q 81
r 82
s 83
t 84
u 85
v 86
w 87
x 88
y 89
z 90
0 (numpad) 96
1 (numpad) 97
2 (numpad) 98
3 (numpad) 99
4 (numpad) 100
5 (numpad) 101
6 (numpad) 102
7 (numpad) 103
8 (numpad) 104
9 (numpad) 105
* 106
+ 107
– 109
. 110
/ 111
F1 112
F2 113
F3 114
F4 115
F5 116
F6 117
F7 118
F8 119
F9 120
F10 121
F11 122
F12 123
= 187
Coma 188
Slash / 191
Backslash \ 220

Vous êtes maintenant armés pour créer vos raccourcis facilement. Notez que vous pouvez faire un tas d’autres actions que de la simple redirection vers une page, à vous d’être créatif !

Bonus : du CSS pour présenter les combinaisons de touches à vos utilisateurs

C’est bien beau d’avoir créé des raccourcis, encore faut-il informer vos utilisateurs de leur existence. Si comme moi vous ne pouvez pas réaliser quelque chose de potable sur un logiciel comme The Gimp ou Photoshop, je partage avec vous ce très joli bout de code de CSS qui vous permettra “d’imiter” les touches d’un clavier. Voici ce qu’on obtient :

Keyboard shortcuts Vous pouvez visualiser directement en ligne ici : teen-quotes.com/shortcuts. Et voici le code CSS, à appliquer sur une balise span :

Amusez-vous bien !

Création de CSS sprite : quelques icônes

Standard

CSS SpriteOn est souvent amenés lorsque l’on crée un site web à utiliser beaucoup d’icônes. A ce sujet, je vous conseille l’excellent site www.iconfinder.com où je suis sûr que vous trouverez votre bonheur. Pensez à rechercher en anglais !

Dans une optique d’optimisation, il est opportun de regrouper ses icônes dans un seul fichier à l’aide de la technique du CSS Sprite. J’avais déjà abordé cette technique dans un précédent article : les outils pour développeurs web. Grâce à cette technique, vous ne faites plus qu’une seule requête HTTP (sinon, ce sera une requête par fichier…) et vous possédez moins de fichiers. Il suffit alors de mettre en cache chez l’utilisateur cette image, et voilà une bonne partie de la bande passante économisée ! Une belle optimisation, facile à réaliser.

La création du CSS sprite

Pour mes icônes, que j’utilise sur la nouvelle version de mon site personnel (www.antoine-augusti.fr), j’ai choisi d’utiliser des images de dimension 24×24. J’ai redimensionné à ce format les icônes qui étaient plus grandes.

Une fois ceci fait, j’ai utilisé l’excellent site www.csssprites.com pour créer mon CSS Sprite. Il suffit d’ajouter toutes les images au bon format, de choisir dans les options de les aligner comme vous souhaitez, de réduire l’espace entre elles (1px est suffisant) et le site s’occupe de générer votre image et le code CSS associé à celle-ci ! Magique !

Résultat

J’obtiens donc l’image suivante :
CSS Sprite

Et j’ai créé le CSS suivant :
J’ai associé une simple fonction en PHP :

Que l’on utilise de la manière suivante :

Afin de générer de belles icônes associées aux bons liens, très facilement.

Bien évidemment, vous pouvez créer une autre fonction pour pouvoir utiliser ces icônes sans des liens, par exemple dans le corps de votre site, en complément du contenu !

[Code] Test des fonctions “aléatoires” en PHP

Standard

Dés
La génération de nombres aléatoires a souvent posé des soucis avec des algorithmes. Cette génération se fait le plus souvent en fonction de l’heure de la machine sur laquelle la fonction permettant de générer un nombre aléatoire est exécutée. Dès lors, il se pose un souci majeur : si les algorithmes sont fonction du temps, il peut être possible de prévoir le nombre aléatoire que va sortir la machine. On s’intéresse à ce risque en cryptographie et le but est de produire un algorithme rapide à exécuter, qui ne génère pas des nombres aléatoires périodiquement et dont on ne puisse pas prévoir les résultats.

Voici quelques tests que j’ai réalisé pour tester la qualité de deux fonctions permettant de générer aléatoirement des nombres en PHP rand et mt_rand.

Voici ce que dit la documentation de PHP à propos de ces fonctions.

“De nombreux générateurs de nombres aléatoires provenant de vieilles bibliothèques libcs ont des comportements douteux et sont très lents. Par défaut, PHP utilise le générateur de nombres aléatoires de libc avec la fonction rand(). mt_rand() est une fonction de remplacement, pour cette dernière. Elle utilise un générateur de nombres aléatoire de caractéristique connue, le “Mersenne Twister” qui est 4 fois plus rapide que la fonction standard libc.”

Création d’une image

Ce test permet de se représenter visuellement les résultats donnés par les fonctions. Voici le principe : on part sur une base d’une image complètement noire et on demande aux fonctions de colorier des coordonnées de l’image, calculées aléatoirement, en blanc. On balaie l’intégralité des coordonnées de l’image (en x et en y) et on regarde si certains pixels n’ont pas été coloriés plusieurs fois ou si on peut observer des formes, ce qui montre le caractère non parfaitement aléatoire de la fonction.

Voici le code PHP pour réaliser ceci :
Voici l’image que l’on obtient (lien vers l’image taille réelle) : Test aléatoire

(lien vers l’image taille réelle)

Et voici un zoom au centre de l’image, pour pouvoir comparer la nette différence entre rand et mt_rand : Test aléatoire Le résultat est assez bluffant : on remarque sur l’image générée par la fonction rand des formes qui ressemblent à des lignes discontinues tandis que l’image générée par mt_rand ressemble bien à une image de bruit, ce qui est la représentation qu’on pouvait attendre.

Vérification de l’équiprobabilité

Nous allons maintenant nous intéresser à la vérification de la règle de l’équiprobabilité d’un tirage de chiffres. Le test est le suivant : on demande à l’algorithme de générer un chiffre aléatoire entre 0 et 9 inclus, soit 10 possibilités. Pour un grand nombre de tirages, la probabilité est de 10 % par chiffre. Vérifions ce résultat avec les fonctions rand et mt_randet regardons les différences. Le code PHP pour ce test, pour la fonction rand est le suivant :

Le test est le même pour la fonction mt_rand, sauf que l’on change le nom de la fonction permettant de générer le nombre à la ligne 44.

Voici les résultats que l’on obtient. Pour rand :
Test aléatoire
Et pour mt_rand :
Test aléatoire

Ouf, l’équiprobabilité est vérifiée pour les deux fonctions ! Résultat étrange en revanche, l’erreur moyenne et le temps de calcul sont plus grands pour la fonction mt_rand alors que la documentation PHP indique que cette fonction est “4 fois plus rapide”. Il faudrait réaliser plusieurs fois ce test pour s’assurer de ce résultat.

Le précédent test ne permet donc pas de dire que la fonction rand est “mauvaise” et elle génère quand même bien des nombres aléatoires, malgré ce que l’image obtenue pouvait laisser penser.