L'appartement

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

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 !

mercredi, mars 12 2008

Installer la signature DKIM sur Postfix avec DKIMproxy

Je vous propose dans ce billet l'installation de la signature DKIM sur vos mails sortants. Ceci fait suite à mon billet concernant l'implémentation de DomainKeys avec Postfix et Amavis via Dkfilter.

Dkfilter ne gère en effet que le protocole DomainKeys de Yahoo! maintenant remplacé par DKIM (DomainKeys Identified Mail) , un protocole plus avancé et standardisé par la RFC 4871. Très très brièvement, DKIM permet de « renforcer » l'identité des expéditeurs.

En remplacement de dkfilter, l'auteur de ce programme nous propose DKIMproxy pour gérer la signature DKIM et/ou DomainKeys.

Si vous utilisez Amavis, comme c'est mon cas, sachez quelques petites choses :

  • Il semble que Amavisd-new gère la signature DKIM des mails sortants à partir de la version 2.6.0. Mais sur Debian Etch, nous en sommes à la version 2.4. C'est donc l'intérêt de ce billet. Je n'ai pas testé la version 2.6.0. je ne peux donc pas vous en dire plus.
  • DKIMproxy permet également une vérification des mails entrants. Cette vérification ne nous intéresse pas forcément puisque Amavis propose déjà cette fonctionnalité via Spamassassin qui utilise la librairie perl Mail::DKIM.

Comme pour mon précédent billet, c'est un howto « copié/collé » pour les informaticiens fainéants pressés. J'ai également fais pas mal de copié/collé de l'ancien billet puisque la configuration est sensiblement la même sur de nombreux points.

Lire la suite...

mercredi, février 27 2008

Un script de monitoring ultra simpliste

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

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

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

#!/bin/bash

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

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

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

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

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

# nombre test
COUNT=4

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

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

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

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

Toutes les améliorations sont les bienvenues ;)

Notes

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

dimanche, février 10 2008

Le déguisement de robot pour carnaval

Le déguisement de robot pour carnavalHistoire de changer un peu, je vous propose un formidable "howto" pour la construction d'un déguisement pour le carnaval de votre enfant (papa geek inside). C'est le déguisement de robot digne d'un film de Ed Wood ("Plan 9 from Outer Space" par exemple). Alors décrochez un peu de votre écran et montrez que vous savez aussi utiliser vos dix doigts pour autre chose qu'un clavier ;)

Lire la suite...

jeudi, janvier 3 2008

Comment remplacer 2007 par 2008 sur Debian Etch

apt-get remove --purge 2007
apt-get install 2008

OK, je sors ! Mais avant je vous souhaite une bonne année 2008 :)

vendredi, novembre 9 2007

Petite mise à jour du script de mass mailing

Mass

C'est une mise à jour mineure. Les fonctionnalités sont les même que celles de la première version

J'ai eu quelques soucis avec la classe Zend_Mail. Lors d'un envoi, suite à une mise à jour de Zend_Mail, je me suis retrouvé avec des groupes de destinataires en copie au lieu d'un envoi unitaire (pas très sérieux !).

J'ai donc utilisé le "bon vieux" PHPMailer. J'en ai aussi profité pour remplacer PEAR::DB par PDO. Ce qui rend le script plus léger et plus simple à installer ;) . Je l'ai également doté d'un fichier de configuration séparé.

Changelog :

  • Utilisation de PHPMailer à la place de Zend_Mail
  • Utilisation de PDO à la place de PEAR::DB
  • Changement esthétique.
  • Un fichier de configuration séparé.

Documentation

Vous devez télécharger PHPMailer, disposer de PHP5 et l'extension PDO.

Pour le reste, la documentation de la première mouture est toujours valable. Vous pouvez également utiliser toutes les options disponibles dans PHPMailer pour adapter ce script à votre convenance (je vous laisse chercher dans le script).

Important : Ce programme est fourni sans aucune garantie même si je l'utilise toutes les semaines pour une newsletter de 30 000 abonnés.

A faire :

  • une option pour préciser le chemin du fichier de configuration
  • en extra, toujours le gros boulot qui consiste à analyser les retours de mail (Delivery Error).

Téléchargement

télécharger le script

dimanche, novembre 4 2007

Installer DomainKeys sur Postfix (Debian Etch, Amavisd-new...)

