Archive for

September 2008

Dojo : Script d'affichage de message temporaire

Je ne suis pas un partisan de Dojo Toolkit. Je l'utilise au travail parce que mon boss l'a choisi :p

Mais du coup, je développe quelques scripts dessus, et en voici un tout court tout simple qui permet d'afficher un message sur une certaine durée.

Je l'utilise pour indiquer à l'utilisateur le résultat d'une commande effectuée sans recharger la page.

Je le met ici, si ca peux servir ! :)

function showbox (sDiv, sMessage, iDuration) {
        dojo.byId (sDiv).innerHTML = '';

        if (iDuration == null)
                iDuration = 3000;

        if (typeof (_oFadeOut) != 'undefined')
                _oFadeOut.stop ();

        // On met la visibilité de l'élément à 0
        var _oFadeOut = dojo.fadeOut ({
                onEnd: function() {
                        // On met le texte de sMessage dans sDiv
                        dojo.byId (sDiv).innerHTML = sMessage;

                        // On fait un fadeIn
                        dojo.fadeIn ({
                                node: sDiv,
                                duration: 700,
                                // On attends x secondes
                                onEnd: function () {
                                        setTimeout (function () {
                                                // On fait un fadeOut
                                                dojo.fadeOut ({
                                                        node: sDiv,
                                                        duration: 700,
                                                        // Une fois finis on efface le contenu
                                                        onEnd: function () {dojo.byId (sDiv).innerHTML = '';}
                                                }).play ();
                                        }, iDuration);
                                }
                        }).play ();
                },
                node: sDiv,
                duration: 1,
        });

        _oFadeOut.play ();
}

Filed under  //  Development   Javascript   Scripts   affichage   box   dojo   message   temporaire   toolkit  
Posted by Cyril Nicodème 

Script de Backup MySQL à mettre en cron

Il existe divers scripts de backup pour votre système. Je n'ai pas trouvé celui qui me convenait le plus (quelque chose de simple), j'ai donc réalisé le mien.

Il ne fait que lister les bases de données existantes, crée un fichier .sql contenant le dump de chacune de ces bases ensuite, et créer une archive de ces fichiers.

Les actions sont loggués dans un fichier (par défaut /var/log/backup.log) et sont envoyé par mail lors de l'exécution du script.

Ce que j'aimerai ajouter, c'est l'envoi de mail de l'archive crée, mais chiffré symétriquement par gpg. Or, je n'ai pas trouvé de solutions pour donner un mot de passe symétrique à gpg directement dans un script shell ... je n'ai donc pas activé l'envoi de mail ! :)

* Petite mise à jour, maintenant le script utilise l'encryption symétrique par gpg, avec l'algorithme reconnus comme le plus sûr, RIJNDAEL256. Il ne me reste plus qu'un envoi correct par mail et le tout sera parfait ! :)

#!/bin/bash
#
# Shell script (BASH) used in cron to made a backup of all the MySQL databases

# In order to run this script, you must have following tools installed:
# - /usr/bin/mysql
# - /usr/bin/mysqlcheck
# - /usr/bin/mysqldump
# - /bin/tar
# - /bin/gzip
# - /usr/bin/gpg
#
#
# Installation
# Customize the script according to your need. You need to setup :
# - The directory where to put the backups
# - A MySQL User and his Password
# - A GPG passphrase
# - The number of days the backups are stored (default 5)
#
# --------------------------------------------------------------------
# This is a free shell script under GNU GPL version 2.0 or above
# Copyright (C) 2005 ReFlectiv project.
# Feedback/comment/suggestions : http://www.reflectiv.net/
# -------------------------------------------------------------------------
#
# @See : http://www.ruas-blog.com/index.php/2006/03/06/33-script-de-sauvegarde-des-bases-mysql
# @See : http://www.shelldorado.com/articles/mailattachments.html

# Directory where the backups goes
BACKUP="/root/backups/mysql/"; # Don't forget the last "/" !

# User & Password for the MySQL user used for the backup
DB_USER="root"; # Could be another user with good rights
DB_PASS="password";

# Password for the symetric encryption in GPG
GPG_PASS="Gpg_password";

# Email where to send the Email
EMAIL="root";

