L'appartement

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

vendredi, janvier 20 2012

HelloScan pour l'interaction entre une application web et un smartphone via des codes barres

HelloScanVoici quelques mois que je n'ai pas posté sur ce blog et aujourd'hui, c'est uniquement pour vous présenter rapidement le dernier projet que j'ai développé.

Plutôt qu'un long discours, je vous propose mon "communiqué de presse" pour vous expliquer de quoi il s'agit :

On trouve beaucoup d'applications sur l'App Store ou l'Android Market qui permettent de scanner des codes barres. le plus souvent, elles se contentent d'afficher le contenu du code barre et d'éventuellement renvoyer sur une URL.

L'application HelloScan est différente. Elle se compose essentiellement de boutons et d'actions que vous configurez selon vos usages :

Voici une vidéo de démonstration de la version Android :

HelloScan devient une passerelle ergonomique et mobile (même en 3G) entre votre smartphone et vos applications "online".

Et les cas d'usages d'HelloScan ne sont pas limités ! En voici quelques uns :

  • billetterie d'événement
  • gestion de stocks
  • bons de réduction
  • courses sportives
  • gestion de parc informatique
  • ...

Pour les usages billetterie, bons de réduction, courses sportives... en plus d'HelloScan, vous pouvez télécharger gratuitement l'application web HelloEvent à installer sur votre site. Elle est ultra-customisable elle aussi !

Pour les sites d'e-commerce, nous fournissons gratuitement le module Prestashop (et très prochainement Magento et virtuemart).

Notez également que pour les développeurs, il est très simple de développer un plugin entre une application online et HelloScan.

Pour toutes informations, vous pouvez me contacter directement par mail ou sur Twitter ou vous rendre sur notre site HelloScan

Et n'hésitez pas à poser vos questions en commentaire !

À voir :

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 !

lundi, mai 24 2010

Reconstruire un RAID 1 sur un NAS Synology DS210j

NAS Synology DS210jJ'ai récemment acheté un petit NAS Synology DS-210J. Un simple petit boîtier blanc pouvant contenir 2 disques durs et pourvu de tout le confort moderne.

Ma priorité pour son utilisation étant la sécurité des données, je choisi de le configurer en RAID 1 sur 2 HDD Western Digital de 500 Go.

L'interface Synology est assez conviviale. J'installe le matériel avec le dernier firmware disponible sur le site du constructeur, je configure mes 2 disques en RAID 1, je transfère quelques gigas de données.

A cet instant, comme je suis joueur méfiant, je décide de débrancher un des deux disques afin de simuler une panne. Je relance le NAS : pas de souci, il bippe sans discontinuer et m'indique une dégradation du volume RAID. Les données sont bien toujours présentent sur le disque restant.

J'éteins, je connecte à nouveau le disque, je relance... Et c'est là qu'il manque quelques options chez Synology : depuis l'interface, impossible de reconstruire le RAID malgré la détection correcte des 2 disques ! La seule solution qui m'est proposée est de supprimer puis recréer un volume RAID !

C'est à ce moment qu'on est content de savoir (remarquez, c'était aussi un des paramètres de choix pour l'achat !) que le bouzin tourne sous linux

Voici donc la manipulation afin de vous éviter une fastidieuse réinstallation/formatage/recopie :

1. Connexion root via SSH sur le NAS

2. La commande cat /proc/mdstat me donne bien les volumes dégradés ([_U] => pas bon / [UU] = bon)

> cat /proc/mdstat 
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] 
md2 : active raid1 sdb3[1]
      483665308 blocks super 1.1 [2/1] [_U]
      
md1 : active raid1 sda2[0] sdb2[1]
      2097088 blocks [2/2] [UU]
      
md0 : active raid1 sdb1[1]
      2490176 blocks [2/1] [_U]

On voit ici qu'il manque sda (disque 1) sur 2 partitions RAID : md0 et md2

3. Je démonte md2 (volume de données)

umount -f /dev/md2

4. Je rattache sda3 et sda1 au RAID

