<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GNU Squad &#187; Développement</title>
	<atom:link href="http://blog.gnusquad.org/category/developpement/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.gnusquad.org</link>
	<description>Freedom computers</description>
	<lastBuildDate>Tue, 15 Jun 2010 06:04:14 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Créer une image ISO Debian avec les firmwares non libres</title>
		<link>http://blog.gnusquad.org/2009/11/06/creer-une-image-iso-debian-avec-les-firmwares-non-libres/</link>
		<comments>http://blog.gnusquad.org/2009/11/06/creer-une-image-iso-debian-avec-les-firmwares-non-libres/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 19:53:01 +0000</pubDate>
		<dc:creator>Sylvain</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Debian GNU/Linux]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Langages]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[Planet Libre]]></category>

		<guid isPermaLink="false">http://blog.gnusquad.org/?p=331</guid>
		<description><![CDATA[Les images ISO officielles de Debian, conformément aux DFSG, ne contiennent pas de firmwares non libres ce qui peut poser problème lorsque l&#8217;on a, par exemple, des serveurs équipés de carte réseaux Broadcom NetXtreme II utilisant le module « bnx2 » qui nécessite un firmware évidemment non libre. Dans ce genre de cas, l&#8217;installateur Debian [...]]]></description>
			<content:encoded><![CDATA[<p>Les images ISO officielles de Debian, conformément aux <abbr title="Debian Free Software Guidelines">DFSG</abbr>, ne contiennent pas de firmwares non libres ce qui peut poser problème lorsque l&#8217;on a, par exemple, des serveurs équipés de carte réseaux <em>Broadcom NetXtreme II</em> utilisant le module « <em>bnx2</em> » qui nécessite un firmware évidemment non libre. Dans ce genre de cas, l&#8217;installateur Debian demande de fournir ce dernier via une clé USB, c&#8217;est bien mais je souhaitais sauter cette étape, c&#8217;est pourquoi j&#8217;ai développé un petit script s&#8217;occupant d&#8217;intégrer directement dans l&#8217;image ISO les firmwares non libres disponibles dans la section « <em>non-free</em> ». Voici le script pour les intéressés :</p>
<pre>#!/bin/bash

#//////////////////////////////////////#
# Affiche l'aide du script             #
#                                      #
# @stdout Aide d'utilisation du script #
#//////////////////////////////////////#
usage(){
 echo "Usage : $0 &lt;architecture&gt; (i386, amd64)"
}

#/////////////////////////////////////////////////////////////#
# Teste si l'utilisateur est loggué en root ou non            #
#                                                             #
# @return Renvoie 0 si l'utilisateur est root sinon renvoie 1 #
#/////////////////////////////////////////////////////////////#
is_root(){
 if [[ $(id -u) -eq 0 ]]; then
 return 0 ;
 else
 return 1 ;
 fi
}

#///////////////////////////////////////////////////////////#
# Vérifie la présence des programmes utilisés par le script #
#                                                           #
# @return Renvoie 0 si tous les programmes sont présents    #
#///////////////////////////////////////////////////////////#
check_installed_software(){
    if [[ -z $(which ar) || -z $(which genisoimage) || -z $(which wget) || -z $(which tar) || -z $(which zcat) || -z $(which cpio) ]]; then
        return 1 ;
    else
        return 0 ;
    fi
}

#////////////////////////////////////////////////////////////////////////#
# Télécharge l'image ISO en version netinstall de l'architecture désirée #
#                                                                        #
# @param in $1 Architecture de l'ISO à télécharger                       #
# @stdout Nom du fichier de l'image ISO téléchargée                      #
#////////////////////////////////////////////////////////////////////////#
download_iso_netinstall(){
 local ISO=$(wget -q -O- http://cdimage.debian.org/debian-cd/current/$1/iso-cd/|sed -nr 's/.*(debian.+?netinst.iso).*/\1/p')
 [[ -z $ISO ]] &amp;&amp; {
 exit 1
 }
 wget "http://cdimage.debian.org/debian-cd/current/$1/iso-cd/$ISO" -O $ISO
 echo $ISO
}

#////////////////////////////////////////////////////////////////////#
# Extrait les fichiers d'une image ISO dans un répertoire temporaire #
#                                                                    #
# @param in $1 chemin de l'image ISO                                 #
# @stdout Chemin où se trouvent les fichiers extraits                #
#////////////////////////////////////////////////////////////////////#
function extract_files_from_iso(){
 local MOUNT_DIR=$(mktemp -d)
 local ISO_DIR=$(mktemp -du)
 mount -o loop $1 $MOUNT_DIR
 cp -a $MOUNT_DIR $ISO_DIR
 umount $MOUNT_DIR
 rmdir $MOUNT_DIR
 echo $ISO_DIR
}

#/////////////////////////////////////////////////////////////////////////////////////////////#
# Affiche le nom des paquets contenant les derniers firmwares non libres présents dans Debian #
#                                                                                             #
# @stdout Liste des paquets contenant les derniers firmwares non libres                       #
#/////////////////////////////////////////////////////////////////////////////////////////////#
list_firmware(){
 local FIRMWARE_DEB=$(wget -q -O- 'http://ftp.debian.org/debian/pool/non-free/f/firmware-nonfree/?C=N;O=D;V=1;F=0' | sed -nr "s/^&lt;li&gt;&lt;a href=\"(.+?\.deb)\".*/\1/p")
 local FIRMWARE_NAME=$(echo "$FIRMWARE_DEB" | cut -f1 -d_ | uniq)
 local NAME
 for NAME in ${FIRMWARE_NAME[@]}; do
 echo "$FIRMWARE_DEB" | grep -m1 "$NAME"_
 done
}

#///////////////////////////////////////////////////////#
# Télécharge et extrait les paquets passés en paramètre #
#                                                       #
# @stdout Répertoire contenant les fichiers extraits    #
#///////////////////////////////////////////////////////#
download_and_extract_firmware(){
 local FIRMWARE_DIR=$(mktemp -d)
 cd $FIRMWARE_DIR

 while [[ $# -gt 0 ]]; do
 wget -q -O $1 "http://ftp.debian.org/debian/pool/non-free/f/firmware-nonfree/$1"
 ar x $1 data.tar.gz
 tar xvf data.tar.gz './lib/firmware' &amp;&gt; /dev/null
 rm $1 data.tar.gz
 shift
 done

 cd $OLDPWD
 echo $FIRMWARE_DIR
}

#///////////////////////////////////////////////////#
# Intègre les firmwares dans les initrd trouvés     #
#                                                   #
# @param $1 Répertoire où se trouvent le(s) initrd  #
# @param $2 Répertoire où se trouvent les firmwares #
#///////////////////////////////////////////////////#
merge_firmware_initrd(){
 local INITRD
 for INITRD in $(find $1 -name initrd.gz); do
 local TMP_DIR=$(mktemp -d)
 cd $TMP_DIR
 zcat $INITRD | cpio -i &amp;&gt; /dev/null
 cp -a $2/lib/firmware .
 find . -print0 | cpio -0 -H newc -o 2&gt; /dev/null | gzip -c &gt; $INITRD
 cd $OLDPWD
 rm -rf $TMP_DIR
 done
}

#////////////////////////////////////////////////////////////////////////////#
# Mise à jour des sommes MD5                                                 #
#                                                                            #
# @param $1 Répertoire où se trouve le fichier de sommes MD5 à mettre à jour #
#////////////////////////////////////////////////////////////////////////////#
update_md5sum(){
 cd $1
 find . -type f ! -name md5sum.txt -exec md5sum {} \; &gt; md5sum.txt
 cd $OLDPWD
}

#/////////////////////////////////////////////////////////////////////////#
# Génère une image ISO à partir d'un répertoire                           #
#                                                                         #
# @param $1 Répertoire contenant les fichiers à intégrer dans l'image ISO #
# @param $2 Chemin vers le fichier à générer                              #
#/////////////////////////////////////////////////////////////////////////#
build_iso_image(){
 genisoimage -no-emul-boot -r -J -boot-load-size 4 -boot-info-table -b isolinux/isolinux.bin -c isolinux/boot.cat -o $2 $1 &amp;&gt; /dev/null
}

#///////////////////////#
# Vérifications de base #
#///////////////////////#
check_installed_software
[[ $? -eq 1 ]] &amp;&amp; {
    echo "Certains programmes nécessaires au fonctionnement du script n'ont pas été trouvés." &gt;&amp;2
    exit 1
}

[[ $# &lt; 1 ]] &amp;&amp; usage &amp;&amp; exit 1
ARCH=$1

! is_root &amp;&amp; {
 echo 'Ce script a besoin des droits root !' &gt;&amp;2
 exit 1
}

#///////////////////////////////#
# Téléchargement de l'image ISO #
#///////////////////////////////#
echo "Téléchargement de l'image ISO"
ISO=$(download_iso_netinstall $ARCH)
[[ $? -eq 1 ]] &amp;&amp; {
 echo "Erreur : l'image ISO netinstall de l'architecture « $ARCH » n'a pas été trouvée." &gt;&amp;2
 exit 1
}

#/////////////////////#
# On crée l'image ISO #
#/////////////////////#
echo "Extraction des fichiers de l'image ISO"
ISO_DIR=$(extract_files_from_iso $ISO)
echo "Téléchargement des firmwares"
FIRMWARE_DIR=$(download_and_extract_firmware $(list_firmware))
echo "Intégration des firmwares"
merge_firmware_initrd $ISO_DIR $FIRMWARE_DIR
echo "Création de l'image ISO finale"
update_md5sum $ISO_DIR
NEW_ISO=${ISO/./.homemade.}
build_iso_image $ISO_DIR $NEW_ISO
echo "Image ISO originale : $ISO"
echo " Nouvelle image ISO : $NEW_ISO"

#////////////////////////////////////////#
# On nettoie les répertoires temporaires #
#////////////////////////////////////////#
rm -rf $FIRMWARE_DIR $ISO_DIR</pre>
<p>Liens :</p>
<ul>
<li><a href='http://blog.gnusquad.org/wp-content/uploads/2009/11/debian_firmware.sh'>Script à télécharger</a></li>
<li><a href="http://blog.gnusquad.org/wp-content/uploads/2009/11/debian_firmware.ogv">Vidéo de l&#8217;exécution du script</a></li>
</ul>
<p><span id="more-331"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gnusquad.org/2009/11/06/creer-une-image-iso-debian-avec-les-firmwares-non-libres/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
<enclosure url="http://blog.gnusquad.org/wp-content/uploads/2009/11/debian_firmware.ogv" length="6576519" type="video/ogg" />
		</item>
		<item>
		<title>Variables variables en Bash</title>
		<link>http://blog.gnusquad.org/2009/10/21/variables-variables-en-bash/</link>
		<comments>http://blog.gnusquad.org/2009/10/21/variables-variables-en-bash/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 19:29:00 +0000</pubDate>
		<dc:creator>Sylvain</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Debian GNU/Linux]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Langages]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[Planet Libre]]></category>

		<guid isPermaLink="false">http://blog.gnusquad.org/?p=308</guid>
		<description><![CDATA[Il peut parfois être pratique d&#8217;avoir des noms de variables qui soient variables. C&#8217;est-à-dire un nom de variable qui est affecté et utilisé dynamiquement. En bash, il suffit de d&#8217;utiliser la construction « ${!variable} » pour déréférencer la variable ayant son nom contenu dans $variable. Voici un exemple d&#8217;utilisation concret :

#!/bin/bash

BACKUP_DAY=10
BACKUP_WEEK=4

LIST=( DAY WEEK )
for i [...]]]></description>
			<content:encoded><![CDATA[<p>Il peut parfois être pratique d&#8217;avoir des noms de variables qui soient variables. C&#8217;est-à-dire un nom de variable qui est affecté et utilisé dynamiquement. En <em>bash</em>, il suffit de d&#8217;utiliser la construction « <em>${!variable}</em> » pour déréférencer la variable ayant son nom contenu dans <em>$variable</em>. Voici un exemple d&#8217;utilisation concret :</p>
<pre>
#!/bin/bash

BACKUP_DAY=10
BACKUP_WEEK=4

LIST=( DAY WEEK )
for i in ${LIST[@]}; do
    i="BACKUP_$i"
    echo "$i : ${!i}"
done
</pre>
<p>Affichera :</p>
<pre>
BACKUP_DAY : 10
BACKUP_WEEK : 4
</pre>
<p>À lire :</p>
<ul>
<li><a href="http://man.gnusquad.org/bash/section-1/fr/">Man bash</a></li>
</ul>
<p><span id="more-308"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gnusquad.org/2009/10/21/variables-variables-en-bash/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Équivalents de dirname &amp; basename en Bash</title>
		<link>http://blog.gnusquad.org/2009/10/21/equivalents-de-dirname-basename-en-bash/</link>
		<comments>http://blog.gnusquad.org/2009/10/21/equivalents-de-dirname-basename-en-bash/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 16:16:28 +0000</pubDate>
		<dc:creator>Sylvain</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Debian GNU/Linux]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Langages]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[Planet Libre]]></category>

		<guid isPermaLink="false">http://blog.gnusquad.org/?p=293</guid>
		<description><![CDATA[Les programmes dirname et basename sont très pratiques lors de l&#8217;écriture de scripts bash mais impliquent une exécution externe ce que les puristes aiment bien éviter. Voici, pour les intéressés, leurs équivalents en bash accompagnés d&#8217;une batterie de tests pour valider leur fonctionnement par rapport aux programmes de base :

#!/bin/bash

function basename(){
    echo [...]]]></description>
			<content:encoded><![CDATA[<p>Les programmes <em>dirname</em> et <em>basename</em> sont très pratiques lors de l&#8217;écriture de scripts <em>bash</em> mais impliquent une exécution externe ce que les puristes aiment bien éviter. Voici, pour les intéressés, leurs équivalents en <em>bash</em> accompagnés d&#8217;une batterie de tests pour valider leur fonctionnement par rapport aux programmes de base :</p>
<pre>
#!/bin/bash

function basename(){
    echo ${1##*/}
}

function dirname(){
    local file=$1
    case $file in
        /*) ;;
        ./*) ;;
        *) file=./$file ;;
    esac
    file=${file%/*}
    echo ${file:-/}
}

PROGS=( dirname basename )
LIST_FILES=( /test.txt /tmp/test.txt /tmp/plop/test.txt ./test.txt ./tmp/test.txt ./tmp/plop/test.txt test.txt )

for prog in ${PROGS[@]}; do
    echo "--&gt; $prog &lt;--"
    for file in ${LIST_FILES[@]}; do
        SYSTEM=$(bash -c "$prog $file")
        MINE=$($prog $file)
        [[ $SYSTEM != $MINE ]] &#038;&#038; echo -e "$file\nSystème : $SYSTEM\nLe mien : $MINE"
    done
done
</pre>
<p>Une petite comparaison rapide entre les deux solutions montre des performances supérieures de 75% en faveur de la solution <em>bash</em>. En pratique, la différence sera bien évidemment insignifiante sauf si vous vous amusez à itérer un grand nombre de fois sur ces fonctions. <img src='http://blog.gnusquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Note : les options <em>&#8211;help</em>, <em>&#8211;version</em> ainsi que le paramètre permettant d&#8217;indiquer un suffixe pour <em>basename</em> ne sont pas pris en compte.</p>
<p>À lire :</p>
<ul>
<li><a href="http://man.gnusquad.org/dirname/section-1/fr/">Man dirname</a></li>
<li><a href="http://man.gnusquad.org/basename/section-1/fr/">Man basename</a></li>
<li><a href="http://man.gnusquad.org/bash/section-1/fr/">Man bash</a></li>
</ul>
<p><span id="more-293"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gnusquad.org/2009/10/21/equivalents-de-dirname-basename-en-bash/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Visualisez la hiérarchie de vos inclusions PHP avec « Inclued »</title>
		<link>http://blog.gnusquad.org/2009/03/06/visualisez-la-hierarchie-de-vos-inclusions-php-avec-inclued/</link>
		<comments>http://blog.gnusquad.org/2009/03/06/visualisez-la-hierarchie-de-vos-inclusions-php-avec-inclued/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 19:58:14 +0000</pubDate>
		<dc:creator>Sylvain</dc:creator>
				<category><![CDATA[Debian GNU/Linux]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Langages]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[Planet Libre]]></category>

		<guid isPermaLink="false">http://blog.gnusquad.org/?p=152</guid>
		<description><![CDATA[L&#8217;extension PECL « Inclued » permet de tracer et d&#8217;enregistrer sous forme hiérarchique, l&#8217;ensemble des inclusions de fichiers durant l&#8217;exécution d&#8217;un script PHP.
Prenons pour exemple le monstrueux WordPress, voici ce que l&#8217;on peut obtenir :

Mis à part le fait que ce genre de graphe est toujours sympa à voir, il permet de se faire une [...]]]></description>
			<content:encoded><![CDATA[<p>L&#8217;extension <abbr title="PHP Extension Community Library">PECL</abbr> « <em>Inclued</em> » permet de tracer et d&#8217;enregistrer sous forme hiérarchique, l&#8217;ensemble des inclusions de fichiers durant l&#8217;exécution d&#8217;un script PHP.</p>
<p>Prenons pour exemple le monstrueux WordPress, voici ce que l&#8217;on peut obtenir :</p>
<p><a href="http://img527.imageshack.us/img527/4869/inclued185541.png"><img src="http://blog.gnusquad.org/wp-content/uploads/2009/03/wordpress-inclued-tiny1.png" alt="WordPress Inclued" title="WordPress Inclued" width="218" height="160" class="alignnone size-full wp-image-177" /></a></p>
<p>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&#8217;un code :</p>
<ul>
<li>Pourquoi ce fichier est inclut alors qu&#8217;il n&#8217;est pas utilisé ?</li>
<li>Pourquoi ce fichier est inclut ici plutôt que là ?</li>
<li>Pourquoi ce fichier n&#8217;est pas inclus en utilisant les primitives *_once ?</li>
<li>Pourquoi les inclusions proviennent uniquement de ce fichier ?</li>
<li>etc.</li>
</ul>
<p>Passons au vif du sujet ! Pour commencer nous allons installer les paquets nécessaires pour la suite des opérations :</p>
<ul>
<li><em>php5-dev</em> et <em>make</em> pour la compilation de l&#8217;extension</li>
<li><em>php5-cli</em> et <em>graphviz</em> pour la génération des images</li>
</ul>
<pre>
<strong>root@gnusquad</strong>:~# aptitude install php5-dev php5-cli make graphviz
</pre>
<p>Une fois ces paquets installés, téléchargeons l&#8217;extension « <em>Inclued</em> » et décompressons la d&#8217;un trait :</p>
<pre>
<strong>root@gnusquad</strong>:~# wget -q -O - http://pecl.php.net/get/inclued | tar zx
</pre>
<p>Compilons cette dernière :</p>
<pre>
<strong>root@gnusquad</strong>:~# cd inclued-0.1.0
<strong>root@gnusquad</strong>:~/inclued-0.1.0# phpize
<strong>root@gnusquad</strong>:~/inclued-0.1.0# ./configure
<strong>root@gnusquad</strong>:~/inclued-0.1.0# make
</pre>
<p>L&#8217;étape qui suit consiste à indiquer à PHP de charger cette nouvelle extension :</p>
<pre>
<strong>root@gnusquad</strong>:~/inclued-0.1.0# cp modules/inclued.so /usr/lib/php5/20060613+lfs
<strong>root@gnusquad</strong>:~/inclued-0.1.0# vi /etc/php5/conf.d/inclued.ini

extension=inclued.so
inclued.enabled=on
inclued.dumpdir=/tmp
</pre>
<p>On peut dès lors redémarrer le serveur web, <em>Apache</em> en l&#8217;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 <em>/tmp</em> donc méfiance !</p>
<pre>
<strong>root@gnusquad</strong>:~/inclued-0.1.0# /etc/init.d/apache2 restart
</pre>
<p>Sachez qu&#8217;il est également possible d&#8217;activer l&#8217;extension au niveau du serveur web en utilisant les directives <em>php_admin_flag</em> et <em>php_admin_value</em> ce qui permet de limiter l&#8217;extension à un vhost par exemple. Malheureusement, et contrairement à ce qui est indiqué sur le site PHP, il n&#8217;est pas possible d&#8217;utiliser ces directives dans un fichier <em>.htaccess</em>.</p>
<p>Les fichiers générés n&#8217;étant pas directement des images, il faut les convertir à l&#8217;aide d&#8217;un script fourni avec l&#8217;extension que nous enroberons de notre propre script afin de nous faciliter la vie :</p>
<pre>
<strong>root@gnusquad</strong>:~/inclued-0.1.0# cp gengraph.php /usr/local/bin
<strong>root@gnusquad</strong>:~/inclued-0.1.0# cd $_
<strong>root@gnusquad</strong>:/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

<strong>root@gnusquad</strong>:/usr/local/bin# chmod +x $_
</pre>
<p>Voilà, le plus dur est fait, il ne vous reste plus qu&#8217;à aller sur une page web PHP et à générer l&#8217;image :</p>
<pre>
<strong>root@gnusquad</strong>:/usr/local/bin# cd /tmp
<strong>root@gnusquad</strong>:/tmp# ls
inclued.00688.1
<strong>root@gnusquad</strong>:/tmp# gengraph inclued.00688.1
<strong>root@gnusquad</strong>:/tmp# ls
inclued.00688.1.png
</pre>
<p>À lire :</p>
<ul>
<li><a href="http://fr.php.net/manual/en/book.inclued.php">Documentation PHP sur Inclued</a></li>
<li><a href="http://pecl.php.net/package/inclued">Package Inclued sur la PECL</a></li>
</ul>
<p>Mise à jour du 05 mai 2009 : pour effectuer la compilation encore plus simplement, il suffit de taper « <em>pecl install channel://pecl.php.net/inclued-0.1.0</em> » et le tour est joué ! <img src='http://blog.gnusquad.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<span id="more-152"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gnusquad.org/2009/03/06/visualisez-la-hierarchie-de-vos-inclusions-php-avec-inclued/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Limiter le temps d&#8217;exécution d&#8217;une requête MySQL</title>
		<link>http://blog.gnusquad.org/2008/11/27/limiter-le-temps-d-execution-d-une-requete-mysql/</link>
		<comments>http://blog.gnusquad.org/2008/11/27/limiter-le-temps-d-execution-d-une-requete-mysql/#comments</comments>
		<pubDate>Thu, 27 Nov 2008 12:03:54 +0000</pubDate>
		<dc:creator>Sylvain</dc:creator>
				<category><![CDATA[Base de données]]></category>
		<category><![CDATA[Debian GNU/Linux]]></category>
		<category><![CDATA[Gestionnaires de versions]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[Planet Libre]]></category>

		<guid isPermaLink="false">http://blog.gnusquad.org/?p=38</guid>
		<description><![CDATA[Vous est-il déjà arrivé de voir un de vos serveurs de base de données MySQL mis à genoux par la faute de développeurs incompétents qui effectuent des requêtes sur des tables sans index composées de dizaines de millions de tuples ?
Si la réponse est oui, voici ma solution « one line » pour les calmer [...]]]></description>
			<content:encoded><![CDATA[<p>Vous est-il déjà arrivé de voir un de vos serveurs de base de données MySQL mis à genoux par la faute de développeurs incompétents qui effectuent des requêtes sur des tables sans index composées de dizaines de millions de tuples ?<br />
Si la réponse est oui, voici ma solution « <em>one line</em> » pour les calmer un peu ! <img src='http://blog.gnusquad.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Logiciels utilisés :</p>
<ul>
<li>GNU Awk 3.1.5</li>
<li>MySQL Client 5.0.51a</li>
</ul>
<pre>
<strong>root@gnusquad</strong>:~# mysql -e 'SHOW PROCESSLIST' | awk 'BEGIN { MAX_TIME = 60 ; USERS = "boulet1|boulet2" } $6 &gt; MAX_TIME &amp;&amp; $5 == "Query" &amp;&amp; $2 ~ USERS {print "KILL " $1 ";"}' | mysql
</pre>
<p>Petites explications sur le code « awk » :</p>
<ul>
<li>$1 contient l&#8217;ID de la requête SQL</li>
<li>$2 contient le nom de l&#8217;utilisateur</li>
<li>$5 contient le type de commande (Query, Sleep, …)</li>
<li>$6 contient le temps d&#8217;exécution de la requête SQL en secondes</li>
<li>MAX_TIME contient le temps en secondes à partir duquel une requête doit être tuée</li>
<li>USERS contient une expression rationnelle indiquant les utilisateurs concernés par cette sanction</li>
</ul>
<p>Il ne vous reste plus qu&#8217;à mettre ce script dans le « <em>crontab</em> » en pensant à vous connecter avec un utilisateur MySQL ayant le droit « <em>SUPER</em> » pour pouvoir tuer les connexions si besoin est. <img src='http://blog.gnusquad.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>À lire :</p>
<ul>
<li><a href="http://man.gnusquad.org/gawk/section-1/en/">Man page de gawk</a></li>
</ul>
<p><span id="more-38"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gnusquad.org/2008/11/27/limiter-le-temps-d-execution-d-une-requete-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gestion des mime-types dans Subversion</title>
		<link>http://blog.gnusquad.org/2008/06/04/gestion-des-mime-types-dans-subversion/</link>
		<comments>http://blog.gnusquad.org/2008/06/04/gestion-des-mime-types-dans-subversion/#comments</comments>
		<pubDate>Wed, 04 Jun 2008 04:31:21 +0000</pubDate>
		<dc:creator>Sylvain</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Gestionnaires de versions]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[Planet Libre]]></category>

		<guid isPermaLink="false">http://blog.gnusquad.org/?p=19</guid>
		<description><![CDATA[Par défaut sous Subversion, l&#8217;heuristique utilisée pour détecter les mime-types est très basique ce qui est gênant lorsque l&#8217;on veut utiliser des fichiers (ex : des images) du dépôt via mod_dav_svn pour les intégrer dans un site.
Logiciels utilisés :

Subversion 1.4.6 (r28521)
GNU Bash 3.1.17
GNU Find 4.4.0
File 4.24

Voici une petite commande permettant de définir les mime-types des [...]]]></description>
			<content:encoded><![CDATA[<p>Par défaut sous Subversion, l&#8217;heuristique utilisée pour détecter les mime-types est très basique ce qui est gênant lorsque l&#8217;on veut utiliser des fichiers (ex : des images) du dépôt via <em><a href="http://svnbook.red-bean.com/en/1.4/svn.ref.mod_dav_svn.conf.html">mod_dav_svn</a></em> pour les intégrer dans un site.</p>
<p>Logiciels utilisés :</p>
<ul>
<li>Subversion 1.4.6 (r28521)</li>
<li>GNU Bash 3.1.17</li>
<li>GNU Find 4.4.0</li>
<li>File 4.24</li>
</ul>
<p>Voici une petite commande permettant de définir les mime-types des fichiers de l’arborescence dans laquelle nous nous trouvons (vous pouvez retirez la partie « <em>| bash > /dev/null</em> » pour afficher ce qui sera exécuté) :</p>
<pre>
<em>user@gnusquad</em>:~/projet$ find . -type f ! -regex ".*/\.svn/.*" -exec echo svn propset svn:mime-type \"\$\(file -bi '{}'\)\" {} \; | bash &gt; /dev/null
</pre>
<p>Il se peut que des messages d&#8217;erreurs apparaissent dûs à un non conformisme de Subversion vis à vis de la RFC 1521.</p>
<blockquote><p>svn: Le type MIME &#8216;text/x-c++ charset=utf-8&#8242; ne se termine pas par des caractères alphanumériques</p></blockquote>
<p>Ce bug a été corrigé dans la révision 30795 de Subversion (tapez <em>svn &#8211;version | head -1</em> pour voir votre révision).</p>
<p>À lire :</p>
<ul>
<li> <a href="http://svnbook.red-bean.com/en/1.4/svn.advanced.props.html#svn.advanced.props.auto">Subversion : Automatic Property Setting</a></li>
<li><a href="http://www.faqs.org/rfcs/rfc1521.html">RFC 1521</a></li>
</ul>
<p><span id="more-19"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gnusquad.org/2008/06/04/gestion-des-mime-types-dans-subversion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modifier le contenu d&#8217;une révision dans un référentiel Subversion</title>
		<link>http://blog.gnusquad.org/2008/05/01/modifier-contenu-revision-subversion/</link>
		<comments>http://blog.gnusquad.org/2008/05/01/modifier-contenu-revision-subversion/#comments</comments>
		<pubDate>Thu, 01 May 2008 08:37:00 +0000</pubDate>
		<dc:creator>Sylvain</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Gestionnaires de versions]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[Planet Libre]]></category>

		<guid isPermaLink="false">http://blog.gnusquad.org/?p=3</guid>
		<description><![CDATA[Il peut parfois être utile de devoir modifier le contenu d&#8217;une révision dans un référentiel Subversion pour supprimer une information qui n&#8217;aurait jamais dû s&#8217;y trouver comme, par exemple, un mot de passe.
Logiciels utilisés :

Subversion 1.4.2
GNU Bash 3.1.17
GNU Sed 4.1.5

Commençons par créer un référentiel de test nommé « modification_revision » :
root@gnusquad:~# REPOS=/var/local/lib/svn/modification_revision
root@gnusquad:~# svnadmin create $REPOS
Effectuons [...]]]></description>
			<content:encoded><![CDATA[<p>Il peut parfois être utile de devoir modifier le contenu d&#8217;une révision dans un référentiel Subversion pour supprimer une information qui n&#8217;aurait jamais dû s&#8217;y trouver comme, par exemple, un mot de passe.</p>
<p>Logiciels utilisés :</p>
<ul>
<li>Subversion 1.4.2</li>
<li>GNU Bash 3.1.17</li>
<li>GNU Sed 4.1.5</li>
</ul>
<p>Commençons par créer un référentiel de test nommé « <em>modification_revision</em> » :</p>
<pre><strong>root@gnusquad</strong>:~# REPOS=/var/local/lib/svn/modification_revision
<strong>root@gnusquad</strong>:~# svnadmin create $REPOS</pre>
<p>Effectuons une copie locale (<em>checkout</em>) de ce référentiel :</p>
<pre><strong>root@gnusquad</strong>:~# svn co file://$REPOS
Révision 0 extraite.</pre>
<p>Ajoutons-y un fichier « <em>exemple</em> » et commitons le dans le référentiel :</p>
<pre><strong>root@gnusquad</strong>:~# cd modification_revision/
<strong>root@gnusquad</strong>:~/modification_revision# echo mon_password : gruikgruik &gt; exemple
<strong>root@gnusquad</strong>:~/modification_revision# svn add exemple
A         exemple
<strong>root@gnusquad</strong>:~/modification_revision# svn ci -m "ajout d'un fichier"
Ajout          exemple
Transmission des données .
Révision 1 propagée.</pre>
<p>Le but, maintenant, est de faire disparaître le mot de passe « <em>gruikgruik</em> » du référentiel afin que personne ne puisse le récupérer.</p>
<p>Commençons par effectuer un <em>dump</em> du référentiel dans le fichier <em>~/dump_svn</em> :</p>
<pre><strong>root@gnusquad</strong>:~/modification_revision# cd
<strong>root@gnusquad</strong>:~# svnadmin dump $REPOS &gt; dump_svn
* Révision 0 déchargée.
* Révision 1 déchargée.</pre>
<p>Modifions le mot de passe dans le dump avec <em>sed</em> par exemple en veillant à mettre le même nombre de caractères sinon vous obtiendrez l&#8217;erreur suivante par la suite : « <em>svnadmin: Fin prématurée des données dans le flux de sauvegarde</em> » à cause du <em>Content-length</em> de la révision :</p>
<pre><strong>root@gnusquad</strong>:~# sed -i s/gruikgruik/xxxxxxxxxx/g dump_svn</pre>
<p>Supprimons le référentiel et recréons en un vide :</p>
<pre><strong>root@gnusquad</strong>:~# rm -r $REPOS
<strong>root@gnusquad</strong>:~# svnadmin create $REPOS</pre>
<p>Importons le dump :</p>
<pre><strong>root@gnusquad</strong>:~# svnadmin load $REPOS &lt; dump_svn</pre>
<pre>&lt;&lt;&lt; Début d'une nouvelle transaction basée sur la révision 1
     * ajout de : exemple ...
svnadmin: Sommes de contrôle différentes, fichier '/exemple' :
   attendu :  6fe4a181ffeec4b6da1b63d377f14fb4
   obtenu :  def10992a3cb890493d37440f3538fd8</pre>
<p>Subversion nous informe que les sommes de contrôle sont différentes ce qui est tout à fait normal vu que l&#8217;on a modifié le mot de passe, mettons donc à jour celles-ci :</p>
<pre><strong>root@gnusquad</strong>:~# sed -i s/6fe4a181ffeec4b6da1b63d377f14fb4/def10992a3cb890493d37440f3538fd8/ dump_svn</pre>
<p>Puis pour en finir, réimportons proprement le dump :</p>
<pre><strong>root@gnusquad</strong>:~# rm -rf $REPOS
<strong>root@gnusquad</strong>:~# svnadmin create $REPOS
<strong>root@gnusquad</strong>:~# svnadmin load $REPOS &lt; dump_svn
&lt;&lt;&lt; Début d'une nouvelle transaction basée sur la révision 1
     * ajout de : exemple ... fait.

------- Révision 1 propagée (commit) &gt;&gt;&gt;</pre>
<p>Et voilà, notre référentiel ne contient plus de traces du mot de passe « <em>gruikgruik</em> ».<br />
<span id="more-3"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gnusquad.org/2008/05/01/modifier-contenu-revision-subversion/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
