Christophe Nowicki

January 31, 2010

Gestion de la lumière d’ambiance avec le protocole DMX sous Debian GNU/Linux

La technologie des lumières à LEDs offre la possibilité de placer une source de lumière n’importe où (aquarium, meubles, faux plafonds, derrière un écran, etc…).

Par contre, les LEDs disposent de plus de fonctionnalités que les ampoules classiques.
En effet, en plus d’un bouton d’allumage, vous avez la possibilité de changer la couleur de la lumière, la faire varier dans le temps, modifier son intensité, jouer une séquence, etc…

Avec un nombre de possibilités plus grand, les interfaces de contrôle classique (X10, PLCBUS, etc…) ne suffisent pas.

Il est donc nécessaire de placer un peu plus d’intelligence dans le réseau d’illumination à l’aide du protocole DMX.

Ce protocole est utilisé dans le monde des concerts, des plateaux de télévision et des spectacles.
Néanmoins, il est tout à fait possible de le détourner pour un usage domotique.

Dans ce billet, je vais décrire l’utilisation d’un contrôleur LED RGB DMX et de l’interface OpenDMX de chez ENTTEC, à l’aide du projet OLA sous Debian GNU/Linux.

Principe de fonctionnement

Voici le schéma du montage:
dmx_led_overview

  • le PC communique à l’aide du port USB avec un contrôleur DMX ;
  • les contrôleurs LEDs mis en série convertissent les ordres en instructions RGB ;

Et voici ce que cela donne :

OpenDMX RGB LED

Matériel

Voici le matériel nécessaire pour un bandeau à LED, le tout fonctionne bien sûr sous Debian GNU/Linux est FOSS Friendly ;-)

Produit Prix
OPEN DMX USB Hardware Interface $52.00 – $60.00
RGB LED DMX Controller 2 $48.00 – $76.80
RJ45 Connetor to XLR Female Connector $11.20 – $14.25
RJ45 to XLR Male DMX Cable Adapter 3ft $10.99 – $14.00
DMX/XLR converter connector $10.50 – $12.00
LED Controller Power Supply, USA/EU $23.10 – $36.96
DMX 512 Terminator, 3 Pole Male Connector $7.94
Mini Bandeau Rigide RGB 12 Led 20cm 150° 12v DC 6 € – 12,95 €
Raccord intermédiaire pour Bandeau lumineux à Led Longueur 5cm 1.5 €

Pour le câblage, entre le bandeau lumineux et le contrôleur à LED, Il faut couper une extrémité du cable de raccord et la dénuder pour brancher sur le bornier à quatre vis de sortie RGB.

Installation du matériel

Une fois que vous avez branché l’OpenDMX au PC, vous devez voir un convertisseur USB-Serial (UART) à l’aide de lsusb :

$ lsusb
Bus 002 Device 006: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

Pour faire fonctionner l’OpenDMX, vous avez besoin du module noyau dmx-usb et d’un environnement de compilation pour les modules. (paquet linux-headers*, etc…).

# cd /usr/src
# git-clone http://www.erwinrol.com/git/dmx_usb_module/
# cd dmx_usb_module
# make
# cp ./dmx_usb.ko /lib/modules/$(uname -r)/kernel/drivers/usb/serial
# depmod -a

Comme, l’OpenDMX est un convertisseur USB-Serial, le noyau par défaut le présente comme une interface /dev/ttyUSB.
Il est donc nécessaire de blacklister les modules usbserial dans le fichier /etc/modprobe.d/blacklist, en ajoutant les lignes suivantes :

blacklist usbserial
blacklist usb-serial
blacklist ftdi_sio

Ensuite, ajouter le module dmx_usb dans le fichier /etc/modules et rebooter la machine.
Au reboot, vous devez avoir une interface /dev/dmx0, qu’il faut rendre accessible pour tous les utilisateurs :

# ls -l /dev/dmx0
crw-rw---- 1 root root 180, 192 2010-01-30 00:37 /dev/dmx0
# chmod a+rw /dev/dmx0