Mise à jour le 12 mars 2008 : le même billet adapté pour DKIM est disponible : Installer la signature DKIM sur Postfix avec DKIMproxy.

Dans ma lutte incessante pour que mes messages n'aient pas comme destination finale les dossiers "courrier indésirable" des "grands" fournisseurs tels que Yahoo!, Hotmail/MSN, Gmail ect... Je vous propose aujourd'hui l'installation de la signature Domainkeys sur vos mails.

DomainKeys est un protocole de communication créé par Yahoo! (et défini par une RFC 4870). Wikipedia vous donnera un plus d'informations sur le sujet : DomainKeys sur Wikipedia

Même s'il fonctionne totalement et est déployé sur de nombreux serveurs, sachez qu'il est maintenant remplacé par une RFC plus "globale" : DKIM (Domain Keys Identified Mail). J'aborderais les différences et l'implémentation de DKIM dans un autre post.

D'autres liens :

DomainKeys bien reconnu chez Yahoo! (forcément ;)) DomainKeys

Voici la configuration du serveur de messagerie sur lequel se base ce tutoriel :

Nous allons mettre en place la configuration suivante :

postfix -> dkfilter -> postfix -> amavis -> postfix

Dkfilter est un proxy de signature et de vérification des signatures pour DomainKeys.

Ceci peut paraitre un peu lourd en regardant le schéma, mais postfix gère ce type de configuration très bien via les content filter

Comme je suis gentil et que l'informaticien est souvent fainéant, j'ai écris ce howto avec plein de copier/coller ;)

Lire la suite...

mercredi, octobre 31 2007

Connaitre les adresses IP des visiteurs derrière un reverse proxy

Ce qui est pénible quand on héberge un serveur web derrière un reverse proxy, c'est qu'on n'obtient pas, par défaut, les adresses IP réelles des visiteurs mais uniquement l'adresse IP du reverse proxy.

Un logiciel de statistiques qui utilise les logs du serveur web, Awstats par exemple, vous indiquera donc que vous n'avez qu'un seul et unique visiteur (snif !).

Il existe heureusement une solution simple qui se trouve dans la variable d'environnement X-Forwarded-For.

Sur un serveur Apache (sur lighttp, ca sera sensiblement pareil), il faut donc changer la ligne :

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

En :

LogFormat "%{X-Forwarded-For}i - %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

Et voilà des jolies statistiques pleines de visiteurs ;)

lundi, septembre 10 2007

Recherche Fulltext et InnoDB avec Mysql

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

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

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

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

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

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

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

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

Un pour l'INSERT :

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


Un pour l'UPDATE :

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


Et enfin, un pour le DELETE :

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

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

lundi, septembre 3 2007

Liens symboliques avec Pure-ftpd sur Debian Etch

Une chose manquait cruellement dans le binaire de pure-ftpd sur Debian Sarge : la gestion des liens symboliques. Il fallait passer par des "mount --bind ..." pour arriver à ses fins (cf. la documentation sur le sujet).

Fort heureusement, sur Debian Etch c'est résolu... Encore faut-il le trouver ! Il y a deux binaires pure-ftpd-mysql et pureftp-mysql-virtualchroot (dans mon cas, vous l'aurez deviné, j'utilise le support Mysql).

Pour activer le "virtualchroot", éditez le fichier /ect/default/pure-ftpd-common et ajoutez la ligne

VIRTUALCHROOT=true

Relancez le tout avec /etc/init.d/pure-ftpd-mysql restart

Supprimez vos mount --bind ;)

jeudi, août 23 2007

Si tu respectes pas les RFCs t'es niqué

Une mésaventure m'est arrivée aujourd'hui. Un client me signale que les mails que je lui envois sur sa boîte Gmail n'arrive pas.

Après vérification, ils arrivent en fait directement dans le dossier Spam de son compte Gmail ! Moi un spammeur ! Le comble de l'horreur ;) Pourtant, j'ai blindé le serveur de messagerie avec et le domaine avec SPF et tout le toutim pour éviter ça.

D'ailleurs, Gmail le confirme dans les entêtes :

Received-SPF: pass (google.com: domain of yves@monsuperdomaine.net designates 194.xxx.xxx.xxx as permitted sender) client-ip=194.xxx.xxx.xxx;
Authentication-Results: mx.google.com; spf=pass (google.com: domain of yves@monsuperdomaine.net designates 194.xxx.xxx.xxx as permitted sender) smtp.mail=yves@monsuperdomaine.net

