L'appartement

Aller au contenu | Aller au menu | Aller à la recherche

Le codage

Pep, ne me tue parceque je fais une section php et pas une section shellscript, une c++ ;-) Je savais quoi mettre !

Fil des billets

mardi, février 1 2011

Mailings et mails transactionnels via Amazon SES (Simple Email Service)

Suite à mon billet sur le streaming avec Amazon Cloudfront[1], je vous propose d'aborder et de tester un autre service d’Amazon WebServices : Amazon Simple Email Service (SES)

De quoi s’agit-il ?

Amazon SES est un service d’envoi de mails directement via les serveurs d’Amazon WebService (AWS). Il ne s’agit pas de “créer des boîtes mails” mais de l’utiliser pour envoyer des messages transactionnels (par exemple : un mail de confirmation de commande ou d’inscription) ou des mailings.

Combien ça coûte ?

Comme les autres services d’Amazon Webservices, c’est un paiement à l’utilisation (pay for use). Les tarifs commencent à partir de 0,10 $ le millier de mails et 0,10 $ par Giga de données. Le premier Giga étant gratuit. Consultez la grille de tarification pour les détails.

Les utilisateurs d’instance Amazon EC2 (serveur d’application Amazon) bénéficient de 2000 mails gratuits par jour depuis leurs instances.

En quoi est-ce intéressant ?

Ce nouveau service est intéressant sur plusieurs aspects. En voici quelques uns.

Ne pas s’occuper de la gestion d’un serveur de mail

Vous disposez d’un serveur web simple et vous ne souhaitez pas vous encombrer avec la gestion d'un serveur de mail pour l’envoi de vos messages transactionnels ou vos mailings. Amazon permet d’une part d’envoyer vos messages directement en HTTP depuis vos scripts, et d’autre part fournit un wrapper pour Postfix (d'autres viendront sans doute) qui vous permet de diriger tous les messages sortant de votre serveur vers Amazon SES.

Améliorer la délivrabilité des messages

En plus de la relative complexité qu’il peut y avoir à maintenir un serveur de mail, une problématique récurrente se pose : que vos messages ne finissent pas dans le courrier indésirable des utilisateurs !

Pour ça, on peut compter sur la bonne réputation (supposée) des adresses IP d’Amazon et une configuration, qu'on espère correcte, de leurs serveurs. Comme d'habitude pour les services AWS, la société américaine ne fait que mettre à profit son expérience acquise dans son activité d'e-commerçant.

Tout va se jouer sur la capacité d’Amazon à maintenir une solide réputation sur les adresses IP utilisées par son service. En d’autres termes qu’aucun SPAM ne transitent par leurs serveurs !

Pour cette raison, Amazon à décider de mettre en place un système qui peut-être assez contraignant : le quota d’envoi par utilisateur augmentera (ou diminuera) progressivement uniquement si il n’y a pas de plainte relative aux messages envoyés par celui-ci et que ses listes sont propres (en fonction notamment d’un taux de rebonds[2] acceptable).

Enfin, il est indiqué que tous les mails envoyés via la plateforme sont scannés par l’antispam maison. Quel sera son niveau de tolérance ? Mystère pour l’instant sur ce point...

Vous êtes sur un hébergement mutualisé

Si vous êtes sur un hébergement mutualisé, Amazon SES peut-être également intéressant pour vous à 2 niveaux :

- Si vous souhaitez réaliser des campagnes de mailing depuis votre hébergement mutualisé mais que les contraintes volumétriques imposées par votre hébergeur ne vous le permettent pas

- Pour les points plus haut concernant la délivrabilité et la réputation parfois défaillante de certaines adresses IP d’hébergeurs mutualisés low cost.

Comment utiliser Amazon SES depuis vos scripts PHP

L’idée vous plaît ou vous souhaitez simplement essayer, rentrons dans le vif du sujet ;)

Pour vos tests, Amazon propose une sandbox (bac à sable) limitée à 200 mails par jour et depuis laquelle vous ne pouvez envoyer que vers et depuis des adresses vérifiées (voir plus bas)

Première étape, si vous n'avez pas de compte AWS, ouvrez-en un. Notez que même pour utiliser la sandbox, une carte bancaire et un numéro de téléphone valide sont nécessaires. Pour ce dernier, il y a en effet une vérification de votre identité via un callback téléphonique.

Deuxième étape, téléchargez le SDK PHP d’Amazon. A l’heure ou j’écris ces lignes, vous devez récupérer la version sur github. La version téléchargeable directement sur le site AWS ne contient pas la classe d’accès à SES.

Troisième étape, récupérez vos clés pour l'API AWS sur votre compte. Renommez le fichier config-dist.inc.php du SDK et précisez les paramètres d'authentification dedans.

