Possibilités et limites de Zend_Mail – décembre 11th, 2009

Zend_Mail est un composant Zend Framework, qui facilite la création et l’envoi d’e-mails. Il permet également de consulter une boite mail distante et de manipuler des messages.

Aujourd’hui, les fonctionnalités de création d’e-mails sont au point et vraiment pratiques. En revanche, il serait intéressant de partir d’un fichier e-mail plat, qui servirait de modèle, ce que Zend_Mail fait difficilement. A travers Zend_Mail_Message, il est possible de parcourir un e-mail mais sauf erreur il n’existe pas encore de passerelle fiable vers Zend_Mime_Message. Or Zend_Mail utilise Zend_Mime_Message pour la gestion des mails multipart.

Cette semaine, j’ai tenté d’utiliser Zend_Mail pour mettre en place un moteur de mailing spécifique lié au système d’information d’une entreprise. Au final, j’utilise Zend_Mail_Message pour la lecture des données à la sortie de postfix puis je manipule mon e-mail “à la main”.

Exemple d’utilisation de Zend_Mail_Message :

// Lecture d'un mail
$params = array('raw' => $mailContent);
$mailPart = new Zend_Mail_Message($params);
 
// Accès aux headers
$subject = $mailPart->getHeaderField('subject');
$headersTab = $mailPart->getHeaders();
 
// Parcours des parts
foreach ($mailPart as $part) {
    $headers = $part->getHeaders();
    $body = $part->getContent();
}
Posté dans PHP, Zend Framework

OpenStates passe à Linux-Vserver – novembre 24th, 2009

Après avoir utilisé kvm pendant des années (avec beaucoup de satisfaction je dois le reconnaître), OpenStates passe à Linux-Vserver, un “isolateur des contextes de sécurité combiné à du routage segmenté“, bref, une alternative à la virtualisation. OpenStates utilise désormais ce système pour ses formations.

Le principe : il s’agit d’un patch du noyau Linux qui permet la création de contextes isolés les uns des autres. Ainsi, il est possible d’installer plusieurs distributions linux basées sur le même noyau.

Pourquoi tout abandonner pour Vserver ?

Voici quelques arguments qui ont décidé OpenStates à adopter Linux-Vserver :

  • La machine virtuelle est toute petite : une distribution minimale sans son noyau, donc moins de redondances par rapport à une virtualisation classique.
  • La maintenance est facilitée par le fait que le système hôte a accès directement aux fichiers des machines virtuelles… en fait, une VM, c’est un répertoire. On peut donc copier ou modifier des fichiers depuis le système hôte (que les machines soient éteintes ou en marche) et les backups peuvent être réalisés par synchronisation incrémentale (rsync ou équivalent) !
  • La configuration de chaque VM sur le système hôte est très complète, que ce soit pour la mise en place du réseau, les fichiers de configuration, la construction ou le clonage des machines virtuelles.
  • Enfin, dernier argument et non le moindre, les performances sont aussi excellentes que la gestion des ressources ! Les VMs se partagent la RAM et les process intelligemment, la vitesse d’exécution d’une VM est la même que celle du système Hôte.

Notons aussi que le créateur de Linux-Vserver, Herbert Pötzl, est sympa et ouvert en plus d’être talentueux. Il accueille les débutants avec beaucoup de patience, merci à lui.

Qui doit écarter la solution Vserver ?

Malheureusement, vous ne pourrez pas installer de système Microsoft, avis aux amateurs de fenêtres multi-colores… car il faudrait que Windows se base sur un noyau 2.6.xxx…

De plus, de bonnes connaissances en administration Linux sont généralement requises pour maîtriser Linux-Vserver, contrairement à VMWare, KVM ou VirtualBox.

Posté dans PHP

Mes programmes UNIX et Linux – juin 1st, 2009

Ce billet est disponible en version PDF (bêta).

Depuis plusieurs années maintenant j’utilise exclusivement Linux/UNIX pour mon travail et mes loisirs. En particulier Xubuntu pour la bureautique, Ubuntu server, Debian et FreeBSD pour mes serveurs. Avant d’aborder les applications, quelques mots sur ces distributions.

