Blog de Geeek, le blog geek par excellence par Ludovic Toinel ...

samedi 29 décembre 2007

Mise à jour des scripts de Google Analytics

google-analytics.png

Voici une news importante dans le domaine du Web Analytics, Google Analytics vient de mettre à disposition des nouveaux scripts de tracking. Le script se nomme "ga.js" et remplace le script "urchin.js" qui devenait vieillissant.

Voici l'annonce officielle :

http://analytics.blogspot.com/2007/10/exciting-announcements-at-emetrics.html

Ce nouveau script fournit de nouvelles fonctionnalités aux webmasters, comme le suivi d'actions événementiels. Cette nouvelle fonctionnalité est très pratique pour les sites Web2.0 avec de l'Ajax, cela permet d'avoir plus de détails sur les évènements enclenchés par l'utilisateur et comprendre l'activité qu'ont les personnes qui visitent votre site Internet.

Voici le nouveau script javascript à placer en bas de vos pages web à la place de l'ancien code :

<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-XXXXXX-X");
pageTracker._initData();
pageTracker._trackPageview();
</script>

Pour les personnes qui utilisent le Widget Dotclear Google Analytics, il suffit d'éditer le fichier _plublic.php et de remplacer le code existant par :

class googleAnalyticsTpl
{
        public static function widget(&$w)
        {
                $uacct = html::escapeHTML($w->uacct);

                return '
                <script type="text/javascript">
                var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
                document.write(unescape("%3Cscript src=\'" + gaJsHost + "google-analytics.com/ga.js\' type=\'text/javascript\'%3E%3C/script%3E"));
                </script>
                <script type="text/javascript">
                var pageTracker = _gat._getTracker("'
. $uacct . '");
                pageTracker._initData();
                pageTracker._trackPageview();
                </script>
                '
;

        }
}

jeudi 27 décembre 2007

Lancement de plugins.dotaddict.org : Le référentiel officiel des plugins pour Dotclear

dotclear,plugins

C'est bientôt la fin de http://plugins-dotclear.geeek.org/, l'équipe Dotclear vient de mettre en service son site de référence sur les plugins Dotclear :

http://plugins.dotaddict.org

samedi 22 décembre 2007

Mise en place d'un cache APC dans Dotclear2

dotclear,cache,mémoire

Vous connaissez très certainement APC, APC est un cache mémoire pour PHP :

http://pecl.php.net/package/APC

APC permet de stoker des données en mémoire et de pouvoir les récupérer rapidement. C'est un endroit de stockage persistant, rapide d'accès, avec une gestion automatique de la durée de vie des données stockées.

Voici les modifications que j'ai réalisées sur Dotclear2 pour cacher l'ensemble des pages compilées. Ces modifications permettent à Dotclear d'éviter de régénérées les pages à chaque demande, cela permet donc d'économiser du CPU au niveau de l'interpréteur PHP et surtout au niveau de la base de données.

Pour profiter de cette modification, il faut bien entendu avoir installé et activé APC sur votre serveur Web.

1) Editer le fichier "/inc/public/lib.urlhandlers.php"

2) Cherchez la fonction "serveDocument" (aux environs de la ligne 47).

3) Chercher la ligne :

$out = $core->tpl->getData($tpl);

4) Remplacez la par :

$uri = http::getSelfURI();
if (count($_POST) > 0){
     $out = $core->tpl->getData($tpl);
     apc_delete($uri);
} else {
     $out = $core->tpl->getData($tpl);
     $page = array();
     $page['data'] = $out;
     $page['contentType'] = $content_type;
     apc_store($uri,$page,600);
}

5) Editez le fichier "/inc/core/class.dc.blog.php"

6) Cherchez la fonction "triggerBlog"

7) Ajoutez à la fin de la fonction :

apc_clear_cache("user");

8) Ouvrez le fichier index.php à la racine du blog et ajoutez ce code au début du fichier :

require_once 'inc/clearbricks/common/lib.http.php';
$uri = http::getSelfURI();

