Votre bibliothèque et vos listes

Nous sommes content de mettre ce week-end en ligne une mise à jour majeure du site.

Au départ il s’agissait surtout de mettre à niveau le « framework » javascript qui est utilisé dans les écrans dynamiques. Cela a nécessité un gros effort de ré-écriture du programme, un effort de longue durée, commencé il y a près d’un an.

La ré-écriture du code a permis de glisser des améliorations, ainsi le « design » des pages dynamiques (celles écrites en javascript : le compte utilisateur, la fiche auteur et la fiche utilisateur, la plupart des listes, la messagerie) a été amélioré. L’affichage des listes contient maintenant systématiquement les couvertures (mais on peut changer la vue si on préfère une vue plus compacte). En outre, comme avant en fait, un simple Click sur la colonne permet de changer l’ordre de tri.

gridstyle

Mais les fonctionnalités n’ont pas été oubliées. Ainsi le site permet maintenant de gérer sa bibliothèque et de maintenir différents types de listes : à lire, en cours de lecture et j’ai lu.

Nous espérons que ces fonctionnalités vous plairont et seront utilisées.

La bibliothèque, comment ça marche ?

Allez dans votre compte : il y a un nouvel onglet « Biblio – config » : vous pourrez définir vos cotes de rangement. Une cote de rangement sert à classifier et localiser vos livres, typiquement ça pourrait correspondre à une étiquette collée sur vos étagères.

Les cotes de rangements

Ensuite, ajoutez des livres dans votre bibliothèque, soit via la fiche livre soit via la liste des éditions. L’avantage de l’écran « Liste des éditions », c’est que vous pourrez ajouter plusieurs livres d’un coup, en cherchant par exemple sur base d’un auteur.

Ajout via la liste des éditions

Vous pouvez ensuite aller dans l’onglet Biblio de votre compte pour visualiser et modifier votre bibliothèque virtuelle, en double-cliquant sur une ligne ou en utilisant l’icone idoine.

Modifier la biblio 

 

Javascript