Distributions

Xubuntu

Anciennement sous Suse, Mandrake puis Mandriva, Xubuntu s’est ensuite imposé comme système léger, performant et complet pour mon travail et mes développements de tous les jours. J’apprécie en particulier le côté élagué de Xfce : des fonctionnalités utiles uniquement, favorables à la productivité et sans fioritures inutiles.

Les distributions Ubuntu sont très travaillées, mises à jour fréquement et automatiquement, stables de surcroit, une merveille pour qui souhaite disposer de versions récentes de ses programmes et gagner du temps sur les installations.

Ubuntu server / Debian

Lors de ma première installation de Ubuntu server j’ai été surpris. Je m’attendais à un Ubuntu basique sans interface graphique. Il s’agit en réalité d’une distribution spécialement travaillée pour la mise en place d’un système fiable. J’utiliser Ubuntu server dans mes machines virtuelles et mes serveurs dédiés.

Debian est quand à lui un système propre, utile lorsque j’ai besoin d’une installation fiable et perenne. Un outil sans surprise, qui respecte nombre de standards et mérite son succès.

FreeBSD

Système fiable et performant par excellence, depuis de nombreuses années FreeBSD vient à ma rescousse lorsque Linux pêche. Ce système m’a souvent donné satisfaction dans le cadre d’une utilisation serveur et m’a enlevé bien des épines du pied. En revanche, j’adhère moins à la version bureautique PCBSD \& Co ainsi qu’aux évolutions des versions 7.x qui tendent à proposer un système très chargé. La possibilité de disposer d’un système minimal et extrèmement élagué était à mon avis un point fort de FreeBSD sur toute distribution Linux.

System Rescue CD

Son nom est bien choisi. System Rescue CD est destiné à récupérer un système ou à effectuer des opérations de maintenance. Ce CD, basé sur Gentoo, est génial et rempli parfaitement son rôle. Je l’utilise en particulier pour sauvegarder un système complet avec l’outil partimage.

Et les autres…

J’ai eu l’occasion d’utiliser plus ou moins longuement d’autres systèmes, tels que Gentoo, Dragonfly, Redhat/Fedora, DSL, etc. Ils m’ont plu eux aussi, mais Ubuntu et FreeBSD se sont imposés pour une productivité maximale. Windows est également un bon système, mais différent par sa philosophie et encore un peu trop marketé. Les messages imposés que l’on retrouve chez tous les constructeurs matériels, du style “Untel recommande Windows Vista pour votre ordinateur bla bla” m’oripilent.

Logiciels pour le développement

Gestion de versions

Les logiciels de gestion de versions ne manquent pas sous UNIX ou Linux. J’ai tendance à les classer en deux catégories : les centralisés (CVS, Subversion…) et les décentralisés (Git, Mercurial…). Les implémentations centralisées proposent la création d’un dépôt de données unique, dont l’accès est nécessaire pour valider des modifications. Les alternatives décentralisées permettent des validations, montées de version, tags et branches en local, sans connexion à un dépôt distant.

Anciennement sous CVS, après de longs essais j’ai décidé de maintenir Subversion et Git pour mes travaux, le premier étant centralisé et le deuxième décentralisé. Git est utilisé pour des projets PHP qui bougent beaucoup et subversion pour tout le reste, y compris le versionnage et l’archivage de mes documents bureautique. SVK est un outil décentralisé qui utilise un backend subversion, il est bien, mais je n’ai jamais réussi à l’adopter.

Quelques avantages de Subversion

  • La gestion des externals, sur dossier comme sur fichier (v1.6.x)
  • La configuration et les propriétés
  • La relocalisation d’une copie de travail
  • L’efficacité du FSFS qui s’améliore face au backend Berkeley
  • Le protocole SVN : optimisé, rapide, fiable

Quelques avantages de GIT

  • La configuration assistée
  • La fiabilité (GIT est utilisé pour le développement du noyau de Linux et créé par Linus Torvalds)
  • La gestion simplifiée des branches et des merges
  • Les outils graphiques

SSH

C’est certainement le protocole que j’utilise le plus. A longueur de journée je suis face à un shell. SSH me permet d’accéder à mes machines distantes et virtuelles.

