Git : désactiver le suivi d’un fichier

En ce moment, je bosse avec Symfony2 et j’utilise un bundle de type sandbox en local. Du coup je veux garder le fichier app/appKernel.php dans les sources mais le figer de façon temporaire, c’est-à-dire exclure les modifications locales lors des commits. Le fichier .gitignore c’est cool mais cela exclut le fichier en question des sources du projet. Pour répondre à ma problématique, on met à jour l’index du projet :

git update-index --assume-unchanged /chemin/du/fichier

Et pour l’opération inverse :

git update-index --no-assume-unchanged /chemin/du/fichier

Enjoy !

La virtualisation en environnement de développement

Tous ceux qui ont bossé avec moi savent que je suis un adepte des machines virtuelles en environnement de développement. Je fais du PHP quasi tous les jours et cependant sur mes machines physiques personnelles et professionnelles, cela doit faire près de 3 ans que je n’ai installé ni PHP ni même de serveur Apache (pas WAMP qui est le nom du serveur chinois de la brasserie du coin de la rue). Je suis accro aux VM… Oui mais pourquoi ?

Simuler au plus près l’environnement final

En théorie tout se passe bien. Oui mais ça c’est la théorie. Combien de fois n’ai-je pas entendu : « ouais mais sur mon PC ça marchait bien » ! Là on se dit que notre interlocuteur connaît un peu son métier, on commence donc à chercher dans le code source et au bout d’un quart d’heure (dans le meilleur des cas) on se rend compte que le gars bosse sur du PHP 5.4 en local et que son serveur fonctionne en version 5.2.

Un autre exemple qui m’est arrivé récemment. J’avais besoin de créer des fichiers CSV avec des caractères non latins. L’environnement d’exécution du script final était en PHP 5.3.3. Or il se trouve qu’avec certains encodages (dans mon cas en_US.UTF-8), la fonction fputscsv() n’arrive pas à écrire les mots uniques (où il n’y a pas de caractère d’encadrement). Je n’ai constaté ce bug qu’avec des mots utilisant l’alphabet cyrillique et l’alphabet arabe.
DotDeb est venu à ma rescousse : j’ai upgradé la version de PHP (de souvenir 5.3.26) et cela a fonctionné. Outre Dotdeb, ce qui m’a permis de prévenir cette anomalie c’est d’avoir utilisé un environnement similaire à l’environnement d’exécution du script final.

Partez toujours du principe qu’il faut parer à toute éventualité et donc plus votre environnement sera identique à l’environnement final moins vous rencontrerez de surprises.

La multiplicité des projets

C’est encore plus vrai aujourd’hui du fait du nombre de projets qui passe sur mon PC. Une partie non négligeable de mon temps professionnel est consacré à faire de l’audit de code quant à son caractère multilingue. Il y a quelques mois, il m’est arrivé d’avoir à auditer les sources de 4 projets en moins d’un mois, projets qui se chevauchaient au gré des retours des différents interlocuteurs, sans compter les projets internes. Bref, sans organisation et délimitation des environnements on court à la catastrophe.

Qui dit différents projets dit différents besoins. Et tout ne peut être résolu par un fichier de configuration Apache ou autre. Au fil du temps, je me suis fait mon petit parc de machines virtuelles vierges de tout projet que je clone (car il faut générer un nouvel UUID) au besoin.

Gérer les ressources de la machine physique

Rappelez vous de ce projet foireux hyper lourd (souvent pour un résultat médiocre) où vous retrouviez de la redondance de code en veux-tu en voilà, des fichiers CSS et bibliothèques JS incluses 42 fois dans la même version, avec une conception en amont prévue dans le meilleur des cas en post-projet… Tout cela en plus a tendance à faire ralentir non seulement votre navigateur mais aussi toute votre machine physique, du fait que tout tourne sur des ressources partagées : serveur Apache, SAPI PHP, IDE, Navigateur, Photoshop (on m’a dit de la rajouter, pardonnez-moi mes pairs parce que j’ai péché un magicarpe). J’ai souvenir d’avoir bossé sur deux projets mémorables de ce type où certains développeurs saisissaient leurs lignes de code sur leur clavier pour les voir apparaître 5 à 10 secondes plus tard.