> mdadm --add /dev/md2 /dev/sda3
mdadm: re-added /dev/sda3
> mdadm --add /dev/md0 /dev/sda1
mdadm: re-added /dev/sda1

Et voiloù ! Il n'y a plus qu'à attendre la fin de la synchronisation des disques. La progression de cette synchronisation est d'ailleurs visible sur l'interface du NAS...

Reste la question du jour : pourquoi cette manipulation plutôt simple n'est pas possible via l'interface Synology ?!

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...

jeudi, janvier 28 2010

[tips] Downgrade de Mysql 5.1 à Mysql 5.0 sur Ubuntu 9.10 Karmic

Logo MysqlSur un serveur de développement, j'ai du downgrader de Mysql 5.1 vers Mysql 5.0. Notamment le temps de modifier dans une application toutes les occurrences du mot "range" qui devient un mot réservé sur Mysql 5.1 (grrrr !).

Le downgrade ne fonctionne pas sur Ubuntu 9.10 si vous ne supprimez pas les fichiers debian-5.1.flag et mysql_upgrade_info du répertoire /var/lib/mysql

C'est bête mais c'est comme ça ;)

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, novembre 3 2009

Génération de graphiques de bilan énergétique avec Imagemagick

Dans le cadre de la réalisation du site d'une agence immobilière, J'ai codé une petite classe en PHP qui permet de générer les graphiques des bilans de performance énergétique.

Il s'agit simplement de placer correctement l'indicateur de valeur au bon endroit sur le graphique. Via l'excellent programme ImageMagick, j'effectue donc le "montage" entre l'image source et l'indicateur. La subtilité réside dans le calcul permettant le placement correct sur la bonne "lettre" (A,B,C,D,E,F). L'échelle de valeur n'est en effet pas progressive.

Bilan Energetique Montage

Vous pouvez télécharger cette classe ou générer vos graphiques sur la page dédiée.

J'en ai profité pour me lancer dans l'apprentissage de git en lieu et place de subversion et je ne suis pas déçu ! J'ai du même coup commencé à héberger certains projets sur github.

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é

lundi, septembre 28 2009

Documentation de certaines variables d'Amavisd-new

Une des particularités intéressantes d'Amavisd-new est de permettre le stockage des règles de filtrage dans une base de données (*SQL, LDAP... Mysql dans mon cas). Ceci est particulièrement pratique lorsqu'on souhaite appliquer une configuration différente par utilisateur et/ou par domaine concernant l'analyse antispam/antivirus.

Il existe plusieurs interfaces web pour la gestion de ces réglages. Cependant, souhaitant intégrer cette fonctionnalité à un panel déjà existant, j'ai développé la mienne (script non distribuable en l'état)

Pour cette réalisation, il était nécessaire de récapituler, en français, le rôle des différentes variables disponible. Voici le résultat. La version sous forme de tableau associatif PHP est à peine différente dans les formulations. Peut-être utile pour une personne souhaitant développer une interface de ce type.

Lire la suite...

lundi, avril 13 2009

Réflexion sur l'externalisation : l'exemple de l'hébergement de vidéo

Quand nous[1] avons décidé le refactoring theatre-contemporain.tv, un débat interne s'est engagé sur l'intérêt de passer ou non par un service tiers (gratuit ou « low cost ») pour héberger les vidéos.

Le site existant depuis 2001 (quand même !) et disposant déjà de plus d'un millier de vidéos, nous avons été démarché par DailyMotion pour héberger nos vidéos chez eux. Entre la simplicité de mise en œuvre de cette solution et l'économie de bande passante réalisée, le choix aurait pu pencher en faveur de l'externalisation chez DM.

La mésaventure du site de vidéos Wat.tv (filiale de TF1) , resté indisponible un bon moment parce que quelqu'un a « oublié » de renouveler le nom de domaine, est cependant assez révélatrice des problèmes que peut poser le modèle du tout hébergé/externalisé[2]