Un problème de firewall ou d’accès quelconque ? Le tunnel SSH est souvent l’ultime recours. Enfin, un outil basé sur SSH, MySecureShell, est également très utile pour la mise en place de serveurs SFTP complets, chrootés et efficaces.

Emacs

Emacs est mon éditeur historique. Il est lui aussi mon compagnon de tous les jours. Emacs sait tout faire : éditer du code biensûr, tout type de code. Mais aussi lire les news, envoyer des e-mails, naviguer sur internet, compiler du code et ce avec une interface en ligne de commande ou graphique, au choix.

Pour éditer du PHP, Emacs possède un mode qui propose la coloration syntaxique, l’indentation automatique et la complétion. Pour éditer d’autres syntaxes telles que C/C++, Latex, BHL et j’en passe, Emacs possède toute une panoplie d’outils hautement configurables.

Le débat Emacs contre VI est lui aussi historique. J’utilise souvent VI aussi, surtout lorsque Emacs n’est pas disponible. Une question d’habitude tout simplement.

Sauvegarde

Rsync

Pour la sauvegarde, j’utilise principalement deux outils : rsync et backup-manager. Le premier, je l’ai tordu dans tous les sens depuis des années. Il permet, comme son nom l’indique, toute sorte de synchronisation et ce accompagné de nombreuses options.

Backup-manager

Backup-manager est un outil simple que j’installe quand j’ai besoin de sauvegardes régulières qui fonctionnent sans intervention humaine : un outil qu’on configure et qu’on oublie. Il gère plusieurs protocoles dont rsync, ssh, ftp, etc.

KVM

KVM, un outil de virtualisation complète basé sur Qemu. Il gère la virtualisation matérielle, c’est à dire l’accélération matérielle des machines virtuelles lorsque celle-ci est rendue possible par le processeur. Je suis un grand fan de KVM. L’outil est sobre, efficace et stable ! Ce n’était pas le cas avant et pour cela j’ai du patienter, mais aujourd’hui l’outil n’a rien a envier à VMWare ou VirtualBox.

J’utilise KVM pour faire tourner mes machines virtuelles, dont celle que je trimbale partout sur ma clé USB. Les machines virtuelles sont très intéressantes pour balader un système entre plusieurs utilisateurs, pour proposer un livrable prêt à l’emploi ou pour toute prestation de formation.

Loisirs et bureautique

MPD

On passe maintenant dans le domaine du loisir avec Music Player Daemon, un programme qui permet de lire de la musique en mode client-serveur. Pour quoi faire me direz-vous ? Je me suis posé la question, je l’ai essayé et je l’ai définitivement adopté.

Avec MPD, il est possible d’arrêter l’interface du lecteur sans arrêter la musique, d’utiliser plusieurs interfaces en client lourd, ligne de commande ou web, ce depuis plusieurs ordinateurs s’il le faut. Mon client préféré, une version modifiée par mes soins de NCMPCPP, s’utilise en ligne de commandes. En version non client-serveur, QuodLibet est à mon avis une bonne alternative, pas trop lourde et efficace.

Latex / BHL / Lilypond

Latex permet l’écriture de document en mode texte, avec des balises spéciales. Le document peut être compilé pour une sortie DVI ou PDF. Ce que j’aime surtout chez Latex, outre le fait que l’on puisse écrire rapidement toute sorte de document : la qualité de la production. BHL est un méta-langage qui permet d’écrire du Latex encore plus vite (je l’utilise pour ce blog) et lilypond est un logiciel génial d’édition de partition musicale qui fonctionne sur le même principe que Latex. Notons également que Latex peut s’utiliser avec des outils comme graphviz, imagemagick, etc. pour la production de documents illustrés.

Internet

Pour naviguer et gérer mes e-mails, je suis finalement toujours revenu sur Firefox et Thunderbird après avoir essayé les alternatives. Je pense qu’on peut encore améliorer ces logiciels, notamment en ce qui concerne les performances et la gestion des ressources. Mon calendrier est également géré par Sunbird et mes contacts par abook, un outil ncurses efficace et rapide.