Quatrième étape, ajoutez des adresses “vérifiées”. Dans la sandbox, vous pouvez envoyer des messages uniquement depuis et à destination d’adresses vérifiées. SES va envoyer à ses adresses un message contenant un lien servant à valider l’adresse.

Pour vérifier une adresse :

// appel du SDK
require_once './AWS/sdk.class.php';

// instanciation de la classe SES
$ses = new AmazonSES();

// vérifier une adresse (ou un array d'adresse)
print_r($ses->verify_email_address('yves@example.tld'));

Vous pouvez maintenant essayez le service avec cette adresse email vérifiée. Dans un premier temps, lancez une requête pour obtenir votre quota d’envoi :

print_r($ses->get_send_quota());

Si vous obtenez une réponse "200 OK" et le quota, vous pouvez tester l’envoi d’un message :

// adresse(s) de destination (vérifiées pour utiliser la sandbox)
$destination = array(
    'ToAddresses' => 'yves@example.tld', // array possible
);
$message = array(
    'Subject.Data' => 'Sujet',
    'Body.Text.Data' => 'Test'
);
$ses->send_email('yves@example.tld', $destination, $message);

Ce service étant encore en version beta, il est évident que les fonctionnalités s’étofferont au fur et à mesure des semaines.

Notes

[1] on m'a d'ailleurs fait justement remarquer dans les commentaires qu'Amazon n'était pas l'entreprise la plus respectable qui soit depuis l'affaire wikilieaks

[2] mails retournés avec une erreur

vendredi, janvier 28 2011

Streamer vos vidéos avec Amazon Cloudfront

Dans la plupart des cas de diffusion de vidéos, le pseudo-streaming (ou progressive download) suffit. Il s'agit dans ce cas de diffuser les contenus en format FLV ou MP4. Le seaking (la possibilité d'avancer sur une partie de la vidéo qui n'est pas encore téléchargée) pouvant être géré par l'ajout de keyframes dans le fichier multimédia et l'utilisation d'un serveur web supportant correctement le pseudo-streaming. Je citerais par exemple :

Dans un certain nombre d'autres cas, il peut-être intéressant, voir nécessaire, de diffuser ses vidéos par le biais d'un "vrai" serveur de streaming de type RED5 ou Adobe Flash Media Server. On peut notamment citer :

  • la diffusion de flux en direct
  • la diffusion de vidéos d'une durée importante
  • une protection plus avancée contre le téléchargement des contenus multimédias[1].

Il est depuis quelques temps possible de diffuser en streaming ses vidéos à peu de frais et sans rentrer dans la gestion lourde d'un RED5 ou d'un AFMS.

C'est Amazon Webservices qui propose cette fonctionnalité via son service Amazon Cloudfront. Je vous propose une introduction sur le service et la diffusion de vidéos via le lecteur Flash JW Player.

Qu'est-ce qu'Amazon Cloudfront ?

Amazon Cloudfront est un CDN (Content Delivery Network).

En résumé, le service diffuse vos contenus non pas depuis un unique centre de données mais depuis plusieurs répartis sur la planète. Les requêtes des internautes sont automatiquement routées sur l'emplacement le plus proche de celui-ci. Ceci réduit la latence pour les visiteurs de l’autre bout du monde et diminue la charge sur votre site.

Mais, en l'occurrence, ce n'est pas cette fonctionnalité (sauf si vous avez une audience internationale importante) qui nous intéresse, mais plutôt la possibilité de créer en quelques clics un serveur de diffusion en streaming administré par Amazon Webservices.

Combien ça coûte ?

Comme tous les autres services AWS (Amazon WebServices), le service est facturé à l'utilisation (pay-per-use). Vous payez principalement en fonction :

  • du volume de données stockées
  • du volume de données en entrée et en sortie
  • du nombre de requêtes GET/POST/PUT/LIST

Consultez la grille de tarification pour les détails

Le calcul n’est pas forcément évident mais vous pourrez suivre au jour le jour votre consommation directement sur votre compte Amazon Webservices.

Notez qu'AWS propose également une calculatrice de coût

J'essayerais d'ajouter prochainement à cet article un cas concret en terme de coût – contenu - fréquentation

Comment l'utiliser ?

Si vous n'êtes pas familier avec Amazon Webservices sachez, pour résumer, qu'AWS tourne autour :

  • de plusieurs API permettant de communiquer avec les différents services. Des kits de développement pour plusieurs langages sont d’ailleurs fournis par Amazon et l'écosystème est plutôt bien fourni.
  • d'une interface web de gestion.

Pour commencer, vous devez vous inscrire et fournir un numéro de carte bancaire, seul moyen de paiement actuellement accepté. Certains services nécessitent également une activation du compte par callback téléphonique. Précisez donc un numéro de téléphone valide. A ce stade, vous ne payez rien. Je le répète, le paiement se fait à l’utilisation.

