L'autorisation des sites de jeux d'argent a pas mal bousculé l'univers publicitaire des médias : paris en ligne, jeux de cartes, bandits manchots virtuels, il y a de la publicité partout...

Un business lucratif

Pas la peine de se voiler la face : ces business raportent. C'est vieux comme Hérode : comment ne pas penser qu'on peut gagner de l'argent facilement ? Si je joue au loto, je pense que j'ai énormément de chance de remporter le gros lot. Puisque c'est arrivé à ces inconnus innombrables depuis le lancement de ce jeu, comment ne pas penser que je ne vais pas gagner, puisque j'ai statistiquement autant de chance que lui ?

Les paris sportifs et autres sites de poker ne sont pas en reste : jouer et parier est devenu très (trop ?) accessible. Du coup, les volumes augmentent et les commissions/marges également.

Le prix d'un joueur

Un joueur a sur le marché une valeur énorme : les sites paient jusqu'à plusieurs centaines d'euros pour vous inciter à vous inscrire, ou bien pour que vous parrainiez quelqu'un parmi vos proches. Plusieurs centaines d'euros... mais comment peuvent-ils supporter ces coûts ? Ce business serait-il encore plus lucratif que ce qu'on pourrait penser ? Je pense bien que oui...

Prenons un site de poker en ligne au (jeu de) hasard : si vous déposer 100€, le site vous propose de vous donner 200€ en bonus. Mais bien sur pas sans rien faire : il faut jouer et dépenser pour les toucher ! En revanche, pas de problème pour les récupérer par la suite. Ils pensent donc que je vais finir accro ? Moi peut-être pas, mais pour quelques-uns comme moi il y en aura bien un que va le devenir, hélas !

L'addiction

L'addiction au jeu est bien sur une réalité. La loi impose un message du type "Jouer comporte des risques : endettement, dépendance... Appelez le 09-74-75-13-13 (appel non surtaxé)". Mais quelqu'un d'isolé, de dépendant et endetté va-t-il vraiment appeler ? Ce simple message affiché dans les publicités alerte-t-il assez les futurs joueurs ?

C'est un problème lié à celui de l'alcool et du tabac : c'est pas bien, mais :

  1. ce n'est pas dangereux à petite dose, mais avec abus ça peut détruire des vies.
  2. qu'est-ce que ça peut rapporter comme argent à l'état !
  3. ces sphères contrôlées sont toujours mieux que des circuits illicites.

Assaire à fuire...

Amazon propose un webservice de base de données simplifiée que se nomme SimpleDB, qui permet de stocker n'importe quelle information dans une base de données dans les nuages.

SimpleDB : base de données simplifiée

A l'opposé des bases de données relationnelles, SimpleDB propose juste de stocker des informations hétérogène dans une même table.

Si on devait faire un rapprochement avec les bases du type MySQL, ce serait celui-ci :

  • Amazon vous met à disposition plusieurs bases : en fait, ces bases sont les différentes régions pour lesquelles le service est disponible (Asie, Europe, East-US, ...).
  • Dans cette base, vous pouvez créer jusqu'à 250 tables, appelés domain.

Au niveau des données, le système est un peu déroutant au début : pour stocker un objet, vous lui donnez un nom (Name) et ensuite une liste de paires clé/valeur (Attributes). Vous pouvez même donner plusieurs valeurs à un même attribut pour un seul objet.

Exemple de données

Considérons donc une liste de personnes, de dates de naissance et de diplômes : on pourra donc stocker des informations selon le schéma suivant :

  • Name => Jean, Attributes => { Age => 16, Diplome => Brevet des collèges }
  • Name => Paul, Attributes => { Age => 19, Diplome => { Brevet des collèges, Baccalauréat } }

SimpleDB et Select

La base de données est simplifiée à la fois au niveau de son format, mais aussi du select : on ne peut pas tout faire, notamment à cause de la structure du stockage.

Format des données

Les données n'ont pas vraiment de format. Elles sont stockées sous forme de chaine de caractère. Vous pouvez cependant continuer à stocker des données au format binaire sans soucis.

Comparaison

C'est là que les choses se compliquent (hélas !). La comparaison se fait selon le type d'objet que l'on compare, et dans notre cas SimpleDB va comparer des chaînes de caractères. C'est donc l'ordre lexicographique qui est de rigueur (équivalent de strcmp en ASCII).