Multimédia

Image et photo

Gimp

Gimp est le pendant de Photoshop. Il possède des fonctionnalités de traitement et de retouche d’image avancées ainsi que de nombreux filtres. Il est également utilisé pour la création de maquettes pour le web. J’ai utilisé Photoshop pendant des années avant de me mettre à Gimp. La transition a été dure, mais aujourd’hui je ne la regrette pas. La seule faiblesse que l’on peut craindre de Gimp est une utilisation très différente de celle de son rival, ce qui complique le passage de l’un à l’autre.

Imagemagick

Imagemagick est un logiciel parfait pour le traitement d’images en ligne de commandes. Pas question biensûr de faire de la retouche comme dans Gimp, mais pour la mise en place de traitements automatisés, cet outil est tout indiqué et sait faire beaucoup de choses : recadrages, retouches, créations graphiques et titrages, mise en place de bordures, etc. Pour l’édition de données exif, j’utilise occasionnellement jhead.

Gqview

Enfin, gqview est un logiciel très simple de visualisation d’images, mais aussi très rapide. C’est cette caractéristique qui me pousse à l’utiliser à chaque fois que je dois faire défiler des photos.

Vidéo

ffmpeg est mencoder

Tous mes encodages vidéo sont effectués avec ces deux softs, en particulier ffmpeg. Ceux-ci sont très pratiques et extrèmement complets. Leur utilisation en ligne de commandes permet la mise en place d’automatismes.

Cinelerra

On peut faire des reproches à Cinelerra, notamment d’être parfois capricieux et pas toujours à la hauteur de concurrents comme Premiere ou Avid. Mais il fonctionne sous UNIX/Linux d’une part et s’avère gratuit et très complet d’autre part.

Cinelerra est mon logiciel de montage favori, l’ensemble des émissions PHPTV sont montées avec cet outil. Il en existe d’autres, tels que kdenlive ou Kino, mais ces derniers ne m’ont pas donné satisfaction, soit parce qu’ils manquent de stabilité, soit parce qu’ils manquent de fonctionnalités, ou les deux. Quoi qu’il en soit, le montage vidéo doit progresser sous Linux.

Mplayer et VLC

Mplayer et VLC sont des logiciels de lecture, tous deux très complets. J’utilise alternativement l’un ou l’autre en fonction de mes besoins. Mplayer démarre plus rapidement et s’avère stable. Il permet également, utilisé en ligne de commandes, d’effectuer des traitements utiles. VLC est le player “qui lit tout”, très pratique lorsque l’on veut lire n’importe quoi, n’importe où.

dvgrab

Si le montage est une faiblesse sous linux, la présence de dvgrab fait gagner un bon point au pinguin pour le dérushage ! Ce petit soft simple est d’une efficacité incroyable. Nul besoin d’aller cliquer sur 36 boutons pour transférer sa vidéo de la caméra à l’ordinateur (ou l’inverse), une ligne de commandes suffit et permet un transfert en SD ou HD au choix, et le résultat est toujours bon. Il en fait peu, mais il le fait bien.

Conclusion

Ce petit tour d’horizon de quelques logiciels UNIX/Linux se termine. Biensûr j’en utilise beaucoup d’autres, ce document deviendrait trop long à lire si je devais tous les citer, mais ceux-ci ont l’avantage de m’avoir marqués un jour ou l’autre, c’est pourquoi j’ai décidé d’en témoigner ici.

Posté dans Linux / Unix

PHP TV #4 - MySQL, Magento, Zend Framework & Symfony – mai 20th, 2009

Une nouvelle édition de PHPTV est sortie ce week-end. Après quelques mois l’absence faute de temps, l’équipe s’est remise à tourner sur le sujet des frameworks Symfony et Zend, de MySQL et Magento.

Comme pour le magazine #2, il est possible d’écouter des extraits du magazine qui en tout dure environ 10 minutes. A l’avenir, le site de PHPTV sera découpé en rubriques. Les magazines resteront en page d’accueil, tandis que les rubriques seront fournies en sujets plus courts tels que les interviews et reportages occasionnels réalisés par nos correspondants PHPTV.

