<?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>Christophe Nowicki &#187; Apache</title>
	<atom:link href="http://www.csquad.org/tag/apache/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.csquad.org</link>
	<description>Just for fun</description>
	<lastBuildDate>Fri, 14 Jan 2011 08:32:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Faire son propre moteur de recherche avec Nutch</title>
		<link>http://www.csquad.org/2010/01/11/nutch/</link>
		<comments>http://www.csquad.org/2010/01/11/nutch/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 22:22:26 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Nutch]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=973</guid>
		<description><![CDATA[Allez aujourd&#8217;hui, je lâche mon troll, qui n&#8217;a pas manger depuis plusieurs semaines :
S&#8217;il y a quelque chose que vous faites et que personne ne doit savoir, peut-être qu&#8217;il faudrait commencer par ne pas le faire
Source : Google CEO Eric Schmidt Dismisses the Importance of Privacy
Il a raison le bon docteur Schmidt, il aurait du [...]]]></description>
			<content:encoded><![CDATA[<p>Allez aujourd&#8217;hui, je lâche mon troll, qui n&#8217;a pas manger depuis plusieurs semaines :</p>
<blockquote><p>S&#8217;il y a quelque chose que vous faites et que personne ne doit savoir, peut-être qu&#8217;il faudrait commencer par ne pas le faire</p></blockquote>
<p>Source : <a href="http://www.eff.org/deeplinks/2009/12/google-ceo-eric-schmidt-dismisses-privacy">Google CEO Eric Schmidt Dismisses the Importance of Privacy</a></p>
<p>Il a raison le bon docteur Schmidt, il aurait du faire plus attention <a href="http://en.wikipedia.org/wiki/Liu_Xiaobo">Liu Xiaobo</a> avant de chercher <em>droits de l’homme</em> sur un <a href="http://news.google.cn/news?q=Liu%20Xiaobo&#038;hl=zh-CN&#038;ie=UTF-8&#038;ned=ccn&#038;tab=Hn">moteur de recherche censuré</a>&#8230;</p>
<p>Bref vous m&#8217;avez compris ce genre de parole dans la bouche de l&#8217;homme le plus puissant de la plante ne m&#8217;inspire pas confiance  et je continue à penser que le slogan de Google <a href="http://en.wikipedia.org/wiki/Don%27t_be_evil">Don&#8217;t be evil</a> est une véritable plaisanterie.</p>
<p>Alors au lieu de vous conseiller de passer à Bling, je vais vous expliquer comment faire votre propre moteur de recherche.</p>
<p>Ce billet décrit la mise en place d&#8217;un moteur de recherche sous Debian GNU/Linux basé sur <a href="http://lucene.apache.org/nutch/">Nutch</a>.</p>
<h3>Pré-requis</h3>
<table>
<tr>
<td valign="top">
<a href="http://www.csquad.org/wp-content/uploads/2010/01/140px-Google’s_First_Production_Server.jpg"><img src="http://www.csquad.org/wp-content/uploads/2010/01/140px-Google’s_First_Production_Server.jpg" alt="140px-Google’s_First_Production_Server" title="140px-Google’s_First_Production_Server" width="140" height="232" class="alignleft size-full wp-image-1005" /></a>
</td>
<td>
<p>
Pour faire votre propre moteur de recherche vous avez besoin de :</p>
<ul>
<li>450 000 serveurs répartis sur toute la planète ;</li>
<li>80Go d&#8217;espace disque par machine ;</li>
<li>4Go de mémoire par machine ;</li>
<li>Une connexion fibre optique entre vos <em>&#8220;data centers&#8221;</em> ; </li>
</ul>
</td>
</tr>
</table>
<p>
Bref, si vous n&#8217;avez pas cette infrastructure à votre disposition ce n&#8217;est pas la peine d&#8217;aller plus loin <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Bon d&#8217;accord, vous voulez simplement un moteur de recherche personnel?
</p>
<p>Un seul serveur avec les caractéristiques suivantes :</p>
<ul>
<li>Un bon processeur ;</li>
<li>Beaucoup de mémoire (4Go, ba oui, c&#8217;est du Java ma petite dame <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ) ;</li>
<li>Un gros disque dur très rapide de plus de 500Go (des <a href="http://en.wikipedia.org/wiki/Western_Digital_Raptor"> Raptor</a> par exemple ) ;</li>
<li>Une bonne bande passante, avec plus de 2Mb en <em>download</em>;</li>
<li>Une distribution Debian GNU/Linux ;</li>
<li>Des compétences en administration d&#8217;Apache, Tomcat et ligne de commande ;</li>
<li>Un peu de temps pour configurer le système et le paramétrer aux petits oignons.</li>
</ul>
<p>C&#8217;est bien plus abordable ? <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3>Fonctionnalités</h3>
<p>En mettant en place mon propre moteur de recherche, je voulais obtenir les fonctionnalités suivantes :</p>
<ul>
<li>Indexation des documents locaux (ex: un Intranet) ;</li>
<li>Indexation plus poussé de mes centres d&#8217;intérêts ;</li>
<li>Indépendance par rapport à un moteur de recherche ;</li>
</ul>
<p>Néanmoins, je dois faire une croix sur : </p>
<ul>
<li>la publicité ciblée ;</li>
<li>la recherche d&#8217;images, de vidéos et temps réel ;</li>
<li>la correction orthographique.</li>
</ul>
<h3>Les limitations</h3>
<p>On pourrait dire que Nutch est un moteur de recherche de l&#8217;époque <em>&#8220;web 1.0&#8243;</em>. En effet, il ne contient pas d&#8217;algorithme d&#8217;<a href="http://fr.wikipedia.org/wiki/Intelligence_collective">Intelligence Bolchevique^Wcollective</a> comme la plupart des moteurs de recherche. Cela signifie que seul le <a href="http://fr.wikipedia.org/wiki/PageRank">Page rank</a> est utilisé et que les votes des utilisateurs ne sont pas pris en compte. Il est aussi plus sensible au <a href="http://fr.wikipedia.org/wiki/Spamdexing">Spamdexing</a>. </p>
<h3>Présentation des composants</h3>
<table>
<tr>
<td valign="top"><img src="http://www.csquad.org/wp-content/uploads/2010/01/ubuntu_nutch_small.png" alt="" title="ubuntu_nutch_small" width="128" height="187" class="alignleft size-full wp-image-1034" /></td>
<td>
<p>
L&#8217;architecture d&#8217;un moteur de recherche est assez simple, vous avez besoin :</p>
<ul>
<li>d&#8217;un <a href="http://en.wikipedia.org/wiki/Web_crawler">Web crawler</a>, un logiciel qui explore automatiquement le Web à la recherche de ressources.</li>
<li>un système d&#8217;indexation, dans le cas de Nutch c&#8217;est <a href="http://lucene.apache.org/">Apache Lucene</a> ; </li>
<li>des interfaces de recherche ;</li>
</ul>
</td>
</tr>
</table>
<h3>Installation</h3>
<p>Voici les étapes nécessaires pour faire fonctionner la version 1.0 Nuch sur une machine <a href="http://www.debian.org/">Debian GNU/Linux</a> version &#8220;lenny&#8221;.</p>
<h4>Dépendances</h4>
<p>Vous avez besoin des composants suivants :<br />
<code># apt-get install tomcat5.5 tomcat5.5-admin tomcat5.5-webapps sun-java6-jre<br />
</code><br />
Configurer le JRE par default :<br />
<code># update-alternatives  --set java /usr/lib/jvm/java-6-sun/jre/bin/java</code></p>
<h4>Nutch</h4>
<p>C&#8217;est une application en Java, que je place dans le repertoire <em>opt</em> :<br />
<code><br />
# cd /opt<br />
# wget http://mirror.mkhelif.fr/apache/lucene/nutch/nutch-1.0.tar.gz<br />
# tar xzf nutch-1.0.tar.gz<br />
# ln -s nutch-1.0 nutch<br />
# mkdir nutch/urls<br />
# mkdir nutch/crawl<br />
# chown tomcat55: nutch-1.0<br />
</code></p>
<h4>Configuration</h4>
<p>La configuration du moteur de recherche se trouve dans le fichier <em>conf/nutch-default.xml</em>, vous disposez de votre fichier <em>conf/nutch-site.xml</em>, spécifique à votre instance. Les variables intéressantes sont :</p>
<ul>
<li>http.agent.* : la politesse, pour décrire votre robot ou bien prendre l&#8217;identité d&#8217;un autre ; </li>
<li>db.fetch.interval.(default|max) : ces variables définissent le nombre de jours entre chaque passage du robot, comme vous ne pourrez pas faire le tour du web en moins de 30 jours <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> , une bonne idée est d&#8217;augmenter ces valeurs ;</li>
<li>plugin.includes : la définition des plugins pris en charge, ici vous pouvez ajouter la gestion des documents pdf, microsoft word et du protocole https.</li>
</ul>
<h3>Bootstrapping du moteur de recherche</h3>
<p>Votre moteur de recherche doit avaler une quantité de donnée importante avant de pouvoir faire une recherche pertinente.<br />
Voici quelques sources pour l&#8217;initialiser.</p>
<h4>A l&#8217;aide d&#8217;un annuaire</h4>
<p>Il  existe de très bons annuaires complets comme le projet <a href="http://www.dmoz.org/">Open Directory Project</a>.<br />
Dont l&#8217;ensemble des données sont disponibles au format RDF et téléchargeables librement : <a href="http://rdf.dmoz.org/rdf/">http://rdf.dmoz.org/rdf/</a>.<br />
Par contre, attention ce fichier référence 4 446 480 sites web et vous allez avoir besoin de beaucoup de place pour les référencer tout ce contenu.</p>
<p>Voici la procédure pour utiliser l&#8217;annuaire DMOZ avec Nutch :<br />
<code><br />
$ cd /opt/nutch<br />
$ mkdir urls<br />
$ wget http://rdf.dmoz.org/rdf/content.rdf.u8.gz -O urls/content.rdf.u8.gz<br />
$ gunzip urls/content.rdf.u8.gz<br />
$ bin/nutch org.apache.nutch.tools.DmozParser urls/content.rdf.u8 > urls/dmoz<br />
$ bin/nutch inject crawl/crawldb urls/dmoz<br />
Injector: starting<br />
Injector: crawlDb: crawl/crawldb<br />
Injector: urlDir: urls/dmoz<br />
Injector: Converting injected urls to crawl db entries.<br />
Injector: Merging injected urls into crawl db.<br />
Injector: done<br />
</code></p>
<h4>A l&#8217;aide d&#8217;un Marque-page</h4>
<p>Une autre source pour initialiser le moteur de recherche est d&#8217;utiliser les adresses contenues dans votre marque-page. Le principal avantage de cette technique est la faible quantité de données  à analyser et une pertinence de recherche accrue.<br />
Pour ce faire, vous devez exporter votre marque-page au format HTML (pour Mozilla Firefox) et en extraire les adresses de la manière suivante :</p>
<p><code><br />
$ cd /opt/nutch<br />
$ grep "A HREF=\"http"  bookmarks.html | cut -d '"' -f 2  > urls/bookmarks<br />
$ bin/nutch inject crawl/crawldb urls/bookmarks<br />
Injector: starting<br />
Injector: crawlDb: crawl/crawldb<br />
Injector: urlDir: urls/bookmarks<br />
Injector: Converting injected urls to crawl db entries.<br />
Injector: Merging injected urls into crawl db.<br />
Injector: done<br />
</code></p>
<h4>A l&#8217;aide de Wikipedia</h4>
<p><a href="http://fr.wikipedia.org">Wikipedia</a> fourni des <em>dumps</em> de sa <a href="http://en.wikipedia.org/wiki/Wikipedia_database">base de données</a> au format XML. Il est donc possible d&#8217;utiliser les URLs des articles de wikipedia comme source.<br />
Voici la procédure pour la version française de Wikipedia, celle-ci contient 897 974 urls.<br />
<code><br />
$ cd /opt/nutch/<br />
$ mkdir urls<br />
$ wget http://download.wikimedia.org/frwiki/latest/frwiki-latest-abstract.xml -O urls/frwiki-latest-abstract.xml<br />
$ grep "&lt;url&gt;" urls/frwiki-latest-abstract.xml | cut -d '>' -f 2 | cut -d '< ' -f 1 > urls/wikipedia-fr<br />
$ bin/nutch inject crawl/crawldb urls/wikipedia-fr<br />
Injector: starting<br />
Injector: crawlDb: crawl/crawldb<br />
Injector: urlDir: urls/wikipedia-fr<br />
Injector: Converting injected urls to crawl db entries.<br />
Injector: Merging injected urls into crawl db.<br />
Injector: done<br />
</code></p>
<h3>What you&#8217;re waitin&#8217; for ? Christmas ?</h3>
<h4>Come get some!</h4>
<p>Une fois que vous avez chargé la base de données avec vos urls, il faut les parcourir afin de les indexer. Cela se fait à l&#8217;aide de plusieurs commandes :</p>
<ul>
<li><strong>generate</strong> : sélections des adresses à parcourir ;</li>
<li><strong>fetch</strong> : parcourt des urls ;</li>
<li><strong>updatedb</strong> : mise à jours de la base des adresses ;</li>
<li><strong>invertlinks</strong> : mise à jours de l&#8217;index des adresses inversées  ;</li>
<li><strong>index</strong> : indexation des données  ;</li>
</ul>
<p>Une séquence classique ressemble donc à cela :<br />
<code><br />
bin/nutch generate crawl/crawldb crawl/segments -topN 1000<br />
s1=`ls -d crawl/segments/2* | tail -1`<br />
bin/nutch fetch $s1<br />
bin/nutch updatedb crawl/crawldb $s1<br />
bin/nutch invertlinks crawl/linkdb $s1<br />
bin/nutch index crawl/indexes crawl/crawldb crawl/linkdb $s1<br />
</code><br />
Cette suite de commandes vous permet de parcourir et d´indexer 1000 adresses issues de votre base.<br />
C&#8217;est un très bon 1er test pour voir si cela fonctionne. </p>
<h4>Shake it, baby!</h4>
<p>Une autre commande intéressante est <em>readdb</em> avec l&#8217;option <em>stats</em>, qui permet d&#8217;obtenir des informations sur le contenu de votre base  :<br />
<code><br />
$ bin/nutch readdb crawl/crawldb/ -stats<br />
CrawlDb statistics start: crawl/crawldb/<br />
Statistics for CrawlDb: crawl/crawldb/<br />
TOTAL urls:     3377315<br />
...<br />
min score:      0.0<br />
avg score:      0.13178158<br />
max score:      401.402<br />
status 1 (db_unfetched):        2966337<br />
status 2 (db_fetched):  300008<br />
status 3 (db_gone):     46659<br />
status 4 (db_redir_temp):       27857<br />
status 5 (db_redir_perm):       36454<br />
</code><br />
Une bonne idées serait de mettre en place un système de monitoring sur ces informations pour suivre le déroulement. Par contre, il faut faire attention car la commande prend plusieurs minutes à s&#8217;exécuter.  (donc hors de question de la placer dans un plugin munin, un mail tous les soirs serait une meilleur méthode). </p>
<h4>Damn&#8230; I&#8217;m looking good!</h4>
<p>Vous pouvez tester en ligne de commande  le fonctionnement du moteur de recherche :<br />
<code>$ bin/nutch org.apache.nutch.searcher.NutchBean apache<br />
Total hits: 6413<br />
 0 20100104001440/http://xmlgraphics.apache.org/fop/<br />
 ... be part of Apache's XML Graphics project . Demonstration ... goals of the Apache FOP project are to ...<br />
 1 20100103201220/http://velocity.apache.org/<br />
 ... Library Site building Site tools Apache Reference Apache Website How the ASF ... way in its field. Apache<br />
...<br />
</code></p>
<p>Voilà cela fonctionne en ligne de commande, nous pouvons passer à l&#8217;interface end user (enfin un moteur de recherche en ligne de commande c&#8217;est très pratique aussi <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  )</p>
<h3>Configuration de l&#8217;interface web</h3>
<p>Nutch fournir un application pour Tomcat / Jboss. Il suffit de la déployer et de lui indiquer l&#8217;emplacement de votre index de la manière suivante :<br />
<code><br />
# cd /opt/nutch<br />
# cp nutch-1.0.war /var/lib/tomcat5.5/webapps<br />
... attendre<br />
# vim /var/lib/tomcat5.5/webapps/nutch-1.0/WEB-INF/classes/nutch-default.xml<br />
... remplacer la value de <em>searcher.dir</em>  par /opt/nutch/crawl<br />
</code><br />
Mais aussi modifier la sécurité de tomcat, via le fichier <em>/etc/default/tomcat5.5</em> en mettant la variable <em>TOMCAT5_SECURITY</em> à no.<br />
Ou bien en créant un fichier policy donnant l&#8217;accès au répertoire <em>/opt/nutch/crawl</em>. (c&#8217;est plus propre <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  )</p>
<p>Vous pouvez ensuite redémarrer tomcat et accèder au moteur de recherche via votre navigateur sur le port 8180.</p>
<h3>Problèmes rencontrés</h3>
<p>Voici quelques problèmes que j&#8217;ai rencontré lors de mes tests de la version 1.0 de Nutch :</p>
<h4>La directive merge ne fonctionne pas</h4>
<p>Impossible de <em>fusionner</em> deux index, il est nécessaire de re-creer l&#8217;ensemble de l&#8217;index à chaque fois.</p>
<h4>La directive fetch flanche</h4>
<p>Lorsque trop nombreux sites sont choisis dans la liste des sites à parcourir par le robot d&#8217;indexation à l&#8217;aide de l&#8217;option <em>topN</em>, le programme produit une erreur et le <em>segement</em> produit est corrompu. (c&#8217;est pour cette raison que je limite le nombre de site dans un segment à 5000)</p>
<h3>Maintenance de l&#8217;index</h3>
<p>Une fois le moteur de recherche mise en place, il faut maintenir l&#8217;index à jours. Pour cela, j&#8217;ai mis en place un simple script de crawl avec cron qui se lance tous les soirs :<br />
<code><br />
#!/bin/sh<br />
bin/nutch generate crawl/crawldb crawl/segments -topN 5000<br />
s1=`ls -d crawl/segments/2* | tail -1`<br />
bin/nutch fetch $s1<br />
bin/nutch updatedb crawl/crawldb $s1<br />
bin/nutch invertlinks crawl/linkdb $s1<br />
</code><br />
et un autre qui re-créer l&#8217;index :<br />
<code><br />
#!/bin/sh<br />
rm -rf crawl/indexes/<br />
bin/nutch index crawl/indexes/ crawl/crawldb/ crawl/linkdb/ crawl/segments/*<br />
</code></p>
<h3>Optimisation du robot d&#8217;indexation</h3>
<p>La principale difficulté de ce projet est l&#8217;indexation d&#8217;une énorme quantité de données avec des moyens techniques très limité.<br />
Voici donc quelques idées pour optimiser l&#8217;indexation de votre moteur de recherche. </p>
<h4>Utiliser le serveur mandataire de votre fournisseur d&#8217;accès à Internet</h4>
<p>Vous pouvez ajouter l&#8217;adresse du serveur mandataire de votre FAI dans le fichier <em>conf/nutch-site.xml</em> :<br />
<code><br />
&lt;property><br />
  &lt;name>http.proxy.host&lt;/name><br />
  &lt;value>proxy.free.fr&lt;/value><br />
&lt;/property><br />
&lt;property><br />
  &lt;name>http.proxy.port&lt;/name><br />
  &lt;value>3128&lt;/value><br />
&lt;/property><br />
</code></p>
<p>Note : On me signale dans l&#8217;oreillette, que <a href="http://www.freenews.fr/spip.php?article7300">mon FAI à fermer son proxy</a> à cause d&#8217;une sombre histoire de <a href="http://fr.wikipedia.org/wiki/Loi_Cr%C3%A9ation_et_Internet">Haute Autorité De l&#8217;Ouverture Postale Inopinée</a>.</p>
<h4>Mise en place d&#8217;un serveur DNS locale</h4>
<p>Vous avez besoin de mettre en place un serveur cache DNS locale qui prend en charge les requêtes du robot. Vous pouvez faire cela avec <a href="https://www.isc.org/products/BIND/">ISC BIND</a> ou bien <a href="http://www.phys.uu.nl/~rombouts/pdnsd.html">pdnsd</a>. </p>
<h4>Augmentation du nombre de Threads</h4>
<p>Vous pouvez aussi augmenter le nombre de processus utiliser par le robot d&#8217;indexation en modifiant les variables du fichier de configuration :</p>
<ul>
<li><em>fetcher.threads.fetch</em> : nombre de threads au total (42) ;</li>
</ul>
<p>Pour plus d&#8217;informations, vous pouvez voir sur le wiki du projet : <a href="http://wiki.apache.org/nutch/OptimizingCrawls">OptimizingCrawls</a>.</p>
<h3>Imposer^WIntégrer Nutch</h3>
<p>Voici quelques astuces pour intégrer Nutch à votre architecture. </p>
<h4>Mozilla Firefox</h4>
<p>Pour Mozilla Firefox, le système de plugin permet d&#8217;inclure votre <a href="https://developer.mozilla.org/en/Creating_OpenSearch_plugins_for_Firefox">propre moteur de recherche</a>.<br />
Pour faire cela, il faut placer le fichier <a href="/wp-content/contrib/nutch.xml">nutch.xml</a> dans votre profile Firefox : <em>~/.mozilla/firefox/*.default/searchplugins</em> (en remplacant par l&#8217;addresse de votre instance ) .</p>
<h4>DNS Menteur</h4>
<p>Vous pouvez modifier la configuration de votre DNS pour résoudre le domaine google avec l&#8217;adresse de votre moteur de recherche. (Ouais, je sais Net Neutrality, toussa <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ). En modifiant la feuille de style de l&#8217;interface web certains utilisateurs ne verront surement pas la diffèrence.</p>
<h3>Est-ce bien raisonnable ?</h3>
<p>Vous allez me dire. Héberger son propre moteur de recherche chez soit, quelle drôle d&#8217;idée  <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Je pousse, le concept d&#8217;<a href="http://fr.wikipedia.org/wiki/Auto-h%C3%A9bergement">Auto-hébergement</a> au maximum, mais il est clair que j&#8217;ai fait cette article <em>&#8220;Just for fun&#8221;</em>, car même si je ne peut indexer que 5000 sites par jours (le script fonctionne durant les heures creuses) , soit 1 825 000 en un an, je vais avoir beaucoup de mal à indexer les 4 446 480 urls de DMOZ.</p>
<h3>Références</h3>
<p>Voici quelques références intéressantes sur le sujet :</p>
<ul>
<li><a href="http://infolab.stanford.edu/~backrub/google.html">The Anatomy of a Large-Scale Hypertextual Web Search Engine</a> : description de l&#8217;architecture de Google ;</li>
<li><a href="http://www.schneier.com/blog/archives/2009/12/my_reaction_to.html">La réponse de Bruce Schneier</a> à Eric Schmidt ;</li>
<li>Le <a href="http://lucene.apache.org/nutch/tutorial8.html">tutorial</a> pour les versions 0.8.x de Nutch ;</li>
<li>Le <a href="http://wiki.apache.org/nutch/FrontPage">Wiki</a> du projet Nutch ; </li>
<li>Un <a href="http://www.bustedtees.com/skynet">tee short</a> très googlitude ;</li>
<li>Un autre tutorial similaire pour une version plus ancienne : <a href="http://goupil.arnaud.free.fr/nutch.php">Installation de Nutch 0.8.1 sous Ubuntu 6.10</a> d&#8217;Arnaud Goupil ;</li>
<li>Le blog du groupe de travail francophone : <a href="http://frutch.blogspot.com/">Frutch</a> ;</li>
<li><a href="http://www.motrech.com/">Motrech</a>, le blog consacré aux moteurs de recherche. </li>
</ul>
<h3>Conclusion</h3>
<p>Vous avez maintenant à votre disposition un moteur de recherche personnel.<br />
Et vous êtes libre de rechercher des choses sans que personne ne puisse le savoir <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
L&#8217;étape la plus dure est de se passer de l&#8217;utilisation google <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Si vous voulez aller plus loin dans le monde des moteurs de recherche libre vous pouvez intégrer Nutch avec <a href="http://lucene.apache.org/solr/features.html">Solr</a>, comme décrit dans cette article : <a href="http://www.lucidimagination.com/blog/2009/03/09/nutch-solr/">Using Nutch with Solr</a>.<br />
Afin d&#8217;obtenir un moteur de recherche professionnel pour une entreprise. (principalement pour éviter la fuite d&#8217;information).<br />
Ou bien si vous si êtes intéressé par un produit similaire aux <a href="http://www.google.com/enterprise/intranet_search.html">Solutions d&#8217;entreprise</a> de Google.</p>
<p>Pour finir, la petite cerise sur la gâteau, comme Nutch utilise <a href="http://hadoop.apache.org/">Hadoop</a>, il <em>scale</em> comme un troupeau éléphants <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2010/01/11/nutch/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Système d&#8217;impression PDF &#8220;RESTful&#8221;  pour le Web</title>
		<link>http://www.csquad.org/2009/02/10/systeme-dimpression-pdf-restful-pour-le-web/</link>
		<comments>http://www.csquad.org/2009/02/10/systeme-dimpression-pdf-restful-pour-le-web/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 21:43:13 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Work]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Cocoon]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[MAVISE]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=78</guid>
		<description><![CDATA[Le monde du web et celui de l&#8217;impression, ont décidément du mal à se rencontrer.
La prise en charge de l&#8217;impression est bien souvent très problématique dans le cas d&#8217;un projet web. 
Dans la plupart des cas, il est possible de s&#8217;en sortir en utilisant les possiblités offertes par les feuilles de style CSS.
Mais le rendu [...]]]></description>
			<content:encoded><![CDATA[<p>Le monde du web et celui de l&#8217;impression, ont décidément du mal à se rencontrer.<br />
La prise en charge de l&#8217;impression est bien souvent très problématique dans le cas d&#8217;un projet web. </p>
<p>Dans la plupart des cas, il est possible de s&#8217;en sortir en utilisant les possiblités offertes par les feuilles de style CSS.<br />
Mais le rendu final du document n&#8217;est pas garanti, les différents navigateurs interprètent la feuille de style selon leur humeur<br />
et cela ne fonctionne pas dans le cas de documents complexes.</p>
<p>Dans ce cas, l&#8217;unique solution est de produire un document au format PDF, unique garantie pour une impression de qualité.<br />
Je vais donc décrire dans cet article, la solution que nous avons mis en place dans le cadre du projet MAVISE.</p>
<h3>Historique</h3>
<p>La base de données <a href="http://mavise.obs.coe.int/">MAVISE</a> fourni les données sur l’ensemble des chaînes de télévision accessibles dans l’Union européenne.</p>
<p>Elle a été développé par la société Easter-eggs en collaboration avec <a href="http://www.obs.coe.int/">l&#8217;Observatoire européen de l&#8217;audiovisuel</a> (OEA) pour le compte de la <a href="http://ec.europa.eu/dgs/communication/index_en.htm">DG Communication de la Commission Européenne</a>.</p>
<p>Dans la 1ère phase du projet nous avons développé un système d&#8217;impression avec des feuilles de style.<br />
Ce système ne donnait pas entièrement satisfaction au client. </p>
<p>En effet, les pages du projet étant très complexes, le résultat de l&#8217;impression produite par les différents navigateurs était très aléatoire (coupure en plein milieu d&#8217;un tableau, impression sur plusieurs pages et saut de pages inexpliqués).</p>
<p>Le résultat n&#8217;était pas professionnel et il était difficile pour le client d&#8217;alimenter un rapport avec les contenu de la base.<br />
Nous avons donc proposé de mettre en place un export PDF pour l&#8217;ensemble des éléments de l&#8217;application.</p>
<h3>Choix techniques</h3>
<p>Au fils du temps, je suis devenu un expert de la production de document PDF,<br />
en effet, j&#8217;ai été en charge de l&#8217;export PDF dans de nombreux projets. </p>
<p>J&#8217;ai eu le plaisir d&#8217;utiliser plusieurs API pour produire des documents au format PDF, comme par exemple :</p>
<ul>
<li><a href="http://www.reportlab.org/index.html">ReportLab</a> en Python ;</li>
<li><a href="http://www.fpdf.org/">FPDF</a> en PHP ;</li>
<li><a href="http://pdfapi2.sourceforge.net/">PDF::API2</a> en Perl.</li>
</ul>
<p>Le travail pour produire des documents PDF consiste dans la plupart des cas à dessiner avec l&#8217;aide de ces diffèrentes<br />
API, le contenu du document. (texte, tableaux, graphique et mise en page). </p>
<p>Il s&#8217;agit d&#8217;un travail long et fastidieux, qui consiste à fournir une suite d&#8217;instructions pour former le document.<br />
Cette technique montre vite ses limites :</p>
<ul>
<li>les demandes de modification de la mise en page du  document produit, sont lourdes et nécessitent beaucoup de temps ;</li>
<li>le code pour produire le document est difficilement rationalisable ;</li>
<li>elle ne convient pas à des documents de grande taille.</li>
</ul>
<p>Dans le modèle <a href="http://fr.wikipedia.org/wiki/Mod%C3%A8le-Vue-Contr%C3%B4leur">MVC</a>, qu&#8217;utilise la plupart des applications Web, nous utilisons un système de template pour l&#8217;affichage (la vue).  </p>
<p>Alors pourquoi bon &#8220;coder&#8221; la présentation des documents PDF?</p>
<p>Pour cette raison, j&#8217;ai proposé au client de bâtir le système d&#8217;impression des documents PDF sur un système de <em>template</em>.</p>
<p>Ce système repose sur le langage de programmation <a href="http://www.w3.org/TR/xsl/">XSL-FO</a>, les projets <a href="http://xmlgraphics.apache.org/fop/">Apache FOP</a> et  <a href="http://cocoon.apache.org/">Apache Cocoon</a>.</p>
<h3>Architecture du système d&#8217;impression</h3>
<p><img src='/wp-content/mavise_export_pdf_workflow.png' alt='' /></p>
<ol>
<li>Lorsque l&#8217;utilisateur clique sur le lien PDF,  il est redirigé vers Apache Cocoon ;</li>
<li>Cocoon, récupère l&#8217;ensemble des informations directement sur le site web, via l&#8217;API REST ;</li>
<li>Il agrége les informations dans un document XML ;</li>
<li>Ce document est transformé en FO à l&#8217;aide d&#8217;une feuille de style XSLT ;</li>
<li>Le document est produit par Apache FOP ;</li>
<li>L&#8217;utilisateur obtient le document final. </li>
</ol>
<h3>L&#8217;interface entre le Site Web et Apache Cocoon</h3>
<p>L&#8217;architecture du système d&#8217;impression repose sur le fait que l&#8217;ensemble des variables manipulées par notre application sont accessibles à l&#8217;aide d&#8217;URL <a href="http://fr.wikipedia.org/wiki/REST">REST</a>.</p>
<p>En effet, il est possible d&#8217;afficher le contenu des diffèrentes variables manipulées par l&#8217;application à l&#8217;aide d&#8217;adresses URL spécifiques.<br />
Voici un exemple de sortie :<br />
<code><br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;array&gt;<br />
&lt;is_admin /&gt;<br />
&lt;country&gt;<br />
&lt;id&gt;1&lt;/id&gt;<br />
&lt;iso3166&gt;FR&lt;/iso3166&gt;<br />
&lt;name&gt;France&lt;/name&gt;<br />
&lt;enabled&gt;t&lt;/enabled&gt;<br />
&lt;minimal_age_of_audience&gt;4+&lt;/minimal_age_of_audience&gt;<br />
&lt;/country&gt;&lt;/array&gt;<br />
...<br />
</code></p>
<p>Il est donc possible de récupèrer l&#8217;<strong>ensemble</strong> des informations du site à l&#8217;aide du protocol REST.</p>
<p>Nous avons aussi de très nombreux tableaux dans l&#8217;application, pour les récupérer, nous utilisons le format XML natif du contrôleur de tableaux <a href="http://dhtmlx.com/docs/products/dhtmlxGrid/">dhtmlxGrid</a>.<br />
Voici un exemple de sortie : <a href="http://mavise.obs.coe.int/company?id=1&#038;event=get_grid_xml_list_of_channels&#038;presenter=dhtmlXGrid_xml_loader">fichier XML pour dhtmlxGrid</a>.</p>
<h3>Agrégation des données dans un seul fichier</h3>
<p>Pour récupérer l&#8217;ensemble des données du site dans un fichier XML, j&#8217;utilise la directive <em>include</em>, offerte par Cocoon :<br />
<code><br />
$ cat /var/lib/tomcat5/webapps/cocoon/mavise/program/program.xml<br />
&lt;?xml version="1.0"?&gt;</p>
<p>&lt;page name='program' xmlns:i="http://apache.org/cocoon/include/1.0"&gt;<br />
      &lt;i:include src='cocoon:/webui_program'/&gt;<br />
...<br />
</code></p>
<p>Cette directive dit à Cocoon, d&#8217;inclure le contenu qui se trouve à l&#8217;url <em>cocoon:/webui_program</em>, défini dans le fichier<br />
<em>sitemap.xmap</em> :<br />
<code><br />
      &lt;!-- Webui --&gt;<br />
      &lt;map:match pattern="webui_*/*"&gt;<br />
        &lt;map:generate src='http://localhost/{1}?id={2}&amp;presenter=rest&amp;filter=webui'/&gt;<br />
        &lt;map:serialize type="exml"/&gt;<br />
      &lt;/map:match&gt;<br />
</code></p>
<h3>Transformation XSLT</h3>
<p>Pour transformer les données contenues dans ce fichier, nous avons créé notre propre feuille de style XSLT, pour produire un document FO.<br />
Cette feuille de style prend en compte la mise en forme des diffèrentes données du site.</p>
<p>Grâce à ce système, l&#8217;ensemble de la <strong>mise en forme est centralisé</strong> dans un seul fichier.<br />
Il est aussi possible d&#8217;ajouter du contenu statique dans le PDF à l&#8217;aide de balises dédiées.<br />
Comme par exemple, une balise <em>copyright</em>, qui sera transformées en un texte statique dans tous les documents PDF.</p>
<h3>Le pipeline pour les documents PDF</h3>
<p>Voici le <em>pipeline</em> final pour produire des documents PDF :<br />
<code><br />
      &lt;!-- PDF --&gt;<br />
      &lt;map:match pattern="*/*/*.pdf"&gt;<br />
        &lt;map:generate src='{1}/{3}.xml'/&gt;<br />
        &lt;map:transform src="mk_id.xsl" type="xslt"&gt;<br />
                &lt;map:parameter name="val" value="{2}" /&gt;<br />
        &lt;/map:transform&gt;<br />
        &lt;map:transform type="include"&gt;<br />
           &lt;map:parameter name="parallel" value="true"/&gt;<br />
           &lt;map:parameter name="support-caching" value="true"/&gt;<br />
           &lt;map:parameter name="expires" value="600"/&gt;<br />
        &lt;/map:transform&gt;<br />
</code></p>
<p>Le point intéressant à noter dans ce pipeline est l&#8217;encodage des arguments passés via l&#8217;URL pour le document PDF.<br />
En effet,  les URL pour produire les PDF sont formés de la manière suivante :</p>
<p>http://mavise.obs.coe.int/cocoon/mavise/channel/2157/channel.pdf</p>
<p>L&#8217;URL contient, le nom du module et l&#8217;identifiant de la chaîne.<br />
De cette manière, il est possible de passer d&#8217;autres arguments au système d&#8217;impression (comme par exemple, changer l&#8217;orientation du document).</p>
<h3>Performances</h3>
<p>Au niveau des performances du système d&#8217;impression, nous n&#8217;avons pas une charge très importante sur la génération des documents PDF.<br />
La production des documents est  une tâche complexe et nécessite donc de manière génèrale beaucoup de ressources.<br />
Néanmoins, il y a une chose intéressante à noter au niveau de la génération des documents PDF.<br />
Celle-ci est plus rapide que l&#8217;affichage dans un navigateur.<br />
En effet cela est lié au fait que les échanges de données se font en local sur le serveur, il y a donc moins de bande passante utilisée que dans le cas de l&#8217;affichage de cette même page par le navigateur.</p>
<h3>Les petits désagréments du format PDF</h3>
<p>Nous avons rencontré un petit problème, avec la gestion des polices UTF-8, en effet, comme la base contient des données sur des chaînes de télévision et des entreprises Turques, nous avons eu besoin d&#8217;embarquer une police UTF-8 à l&#8217;intérieur du document.<br />
Et visiblement cela pose des problèmes à certains lecteurs.</p>
<h3>Quelques liens utiles</h3>
<p>Voici quelques liens utiles qui nous ont aidé dans la réalisation de ce système d&#8217;impression :</p>
<ul>
<li><a href="http://howto.landure.fr/gnu-linux/debian-4-0-etch/installer-cocoon-2-1-x-et-fop-0-9x-sur-debian-4-0-etch">Le guide d&#8217;installation d&#8217;Apache Cocoon, FOP sur Debian GNU/Linux</a> ;</li>
<li><a href="http://cocoon.apache.org/2.1/introduction.html">Documentation de la version 2.1 d&#8217;Apache Cocoon</a> ;</li>
<li><a href="http://www.zvon.org/xxl/XPathTutorial/General/examples.html">XPath Tutorial</a> ; </li>
<li><a href="http://www.zvon.org/xxl/XSLTutorial/Output_fre/contents.html">XSLT Tutorial</a> ;</li>
<li><a href="http://www.ecrion.com/Support/Resources/XSL-FO-Tutorial-French/toc.xml.html">XSL-FO</a> ;</li>
</ul>
<h3>Conclusion</h3>
<p>En conclusion, j&#8217;aimerais remercié l&#8217;<a href="http://www.obs.coe.int/">Observatoire européen de l&#8217;audiovisuel</a> (OEA), pour nous avoir fait confiance pour la mise en place de cette solution.<br />
Au 1er abord, le schéma de l&#8217;architecture n&#8217;est pas très engageant <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>J&#8217;espère que cette solution donnera des idées à d&#8217;autres personnes, pour leur système d&#8217;impression.<br />
L&#8217;objectif final est de faire des économies de papier par rapport à une impression faite via Internet Explorer <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2009/02/10/systeme-dimpression-pdf-restful-pour-le-web/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mise en place d’un système de publication de contenu basé sur le projet Apache Cocoon et le langage de balises DocBook</title>
		<link>http://www.csquad.org/2008/01/15/mise-en-place-d%e2%80%99un-systeme-de-publication-de-contenu-base-sur-le-projet-apache-cocoon-et-le-langage-de-balises-docbook/</link>
		<comments>http://www.csquad.org/2008/01/15/mise-en-place-d%e2%80%99un-systeme-de-publication-de-contenu-base-sur-le-projet-apache-cocoon-et-le-langage-de-balises-docbook/#comments</comments>
		<pubDate>Tue, 15 Jan 2008 16:27:35 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Work]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Cocoon]]></category>
		<category><![CDATA[DocBook]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=49</guid>
		<description><![CDATA[Tous les documents disponibles dans la partie publication de mon site web, sont écrit à l&#8217;aide du langage DocBook,
cette méthode permet de séparer fond du document de sa mise en forme et ainsi publier le document dans plusieurs formats (HTML, PDF, Texte, etc&#8230;). 
Cette possibilité forte intéressante, est devenus au fils du temps un handicape. [...]]]></description>
			<content:encoded><![CDATA[<p>Tous les documents disponibles dans la partie publication de mon site web, sont écrit à l&#8217;aide du langage DocBook,<br />
cette méthode permet de séparer fond du document de sa mise en forme et ainsi publier le document dans plusieurs formats (HTML, PDF, Texte, etc&#8230;). </p>
<p>Cette possibilité forte intéressante, est devenus au fils du temps un handicape. </p>
<p>Car la moindre modification d&#8217;un document nécessite la régénération des différents formats d&#8217;export. </p>
<p>J&#8217;ai donc cherché à simplifié et automatisé la procedure de publication. La résultat de ce travail est décrit dans ce document :</p>
<p><a href="http://www.csquad.org/cocoon/tags/public/cocoon/cocoon.html">Mise en place d’un système de publication de contenu basé sur le projet Apache Cocoon et le langage de balises DocBook</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2008/01/15/mise-en-place-d%e2%80%99un-systeme-de-publication-de-contenu-base-sur-le-projet-apache-cocoon-et-le-langage-de-balises-docbook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Publication de sites web avec mod_dnssd et Apache2</title>
		<link>http://www.csquad.org/2006/04/03/publication-de-sites-web-avec-mod_dnssd-et-apache2/</link>
		<comments>http://www.csquad.org/2006/04/03/publication-de-sites-web-avec-mod_dnssd-et-apache2/#comments</comments>
		<pubDate>Mon, 03 Apr 2006 21:00:29 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Zeroconf]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=31</guid>
		<description><![CDATA[Je suis actuellement en train de travailler avec le support du protocole Rendez-vous (alias Zeroconf) sous GNU/Linux pour pouvoir configurer de manière automatique l&#8217;ensemble des services qui sont à ma disposition. Ce protocole serait pour moi la meilleure solution pour ne pas à avoir à reconfigurer mon portable lorsque je suis en déplacement.
L&#8217;objectif de ce [...]]]></description>
			<content:encoded><![CDATA[<p>Je suis actuellement en train de travailler avec le support du protocole Rendez-vous (alias Zeroconf) sous GNU/Linux pour pouvoir configurer de manière automatique l&#8217;ensemble des services qui sont à ma disposition. Ce protocole serait pour moi la meilleure solution pour ne pas à avoir à reconfigurer mon portable lorsque je suis en déplacement.<br />
L&#8217;objectif de ce billet est d&#8217;expliquer comment publier un site web à l&#8217;aide du protocole Zeroconf.  </p>
<h3>Zeroconf</h3>
<p><a href="http://fr.wikipedia.org/wiki/Zeroconf">Zeroconf</a> est le nom d&#8217;un ensemble de technologies permettant à plusieurs ordinateurs de communiquer sans configuration.<br />
Le but est d&#8217;obtenir un réseau IP fonctionnel sans dépendance d&#8217;une infrastructure (serveur DHCP, serveur DNS, etc.) ou d&#8217;une expertise réseau. L&#8217;ensemble des ces technologies sont implémantées sous Linux par le projet <a href="http://avahi.org/">Avahi</a>.</p>
<h3>mod_dnssd</h3>
<p>Le module <a href="http://0pointer.de/lennart/projects/mod_dnssd/">mod_dnssd</a> permet d&#8217;intégrer le support de Zeroconf dans Apache2 et de publier par l&#8217;intèrmédiaire d&#8217;Avahi l&#8217;ensemble des sites disponibles sur le serveur.</p>
<h3>Installation du module</h3>
<p>Tout d&#8217;abord vous avez besoin d&#8217;Avahi :</p>
<blockquote><p>
# aptitude install avahi
</p></blockquote>
<p>Des biblithèques de developpement d&#8217;Apache2 :</p>
<blockquote><p>
# aptitude install apache2-dev
</p></blockquote>
<p>Télécharger les sources du modules sur le <a href="http://0pointer.de/lennart/projects/mod_dnssd/">site web</a> de l&#8217;auteur :</p>
<blockquote><p>
$ wget http://0pointer.de/lennart/projects/mod_dnssd/mod_dnssd-0.4.tar.gz
</p></blockquote>
<p>Compiler et installer le module :</p>
<blockquote><p>
$ tar xzf mod_dnssd-0.4.tar.gz<br />
$ cd mod_dnssd-0.4<br />
$ ./configure &#038;&#038; make<br />
# make install
</p></blockquote>
<p>Le module se retrouve dans le répertoire : <em>/usr/lib/apache2/modules/</em></p>
<h3>Configuration d&#8217;Apache</h3>
<p>Pour publier, un site web il faut activer la publication dans le fichier de configuration d&#8217;Apache  :</p>
<blockquote><p>
DNSSDEnable On
</p></blockquote>
<p>Pour publier une URL, il suffit d&#8217;indiquer son nom à l&#8217;aide de la directive  <em>DNSSDServiceName</em> :</p>
<blockquote><p>
&lt;location /foobar&gt;<br />
	DNSSDServiceName &#8220;Documentation&#8221;<br />
&lt;/location&gt;
</p></blockquote>
<p>Vous pouvez aussi publier des flux RSS en précisant le type de services :</p>
<blockquote><p>
&lt;Location /blog.cgi?rss&gt;<br />
	DNSSDServiceName &#8220;The blog&#8221;<br />
	DNSSDServiceTypes _rss._tcp<br />
&lt;/Location&gt;
</p></blockquote>
<h3>Exploitation</h3>
<table>
<tr valign="top">
<td><img src='/wp-content/avahidiscovery_websites.png' alt='' /></td>
<td>Vous pouvez vérifier que les sites ont bien été publié à l&#8217;aide d&#8217;utilitaire <em>avahi-discover</em>.</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2006/04/03/publication-de-sites-web-avec-mod_dnssd-et-apache2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