En cela, la virtualisation apporte une vraie solution car elle permet d’allouer à l’environnement d’exécution une partie limitée des ressources de la machine physique. Il est vrai qu’il faut tout de même avoir une configuration assez robuste pour se permettre d’allouer des ressources suffisantes à l’environnement virtuel.

Transférer/archiver un projet

Un autre avantage non négligeable de la virtualisation est de pouvoir transférer simplement son projet. Finis les phrases du style :

  • « Tu m’as envoyé les sources de l’application, par contre le dump de la base de donnée il est où ? »
  • « Et la valeur du memory_limit ? »
  • « Comment qu’on fait pour installer Tomcat ? Et Solr ? »

Bref, les machines virtuelles c’est un gain de temps pour transférer son projet d’un poste à un autre ou tout simplement pour l’archiver.

Pour terminer

C’est vrai qu’au début c’est un peu déroutant, il y a une phase d’apprentissage où il faut savoir répondre efficacement : comment accéder à mes fichiers (je préconise sshfs), les types de connexions réseau de la VM, etc… Mais au final, une fois qu’on a pris le coup de main, c’est easy les fois suivantes et c’est plus propre en terme d’organisation.

Cacher la version de PHP et d’Apache des en-têtes

Pour savoir quelles sont les technologies utilisées par des sites Internet, j’utilise Wappalyzer. Très pratique en effet, pour voir d’un coup d’œil si un site est propulsé par Drupal, s’il utilise Apache, etc…

Wappalyzer vous affiche également la version de PHP, celle d’Apache. Ces informations sont situées dans l’en-tête de la réponse HTTP délivrée par votre serveur. En terme de sécurité, je ne trouve pas ça terrible. J’ai donc cherché à cacher ces informations et en fait ce n’est pas si compliqué.

Pour cacher la version de PHP, il suffit de passer la directive expose_php de votre fichier php.ini à Off.

expose_php =  Off

Pour cacher la version d’Apache, il faut ajouter/modifier les lignes suivantes à votre fichier de configuration Apache :

ServerTokens ProductOnly
ServerSignature Off

N’oubliez pas de redémarrer Apache et de vous référez à la doc PHP et à celle d’Apache pour en apprendre plus.

Shutter : un utilitaire de capture d’écran

Récemment j’ai du faire un guide utilisateur pour une application interne que j’ai développé en Symfony2. J’ai cherché un utilitaire assez sympa qui fait capture + édition simple d’image et annotation. Je n’avais pas vraiment envie de me farcir l’outil de capture d’Ubuntu + the Gimp. Ils font bien leur boulot, mais je me suis dit qu’un outil centralisant les deux ce serait l’idéal.

Comme toujours, la documentation de la communauté française d’Ubuntu m’a été d’un grand secours. Et j’ai donc installé Shutter qui fait exactement ce dont j’ai besoin. Il intègre un système d’onglets très pratique. Je vais vous épargner un tutoriel sur son utilisation ainsi qu’à moi-même car il est très simple d’utilisation.

Sur le site du projet, on peut lire qu’on peut choisir d’éditer les captures avec The Gimp mais je vous avoue que je n’ai pas pousser l’utilisation aussi loin. Les fonctionnalités de base m’ont suffi.

Installer Composer et le mettre à disposition de tous

Pour rappel Composer est un gestionnaire de dépendances pour PHP. Son utilisation est très répandue. On peut s’en servir par exemple pour télécharger Symfony2 ainsi que ses Vendors.

  • Système d’exploitation : Debian 7.0 Squeeze
  • Prérequis : PHP (SAPI cli) et CURL

Télécharger Composer

Placer vous dans le répertoire de votre choix. On va ensuite exécuter le script se trouvant à l’URL https://getcomposer.org/installer avec PHP

curl -s https://getcomposer.org/installer | php

Le mettre à disposition de tous

Pour que tout un chacun puisse s’en servir nous allons déplacer l’archive composer.phar dans /usr/bin

mv ./composer.phar /usr/bin/

On aurait pu lancer le téléchargement directement dans /usr/bin. Mais étant donné que c’est un dossier sensible, il vaut mieux anticiper des problèmes éventuels en travaillant dans un répertoire quelconque. Maintenant nous allons donner les droits d’exécution à tout le monde.