Enfin, je profite de ce post pour remercier tous ceux qui nous soutiennent dans ce projet en participant à la diffusion des vidéos, vous êtes de plus en plus nombreux, ainsi que les membres de l’équipe toujours présents et motivés : Eric, Xavier, Christophe et Julien. Sur ce magazine #4, nous avons également accueilli Olivier Dasini pour les questions MySQL, qui a accepté de venir malgré notre appel tardif.

Posté dans PHP, PHPTV

PHP en 2009 – mars 11th, 2009

PHP continue à évoluer en 2009. L’arrivée imminente de PHP 5.3.0 et de ses nouveautés, l’apparition de versions spécialement étudiées à Microsoft Windows et l’adaptation aux nouvelles technologies du Web 2.0 sont trois orientations importantes de PHP, qui sont des arguments de poids pour l’adoption de la technologie dans les entreprises.

Si de gros efforts sont déployés pour que PHP reste à la pointe, le chemin n’est pas terminé, car PHP n’est toujours pas une solution d’avant plan pour des projets stratégiques qui touchent au coeur des entreprises. Malgré l’apparition de frameworks sérieux, l’image de PHP dans le monde professionnel en général n’est pas toujours à la hauteur des efforts fournis.

Un autre point ambigu concerne les méthodes d’adoption de PHP pour de gros projets. Plus que jamais, un projet PHP doit être réalisé avec organisation et rigueur. Une bonne connaissance du langage et de ses composants toujours plus nombreux, une architecture organisée et cohérente, une bonne culture générale en informatique et en génie logiciels sont des pré-requis nécessaires.

Aujourd’hui, on peut affirmer que les succès de PHP concernent presque exclusivement des projets liés au web. Les entreprises qui parviennent à s’enrichir en utilisant PHP proposent des gros portails, des intranets ou des solutions de gestion avec interface web. L’interface est importante car elle est le premier élément que l’on voit et souvent le premier argument de vente. PHP, en proposant une intégration parfaite à Flex et autres solutions Ajax, est une solution idéale pour le développement d’interfaces dynamiques.

Le revers de la médaille concerne les systèmes d’information. Des solutions compilées en C# ou en Java sont toujours préférées à PHP pour tout ce qui concerne les manipulations de données métier. Ces technologies, bien qu’interfaçables, ne sont dans la pratique que très rarement mélangées avec PHP. PHP 5.3 offre de nouvelles possibilités objet tel que les espaces de noms, des corrections importantes et une SPL qui évolue. Mais le développement, intuitif et agile, de projets web tels qu’on les connaît ne s’avère pas adapté au développement d’un système d’information complet, plus théorique et plus prédictif.

La nouvelle marche à franchir pour PHP concerne donc l’adoption totale de la POO avec PHP, aidée de frameworks solides, de la SPL, d’outils de maintenance tels que PHAR, et surtout d’une évolution des méthodes de développement copiée sur les grands projets J2EE et .NET.

Posté dans PHP

Standard PHP Library : ArrayAccess – février 17th, 2009

La “librairie standard de PHP” ou SPL sont un ensemble de classes et d’interfaces qui permettent d’optimiser les performances et les pratiques de programmation en PHP. Cet outil, qui est installé par défaut dans PHP, mérite fortement d’être connu et permet des acrobaties très intéressantes, comme nous allons le voir.

Ce tout premier tutoriel aborde une classe courante de la SPL : ArrayAccess. Nous allons nous amuser à mettre en place un lien fort entre un flux XML et un tableau. Ce système permet d’écrire et de lire dans un fichier XML de manière très simple, à travers un tableau !

Lier un flux XML à un tableau

ArrayAccess est une interface qui permet de donner à une classe des propriétés que seuls les tableaux avaient jusqu’à présent. Le principe : on peut contrôler les actions qui sont faites sur une variable qui s’apparente à un tableau, en particulier ajouter, modifier et retirer des éléments.

En d’autres termes, nous souhaitons lire et écrire dans ce flux xml…

<products>
  <product id='bpp'>Best practices PHP</product>
  <product id='zf'>Zend Framework</product>
  <product id='mp'>Memento PHP</product>