Créer un espace de stockage Amazon S3

Pour diffuser vos contenus via Cloudfront, vous ne pouvez actuellement pas les héberger ailleurs que chez Amazon. Le service de stockage d'Amazon est plus connu. Il s'agit de S3 (Simple Storage Service). Le service est également facturé à l'utilisation.

Je passe sur le détail de création et d'envoi de vos fichiers sur AWS S3. On trouve pas mal de documentation sur le sujet.

Istance S3 Un bucket Amazon S3 contenant les fichiers FLV. Ne tenez pas compte des fichiers XML ;)

Disons donc qu'il est nécessaire de créer un bucket Amazon S3 qui sera lié à votre serveur Adobe Flash Media Server sur Cloudfront.

Pensez-bien à rendre les fichiers de votre bucket public et déposez ensuite un fichier FLV ou MP4 sur celui-ci

Créez un serveur Adobe Flash Media Server

Sur la console AWS, créez maintenant une distribution Amazon CloudFront de type Streaming (Adobe Flash Media Server) et liez là à votre bucket en cliquant sur « Create distribution ». Choisissez le bucket S3 qui contient vos vidéos.

Vous obtiendrez ceci : Instance Cloudfront

A ce stade, vos vidéos sont accessibles en streaming ! Essayez simplement d'en lire une avec VLC ou un lecteur gérant correctement ce type de diffusion. L'adresse est de la forme :

rtmp://IDENTIFIANT_MACHINE.cloudfront.net/cfx/st/monfichier.flv (ou mp4)

Il s'agit d'une diffusion en RTMP sur le port avec un failover sur le port 80 en cas de pare-feu un peu trop exigeant.

Si ça ne fonctionne pas, vérifiez que votre fichier vidéo est bien public sur votre bucket Amazon S3 en y accédant directement en HTTP. Par exemple : http://monbucket.amazonaws.com/monfichier.flv (ou mp4)

Si votre serveur de streaming est bien fonctionnel (bravo bravo !), vous pouvez l'utilisez avec un lecteur flash supportant la diffusion en RTMP

Option : vous pouvez créer un CNAME sur votre zone DNS pour remplacer l'URL de Cloudfront par la votre :

stream IN CNAME  IDENTIFIANT_MACHINE.cloudfront.net

Utiliser JW Player avec Amazon Cloudfront

A ce stade, je vais supposer que vous n'avez pas de difficulté à installer JWplayer et à le faire fonctionner, dans un premier temps, avec une vidéo hébergée chez vous.

Vous devez maintenant utiliser les éléments de configuration suivant pour diffuser la vidéo hébergée sur le cloud Amazon :

Préciser dans votre configuration JW Player les variables suivantes :

provider=rtmp
streamer=rtmp://IDENTIFIANT_MACHINE.cloudfront.net/cfx/st
file=monfichier.flv (ou mp4)

Dans le cas de l'utilisation de la balise object, on obtient donc :

file=monfichier.flv&streamer=rtmp://IDENTIFIANT_MACHINE .cloudfront.net/cfx/st&provider=rtmp

Et c’est tout ! Vous voici prêt à diffuser des contenus via « votre » serveur de streaming !

Notes

[1] même si, vous en conviendrez, il n'existe aucun moyen d'empêcher le téléchargement. Et ne me parlez pas de DRM !

vendredi, mai 7 2010

Freecommande, une WebApp pour contrôler votre Freebox

Free a sortie la semaine dernière une API qui permet de contrôler son boitier Freebox HD.

Pour le fun, j'ai rapidement réalisé une petite "application web" (basique de chez basique) pour iPhone ou tout autre navigateur ayant la même résolution (320px x 460px / je n'ai testé que sur iPhone).

Un peu de Javascript et de CSS et le tour est joué :

Freecommande pour télécommander votre Freebox

Inutile donc indispensable ;)

Pour l'avoir en plein écran sur iPhone, cliquez sur le "+" de Safari et ajoutez le site à l'écran d'accueil !

A venir dès que je trouve un peu de temps :

  • Le clavier azerty complet
  • La liste des chaines MAJ du 8 mai => liste des chaines
  • Les programmes TV

Notez que le code que vous devez rentrer est accessible sur l'écran de la TV dans les paramètres généraux. Il est nécessaire d'avoir le dernier Firmware. Redémarrez la Freebox et le boitier HD pour en être sur.

Rassurez-vous, Le code est enregistré en local sur votre iPhone via un cookies

Les sources seront prochainement disponibles.

Bon amusement !

jeudi, mars 4 2010

Une nouvelle version de sendNews

