juin 25 2009

Gérer ses templates pour Vim sans fichiers externes

Tag: Logiciels divers, VimSylvain @ 12:50

Suite à un billet posté sur le site Informatique et liberté évoquant une solution originale pour gérer ses templates avec Vim, j’ai décidé d’améliorer un peu la technique en utilisant la puissance de ce superbe éditeur combinée à celle de sed.

Habituellement, pour chaque template, nous créons un fichier externe placé dans notre dossier personnel ~/.vim. Prenons l’exemple d’un template HTML dans ~/.vim/templates/html que l’on appellerait de cette manière dans notre fichier de configuration ~/.vimrc :

autocmd BufNewFile *.html 0r ~/.vim/templates/html

Logiciels utilisés :

  • Vim 7.2
  • GNU Sed 4.2

Le but du jeu est de centraliser toute notre configuration dans notre ~/.vimrc et donc d’y inclure nos templates. Le seul moyen, à ma connaissance, est de mettre ceux-ci en commentaires afin qu’ils n’interfèrent pas avec le reste de la configuration, il ne restera plus alors qu’à trouver le template adéquat, pour cela on passera par des marqueurs de début et de fin de template, voici donc ma solution :

" BEGIN HTML
" <html>
"     <head>
"         <title>Hello gnusquad !</title>
"     </head>
" </html>
" END HTML

autocmd BufNewFile *.html call Template('HTML')

function! Template(type)
    exe "0r !sed -n '/^\"\\s*BEGIN " . a:type . "$/,/^\"\\s*END " . a:type . "$/ {s///;/^$/d;s/^\" //;p}' $MYVIMRC"
    echo '--> INFO : Template ' . a:type . ' charge < --'
endfunction

Nous retrouvons donc en première partie le template mis en commentaire et délimité par les marqueurs « BEGIN HTML » et « END HTML », la deuxième partie appelle la fonction « Template » avec en paramètre « HTML » lorsque l’on crée un nouveau fichier ayant son nom correspondant au motif « *.html », la troisième et dernière partie contient la fonction « Template » proprement dite qui prend donc un paramètre servant à délimiter le template, on y trouve une jolie ligne de sed qui paraît obscure à première vue mais qui est très simple : on localise et ne traite que la partie contenue entre « BEGIN xxx » et « END xxx », on supprime ces deux lignes puis les lignes vides puis on décommente le template, le tout étant inséré dans le buffer courant. :)

Vous aurez donc compris qu’il est très simple d’ajouter de nouveaux templates : il suffit juste que le paramètre passé à la fonction « Template » corresponde à la partie présente après « BEGIN » et « END » de votre template. ;)


mar 06 2009

Visualisez la hiérarchie de vos inclusions PHP avec « Inclued »

Tag: Debian GNU/Linux, Développement, Langages, PHP, SystèmeSylvain @ 20:58

L’extension PECL « Inclued » permet de tracer et d’enregistrer sous forme hiérarchique, l’ensemble des inclusions de fichiers durant l’exécution d’un script PHP.

Prenons pour exemple le monstrueux WordPress, voici ce que l’on peut obtenir :

WordPress Inclued

Mis à part le fait que ce genre de graphe est toujours sympa à voir, il permet de se faire une idée sur la qualité d’un code :

  • Pourquoi ce fichier est inclut alors qu’il n’est pas utilisé ?
  • Pourquoi ce fichier est inclut ici plutôt que là ?
  • Pourquoi ce fichier n’est pas inclus en utilisant les primitives *_once ?
  • Pourquoi les inclusions proviennent uniquement de ce fichier ?
  • etc.

Passons au vif du sujet ! Pour commencer nous allons installer les paquets nécessaires pour la suite des opérations :

  • php5-dev et make pour la compilation de l’extension
  • php5-cli et graphviz pour la génération des images
root@gnusquad:~# aptitude install php5-dev php5-cli make graphviz

Une fois ces paquets installés, téléchargeons l’extension « Inclued » et décompressons la d’un trait :