</products>

…à travers un tableau, comme ceci :

// Affichage d'un produit
echo $products['bpp'] . "\n";
 
// Ajout d'un produit
$products['xml'] = "Le XML facile";
echo $products['xml'] . "\n";
 
// Suppression d'un produit
unset($products['pa']);
echo $products['pa'] . "\n";

La classe ProductList

Commençons par écrire notre classe qui contient le mécanisme de liaison entre le flux et le tableau simulé :

class ProductList implements ArrayAccess
{
    private $products = null;
 
    public function __construct($feed)
    {
        $this->products = simplexml_load_string($feed);
    }
 
    public function offsetExists($offset)
    {
        $xpath = '/products/product[@id=\'' . $offset . '\']';
        $values = $this->products->xpath($xpath);
        return (boolean) count($values);
    }
 
    public function offsetGet($offset)
    {
        $xpath = '/products/product[@id=\'' . $offset . '\']';
        $values = $this->products->xpath($xpath);
        if (count($values)) {
            return (string) $values[0];
        }
        return null;
    }
 
    public function offsetSet($offset, $value)
    {
        $product = $this->products->addChild('product', $value);
        $product['id'] = $offset;
    }
 
    public function offsetUnset($offset)
    {
        $cpt = -1;
        $toDel = array();
        foreach ($this->products->product as $product) {
            $cpt++;
            if ($product['id'] == $offset) {
                $toDel[] = $cpt;
            }
        }
        foreach ($toDel as $id) {
            unset($this->products->product[$id]);
        }
    }
 
    public function getXml()
    {
        return $this->products->asXML();
    }
}

Cette classe, qui implémente l’interface ArrayAccess, charge un flux XML via son constructeur __construct(). Ce flux peut être récupéré grâce à la méthode getXml(). Les quatres méthodes intéressantes, qui sont imposées par l’interface ArrayAccess sont les suivantes :

  • offsetExists est automatiquement appelé lorsque PHP souhaite savoir si un élément $offset du tableau existe. Pour simuler cela, nous faisons une requête xpath sur le flux XML.
  • offsetGet récupère l’élément du tableau dont la clé est $offset.
  • offsetSet ajoute un élément au tableau. Faire cela avec simplexml est un jeu d’enfant.
  • offsetUnset retire un élément du tableau. L’algorithme proposé ici retire les éventuels doublons.

Ainsi, la création d’un nouveau objet ProductList peut s’utiliser comme un tableau, comme le monde la section suivante.

Utilisation de l’objet ArrayAccess

Voici un petit exemple d’utilisation de cet objet. Comme nous pouvons le voir, son maniement s’apparente à celui d’un tableau et pourtant, c’est un fichier XML qui est manipulé par dessous :

$feed = "
<products>
  <product id='bpp'>Best practices PHP</product>
  <product id='zf'>Zend Framework</product>
  <product id='mp'>Memento PHP</product>
</products>
";
 
// Création d'un tableau attaché au flux XML
$products = new ProductList($feed);
 
// Affichage d'un produit
echo $products['bpp'] . "\n";
 
// Ajout d'un produit
$products['xml'] = "Le XML facile";
echo $products['xml'] . "\n";
 
// Suppression d'un produit
unset($products['mp']);
echo $products['mp'] . "\n";
 
// Extraction du flux XML modifié
echo $products->getXml();

Le flux généré par ce petit exemple est le suivant :

<products>
  <product id="bpp">Best practices PHP</product>
  <product id="zf">Zend Framework</product>
  <product id="xml">Le XML facile</product>
</products>

Ce petit tutoriel s’arrête ici. Nous irons un peu plus loin dans le prochain avec d’autres interfaces telles qu’Iterator et Countable.

Posté dans PHP, SPL, architecture

Ouverture du blog – février 7th, 2009

L’ancien blog OpenStates a fermé ses portes pour laisser sa place à celui-ci, qui se veut plus moderne et plus instructif, pour tous ceux qui souhaient en savoir plus sur PHP et ses technologies associées. Merci à vous de le visiter et bonne lecture !

Posté dans OpenStates