Using Google Apps Script: an example with Gmail

Google Apps Script. Wait…what?

A few months earlier, I discovered Google Apps Script and decided to play with it. Google Apps Script allows you to interact with many Google products (Gmail, Documents, Finance, Maps, Calendar) by writing some code for these apps. The amazing point is that the documentation for Google Apps Script is just awesome. I’ll write it again because it really is: it’s awesome. The documentation is really well written and the Google team provide useful (and so much powerful!) functions. And last but not least, it’s beautiful. Amazing.

An example with Gmail

Once again, a few months ago, I saw on Twitter that a guy was complaining about his Gmail Inbox. This guy received a lot of emails everyday (he said more than 300 if I remember well) and hadn’t enough time to read them all. So he asked on Twitter, « Is there a way to tell people that I just want to read short emails? » and someone gave him just a little script to do so. This script used Google Apps Script and especially the GmailApp class. You can read the documentation of this class here: developers.google.com/apps-script/reference/gmail/gmail-app.

I was excited about that: the code was really beautiful, simple and powerful. So I decided to rewrite it by myself, just to try writing my very first Google Apps Script. Enough talk, here is the code!

Okay, seems cool. How to use it?

Well, my goal was just to show how awesome Google Apps Script could be. I don’t think that you want to use this script for your personal use (unless you’re a very popular person!). But if you still want to use it for you, just go to script.google.com, create a new file, copy and paste the code and try executing it. Google will ask your approval before you’ll be able to interact with Gmail thanks to this code (thanks Google for this security).

Test it, and once you’ll like the way it works, run periodically this code (e.g. every 5 minutes) with a timer by selecting « Resources » > « Current project’s triggers… » in Google Script. Your Inbox will always be super clean ;)

Ressources

Your bible, the documentation for Google Apps Script: developers.google.com/apps-script/.

Suivre des clics à l’aide de Google Analytics

Google Analytics
Google Analytics est un puissant outil d’analyse des visites sur un site web. Si vous ne l’utilisez pas encore, je vous le recommande vivement : les données fournies par Google Analytics vous seront extrêmement utiles.

Dans quel cas utiliser des événements ?

Une fonctionnalité avancée de Google Analytics qui est très intéressante à utiliser est celle de la gestion des événements. Je ne suis néanmoins pas encore un expert avec cette fonctionnalité, c’est pourquoi je vous présenterai seulement la gestion des événements provenant d’un clic d’un utilisateur. Imaginons : vous avez un site avec une page d’inscription. Vous avez un lien vers cette page dans votre menu, un autre dans un article de votre blog et un dernier dans votre footer. Quel lien est le plus cliqué ? Si vous faites un changement de design dans votre footer, le lien dans le footer sera-t-il cliqué plus souvent ?

La gestion des événements proposé par Google Analytics va vous permettre d’avoir des réponses à ces questions.

La fonction _trackEvent()

Pour la suite, vous devez utiliser Google Analytics et avoir le code de Google Analytics présent sur toutes les pages de votre site. Nous allons utiliser la fonctionnalité _trackEvent pour pouvoir suivre les événements (ici les clics) sur votre site.
La fonctionnalité _trackEvent prend les arguments suivants :

Voici une description de chacun des paramètres :

  • category : string. La catégorie générale de votre événement (par exemple « Page d’inscription »).
  • action : string. L’action pour cet événement (par exemple « Clic »).
  • opt_label : string. La description de cet événement (par exemple « Lien footer »).
  • opt_value : int. Dans notre cas, on n’utilisera pas ce paramètre. On l’utilise dans des cas bien précis, quand on a besoin d’une valeur numérique associée à un événement. Par exemple, dans le cas d’une vidéo, la durée de la lecture jusqu’à ce que l’utilisateur clique sur « Pause » par exemple.
  • opt_noninteraction : boolean. La valeur par défaut est false. Si la valeur est à true, le fait de déclencher cet événement ne sera pas compté comme une interaction. Si vous laissez à false, le déclenchement de cet événement sera bien compté comme une action, et votre utilisateur ne sera donc pas compté dans le taux de rebond (bounce rate).

Mise en place

Maintenant que vous savez comment utiliser la fonction _trackEvent, il faut l’implémenter dans votre code. Voici par exemple ce qu’il faudra écrire dans votre code si je reprends l’exemple initial avec des liens vers une page d’inscription placés à différents endroits.

Vous voyez que peu de choses varient. En effet, la catégorie doit rester la même pour comprendre de quel événement je peux parler, l’action est la même (toujours un clic), seul le label varie selon la localisation du lien. Dans cet exemple, pas besoin d’opt_value et je ne me suis pas soucié de mon taux de rebond sur ces pages.

Où retrouver ces statistiques ?

Une fois votre code mis à jour, vous pouvez retrouver les statistiques de vos événements dans l’onglet « Contenu » puis dans « Événements ». Cliquez ensuite sur le nom de la catégorie de votre événement, puis sur « Libellé d’événement » pour voir la répartition des événements au sein de votre catégorie.

Voici un exemple de résultat qui provient de Teen Quotes :
Google Analytics

Vous voilà en possession de statistiques intéressantes. À vous maintenant de les exploiter au mieux !

Pour aller plus loin, l’aide Google à propos de l’event tracking (en anglais) : dev.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEventTracking.

Conserver les sessions dans les sous-domaines en PHP

Par défaut, PHP utilise le cookie PHPSESSID pour propager les sessions à travers les différentes pages d’un site. Par défaut, PHP utilise le domaine et le sous-domaine courant pour déclarer ce cookie.

Par exemple, si je me connecte sur www.monsupersite.com, mon cookie PHPSESSID sera déclaré pour la localisation www.monsupersite.com. Les données contenues dans la session ne pourront pas voyager avec le visiteur pour un autre domaine ou sous-domaine. Ceci veut dire que mes données $_SESSION ne seront malheureusement pas accessibles sur forum.monsupersite.com par exemple !

Pour rendre les données de la session accessibles sur tous les sous-domaines de votre domaine principal, il va falloir rajouter une ligne au tout début de tous vos fichiers où une session est susceptible d’être créée. Le plus sage étant encore de l’inclure sur toutes vos pages, immédiatement après l’ouverture de la balise PHP. Il suffit de rajouter ceci :

Ceci aura pour effet de supprimer le sous-domaine. Par exemple forum.monsupersite.com devient .monsupersite.com. Ainsi, toutes les données de la session seront accessibles sur tous les sous-domaines de monsupersite.com !

Les problèmes rencontrés avec Amavis

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

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

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

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

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

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

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.