if (count($_POST) == 0){

   $page= apc_fetch($uri);

   if($page != null){
        header('Content-Type: '.$page['contentType'].'; charset=UTF-8');
        echo $page['data'];
        exit;
    }
}

Les pages compilées sont mises dans le cache mémoire APC et ont une durée de vie de 10 minutes. Vous pouvez augmenter ou diminuer cette durée en fonction du trafic sur votre blog. Lorsque le blog est mis à jour, le cache est purgé et les pages sont régénérées.

Remarque : Cette modification désactive tous les plugins qui réalisent des actions en temps réel (compteur de visites, nombre de pages vues .. etc). Cette modification n'impacte pas des outils comme Google Analytics basés sur du Javascript.

Des commentaires ?

UPDATE : Un thread dans le forum Dotclear 2 a été initialisé

mardi 18 décembre 2007

Dotclear : Ajouter un lien de partage Facebook sur votre blog

dotclear,facebook

Voici une petite astuce pour ajouter un lien "Facebooker" à vos articles sur Dotclear2. Ce lien permet à vos visiteurs de communiquer l'article qu'ils trouvent intéressant à leur communauté Facebook.

1) Ouvrez le fichier home.html de votre thème.

2) Trouvez la ligne :

<p class="post-info-co">

3) Ajouter la ligne suivante juste en dessous :

<a href="http://www.facebook.com/share.php?u={{tpl:EntryURL}}" class="facebook_link">Facebooker</a>

4) Ouvrez la feuille de style de votre thème (souvent appellée style.css)

5) Ajoutez ce style dans la feuille de style le style suivant :

.facebook_link {
        background: transparent url(img/facebook.gif) no-repeat 0 50%;
}

6) Ajoutez l'icone Facebook.gif en attachement de ce billet dans le répertoire "img" de votre thème.

That's all !

Si vous souhaitez offrir la possibilité à vos visiteurs de partager l'article sur d'autres réseaux, je vous conseille l'excellent plugin "Partager".

lundi 17 décembre 2007

Plugin Dotclear2 : Performance

dotclear

Voici un nouveau plugin qui affiche à vos visiteurs le temps de génération de la page par Dotclear2. Pour voir le résultat de ce plugin, lisez la dernière ligne de cette page Web.

Comment ça marche ?

C'est simple, un chrono est lancé dès la réception de la requête HTTP par Dotclear. Ensuite un tag permet d'afficher en bas de page le temps total de la génération de la page demandée.

Installer le plugin

Après avoir installé ce plugin, éditez le fichier "index.php" qui se trouve à la racine de votre blog, et ajouter la ligne suivante :

$time_start = microtime();

Juste en dessus de :

if (isset($_SERVER['DC_BLOG_ID'])) {

Ensuite, éditez le fichier "_footer.html" de votre thème et placez la ligne suivante :

<p>{{tpl:lang Powered by}} <a href="http://www.dotclear.net/">DotClear 2</a> en <b>{{tpl:performance}}</b> sec.</p>

Télécharger le plugin

Liste des mises à jour :

v0.1 :

  • Première release.

lundi 3 décembre 2007

Qui dit week end pluvieux dit nouveaux plugins Dotclear2 !

Le week-end pluvieux que nous avons eu a permis à quelques plugins Dotclear 2 de naître.

Parmi la liste des nouveaux arrivants :

  • Live Counter , un plugin très pratique qui permet d'afficher en direct le nombre de personnes connectées sur votre blog. Il ressemble au plugin Connected de Dotclear 1 que vous connaissez peut être.

page_livecounter.gif

  • MenuFreshy, un plugin qui permet d'ajouter un menu horizontal en dehors de la sidebar.

page_menufreshi.gif

  • HTTP Redirect, un plugin qui permet de rediriger facilement vos billets vers une autre page Web.

page_httpredirect.gif

  • MultiFeeds, un plugin qui permet de visualiser l'ensemble des billets d'une plateforme multiblog qui sont publiés. Pratique pour surveiller l'ensemble des nouveaux articles.

page_multifeed.gif

  • Lite Box, Un visionneur d'images léger et performant basé sur la première version de Lightbox.

page_lightbox.gif


Ce qui nous fait 5 nouveaux plugins dans le week-end, bravo à Sacha pour les trois plugins ;-)