Après un certain nombre de tests et d'utilisations en production, voici une nouvelle version de mon script de mailing en PHP

En plus des habituelles corrections de bugs, celle-ci intègre une nouvelle fonctionnalité très demandée permettant de personnaliser les messages pour chaque expéditeur.

Le principe est simple : il suffit d'utiliser le marqueur {_(nom_du_champ)_} dans votre fichier HTML

Par exemple : dans ma table SQL, j'ai le champ "nom". Dans le fichier HTML qui compose mon message, je place donc "Bonjour, {_(nom)_}"

J'ai testé cette fonctionnalité sur des envois de plusieurs lettres de plus de 25000/30000 abonnés et je n'ai noté aucun problème.

Le script est téléchargeable sur github

Et je rappelle que le mini site est toujours en ligne (mais pas à jour)

Le développement continue au fur et à mesure de l'utilisation du script, et j'espère proposer prochainement quelques fonctionnalités sympathiques en cours de test...

mardi, janvier 19 2010

[tips] Colonnes de la même hauteur avec jQuery

Un truc simple mais efficace pour obtenir des colonnes de tailles égales malgré des contenus de tailles différentes.

Colonnes Différentes Tailles

Voici une exemple avec trois colonnes : #colonne_un, #colonne_deux, #colonne_trois et la classe .colonne sur chacune.

var maxCol = Math.max($('#colonne_un').height(),$('#colonne_deux').height(),$('#colonne_trois').height());
$('.colonne').height(maxCol);  

vendredi, novembre 27 2009

Les vidéos de votre site intégrées et lisibles directement sur Facebook

Vous souhaitez, à l'instar de Youtube ou Dailymotion, que vos visiteurs, également utilisateurs de Facebook, puissent ajouter directement les vidéos de votre site sur leur mur ? C'est très simple.

Première étape, intégrer les balises méta demandées par Facebook

Le ''wiki developer'' de Facebook est assez explicite sur les balises meta à intégrer dans le head de vos pages contenant des vidéos. (exemple dans le code source de cette page)

<meta name="title" content="video_title" /> 
<meta name="description" content="video_description" /> 
<link rel="image_src" href="video_screenshot_image_src url" /> 
<link rel="video_src" href="video_src url"/>
<meta name="video_height" content="video_height" />
<meta name="video_width" content="video_width" /> 
<meta name="video_type" content="Content-Type header field" />

Deuxième étape : demandez à facebook de whitelister votre domaine

Pour cette étape :

1. connectez vous sur l'application Facebook Developper

2. postez un message sur Developer Help Contact Form en précisant la catégorie de demande Embedding Videos On Facebook. Dans le champ Link, précisez bien le domaine sur lequel vous souhaitez cette autorisation.

3. patientez en attendant un message de Facedebouc

that's all folks !

mardi, octobre 13 2009

Une nouvelle version du script de mailing avec gestion des bounces

Disclaimer : Ce programme reste en version beta. Je l'utilise en production mais pas la peine de m'insulter si vous ne parvenez pas à l'utiliser !

Je suis heureux de proposer enfin une nouvelle version de mon script de mass mailing et d'analyse des bounces en PHP (CLI). Il y a pas mal d'améliorations et de corrections par rapport à la version précédente.

On peux déjà noter que pour plus de lisibilité, j'ai développé un mini-site avec pas mal d'informations utiles sur la chose.

Une des autres principales nouveautés réside dans l'analyse des mails invalides, via les « bounces ».

Rien n'est plus problématique qu'une liste d'abonnés à moitié fausse ! Il est de plus en plus fréquent que les fournisseurs blacklistent des adresses IP qui tentent d'expédier beaucoup trop de messages à destination d'adresses inexistantes.

Pour cette fonctionnalité, j'ai choisi d'analyser la boite qui reçoit les erreurs (celle précisée par l'entête return-path du mail).

Tant que tous les serveurs de mail ne se donneront pas la main pour chanter en cœur ne respecteront pas les RFCs à ce sujet, je ne pense pas qu'il y aura d'autre solution efficace !

Je me suis basé sur une classe trouvée sur Sourceforge [1] et mon collègue Zas a pas mal bricolé sur cette partie (corrections de bugs et optimisations) en plus des corrections sur le reste de sendNews ;)

Cette version de sendNews est depuis quelques temps en production et je suis assez satisfait du résultat. Il manque un certain nombre de règles d'analyse des bounces pour être réellement exhaustif. Quoiqu'il en soit, mes listes de diffusion ne contiennent pas un nombre beaucoup trop important d'adresses non valide.

Tous les feedbacks sur ce script sont les bienvenus !

Le site mini-site sendNews

Précédemment sur le même sujet

Notes