Installation du logiciel pour la gestion de la lumière : Open Lighting Architecture (OLA)

Comme, il n’y a pas de paquets Debian disponibles pour ce programme, je vais décrire une procédure d’installation à partir des sources. Ces instructions ont été valider à l’aide de la version 0.7.3 de OLA :

Dépendances

Vous allez avoir besoin des dépendances suivantes pour la compilation :

# apt-get install build-essential uuid-dev libcppunit-dev libgcrypt-dev uuid-dev

Compilation de Protocol Buffers de Google

Vous avez besoin de protobuf, pour la gestion de l’échange de données :

# cd /usr/src
# wget http://protobuf.googlecode.com/files/protobuf-2.3.0.tar.bz2
# tar xjf protobuf-2.3.0.tar.bz2
# cd protobuf-2.3.0
# ./configure ; make ; make install

Compilation de google-ctemplate

Vous avez besoin du système ctemplate :

# cd /usr/src
# wget http://google-ctemplate.googlecode.com/files/ctemplate-0.96.tar.gz
# tar xzf ctemplate-0.96.tar.gz
# cd ctemplate-0.96
# ./configure; make ; make install

Compilation de microhttpd (optionnel)

Vous avez besoin de la libmicrohttpd version > à 0.4 (non disponible dans Debian) pour l’interface web de gestion :

# cd /usr/src
# wget ftp://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-0.4.5.tar.gz
# tar xzf libmicrohttpd-0.4.5.tar.gz
# cd libmicrohttpd-0.4.5
# ./configure; make ; make install

Compilation de OLA

Le projet OLA se découpe en deux parties : un serveur et des clients, dont voici la procédure de compilation. Vous devez remplacer x.y.z, par la version stable la plus récente du programme. (0.7.3 dans mon cas)
Pour le serveur :

# cd /usr/src
# wget http://linux-lighting.googlecode.com/files/ola-x.y.z.tar.gz
# tar xzf ola-x.y.z.tar.gz
# cd ola-x.y.z
# ./configure; make ; make install

Pour le client en C++ :

# cd /usr/src
# wget http://linux-lighting.googlecode.com/files/ola-examples-x.y.x.tar.gz
# tar xzf ola-examples-x.y.z.tar.gz
# cd ola-examples-x.y.z
# ./configure; make ; make install

Lancement d’OLAd

Vous pouvez lancer olad, avec un utilisateur qui dispose des droits de lecture / écriture du /dev/dmx0 :

$ olad -l 3
...

Vous pouvez ensuite vérifier si l’OpenDMX a bien été détecté par le serveur à l’aide du client ola_dev_info :

$ ola_dev_info
...
Device 3: OpenDmx USB Device
port 0, OUT Open Dmx at /dev/dmx0
...

Et si vouz avez compilé libmicrohttpd, vous devez pouvoir accèder à l’interface web du daemon, sur le port 9090 :

DMX OLA web console

Test et validation du bon fonctionnement

Avant de pouvoir manipuler les LEDs, il est nécessaire d’attribuer ununivers au contrôleur OpenDMX à l’aide de la commande ola_patch :

$ ola_patch -d 3 -p 0 -u 0

Ensuite vous pouvez lancer dans deux terminaux les commandes ola_dmxmonitor et ola_dmxconsole.
La première permet de suivre le statut des diffèrents composants et la seconde permet de les controler à l’aide d’un interface graphique en curses.

L’identifiant du contrôleur LED RGB sur le réseau DMX, est fonction de la valeur prise par le petit switch qui se situe sur celui-ci.
Et se découpe de la manière suivante :

  • Rouge = valeur du switch ;
  • Vert = valeur du switch + 1 ;
  • Bleu = valeur du switch + 2.

Vous pouvez faire varier les trois valeurs pour obtenir les diffèrentes couleurs possibles.

Allez plus loin avec l’Open Lighting Architecture (OLA)

OLA supporte de nombreux contrôleurs USB et Ethernet.
Il dispose d’une API Client C++ et Python, ce qui rend son intégration possible et facile dans d’autres projets et offre de nombreuses possiblités.