root@gnusquad:~# wget -q -O - http://pecl.php.net/get/inclued | tar zx

Compilons cette dernière :

root@gnusquad:~# cd inclued-0.1.0
root@gnusquad:~/inclued-0.1.0# phpize
root@gnusquad:~/inclued-0.1.0# ./configure
root@gnusquad:~/inclued-0.1.0# make

L’étape qui suit consiste à indiquer à PHP de charger cette nouvelle extension :

root@gnusquad:~/inclued-0.1.0# cp modules/inclued.so /usr/lib/php5/20060613+lfs
root@gnusquad:~/inclued-0.1.0# vi /etc/php5/conf.d/inclued.ini

extension=inclued.so
inclued.enabled=on
inclued.dumpdir=/tmp

On peut dès lors redémarrer le serveur web, Apache en l’occurence, sachant que désormais, chaque accès à un fichier PHP (via le web ou en CLI) générera un fichier dans le répertoire /tmp donc méfiance !

root@gnusquad:~/inclued-0.1.0# /etc/init.d/apache2 restart

Sachez qu’il est également possible d’activer l’extension au niveau du serveur web en utilisant les directives php_admin_flag et php_admin_value ce qui permet de limiter l’extension à un vhost par exemple. Malheureusement, et contrairement à ce qui est indiqué sur le site PHP, il n’est pas possible d’utiliser ces directives dans un fichier .htaccess.

Les fichiers générés n’étant pas directement des images, il faut les convertir à l’aide d’un script fourni avec l’extension que nous enroberons de notre propre script afin de nous faciliter la vie :

root@gnusquad:~/inclued-0.1.0# cp gengraph.php /usr/local/bin
root@gnusquad:~/inclued-0.1.0# cd $_
root@gnusquad:/usr/local/bin# vi gengraph

#!/bin/bash
echo "Generating file $1.png"
exec >/dev/null
php -d "inclued.enabled=Off" $(dirname $0)/gengraph.php -i $1 -o $1.dot
dot -Tpng -o $1.png $1.dot
rm $1
rm $1.dot

root@gnusquad:/usr/local/bin# chmod +x $_

Voilà, le plus dur est fait, il ne vous reste plus qu’à aller sur une page web PHP et à générer l’image :

root@gnusquad:/usr/local/bin# cd /tmp
root@gnusquad:/tmp# ls
inclued.00688.1
root@gnusquad:/tmp# gengraph inclued.00688.1
root@gnusquad:/tmp# ls
inclued.00688.1.png

À lire :

Mise à jour du 05 mai 2009 : pour effectuer la compilation encore plus simplement, il suffit de taper « pecl install channel://pecl.php.net/inclued-0.1.0 » et le tour est joué ! :)


fév 25 2009

Modifier le « User-Agent » sous Firefox & Thunderbird

Tag: Firefox, Logiciels diversSylvain @ 12:54

Rien de plus simple, il suffit d’aller dans l’éditeur de configuration des ces outils :

  • Sous Firefox, il faut taper « about:config » dans la barre de navigation
  • Sous Thunderbird, il faut aller dans le menu « Édition -> Préférences », sélectionner l’onglet « Avancé » puis « Général » et cliquer sur « Éditeur de configuration»

Ensuite, il faut ajouter (ou modifier si elle existe déjà) une chaîne de caractères que vous nommerez « general.useragent.override », la valeur que vous rentrerez par la suite sera utilisée par Firefox ou Thunderbird pour spécifier l’« User-Agent ».

À lire :


fév 23 2009

Problème d’accès à l’IP publique d’une Freebox à travers le NAT

Tag: Debian GNU/Linux, SystèmeSylvain @ 07:20

Voici un état des lieux : je dispose d’une Freebox v4, j’ai activé le NAT et le DHCP (adresses IP fixées par adresse MAC) pour mes PC. Il y en a un qui est entièrement accessible depuis internet grâce à l’option « IP DMZ » présente dans la console d’administration de la Freebox qui redirige toutes les connexions entrantes non encore établies en provenance d’internet vers l’adresse IP désignée, dans mon cas 192.168.0.1. Mon adresse IP publique est associée au domaine gnusquad.org donc tout le traffic à destination de ce domaine part sur le PC ayant l’IP 192.168.0.1.