[1] Le développement de cette classe (bmh) a repris sous la houlette des créateurs de PHPMailer, je n'ai pas encore eu le temps d'apprécier le refactoring qui a été réalisé

jeudi, mars 5 2009

Script pratique : rechercher/remplacer/patcher comme vous voulez

Dans votre vie quotidienne de développeur et/ou d'administrateur système vous êtes sans doute confronté à la nécessité de rechercher et remplacer des motifs par lots.

L'utilisation conjointe d'une multitude d'outils le permettent efficacement sous GNU/Linux : find, grep, sed, awk, perl, diff, patch... Votre éditeur préféré possède sans doute également ce type de fonctionnalité.

Le remplacement doit parfois être assorti d'une vérification visuelle et d'une validation manuelle des différentes occurrences. Si vous changez l'intégralité de vos serveurs de nom dans les fichiers de zone de BIND, vous ne souhaitez sans doute pas qu'un de vos sites à la configuration tordue ne fonctionne plus ?

Partant de ce constat, mon collègue Zas[1] a sympathiquement concocté un script en pure bash habilement nommé search_replace ! C'est un savant mélange de find, sed, awk, diff(color) et patch qui a l'avantage de la simplicité (3 ko tout mouillé).

Comment ça marche ?!

  • On recherche un pattern donné sur un répertoire (exemple, la chaine « ma chaine » sur les fichiers .php du répertoire /var/www)
  • Pour chaque occurrence, un diff - en couleur, si vous avez installé colordiff - et dans le contexte vous permet de visualiser les changements qui seront appliqués
  • A chaque étape, vous choisissez :
    • d'accepter ou pas cette modification et de passer à l'occurrence suivante
    • de modifier manuellement via votre éditeur préféré VIM
    • d'annuler les actions en cours
  • Vous pouvez bien sur choisir de remplacer le tout sans confirmation ni vérification
  • Au final, vous choisissez d'appliquer les modifications ou de garder le patch pour plus tard.
  • Cerise sur le pompon, l'utilisation du patch vous permet de revenir sur les modifications si vous avez tout cassé !

Télécharger search_replace (tar.gz / 3ko)

Notes

[1] Je vous invite à essayer geeqie, co-développé par Zas

lundi, octobre 20 2008

Script minimaliste : génération des clés DKIM et ajout de l'enregistrement DNS

Un script pour ajouter un domaine dont on veux signer les mails via DKIMproxy. Celui-ci est forcément lié à mon article sur le sujet : "Installer la signature DKIM sur Postfix avec DKIMproxy". Vous pouvez très facilement l'adapter à votre usage.

Que fait ce script :

  • crée la clé publique et la clé privée dans le répertoire keys de DKIMproxy
  • change les droits sur la clé privée
  • sur demande, ajoute l'enregistrement dans le fichier de zone du domaine
  • ajoute les informations qui vont bien dans le fichier sender_map de DKIMproxy

On le lance de la façon suivante

./generate_keys domain.tld

Il faut ensuite incrémenter le numéro de série de la zone, relancer BIND et DKIMproxy.

Le script

#!/bin/bash

# Yves Tannier [grafactory.net] 2008 GPL...

# private/public keys path
PATH_KEYS='/usr/local/dkimproxy/keys'

# sender_map file path
PATH_SENDER_MAP='/usr/local/dkimproxy/sender_map'

# dkimuser
USER_GROUP='dkim:dkim'

# domain on parametre
DOMAIN=$1

# bind file path (optional)
ZONE_PATH="/var/cache/bind/$DOMAIN.hosts"

openssl genrsa -out $PATH_KEYS/$DOMAIN.key 1024
openssl rsa -in $PATH_KEYS/$DOMAIN.key -pubout -out $PATH_KEYS/${DOMAIN}_pub.key

# chg right
chown $USER_GROUP $PATH_KEYS/$DOMAIN.key
chmod 640 $PATH_KEYS/$DOMAIN.key

# Adding DKIM key on BIND Zone ?
echo
echo -n "Add DKIM key on BIND zone file ? ([Y]/n) "
read ans
if [ ! _$ans = _y -o _$ans = _Y ]; then

    # bind file
    echo -n "BIND Zone filename ($ZONE_PATH) : "
    read ${ZONE_PATH_READ}

    if [ ! -z "$ZONE_PATH_READ" ]; then
        ZONE_PATH=${ZONE_PATH_READ}
    fi

    # public key one line
    PUBLIC_KEY=$(cat $PATH_KEYS/${DOMAIN}_pub.key | sed -n '/BEGIN PUBLIC KEY/,/END PUBLIC KEY/p' | sed '/PUBLIC KEY/d' | tr -d '\n')

    # write
    echo
    echo "_domainkey.$DOMAIN.               IN TXT      \"t=y; o=-;\"" >> $ZONE_PATH
    echo "$DOMAIN._domainkey.$DOMAIN.       IN TXT      \"k=rsa; t=s; p=$PUBLIC_KEY\"" >> $ZONE_PATH