La diffusion d’informations à l’aide de la lumière d’ambiance et ses possiblités

L’idée de pouvoir contrôler l’intensité et la couleur d’un bandeau à LED qui se situe dans n’importe quel endroit de la maison, offre des possiblités interessantes en matière de diffusion d’informations.

En effet, la lumière permet de diffuser l’information de manière non intrusive.
Voici quelques exemples des possibilités offertes :

  • comme la lampe DAL de Violet, se connecter à l’Internet pour exploiter des ressources ;
  • Pour ceux qui disposent de l’option Tempo d’EDF, il est possible de diffuser la couleur du jour ;
  • Modifier l’Intensité lumineuse en fonction de nombreux paramètres : tempèrature, l’ensoleillement, nombre de personnes présentes dans la pièces, activation d’une alarme, réveil du bébé, etc…

Ce sont quelques exemples des possiblités offertes. Pour le reste vous pouvez faire marcher votre imagination pour créer des nouvelles manières d’inter-agir avec les machines et cette Intelligence ambiante.

Réferences

Voici mes réferences :

Conclusion

Le protocole DMX est ancien et souffre de nombreux défaults, mais il présente encore de nombreux avantages tels que :

Il faut noter qu’il existe une alternative plus récente au protocole DMX : Digital Addressable Lighting Interface (DALI).

Il est aussi possible de remplacer le contôleur OpenDMX par une carte Arduino, comme décrit ici.

Filed under: Debian,Home automation — Tags:, , , , , — cscm @ 11:39

January 11, 2010

Faire son propre moteur de recherche avec Nutch

Allez aujourd’hui, je lâche mon troll, qui n’a pas manger depuis plusieurs semaines :

S’il y a quelque chose que vous faites et que personne ne doit savoir, peut-être qu’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 faire plus attention Liu Xiaobo avant de chercher droits de l’homme sur un moteur de recherche censuré

Bref vous m’avez compris ce genre de parole dans la bouche de l’homme le plus puissant de la plante ne m’inspire pas confiance et je continue à penser que le slogan de Google Don’t be evil est une véritable plaisanterie.

Alors au lieu de vous conseiller de passer à Bling, je vais vous expliquer comment faire votre propre moteur de recherche.

Ce billet décrit la mise en place d’un moteur de recherche sous Debian GNU/Linux basé sur Nutch.

Pré-requis

140px-Google’s_First_Production_Server

Pour faire votre propre moteur de recherche vous avez besoin de :

  • 450 000 serveurs répartis sur toute la planète ;
  • 80Go d’espace disque par machine ;
  • 4Go de mémoire par machine ;
  • Une connexion fibre optique entre vos “data centers” ;

Bref, si vous n’avez pas cette infrastructure à votre disposition ce n’est pas la peine d’aller plus loin ;-)
Bon d’accord, vous voulez simplement un moteur de recherche personnel?

Un seul serveur avec les caractéristiques suivantes :

  • Un bon processeur ;
  • Beaucoup de mémoire (4Go, ba oui, c’est du Java ma petite dame ;-) ) ;
  • Un gros disque dur très rapide de plus de 500Go (des Raptor par exemple ) ;
  • Une bonne bande passante, avec plus de 2Mb en download;
  • Une distribution Debian GNU/Linux ;
  • Des compétences en administration d’Apache, Tomcat et ligne de commande ;
  • Un peu de temps pour configurer le système et le paramétrer aux petits oignons.

C’est bien plus abordable ? ;-)

Fonctionnalités

En mettant en place mon propre moteur de recherche, je voulais obtenir les fonctionnalités suivantes :

  • Indexation des documents locaux (ex: un Intranet) ;
  • Indexation plus poussé de mes centres d’intérêts ;
  • Indépendance par rapport à un moteur de recherche ;

Néanmoins, je dois faire une croix sur :

  • la publicité ciblée ;
  • la recherche d’images, de vidéos et temps réel ;
  • la correction orthographique.

Les limitations