# The number of days the backup are stored
KEEPING_DAYS=`date --date '5 days ago' "+%Y-%m-%d"`;

# Log file
LOG="/var/log/backup.log";

# Day when sending the mail backup (if no day, no mail will be sent)
DAY_MAIL="dim";

# Only change if your UNIX stores bin in diffrent location
MYSQL="/usr/bin/mysql";
MYSQLCHECK="/usr/bin/mysqlcheck";
MYSQLDUMP="/usr/bin/mysqldump";
TAR="/bin/tar";
GPG="/usr/bin/gpg";


#######################################################################
# Do not change anything below
#######################################################################

DATE="$(date +"%Y-%m-%d")";
DATE_NOW=`date +"%d/%m/%Y - %H:%I:%S"`;

cd $BACKUP;

TMP_LOG="tmp_backup.log";
>$TMP_LOG;

echo "["$DATE_NOW"] - MySQL Complete DUMP started" >> $TMP_LOG;

# WE create te temporary directory for the dump
if [ ! -d $DATE ]; then
       mkdir $DATE"/";
       chmod 500 $DATE;
fi

# We lists the bases
DATABASES="$(mysql -u $DB_USER -p$DB_PASS -Bse 'show databases;')";

# An error occured while retrieving the list of all the databases
if [ ! $? -eq 0 ]; then
       rm -rf $DATE;
       echo "["$DATE_NOW"] - An error occured while retrieving the list of all the databases" >> 
$TMP_LOG;
       echo $TMP_LOG >> $LOG;
       rm $TMP_LOG;
       exit 1;
fi

# For each Databases
for BASE in $DATABASES
do
       # We analyse each bases
       mysqlcheck -u $DB_USER -p$DB_PASS -c -a $BASE > /dev/null

       echo "["$DATE_NOW"] - Dump of the database '"$BASE"'" >> $TMP_LOG;

       # And we saving them in a file
       mysqldump -u $DB_USER -p$DB_PASS --add-drop-database  --add-drop-table --complete-insert
 --routines --triggers --allow-keywords --max_allowed_packet=50M --force $BASE -R > 
$DATE"/"$BASE".sql";

       # An error occured while dumping the database
       if [ ! $? -eq 0 ]; then
               rm -rf $DATE;
               echo "["$DATE_NOW"] - An error occured while dumping the database '"$BASE"'" >> 
$TMP_LOG;
               echo $TMP_LOG >> $LOG;
               rm $TMP_LOG;
               exit 1;
       fi
done

# Name of the Archive
ARCHIVE="mysql_backup_"$DATE".tar.gz";
OLD_ARCHIVE="mysql_backup_"$KEEPING_DAYS".tar.gz";

# We made the archive
tar -czf $ARCHIVE $DATE"/";

# An error occured while creating the archive
if [ ! $? -eq 0 ]; then
       rm -rf $DATE;
       echo "["$DATE_NOW"] - An error occured while creating the archive '"$ARCHIVE"'" >> 
$TMP_LOG;
       echo $TMP_LOG >> $LOG;
       rm $TMP_LOG;
       exit 1;
fi

# Deleting the temporary directory
rm -rf $DATE;

# Creating a GPG version of the archive
gpg --yes -c --passphrase $GPG_PASS --s2k-cipher-algo RIJNDAEL256 $ARCHIVE;

# An error occured while creating the encrypted archive
if [ ! $? -eq 0 ]; then
        rm -f $ARCHIVE;
        echo "["$DATE_NOW"] - An error occured while creating the encrypted archive '"$ARCHIVE"'" >>
 $TMP_LOG;
        echo $TMP_LOG >> $LOG;
        rm $TMP_LOG;
        exit 1;
fi

# Deleting the original archive
rm -f $ARCHIVE;

ARCHIVE=$ARCHIVE".gpg";

# Securying current archive
chmod 400 $ARCHIVE;

echo "["$DATE_NOW"] - Archive '"$ARCHIVE"' successfully created" >> $TMP_LOG;

# Deleting old archives
if [ -f $OLD_ARCHIVE ]; then
       rm $OLD_ARCHIVE;
       echo "["$DATE_NOW"] - Archive '"$OLD_ARCHIVE"' deleted" >> $TMP_LOG;