Vous pouvez suivre l'actualité des nouveaux plugins Dotclear 2 depuis cette parge Web :

http://plugins-dotclear.geeek.org/

vendredi 23 novembre 2007

Plugin Dotclear2 : GoogleSpy

dotclear,plugin,google

Voici un nouveau plugin pour Dotclear2 qui a comme objectif de proposer des articles contenant un ou plusieurs des mots clefs utilisés par votre visiteur lors de sa précédente recherche dans Google.

Ce plugin permet de diminuer le nombre de rebonds et permet de garder vos nouveaux visiteurs plus longtemps sur votre blog. Ce plugin est compatible Dotclear2 beta 7.

Comment ça marche ?

Pour voir ce que donne ce plugin, allez sur cette page :

http://www.google.fr/search?q=plugin+googleSpy

Et cliquez sur le premier lien. Vous devriez tomber sur ce billet normalement. Vous verrez une liste de propositions d'articles en dessous du billet portant la mention "A Lire".

Télécharger le plugin

Voici les fichiers de ce plugin :

Installer le plugin

Après avoir installé ce plugin, éditez le fichier "post.html" de votre thème Dotclear2 et insérez le tag :

{{tpl:googleSpyPurposePosts num_links="6" num_keywords="3" title="A lire : " description="ce que vous voulez"}}

En dessous de :

<div class="post-content">{{tpl:EntryContent}}</div>
  • num_links = Le nombre billets à rechercher dans la base.
  • num_keywords = Les 'n' premiers mots clefs google à utiliser dans la recherche d'article, plus ce chiffre est grand plus le temps d'affichage de la page peut devenir important.
  • title = Le titre à positionner au dessus de la liste de liens.
  • description = Le texte qui s'affichera en dessous du titre (title).

Liste des mises à jour :

v0.1 :

  • Première release.

v0.2 :

  • Ajout d'un filtre sur les mots clefs de recherche.
  • Externalisation des paramètres.
  • Modification de la requête SQL.

v0.3 :

  • Mise en minuscule des mots clefs de recherche.
  • Correction de la requète SQL.

v0.4 :

  • Correction du split sur la chaine de caractères qui était incorect.
  • Correction du filtre sur les mots clefs.
  • Ajout de mots anglophone dans le filtre.
  • Ajout du paramètre "description"

v0.5 :

  • Correction de l'encodage du descriptif du plugin
  • Ajout d'une page d'aide dans le panneau d'administration de Dotclear2
  • Prise en compte de vos patch (numlink, vérification de la présence du REFERER, multi-blog).

v0.6 :

  • Gestion de Google Blogsearch

dimanche 18 novembre 2007

Optimisation de Dotclear 2 Beta 7 : La face cachée de la base de données

dotclear2,sql,performance

Après mon précédent article concernant quelques pistes d'optimisations de Dotclear 2, voici un nouvel article qui liste quelques pistes d'optimisations pour la base de données de Dotclear2 beta 7.

Remarque : Je tiens à mettre l'accent sur le "beta 7" car ces optimisations ne seront pas forcément applicables à la beta 8 ...

1) Tracker les requêtes SQL les plus lentes

Dotclear2 étant développé très proprement (merci à l'équipe de développement de Dotclear2), toutes les requêtes SQL passent par un composant qui se nomme "dblayer", qui est une couche d'abstraction à l'accès de la base de données.

inc/clearbricks/dblayer/

Cette couche permet à Dotclear2 de communiquer proprement avec sa base de données, celle-ci est composée d'une classe php "dblayer.php" et de plusieurs autres classes spécifiques aux bases de données que Dotclear 2 supporte.

Après une étude rapide du fichier dblayer.php, on se rend très vite compte que les requêtes de consultation "select" passent par la méthode "select()" de la classe dbLayer présent dans le fichier.

Pour connaitre la liste des requêtes SQL les plus longue, il suffit donc de tracer les requêtes depuis cette méthode ;-)