Nous utilisons sur critiqueslibres.com (pour l’instant, ça pourrait changer), un framework javascript populaire et puissant  qui s’appelle extjs (http://www.sencha.com/products/extjs).

Ce framework a été massivement revu (pour le mieux) lors de son passage de la version 3 à la version 4, et nous autres, sur critiqueslibres, avons décidé de suivre les évolutions.

Le langage javascript était au départ prévu pour animer des pages web, ou faire de simples validations de formulaires, il avait une mauvaise réputation et était regardé avec dédain par les programmeurs chevronnés. Mais le web domine le paysage et ça ne fait que s’accentuer (cfr le nouveau « hype » du cloud),  et pour programmer sur le web il n’y a quasi pas d’alternatives. Cela en conjonction avec le fait que quelques personnes très intelligentes (Douglas Crockford est souvent cité, il a écrit un livre un peu indigeste mais qui a fait référence), ces personnes ont re-découvert ce langage, dévoilant sa puissance (bien cachée). Et bien tout cela fait que le javascript est devenu le standard de-facto en terme d’interface utilisateur.

Voir cet article intéressant (en anglais) qui explique ce qu’est une ‘disruptive technology’ et pourquoi javascript pourrait bien en être une, écrit en 2007 :

http://www.jamesshore.com/Blog/HTML-and-the-Innovators-Dilemma.html

Le suivant est plus récent :

http://www.richardrodger.com/2011/04/05/the-javascript-disruption/#.Ujth_xYfy2w

A l’époque (il y a six ans), j’avais choisi extjs (c’était la version 2) parce que je travaillais dans une boite qui utilisait ce framework. La boite ou je travaille maintenant utilise angular.js (c’est Google derrière), et ça a l’air bien supporté et moins lourd que extjs. Par contre le gros avantage de extjs c’est qu’il offre une grande palette de composants « interface utilisateur » out-of-the-box, ce qui pour un non spécialiste du web design est un avantage énorme.

MySQL slow performance with updates

This week-end I moved the site to a new server at my hoster (www.ovh.net). After five years, it was a serious hardware upgrade, going from 2G of RAM to 16G of RAM for example and from a pentium dual core to a i3 quad core machine. But I was very disappointed by the performance of the new server and by looking in the slow query log I could see that MySQL was the culprit.

By configuration, it is possible to tell MySQL to log all SQL taking more than x second (or microsecond), which is very useful to diagnose performance. So in the /etc/my.cnf file, I added this

slow_query_log=1
long_query_time=1
slow-query-log-file=/data2/logs/slow_queries.log

I could immediately see that quite regularly, a very simple update statement (used to increment a counter based on a primary key) was taking more than 1 second, which pointed to a disk issue. It was also obvious that the issue was related to write, because the log was full of update/insert statements. The new server has two disks mirrored at the software level (RAID SOFT). I started to search for disks performance issue with MySQL, and decided to test with various documented parameters.

To do so, I did a small benchmark. I created a  file with 5000 updates, executed it with mysql while spooling to a file, then I parsed the generated file to extract the execution time of each update.

Concretly, I created a file called testperf.sql containing


\T perf.log
update test_table set col1 = col1+1,col2=col2+1 where id=29890;
update test_table set col1 = col1-1,col2=col2-11 where id=29890;
etc... 5000 times
quit

I started mysql and sourced the sql fie


$mysql -u <user> -p <password> <dbname>
mysql>source testperf.sql
mysql>quit

then in the shell, I parsed the generated perf.log file, extracting each execution time and making the sum


$ grep "Query OK" perf.log | sed -e "s/.*(\(.*\)sec)/\1/" | sort -n > t.log
$ ( echo 0 2k ; sed 's/$/ +/' t.log ; echo p ) | dc

The result was stunning.

While on the old server I had something like 170 seconds, on the new server it was more than the double.

First I tried to change the parameter innodb_flush_method. On the old server, it made a very big difference;

with the default value: 170 seconds
with O_DSYNC: 128 seconds.
with O_DIRECT: 86 seconds

But on the new server, changing this parameter made the performance only worst.

Then I altered the table to be MyISAM instead of InnoDB (alter table test storage MyIsam) and re-run the performance test: the performance was now excellent. So I got the indication that the performance problem was caused by the transaction. And indeed, if I turned off the autocommit (set autocommit = 0), I got good performance with the InnoDB engine as well. Now it was clear that the problem was due to the writes to disk of the log buffer (which happens every time a transaction is committed), with the behavior that from time to time very simple updates were hanging for 1 or 2 seconds (probably waiting for the OS to complete the write).

Luckily there is a way to tell MySQL that it does not need to wait for the write to be complete every time there is a commit: innodb_flush_log_at_trx_commit. By setting this parameter to 0, you are not completly protected against data loss in case of an outage because the latest committed transactions might not have been written to disk. According to the documentation, MySQL flushes anyway the commited transactions to disk every second, so the risk of data loss is not very big: you could lose 1 second of transaction at worst (which is absolutely not an issue in my case).

With this parameter, the DML statements are flying, in fact the whole test runs in less than a second which is 1000 times faster!!

Below are the parameters related to performance in my ini file. I want to do more testing, because I am not completly satisfied with this option. I want to test the disks with fio, which looks like a nice tools to test disks performance. But in the meantime, my database is now flying and I am very happy about that!


key_buffer_size=1024M
innodb_buffer_pool_size=4096M
#This setting makes a huge performance difference on this system !!
innodb_flush_log_at_trx_commit=0
innodb_log_file_size=250M
innodb_log_buffer_size=16M
slow_query_log=1
long_query_time=0.5
slow-query-log-file=/data2/logs/slowqueries.log
general_log=0
general_log_file=/data2/logs/mysql_generalquery.log

Migrer un site de Latin-1 vers UTF-8

Ça y est, j’ai finalement pris la décision de migrer critiqueslibres.com de Latin-1 vers UTF-8. Il y a beaucoup de bonnes raisons, la dernière en date étant que je voudrais intégrer les notices bibliographiques de la Bnf dans notre base, et que certaines informations peuvent être dans des langues non-européenne (par exemple, le nom d’un auteur japonais, le titre original d’un livre de Dostoïevski),…

J’ai « googlé » pas mal, j’ai trouvé beaucoup de tutoriels et d’articles, mais mes premiers essais ont été des échecs. Finalement, j’ai pris l’approche de celui-ci, que j’ai adapté un peu : Getting out of MySQL Character Set Hell.

La procédure que j’ai suivie contient les étapes suivantes :

  • Prendre un backup !!!
  • migrer la base de données : c’est la partie difficile
  • adapter le code PHP : utilisation de la librairie mbstring et changer les fonctions qui sont sensibles au jeu de caractères (dans mon cas, il s’agit de htmlentities), indiquer à mysql qu’on est en utf-8 lors de la connection
  • changer le header dans les pages HTML et adapter le httpd.conf

La base de données

Pour la base de données, voici ma stratégie retenue. Il y en a d’autres, mais celle-ci a marché chez moi, tandis que les autres ont échouées.

1. J’ai créé trois scripts SQL. Le premier qui contient les définitions de tables, index et contraintes d’intégrité. Un deuxième qui contient les commandes de création des fonctions et un troisième qui contient les commandes de création des triggers. C’est de toute façon une bonne pratique de maintenir ces scripts et de les « versionner » dans l’outil de « source control ».
Note : il est facile de créer les scripts si on ne les a pas encore : il suffit de faire un export de la base de données avec sqldump et l’option –no-data, ensuite d’éditer le fichier généré (supprimer toute les commandes inutiles ajoutées par mysql, séparer les tables des triggers et des fonctions,…).

A chaque commande « create table » dans le script, j’ai ajouté l’option UTF8. Par exemple

CREATE TABLE mytable (
  id INT NOT NULL,
  ...
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;

2. J’ai créé un petit script shell qui exporte le contenu de chaque table dans un fichier. Par exemple,

mysqldump -umonuser -pmonpassword--skip-set-charset \
    --extended-insert=false --no-create-info \
    --triggers=FALSE mabase latable1 > latable1.sql

.. etc pour chaque table de la base de données.

Il faut vérifier que le fichier généré est bien en UTF-8, avec la commande linux « file ». Dans mon cas, vu que mon serveur est linux avec comme locale utf-8, mysql a bien créé un fichier en utf-8. Si ce n’était pas le cas, alors j’aurais probablement du faire la conversion moi-même (commande linux iconv).

3. Editer le fichier de config de MySQL.

Dans le fichier /etc/my.cnf, changer les lignes suivantes :

[client]
default-character-set=utf8
...
[mysqld]
default-character-set=utf8

Il faut ensuite redémarrer MySql.

Pour vérifier que tout est en ordre, se connecter en mysql, et exécuter le SQL suivant :

mysql>show variables like 'char%'. 

Problème : en production (plus vieille version de mySQL), le show variables like ‘char%’ montrait que certaines variables étaient toujours en latin1 si je n’étais pas connecté avec root (avec root, pas de problèmes). Je n’ai pas investiger plus en détail, j’ai juste éditer le fichier my.cnf et j’ai ajouté dans la section [mysqld]

init-connect='SET NAMES utf8' 

Ensuite, je droppe la base de données, et je la recrée (Avoir un backup !!!).

drop database mabase;
create database mabase 
default character set 'utf8' default collate 'utf8_general_ci';

Ensuite, je recrée les tables à partir du script dont il est question plus haut. Il faut créer les tables (et les index + contraintes) uniquement (pas encore les fonctions et les triggers, ce sera fait après l’import des données). Et il suffit maintenant d’importer les fichiers générés plus haut, au moyen d’un script shell.

mysql -umonuser -pmonmotdepasse mabase < matable1.sql 

pour chacune des tables de la DB.

Il faut ensuite recréer les fonctions et les triggers.

PHP

Il faut installer le paquet php-mbstring si nécessaire.

yum install php-mbstring.

Editer le php.ini, et ajouter ceci :

mbstring.func_overload = 7

Il faut changer les appels à la fonction htmlentities, pour fournir le paramètre "utf-8".

htmlentities($message)

devient

htmlentities($message,ENT_COMPAT,"UTF-8") 
 

Dans mon site, j'avais quelques appels à decode_utf8 et encode_utf8, ils doivent maintenant être supprimés.

Au moment de la connexion à la base de données, il faut ajouter ceci :

mysql_set_charset('utf8',lelink);
ou bien
mysql_query("SET NAMES 'utf8'");

Apache et le HTML

Pour apache, il suffit d'éditer le fichier httpd.conf, et dans la section "virtual host" correspondante à votre site, ajouter ceci :

AddDefaultCharset UTF-8

Dans la page html, il faut changer le tag meta http-equiv, dans l'attibut content indiquer le charset UTF-8.

Conclusion

Il y a pas mal de techniques décrites sur le WEB pour migrer un site de jeu de caractères. Il faut bien tester, et choisir celle qui convient. Il est évidemment indispensable de prendre un backup avant !

Une fois que le site est migré, il faut s'assurer que son environnement de développement est en UTF-8 aussi, ce qui est le cas avec eclipse et linux. En eclipse, s'assurer que le caractère de l'éditeur est utf-8.

Améliorations dans les forums

Pour écrire un message dans un forum, on reste maintenant sur la page contenant tout les messages, ce qui permet de relire l’avis d’un intervenant par exemple, ou de le citer. L’avantage c’est qu’il est possible de citer plusieurs messages, le programme ajoute chaque fois les balises [quote] et [/quote] ainsi que le texte. Le programme valide aussi le message, pour détecter les balises manquantes, ce qui avait par exemple pour effet d’avoir un message tout en vert ! Divers petites anomalies dans les forums ont été corrigées : l’activation des URL marchait parfois mal (si par exemple l’url était suivie d’une parenthèse ou d’une ponctuation). Aussi, je l’espère, le problème des doubles postages d’un message sera résolu.

La mise en page des pages du site a été un peu modernisée. Pour ceux que la technique intéresse : le « design » du site a été fait il y a quelques années déjà (en 2004 ?), par un professionnel, qui a utilisé un outil (Dreamweaver) générant du code HTML. Malheureusement, cet outil utilisait une technique de mise en page qui est depuis dépassée : en effet, toute la mise en page a été faite en utilisant des tables HTML imbriquées, mais les sites plus modernes utilisent une autre technique, celle des CSS (CSS). L’outil utilisait massivement des balises HTML qui sont devenues obsolètes et risquent tôt ou tard d’être non-supportées (par exemple, pour centrer, pour créer des bordures ou gérer l’espacement et les marges dans la définition des tables).

Ceci dit, refaire tout le design du site en CSS est un gros travail, et mon expérience (quoique limitée) m’a montré que la mise en page au moyen de tables HTML a du bon aussi. Comme souvent, il semble que la vérité soit quelque part entre les deux. En fait, mon avis rejoint assez bien celui-ci : Tables vs CSS : pros and cons. En gros : on fait évoluer le site, mais sans révolution.

Du nouveau sur le site

Diverses améliorations ont été mises en ligne aujourd’hui.

  • Les séries : plusieurs correctifs, une interface améliorée pour chercher une série lors de l’ajout d’un livre à une série existante. Il y a un nouvel onglet dans la recherche pour les séries. Dans la fiche livre, si la série contient plus de cinq livres, alors seul le nom de la série apparaît. En cliquant sur la flèche, la série entière s’affiche. L’utilisateur qui a créé la série est conservé. Le champ description a été supprimé, car il faisait double emploi avec le nom de la série.
  • La liste des critiques dans la fiche utilisateur et dans son compte : on peut maintenant chercher sur base d’un mot clé. On peut aussi filtrer les critiques sur base d’un auteur. Le tri par auteur n’est pas encore possible, ce sera peut-être ajouté plus tard.
  • Dans la page de garde, en-dessous, on affiche l’actualité récente. La création d’une série est également reprise dans la liste. Un lien en-dessous permet de voir la liste complète des actualités, avec tri et filtrage par type d’activité.

N’hésitez pas à signaler les problèmes éventuels, ainsi que toutes remarques ou suggestions.

Les sagas, les trilogies,.. et autres séries

Harry Potter, la trilogie de Philip Pullman ( « à la croisée des mondes » ), … il y a quelques séries cultes sur critiqueslibres.com. Jusqu’à présent, il n’était pas possible de relier les livres entre-eux, mais maintenant ça l’est : critiqueslibres.com introduit la notion de « Série ».

Une série est caractérisée par un nom, une description (c’est la description qui est affichée sur la fiche) et bien sur une liste (ordonnée) de livres. Un livre peut appartenir à une ou plusieurs séries, ou bien sur à aucune.

Sur la fiche livre, juste en-dessous des éditions, les séries dont ce livre fait partie seront affichées, ainsi que les autres livres de la série. Afin de faciliter la création des séries et permettre à chacun d’enrichir la base de données, un utilisateur connecté pourra, à partir de la fiche livre, assigner le livre à une série existante ou créer une nouvelle série. Lors de l’encodage d’une série, l’utilisateur devra fournir le nom et la description de la série. Ces deux champs sont un peu redondant, la description est le champ qui est utilisé dans la fiche livre.

Dans le menu « Les listes », il y aura une entrée permettant de parcourir les séries et les livres liés.

La fiche livre s’enrichit d’une nouvelle section donc. Au passage, quelques changements cosmétiques ont été fait sur la fiche livre, afin de simplifier la navigation.

Pour ceux qui s’en souviennent, dans la version 1 de critiqueslibres.com, les livres faisant partie d’une suite étaient déjà reliés entre eux. Cette fonctionnalité avait disparue lors du passage à la version 2 (en 2004). Maintenant, cette fonction a été re-programmée. Cependant, il reste encore à enrichir la base de données, en créant les séries et en assignant les livres. Mais je sais qu’on peut compter sur nos membres. En cas d’erreur, les admin ont accès à une interface étendue (quoique un peu expérimentale) pour corriger.

Coup de peinture en première !

Avec le printemps, j’ai eu envie de donner un coup de peinture sur le site. La combinaison bleu-orange dans le logo et dans le menu supérieur me paraissait un peu lassante, c’était un peu trop criard. J’avais envie d’un retour vers plus de sobriété, en ces temps de discours sur la décroissance. J’ai donc légèrement changé les couleurs.

Voici une image du site tel qu’il était le 10 Avril 2010, juste avant le coup de peinture.

Page de garde Avril 2010

Quand l’ASBL formée pour l’occasion a repris le site en 2007, les bandeau colorés dans le dessus de la page étaient dans les verts et les jaunes. C’est loin tout ça, mais heureusement, avec www.archive.org, il est possible de remonter le temps, ce qui m’a permis de retrouver les couleurs de 2006.

Page de garde janvier 2006

Pour changer, je propose de revenir vers les bleus, des couleurs plus sobres. Rien n’empêche de changer à nouveau plus tard, dites moi votre couleur préférée et je ferai un essai.

A part la couleur, quelques points de détails sont changés : par exemples, le menu supérieur (celui qui contient Page d’accueil, Forum, Blog,…) s’inverse lorsqu’on déplace la souris sur un élément du menu. Dans la messagerie, la taille des caractères a été augmentée, je sais que ça mettait les yeux de nos lecteurs a rude épreuve. Dans la fiche du livre, on affiche les compteurs de visites et la cote pondérée, comme demandé par Ngc111 sur le forum. Changement purement technique, un mise à jour vers la dernière version de notre librairie javascript a été faite.

Le graphisme du site critiqueslibres.com est très basique. Certains apprécient cette sobriété, d’autres nous fait remarquer que ça manque de dynamisme et que c’est un peu vieillot. On dirait e-bay il y a dix ans, m’a dit un collègue. Mais le site est destiné à un public de littéraires, qui ne s’attend pas à des effets graphiques très évolués ! Il faut savoir que le site n’a pas de graphiste (avis aux volontaires), et celui qui a fait le graphisme initial a utilisé une technique qui est depuis dépassée (c’était avant que les CSS ne s’imposent, à une époque ou les agencements étaient réalisé sur base de tables HTML).

Il n’empêche, un peu de variation n’est pas plus mal. J’espère que vous apprécierez !

La question du logo est plus délicate, on ne change pas facilement de logo après presque 10 ans. Voici une proposition de nouveau logo, mais elle n’a pas remporté les suffrages jusqu’à présent : Ludmilla, Sylviane et Gaëlle ont voté contre. Il y a-t-il un artiste dans l’assemblée ?

Un nouveau logo pour le site ?

Et pour les nostalgiques, ceux de la première heure, voici ce que j’ai pu retrouver de plus ancien. C’est la page du 15 mai 2001. Elle annonce fièrement 1437 critiques sur le site. Il manque pas mal d’images et d’éléments, c’est promis, je vais essayer de les retrouver.

La première en mai 2001

critiqueslibres.com open source ?

Il y a quelques semaines, une jeune personne m’a contacté en proposant de programmer bénévolement sur critiqueslibres.com. Une excellente surprise. Mais on s’est rendu compte que les outils nécessaires à un travail collaboratif n’étaient pas du tout en place. Entretemps, cette jeune femme vient d’accoucher, ce qui fait qu’elle n’a pas de temps libre dans l’immédiat, et ce qui me laisse donc le temps d’adapter et professionnaliser un tout petit peu la programmation sur le site (un peu, mais pas trop quand même, on fait aussi ça pour s’amuser :-) ).

Car, en effet, rien n’est organisé pour travailler à plusieurs sur le site. Je programme sur mon PC puis je mets en production quand c’est prêt. Si on est plusieurs, il faut absolument un outil de gestion de sources, et aussi un minimum de documentation. En outre il faudra créer un site de test, avec une base de test,..

Voila pourquoi je délaisse un peu les changements fonctionnels, et consacre du temps libre maintenant à mettre en place l’outil de gestion de source (j’ai pris le plus connu, Subversion). Si cela nécessite une certaine discipline, les avantages sont énormes.

Ce n’est qu’un début, il faudra ensuite installer les outils comme trac qui permettent de gérer les changements de manière beaucoup plus organisée que pour l’instant. En fait, à l’heure actuelle, la seule gestion des changements est dans ce tableur que je maintiens plus ou moins : Liste à faire

Est-ce que le site pourrait attirer des développeurs bénévoles ? Au niveau des technologies, critiqueslibres.com tourne avec MySQL, PHP et un moteur de template qui s’appelle Smarty. On utilise une librairie JavaScript très puissante, www.extjs.com. Les pages HTML on été faites au début du site version 2, avec un outil d’Adobe (dreamweaver ?), mais à l’époque il n’y avait pas de CSS et tout les layout sont avec des tables. C’est le point faible du site, et je n’ai pas de compétence en graphisme malheureusement.

C’est une raison aussi pour laquelle je compte utiliser de plus en plus la librairie JavaScript extjs dans le futur. Cette librairie a cependant l’inconvénient de nécessiter une courbe d’apprentissage très dure, on peut dire que le temps nécessaire pour maitriser la librairie est proportionnel à sa puissance. Par exemple la messagerie, la fiche auteur, la fiche lecteur,.. sont programmées avec extjs.

Le serveur est linux, bien sur ! Fedora, qui est ma distribution favorite (sans raison particulière, simplement parce que j’ai commencé avec). Depuis aujourd’hui, notre serveur héberge le site personnel d’un de mes collègues (www.syrphidae.com), pour un prix symbolique, et en échange ce collègue (qui est informaticien) pourra intervenir en cas d’urgence sur la machine en mon absence.

Mais dès que cela sera fait, je pourrais reprendre les développements fonctionnels, et qui sait peut-être aurais-je à ce moment de l’aide :-)