On peut les résumer ainsi :

  • Vous n'avez pas la main sur vos propres contenus
  • Vous devez vous contenter des fonctionnalités offertes par le service tiers. L'aspect "métier" de vos besoins n'est pas pris en compte.
  • Vous ne connaissez pas la pérennité de l'offre du service tiers (Alors que ces derniers jours, on lit ici ou là que Dailymotion et Youtube n'ont pas atteint le seuil de rentabilité, ou que de la pub est de plus en plus insérée dans la vidéo)
  • Vous êtes dépendant des changements d'humeur (et de CGU) du fournisseur que vous avez choisi

Certes, il existe tout de même quelques services qui proposent des contrats d'hébergements de vidéos disposant d'une vrai garantie de service (payants bien entendu), mais là encore, il faut être certain de la pérennité de leurs modèles économiques.

De notre côté, nous avons choisi de faire péter notre bande passante ;) ; Tout est développé/géré/hébergé en interne.

Il persiste un service tiers ; le processus d'encodage des vidéos passe par Heywatch qui propose une API REST très performante et ne fait - finalement - que nous fournir de la puissance de calcul. En fonction du succès, nous envisagerons de gérer le traitement directement sur notre infrastructure.

D'autre part, si Heywatch venait à fermer ou à changer ses conditions, la migration d'un webservice vers un autre resterait assez triviale et ne remettrait pas en cause toute notre conception.

Enfin, le CRIS, qui se positionne comme un "Centre de Ressources" pouvait-il se permettre de faire sous-traiter l'archivage à un service gratuit ou low-cost dont ce n'est pas forcément la vocation ?

Le site a été développé et mis en ligne dans un temps record. Dans 2 semaines, les internautes pourront poster leur vidéos. Finalement pas compliqué de faire un Youtube Like. Prochaine étape, concurrencer Google ;)

Il convient donc de toujours bien peser le pour et le contre d'une externalisation. Même si elle semble souvent plus simple à mettre en oeuvre le gain à postériori n'est pas forcément avantageux !

Notes

[1] L'équipe de CRIS/theatre-contemporain.net

[2] idem d'ailleurs sur Gmail qui a aussi subit quelques soucis

mercredi, avril 8 2009

Quelques conseils pour ne pas voir vos mails finir dans les dossiers Spam

1559606_340_1116081430036-s.jpgSuite à plusieurs questions reçues par mail, voici quelques conseils tirés de mon expérience personnelle pour optimiser vos chances de ne pas voir vos messages finir leur course dans le tant redouté dossier « courrier indésirable » des différents « grands » fournisseurs de services (Yahoo, Gmail, Hotmail et consorts).

  • Avoir un Zonecheck parfait sur son domaine. Ce qui implique notamment - ce point semble important pour Gmail - une adresse postmaster valide et un contact de domaine valide;
  • Signer ses messages sortant avec DKIM et vérifier régulièrement son bon fonctionnement. Cette signature devient réellement essentielle !
  • Configurer correctement SPF (Sender Policy Framework) sur son domaine. Et ne pas oublier les machines qui relaient et autres MX secondaires;
  • Dans la mesure de vos possibilités, demandez à vos correspondant de vous ajouter dans leurs carnets d'adresses et/ou leurs listes blanches. Ceci peux-être particulièrement utile dans le cas d'une lettre d'information. Vous pouvez envisager de glisser dans un de vos mailings une phrase du style « Pour être sur de recevoir nos messages, ajoutez lettre@domain.tld à votre carnet d'adresses »;
  • Pour les newsletters en HTML, n'incluez pas les images dans le message mais linkez sur votre serveur. N'oubliez pas la version alternative pour les webmails qui ne supportent pas HTML;
  • Pour Yahoo et Hotmail, il peux-être intéressant de remplir leurs différents formulaires [1] pour signaler que vos messages sont marqués comme Spam chez eux. La réponse et le résultat ne sont pas garanties. Ils vous préciseront d'ailleurs que ce n'est pas une Whitelist. D'après moi, ça aide quand même;
  • Pour ceux qui ont les moyens et qui aiment se faire racketter, Hotmail utilise également une sorte de whitelist officielle - et bien entendue payante - appelée SenderScore;