Mais ca ne suffit pas. Mes mails passent directement dans le courrier indésirable de Gmail dès qu'il y a un lien hypertexte dans le message (j'ai justement le lien vers grafactory.net dans ma signature...).

Donc, un mail avec le corps du message suivant arrive dans la boîte de réception :

Salut c'est Yves

Le même avec ma signature va directement dans le dossier Spam :

Salut c'est Yves

--
http://www.grafactory.net

Je vérifie les entête chez Gmail, j'effectue moult essais pour toujours revenir à cette conclusion : un lien hypertexte dans mo message et il est considéré comme Spam.

Mais pourquoi donc l'antispam google ne veut pas de certains de mes messages ? Je suppose que je dois atteindre une note assez élevé dès que j'ajoute un lien dans mon message pour me retrouvé dans les indésirables...

Après fait quelques dizaines d'essais de configuration différentes, quelques incantations et brulé quelques cierges, je me décide à vérifier la configuration de mon domaine et du serveur de messagerie.

Tiens tiens ! DNSReport, me renvoit une erreur "Fatal" : je n'ai pas déclaré d'adresse postmaster sur le domaine grafactory.net.

Je décide de créer le compte postmaster "à tout hasard"... Et c'était bien ça !!! Me voilà de retour dans la boîte de réception de Gmail :)

Moralité, les RFCs, c'est pas pour les chiens ! Particulièrement pour le mail la RFC 1123 et la RFC 2142

mardi, juillet 17 2007

Passage sur Dotclear 2 Beta7

Apparement, il y avait une grosse faille de sécurité chez Dotclear. J'ai donc mis à jour. Pour mon blog, pas de problème. Pour la plateforme multiblogs que je gère, ca a été plus compliqué.

Le moteur utilisé par Dotclear 2 avec Mysql maintenant InnoDB. C'est bien. Il y a des belles contraintes d'intégrité partout ;)

Va savoir pourquoi, l'intégrité n'était plus de mise sur la base multiblogs, il y avait des enregistrements orphelins qui ne faisaient plus référence. J'ai du donc nettoyer un peu :

DELETE FROM `dc_post` WHERE blog_id NOT IN (SELECT blog_id FROM dc_blog);
DELETE FROM `dc_category` WHERE blog_id NOT IN (SELECT blog_id FROM dc_blog);
DELETE FROM `dc_link` WHERE blog_id NOT IN (SELECT blog_id FROM dc_blog);
DELETE FROM `dc_permissions` WHERE blog_id NOT IN (SELECT blog_id FROM dc_blog);
DELETE FROM `dc_setting` WHERE blog_id NOT IN (SELECT blog_id FROM dc_blog);
DELETE FROM `dc_spamrule` WHERE blog_id NOT IN (SELECT blog_id FROM dc_blog);
DELETE FROM `dc_media` WHERE user_id NOT IN (SELECT user_id FROM dc_user);
DELETE FROM `dc_comment` WHERE post_id NOT IN (SELECT post_id FROM dc_post);
DELETE FROM `dc_media` WHERE user_id NOT IN (SELECT user_id FROM dc_user);
DELETE FROM `dc_post_media` WHERE media_id NOT IN (SELECT media_id FROM dc_media);
DELETE FROM `dc_post_media` WHERE post_id NOT IN (SELECT post_id FROM dc_post);

Ca pourrait-être intégré dans le code de Dotclear avant une mise à jour ?!

dimanche, juillet 15 2007

PhpMyAdmin, Vista inside ?

Phpmyadmin Erreur

Une erreur windowsienne :)

jeudi, juillet 5 2007

Plugin importer des auteurs

Logo importer des auteursUn nouvelle version de mon plugin SPIP qui permet de créer des auteurs en masse à partir d'un fichier csv.

Outre l'ajout de plusieurs fonctionnalités, j'ai fais en sorte que le code soit modifiable assez facilement pour une personne ayant quelques connaissances en PHP. On m'a en effet plusieurs fois demandé comment modifier le plugin pour choisir les identifiants et mot de passe, avoir un mot de passe identique à l'identifiant...

Plus d'informations sur l'article Importer des auteurs v-0.5

dimanche, juillet 1 2007

Passage du blog sous Dotclear 2