fi

SM="$DOMAIN dkim(c=simple,s=$DOMAIN,a=rsa-sha1,key=$PATH_KEYS/$DOMAIN.key), domainkeys(c=nofws,s=$DOMAIN,key=$PATH_KEYS/$DOMAIN.key)"
echo $SM >> $PATH_SENDER_MAP

echo
echo "Please, restart DKIMproxy !"
echo
echo "... And maybe BIND with new serial on $ZONE_PATH !"

Au format compressé : generate_keys.tar.gz

N'hésitez pas à me proposer vos améliorations.

mercredi, février 27 2008

Un script de monitoring ultra simpliste

Loin de Nagios et de ses innombrables possibilités, voici un script bash minimaliste pour tester la disponibilité d'une machine ou plusieurs machines via un ping et recevoir, en cas de non réponse, les alertes par SMS[1] et/ou mail. Le principe est le suivant :

  • on teste toutes les X minutes la disponibilité des hôtes
  • si une machine est détectée down, on le note dans un fichier temporaire
  • si 5 minutes après la machine est toujours down, on lance les alertes
  • quand la machine est de nouveau up, on renvoi un mail (pas de SMS dans ce cas)

Pour configurer le script, il suffit de préciser les variables commentées au début du fichier.

#!/bin/bash

# pingTest par Yves et Thierry
# http://www.grafactory.net/blog/
# 2008 / Licence LGPL

# les hotes a tester
HOSTS="domain.tld autredomaine.tld"

# sujets des mails
SUBJECT="machine down"
SUBJECT_UP="machine up"

# envoyer un SMS via tm4b.com
EMAILID="moi@domain.tld"
TELID="XXXXX"
PASSWD="XXXXX"

# envoyer un simple mail
EMAILSIMPLE="moi@domain.tld"

# nombre test
COUNT=4

for myHost in $HOSTS
do
    if ! ping -q -c $COUNT $myHost >> /dev/null
    # elle est KO
    then
        if [ ! -f /tmp/mail.$myHost ]
        # on n est pas encore au courant
        then
            if [ -f /tmp/ping.$myHost ]
                # elle etait KO cinq minutes avant, faut prevenir
            then
                # envoyer un SMS
                echo "To - $TELID\nFrom - $TELID\nMessage - La machine $myHost ne repond plus a $(date)\nPassword - $PASSWD" |\
                mail -s "[$myHost] $SUBJECT" $EMAILID
                # envoyer un mail normal
                echo "La machine $myHost ne repond plus a $(date)" |\
                mail -s "[$myHost] $SUBJECT" $EMAILSIMPLE
                #  creer le fichier pour indiquer que le mail a ete envoye
                touch /tmp/mail.$myHost
            fi
            touch /tmp/ping.$myHost
        fi
    else
        # elle n est pas KO
        if [ -f /tmp/ping.$myHost ]
        then
            rm /tmp/ping.$myHost
        fi
        if [ -f /tmp/mail.$myHost ]
        then
            rm /tmp/mail.$myHost
            # renvoyer un mail
            echo "La machine $myHost repond a nouveau a $(date)" |\
            mail -s "[$myHost] $SUBJECT_UP" $EMAILSIMPLE
        fi
    fi
done

Dans la crontab, on ajoute la ligne suivante (ici, un test toute les 5 minutes).

# faire un test de ping toutes les 5 min
*/5 * * * * /usr/local/sbin/pingtest >> /dev/null

(on suppose donc ici que le script est installé dans /usr/local/sbin/)

Toutes les améliorations sont les bienvenues ;)

Notes

[1] Pour recevoir les alertes par SMS, j'utilise le service Email to SMS de TM4B . Les SMS peuvent être de prépayés via PayPal à un tarif très intéressant. Cette société propose aussi un API très complet pour l'envoi de SMS depuis un programme, un site Web...

lundi, septembre 10 2007

Recherche Fulltext et InnoDB avec Mysql

Logo MysqlLes avantages de l'utilisation du moteur de stockage InnoDB par rapport à MysIsam sur une base de données Mysql (à partir de la version 5.02) sont non négligeables sur certains projets. Il permet l'utilisation :

  • de contraintes d'intégrité (Foreign Key ect...)
  • de triggers (déclencheurs en français dans le texte).
  • de procédures stockées
  • ...

Un inconvénient est, par contre, particulièrement pénalisant dès qu'on envisage un moteur de recherche en "texte intégral". Il est en effet impossible de créer des index FULLTEXT avec le moteur InnoDB ! L'utilisation des MATCH et autres joyeusetés est donc impossible. Le classement pertinent des résultats devient plus compliqué à mettre en oeuvre.