chmod +x /usr/bin/composer.phar

Vous pouvez adapter le CHMOD et modifier le propriétaire et le groupe au besoin. Normalement maintenant vous devriez pouvoir utiliser la commande composer.phar

Enjoy !

DrupalCamp Paris 2013 : jour 2/2

J’attendais plus de la journée 2 et je peux dire que son commencement ne m’a pas déçu. Je suis arrivé quelque peu en retard et je n’ai pu profiter que des 3/4 de la première conférence.

LIBEREZ DRUPAL ! Exploitez les concepts Drupal et magnifiez votre backend (Laurent Chardin @LaurentChardin et Julien Dubois @Artusamak)

Présentation d’un retour d’expérience de création d’un back office complexe : impressionnant. Je n’entrerai pas dans le détail des modules utilisés mais la complexité du projet a, semble-t-il, était un vrai casse-tête en terme de conception. Le fait de piloter la création et la mise à jour d’une instance front depuis un back-office, ça vous laisse toujours sur le c** derrière

Faire une GED avec Drupal (Simon Göger)

3 retours d’expérience sur la mise en place de GED avec Drupal. Comme expliqué dans cette conférence, il est vrai que sur certains points Drupal a des lacunes comparé aux autres acteurs du marché. Mais sa souplesse et son non-spécialisation sont des atouts notamment quand il s’agit d’implémentation de solutions multiples.

Les évangélistes Drupal (j’en fait partie) pensent qu’on peut quasiment tout faire avec Drupal mais avant cette présentation, il m’était difficile de voir comment la goutte pouvait être utilisée en tant que gestion électronique des documents. Ce n’est plus le cas.

Livraison continue avec Drupal 7 (Arnaud Huon, ArnaudHuon)

Méthodes Agiles : vaste programme ! 🙂 Cette conférence était un retour d’expérience sur la livraison continue. Outre la présentation des outils utilisées, c’est la résistance à l’adoption des méthodes agiles qui m’a intéressé. Et comme d’habitude, la résistance au changement est forte. Il faut constamment démontrer qu’introduire de la souplesse n’est pas synonyme de laxisme.

Keynote : Symfony dans Drupal 8 (Fabien Potencier, @fabpot)

L’évènement de la journée sans nul doute. Le succès de Symfony 2 étant ce qu’il est, son intégration dans Drupal 8 est très attendu. Pour suivre, cette présentation, il valait mieux avoir de bonnes notions en développement.

J’ai retrouvé beaucoup de points abordés du « Book » Symfony, le focus sur HTTP par exemple. Même si la présentation a été efficace, pour ne pas dire très efficace, je retiendrai surtout les composants de Symfony 2 introduits dans Drupal 8 : HttpFoundation, HttpKernel, Routing. On peut également ajouter Twig mais ce n’est pas du Symfony à proprement parler.

La sécurité sur Drupal, Tris Acatrinei (@Tris_Acatrinei)

Rappel des fondamentaux, ça ne fait jamais de mal. Jean-Kevin en a pris pour son grade. Présentation de quelques outils et une question piège sur les types de message dans les logs Drupal. Pas de questions de l’assemblée par manque de temps. Je pense que cela aurait été très intéressant.

Twig (Olivier Pierre @opidentica et Julien Dubreuil @juliendubreuil)

Je connaissais déjà Twig (via Symfony) et je trouvais déjà ce moteur de template superbe. J’ai donc eu un peu de mal avec les rappels. Le duo de conférenciers a fait le show : les chats, le chien et la domination du monde.

J’aurais aimé avoir plus d’informations sur toute la partie preprocessing de Drupal 8. Mais vu que c’est un travail en cours et que de toute façon c’était une présentation pour non-initiés je ne peux pas réellement me plaindre. J’ai passé un bon moment, c’est l’essentiel.

Et donc ?

Comme toujours, je constate que je suis une vraie midinette du libre. Ce genre d’évènements c’est toujours bon pour rencontrer du monde et remotiver les troupes. Cela a été le cas pour moi. Bonne journée aux courageux qui continue ce dimanche !