dotclear_pw.png Etant un utilisateur de la première heure de Dotclear, je me devais de passer sur Dotclear 2 Beta6. Utilisation du plugin Flat Export, changement des chemins d'images avec une ou deux requête SQL bien placée*, mise en place des redirections des anciennes URL vers les nouvelles... Reste plus que le thème à changer pour remettre le mien.

  • mes requêtes SQL pour le changement de /blog/images en /blog/public/images dans les champs post_content et post_content_xhtml de la table dc_post :
UPDATE dc_post SET post_content = replace(post_content,'blog/images','blog/public/images');
UPDATE dc_post SET post_content_xhtml = replace(post_content_xhtml,'blog/images','blog/public/images');

samedi, juin 30 2007

De retour

reload.pngIl y a quelques temps (en 2005), j'écrivais un billet intitulé "ce blog n'est pas mort". En ce moment, on peux se le demander. Un peu démotivé peut-être et surtout surbooké au boulot. Enfin, j'ai décide de reprendre la main.

Voilà quelques trucs en vrac de ces derniers mois :

  • déjà, un peu d'auto-promo avec quelques nouveaux sites : un lagarce.net réalisé avec SPIP. Un refactoring complet de galeriecimaise.com avec mon framework Grafomatic, un studio103.fr réalisé avec le même framework et du jQuery dedans. Plus quelques trucs secrets top secrets;
  • je bosse actuellement sur un bon gros projet pour la gestion complète de theatre-contemporain.net. On va essayer de devenir le Wikipedia du théâtre contemporain. Rien de moins. En tout cas l'interface sera très Ajax Web 3.0 ;)
  • finalement, je n'utiliserais pas le framework Symphony. Je crois que c'est Jelix qui va être mon choix pour mes prochains projets. Surtout que ce qui me manquait semble être au programme;
  • jQuery ca roxe grave. On le savait déjà mais je n'en fini plus de m'amuser avec et d'améliorer sensiblement mes interfaces.
  • je cherche à changer de taf (voir un prochain post sur ce sujet)

Encore plus en vrac : un nouveau bi-xéon de chez Sivit sur lequel j'héberge du gros site, mon MacBook Pro ne fait plus de bruit, je n'ai vraiment pas eu le temps de me mettre au C, je cherche un VTT d'occase, j'ai nouveau canon Ixus 850...

vendredi, avril 13 2007

Le plein de navigateurs

Voilà un petit truc qui évite d'avoir plein de machines virtuelles pour tester vos sites sur IE6+IE7+IE5+Opéra+Firefox ect... Une compilation de navigateur qui se lance en "standalone" sous Winchose. (je n'ai pas Win mais j'ai au moins une VM de test)

Standalone et Portable browser

N'oubliez quand même pas de tester sous Safari, Konqueror, Epiphany et Lynx ;)

dimanche, mars 11 2007

Mon père, ce héros... sous Linux

En 1920, mon père est né du côté de Namur, en Belgique.

En 2007, à 87 ans, après avoir trainé, jusqu'à un problème de disque dur, son Windows 98 (un passage par Mac OS 8 pour son initiation à l'informatique), il utilise maintenant Ubuntu GNU/Linux.

Un système d'exploitation libre ! Lui qui était dans la résistance en 1940, ça tombe bien :) !

Certes, ce n'est pas facile tous les jours de perdre ses repères - oui Papa, le menu "Système" c'est l'équivalent du panneau de configuration. Et non, on ne peux pas installer l'utilitaire Canon qui indique le niveau d'encre avec de jolies couleurs. Oui, c'est normal qu'il n'y ai plus d'antivirus - mais hormis ces changements géographiques et graphiques, il est convaincu.

Qui dit encore que Linux c'est pour les geeks ?!

lundi, février 5 2007

eZ Publish et "Instant Publishing" avec WebDav

eZ Publish Je n'utilise pas encore eZ Publish mais va falloir sérieusement y réfléchir. Pourquoi ? Parceque la gestion d'un site par glisser/déposer de fichiers OpenOffice (Word aussi avec OpenXML ?) via un partage WebDav, c'est trop fort ;)

Un petit ''trailer'' en Flash pour s'en convaincre. Si vous n'êtes pas patient, attaquez directement le chapitre "Instant Publishing".

Démonstration de eZ Publish

- page 1 de 8