Je me suis retrouvé confronté à ce problème récemment et voici comment je l'ai contourné. Je résume, pour l'exemple, en une unique table, ma structure de données qui en compte quelques dizaines.

J'ai donc une table "texts" qui utilise InnoDB avec quelques champs dont le "title" sur lequel je souhaite faire les recherches (la clé primaire s'appelle "idtext").

J'ai créé une table "searchs_texts" avec le moteur MyIsam, deux champs - idtext/title - et un index FULLTEXT sur le champ "title".

Cette table contient, vous l'aurez compris, l'exacte correspondance des champs idtext/title de la table texts.

Reste à tenir à jour cette table sans modifier le code de tous le site. Les triggers vont nous être bien utile pour ça :

Un pour l'INSERT :

CREATE TRIGGER trigger_insert_texts
AFTER INSERT ON texts
FOR EACH ROW
INSERT INTO searchs_texts SET idtext=NEW.idtext, title=NEW.title;


Un pour l'UPDATE :

CREATE TRIGGER trigger_update_texts
AFTER UPDATE ON texts
FOR EACH ROW
UPDATE searchs_texts SET title=NEW.title WHERE idtext=OLD.idtext;


Et enfin, un pour le DELETE :

CREATE TRIGGER trigger_delete_texts
AFTER DELETE ON texts
FOR EACH ROW
DELETE FROM searchs_texts WHERE idtext=OLD.idtext;

Et voilà. Le tour est joué ! Maintenant, votre moteur de recherche pourra utiliser tous ce qui est disponible et bientôt concurrencer Google ;)

jeudi, octobre 5 2006

Une nouveauté pas web 2.0 de Google

Un truc sympa du maxi Google - à première vue. il faut voir à l'usage - : le moteur de recherche sur du code source. C'est Google Codesearch. Ca change des trucs web 20.0 ;)

D'après ce qu'on peux lire ici ou là, il n'y aurait pas de liens sponsorisés sur ce moteur... Pour combien de temps ? Quand on voit la foultitude de sites de "développeurs" sans aucun contenu réel et qui ne font que pomper des listes de diffusions (voir carrément des articles d'autres sites)... Tout ça, bien entendu, entouré d'un maximum de publicité, on peux se poser la question...

C'est quand même à tester !

jeudi, octobre 27 2005

Le PHP est loin d'être mort

La mode est à Ruby. Il faut programmer en Ruby pour être un vrai geek de la programmation. Ruby On Rails par çi, Ruby machin par là... C'est vrai que ça a l'air bien mais c'est à se demander si PHP n'est pas un langage de "hasbeen". Il semble en être autrement si on en croit cet article paru sur ZDnet et intitulé Oracle et IBM professionnalisent PHP. Le titre est quand même un peu mal choisi : comme si on avait attendu IBM et Oracle pour que PHP soit un langage pro !

samedi, juillet 2 2005

Du Ajax plein les yeux... XmlHttpRequest inside

La rumeur court sur la planète Webdesign, il paraît que le futur des applications Web passera peut-être par "Ajax". Mais que se cache t'il donc derrière ce nom de produit ménager ?! En tout cas mon avis est fait après quelques lectures non dénuées d'intérêts et quelques mises en applications des exemples donnés : c'est sans doute vrai qu'une petite révolution est en marche !

Google Mail ou encore Google Suggest, par exemple, sont déjà basés sur ce système et le nombre de sites qui utilisent cette technologie ne fait qu'augmenter de jour en jour.

C'est vrai qu'à la vue des possibilités offertes par ce système on peux imaginer beaucoup de mise en pratique. Avant d'en arriver là, voici un article que Bruno m'avait signalé et qui résume très bien le mode de fonctionnement des applications Web utilisant cette technologie. Si vous n'êtes pas un parfait bilingue, je vous conseille quand même de vous attarder sur le schéma explicatif...

Après avoir lu cet article, vous voudrez bien évidement connaître toutes les possibilités offertes par Ajax, et vous y essayer. C'est là qu'un petit tour dans la partie "demo" du site consacré à OpenRico - Une classe justement à cette fabuleuse technologie - vous permettra définitivement d'être convaincu que vos applications vont s'enrichir de cette nouveauté !

De mon côté, après l'avoir très modestement éprouvée sur le moteur de recherche par référence du site de La Crosse Technology, j'ai récidivé sur Theatre-contemporain.net.

Je me suis déjà attaqué à la page des éditeurs. Pour cet exemple, j'ai utilisé la classe découverte sur ce blog de qwix trouvé par hasard et qui semble être le fait d'un blogueur bisontin. Je vous livre donc tel quel, brut de décoffrage, le bout de source qui va bien :

