07 février 2010

Jean-Christophe Dubacq

Les aventuriers du paquet (debian) recommandé perdu

Avez-vous déjà eu un dysfonctionnement d’un programme lié au fait qu’un paquet recommandé, que vous ne jugiez pas utile, avait été enlevé alors qu’il était, en fait, utile ?

Parce que les paquets recommandés sont maintenant installés par défaut en même temps que le paquet demandé, mais pas toujours (il y a une heuristique un peu spéciale pour ne pas tenter de réinstaller tout le temps le même paquet dont vous ne voulez vraiment pas ; pour autant que je le sache, il s’agit de ne pas installer un paquet recommandé s’il aurait dû l’être et qu’il ne l’est pas, tout simplement). Au bout d’un certain temps, ça peut être agréable (nécessaire ?) de faire un inventaire des paquets qui auraient pu être installés mais refusés à un moment donné. De plus, certaines manipulations brutales du gestionnaire de paquets peuvent mettre des paquets sur votre système et qu’il lui manque une vraie dépendance (Depends ou Pre-Depends). Même si aptitude est capable de lister les problèmes for la deuxième question (aptitude search ~i~b est grosso modo la réponse), le premier problème n’admet pas de solutions simples (les recherches avec aptitude ne permettent pas de faire la différence entre un dépendance de A ou B, et une dépendance de A et B).

J’ai donc écrit (toujours en python avec python-apt ≥ 0.7.93, donc dans unstable actuellement) un programme apt-missing.

Seules les dépendances positives ont été envisagées (Pre-Depends, Depends, Recommends, Suggests et aussi si on veut Enhances). Les dépendances négatives ne sont pas encore traitées mais là c’est la présence d’un paquet dépendant dans une clause qui doit déclencher une réaction, pas l’absence de tous les paquets de la clause.

Le programme est hébergé , et les paquets sont hébergés ici.

Exemples

Lancer apt-missing seul (comme apt-missing --recommends) :
# Package abiword has some Recommends missing:
abiword-docs
# Package defoma has some Recommends missing:
libfont-freetype-perl
# Package doc-debian-fr has some Recommends missing:
developers-reference-fr
maint-guide-fr
apt-howto-fr
# Package dwww has some Recommends missing:
swish++
[...]
# Package xchat has some Recommends missing:
tcl
## "Depends" broken in 0 packages
## "Pre-Depends" broken in 0 packages
## "Recommends" broken in 31 packages
D’ailleurs, j’ai pu ainsi localiser des modules noyaux installés qui recommandaient des noyaux absents, parce que tout simplement ils avaient disparus. J’ai donc pu les effacer. apt-missing -a cherche tous les types de dépendance positifs :
# Package a2ps has some Suggests missing:
html2ps
t1-cyrillic
# Package abiword has some Recommends missing:
abiword-docs
[...]
## "Depends" broken in 0 packages
## "Pre-Depends" broken in 0 packages
## "Recommends" broken in 31 packages
## "Suggests" broken in 377 packages

Options

-h|--help
Ce texte d’aide
-d|--depends
Depends ou Pre-Depends manquants
-r|--recommends
Recommends manquants (par défaut)
-s|--suggests
Suggests manquants
-a|--any
N’importe quelle dépendance positive (comme ci-dessus)
-t|--type=string
Dépendance quelconque (par ex. Enhances)
-p|--package=string
Liste de paquets à analyser séparés par un espace (on peut répéter l’option, et si aucune option -p n’est présente, tous les paquets sont analysés)

23:15 par Jean-Christophe Dubacq (Commentaires)

06 février 2010

Carl Chenet

Fosdem2010 : Les premières conférences


Après une arrivée tôt ce matin, nous avons rejoint les conférences du FOSDEM qui bat actuellement son plein.

La première impression : beaucoup, beaucoup de monde. Des gens calés. Des célébrités du libre un peu partout. Des tonnes de passionnés. Des développeurs Debian en kilt. Les membres de l’Afpy venus en masse. C’est aussi l’occasion de croiser des personnes avec lesquelles nous discutons sur Internet tous les jours mais ne voyons que rarement.

À chaque break, les stands des distributions et des projets phare sont pris d’assaut par des foules en manque de goodies. Les cadavres de différentes bières belges remplissent les poubelles ici et là.

Des dizaines de personnes font la queue devant la salle Mozilla qui s’annonce déjà pleine pour la conférence HTML5

La suite dans un prochain billet.

14:59 par carlchenet (Commentaires)

31 janvier 2010

Christophe Nowicki

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 possiblité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 biensû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 cablage, 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 convertiseur 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 :

Dépendances

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

# apt-get install build-essential uuid-dev libcppunit-dev libgcrypt-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.
Pour le serveur :

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

Pour le client en C++ :

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

Lancement d’OLAd

Vous pouvez lancer olad, avec un utilisateur qui disspose 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.

10:39 par cscm (Commentaires)

30 janvier 2010

David Curé

twidge le client identica et twitter en ligne de commande

Cherchant un client en ligne de commande pour IdentiCA (et accessoirement pour Twitter), j'ai découvert twidge.

Une fois essayé et adopté, j'ai backporté une version pour Debian Lenny 32 bits. Le paquet est disponible dans mon dépôt.

Bon gazouilli. 

22:21 par nospam@example.com (David) (Commentaires)

27 janvier 2010

Jean-Christophe Dubacq

Paquets et origines

Des fois, je veux vérifier d’où viennent mes paquets. C’est déjà ce que fait apt-show-versions, mais en se concentrant uniquement sur l’aspect distribution (stable/testing/unstable) et non pas sur le site d’où vient le paquet. De plus, je voulais pouvoir préciser un ordre entre les distributions (quand un paquet est à la fois dans unstable et testing, je veux qu’il apparaisse comme venant de testing; quand il est dans un dépôt local que j’ai créé, je veux qu’il apparaisse comme venant de ce dépôt, même s’il est une copie de unstable ou d’experimental).

Du coup, j’ai écrit mon premier programme (sérieux) en Python. La documentation est en anglais.

package_origins [options]

-h|--help
This help text
-l|--list
Just list available distributions
-c|--count
Just display package count by origin
-t|--tabular
Use tabular output format for origin display
-C|--columns=integer
Set the number of columns of the output
-L|--lines=integer
Set the maximal number of packages that can be displayed
-o|--order=string
Set the order in which packages are in the distributions. This is a space-jointed string of stanzas like alias1=site1/archive1 where alias1 is the display name of a distribution of name archive1 at site1.

Le programme lit aussi les dénominations dans un fichier ~/.package_origins sous la même forme, mais avec une origine par ligne. De multiples options -o peuvent être utilisées (elles sont accolées).

Un exemple de fonctionnement:

./package_origins -o 'stable=ftp.fr.debian.org/stable testing=ftp.fr.debian.org/testing unstable=ftp.fr.debian.org/unstable experimental=ftp.fr.debian.org/experimental  multimedia=www.debian-multimedia.org/unstable' -L 20 --columns 40 
,--------------------------------------.
| stable |
`--------------------------------------'
Too many packages (189). Use --tabular or --lines=X (x>=189).
,--------------------------------------.
| testing |
`--------------------------------------'
Too many packages (1529). Use --tabular or --lines=X (x>=1529).
,--------------------------------------.
| unstable |
`--------------------------------------'
Too many packages (317). Use --tabular or --lines=X (x>=317).
,--------------------------------------.
| experimental |
`--------------------------------------'
calendar-google-provider
calendar-timezones enigmail
,--------------------------------------.
| multimedia |
`--------------------------------------'
Too many packages (33). Use --tabular or --lines=X (x>=33).
,--------------------------------------.
| other |
`--------------------------------------'
emacs-snapshot emacs-snapshot-bin-common
emacs-snapshot-common emacs-snapshot-nox
fixkeyboard lipn-archive-keyring
nvidia-kernel-2.6.26-2-amd64
nvidia-kernel-2.6.30-2-amd64
nvidia-kernel-2.6.31-1-amd64
pbuilder-utils rftg rftg-data
,--------------------------------------.
| installed |
`--------------------------------------'
Too many packages (55). Use --tabular or --lines=X (x>=55).

12:45 par Jean-Christophe Dubacq (Commentaires)

24 janvier 2010

Grégory Colpart

Autres exemples de migration Etch->Lenny [1]

La fin du support officiel de Debian Etch approchant, il est grand temps de migrer vers Lenny pour les machines pas encore à jour. Après un premier exemple de migration Debian Etch->Lenny, je poursuis la série avec des informations tirées de plusieurs migrations récentes sur des serveurs en production.

Je ne rappellerais pas toutes les précautions nécessaires (tests préalables, sauvegardes, désactivations des services, etc.) ni la classique question  sur  “quand faut-il migrer ?”, vous trouverez tout cela dans mes exemples précédents. Je rappelle simplement l’idée de base : prendre les précieuses Release Notes, mettre à jour le fichier sources.list, puis exécuter les commandes aptitude update && aptitude upgradex, puis mettre-à-jour les services les plus critiques via aptitude install <PACKAGE>, et enfin aptitude dist-upgrade && aptitude dist-upgrade (répéter dist-upgrade est souvent nécessaire).

Passons désormais aux différentes remarques sur ces migrations :

- PostgreSQL : on passe de la version 8.1 à 8.3. Notez qu’il s’agit de paquets différents, il est donc possible de garder la version 8.1 en Etch, et d’installer en parallèle la version 8.3, afin de faciliter encore plus la migration. Pour migrer les données, on réalisera un dump avec pg_dumpall qui sera réinjecté dans la nouvelle base. On pourra ensuite adapter le port dans postgresql.conf pour passer la version 8.3 en production.

- phpPgAdmin : avec PostgreSQL 8.3, on ne peut plus se connecter à la table template1 : c’est le comportement par défaut de phpPgAdmin, qu’on devra donc modifier en mettant postgres à la place (pour la variable $conf['servers'][0]['defaultdb'] dans le fichier config.inc.php)

- Apache : la configuration de l’alias /icons/ est déplacé dans le fichier mods-available/alias.conf, il peut donc faire doublon avec la déclaration dans apache2.conf, ce qui sera signalé via le warning suivant : [warn] The Alias directive in /etc/apache2/apache2.conf at line 240 will probably never match because it overlaps an earlier Alias. Commenter les directives dans le fichier apache2.conf résoudra ce petit soucis.

- OpenLDAP : on passe d’une version 2.3 à 2.4, mais le plus marquant pour la migration est que cela force le processus à tourner avec un utilisateur/groupe dédié. Pour diverses raisons (dist-upgrade interrompu par exemple), on pourra rencontrer des soucis plus ou moins alarmants. Ainsi, j’ai pu rencontrer cette erreur :
bdb(dc=example,dc=com): PANIC: fatal region error detected; run recovery
bdb_db_open: database “dc=example,dc=com” cannot be opened, err -30978. Restore from backup!
backend_startup_one: bi_db_open failed! (-30978)
slap_startup failed
On veillera donc sur l’utilisateur/groupe propriétaire des fichiers dans le répertoire /var/lib/ldap et, au besoin, on ajustera : chown -R openldap:openldap /var/lib/ldap/
Mon conseil : mettre-à-jour le paquet slapd de façon spécifique avant le dist-upgrade

- Postfix : on passe de 2.3 à 2.5. On notera simplement la valeur par défaut de $smtp_line_length_limit characters qui passe à 990, ce qui coupe les lignes trop longues pour se conformer au standard SMTP. Si cela posait problème, on pourrait revenir à l’ancien comportement en positionnant smtp_line_length_limit=0

- SpamAssassin : l’utilisant en stockant la configuration des utilisateurs dans un annuaire LDAP, le daemon spamd s’est mis à râler : cannot use –ldap-config without -u
Le problème sera résolu en ajoutant l’option -u nobody, ce qui fera tourner spamd en tant que nobody (ce qui n’est pas une mauvaise chose, au contraire).

- Amavis : apparemment, lors de la détection d’un virus, le code retourné n’est plus 2.7.1 mais 2.7.0 : 2.7.0 Ok, discarded, id=13735-07 – VIRUS: Eicar-Test-Signature
Rien de bien grave, mais cela a nécessité d’adapter un plugin Nagios pour qu’il attende le bon code de retour.

- Courier-imapd-ssl : après une mise-à-jour gardant mon fichier /etc/courier/imapd-ssl actuel, j’obtenai des erreurs avec certains clients IMAP :
couriertls: accept: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
En regardant de plus près, certaines directives changent dans ce fichier de configuration, et il est donc conseillé de repartir du fichier proposé par Lenny, et d’y apporter ses modifications (souvent, cela se limite à préciser le certificat).

- Horde : si vous utilisez une base de données pour stocker les paramètres ou autres, la paquet php-db (déjà en Recommends: en Etch) est d’autant plus nécessaire, sous peine d’obtenir l’erreur : PHP Fatal error:  _init() [<a href='function.require'>function.require</a>]: Failed opening required ‘DB.php’ (include_path=’/usr/share/horde3/lib:.:/usr/share/php:/usr/share/pear’) in /usr/share/horde3/lib/Horde/DataTree/sql.php on line 1877

- Sympa : on attaque là le cauchemard de mes migrations. À chaque fois, tellement de soucis majeurs et mineurs, que j’ai l’impression d’être le seul à utiliser ce paquet. Voici en vrac tous les soucis rencontrés : les accents dans les descriptions ont sautés (une sorte de double encodage) et cela a nécessité des corrections manuelles, la table logs_table doit être créée à la main (j’utilise Sympa avec PostgreSQL), et enfin une typo surprenante un “GROUP BY” à la place d’un “ORDER BY” (j’ai ouvert le bug #566252 à ce sujet).

- Asterisk : on passe de la version 1.2 à la version 1.4. Lors de la migration, j’ai constaté un bug étrange, le fichier modules.conf qui charge les modules additionnels a disparu. Du coup, sans lui, Asterisk ne charge pas les modules nécessaires (SIP, etc.). Il a donc fallu le restaurer.

- udev : le meilleur ami des sysadmins (ou pas). Si les migrations douloureuses Sarge->Etch sont loin derrière nous, il reste néanmoins quelques blagues. La dernière en date a été un renommage des interfaces réseau : eth0->eth1 et eth1->eth2. Classique mais étonnant, ce genre d’humour est sensé être dépassé grâce aux “persistent rules” qui nomment les interfaces en fonction de l’adresse MAC. À rester vigilant sur ce point avant le redémarrage donc.

Voilà pour les remarques. Vous noterez que je n’ai pas abordé le noyau Linux. C’est parce que pour la majorité de nos serveurs, ils sont gérés de façons spécifiques (au lieu d’utiliser les noyaux officiels Debian). Ainsi, ils restent dans leur version actuelle (2.6.31 à cette heure) pendant la migration. Bien sûr, cela n’empêche pas d’effectuer un redémarrage de la machine suite à la mise-à-jour : cela permet de s’assurer que tout est bien en place et le sera toujours après un éventuel redémarrage d’urgence.

Rendez-vous pour de prochaines migrations !

18:05 par Gregory Colpart (Commentaires)

23 janvier 2010

Carl Chenet

Reportbug vs Launchpad


Suite à ce commentaire sur mon billet précédent concernant Reportbug, j’ai pensé devoir développer un peu une réponse.

Launchpad, jusqu’à très récemment, était un logiciel propriétaire. L’année dernière, il a été finalement libéré par Canonical. C’est selon moi une bonne chose, et on en avait tellement parlé que je ne m’y attendais plus vraiment. Après tout Canonical est une entreprise et le but d’une entreprise intrinsèquement est de faire de l’argent, les considération éthiques n’ayant généralement dans les entreprises qu’un poids très restreint.

Bien, donc Reportbug face à Launchpad ? Il y a moins d’un an j’aurais répondu que comparer un logiciel libre et un logiciel privateur est par essence un exercice biaisé et quasi inutile. L’un appartient au patrimoine de l’humanité et l’autre à une entreprise qui peut en faire ce qu’elle veut et dont le but est de faire de l’argent. Je vais donc parler un peu de Reportbug (que je contribue à développer, les lecteurs réguliers de ce blog sont au courant) qui, lui, est un logiciel libre depuis sa naissance et depuis des années l’une des briques logicielles les plus importantes de Debian. Nous arrivons bientôt à 570000 rapports de bugs (qui peuvent aussi être des demandes d’amélioration). Reportbug offre ses services principalement en mode texte et en mode graphique (GTK2) aux utilisateurs. Comme je l’ai dit dans mon précédent billet, chaque rapport de bug est (potentiellement si le rapport est recevable) le début d’un mouvement au sein de Debian. Considérant le travail de Debian qui met en place une distribution multi-noyaux (Linux et le noyau de FreeBSD aujourd’hui gérés) et multi-architectures (un grand nombre est officiellement supporté), on peut facilement comprendre que toucher à l’outil qui est au coeur de l’organisation et du suivi de ce travail est une opération très délicate. Et pourtant Reportbug ne cesse d’évoluer, supporte de nouvelles options et travaille à satisfaire les désirs parfois contradictoires et souvent pointilleux de ses utilisateurs.

De fait Debian fonctionne grâce à l’e-mail, le courrier électronique et l’IRC étant les deux canaux de communication principaux des utilisateurs et développeurs de Debian. Reportbug s’appuie donc sur l’e-mail, qui s’avère avoir des avantages non négligeables pour une organisation à la communication largement asynchrone (il est rare d’avoir une réponse à ses questions dans la minute, qu’on soit développeur ou utilisateur) et décentralisée comme Debian.

Je pense avoir donné ici des pistes qui permettent de comprendre que Reportbug satisfait très bien ses utilisateurs et n’a pas de problème d’ergonomie, sauf à considérer que tout ce qui n’est pas une appli Web n’est pas ergonomique, argument pour le moins spécieux. Launchpad fait sûrement très bien son travail et est digne d’intérêt depuis sa libération. Reportbug fait également très bien son travail et soutient le travail journalier des acteurs de Debian, la distribution grâce à laquelle Canonical et Ubuntu vivent et (je leur souhaite) continueront à vivre longtemps.

22:08 par carlchenet (Commentaires)

Tuxicoman

Solutions Linux 2010

Le salon Solutions Linux ouvre ses portes le 16,17,18 mars 2010 au parc des expositions de Versailles. Apparement dans le grand hall 1 !

C'est l'occasion de parcourir les stands des grands noms de l'écosystème Linux, mais aussi ceux du village associatif.

Réserver vos badges gratuits dès à présent.

11:23 par Tuxicoman (Commentaires)

15 janvier 2010

Florent Gallaire

Smartphones Linux : le point du dev

Un petit point sur le hardware et le software disponibles pour un développeur libre qui voudrait utiliser un smartphone et développer dessus.

Il existe trois plateformes basées sur Linux (je n’écris volontairement pas GNU/Linux car si Android utilise bien le noyau Linux, il n’utilise pas pour autant les outils GNU) :

Maemo :

Maemo est censé, chez Nokia, remplacer Symbian qui est dépassé technologiquement pour les nouveaux usages mobiles. Après avoir été expérimenté (trop) longuement (depuis 2005 !) sur les tablettes N770, N800 et N810, il est enfin disponible sur un téléphone : le N900, depuis novembre 2009.

Or, si le N900 est disponible, il utilise la plateforme Maemo 5 qui va disparaitre et aucun smartphone n’est disponible sous Maemo 6. Je ne lancerai donc pas une énième fois le troll GTK (Maemo 5) vs Qt (Maemo 6) qui n’a juste pas lieu d’être : Maemo n’est pas dans la course. Et à la vitesse où va cette course, il ne parviendra peut-être jamais à y rentrer.

Je ne m’étendrai pas sur Maemo car je veux à la fois développer des applications  que je puisse  tester,  et que d’autres puissent utiliser, et il faut pour cela pouvoir se procurer un smartphone adapté, et ne pas m’investir dans une plateforme en fin de vie. De plus, le fait que Maemo utilise Xorg le rend techniquement contestable, tant la complexité et la lourdeur inhérentes à X11 sont malvenues sur un smartphone.

Android :

Du côté d’Android c’est une toute autre histoire. Des smartphones sont disponibles depuis octobre 2008 aux États-Unis et mars 2009 en France. Au niveau commercial c’est déjà une grande réussite : Android est la plateforme qui progresse le plus et s’est imposé en un an comme le principal (le seul ?) challenger de l’iPhone (voir les statistiques d’AdMob pour plus de détails).

D’un point de vue technique, Android fournit un SDK basé sur le langage de programmation Java. Cependant, il ne repose pas sur la JVM de Sun, mais sur Dalvik, une machine virtuelle à registres (comme Parrot) spécialement développée pour les contraintes hardware (mémoire faible, processeur peu puissant…) de l’embarqué. Dalvik est à ma connaissance la seule machine virtuelle à registres qui soit un succès industriel, face à la masse des machines virtuelles à pile (JVM de Sun, CLR de Microsoft…).

Mais que peut-on faire si on ne veut pas programmer en Java ? Les développeurs ont souvent un langage de programmation favori, qu’ils ont peu ou pas envie d’abandonner ; dans mon cas c’est PythonOn pense alors naturellement aux implémentations des langages écrites en Java, Jython pour Python ; mais si elles fonctionnent sur la JVM de Sun, ce n’est pas forcément le cas pas sur Dalvik ! Heureusement, Google a pensé à nous avec ASE, l’Android Scripting Environment, qui permet d’utiliser l’ensemble des API Android à partir de différents langages interprétés, et le choix est vraiment grand : Python, Lua, Perl, Ruby, JavaScript, BeanShell et même shell !!

Tous les langages ne sont pas égaux devant ASE. Les langages natifs, c’est-à-dire écrits en Java, comme Ruby basé sur JRuby, JavaScript basé sur Rhino ou encore BeanShell, peuvent théoriquement accéder directement aux API Java natives, alors que les langages “cross-compilés”, comme Python (basé sur CPython) ou Lua qui sont écrits en C, ne peuvent procéder que par des appels JSON RPC. C’est cependant cette dernière méthode qui semble conseillée quel que soit le langage utilisé.

Je suis donc maintenant motivé pour me lancer dans l’aventure Android, d’autant que Google vient d’anoncer, lors d’une conférence de presse le 5 janvier, le lancement de son premier smartphone : le Nexus One fabriqué par HTC. C’est tout simplement une “bête de course” du point de vue hardware : processeur à 1 Ghz, 512 Mo de RAM et un écran 3,7″ d’une résolution de 480*800 (pour rappel l’iPhone 3GS fonctionne à 600 Mhz avec 256 Mo de RAM et un écran 3,5″ en 320*480) !!! La disponibilité du Nexus One en France est prévue pour le mois de mars.

J’hésite cependant encore avec le Motorola Milestone, qui a lui l’avantage d’être déjà disponible et de posséder un clavier physique, ce qui pourrait se révéler bien pratique pour des sessions d’administration de machines par SSH, avec le terminal en plein écran !

webOS :

Il y a un an, lors du CES de janvier 2009, Palm avait créé l’évènement avec l’annonce du Palm Pré et de son nouveau système d’exploitation : webOS. Les critiques avaient été très élogieuses et l’on a même pensé que l’on tenait là le principal concurrent de l’iPhone. En effet, webOS est le seul système alternatif  à proposer les mêmes facilités multitouch que l’iPhone (il semblerait que sur ce sujet, Palm et Apple se tiennent par la barbichette des brevets logiciels). La qualité et la simplicité de l’ergonomie étaient aussi tout à fait remarquables, et le design très “sexy”.

Le Palm Pré a été introduit au États-Unis le 6 juin, et les ventes ont été bonnes. Mais tout cela s’est un peu essouflé car Sprint, l’opérateur exclusif aux USA, est semble-t-il en perte de vitesse, et le Palm Pré n’a pas été commercialisé dans beaucoup d’autres pays : il n’est par exemple toujours pas disponible en France. Seule nouveauté depuis un an, l’introduction d’un nouveau modèle moins puissant visant l’entrée de gamme des smartphones, le Palm Pixi.

Et puis voilà à nouveau que, lors de la présentation du 7 janvier au CES, Palm fait des annonces tonitruantes ! D’abord l’arrivée de deux nouveaux modèles : le Palm Pré Plus et le Palm Pixi Plus, qui proposent de grandes améliorations matérielles. Le Palm Pré voit sa capacité de stockage et sa RAM doublées, à 16 Go et 512 Mo respectivement, tandis que le Palm Pixi n’est plus castré des possibilités Wi-Fi que l’on peut légitimement attendre d’un smartphone, fût-il d’entrée de gamme. Et ces deux modèles seront disponibles en France au début du second trimestre.

Ensuite, le programme pour développeur, qui permet de fournir ses applications via le App Catalog officiel de Palm (équivalent du célèbre App Store d’Apple) est maintenant ouvert à tous. Mais ce n’est pas tout, un programme spécial pour les développeurs Open Source existe, qui offre comme avantage d’économiser les 99$ de cotisation annuelle (en ce moment offerts à tous) et les 50$ par application soumises au App Catalog. De plus, Palm montre sa compréhension des logiciels libres, car l’on peut tout à fait commercialiser ses applications libres, et il n’y a aucune discrimination, comme pour les applications propriétaires c’est 70% du prix pour le développeur (comme sur l’App Store).

Développeur qui pourra désormais programmer de vrais jeux exploitant tout la puissance du la puce graphique, grâce à la mise à disposition d’un nouveau SDK spécialement destiné au jeux : le Plug-in Development Kit. Ce dernier est basé sur l’excellente et très utilisée librairie SDL, véritable standard des logiciels libres. Le PDK est censé être programmé en C ou en C++, mais il existe des bindings SDL pour un nombre de langage de programmation très impressionnant, et j’ai du mal à voir ce qui pourrait m’empêcher d’utiliser sous peu Pygame pour programmer des jeux en Python !

Pour ce qui est des applications plus classiques, Palm propose désormais un IDE fonctionnant dans votre navigateur web : Project Ares. On pourra saluer la cohérence technologique qui permet de faire aisément cela puisque l’ensemble du SDK Palm est construit à base  de technologies web, et espérer que cela permettra de faciliter l’accès à la programmation webOS au plus grand nombre.

Enfin, pour motiver les développeurs à se lancer et ainsi remplir son App Catalog, Palm propose le concours Hot Apps doté d’un million de dollars à partager entre les applications les plus téléchargées du 1er février au 31 mai.

Sur le front des smartphones Linux est là et bien là, en position de force, prêt à exterminer les systèmes d’exploitation privateurs de liberté Windows Mobile et BlackBerry OS et à mener le grand combat final contre l’iPhone !

06:05 par fgallaire (Commentaires)

12 janvier 2010

Carl Chenet

Importance des rapports de bugs


Note à moi-même pour la nouvelle année : dès que je constate un bug sur un logiciel dans ma distribution préférée, j’ouvre un rapport de bug immédiatement et surtout pas un lendemain hypothétique.

Comme le souligne cette note à propos de Firefox, les rapports de bugs sont fondamentaux pour le maintien en vie et l’amélioration de la qualité dans le monde des logiciels libres. Certains bugs sont vicieux, difficiles à reproduire. La plupart sont très simples à mettre en avant.

Dans tous les cas, la participation des utilisateurs qui découvrent ces bugs est précieuse. Rapporter un bug est le début et la condition sine qua none de la résolution du bug. Même si vous avez l’impression que ce bug est tellement gros qu’on doit avoir fait le travail avant vous, il est nécessaire de le déclarer. Dans l’idéal vous jeterez un œil aux bugs existants avant d’ouvrir votre rapport mais dans tous les cas, rédigez des rapports de bugs.

Utilisateur averti ou programmeur chevronné, acquérir cette bonne habitude est la garantie d’enrichir de votre expérience les logiciels que vous utilisez au quotidien.

Sous Debian, l’outil pour rédiger des rapports de bug est Reportbug. Une quinzaine de minutes suffit à le prendre en main, pour rédiger et envoyer votre premier rapport. Ne vous en privez pas, vous contribuerez directement par ce moyen à Debian.

00:46 par carlchenet (Commentaires)

11 janvier 2010

Christophe Nowicki

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 ;-)

22:22 par cscm (Commentaires)

04 janvier 2010

Carl Chenet

Bonne année !


C’est le moment traditionnel d’annoncer ses bonnes résolutions pour l’année à venir. Pour ne pas déroger à la tradition, voici ce à quoi je vais essayer de me tenir :

  • Continuer à développer mes activités dans Debian. Je gère 11 paquets à ce jour, majoritairement des petits projets prometteurs écrits en Python et souhaite intégrer encore quelques nouveautés. J’avais suspendu mon travail sur Reportbug et vais tâcher de m’y remettre dès cette semaine.
  • Communiquer davantage sur mon travail dans les logiciels libres, et ce afin de permettre une plus grande visibilité des petits projets que j’essaie de promouvoir au sein de Debian.
  • Apprendre un nouveau langage. Je m’intéressais de façon intermittente au Haskell et je vais essayer de faire l’effort cette année pour acquérir une réelle maîtrise du langage.

Sur ce, je vous souhaite encore une très bonne année 2010 à tous !

Ps :

Si vous souhaitez me rencontrer là-bas, laissez-moi un message dans les commentaires.

18:38 par carlchenet (Commentaires)

03 janvier 2010

Carl Chenet

Bélier dans GNU/Linux magazine France


Bonjour à tous,

Un article détaillant le fonctionnement de Bélier, l’outil d’automatisation de connexions SSH complexes, est paru dans le numéro 123 (janvier 2010) de GNU/Linux Magazine France (GLMF pour les initiés).  Un bon moyen de découvrir les possibilités offertes par ce programme autrement que par la documentation officielle.

À bientôt

11:56 par carlchenet (Commentaires)

29 décembre 2009

Shams Fantar

Des commandes bash pures et dures

Je trouve que beaucoup d'utilisateurs de bash ne connaissent pas certaines astuces utiles liées à des commandes usuelles, parce qu'elles ne sont pas assez mises en avant dans les documentations. Nous allons donc voir ici quelques commandes/astuces bash que tout le monde ne connait pas.

Les expressions : utlisation de "?" :

  • Afficher tous les répertoires/fichiers comportant un seul caractère après le point :
ls *.? # ajoutez autant de "?" que vous souhaitez (??? pour trois caractères)
  • Afficher tous les répertoires/fichiers comportant 5 caractères :
ls ? # adaptez le nombre de "?"
  • Afficher tous les fichiers/répertoires dont le nom débute par "a" ou "b" :
ls [ab]* # vous pouvez remplacer les lettres, et même en ajouter/supprimer

Redirections :

  • Rediriger les erreurs renvoyées par une commande :
macommande 2> erreur.file # vous pouvez faire 2>> pour ne pas écraser le erreur.file si il existe
  • Rediriger les erreurs renvoyées par une commande vers "nul part" :
macommande 2> /dev/null
  • Rediriger le résultat d'une commande dans un fichier qui n'existe pas :
 ls | tee my_file

ou

 ls > my_file
  • Rediriger le résultat d'une commande dans un fichier qui existe (on veut concaténer) :
 ls | tee -a my_file

ou

 ls >> my_file
  • Rediriger le résultat de plusieurs commandes dans un fichier, en restant dans le shell courant :
(cd /root/ ; pwd ; ls) > file
  • Rediriger le résultat de plusieurs commandes dans un fichier, en allant dans /root :
{ cd /root/ ; pwd ; ls ;} > file

Voilà globalement des astuces bien utiles mais trop peu utilisées !

19:05 par Scurz

Jérémy Verda

Simple Scan : Numériser simplement sous GNU/Linux

Comme son nom l’indique, Simple Scan est une interface toute simple pour numériser vos textes et images sous GNU/Linux. Il s’agit d’une sur-couche à Sane (votre scanner devant donc être détecté par ce dernier pour fonctionner) mais qui se veut plus simple que Xsane. Il dispose cependant de bien moins d’options que ce dernier, mais fais très bien son travail.

Il vous propose la numérisation en mode texte ou en mode image. Une fois votre document numériser, il vous permet de le recadrer, de le sauvegarder ou bien de l’envoyer directement par e-mail via votre logiciel par défaut.

Cliquez sur l’image pour l’agrandir.

En bref, un logiciel qui fait le travail qu’on lui demande sans poser trop de questions.

Idéal lorsqu’on désire rapidement numériser un document, mais moins lorsqu’on désire peaufiner toute une série d’option.

Pour plus d’information au sujet de Simple Scan, cela ce passe sur cette page du launchpad.


Article écrit par Jérémy Verda et sous licence Creative Commons BY-NC-SA.

Tags:, , , ,

16:37 par Jérémy (Commentaires)

09 décembre 2009

Christophe Nowicki

Notifications Nagios par Téléphone

J’ai configuré mon instance de Nagios pour recevoir une notification par téléphone en cas d’incident. (déclenchement d’une alarme ou d’un détecteur d’eau / fumée dans mon installation domotique).

Ce billet décrit comment mettre en place un système de la notification par téléphone avec Nagios.

Pré-requis

Vous avez besoin des composants suivants :

  • Une distribution Debian GNU/Linux ;
  • Une installation fonctionnelle de Nagios ;
  • Une PABX IP avec le support du protocole SIP, comme Asterisk ;
  • Un système de Synthèse vocale fonctionnelle, comme eSpeak + MBROLA ;
  • Un client SIP en ligne de commande comme PJSUA.

Installation

Le client SIP en ligne de commande PJSUA n’est pas disponible dans les paquets du projet Debian.
Il est donc nécessaire de l’installer manuellement à l’aide du classique : configure, make, make install.
La procédure est décrite dans ce billet : Un client SIP en ligne de commande.

Pour l’installation du système de synthèse vocale, vous pouvez vous référer à mon précèdent billet sur le sujet : Text-to-Speech avec eSpeak, MBROLA et Speech Dispatcher.

Configuration

Vous devez créer un compte SIP pour Nagios sur votre PABX et tester que l’enregistrement est fonctionnel.

Pour cela vous avez besoin d’un fichier de configuration spécifique à Nagios pour PJSUA, dans /etc/nagios/sip.cfg par exemple :

--id sip:nagios@pabx.csquad.lan
--registrar sip:pabx.csquad.lan
--realm *
--username nagios
--password secret

Vous pouvez ensuite tester l’enregistrement en ligne de commande :
$ pjsua --config-file /etc/nagios/sip.cfg
...
11:17:05.376 pjsua_acc.c sip:nagios@pabx.csquad.lan: registration success, status=200 (OK), will re-register in 300 seconds

Un appel de test :
$ pjsua --config-file /etc/nagios/sip.cfg --null-audio sip:secretariat@pabx.csquad.lan

Ensuite un appel de test audio avec un message :
$ espeak -v mb/mb-fr1 "E.T. téléphone maison" | /usr/local/bin/mbrola /usr/share/mbrola/fr1/fr1 - test.wav
$ pjsua --config-file /etc/nagios/sip.cfg --play-file=test.wav --auto-play --null-audio sip:secretariat@pabx.csquad.lan
$ rm -f test.wav

On met le tout dans un petit script expect pour prendre en charge la déconnections de manière polie :

#!/usr/bin/expect --
set timeout 45
set addr [lindex $argv 0]
set text [lindex $argv 1]
exec /usr/bin/espeak -v mb/mb-fr1 $text | /usr/local/bin/mbrola /usr/share/mbrola/fr1/fr1 - /tmp/phone-call.wav;
spawn /usr/local/bin/pjsua --app-log-level=3 --config-file /etc/nagios/sip.cfg --play-file /tmp/phone-call.wav --auto-play --null-audio --max-calls 1 sip:$addr
expect {
"DISCONNCTD" {
exit
}
timeout {
send "h\n"
exit
}
eof {
exit
}
}

Et voilà ;-)

Il ne nous reste plus qu’à configurer ce type de notification dans Nagios.
Pour cela, il faut modifier le fichier contacts.cfg :
# 'nagios-phone' contact definition
define contact{
contact_name nagios-phone
alias Nagios Admin via Phone
service_notification_period 24x7 ; mouahahahahahaha
host_notification_period 24x7 ; moiahahahahahahah
service_notification_options w,u,c,r
host_notification_options d,u,r
service_notification_commands notify-by-phone
host_notification_commands host-notify-by-phone
email sip:secretariat@pabx.csquad.lan
}

Puis le fichier misccommands.cfg :
# 'notify-by-phone' personnal command definition
define command{
command_name notify-by-phone
command_line /usr/local/bin/phone-call.sh $CONTACTEMAIL$ "$NOTIFICATIONTYPE$ alert - $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$"
}
# 'host-notify-by-phone' personnal command definition
define command{
command_name host-notify-by-phone
command_line /usr/local/bin/phone-call.sh $CONTACTEMAIL$ "Host $HOSTSTATE$ alert for $HOSTNAME$!"
}

Ensuite, vous pouvez définir nagios-phone comme un contact pour des services ou hosts.

Il faut aussi modifier la valeur de la variable notification_timeout dans le fichier de configuration nagios.cfg, pour avoir le temps de décrocher le téléphone et d’en tendre le message.

Conclusion

Vous n’avez plus aucune excuse pour ne pas brancher vos esclaves^Wéquipe d’administrateurs systèmes directement sur le système de surveillance de vos serveurs ;-)

Plus sérieusement, la notification par téléphone est une méthode très intrusive. Il est nécessaire de décrocher le téléphone. Il faut donc l’utiliser avec parcimonie.

19:39 par cscm (Commentaires)

08 décembre 2009

Shams Fantar

Faire du multi-écrans avec xrandr

Vous allez voir dans cet article comment utiliser deux écrans affichant la même chose avec un même écran (c'est ce que nous appellons le "multi-écrans"). Nous allons utiliser xrandr, ce dernier est normalement déjà sur votre système.

Hypothèses : vous avez un pc portable (ou de bureau) avec un écran, et vous souhaiteriez y ajouter un second écran affichant les mêmes choses. Tout peut être fait en tant que simple utilisateur.

Obtenir des informations sur l'écran de votre pc portable :

xrandr

Voici la sortie de la commande :

$ xrandr 
Screen 0: minimum 320 x 200, current 1280 x 1024, maximum 1600 x 1600
VGA disconnected (normal left inverted right x axis y axis) 338mm x 270mm
LVDS connected 1280x800+0+0 (normal left inverted right x axis y axis) 331mm x 207mm
  1280x800       60.0*+   60.0  
  1280x768       60.0  
  1024x768       60.0  
  800x600        60.3  
  640x480        59.9  
TV disconnected (normal left inverted right x axis y axis)

LVDS : ceci représente l'écran du pc..
VGA : ceci représente le second écran (pas encore branché).

Ajouter le second écran :

Nous allons ajouter le second écran. Le premier et le second n'ont pas la même résolution (dans mon cas). Je dois donner deux résolutions différentes aux écrans. A noter que vous ne pouvez ajouter que les résolutions indiquées avec la commande "xrandr". Une commande suffit :

xrandr --output VGA --mode 1280x1024 --output LVSD --mode 1280x768

Détails :

--output VGA --mode 1280x1024

Ceci est pour la résolution du second écran.

 --output LVSD --mode 1280x768

Ceci est pour la résolution de l'écran du pc.

Ajouter des résolutions (c'est possible !) :

Si la résolution que vous voulez n'est pas disponible, vous devez ajouter un "mode", lisez cet article (en) pour plus d'informations.

Déconnecter un écran :

Si vous ne voulez pas utiliser l'écran du pc :

xrandr --output VGA --mode 1280x1024 --output LVDS --off

Et pour le second écran :

xrandr --output LVDS --mode 1280x768 --output VGA --off

Logiciel graphique :

Un logiciel avec une interface graphique pour gérer tout cela est disponible : lxrandr.

14:43 par Scurz

01 décembre 2009

Eric Veiras Galisson

sixth sense: quand le réel et le virtuel se mêlent...

tout simplement énorme et bientôt disponible en open source

à voir sur le site de TED [via blendernation]

je vous l’avais dit : É-NOR-ME !

06:44 par er:k (Commentaires)

24 novembre 2009

Benoit Peccatte

Back to the trees

I'm back ! Pour ceux qui suivent, les vacances c'était sympa. Allez au Vietnam, vous verrez, c'est beau et pas cher.

Aujourd'hui, comme à chaque fois que je sens que je n'avance pas trop, je vais faire une liste de sujets que j'aurais aimé traiter mais dont je sais pour lesquels je ne trouverai pas le temps et le courage d'écrire un article, j'essaie donc de vous fournir un lien intéressant à la place.

Sujet non traités :

Lectures intéressantes :

Pas d'article parce que sujet trop naze :

Tags:,

17:35 par peck (Commentaires)

19 novembre 2009

Florent Gallaire

Google Chrome OS

Aujourd’hui à 19 heures, heure de Paris, Google a enfin livré les informations techniques de son Google Chrome OS basé sur GNU/Linux.

chromeOS

Le système est, on n’en sera pas surpris, totalement orienté “Web”:

  • toutes les applications ChromeOS sont des Webapps, en fait l’interface de Chrome OS est principalement le navigateur web Chrome en plein écran.
  • toutes les données sont “in the cloud”, l’avantage étant que la défaillance ou la perte de son ordinateur n’a aucune incidence sur l’utilisateur, il lui suffit d’en prendre un autre et tout recommence de manière transparente ; par contre on est bien sûr en plein dans l’évolution vers une informatique “à la Big Brother”.

Le boot ultra-rapide est une spécificité importante : 7 secondes pour arriver à l’écran de login, puis 3 secondes supplémentaires pour l’accès au bureau fonctionnel.

Il semble qu’un grand travail ait été accompli sur les problématiques de sécurité, notamment sur le processus de boot et la stratégie des droits d’écriture de la partition racine.

Google Chrome OS ne permettra pas de base de faire fonctionner les applications Android : “tout est webapp”, et supportera les processeurs X86 et ARM.

Bien sûr comme c’est un logiciel libre, chacun peut décider de rajouter les fonctionnalités manquantes au code source !

L’annonce officielle sur le blog de Google.

19:54 par fgallaire (Commentaires)

16 novembre 2009

Shams Fantar

Logiciels de surveillance

Quelques noms de logiciels pour surveiller votre serveur :

  • munin (graphiques) ;
  • cacti ;
  • monit : surveillance ;
  • vnstat(-gui) : quantité de données passant par votre interfaces réseaux
  • mailgraph : graphiques qui donnent des stats sur les emails ;
  • nagios : surveillance complète ;
  • pflogsumm : surveillance des mails ;
  • smartctl : surveillance de vos disques dur ;
  • logwatch

17:55 par Scurz

15 novembre 2009

Rodolphe Quiédeville

Paquet debian pour pgtune

Le paquet debian pour pgtune est finit et uploadé sur les serveurs FTP. Vous pouvez suivre son évolution au travers du bug report ITP #553975. La file d'inclusion de nouveaux paquets est assez chargée ces temps-ci, cela va peut-être prendre plusieurs jours pour voir le paquet apparaître dans SID. Je laisse le paquet disponible dans mentors le temps de son inclusion.

17:46 par Rodolphe Quiédeville (Commentaires)

14 novembre 2009

Jérémy Verda

Installation d’une Debian sur l’EeePC 1005HA-H

J’ai fait récemment l’acquisition d’un EeePC 1005HA-H. Celui-ci m’a été livré avec Windows Seven Starter (je pourrais largement “troller” sur cette version mais bon ce n’est pas le sujet) et un disque dur de 250Go. J’ai bien entendu voulu installer Debian sur ce dernier mais tout en réalisant un dual boot avec Seven.

Je me suis donc renseigné pour voir comment Debian supportait ce modèle et bonne nouvelle, ce dernier est vraiment bien géré. On retrouve toutes les touches de fonctions, la mise en veille et l’hibernation. Ainsi que le support réseaux et de la carte graphique. Et ce sans devoir fouiller sur Google pour trouver de bon tutoriels, en effet, tout est utilisable directement après l’installation.

J’ai voulu faire l’installation sur base d’une Squeeze (actuelle Testing) pour ensuite passer après configuration sur une Sid/Exp. Cela me permettra aussi de voir ce que la Testing a dans le ventre. Avant de débuter l’installation j’ai effectué un partitionnement comme suis : une partition pour Seven (environ 50Go, une partition de données pour avoir accès depuis les deux OS et une partition en ext4 pour Debian d’environ 60Go). J’ai aussi vérifié si Grub2 (qui est le loader par défaut sur Squeeze) et le loader de Windows Seven ne rentrait pas en conflit mais aucun soucis. Ensuite j’ai suivi le tutoriel (en anglais) du wiki Debian dédié à l’installation sur ce modèle d’EeePc et j’avais même mis en favoris la page suivante pour avoir les dernières astuces au cas où, mais ce ne fut pas nécessaire.

Au final, j’ai un EeePc sous Debian avec toutes les fonctions du netbook que je peux retrouver sous Windows tout en étant sur un OS libre et avec une consommation mémoire d’environ 10% là où j’atteins minimum 30 à 40% sous Seven. En clair, j’en suis pleinement satisfait !

Vous pourrez trouver un test de l’EeePC 1005HA-H sur Blogeee.net et quelques astuces sur le wiki Debian à cette page.


Article écrit par Jérémy Verda et sous licence Creative Commons BY-NC-SA.

Tags:, , ,

16:48 par Jérémy (Commentaires)

06 novembre 2009

Sylvain Derosiaux

Créer une image ISO Debian avec les firmwares non libres

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’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’installateur Debian demande de fournir ce dernier via une clé USB, c’est bien mais je souhaitais sauter cette étape, c’est pourquoi j’ai développé un petit script s’occupant d’intégrer directement dans l’image ISO les firmwares non libres disponibles dans la section « non-free ». Voici le script pour les intéressés :

#!/bin/bash

#//////////////////////////////////////#
# Affiche l'aide du script             #
#                                      #
# @stdout Aide d'utilisation du script #
#//////////////////////////////////////#
usage(){
 echo "Usage : $0 <architecture> (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(){
    [[ -z $(which ar) || -z $(which genisoimage) || -z $(which wget) || -z $(which tar) || -z $(which zcat) || -z $(which cpio) ]] && return 1 ;
}

#////////////////////////////////////////////////////////////////////////#
# 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 ]] && {
 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/^<li><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' &> /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 &> /dev/null
 cp -a $2/lib/firmware .
 find . -print0 | cpio -0 -H newc -o 2> /dev/null | gzip -c > $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 {} \; > 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 &> /dev/null
}

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

[[ $# < 1 ]] && usage && exit 1
ARCH=$1

! is_root && {
 echo 'Ce script a besoin des droits root !' >&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 ]] && {
 echo "Erreur : l'image ISO netinstall de l'architecture « $ARCH » n'a pas été trouvée." >&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

Liens :

19:53 par Sylvain (Commentaires)

01 novembre 2009

Shams Fantar

Debian et le wifi

Je vais vous expliquer ici comment installer et utiliser une clé wifi sous debian. L'installation en elle-même n'est pas très compliquée, mais il y a quelques problèmes qui peuvent arriver.

Tout d'abord, il faut installer les bonnes applications, dont wireless-tools et les bons pilotes. Pour ma part, il me faut le pilote rt73, pour l'installer et le charger (via modprobe), j'ai suivi cette documentation.

Vous devez chercher par vous-même quel pilote vous devez installer en fonction de votre clé wifi (c'est presque du cas par cas).

Donc voici le cas étudié : vous avez un réseau wifi nommé "mynetwork" accessible avec une clé WEP (12345). Votre clé wifi a pour nom wlan1 (cela peut être wlan0).

I - Utilisation

Donc après avoir chargé le pilote (le votre) :

 modprobe rt73 #remplacer rt73

Ensuite, il faut se connecter au réseau :

 iwconfig wlan1 essid mynetwork

Il faut ensuite entrer la clé WEP (si il n'y aucune clé wep, passez cette étape)

 iwconfig wlan1 key 12345

Nous allons ensuite nous attributer une IP statique (pour une IP via DHCP, faites dhclient wlan1) :

 ifconfig wlan1 192.168.1.18

Puis (dans mon cas j'ai eu des soucis de route), on peut indiquer la route vers le routeur (ou le point wifi) :

 route add default gw 192.168.1.1 wlan1

Puis il faut se réattribuer l'IP statique :

 ifconfig wlan1 192.168.1.18

Nous verrons plus tard comment automatiser toute cette procédure.

II - Problèmes rencontrés :

Si vous passez entièrement par la ligne de commande, alors je vous déconseille d'avoir network-manager installé ! Il peut être la source de problèmes. Avec wpa_supplicant par exemple.

Si vous n'arrivez pas à utiliser votre clé wifi, assurez-vous que dans le iwconfig wlan1, il n'y ait pas de "Not Associated", si tel est le cas alors faites-ci :

 iwconfig wlan1 ap any

Si vous obtenez un débit lent, plusieurs choses peuvent être en causes : signal trop faible, bit rate trop bas (faites un iwconfig pour voir de combien il est), qualité de réception mauvaise, etc. Essayez tout d'abord de rapprocher le plus proche possible l'AP sur lequel vous vous connectez, puis si ça ne fonctionne toujours pas, c'est soit le driver (cas rare), soit un problème de configuration !

III - Quelques commandes :

Voir les réseaux wifi disponibles :

 iwlist scan

Voir si la clé wifi USB est reconnue par le système :

 lsusb

N'oubliez pas de mettre les bons paramètres concernant le nom du périphérique (wlan*), la bonne IP du routeur ou encore la bonne clé WEP ! Chaque réseau posséde sa propre configuration.

Ce billet résume beaucoup mais permet une utilisation basique de sa clé.

16:34 par Scurz

Guilhem Bonnefille

En attendant le replay sur freebox

Quand elle fonctionne, la freebox est vraiment géniale. Mais il y a une fonctionnalité qui fait défaut c’est l’absence de support pour ce que toutes les chaînes nomment le « Replay ». Pour ceux qui connaissent pas, certaines chaînes diffusent, via internet, une sélection de leur programmes. Du coup, lorsque vous avez loupé une émission, inutile de pleurer, vous pouvez aller la voir sur le Net (et vous y casser les yeux car c’est pas de la HD :-)).

Récemment, le problème s’est posé à la maison. J’ai donc passé un peu de temps à chercher comment :

  1. télécharger une vidéo depuis Youtube (oui, dans notre cas, l’émission en question était diffusée via Youtube) ;
  2. réencoder la vidéo pour la visualiser directement depuis le boitier HD de la Freebox.

Téléchargement

Après m’ettre égaré sur des fils de discussions proposant des implémentation variées (python, bash…), j’ai finalement découvert que Debian propose des utilitaires directement dans les dépots officiels. L’utilitaire de téléchargement se nomme clive ou cclive. De plus, il y a une IHM pour rendre les choses carrément simplistes : abby.

Il suffit alors de surfer sur Youtube, identifier la vidéo et copier-coller l’adresse dans l’application. Un jeu d’enfant.

Encodage

Bon, là, c’est moins simple. En partie car Free c’est français, du coup aucune chance d’avoir une application dans le dépot Debian. J’ai donc lancé celle que je connais, à savoir avidemux.

Après quelques essais, j’ai déterminé les réglages suivant :

  • AVI pour le conteneur ;
  • copie pour l’audio ;
  • MPEG-4 (lavc) pour la vidéo en sélectionnant “same qx” dans les options.

Dépot

Et voilou, un dépot sur ftp://freebox@hd1.freebox.fr et le tour est joué.

Bon, une vidéo 320×200, réencodée et affichée sur un écran 82cm… c’est moche, mais c’est mieux que rien.

16:08 par Guyou (Commentaires)

29 octobre 2009

Benoit Peccatte

Prompt String

Niveau : Star Star Star Empty Empty
Résumé : export PS1="> "

Désolé de ne pas écrire plus souvent. Et ca risque de durer encore un peu puisque je pars en vacances ...

PS veut dire prompt string. Les 4 prompt string de bash sont les chaines de caractères affichées par le shell en différentes situations. Nous allons nous intéresser à PS1 mais sachez que la suite vaut pour toutes les autres.

Exemples

Je vais faire simple : des exemples de chaînes ainsi que la capture d'écran associée, il ne vous reste plus qu'a choisir et à copier/coller dans votre .bashrc

Toutes les captures ont été faites avec les settings suivants :

  • user : peck
  • hostname : mamachine.linux-attitude.fr

Exemples unilignes

PS1Fond noir / Fond Blanc
"[\t] \[\e[01;32m\]\u\[\e[01;33m\]@\h\[\e[00m\]:\[\e[01;34m\]\w\[\e[00m\]\$ " black
white
"\[\033[01;32m\]\u@\h \[\033[01;34m\]\W \$ \[\033[00m\]" black
white
"\[\033[0;34m\][\[\033[0;31m\]$(date +%H%M)\[\033[0;34m\]]\[\033[0;34m\][\[\033[1;31m\]\u@\h:\w\[\033[0;34m\]]\[\033[1;37m\]$\[\033[0m\] " black
white  
 

Exemples multilignes

PS1Fond noir / Fond Blanc
"\[\e]0;\u@\h \w\a\]\[\e[1;31m\]\u\[\e[1;34m\]@\[\e[0;32m\]\h \[\e[0;33m\]\w \[\e[0;31m\]$(uptime|sed -e 's/.*: \([^,]*\), \([^,]*\), \([^,]*\).*/\1 \2 \3/') \[\e[0;34m\]\D{%Y-%m-%d %H:%M:%S} \[\e[0m\]\n\$ " black
white
 
 

Exemples monochromes

PS1Fond noir / Fond Blanc
"[\t][\u@\h:\w]\$ " black
white
"\u@\h \w> " black
white
"\!|\h|$(uname -r)|\$?> " black
white
"\[\e[1;34m\]\u@\h \w>\[\e[0m\] " black
white
"\[\e]2;\u@\H \w\a\e[32;1m\]>\[\e[0m\] " black
white
(Ici tout est dans le titre)

Faites votre choix

Cookbook

Si les exemples ne vous conviennent pas, voici un ensemble de recettes pour créer un prompt qui vous ressemble :

  • load average : "\$(cut -d ' ' -f 1-3 /proc/loadavg)"
  • uptime : "\$(uptime | cut -d, -f1 | sed -e 's/.*up//')"
  • un prompt qu'on peut copier/coller sans provoquer d'erreurs : ": <texte> ;"
  • user@host:/répertoire : "\u@\h:\w"
  • date et heure : "[\d \t]"
  • un bip à chaque ligne : "\[\a\]"
  • changer la couleur du texte (code couleur voir ci dessous) : "\[\e[<code_couleur>m\]"
  • revenir à la couleur originale du shell (en fin de ligne) : "\[\e[0m\]"
  • code de retour de la dernière commande : "-> \$?"
  • nombre de jobs mis en background par le shell : "[\j]"
  • nombre de jobs en pause : "\$(jobs | wc -l | awk '{print $1}')"
  • nombre de processus en cours d'exécution : "\$(ps ax | wc -l | tr -d ' ')"
  • afficher le tty en cours : "$(temp=$(tty) ; echo ${temp:5})"
  • chemin limité à 20 caractères : "\$(a='\w';b=\${a: -20};b=\${b:+..\$b};echo \${b:-\$a})"
  • changer le texte de titre du terminal (xterm, konsole ...) : "\[\e]0;<Texte>\a\]"
  • afficher l'état de la gestion de version en cours (voir ci dessous) : "$(__vcs_dir)"
  • afficher la sortie d'une commande : "\$(<commande>)"

Codes couleur ANSI

Il est possible d'indiquer plusieurs codes simultanément en les séparant par un ';'.

From wikipedia :

Code couleur
Code Effect Note
0 Reset / Normal all attributes off
1 Intensity: Bold
2 Intensity: Faint not widely supported
3 Italic: on not widely supported. Sometimes treated as inverse.
4 Underline: Single
5 Blink: Slow less than 150 per minute
6 Blink: Rapid MS-DOS ANSI.SYS; 150 per minute or more
7 Image: Negative inverse or reverse; swap foreground and background
8 Conceal not widely supported
21 Underline: Double not widely supported
22 Intensity: Normal not bold and not faint
24 Underline: None
25 Blink: off
27 Image: Positive
28 Reveal conceal off
30–39 Set foreground color, normal intensity 3x, where x is from the color table below
40–49 Set background color, normal intensity 4x, where x is from the color table below
90–99 Set foreground color, high intensity aixterm
100–109 set background color, high intensity aixterm
Table des couleurs
Intensité 0 1 2 3 4 5 6 7 9
Normal Black Red Green Yellow[5] Blue Magenta Cyan White reset
Brillant Black Red Green Yellow Blue Magenta Cyan White

Gestion de version

Pour que la méthode de gestion de version fonctionne, il faut ajouter le code suivant dans son .bashrc :

alias svnwdiff="svn diff --diff-cmd /home/spaillar/vimdiff-wrapper.sh"
function cvswdiff { vimdiff $1 <(cvs co -p $2 $(cat $(dirname $1)/CVS/Repository)/$(basename $1)) ;} 

function vlog { 
# cvs
cvs_log() {
   [ -d "CVS" ] || return 1
   cvs log "$@" | vim -
}

# subversion
svn_log() {
    [ -d ".svn" ] || return 1
    svn log -v "$@" | vim -
}
# git
git_log() {
    base_dir=$(git rev-parse --show-cdup 2>/dev/null) || return 1
    git log --name-status "$@" | vim -
}

git_log "$@" || svn_log "$@" || cvs_log "$@"

}

function vwdiff {
vim -c ":VCSVimDiff" $1
}

function vpull { 
# cvs
cvs_pull() {
   [ -d "CVS" ] || return 1
   cvs -q up -d
}

# subversion
svn_pull() {
    [ -d ".svn" ] || return 1
    svn up 
}
# git
git_pull() {
    base_dir=$(git rev-parse --show-cdup 2>/dev/null) || return 1
    git pull 
}

git_pull "$@" || svn_pull "$@" || cvs_pull "$@"

}



_bold=$(tput bold)
_normal=$(tput sgr0)
_yellow=$(tput setaf 3)
_green=$(tput setaf 2)

__vcs_dir() {
  local vcs base_dir sub_dir ref
  sub_dir() {
  local sub_dir
  sub_dir=$(readlink -f "${PWD}")
  sub_dir=${sub_dir#$1}
  echo ${sub_dir#/}
  }

  # git
  git_dir() {
      base_dir=$(git rev-parse --show-cdup 2>/dev/null) || return 1
      if [ -n "$base_dir" ]; then
        base_dir=`cd $base_dir; pwd`
      else
        base_dir=$PWD
      fi
      sub_dir=$(git rev-parse --show-prefix)
      sub_dir="/${sub_dir%/}"
      ref=$(git symbolic-ref -q HEAD || git name-rev --name-only HEAD 2>/dev/null)
      ref=${ref#refs/heads/}
      vcs="git"
      alias pull="git pull"
      alias commit="git commit"
      alias push="git push"
#     alias revert="svn revert"
    }

  # subversion
  svn_dir() {
      [ -d ".svn" ] || return 1
      base_dir="."
      while [ -d "$base_dir/../.svn" ]; do base_dir="$base_dir/.."; done
      base_dir=`cd $base_dir; pwd`
      sub_dir="/$(sub_dir "${base_dir}")"
      ref=$(svn info "$base_dir" | awk '/^URL/ { sub(".*/","",$0); r=$0 } /^Revision/ { sub("[^0-9]*","",$0); print r":"$0 }')
      vcs="svn"
      alias pull="svn up"
      alias commit="svn commit"
      alias push="svn ci"
      alias revert="svn revert"
    }

  # mercurial
  hg_dir() {
      base_dir="."
      while [ ! -d "$base_dir/.hg" ]; do base_dir="$base_dir/.."; [ $(readlink -f "${base_dir}") = "/" ] && return 1; done
      base_dir=$(readlink -f "$base_dir")
      sub_dir="/$(sub_dir "${base_dir}")"
      ref=$(< "${base_dir}/.hg/branch")
      hgqtop=$(hg qtop)
      if [[ $hgqtop == 'No patches applied' ]]; then 
        extra="";
      else 
        extra=" >> $hgqtop"
      fi
      vcs="hg"
  }

  # cvs
  cvs_dir() {
      [ -d "CVS" ] || return 1
      base_dir="."
      while [ -d "$base_dir/../CVS" ]; do base_dir="$base_dir/.."; done
      base_dir=`cd $base_dir; pwd`
      sub_dir="/$(sub_dir "${base_dir}")"
      vcs="cvs"
      alias pull="cvs -q up -d"
      alias commit="cvs commit"
      alias push="cvs ci"
      alias revert="cvs revert"


  }

  # hg_dir || git_dir || svn_dir || cvs_dir || base_dir="$PWD"
  git_dir || svn_dir || cvs_dir || base_dir="$PWD"
  echo "${_green}${_bold}${vcs:+($vcs)}${_yellow}${_bold}${vcs:+[$ref]}${_normal}${base_dir/$HOME/~}${_yellow}${_bold}${vcs:+${_bold}${sub_dir}${_normal}$extra}"
}

PS1='${debian_chroot:+($debian_chroot)}\u@\h:$(__vcs_dir)${_normal}\$ '

Et vous quel prompt utilisez vous ?

Tags:,

21:51 par peck (Commentaires)

Rodolphe Quiédeville

pgpool-II 2.2.5 dans Debian

La dernière version de pgpool-II, la 2.2.5 vient d'être intégrée dans debian experimental, vous pouvez suivre son évolution au travers de la page du package tracking system dédiée.

08:57 par Rodolphe Quiédeville (Commentaires)

27 octobre 2009

Christophe Nowicki

Reconnaissance vocale sous GNU/Linux et domotique

L’objectif de cet article est de décrire mon avancement sur le système de reconnaissance vocale dans mon installation domotique. En effet, pour mon usage personnel, j’ai mis au point un chatterbot pour contrôler de manière intuitive l’appartement.
Cette technologie permet de tenir une discutions intuitive avec une maison intelligente pour lui faire exécuter des ordres. (allez Stanley, tu t’es seulement planter de 10 ans ;-) ) :

Moi>Alfred?
Alfred>Oui, monsieur.
Moi>Allume la lumière du salon.
-- run xpl-sender -c x10.basic command=on device=a3
Alfred>C'est fait.

Le nom du bot est un hommage à Alfred Pennyworth. Allons faire un petit tour dans les entrailles de la batcave ;-)

Définition du besoin

L’accumulation des télécommandes sur mon installation domotique, fait chuter mon WAF de manière dramatique.
En effet, pour regarder une chaîne de télévision ou allumer la lumière.
Il est nécessaire d’utiliser deux ou trois télécommandes différentes.
Naviguer dans des interfaces, etc…
Bref, pour des technologies donc l’objectif est d’améliorer la qualité de vie et rendre les taches quotidienne plus facile, j’avais un gros problème ;-)
Après un petite discussion et une mise au point avec ma moitié, j’ai réussi à vendre la solution de contrôle par la voix.
Belle connerie me voilà parti dans un domaine que je ne connais pas ;-)

Première Approche

Je lance une boue à la mer sur le forum “toute la domotique”.

Visiblement, je ne suis pas le seul à chercher ce genre de fonctionnalité. Actuellement, nous avons dans le domaine :

  • l’abominable HomeSeer qui fonctionne très mal en Anglais à l’aide de l’interface de reconnaissance vocale inclue dans Microsoft Windows et la SAPI ;
  • Rien de spécifique à la domotique sous GNU/Linux, mais une belle galaxie de programmes dans le domaine.

Le choix du microphone

Ma petite dame voulais parler librement sans aucune contrainte et il n’étais pas question de l’équiper d’un microphone.
J’ai donc cherché une solution qui permet de capter la parole dans une pièce sans microphone sur la personne.
La solution magique s’appelle la technique du Microphone array.
Le principe est très simple, mettre en commun plusieurs microphones reliés à un DSP qui permet de faire le traitement du signal en fonction de l’orientation physique des microphones.
J’ai donc proposé de mettre en place chez moi le LOUD (non ce n’est pas un radiateur ;-) ).
Bon vous vous doutez bien que lorsque j’ai proposé la solution du LOUD, j’ai faillit passer par la fenêtre ;-)

microphone_array Heureusement, il existe des solutions plus simples telles que le Voice Tracker de chez Acoustic Magic.

Celui-ci permet de capter la parole dans une pièce, retraite le signal et permet d’obtenir sur une prise Jack classique la voix et rien que la voix dans une pièce.
Magique ;-)

Je peux parler le dos tourner au microphone dans une pièce de 20m^2 et l’ordinateur capte ma voix de manière impressionnante ;-)

Le logiciel de reconnaissance vocale

Il y a principalement deux solutions dans le domaine sous GNU/Linux :

  • Le projet CMU Sphinx avec PocketSphinx, Sphinx-[234], etc…
  • Julius, Open-Source Large Vocabulary CSR Engine Julius.

Sur ces deux moteurs de reconnaissance vocale, reposent de nombreux Dialog Manager, qui permettent d’exploiter le moteurs pour faire de la téléphonie, de contrôle vocale, etc…

Ma méthode

Soyons claire, je ne suis pas un expert en reconnaissance vocale et ce domaine est vraiment très difficile d’accès et nécessite la compréhension de nombreuses notions.
J’ai donc adopté la technique EPITECH : c’est à dire faire en sorte que cela fonctionne. ( sans comprendre tout le contexte ;-) )

Un bon informaticien est un informaticien feignant

Pour faire fonctionner Julius, il est nécessaire de lire à haute voix de nombreux mots pour enregistrer les différents phonèmes qui les composent. Afin de créer un Modèle de Markov caché exploitable par le logiciel.
Voici donc comment je m’y suis pris pour éviter cette phase fastidieuse du projet.

Utilisation d’un logiciel de synthèse vocale

1 ère approche une solution assez “laide“, qui consiste à faire lire ces mots par un logiciel de synthèse vocale comme eSpeak. Mais le résultat n’était pas très bon.

Utilisation d’une collection d’enregistrement audio

J’ai par la suite découvert le projet Shtooka, qui est une collection audio libre de mots français.
Tous les termes liés à la domotique ne sont pas disponible dans le projet mais il est très facile d’ajouter ces termes à sa base de données locale.

Conversion texte vers Phonème

Une des étapes de l’apprentissage de Julius est la conversion du texte en Phonèmes, pour résoudre ce problème, j’ai utilisé l’option -X de eSpeak dont voici un exemple de sortie :

$espeak -v fr -q -X "lumière"
Translate 'lumière'
  1     l        [l]

  1     u        [y]

  1     m        [m]

 21     i (A     [j]
  1     i        [i]

 43     è       [E]

  1     r        [r]

 22     e (_     []
  1     e        [@]

 lymj'Er

Un peu de glu

Pour faire fonctionner tout ces éléments ensemble, je me suis fait un script Perl (très sale pour le moment) permettant de réaliser automatiquement toutes ces étapes :

  • analyse des questions posées au robot ;
  • la conversion des mots en phonèmes ;
  • la diction des mots ;
  • la création du modèle accoustique.

Il s’agit de l’automatisation de toutes les étapes de la création d’un modèle acoustique du projet VoxForge.

Les travaux en cours

Mon projet est disponible à cette adresse : Alfred
Il est en cours de développement mais pour l’instant il est possible de donner des ordres simples.

J’utilise RiveScript pour la définition des tâches et de la conversation. Ce langage de chatbot est plus puissant que AIML. Car il permet d’inclure du code Perl assez puissant dans le code de la conversation. Voici un exemple :
$ more lib/Alfred/languages/en/x10.rs
+ switch * on
- do you want me to switch <star> on?
+ yes
% do you want me to switch * on
- <call>xpl_x10_send_on <botstar></botstar></call>

$more lib/Alfred/modules/x10.rs
> object xpl_x10_send_on perl
my ($obj,$method,@args) = @_;
$obj->{'xpl'}->send(
message_type => 'xpl-cmnd', class => 'x10.basic',
body => { command => 'on', device => 'a3' });
object

Un petit appel à contribution

J'aurais gagné énormément de temps si le projet VoxForge avait reçu plus de contribution de la part des utilisateurs francophones.

En effet, il n'y a pas assez de contribution pour pouvoir faire un modèle accoustique en Français.
Cela permettra de disposer d'un système de reconnaissance vocale libre en Français.
Ce qui intéresse beaucoup de monde à mon avis ;-)
C'est donc un petit appel à contribution aux projets VoxForge et Shtooka.

Références intéressantes

16:32 par cscm (Commentaires)

23 octobre 2009

Rodolphe Quiédeville

Intégrer memcached et mysql

Je vais décrire ici une technique pour mettre en cache mémoire, à l'aide de memcached les données d'une base mysql sans modifier le code applicatif. La technique consiste à utiliser mysql-proxy et la librairie lua mysql-proxy-cache. Cette description se base sur une Debian Lenny.

On débute par l'installation de memcached

aptitude install memcached

Ensuite nous allons installer les paquets nécessaire pour satisfaire les dépendances de la librairie.

aptitude install lua5.1 liblua5.1-md5-0 liblua5.1-socket2 luarocks

La librairie luamemcached n'est pas actuellement dans les repository officiel mais il existe néanmoins un paquet debian.

wget http://luaforge.net/frs/download.php/4041/liblua5.1-memcached0.deb
dpkg -i liblua5.1-memcached0.deb

Pour la librairie mysql-proxy-cache qui nous intéresse ici nous pouvons la récupérer par git ou directement à l'adresse http://github.com/clofresh/mysql-proxy-cache/raw/master/mysql-proxy-cache.lua.

A partir de ce point nous considérons que le fichier lua a été sauvegardé dans /usr/share/mysql-proxy/mysql-proxy-cache.lua

Modifions maintenant le fichier de configuration de mysql-proxy pour que celui-ci se lance au démarrage et qu'il intègre la nouvelle librairie, la configuration se fait dans /etc/default/mysql-proxy.

ENABLED="true"
OPTIONS="--proxy-lua-script=/usr/share/mysql-proxy/mysql-proxy-cache.lua"

Il reste à démarrer mysql-proxy avec le script d'init standard

/etc/init.d/mysql-proxy start

C'est désormais opérationnel, par défaut les résultats seront cachés pour une durée de 30 secondes. Le cache n'est pas dynamique dans le sens ou une donnée écrite ne sera pas rendue immédiatement, mais seulement au bout de 30 secondes, prenez garde donc si vous augmentez cette valeur.

Pour vérifier que memcached est bien actif, vous pouvez vous connecter en telnet sur son port d'écoute (11211) et taper la commande stats, vous obtiendrez quelque chose comme :

stats
STAT pid 2539
STAT uptime 21318
STAT time 1256336412
STAT version 1.2.2
STAT pointer_size 32
STAT rusage_user 0.040002
STAT rusage_system 0.120007
STAT curr_items 3
STAT total_items 15
STAT bytes 50447
STAT curr_connections 2
STAT total_connections 651
STAT connection_structures 17
STAT cmd_get 1450
STAT cmd_set 15
STAT get_hits 1435
STAT get_misses 15
STAT evictions 0
STAT bytes_read 151263
STAT bytes_written 45156032
STAT limit_maxbytes 67108864
STAT threads 1

Happy hacking !

21:35 par Rodolphe Quiédeville (Commentaires)