fi

#if [ `date +"%a"` == $DAY_MAIL ]; then
#       mail -s "MySQL Backup "$DATE $EMAIL -a "Content-Type: application/octet-stream" 
-a "Content-Disposition: inline; filename="$ARCHIVE > $TMP_LOG;
#fi

mail -s "MySQL Daily Backup ("$DATE")" $EMAIL > $LOG;
rm $TMP_LOG;

exit 0;

Filed under  //  Development   Scripts   Unix/Linux   automatique   backup   cron   mysql   sauvegarde   shell  
Posted by Cyril Nicodème 

Script shell de mise à jour MultiBlog WordPress

Je dispose sur mon serveur de plusieurs blogs Wordpress dans des répertoires différents. Voyant déjà la chose arriver, je me demandais comment simplifier la mise à jour de tous les blogs d'un coup, afin de ne pas y passer 3 jours à chaques fois.

J'ai tout d'abord pensé à faire un lien symbolique vers un repertoire common/wordpress/ mais plusieurs problèmes se posaient à moi (modification du fichier wp-config.php pour l'adapter à chaque sites, etc). Le problème de modifier le fichier, c'est que cette modification est a effectuer à chaque mise à jours. Pas top !

L'autre méthode auarit été l'utilisation du plugin Instant Upgrade de Wordpress. Le problème est qu'il aurait fallu cliquer sur la mise à jour dans chaque blog.

Encore trop fastidieux pour moi ! ^^

La méthode que j'ai choisi d'utiliser et l'utilisation d'un script shell, ou vous indiquez les repertoires ou mettre wordpress à jour, et vous n'avez plus qu'à appeler wordpress avec comme paramètre la version à mettre à jour. Il s'occupera du reste ! :)

Voici le code :

#!/bin/bash
# Shell script (BASH) to update listed blogs to a new version of WordPress
# (Ce script permet de faire une mise à jour vers la derniere version
#                FRANCAISE de Wordpress sur les différents blogs indiqués)
#
# In order to run this script, you must have following tools installed:
# - /usr/bin/wget
# - /bin/tar
# - /bin/gzip
#
# Installation
# Customize the script according to your need. You need to setup :
# - the list of your blogs, separated by space (break line, tab works too)
# - The owner user of the blogs (generally www-data)
# - The owner group of the blogs (generally www-data)
#
# Execution
# This script must be executed with one parameters, the new version of
# wordpress, like ./wordpress_update.sh 2.6.2
#
# WARNING :
# This script delete all the content in your blogs, except wp-content/*
# and wp-config.php. If your update directory is in an other directory
# than wp-content/uploads, you will have to modify the script to
# adapt it at your configuration !
#
# --------------------------------------------------------------------
# This is a free shell script under GNU GPL version 2.0 or above
# Copyright (C) 2005 ReFlectiv project.
# Feedback/comment/suggestions : http://www.reflectiv.net/
# -------------------------------------------------------------------------


# List of blogs with absolute path, separated by space, tab or break line
BLOGS_PATH="/var/www/domain1/blog/ /var/www/domain2/blog/ 
/var/www/domain3/www/ /var/www/domain4/www/";

# Owner user
WP_UID="www-data";

# Owner group
WP_GID="www-data";

# Only change if your UNIX stores bin in diffrent location
WGET="/usr/bin/wget";
TAR="/bin/tar";

#######################################################################
# Do not change anything below
#######################################################################

clear
echo "--------------------------------------------------------------------------------";
echo "------------------------------ Updating Wordpress ------------------------------";
echo "--------------------------------------------------------------------------------";

# Testing differents elements needed for the good work of this script.
if [ $# != 1 ]; then
       echo "You need to specify one parameter";
       echo "(The version number of Wordpress, like 2.6.2";
       exit 1;
fi

if [ ! -x $WGET ]; then
       echo $WGET" command not found, please contact the administrator.";
       exit 1;
fi

if [ ! -x $TAR ]; then
       echo $TAR" command not found, please contact the administrator.";
       exit 1;
fi


LATESTWP="wordpress-"$1"-fr_FR.tar.gz"


echo "Downloading the file '"$LATESTWP"'";
$WGET -q http://fr.wordpress.org/$LATESTWP

# An error occured while downloading the archive
if [ ! -f $LATESTWP ]; then
       echo $LATESTWP" does not seem to be downloaded ?!";
       exit 1;
fi

echo "Extracting "$LATESTWP;
$TAR -xzf $LATESTWP &> /dev/null;

# An error occured while extracting the archive
if [ ! $? -eq 0 ]; then
       rm -f $LATESTWP;
       echo "An error occured when extracting '"$LATESTWP"'";
       exit 1;
fi

# For each blogs
for BLOG in $BLOGS_PATH
do
       echo "Updating blog "$BLOG" with the new version of Wordpress ("$1")";

       # Deleting current files
       WPLISTS=`ls $BLOG`;
       for WPFILE in $WPLISTS; do
               if [[ $WPFILE != "wp-config.php" && $WPFILE != "wp-content" ]]; then
                       rm -rf $BLOG$WPFILE;
               fi
       done

       # We copy the new version to the current blog
       cp -Ru "wordpress/"* $BLOG

       # And we gave the corrects rights for the folder
       chown -R $WP_UID:$WP_GID $BLOG
done

# We delete the archive and the folder created by the archive extraction
rm -rf "wordpress/" $LATESTWP;

echo "--------------------------------------------------------------------------------";
echo "------------------------------ Updating Finished -------------------------------";
echo "------------------------------------------------------------------------------";
echo "";
echo "";

exit 0;

Ce code est fonctionnel pour moi, mais peut-être qu'avant de le valider, vous devriez le tester sur des répertoires de tests, afin de ne pas détruire votre installation ! Sachez que tous les fichiers & dossiers dans chaque blogs sont supprimés sauf wp-config.php et wp-content/ (tel qu'indiqué dans la doc de Wordpress pour la mise à jour !).

N'hésitez pas à proposer des mises à jours, des améliorations et à reporter des bugs éventuels ! :)

Filed under  //  Development   Scripts   Unix/Linux   blogs   mise à jour   multiblog   update   wordpress  
Posted by Cyril Nicodème 

Script shell pour mettre en place le bi-écran

Disposant d'un écran de bureau en plus de mon pc portable, j'aime bien avoir le double écran d'actié lorsque je démarre mon pc, et ne pas l'activer si celui-ci n'est pas branché (logique). Au risque d'énerver certains, je ferai remarquer que Windows dispose depuis longtemps de cette fonctionnalité, tandis que sous Linux, c'est un peu la croix et la bannière.

Donc voici mon script (inspiré d'autres personnes, je ne le cache pas) qui détecte si un écran externe est relié, et dans ce cas configure le bi-écran.

#!/bin/bash

# See http://forums.fedora-fr.org/viewtopic.php?pid=285017#p285017
XRANDR_OUT=`xrandr -q`
if echo "$XRANDR_OUT"|grep -q 'VGA-0 connected'; then
        echo 'Detected External Screen';
        
        #On fait un clone
        xrandr --output LVDS --auto --output VGA-0 --auto --same-as LVDS

        # On éteint l'écran externe
        xrandr --output VGA-0 --off

        # placement des écrans 
        xrandr --output LVDS --auto --output VGA-0 --auto --left-of LVDS

        #définition des résolutions
        xrandr --output LVDS --mode 1280x800 --pos 1680x0
        xrandr --output VGA-0 --mode 1680x1050 --pos 0x0
else
        echo 'No External Screen connected!';
        #turning off just incase
        xrandr --output VGA-0 --off
fi

Ce script est à exécuter lors de l'ouverture de session (Gnome : Système > Préférences > Personnel > Session)

Filed under  //  Development   Scripts   Unix/Linux   bi écran   dual screen   externe   moniteur   script  
Posted by Cyril Nicodème 

Migration Successful !

Mais quelle agréable surprise de voir que la migration s'est effectuée sans AUCUN problèmes !

A tel point que je pensais que les DNS n'avaient pas été mis à jours et que je pointais toujours sur l'ancien serveur :p

Bon et bien voilà ! La nouvelle est tombée, ReFlectiv.Net et toute sa structure tourne sur un serveur RPS hébergé chez OVH et maintenu par mes soins !

C'est la fête !

Filed under  //  Projects   migration   reflectiv   rps   serveur   structure  
Posted by Cyril Nicodème 

Optimiser Firefox 3

L'article d'aujourd'hui ne sera pas très fouillé.

Générallement j'écris l'article ici, mais c'est tout simplement car il est en anglais et que je fait de mon mieux pour le traduire.

L'article étant déjà en français, je ne vais pas faire un sombre copier coller !

Donc voici quelques astuces qui vous permettront d'optimiser Firefox 3 ! :)

C'est toujours utile ! :)

Filed under  //  firefox   optimisation  
Posted by Cyril Nicodème 

L'avenir de ReFlectiv

J'envisage une refonte de ReFlectiv ainsi qu'une amélioration de toute la structure *.reflectiv.net. Outre la modification complète du design, j'envisage de créer des nouvelles parties.

Voici comment se présentera Reflectiv :

  • La partie www sera utilisé pour afficher les éléments globaux (Présentation, Projets, Contact, dernier messages du blog)
  • La partie users recensera tous les utilisateurs. Ne seront affichés que les utilisateurs l'ayant voulut (on peux cacher sa fiche)
  • La partie projects (projets/projet/project/projects), recensera tous les projets, leur status, les différents bugs affiliés. Un mini-site sera généré pour chaque projet (visible à projects.reflectiv.net/nom_projet/), avec la possibilité de créer des pages, des messages, modifier le template, etc. Ce sera la plus grosse partie du travail !
  • La partie clients permettra l'accès à des clients sur les sandbox des projets en développement auquels ils sont affectés. Ils seront informés des évolutions en fonction des messages laissés sur le projet, etc.
  • La partie bug sera une plate forme de gestion des bugs pour chaque projet
  • La partie blog sera tel que maintenant ; mon blog :p
  • La partie sandbox contiendra les différents projets afin qu'ils puissent être testés (remplace le projects.reflectiv.net/mon_projet/demo/, mais un liens ira de cette url vers la sandbox appropriée). Les applications seront chrootées dans leur environnement afin d'éviter tout problèmes.

Bien sûr, un utilisateur identifié sur users aura accès aux autres sites en fonction de ses droits, il n'aura pas à s'identifier à chaque fois.

L'initiateur d'un projet sera l'administrateur en chef. Il pourra déléguer sa charge à un autre utilisateur qui passera administrateur de ce projet.

Il y aura aussi de grosses modifications au niveau logiciel, comme un support de svn avec la création des différents repository lors de la création des projets, etc.

Bien entendu, tout ne sera pas fait en un coup. J'envisage de travailler sur l'architecture SQL assez rapidement afin d'avoir une base sur comment m'y prendre. Ensuite mon premier objectif est de faire www avant la fin de mon hébergement. Ainsi je pourrais célébrer le passage de mon hébergement sur mon RPS par un nouveau design de ReFlectiv ! :)

Dead Line pour www : Mai 2009 (ca vaaaaa)

Filed under  //  General   agrandissement   amélioration   domaines   projet   reflectiv   structure   utilisateurs  
Posted by Cyril Nicodème 

Affichez vos emails tout en évitant le spam !

Le site techblog.tilllate.com a testé durant plus d'un an différents moyens d'affichage d'email et leur résistance au spam. Il s'est avéré qu'au final, trois méthodes employées se sont avérées plutôt efficaces.

Pour ce faire, 9 différentes méthodes ont été testées :

  • Changement du sens de lecture en Css
  • Affichage altéré (display:none sur des parties n'existant pas dans l'email)
  • Chiffrement ROT-13 (Rotation de 13 lettres dans l'alphabet)
  • Utilisation des ATs et DOTs
  • Génération de l'email avec Javascript
  • Remplacement des @ et . avec les entitées correspondantes
  • Découpage de l'email avec des commentaires html
  • Utilisation de la fonction urlencode
  • Texte pure

Sur ces 9 tests, seulement les trois premiers ont été convainquants à 100%.

Pour vous donner une idée, voici une image résultant du test :

Pour information, voici comment mettre au point ces 3 meilleures méthodes :

  1. Changement du sens de lecture Css :
    <style type="text/css>
    span.codedirection { unicode-bidi:bidi-override; direction: rtl; }
    </style>
    <span class="codedirection">moc.elpmaxe@liamekaf</span>
  2. Affichage altéré (display:none) :
    <style type="text/css>
    p span.displaynone { display:none; }
    </style>
    fakemailnull@example.com
  3. Chiffrement Rot13 : Vous pouvez trouver un outil de chiffrement Rot-13 ici, ou utiliser la méthode str_rot13 de PHP.
    <script type="text/javascript">
    document.write("

Filed under  //  Css   Development   Javascript   Projects   eviter   obfuscate   proteger   spam  
Posted by Cyril Nicodème 

Quelques optimisations pour MySQL

Cette liste, donnée par Dublish.com, regroupe quelques bonnes astuces à prendre pour améliorer le traitement de vos donnée stockées sur votre SGBD.

La partie PHP n'est pas traitée ici puisqu'elle à fait le sujet d'un autre article publié précédement.

  • MySQL interprète de la droite vers la gauche, de ce fait, mettez les signifiants limiteurs le plus loin possible de la droite.
  • Sélectionnez les colonnes, plutôt que * (tout).
  • Évitez de mettre des informations qui changent rarement dans la base de donnée, préférez les dans un tableau contenu dans un fichier que vous inclurez.
  • Utilisez des indexes dans les colonnes contenues dans les clauses WHERE et ORDER BY.
  • Les indexes sont très intéressants quand vous faites des recherches mais ralentissent considérablement l'insertion.
  • Utilisez la requête "EXPLAIN" pour analyser vos indexes.
  • Si vous ne voulez qu'une ligne de résultat, limitez votre requête avec la clause LIMIT 1; Cela aura pour effet de stopper MySQL à la première ligne trouvée plutôt que de continuer à parcourir TOUTE la table pour une donnée qui est déjà trouvée.
  • Préferez un FETCH_ASSOC ou FETCH_NUM plutôt qu'un FETCH_BOTH qui déclarera deux variables par colonne au lieu d'une seule.
  • Parfois, mysql_free_result (ou similaire en fonction de ce que vous utilisez) finis par consommer plus de mémoire qu'en gagner. Regardez la différence avec memory_get_usage ();.
  • Évitez de demander à la base de donnée la même chose encore et encore. Stocker la requête et réutilisez la !
  • Utilisez autant que possible NOT NULL en tant que valeur par défaut. Cela améliore l'éxécution et save 1 bit.
  • Utilisez des types de colonnes qui correspondent à votre utilisation. Un INT non signé peux contenir jusqu'à 4294967295 valeurs. En avez-vous vraiment besoin ? Préférez l'utilisation de SMALLINT ou TINYINT en fonction de l'usage.
  • Profitez des valeurs par défaut. Lors de l'insertion, insérer que ce qui n'est pas valeur par défaut afin d'améliorer l'insertion.

Beaucoup de choses sont logiques, d'autres le son après la lecture.
En suivant ces quelques règles, ainsi que celles sur le php, vous pourrez améliorer l'éxécution de votre code considérablement.
Ce qui est un avantage quand le nombre de visiteur augmente !

Filed under  //  Development   améliorer   astuces   fast   gain   mysql   optimisation   performance   rapidité   règle   speed   temps   tricks  
Posted by Cyril Nicodème 

Comment publier une application

37signals recommande de ne pas publier une application en utilisant la méthode Hollywoodienne. Cette méthode consiste à donner des indices sur son projet de temps en temps afin de créer un buzz, en donnant de plus en plus d'indices précis jusqu'au jour J.

Cela à pour effet de créer une sorte de flood sur votre site lors de l'ouverture (publication) de votre projet. Et c'est là le problème. En effet, la méthode Hollywoodienne fonctionne bien pour un box office, qui doit remplir un maximum de salle en un minimum de temps. Mais pour un développeur, le but n'est pas de faire un boom temporaire, mais d'accroître sa base d'utilisateur avec le temps. Et ce temps peux s'exprimer en année, pas comme un film !

Cette méthode n'est donc pas adaptée !

Pour information, voila ce qui arrive assez souvent aux développeurs qui tente la publication Hollywoodienne :

  1. Le surplus de visiteur fait tomber ton site. Tu fait l'impossible pour le remettre sur pied, et tu code comme un porc. Tout cela pour se rendre compte que ...
  2. Les visiteurs ont trouvés un bug important que tu n'avais jamais remarqué qui se traduit par une mauvaise interprétation sur tes qualités de développeur. (Quoi ? Tu n'a pas pensé à tester la ton application avec les dernières modification javascript sur IE6 ???). Du coup, tu te précipite pour corriger ce bug avant que le trafic ne chute et tu patche ton application quand soudain ...
  3. Tu faites planter ton serveur à cause d'une syntax error dans ton patch qui empêche le serveur de redémarrer. Tu corrige ce problème tout en te maudissant, tu arrive à remettre le serveur sur pied, et vous décidez d'aller voir ce que disent les utilisateurs à propos de votre projet, tout ça pour découvrir que ...
  4. Personne n'a compris ce que faisait ton application car la page d'accueil n'était pas assez claire. Maintenant tout le monde pense que c'est stupide et se demandent même comment tu fait pour respirer. Du coup tu réponds à tous les messages et corrige ta page d'accueil afin de la rendre plus claire afin d'éviter tout futur compromis. Voilà ce que tu fait avant de découvrir que ...
  5. Tout le trafic est parti ...

Le lendemain, les utilisateurs les plus durs sont revenus, et ton graph de trafic ressemble à la montagne la plus tranchante que tu n'ait jamais vu. Un gros pic, suivit d'une chute encore plus grande.

Qu'est-ce tu fait du coup ? tu fait ce que tu aurais toujours dû faire, tu agrandit le site.

La technique s'appele par certains (voir note de fin de page), la "publication de GMail", qui, d'après son auteur (de la note, ndlr), est une vraie success story du Web2.

Voici ce qui à joué en sa faveur. Vous devriez en faire autant.

  1. Vous limitez les utilisateurs. Tout d'abord à vous et votre team, puis vous l'étendez progressivement à votre entourage, amis.
  2. Vous essayez de récuperer un maximum de feedback, voir ce qui est pertinent, ce qui ne l'est pas, qu'est-ce qui a besoin d'être corrigé, et quels problèmes agissent étrangement dans certaines circonstances. Une fois ces corrections appliquées, vous invitez plus d'amis, d'amis d'amis, etc
  3. Automatisez le processus, faites en sortes que vos utilisateurs puissent inviter à leur tour des utilisateurs avec un code d'accès. Ce code évite les abus d'inscriptions et indique clairement à vos utilisateurs ce à quoi ils seront confrontés (beta tests, publicité pour votre application). Mais cà à la particularité de les rendre fiers car ils se sentent privilégiés.
  4. Continuez ainsi, corrigez les nouveaux bugs, prenez en note les différents feedbacks, invitez plus de personnes, recevez de nouveaux feedbacks, etc
  5. Ouvrez l'inscription, enlevez ce code qui limite l'inscription et attendez. Les utilisateurs viendront petit à petit grâce aux moteurs de recherches, aux blogs, et deviendront de réels utilisateurs.
  6. Si tout le monde est content de cette application, vous êtes prêt à lancer votre application. Créer un buzz et parlez de votre application. Le mieux pour se faire est d'avoir des nouveautés que tout le monde attends, qui va permettre une nouvelle vague de motivation et ainsi attirer plus de personnes.
  7. Commencez à faire du marketing. A partir du moment ou vous avez une quantité d'utilisateur assez conséquent, vous pouvez vous lancer dans la publicité, marketing afin d'annoncer la prochaine version de votre application.

Le résultat se verra sur un graphique du trafic qui ne sera que croissant. Graphique que tout le monde aime voir : augmentation stable, pas un intéressement d'un jour.

Bonne chance !

Ne jamais sous-estimer combien vos utilisateurs vous seront utiles à améliorer votre produit. Si vous publiez votre application en ayant un minimum de retour, vous lancerez alors une beta à tout votre publique !

La source de cet article peut être trouvée ici

Filed under  //  Projects   application   astuce   comment   hollywood   meilleure   publier   solution  
Posted by Cyril Nicodème