Voici la méthode "select()" avant patch:

public function select($sql)
        {
                $result = $this->db_query($this->__link,$sql);

                $this->__last_result =& $result;

                $info = array();
                $info['con'] =& $this;
                $info['cols'] = $this->db_num_fields($result);
                $info['rows'] = $this->db_num_rows($result);
                $info['info'] = array();

                for ($i=0; $i<$info['cols']; $i++) {
                        $info['info']['name'][] = $this->db_field_name($result,$i);
                        $info['info']['type'][] = $this->db_field_type($result,$i);
                }

                return new record($result,$info);
        }

Et la voici après patch :

public function select($sql)
        {
                $starttime = microtime();
                $result = $this->db_query($this->__link,$sql);
                $endtime = microtime();

                $tracesql = false;
                $totaltime = $endtime - $starttime;

                // Si la requête est plus longue que 0.5 secondes
                if ($totaltime > 0.5 ){
                        $tracesql = true;
                }

                // On trace la requête SQL
                if ($tracesql){

                        $fp = fopen("/tmp/db.log", "a");

                        $data = $totaltime . ";" . $sql . "\n";

                        // Write the data to the file
                        fwrite($fp, $data);

                        // Close the file
                        fclose($fp);
                }

                $this->__last_result =& $result;

                $info = array();
                $info['con'] =& $this;
                $info['cols'] = $this->db_num_fields($result);
                $info['rows'] = $this->db_num_rows($result);
                $info['info'] = array();

                for ($i=0; $i<$info['cols']; $i++) {
                        $info['info']['name'][] = $this->db_field_name($result,$i);
                        $info['info']['type'][] = $this->db_field_type($result,$i);
                }

                return new record($result,$info);
        }

Cette modification devrait nous permettre de tracer les requêtes select qui répondent en plus de 0.5 secondes dans un fichier qui se nomme "db.log" et qui sera créé dans le répertoire temporaire "/tmp".

2) Analyse de requêtes SQL

Après un peu de trafic le blog, vous devriez obtenir des requêtes SQL dans le fichier "/tmp/db.log". Si ce n'est pas le cas, soit votre blog ne contient pas beaucoup d'articles, soit vous avez un serveur avec pas mal de CPU ;-)

Note: Le premier chiffre qui se trouve devant la requête est le temps d'exécution de celle-ci.

Voici les trois requêtes SQL les plus redondantes qui ont été tracées sur mon blog. Les requêtes tracées dépendent énormément de la configuration de votre blog, de la quantité d'articles que contient votre blog, et de la qualité de votre hébergement Web :

SELECT meta_id, meta_type, COUNT(M.post_id) AS count FROM dc_meta M LEFT JOIN dc_post P ON M.post_id = P.post_id WHERE P.blog_id = 'default'  AND meta_type = 'tag' AND ((post_status = 1 AND post_password IS NULL ) ) GROUP BY meta_id,meta_type,P.blog_id ORDER BY count DESC LIMIT 50

SELECT P.post_id, P.blog_id, P.user_id, P.cat_id, post_dt, post_tz, post_creadt, post_upddt, post_format, post_password, post_url, post_lang, post_title, post_excerpt, post_excerpt_xhtml, post_content, post_content_xhtml, post_notes, post_type, post_meta, post_status, post_selected, post_open_comment, post_open_tb, nb_comment, nb_trackback, U.user_name, U.user_firstname, U.user_displayname, U.user_email, U.user_url, C.cat_title, C.cat_url FROM dc_post P INNER JOIN dc_user U ON U.user_id = P.user_id LEFT OUTER JOIN dc_category C ON P.cat_id = C.cat_id WHERE P.blog_id = 'default' AND ((post_status = 1 AND post_password IS NULL ) ) AND post_type = 'post' AND (       (post_dt = '2006-03-29 22:49:37' AND P.post_id < 315)        OR post_dt < '2006-03-29 22:49:37' )  ORDER BY post_dt DESC, P.post_id DESC  LIMIT 1