Il faut donc formater ses données si l'on souhaite effectuer des comparaisons du type inférieur < / supérieur > :

  • Chaînes de caractères : pas de soucis ! :)
  • Nombres :
    • il faut qu'ils soient tous positifs - en rajoutant un offset (car l'ordre lexicographique ne pourra pas interprêter que -5 < -3, car pour lui ce serait équivalent ) 5 < 3 !). Pour cela, il faut ajouter un nombre à toutes les valeurs. Ce nombre doit être plus grand que la valeur absolue du plus petit nombre que l'on va rencontrer. Concrètement, si on stocke des nombres entre -1000 et 10000, on peut rajouter 1000 à tous les nombres stockés, et on aura des nombres entre 0 et 11000.
    • mais aussi faire du zero-padding, c'est à dire faire précéder les nombres que l'on enregistre par des zéros, car sinon on aurait 5 > 10 dans l'ordre lexicographique. Il faut donc que, au sens des chaines de caractères, les nombres fassent tous la même taille. Dans notre exemple précédent, il faut qu'ils fassent tous 5 caractères, pour avoir 00005 < 00010.
  • Dates : on peut utiliser un format timestamp, mais ce n'est pas recommandé car on a à la fois un format illisible, et en plus on tombe dans le cas des nombres. On peut utiliser des formats type MySQL ou ISO8601 qui respectent ceci : d'abord les années, puis les mois, les jours, les heures, les secondes, et tous le même timezone (par exemple +02:00 ou bien stocker en GMT) si l'on souhaite avoir cette précision. Exemple : 2011-11-30 10:00:00 < 2013-01-01 00:00:00.

SimpleDB Group By

Si vous avez besoin du group by ou des fonctions d'aggrégation qui vont avec (avg, sum, ...), alors passez votre chemin : SimpleDB ne propose d'aggrégation. La seule fonction disponible dans ce registre est count().

Performances et temps réel

Les performances ne sont pas forcément au rendez-vous : je n'ai testé que des inserts simples dans une base quasiment vide, et les performances ne sont pas terribles : 500ms pour une insertion simple, 200ms si vous appelez votre script depuis une instance de serveur chez Amazon (EC2).

Par ailleurs, si vous avez besoin de l'information tout de suite après, SimpleDB n'est pas pour vous. Il peut se passer plusieurs secondes entre le moment ou vous faites une modification et le moment ou celle-ci est répliquée sur tous les serveurs : SimpleDB va donc vous retourner un résultat non modifié si votre appel suit de trop près.

AWS SimpleDB pour quelle utilisation ?

SimpleDB n'est donc pas fait pour toutes les utilisations, loin de là ! Mais on peut trouver des cas où SimpleDB se révèle être un bon choix : prix, taille du stockage, disponibilité (pas de problèmes serveur ou machine à gérer), redondance...

Il y a beaucoup de contraintes, comme on a pu le voir, et celles-ci ne sont pas toutes listées... Mais je trouve quand même ce système bien utile dans certains cas, notamment pour tout ce qui est log system : en effet, en général on stocke une information mais on n'en a pas besoin immédiatement, les requêtes se font sur des sous-ensembles bien déterminés. En plus, on peut stocker des attributs complètement hétérogènes dans la même base de données selon le type d'évènement que l'on désire logguer.

Aller plus loin

Référence Amazon AWS SimpleDB

Dans la série des jeux avec un très bon rapport prix/temps de jeu, toujours dans les puzzles, voici un deuxième exemple de ce qu'on peut réaliser : TrainYard.

TrainYard : un puzzle game sur les trains

TrainYard est un jeu dans lequel vous devez construire les routes qui vont permettre aux trains d'arriver à destination. Il y a plusieurs niveaux de complications :

  • La couleur d'un train est importante : le train d'une couleur doit arriver dans la gare de la même couleur ;
  • Il n'y a pas de collision de train : les trains peuvent se croiser ;
  • Si des trains se croisent, chacun voit sa couleur mélangée avec la couleur de l'autre. Si deux bleus se croisent, rien ne se passe. Si un bleu croise un jaune, les deux deviennent verts ;
  • Si deux trains se superposent, ils fusionnent et mélangent leur couleur ;
  • et pleins d'autres cas à décrouvrir : coloriage de train, duplication de train et retour aux couleurs primaires, etc.

Feedback

J'ai a-do-ré ce jeu : les niveaux sont bien sur de plus en plus complexes, et on se prend au jeu. On y passe des heures et pour le prix qu'on a payé (79 cts) c'est bien rentabilisé ! Les amateurs de puzzle-game vont être servis : un must-have !

Téléchargements

La version d'essai : TrainYard Express  (gratuite avec uniquement certains niveaux)
La version payante : TrainYard à 0,79€ à ce jour (avec tous les niveaux !)

A voir également

Aargon, un jeu de puzzle/réflexion pour iPhone et iPad avec des lasers, et encore des couleurs !