Drupalcamp Paris 2013 : jour 1/2

Après avoir fait Lyon en 2012, me voici au Drupalcamp Paris 2013. Pratique c’est à côté de chez moi, à la tour Microsoft. Pour un GNU/linuxien, c’est bizarre de se retrouver là. Que mes proches se rassurent, ce soir je me lave au white spirit. Je vais peut être acheter de la soude au cas où… Arrêtons d’être mauvaise langue et parlons plutôt de cet évènement.

Comme le DrupalCamp de Lyon, certaines conférences ne sont pas accessibles à tout un chacun. Je vous rassure, pas besoin d’être très barbu (ça m’arrange) pour en profiter. On est pas là pour développer (quoique dimanche…), mais il faut quand même maîtriser son franglais et son Drupal pour comprendre des questions du type :

Est-ce que je peux avoir plusieurs fallbacks de langues sur un site Drupal multilingue ?

Keynote : la disparition du sommaire (Denys Chomel, @DenysChomel)

J’avoue que j’ai eu du mal avec le thème de la keynote. À vrai dire, je n’ai pas tout de suite compris. Et à la fin, j’étais sceptique. Les questions m’ont permis de mieux comprendre la thèse développée. Mais je vous avoue qu’en tant que développeur un poil rigide, les concepts à la limite de la philosophie et de la sociologie m’échappent quelque peu même si je ne devrais pas…

Présentation du module Migrate (David Petit)

Une présentation efficace du module. Une mise en bouche qui valait le détour. Je n’ai jamais développé avec ce module. J’ai utilisé Migrate lors d’une migration d’un site WordPress sans avoir eu besoin de mettre les mains dans le cambouis.

Parler plusieurs langues avec Drupal (Bodgan Herea, @bhereabu)

Le multilingue, c’est mon cœur de métier donc j’étais très intéressé. Comme d’habitude, quand on attend trop on est déçu. Le retour d’expérience sur Entity Translation m’a intéressé. Car pour le moment, la plupart des sites Drupal 7 multilingues auxquels j’ai été confronté n’utilisait que Content Translation.

Industrialiser la gestion des fichiers multimédia (Aurélien Navarre, @AurelienNavarre)

Ça m’a permis de mettre un visage sur l’auteur de DrupalFacile et juste pour ça c’est déjà pas mal. Ensuite la conférence a rappelé les bases de la gestion de fichiers multimédias pour terminer par des présentations succinctes de types de solutions industrialisées. Assurément, le conférencier le plus à l’aise de la journée auquel j’ai eu affaire tant dans l’expression que sur la maîtrise du sujet.

Drupal 8 : Mobile initiative (Théodore Mabiala, @nod_)

Mon moment préféré de cette conférence : annonce du non support d’IE 8 dans le cœur de Drupal 8 et applaudissement de l’assistance, dans les locaux de Microsoft !

Sur le fond, ça m’a permis de comprendre ce que sera le support multi-écrans dans Drupal 8. Pas mal d’optimisations JavaScript et CSS ont été apportées au cœur de Drupal 8. Et cela va se poursuit au travers de la « Drupal 8 Mobile Initiative« 

Retour d’expérience : L’hébergement dans le Cloud d’une partie des plateformes web ARTE avec Acquia (Cyril Reinhard @CyrilCR & Pascal Thuet @PascalThuet)

Les problématiques spécifiques au domaine du média ont été abordées. L’intérêt était de voir quelles solutions de support, d’accompagnement mais aussi d’hébergement sont proposées par Acquia.

L’information la plus marquante pour moi de cette conférence a été le point de friction concernant la configuration serveur mutualisée qui a obligé les équipes d’ARTE à adapter leur code afin de prendre en compte les spécificités d’hébergement d’Acquia. Au final les recommandations du partenaire ont été prises en compte. Malgré que les performances en ont été améliorées, il a transpiré que cela a fait l’objet de maintes négociations du fait de planning très serré. Mais les délais courts on sait tous ce qu’il en est…

Mais encore ?

Au final, c’était une journée agréable où tout le monde parlait Drupal. J’ai revu des connaissances rencontrées à Lyon et dans mes pérégrinations professionnelles. Hâte d’être à demain.