SELECT C.comment_id, comment_dt, comment_tz, comment_upddt, comment_author, comment_email, comment_site, comment_content,  comment_trackback, comment_status, comment_spam_status, comment_spam_filter, comment_ip, P.post_title, P.post_url, P.post_id, P.post_password, P.post_dt, P.user_id, U.user_email, U.user_url FROM dc_comment C INNER JOIN dc_post P ON C.post_id = P.post_id INNER JOIN dc_user U ON P.user_id = U.user_id WHERE P.blog_id = 'default' AND ((comment_status = 1 AND P.post_status = 1 AND post_password IS NULL ) ) ORDER BY comment_dt DESC  LIMIT 10

La première chose à vérifier est que les éléments présents après le "WHERE" des requêtes possèdent bien un index en base :

  • Sur la première requête, il manque des index sur meta_type, post_status et post_password.
  • Sur la deuxième requête, il manque un index sur post_type.
  • Sur la dernière requête, il manque un index sur comment_status et comment_dt

Voici les requêtes SQL pour créer ces index en base :

ALTER TABLE `dc_post` ADD INDEX ( `post_status` , `post_password` )  ;
ALTER TABLE `dc_post` ADD INDEX ( `post_type` )  ;

ALTER TABLE `dc_meta` ADD INDEX ( `meta_type` )  ;

ALTER TABLE `dc_comment` ADD INDEX ( `comment_status` )  ;
ALTER TABLE `dc_comment` ADD INDEX ( `comment_dt` )  ;

Après ces modifications, les requêtes que vous trouverez dans votre fichier db.log devraient être moins nombreuses. J'ai ouvert un post sur le forum de Dotclear2, mais je n'ai pas encore de réponse quand à mes optimisations.

Je souhaite remercier l'équipe Dotclear2 pour leur travail et les féliciter de cet merveilleux outil qu'est Dotclear2 !

Vidéo de démonstration du plugin Nabaztag pour Dotclear2

Vous êtes beaucoup à vous demander à quoi sert la petite boite verte "Ecrivez à mon Nabaztag" qui se trouve à droite de cet article.

Et bien voici une petite vidéo de démonstration ;-)

Ce plugin pour Dotclear2 est développé par Olivier Azeau et est téléchargeable à cette adresse :

http://barrejadis.azeau.com/post/2007/08/08/Widget-Nabaztag-pour-Dotclear2

mardi 6 novembre 2007

Dotclear 2 Hack : Envoi d'un email de notification lorsqu'une erreur se produit

dotclear,email,notification

Le hack est tout simple et consiste à envoyer un mail de notification lorsque le blog retourne des messages d'erreurs graves aux utilisateurs (base de données injoignable par exemple).

Editer le fichier "/inc/prepend.php" et rendez-vous à la fin du fichier. Vous devriez trouver une fonction qui se nomme "__error"

function __error($summary,$message)

Il suffit d'ajouter le code suivant au début de la fonction :

$from = "mon_adresse@truc.fr";
$to = "mon_adresse@truc.fr";
$subject = mb_encode_mimeheader('Blog Error','UTF-8','B');
$headers[] = 'From: '.$from;
$headers[] = 'Content-Type: text/plain; charset=UTF-8;';
$message = $summary."\r\n\r\n";
mail::sendMail($to,$subject,$message,$headers);

Vous serez ainsi prévenu de toute les erreurs graves qui se produisent sur votre blog.

Attention, si votre blog est très fréquenté, ce type de hack pourrait bombarder votre messagerie d'email. Des idées pour temporiser l'envoi de mail ?

- page 2 de 9 -