Introduction

Il y a en général besoin de 3 fichiers différents avec SSL : une clé privée pour le serveur (key ou pem), un certificat (cer ou crt) distribué au client pour le chiffrement SSL, et la chaine de confiance (chain ou txt)  qui consiste en une suite de certificats tous signés les uns par les autres, et qui permet ensuite de remonter à un certificat racine installé sur votre ordinateur.

Le script que je vous propose permet de vérifier si un certificat serveur SSL est valide, c'est à dire :

  • de vérifier que la clé privée correspond bien au certificat ;
  • de vérifier que la chaine de confiance est valide.

Fonctionnement du script

Pour vérifier votre domain example.com, il vous faudra les 3 fichiers mentionnés plus haut, c'est à dire :

  • example.com.key : la clé privée
  • example.com.cer : le certificat
  • example.com.chain.txt : la chaine de confiance

Le script va vérifier que la clé et le certificat ont la même signature (avec l'argument -modulus de openssl), et vérifier le certificat avec la commande openssl verify.

 Le script

  1. #!/bin/sh
  2.  
  3. DOMAIN="$1"
  4.  
  5. if [ -z "$DOMAIN" ]; then
  6.   echo "Usage : "$(basename "$0")" domain" >&2
  7.   echo "  Will check if \$domain.key, \$domain.cer and \$domain.chain.txt are correct" >&2
  8.   exit 1
  9. fi
  10.  
  11. # Check key and certificate modulus
  12. KEY_MOD=$(openssl rsa  -noout -modulus -in ${DOMAIN}.key | openssl md5)
  13. CER_MOD=$(openssl x509 -noout -modulus -in ${DOMAIN}.cer | openssl md5)
  14.  
  15. if [ "${KEY_MOD}" != "${CER_MOD}" ]; then
  16.   echo "Error : key does not match certificate" >&2
  17.   exit 2
  18. fi
  19.  
  20. # Check certificate consistency
  21. openssl verify -CApath /etc/ssl/certs -CAfile ${DOMAIN}.chain.txt ${DOMAIN}.cer | grep -q "^${DOMAIN}.cer: OK$"
  22. if [ $? -ne 0 ]; then
  23.   openssl verify -CApath /etc/ssl/certs -CAfile ${DOMAIN}.chain.txt ${DOMAIN}.cer >&2
  24.   echo "Error while verifying certificate chain" >&2
  25.   exit 3
  26. fi
  27.  
  28. echo "Success"
  29. exit 0
  30.  

Télécharger le script

Les extensions sur Safari Mac OS X et Windows

Depuis quelques temps, Safari a sorti une API qui permet de faire des extensions. Les extensions sont  officiellement disponibles depuis Safari 5.0, à travers une API Javascript, qui se comporte à peu près comme l'API des extensions pour Chrome. Une nouvelle couche (principalement d'évènements) a été ajoutée à cette API depuis Safari 5.1, et ça, ça change tout ! En effet, on peut désormais catcher les évènements qui concernent les chargements des pages. Ca peut paraître anodin, mais dans le cas de certaines extensions, c'est vital !

Malheureusement, ce système d'extension est beaucoup moins permissif que l'ancien système... enfin quand je dis ancien système, je parle d'une méthode barbare consistant à charger son code et à redéfinir différentes fonctions de l'exécutable Safari... autant dire énormément de reverse engeneering à faire pour un module non portable et qui risque de ne plus marcher avec les versions suivantes, voire de faire planter complètement Safari !

Aperçu des possibilités

Les principales fonctionnalités sont là :

  • faire un bouton dans la barre d'outils (mais pas en couleur, juste en noir et blanc... merci Apple...) ;
  • exécuter des scripts dans une page, au chargement ou à la demande ;
  • faire des menus personnalisés (selon un certain standard : icone, texte, action/sous-menu) ;
  • et surtout, faire une barre d'outils en HTML (certes, il n'est possible d'utiliser que la hauteur de la barre, donc il est impossible de faire des menus, mais c'est déjà bien !)

La completion automatique de l'API

Le gros problème lorsque l'on utilise ce genre d'API, c'est que la completion automatique dans les éditeurs est rarement au rendez-vous.

J'ai donc généré un fichier Javascript qui décrit la variable globale safari, en utilisant JSDoc.

Cliquez ici pour télécharger le fichier javascript (v5.1), pour l'ajouter ensuite à votre éditeur.

Plus d'informations sur les extensions Safari

Vous trouverez plus d'informations sur les extensions Safari sur le site dédié aux développeurs Apple, avec principalement deux documents réellement complémentaires :