On pourrait dire que Nutch est un moteur de recherche de l’époque “web 1.0”. En effet, il ne contient pas d’algorithme d’Intelligence Bolchevique^Wcollective comme la plupart des moteurs de recherche. Cela signifie que seul le Page rank est utilisé et que les votes des utilisateurs ne sont pas pris en compte. Il est aussi plus sensible au Spamdexing.

Présentation des composants

L’architecture d’un moteur de recherche est assez simple, vous avez besoin :

  • d’un Web crawler, un logiciel qui explore automatiquement le Web à la recherche de ressources.
  • un système d’indexation, dans le cas de Nutch c’est Apache Lucene ;
  • des interfaces de recherche ;

Installation

Voici les étapes nécessaires pour faire fonctionner la version 1.0 Nuch sur une machine Debian GNU/Linux version “lenny”.

Dépendances

Vous avez besoin des composants suivants :
# apt-get install tomcat5.5 tomcat5.5-admin tomcat5.5-webapps sun-java6-jre

Configurer le JRE par default :
# update-alternatives --set java /usr/lib/jvm/java-6-sun/jre/bin/java

Nutch

C’est une application en Java, que je place dans le repertoire opt :

# cd /opt
# wget http://mirror.mkhelif.fr/apache/lucene/nutch/nutch-1.0.tar.gz
# tar xzf nutch-1.0.tar.gz
# ln -s nutch-1.0 nutch
# mkdir nutch/urls
# mkdir nutch/crawl
# chown tomcat55: nutch-1.0

Configuration

La configuration du moteur de recherche se trouve dans le fichier conf/nutch-default.xml, vous disposez de votre fichier conf/nutch-site.xml, spécifique à votre instance. Les variables intéressantes sont :

  • http.agent.* : la politesse, pour décrire votre robot ou bien prendre l’identité d’un autre ;
  • 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 ;-), une bonne idée est d’augmenter ces valeurs ;
  • 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.

Bootstrapping du moteur de recherche

Votre moteur de recherche doit avaler une quantité de donnée importante avant de pouvoir faire une recherche pertinente.
Voici quelques sources pour l’initialiser.

A l’aide d’un annuaire

Il existe de très bons annuaires complets comme le projet Open Directory Project.
Dont l’ensemble des données sont disponibles au format RDF et téléchargeables librement : http://rdf.dmoz.org/rdf/.
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.

Voici la procédure pour utiliser l’annuaire DMOZ avec Nutch :

$ cd /opt/nutch
$ mkdir urls
$ wget http://rdf.dmoz.org/rdf/content.rdf.u8.gz -O urls/content.rdf.u8.gz
$ gunzip urls/content.rdf.u8.gz
$ bin/nutch org.apache.nutch.tools.DmozParser urls/content.rdf.u8 > urls/dmoz
$ bin/nutch inject crawl/crawldb urls/dmoz
Injector: starting
Injector: crawlDb: crawl/crawldb
Injector: urlDir: urls/dmoz
Injector: Converting injected urls to crawl db entries.
Injector: Merging injected urls into crawl db.
Injector: done

A l’aide d’un Marque-page

Une autre source pour initialiser le moteur de recherche est d’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.
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 :


$ cd /opt/nutch
$ grep "A HREF=\"http" bookmarks.html | cut -d '"' -f 2 > urls/bookmarks
$ bin/nutch inject crawl/crawldb urls/bookmarks
Injector: starting
Injector: crawlDb: crawl/crawldb
Injector: urlDir: urls/bookmarks
Injector: Converting injected urls to crawl db entries.
Injector: Merging injected urls into crawl db.
Injector: done

A l’aide de Wikipedia

Wikipedia fourni des dumps de sa base de données au format XML. Il est donc possible d’utiliser les URLs des articles de wikipedia comme source.
Voici la procédure pour la version française de Wikipedia, celle-ci contient 897 974 urls.