Dernière précision, et pas des moindre - ceci est également précisé sur le site de Yahoo - les fournisseurs utilisent également des filtres de réputation. En clair, tant que l'adresse IP de votre serveur n'est pas « connue », le risque de passer à la trappe est plus important.

Pour ce dernier point :

  • oubliez les adresses IP résidentielles
  • louez un serveur sur un réseau « connu »
  • prenez le temps de remplir les formulaires que j'évoquais plus haut

Si vous avez d'autres bonnes pratiques, je suis preneur ;)

Notes

[1] Cherchez sur le site « postmaster » de Yahoo ou sur son équivalent chez Microsoft

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

mercredi, février 25 2009

Princesse Lego, le film d'animation !

Pour rompre avec l'activité de mon blog proche du vide intersidéral, je vous propose une activité pour occuper vos enfants pendant les week-end pluvieux et froids. La réalisation d'un film d'animation en stop motion avec des Lego.

Voici déjà le rendu final du film réalisé avec mon fiston Hugo

Au cas où vous souhaiteriez tenter l'expérience, je vous détaille la création

Lire la suite...

lundi, janvier 5 2009

Bonne année 2009

Ca, c'est fait ;)

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.

vendredi, avril 11 2008

Script minimaliste : nettoyer une boite aux lettres avec une expression rationnelle

Dans la catégorie des scripts minimalistes (mais néanmoins utiles), je vous propose un petit script qui permet d'effacer, en ligne de commande avec PHP CLI, certains messages d'un compte mail en fonction d'une expression régulière précisée en paramètre et qui matche le sujet du mail.

Par exemple, effacer les centaines de messages de spam qui se trouvent dans une de vos nombreuses boites tant inutiles que nécessaires ;) Autre exemple, j'exécute ce script via un cron pour nettoyer tous ce qui traine dans des boites genre postmaster, abuse (encore que cette dernière n'est pas trop pourrie par le SPAM), et autres bal « no-reply » qu'il reste quand même, pour certaines, nécessaires de consulter tous les ans régulièrement.

C'est un script clairement dédié à de la maintenance. Je vous déconseille de laisser trainer ce code n'importe ou accessible via le web.

Utilisation :

cleanmail -u=nom_utilisateur -p=mot_de_passe -s=imap.mondomain.tld:143 -e="/SPAM/i"

Pour être sur que tous le monde a compris :

  • -u= nom d'utilisateur du compte mail
  • -p= mot de passe du compte mail
  • -s= serveur (pop ou imap). Toutes les options disponibles sur la fonction imap_open de PHP sont disponible
  • -e= expression régulière qui sera « passée » à preg_match

Le script :

#!/usr/bin/php
<?php
// on supprime la limite d'éxecution d'un script php
set_time_limit(0);

/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * cleanmail supprimer des mails d'une boite imap avec une pattern définie
 *
 * PHP versions 5
 *
 * LICENSE: Ce programme est un logiciel libre distribue sous licence GNU/GPL
 *
 * @author     Yves Tannier <yvesSANSPAM grafactory.net>
 * @copyright  2008 Yves Tannier
 * @license    http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
 * @version    0.1.0
 * @link       http://www.grafactory.net
 */


// aide contextuelle
$help_string = "Parametres :
                -u : utilisateur
                -p : mot de passe
                -s : serveur et port (localhost:143, localhost:110, localhost:143/novalidate-cert...)
                -e : expression régulière
                -h, --help : afficher cette aide...\n\n"
;

// recuperer les parametres passe en CLI
foreach($_SERVER['argv'] as $param) {
    // utilisateur
    if(strpos($param,"u=")) {
        $login_imap = str_replace("-u=","",$param);
        continue;
    }
    // mot de passe
    if(strpos($param,"p=")) {
        $passwd_imap = str_replace("-p=","",$param);
        continue;
    }
    // serveur et port
    if(strpos($param,"s=")) {
        $server_imap = str_replace("-s=","",$param);
        continue;
    }
    // expression reguliere
    if(strpos($param,"e=")) {
        $pattern = str_replace('-e=','',$param);
        continue;
    }
    switch($param) {
      case '-h' :
      case '--help' :
        echo $help_string;
        exit();
      case $_SERVER['SCRIPT_NAME'] :
        unset ($_SERVER['argv'][0]);
        break;
      default :
        echo "\nParamètre inconnu : ".$param."\n\n";
        exit();
    }
}