Les développeurs HTML le savent bien : impossible de faire des styles uniformes sous tous les navigateurs ! Chacun a ses particularités : chrome et ses webkit-, safari qui n'en met pas et firefox qui -moz ifie un peu tout... et IE qui ne fait rien !

La solution pour IE : PIE.htc

La solution proposée ici a été développée pour supporter le CSS 3 sur Internet Explorer. Pour ce faire, on utilise une particularité CSS de Internet Explorer pour exécuter du JavaScript, qui va recréer le style CSS 3.

Voir la démo sur css3pie.com

Mise en place

Il suffit de rajouter une ligne CSS au style des éléments qui ont du CSS3.

  1. <style type="text/css">
  2. .rounded-corner5
  3. {
  4.   -webkit-border-radius: 5px; /* Chrome */
  5.   border-radius: 5px; /* CSS3 */
  6.   -moz-border-radius: 5px; /* Mozilla */
  7.   behavior: url(PIE.htc); /* Internet Explorer */
  8. }
  9. </style>

Exemple d'utilisation

Ceci est un div en exemple, avec des bords arrondis

Dépannage : quelques règles à respecter tout de même...

Il y a principalement deux problèmes qui peuvent être rencontrés :

  1. Mime-type : par défaut sous linux, le fichier .htc est reconnu comme étant du type text/html, mais doit être du type text/x-component pour que ça fonctionne. Plusieurs solutions, en fonction de ce que vous pouvez faire : modifier la configuration du serveur /etc/mime.types pour rajouter ce champ, rajouter la ligne AddType text/x-component .htc à votre configuration apache ou .htaccess, ou enfin créer un fichier de script du type PHP en utilisant le code header('Content-type: text/x-component') pour spécifier le type contenu.
  2. Domaine, répertoire et droits : le CSS ne va fonctionner que si le fichier .htc est sur le même domaine que le site qui sert le HTML : impossible donc d'utiliser la traditionnelle et non moins nécessaire segmentation des contenus dynamiques/statiques. Du coup, les rendu CSS3 utilisant des url() risquent d'être mal considérées si le chemin est relatif.

English version : CSS3 for Internet Explorer with PIE.htc

Les développeurs le savent bien : comment faire marcher son site sur les autres navigateurs relève à la fois du casse-tête et de la patience : le casse-tête de faire des feuilles de styles compatibles, et la patience pour avoir un environnement permettant de tester tout ça...

IETester

IETester est un logiciel qui vous permet de tester votre site internet sous les différentes versions d'Internet Explorer : IE5.5, IE6, IE6, IE8, IE9, IE10...

Le principe est simple : vous avez des onglets qui vont appeler les différents moteurs de rendus des précédentes versions de IE.

Cerise sur le gâteau : des outils de développements

Non content de fournir déjà ce premier service, IETester englobe aussi des outils de développement : la possibilité de voir le code HTML interprété, mais aussi le style interprété (par le parser IE, pas par IE lui-même !), un DOM explorer...

Par ailleurs, le logiciel dispose aussi de boutons raccourcis bien pratique, comme le rechargement d'une page sans l'utilisation du cache.

Limites : les extensions

Malheureusement - et ce n'est pas du tout un reproche tellement la problématique est différente et complexe - ceci n'est pas une solution pour tester ses extensions sous les différentes version de IE, et ce pour plusieurs raisons :

  • IETester n'utilise que le moteur de rendu, donc il n'est pas possible d'ajouter des interfaces (boutons, toolbar, ...) ou des BHO a fortiori ;
  • les extensions doivent aussi être testées sous les différentes version de windows et différents environnements : XP, Vista, 7 sous différents SP, mais aussi en mode de confidentialité ou non.

Pour ça, je crois que la seule solution est d'utiliser des Virtual Machines conjointement avec des Snapshots.

Voici un petit moyen de tester si un certificat ssl est valide, et s'il le restera encore pendant un certain temps...

Openssl s_client et openssl x509

Openssl donne deux outils qui vont nous servir.

1. Le premier permet de se connecter à un serveur pour envoyer des requêtes

openssl s_client -connect www.openssl.org:443

Cette commande va se connecter au server www.openssl.org sur le port 443 en utilisant le protocole SSL. Vous pourrez ensuite communiquer avec le serveur en HTTP :

GET / HTTP/1.0
Host : www.openssl.org

et le serveur va vous renvoyer la page. On peut aussi utiliser cette technique sur d'autres ports et d'autres protocoles, comme pour le SMTPs, le POPs, etc.

2. Le deuxième permet d'avoir des informations sur le certificat : est-il valide ? Quelle est sa date d'expiration ? Il suffit de piper la première commande avec la deuxième :