$ cd /opt/nutch/
$ mkdir urls
$ wget http://download.wikimedia.org/frwiki/latest/frwiki-latest-abstract.xml -O urls/frwiki-latest-abstract.xml
$ grep "<url>" urls/frwiki-latest-abstract.xml | cut -d '>' -f 2 | cut -d '< ' -f 1 > urls/wikipedia-fr
$ bin/nutch inject crawl/crawldb urls/wikipedia-fr
Injector: starting
Injector: crawlDb: crawl/crawldb
Injector: urlDir: urls/wikipedia-fr
Injector: Converting injected urls to crawl db entries.
Injector: Merging injected urls into crawl db.
Injector: done

What you’re waitin’ for ? Christmas ?

Come get some!

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’aide de plusieurs commandes :

  • generate : sélections des adresses à parcourir ;
  • fetch : parcourt des urls ;
  • updatedb : mise à jours de la base des adresses ;
  • invertlinks : mise à jours de l’index des adresses inversées ;
  • index : indexation des données ;

Une séquence classique ressemble donc à cela :

bin/nutch generate crawl/crawldb crawl/segments -topN 1000
s1=`ls -d crawl/segments/2* | tail -1`
bin/nutch fetch $s1
bin/nutch updatedb crawl/crawldb $s1
bin/nutch invertlinks crawl/linkdb $s1
bin/nutch index crawl/indexes crawl/crawldb crawl/linkdb $s1

Cette suite de commandes vous permet de parcourir et d´indexer 1000 adresses issues de votre base.
C’est un très bon 1er test pour voir si cela fonctionne.

Shake it, baby!

Une autre commande intéressante est readdb avec l’option stats, qui permet d’obtenir des informations sur le contenu de votre base :

$ bin/nutch readdb crawl/crawldb/ -stats
CrawlDb statistics start: crawl/crawldb/
Statistics for CrawlDb: crawl/crawldb/
TOTAL urls: 3377315
...
min score: 0.0
avg score: 0.13178158
max score: 401.402
status 1 (db_unfetched): 2966337
status 2 (db_fetched): 300008
status 3 (db_gone): 46659
status 4 (db_redir_temp): 27857
status 5 (db_redir_perm): 36454

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’exécuter. (donc hors de question de la placer dans un plugin munin, un mail tous les soirs serait une meilleur méthode).

Damn… I’m looking good!

Vous pouvez tester en ligne de commande le fonctionnement du moteur de recherche :
$ bin/nutch org.apache.nutch.searcher.NutchBean apache
Total hits: 6413
0 20100104001440/http://xmlgraphics.apache.org/fop/
... be part of Apache's XML Graphics project . Demonstration ... goals of the Apache FOP project are to ...
1 20100103201220/http://velocity.apache.org/
... Library Site building Site tools Apache Reference Apache Website How the ASF ... way in its field. Apache
...

Voilà cela fonctionne en ligne de commande, nous pouvons passer à l’interface end user (enfin un moteur de recherche en ligne de commande c’est très pratique aussi ;-) )

Configuration de l’interface web

Nutch fournir un application pour Tomcat / Jboss. Il suffit de la déployer et de lui indiquer l’emplacement de votre index de la manière suivante :

# cd /opt/nutch
# cp nutch-1.0.war /var/lib/tomcat5.5/webapps
... attendre
# vim /var/lib/tomcat5.5/webapps/nutch-1.0/WEB-INF/classes/nutch-default.xml
... remplacer la value de searcher.dir par /opt/nutch/crawl

Mais aussi modifier la sécurité de tomcat, via le fichier /etc/default/tomcat5.5 en mettant la variable TOMCAT5_SECURITY à no.
Ou bien en créant un fichier policy donnant l’accès au répertoire /opt/nutch/crawl. (c’est plus propre ;-) )

Vous pouvez ensuite redémarrer tomcat et accèder au moteur de recherche via votre navigateur sur le port 8180.

Problèmes rencontrés

Voici quelques problèmes que j’ai rencontré lors de mes tests de la version 1.0 de Nutch :

La directive merge ne fonctionne pas

Impossible de fusionner deux index, il est nécessaire de re-creer l’ensemble de l’index à chaque fois.

La directive fetch flanche