Voici un schéma afin d’être plus clair :
Graphique Freebox

Le problème est qu’il est impossible depuis le PC ayant l’IP 192.168.0.2 d’accéder, par exemple, à mon blog (http://blog.gnusquad.org), la résolution DNS renvoyant mon adresse IP publique et la Freebox ne redirigeant le traffic « IP DMZ » que depuis le WAN et non le LAN !

Ma solution initiale était d’ajouter sur le PC ayant l’IP 192.168.0.2, une entrée dans le fichier « /etc/hosts » qui pour rappel, permet de fixer une adresse IP pour une liste de domaines et de sous-domaines :

root@gnusquad:~# vi /etc/hosts

192.168.0.1 gnusquad.org www.gnusquad.org blog.gnusquad.org man.gnusquad.org
...

Cette solution a le mérite d’être simple et rapide à mettre en œuvre mais a comme désavantage le fait de devoir tenir à jour cette entrée par rapport à la liste grandissante des sous-domaines hébergés sur la même machine.

Il était donc temps de trouver une solution plus confortable, c’est pourquoi j’ai décidé d’installer un proxy DNS, en l’occurence pdnsd qui me permettrait de modifier les enregistrements DNS à ma guise.

root@gnusquad:~# aptitude install pdnsd

L’installation vous demandera si vous préférez utiliser les DNS fournis par le programme resolvconf, les DNS des serveurs racines ou bien encore si vous préférez les indiquer manuellement.
Utilisant resolvconf, ce que je vous conseille au passage, j’ai choisi cette option ce qui aura pour conséquence, au lancement de pdnsd de mettre l’IP 127.0.0.1 dans le fichier /etc/resolv.conf à la place des DNS de votre FAI, ces derniers étant utilisés par le proxy pour la résolution de noms.

Il faut ensuite, désactiver la génération automatique du fichier de configuration du proxy en commentant la ligne AUTO_MODE du fichier /etc/default/pdnsd.conf . Vous pouvez également spécifiez des options de démarrage via la variable START_OPTIONS ce qui peut être utile pour activer le mode debug (option –debug). Voici ce que ça donne une fois le fichier modifié :

root@gnusquad:~# cat /etc/default/pdnsd.conf

# do we start pdnsd ?
START_DAEMON=yes
# auto-mode, overrides /etc/pdsnd.conf if set [see /usr/share/pdnsd/]
#AUTO_MODE=resolvconf
# optional CLI options to pass to pdnsd(8)
START_OPTIONS="--debug"

Maintenant il ne reste plus qu’à configurer le proxy DNS pour renvoyer l’IP 192.168.0.2 pour toutes demandes de résolution de noms portant sur le domaine gnusquad.org ce qui se fait aisément une fois après avoir lu la man page du fichier pdnsd.conf :

root@gnusquad:~# vi /etc/pdnsd.conf

...
rr {
    name=gnusquad.org;
    ns=localhost;
    reverse=on;
    a=192.168.0.1;
}
rr {
    name=*.gnusquad.org;
    a=192.168.0.1;
}
...

Il ne reste plus qu’à redémarrer le proxy DNS pour que les changements soient pris en compte :

root@gnusquad:~# /etc/init.d/pdnsd restart
Stopping pdnsd.
Starting pdnsd.

Pour terminer, sachez que pdnsd fait également office de cache DNS pour accélérer les résolutions de noms, ce cache se trouve dans le fichier /var/cache/pdnsd/pdnsd.cache que vous pouvez supprimer sans souci si vous rencontrez quelques problèmes durant vos tests. Quant aux logs, ceux-ci se trouvent dans le fichier /var/cache/pdnsd/pdnsd.debug.

À lire :


Page suivante »