echo | openssl s_client -connect www.openssl.org:443 | openssl x509 -noout -enddate

Quelques astuces avec openssl

  • Si openssl vous sort qu'un certificat dans la chaîne n'est pas valide, donnez-lui le chemin vers le dossier contenant les certificats racines, par exemple -CApath /etc/ssl/certs
  • Si vous voulez éviter d'avoir les erreurs de la première commande en sortie, envoyez-les vers /dev/null : openssl s_client -connect www.openssl.org:443 2> /dev/null
  • Si vous voulez connaitres les différentes options de openssl s_client ou de openssl x509, essayez man ssl-s_client ou man ssl-x509

Petit bonus : le script PHP qui teste si un certificat expire bientôt

  1. $args = 'www.openssl.org:443';
  2. $command =
  3.   'date +%s -d "$(LANG=C openssl s_client -connect '
  4.   .escapeshellarg($args)
  5.   .' -CApath /etc/ssl/certs/ < /dev/null 2>/dev/null | openssl x509 -noout -text -enddate | tail -n1 | cut -d= -f2)"';
  6.  
  7. exec($command, $output);
  8.  
  9. $time = array_shift($output);
  10. if(!is_numeric($time) || $time == 0)
  11. {
  12.   // Erreur : impossible de tester la validité du certificat : pourquoi ?
  13. }
  14. else
  15. {
  16.   // On va avoir le nombre de jour restant
  17.   $nDaysLeft = floor(($time - time())/86400);
  18. }
  19.  

Articles sources

Tester la date de fin d'un certificat : http://www.brandonhutchinson.com/When_does_my_certificate_expire%3F.html
Tester la validité du certificat avec les certificats racines : http://stackoverflow.com/questions/4103472/ssl-handshake-fails-with-a-verisign-chain-certificate-that-contains-two-ca-si

Voici comment mettre en pause un processus sous linux, et comment le redémarrer.

kill, ne me tue pas !

La commande kill permet d'envoyer des signaux à un processus, par exemple pour lui dire de s'arrêter :
kill $pid

On peut préciser à la commande kill le signal que l'on souhaite envoyer. Par exemple, pour tuer un processus récalcitrant à s'arrêter, on peut envoyer le signal 9 SIGKILL :
kill -9 $pid

Stop and restart

Pour dire à un processus de s'arrêter temporairement, puis de redémarrer, il faut envoyer les signaux SIGSTOP pour l'arrêter, et SIGCONT pour lui dire de continuer :

kill -SIGSTOP $pid # Stop
kill -SIGCONT $pid # Start

Astuce : si vous ne voulez pas recopier le numéro du processus et que vous préférez utiliser le nom de l'exécutable, utilisez la commande killall.

Ceci est un autre petit memo sur les iptables. Ici, nous allons voir comment rediriger toutes les requêtes sortantes vers un port local de notre machine. Le but est de proposer une solution pour accéder à des services qui se trouvent derrière un firewall, alors que l'on possède par exemple une connexion ssh.

Ce memo complète le précédent sur la redirection de paquets qui nous sont destinés.

Petit rappel : mise en place du NAT

Pour créer une passerelle, il faut activer le transfert de paquet et la translation d'adresses :

sysctl net.ipv4.ip_forward=1
iptables -A POSTROUTING -o eth0 -j MASQUERADE

Mise en place d'un tunnel transparent

On procède ici en deux étapes : d'abord la création du tunnel en tant que tel :

ssh -L port_local:ip_destination:port_destination user@host

port_local : c'est le port de notre machine sur lequel le service sera disponible
ip_destination : c'est l'ip (ou le nom dns) de la machine à laquelle nous voulons avoir accès
port_destination : c'est le port de la machine à laquelle nous voulons avoir accès
user@host : ce sont les utilisateurs et la machine sur laquelle nous allons nous connecter pour accéder à notre destination finale

Ensuite, nous allons automatiser la redirection des paquets avec iptables :

iptables -t nat -A OUTPUT -d $ip_destination -p tcp \
  --dport $port_destination -j REDIRECT --to-ports $port_local
iptables -t nat -A PREROUTING -d $ip_destination -p tcp \
  --dport $port_destination -j REDIRECT --to-ports $port_local

La première ligne est pour nous : elle permet à la machine elle-même d'accéder dorénavant au nouveau service comme d'habitude.
La deuxième ligne est pour le nat à proprement parler : elle permet de rediriger automatiquement les paquets des machines qui nous utilisent comme passerelle.

Plus d'informations sur le fonctionnement des iptables : iptables tutorial, très complet.