Quelques extrait de la page qui contient la liste nominative :

// appel à la classe
// fonction javascript
<script type="text/javascript" language="javascript">
    function chargeFichier(id) {
        // Création de l'objet
        var XHR = new XHRConnection();
        // Zone a remplir
        XHR.setRefreshArea('zonedetail'+id);
        // Chargement de la page
        XHR.sendAndLoad("details-editeur.php?idedit="+id, "GET");
        return true;
    }
</script>
<?php
// boucle depuis la base de données
    while ($row = $result->fetchRow()) {
        $country =& $db->getOne("SELECT ".$lang." FROM ".$table_paysth." WHERE id='".$row['country']."' ");
            echo "<li><a href=\"javascript:;\" onclick=\"chargeFichier(".$row['id'].");\">".$row['organisation']."</a> - ".$row['city']." (".$country.")";
            echo "<div id=\"zonedetail".$row'id'."\"></div>";
            echo "</li>";
    }
... ect
?>

Extrait de la page qui contient les détails :

<?php
 echo "<div class=\"maisonseditions\">";
       echo "<div style=\"font-size: 10px; text-align: right;\"><a href=\"javascript:;\" onclick=\"document.getElementById('zonedetail".$row'id'."').innerHTML = '';\">x
fermer</a></div>";
... ici les infos détaillées ....
       echo "</div>";
?>

Pour être sur que tout le monde à compris : la page editeurs.html ne charge que la liste nominative. Ensuite chaque clic sur le nom d'un éditeur fait appel au données le concernant. Léger et efficace, seulement quelques octets de données sont appelés à chaque fois depuis le serveur.

Sur ma lancée, j'ai aussi utilisé Ajax sur la page du calendrier afin d'éviter de charger les importantes et longues listes déroulantes du moteur de recherche avancé à chaque chargement de la page "calendrier" (couplé à un système de cache c'est bien rapide).

Alors pas convaincu par l'intitulé de l'article cité plus haut : "Ajax: A New Approach to Web Applications" ?

samedi, mars 26 2005

Rotation des logs après l'analyse statistique

Je me suis pas mal pris la tête sur ce problème. Il s'agit d'archiver les logs brut du serveur web Apache compressés en gzip, toutes les nuits après la génération des statistiques par AWStats. Ceci pour une historisation des journaux qui laisse la possibilité de, par exemple, recalculer les statistiques annuelles avec autre choses que AWStats.

La solution est en fait assez simple : il suffit de préciser à logrotate qu'il doit exécuter un script avant d'archiver. Voici donc la configuration de logrotate sur le serveur en question :

     /home/web/*/logs*/access_log {
         notifempty
         daily
         rotate 31
         compress
         sharedscripts
         prerotate
             /home/cgi-stats/tools/awstats_updateall.pl now -awstatsprog=/home/cgi-stats/awstats.pl -configdir=/home/cgi-stats/
         endscript
         postrotate
             /usr/bin/killall -HUP httpd
         endscript
     }
     
     /home/web/*/logs*/error_log {
        notifempty
        weekly
        rotate 4
        compress
        postrotate
             /usr/bin/killall -HUP httpd
        endscript
     }

Pour comprendre l'utilisation des jokers (*), voici comment sont organisés les fichiers du serveur web :

/home/web/domaine.tld/logs/acces_log
/home/web/domain.tld/logs/error_log

Enfin, le script awstats_updateall.pl permet de lancer l'analyse statistique pour tous les domaines en même temps.

Pour le détail sur logrotate, je vous renvois au man ;) . Et on me souffle dans l'oreillette que cronolog est aussi une solution intéressante... A voir !

lundi, janvier 31 2005

Une nouvelle réalisation pour La Crosse Technology

Il faut bien que je me congratule un peu ;) Mon premier site vraiment, réellement et entièrement en XHTML strict et en CSS. Bon il y a quelques parties en Flash mais c'est pas moi qui est insisté. Il manque aussi un bonne intégration des "accesskey" , j'ai encore quelques soucis pour des javascript qui ne sont pas "compliant" plus quelques autres détails. Enfin c'est déjà bien sous Lynx, lecteur écran, palm, Pocket PC (netscape 4, s'abstenir).

C'est un site codé avec les fabuleuses classes PEAR et notamment la classe DB (je peux donc le passer sous Oracle ou Postgree en changeant 2 lignes). J'ai placé un petit gadget sympa : moteur de recherche avec autocomplétion sur la page "produits" (trouvé sur ici. marche avec un backend xml). Le site est en 3 langues SVP merci ;)

J'ai failli oublier de donner l'adresse : http://www.lacrossetechnology.fr