Fréquentation de critiqueslibres.com

Les graphes et tableaux ci-dessous ont été générés par un outil qui s’appelle Google Analytics et qui est bien connu des webmasters. Le principe de Google Analytics, c’est que le webmaster met sur son site un petit programme de Google, qui fait que chaque fois qu’un visiteur arrive sur le site, Google rassemble quelques statistiques à propos de la visite : d’où vient-il, quel est son « browser », quelles pages visite-t-il, etc…

Cela permet au webmaster d’obtenir des rapports intéressants et ludiques sur l’utilisation du site (et à Google de rassembler une masse considérable d’informations sur l’usage d’Internet, informations précieuses évidemment).

Pour faire bref :

- Il y a chaque jours entre quatre et cinq milles personnes différentes qui viennent sur le site.
- 82% de ces visiteurs sont dirigés vers notre site via un moteur de recherche (ce moteur de recherche étant Google dans l’écrasante majorité des cas).

Mais ce qui est réellement intéressant selon moi, c’est de savoir combien de membres enregistrés (ayant un pseudo) viennent sur le site (à l’exclusion des gens de passage via un moteur de recherche par exemple). Google ne peut le savoir, c’est pourquoi nous le calculons nous-même chaque jours. Vu qu’un pseudo est unique, il est facile de calculer le nombre d’utilisateurs distincts.

Ce nombre varie typiquement de 130 à 150, en fonction du jours de la semaine, et probablement en fonction du climat dehors ! Nous sommes donc chaque jours près de 150 à nous connecter en tant que membre sur critiqueslibres.com.

Voici un court extrait du rapport de Google Analytics. Dans un prochain article, je pourrais donner d’autres statistiques provenant de Google.

Statistiques Google Analytics Janvier 2010