- Publié le 02 Octobre 2009 à 00:11
Comme je l'écrivais il y a quelques jours, le backoffice de Magento est plutôt sympa mais un peu mou. En plus les options pour le développeur sont bien cachés au fin fond du menu System. Si je compte bien, à partir du tableau de bord il faut pas moins de 7 clics et 4 rafraîchissements de page pour activer ou désactiver l'option Template path hints (affichage des templates utilisés) et/ou l'affichage du nom des blocks pour un site... Bref c'est extrêmement pénible quand il s'agit juste de voir où se trouve une coquille dans un template ou de connaître le nom du block à surcharger.
J'ai donc un écrit un petit script (version avec coloration syntaxique) qui permet d'activer ou de désactiver ces options pour un site Magento en ligne de commande. Il permet également d'activer facilement ces options pour le backoffice sans manipuler directement la base de données (ce qui n'est certes pas très compliqué une fois qu'on connaît le nom de la bonne table).
Exemples d'utilisation :
cd /path/to/magento
php /path/to/script/setdebug.php -s base # active template path hints pour le site dont le code est base
php /path/to/script/setdebug.php -b -s base # active template path hints et l'affichage des blocks
php /path/to/script/setdebug.php -d -s base # désactive template path hints et l'affichage des blocks
- Publié le 08 Septembre 2009 à 23:30
J'ai plusieurs fois eu besoin de faire des substitutions dans tous les fichiers ouverts dans vim. J'avais cherché dans les flags de la commande substitute (:s) sans succès et donc systématiquement je contournais le problème à coup de lignes de bash à base de find, sed, grep et compagnie. Mais je suis tombé par hasard sur la commande :bufdo en cherchant à corriger quelques petits bugs dans eZVim le plugin vim pour eZ Publish. Du coup rien de compliqué, il suffit de préfixer toute commande par bufdo pour l'appliquer sur tous les buffers ouverts, par exemple :
:bufdo! %s/cherche/remplace/g
Le point d'exclamation permet de forcer le passage d'un buffer à un autre sans sauvegarder son contenu. Et évidemment ça marche pour autre chose que la substitution. Il est également possible d'exécuter plusieurs commandes sur chacun des buffers en les séparant avec un pipe (|), par exemple pour corriger une indentation en fonction des réglages de vim, supprimer les espaces inutiles en fin de ligne et sauvegarder le fichier, la ligne suivante devrait faire l'affaire :
:bufdo retab | %s/ *$//g | w
Il existe également :tabdo (pour les onglets), :windo (pour les fenêtres vim) et :argdo (pour les arguments de la ligne de commande).
- Publié le 11 Mars 2009 à 14:03
Petit pense bête pour la prochaine fois où j'aurai besoin de faire la somme d'une liste de nombres en shell (un nombre par ligne) :
cat my_file | awk '{total+=$1}END{print total}'Par exemple, pour obtenir la taille totale des tables dans une base de données MySQL :
mysqlshow -i my_db '*' | tr -s ' ' | cut -d ' ' -f 14 | grep [0-9] | awk '{total+=$1}END{print total}'
- Publié le 15 Octobre 2008 à 22:02
L'optimisation des images est une manière simple et peu coûteuse d'améliorer les performances d'affichage d'un site au premier chargement (avec le cache navigateur vide) sans trop de problèmes. Smush it! a remis ce sujet à la mode et permet de voir facilement les images à optimiser pour une page donnée. Le problème est qu'avec ce service, on peut récupérer une archive zip avec les images optimisées mais en perdant l'arborescence des images ce qui peut être un peu fastidieux, il est aussi fastidieux d'utiliser l'extension Firefox sur toutes les pages d'une application web pour passer en revue toutes les images et si en plus les images ne sont pas publiquement accessibles son utilisation ne sera tout simplement pas possible.
Pour pallier à cela, j'ai écrit le script shell suivant pour l'optimisation des fichiers GIF et PNG qui :
- optimise tous les fichiers PNG avec pngcrush
- identifie les PNG 24 bits avec identify (qu'il est peut être possible de transformer en PNG 8 bits mais cela nécessite une vérification visuelle)
- convertit les fichiers GIF en PNG 8 bits avec convert si le fichier résultant est plus petit.
Il s'agit juste d'automatiser ces opérations. Selon les applications, le gain peut être sensible. La semaine dernière quand j'étais en déplacement avec une connectivité aléatoire j'aurai bien aimé que tous les sites aient fait cette opération et je ne suis pas le seul... Je l'ai d'ailleurs lancé sur le nouvel Online Editor de eZ Publish pour optimiser au maximum le futur éditeur WYSIWYG de ce CMS ce qui donne le bug #13751.
#! /bin/bash
# Give hints and optimize images
#
# Try to convert GIF in PNG if the resulted PNG is smaller
# Optimize PNG with pngcrush
# Display PNG24
#
# Need imagemagick and pngcrush
print_usage()
{
echo "$1 [-w] [-d] -f dossier"
echo "-w : optimise et modifie les fichiers"
echo "-d : supprime les fichiers GIF transformés en PNG"
echo "-f dossier : dossier où chercher des images"
}
# Display size in bytes
size()
{
du -sb "$1" | sed "s/\t.*//g"
}
TMP=/tmp/optimize_img
DEBUG=1
DELETE_GIF=0
DIRECTORY=""
while getopts "dwf:" opt ; do
case $opt in
w ) DEBUG=0 ;;
d ) DELETE_GIF=1 ;;
f ) DIRECTORY=$OPTARG ;;
h ) print_usage "$0"
exit 0 ;;
* ) print_usage "$0"
exit 1 ;;
esac
done
[ -z "$DIRECTORY" ] && print_usage "$0" && exit 1
[ ! -d "$DIRECTORY" ] && echo "$DIRECTORY n'existe pas" && exit 2
IMAGES_COUNT=`find "$DIRECTORY" -name \*.gif -o -name \*.png | wc -l`
[ $IMAGES_COUNT -eq 0 ] && echo "Aucune image à traiter" && exit 0
[ ! -d $TMP ] && mkdir $TMP
IFS=$'\n'
echo "### Optimisation des PNG :"
PNG_LIST=`find "$DIRECTORY" -iname \*.png`
for p in $PNG_LIST ; do
PNG=`basename $p`
pngcrush -rem alla -reduce -brute "$p" "$TMP/$PNG" > /dev/null
ORI_SIZE=`size "$p"`
OPT_SIZE=`size "$TMP/$PNG"`
if [ $OPT_SIZE -lt $ORI_SIZE ] ; then
echo ">> $p pngcrush optimise ce fichier (${OPT_SIZE}o < ${ORI_SIZE}o)"
[ $DEBUG -eq 0 ] && cp "$TMP/$PNG" "$p"
fi
rm -f "$TMP/$PNG"
done
echo ""
echo "### PNG24 :"
for p in $PNG_LIST ; do
TYPE=`identify -verbose "$p" | grep 'Type: TrueColor'`
[ ! -z "$TYPE" ] && echo "$p"
done
echo ""
echo "### Optimisation des GIF en PNG :"
GIF_LIST=`find "$DIRECTORY" -iname \*.gif`
for g in $GIF_LIST ; do
GIF=`basename $g`
PNG=`echo $GIF | sed 's/.gif$/_not_opt.png/'`
PNG_OPT=`echo $GIF | sed 's/.gif$/.png/'`
convert "$g" "$TMP/$PNG"
pngcrush -rem alla -reduce -brute "$TMP/$PNG" "$TMP/$PNG_OPT" > /dev/null
if [ ! -f "$TMP/$PNG_OPT" ] ; then
rm -f $TMP/*
continue
fi
GIF_SIZE=`size "$g"`
PNG_SIZE=`size "$TMP/$PNG_OPT"`
if [ $PNG_SIZE -lt $GIF_SIZE ] ; then
echo ">> $g : PNG plus petit (${PNG_SIZE}o < ${GIF_SIZE}o)"
FINAL_PNG=`echo $g | sed 's/.gif$/.png/'`
[ $DEBUG -eq 0 ] && cp "$TMP/$PNG_OPT" "$FINAL_PNG"
[ $DELETE_GIF -eq 1 ] && rm "$g"
fi
rm -f "$TMP/$PNG" "$TMP/$PNG_OPT"
done
rm -rf "$TMP"
- Publié le 12 Septembre 2008 à 12:10
Le choix d'un gestionnaire de source est souvent l'occasion de grandes réflexions ou de grands débats entre partisans des nombreuses solutions disponibles. Personnellement, je connais et j'apprécie Subversion surtout grâce au client svn ligne de commande que je trouve plutôt bien fait et très pratique pour mon usage quotidien professionnel (de la maintenance habituellement). En revanche, avec le client CVS l'impossibilité d'obtenir la liste des derniers commit avec le message et la liste des fichiers modifiés est un vrai problème (qui est plutôt d'ordre conceptuel qu'autre chose d'ailleurs). J'ai découvert récemment cvs2cl qui permet de générer plus ou moins ça avec bon nombre d'options et en passant des options au client cvs avec une syntaxe assez pénible. J'ai donc écrit le petit script suivant pour simplifier les options pour pouvoir spécifier une date de début et/ou de fin :
#! /bin/bash
# Génère une log des commit sur le modèle de "svn log"
# Nécessite cvs2cl, package du même nom sous Debian/Ubuntu
START=""
END=""
OPT='-g -Q --stdout -S --no-wrap --no-common-dir'
CMD=/usr/bin/cvs2cl
LOGARGS=""
print_usage()
{
echo "$1 [-h] [-s YYYY-MM-DD] [-e YYYY-MM-DD]"
}
while getopts "hs:e:" opt ; do
case $opt in
s ) START=$OPTARG ;;
e ) END=$OPTARG ;;
h ) print_usage "$0"
exit 0 ;;
* ) print_usage "$0"
exit 1 ;;
esac
done
[ ! -z "$START" ] && [ ! -z "$END" ] && LOGARGS="${LOGARGS}-d$START<$END"
[ ! -z "$START" ] && [ -z "$END" ] && LOGARGS="${LOGARGS}-d>$START"
[ -z "$START" ] && [ ! -z "$END" ] && LOGARGS="${LOGARGS}-d<$END"
[ ! -z "$LOGARGS" ] && OPT="${OPT} -l $LOGARGS"
$CMD $OPTRien de bien méchant (juste une bête utilisation de getopts), mais le script me réconcilie presque avec CVS :-) Dans la log générée, il manque juste l'opération qui a été effectuée sur le fichier et c'est un peu lent mais c'est toujours mieux que rien.