Lorsque trop nombreux sites sont choisis dans la liste des sites à parcourir par le robot d’indexation à l’aide de l’option topN, le programme produit une erreur et le segement produit est corrompu. (c’est pour cette raison que je limite le nombre de site dans un segment à 5000)

Maintenance de l’index

Une fois le moteur de recherche mise en place, il faut maintenir l’index à jours. Pour cela, j’ai mis en place un simple script de crawl avec cron qui se lance tous les soirs :

#!/bin/sh
bin/nutch generate crawl/crawldb crawl/segments -topN 5000
s1=`ls -d crawl/segments/2* | tail -1`
bin/nutch fetch $s1
bin/nutch updatedb crawl/crawldb $s1
bin/nutch invertlinks crawl/linkdb $s1

et un autre qui re-créer l’index :

#!/bin/sh
rm -rf crawl/indexes/
bin/nutch index crawl/indexes/ crawl/crawldb/ crawl/linkdb/ crawl/segments/*

Optimisation du robot d’indexation

La principale difficulté de ce projet est l’indexation d’une énorme quantité de données avec des moyens techniques très limité.
Voici donc quelques idées pour optimiser l’indexation de votre moteur de recherche.

Utiliser le serveur mandataire de votre fournisseur d’accès à Internet

Vous pouvez ajouter l’adresse du serveur mandataire de votre FAI dans le fichier conf/nutch-site.xml :

<property>
<name>http.proxy.host</name>
<value>proxy.free.fr</value>
</property>
<property>
<name>http.proxy.port</name>
<value>3128</value>
</property>

Note : On me signale dans l’oreillette, que mon FAI à fermer son proxy à cause d’une sombre histoire de Haute Autorité De l’Ouverture Postale Inopinée.

Mise en place d’un serveur DNS locale

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 ISC BIND ou bien pdnsd.

Augmentation du nombre de Threads

Vous pouvez aussi augmenter le nombre de processus utiliser par le robot d’indexation en modifiant les variables du fichier de configuration :

  • fetcher.threads.fetch : nombre de threads au total (42) ;

Pour plus d’informations, vous pouvez voir sur le wiki du projet : OptimizingCrawls.

Imposer^WIntégrer Nutch

Voici quelques astuces pour intégrer Nutch à votre architecture.

Mozilla Firefox

Pour Mozilla Firefox, le système de plugin permet d’inclure votre propre moteur de recherche.
Pour faire cela, il faut placer le fichier nutch.xml dans votre profile Firefox : ~/.mozilla/firefox/*.default/searchplugins (en remplacant par l’addresse de votre instance ) .

DNS Menteur

Vous pouvez modifier la configuration de votre DNS pour résoudre le domaine google avec l’adresse de votre moteur de recherche. (Ouais, je sais Net Neutrality, toussa ;-) ). En modifiant la feuille de style de l’interface web certains utilisateurs ne verront surement pas la diffèrence.

Est-ce bien raisonnable ?

Vous allez me dire. Héberger son propre moteur de recherche chez soit, quelle drôle d’idée ;-)
Je pousse, le concept d’Auto-hébergement au maximum, mais il est clair que j’ai fait cette article “Just for fun”, 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.

Références

Voici quelques références intéressantes sur le sujet :

Conclusion

Vous avez maintenant à votre disposition un moteur de recherche personnel.
Et vous êtes libre de rechercher des choses sans que personne ne puisse le savoir ;-)
L’étape la plus dure est de se passer de l’utilisation google ;-)
Si vous voulez aller plus loin dans le monde des moteurs de recherche libre vous pouvez intégrer Nutch avec Solr, comme décrit dans cette article : Using Nutch with Solr.
Afin d’obtenir un moteur de recherche professionnel pour une entreprise. (principalement pour éviter la fuite d’information).
Ou bien si vous si êtes intéressé par un produit similaire aux Solutions d’entreprise de Google.

Pour finir, la petite cerise sur la gâteau, comme Nutch utilise Hadoop, il scale comme un troupeau éléphants ;-)

Filed under: Debian,Network — Tags:, , , , — cscm @ 23:22

Powered by WordPress