// pas d'argument
if (empty($_SERVER['argv'])) {
    echo "\nVeuillez preciser au moins un paramètre !\n\n";
    echo $help_string;
    exit();
}

// connexion
$mbox = imap_open("{".$server_imap."}INBOX", $login_imap, $passwd_imap)
            or die("Impossible de se connecter : ".imap_last_error());

echo "Connexion...\n";

// recup des headers
$headers = imap_headers($mbox);

// parcourir les messages
if(!empty($headers)) {
    echo "Recherche avec l'expression : ".$pattern."\n";
        $msgnum = 0;
        foreach ($headers as $val) {
            $msgnum = $msgnum + 1;
            $header = imap_headerinfo($mbox, $msgnum);
            $subject = $header->subject;
            if (preg_match($pattern, $subject)) {
                $mailmarked = imap_delete($mbox, $msgnum);
                echo "Message ".$msgnum." supprimé\n";
            }
        }
} else {
    echo "Aucun message dans la boite\n";
}

echo "Fin de la transaction\n";

// quitter et vider en meme temps
imap_close($mbox,CL_EXPUNGE);
?>

Bientôt le même mais en perl ;)

lundi, mars 24 2008

A la découverte de Jelix, l'essayer c'est l'adopter

Logo JelixMalgré tous les avantages que j'ai pu trouver à mon framework mes bouts de codes personnels basés sur plusieurs librairies PEAR, je me suis tourné vers quelques choses de plus "moderne" et plus homogène pour mes nouveaux développements. Après pas mal de recherches et d'essais, mon choix c'est porté sur Jelix.

Ca tombe bien. Un nouveau projet dont les contraintes correspondent parfaitement à l'utilisation de ce framework me permet donc actuellement de me frotter à la bête... Et je ne suis pas déçu !

Je ne vais pas rentrer dans le détail des fonctionnalités mais il y a tous ce qu'on peux rechercher dans un framework PHP5 orienté objet et de classe américaine. Jelix ne pas fait le café comme Symfony (que j'ai essayé également et qui possède de nombreux avantages) et c'est justement pas ce que je lui demande car je souhaite garder la compréhension globale de ce que j'utilise. C'est léger, rapide et extensible. Bref, que du bon pour l'instant ;)

Voici ce que j'en retiens principalement (liste non exhaustive). J'ai précisé, pour mémoire, les équivalents de ce que j'utilisais comme librairies PEAR :

  • ORM puissant. J'utilisais PEAR::MDB2 très efficace aussi. Surtout la gestion transactions
  • système de templates. Beaucoup mieux que PEAR::HTML_Template_Flexy pour lequel la syntaxe dans le template reste assez réduite (exemple : impossible d'utiliser des opérateurs de comparaisons)
  • localisation. PEAR::Translation2 ne m'a jamais réellement séduit.
  • génération de formulaire. Quand on a prit l'habitude d'utiliser PEAR::HTML_Quickform, on recherche forcément quelque chose de similaire.
  • système de cache. Je n'ai pas encore eu la possibilité de comparer avec les performances de PEAR::Cache_Lite mais ça semble équivalent.
  • Quelques modules bien utiles comme la génération de CRUD, le module d'authentification, les acls...

La présentation détaillée et une application de tests sont disponibles sur le site officiel. Il ne vous reste plus qu'à essayer ;)

Si vous aviez l'intention de vous rendre aux Rencontres Mondiales du Logiciel Libre 2008 à Mont-de-Marsan, assistez à la conférence sur Jelix de Laurent Jouanneau et vous en apprendrez encore plus !

- page 1 de 6