Christophe Nowicki

August 8, 2008

Pékin 2008 : Plus vite, plus haut, plus fort!

pekin 2008

Il faut vraiment beau dehors, vous êtez sur de vouloir regarder la télévision?

Filed under: Uncategorized — cscm @ 8:08 am

August 4, 2008

Zoneminder plugin for Freevo, first release

I’ve wrote an Zoneminder plugin for Freevo.

Features

The first release of the plugin support the fallowing features :

  • Monitor Live Streaming ;
  • Montage ;
  • Browse events by monitor ;
  • Browse events by time

I’ve planned to add :

  • Secure HTTP ;
  • Playback Navigation (rewind and fast forward) ;
  • Live event notification.

Please feel free to ask any other feature. Patches and bug reports are welcome ;)

Screenshots

zoneminder freevo montage zoneminder freevo streaming zoneminder freevo view event

Download

You can download the freevo plugin from the subversion repository :

svn co http://svn.csquad.org/zoneminder_freevo/

Install

Just copy the zoneminder.py file into /usr/lib/python2.5/site-packages/freevo/plugins (2.5 should be your current version of python) as root.
And install the MySQLdb python package on your system. (apt-get install python-mysqldb on Debian GNU/Linux).

Setup

Put the fallowing line in the local_conf.py file :

plugin.activate(’zoneminder’, level=45)
ZONEMINDER_CONFIG = ‘/etc/zm.conf’
ZONEMINDER_EVENTS_DIR = ‘/var/www/events’
ZONEMINDER_CLIENT_IPV4_ADDRESS = ‘’
ZONEMINDER_SERVER_AUTH_TYPE = ‘builtin’
ZONEMINDER_SERVER_USERNAME = ‘admin’
ZONEMINDER_SERVER_PASSWORD = ‘admin’
ZONEMINDER_SERVER_AUTH_RELAY = ‘hashed’
ZONEMINDER_SERVER_AUTH_HASH_SECRET = ‘’
ZONEMINDER_SERVER_HOST = ‘localhost’
ZONEMINDER_SERVER_PORT = ‘80′
ZONEMINDER_SERVER_USE_SSL = False

The file /etc/zm.conf must be readable by the freevo user.
# id freevo
uid=1003(freevo) gid=100(users) groups=100(users),24(cdrom),29(audio),44(video),46(plugdev)
ls -l /etc/zm.conf
-rw-rw---- 1 root users 1324 2008-08-04 01:21 /etc/zm.conf

Now you can restart freevo and use the plugin.

Filed under: ZoneMinder — cscm @ 12:29 am

July 19, 2008

MicroClient Jr. de NorhTec, un petit serveur / routeur basse consommation

NorhTec MicroClient Jr. Le MicroClient Junior de NorhTec est une mini machine qui tient dans la paume de la main.
Cette machine est parfaite pour un petit serveur GNU/Linux à faible consommation.
Il dispose des spécifications suivantes :

  • Processeur x86 à 200 Mhz (400 bogomips)
  • 128 Mo de RAM
  • Sortie VESA
  • Fanless (sans ventilateur)
  • Port IDE pour disque dur de portable 2,5′’
  • Port pour carte mémoire compact Flash
  • Trois ports USB 1.0 (deux en facade et un à l’arrier)
  • Carte réseau Ethernet 10/100

Le tout pour la modique somme de 120$ soit au taux de change en vigeur aujourd’hui 75 euros.

Spécifications Matérielles

Le constructeur propose des modèles plus evolués equipés des options suivantes :

  • Avec deux port serie
  • Avec une carte wifi
  • Avec un port serie et une carte wifi

Pour ma part, j’ai commandé ma machine avec un collègue pour partager les frais de transport (85$ pour importer la bête depuis la Thailand).

Benchmark

Voici quelques benchmark réalisés avec les commande des commandes courrantes :

  • openssh speed est disponible ici ;
  • hdparm -tT est disponible ici.

Installation d’un disque dur

NorhTec MicroClient Jr. NorhTec MicroClient Jr.

La machine est très petite et le démontage n’est pas évident. J’ai un peu cassé mon boîtier avant de comprendre comment l’ouvrir.
Le disque dur se loge dans la partie basse du boitier et rentre tout juste.

Le constructeur fournit un système pour monter le boîtier derrière un écran LCD.

Consommation électrique

NorhTec MicroClient Jr.

Comme vous pouvez le voir sur le wattmètre la machine consomme seulement 8.5W, auxquels il faut enlever 1.6W pour l’appareil de mesure et 2W pour le disque dur, ce qui fait une consommation de 5W pour le serveur. C’est un très bon ratio consommation / puissance disponible. Il serait même possible d’alimenter la machine via des panneaux solaires.

Installation du système d’exploitation

La machine ne dispose pas d’un lecteur de CD-ROM, pour la méthode d’installation vous avez le choix entre :

  • l’installation via le réseau ;
  • avec un bon vieux debootstrap.

Pour ma part, j’ai utilisé deboostrap sur le disque dur avant de le brancher sur la machine et la faire booter avec grub. Il n’y a aucune difficulté lors de l’installation.
La machine boot sur un noyeau i586 récent sans aucun souci :

Linux tof 2.6.18-6-486 #1 Fri Jun 6 21:47:01 UTC 2008 i586 GNU/Linux

Le fichier dmesg de la machine est disponible ici.
Le contenu du fichier /proc/cpuinfo est disponible la.
La sortie de la commande lspci est disponible la.

Utilisation

Cette machine répondre à plusieurs besoins :

  • routeur wifi ;
  • client léger ;
  • firewall avec des cartes réseaux en USB, il est possible d’avoir 4 interfaces réseau ;
  • hébergement de sites web, la machine est suffisament puissante pour héberger un blog ou un site perso ;
  • serveur de domotique, le modèle avec les deux ports serie est très interessant.

Mon collégue, utilise la machine comme un firewall après avoir ajouté une carte réseau sur le port USB.
Pour ma part, je l’utilise comme :

La machine tient parfaitement la route, mais il faut faire attention à l’utilisation mémoire.

Conclusion

J’avoue ne pas avoir été embalé sur le coup par la machine, mais je me suis dit qu’elle pourrait remplacer mon NSLU2, qui pédale dans la choucroute, même pour une tâche aussi simple que serveur de logs …

Donc bingo, cette machine tient la route, c’est du Linux embarqué, mais avec toutes les caractèristiques d’un PC Standard. (pas de CPU exotique).

Donc si vous chercher une petite machine et que vous ne voulez pas vous prendre la tête avec des solutions à base d’ARM. Cette machine est vraiment bien pour cela.

Filed under: Hardware — cscm @ 1:42 pm

July 6, 2008

Zoneminder plugins for Munin

I use ZoneMinder for my CCTV system and Munin for network monitoring.
But there is no ZoneMinder plugins for Munin, so I’ve decided to wrote theses plugins :

  • zm_events : get the number of events catched by monitors ;
  • zm_fps : get the number of frames per seconds ;
  • zm_hourly_events : get the number of events per hours.

You can download theses plugins from the subversion repository :

svn co http://svn.csquad.org/zoneminder_munin/

Enjoy and feel free to report bugs and suggest new graphs.

Filed under: Perl, ZoneMinder — cscm @ 8:30 am

June 29, 2008

La carte mère Intel DG33FB et la carte graphique ATI Sapphire Radeon HD 3850 sont incompatibles!

Je viens de faire l’acquisition d’une nouvelle machine pour le Home-cinéma Freevo.
J’ai choisi les composants suivants :

Et la c’est le drame …
Le chipset de la carte mère dispose d’un dissipateur, d’une hauteur impressionnante.
La carte graphique est munie d’un dissipateur passif dans le mauvais sens !.

Et oui, les ingénieurs de chez Sapphire on eu la bonne idée de mettre le dissipateur dans le sens de la carte mère et non dans le sens de l’alimentation.
Normalement avec ce genre de carte vous perdez un port PCI-E ou bien PCI mais, je n’ai jamais vu un dissipateur dans se sens.

Résultat des courses, les deux composants sont incompatibles, vous avez donc les choix suivants :

  • Enlever le dissipateur de la carte mère, dans ce cas la machine fonctionne, mais à temperature ambiante le chipset monte à 120°C, très dangereux…
  • Renvoyer la carte graphique directement chez le revendeur et vous faire rembourser.
  • Utiliser un water block, pour refroidir la carte graphique du bon sens ;

Pour ma part, c’est cette dernière solution que j’ai choisi (impossible de renvoyer la carte chez le revendeur US), j’ai donc ajouté un water block ZM-GWB3850/3870 de chez Zalman à mon montage.

Pour ma part, je suis un peu dégouté de devoir investir dans un sytème de water cooling à cause d’un mauvais choix des ingénieurs de chez Sapphire.

J’espère donc qu’en lisant ce message vous ne ferrez pas la même bêtise que moi en achetant cette carte graphique.

Filed under: Hardware — cscm @ 10:48 am

June 12, 2008

Build NXC programs under Debian GNU/Linux

This document explain how to build and load an Not eXactly C program for the Lego Mindstoms NXT Robot under Debian GNU/Linux.

Introduction

Lego does not provide tools for building programs for the NXT under Linux.
I don’t like Bricxcc, because :

  • It looks like Visual Studio ;
  • runs only on Microsoft Windows ;
  • I’m more familiar with VIM, make and GCC ;0)

Install the compiler

Ths NXC compiler can be downloaded on the Bricxcc web site. The compiler is writen in Pascal.

You need to install the FreePascal Compiler and build the compiler :


$ wget http://downloads.sourceforge.net/bricxcc/nbc-1.0.1.b34.src.tgz
# apt-get install fp-compiler fp-units-fcl fp-units-base
$ mkdir nbc
$ tar xzf nbc-1.0.1.b34.src.tgz -C nbc
$ cd nbc/nxt
$ make -f nbclinux.mak
$ ./nbc
Next Byte Codes Compiler version 1.0.1.b34 (1.0.1.34, built Thu Jun 12 21:21:22 CEST 2008)
Copyright (c) 2006, John Hansen
Use "nbc -help" for more information.
# mv nbc /usr/local/bin/

Hello world

Let’s try to build and send a simple hello world program to the robot :


$ cat > hello.nxc < task main() {
TextOut(0, 0, "Hello world!");
Wait(1000);
}
EOF
$ nbc hello.nxc -O=hello.rxe

USB Transfert

In order to send the program to the robot, you need the Talk 2 NXT program : T2N.

Warning: on amd64, you need to patch the source code.


# apt-get install g++ libusb-dev
$ wget http://www-verimag.imag.fr/~raymond/edu/lego/t2n/t2n-0.2.src.tgz
$ wget http://www.csquad.org/wp-content/t2n_amd64.diff
$ cd t2n-0.2.src
$ patch -p1 < ../t2n_amd64.diff
patching file src/usbmisc.cc
patching file src/usbmisc.h
$ make
# mv obj/t2n /usr/local/bin/

Now you can plug, turn on your NXT and send the program via the USB port.


$t2n -i
#### NXT INFOS ###############
protocol version=1.124 firmware version=1.1
NXT Name: NXT
Blutooth address: 16:53:06:37:ffffffbc:00
Blutooth signal: 0
Free user flash: 44416
$t2n -v -put hello.rxe
nxt brick found, usb initialized
testing for existing file "hello.rxe"
deleting for existing file "hello.rxe"
upload hello.rxe (376 bytes) from /goinfre
that's all folks...

That’s all folks…

Filed under: Debian, NXT, NXC — cscm @ 11:50 pm

June 6, 2008

chsh /usr/bin/goosh

It’s soo geekly :0) http://goosh.org

Filed under: Uncategorized — cscm @ 9:36 am

June 3, 2008

Validation d’un fichier CSV à l’aide d’un Schéma XML

Malgré tout le mal qu’il est possible de penser ou de dire sur le format de fichier CSV, celui-ci présente beaucoup d’avantages :

  • il est facilement manipulable pour les utilisateurs à l’aide d’un tableur comme Calc, Gnumeric ou bien Excel ;
  • il permet d’écrire rapidement et facilement des routines d’import / export ;
  • il permet d’échanger les données entre des bases et des systèmes hétérogène.

Mais ce format de fichier ne dispose pas d’un système de validation. Dans la plupart des cas ce sont les routines d’import / export qui prennent en charge la validation des données et de leur mise en forme.

Ce travail est pénible, répetitif et ennuyeux mais nécessaire si vous ne voulez pas qu’un fichier mal formaté ne corrompe les données de votre base.

L’objectif de cette article est de proposer une solution simple permettant la validation d’un fichier CSV en utilisant les fonctionnalités offertes par les schémas XML.

Les exemples fournis sont écrit à l’aide du language de programmation PHP5.

Transformation CSV vers XML

Votre fichier doit contenir sur la 1ère ligne, le nom de chaque cologne :

“CHANNEL”;”COMPANY”;”BVD_ID_Groupe_1″;”BVD_ID_Groupe_2″;”GENRE”;”URL”;”OTHER_URL”;”COMPETENT_AUTHORITY”
“Canal+ Film 1″;”C MORE ENTERTAINMENT AB”;”NL33268595″;”DE8330261794″;”CIN”;”http://www.canalplus.se”;”http://www.sbsbroadcasting.com/, http://www.prosiebensat1.de/”;”RTVV”
“Canal+ Film 2″;”C MORE ENTERTAINMENT AB”;”NL33268595″;”DE8330261794″;”CIN”;”http://www.canalplus.se”;”http://www.sbsbroadcasting.com/, http://www.prosiebensat1.de/”;”RTVV”
“Canal+ Film 2 Sport Weekend”;”C MORE ENTERTAINMENT AB”;”NL33268595″;”DE8330261794″;”CIN”;”http://www.canalplus.se”;”http://www.sbsbroadcasting.com/, http://www.prosiebensat1.de/”;”RTVV”
“Canal+ Film 3″;”C MORE ENTERTAINMENT AB”;”NL33268595″;”DE8330261794″;”CIN”;”http://www.canalplus.se”;”http://www.sbsbroadcasting.com/, http://www.prosiebensat1.de/”;”RTVV”
“Canal+ Film HD”;”C MORE ENTERTAINMENT AB”;”NL33268595″;”DE8330261794″;”CIN”;”http://www.canalplus.se”;”http://www.sbsbroadcasting.com/, http://www.prosiebensat1.de/”;”RTVV”

Pour transformer le fichier CSV en XML, il suffit de lire le fichier CSV avec la fonction fgetcsv et mettre les données dans des balisent XML : csv_to_xml.php

Une fichier CSV converti en XML ressemble à cela : channel.xml

Validation du fichier XML

Il ne reste plus qu’à écrire le schéma permettant de valider le fichier XML : channel.xsd

Vous pouvez tester vos schéma en ligne de commande en utilisant la commande xmllint issue du paquet Debian libxml2-utils :


$ xmllint --noout --schema channel.xsd channel.xml
channel.xml validates

Validation en PHP

Une fois que votre schéma est correct et permet de valider le contenu du fichier XML, il faut l’intégrer directement dans votre application : validate.php

Conculsion

Cette méthode apporte les avantages suivants :

  • Les règles de validation sont décrites directement via le schéma, et celui-ci dispose de nombreuses fonctionnalités tels les types de bases, les expression rationnelle, les séquences, etc…
  • Les messages d’erreur sont compréhensibles pour l’utilisateur même, s’il faut parfois les traduire (en convertissant les numéros de lignes et certaines notions) ;
  • La simplicité ;0)

Cette technique a été mise en oeuvre dans le cadre du projet MAVISE pour valider plus d’une vingtaine de formats de fichiers différents.

Filed under: Work, PHP — cscm @ 7:10 am

May 30, 2008

Système de synchronisation conditionnel pour PostgreSQL

Il existe des outils tel que SQLSync permettant de synchroniser les données d’une base PostgreSQL. Mais cette outil, ne permet pas de faire une copie partiel des données.
Dans la plus part des cas, il faut programmer la synchronisation soit même, l’objectif de mon article est de vous proposer une solution simple et élégante.

La problèmatique

Des données sensibles se trouvent dans la base principale et il ne faut synchoniser qu’une partie de ces données vers les autres bases.

L’architecture dispose des caractèristiques suivantes :

  • Le schèma est identique sur chaque base ;
  • Les opèrations d’écriture se font seulement sur la base principale ;
  • Les bases sont accessibles en réseau.

La solution

Pour résoudre le problème, j’ai testé plusieurs approches avant de retenir l’utilisation d’un fonction de hachage dont voici le principe :

  • chaque table doit disposer d’un identifiant unique. (champ id de type SERIAL) ;
  • un programme récupère le couple id et la sum de hachage pour chaque table de chaque base qui doit être synchroniseés ;
  • il compare le couple et si celui-ci est diffèrent alors les données sont mise à jour.

Implementation au niveau de la base de données

Le calcul de la somme de hachage se fait un niveau de la base de données à l’aide d’un fonction :

SELECT id,md5 FROM get_table_md5('nom_de_la_table');
 id |               md5
----+----------------------------------
  4 | 9f3bcd2fae528244669613ae0466cc3c
  5 | 1f3bcd2fa24528244669613ae66cc3czd
...
(42 row)

Voici le code de la function PL/Perl:

CREATE LANGUAGE plperl;
CREATE TYPE table_md5 AS (id INTEGER, md5 TEXT);
CREATE OR REPLACE FUNCTION get_table_md5(varchar) RETURNS SETOF table_md5 AS $$
    my ($rv, $status, $nrows, $row);
    # Get Table OID
    $rv = spi_exec_query(\"SELECT c.oid AS oid FROM pg_catalog.pg_class c
        LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
        WHERE c.relname LIKE '$_[0]';\");
    $status = $rv->{status};
    $nrows = $rv->{processed};
    return undef if ($nrows != 1);
    my $oid = $rv->{rows}[0]->{oid};
    # Get Table attributs
    $rv = spi_exec_query(\"SELECT attname,atttypid FROM pg_catalog.pg_attribute a
        WHERE a.attrelid = $oid AND a.attnum > 0 AND NOT a.attisdropped\");
    $status = $rv->{status};
    $nrows = $rv->{processed};
    return undef if ($nrows < 1);
    my $atts;
    my $atts_not_null;
    foreach my $rn (0 .. $nrows - 1) {
        if ($rv->{rows}[$rn]->{atttypid} == 16) {
            $atts .= ” (CASE WHEN $rv->{rows}[$rn]->{attname} THEN ‘t’ ELSE ‘f’ END) AS $rv->{rows}[$rn]->{attname}”;
        } else {
            $atts .= ” $rv->{rows}[$rn]->{attname}::text”;
        }
        $atts_not_null .= ” (CASE WHEN $rv->{rows}[$rn]->{attname} IS NULL THEN ‘’ ELSE $rv->{rows}[$rn]->{attname} END)”;
        $atts .= ‘,’ if ($rn != $nrows - 1);
        $atts_not_null .= ‘ || ‘ if ($rn != $nrows - 1);
    }
    # Calc MD5
    my $sql = “SELECT id, MD5($atts_not_null) AS md5 FROM (SELECT $atts FROM $_[0]) AS $_[0];”;
    $rv = spi_exec_query($sql);
    $nrows = $rv->{processed};
    foreach my $rn (0 .. $nrows - 1) {
        return_next({
            id  => $rv->{rows}[$rn]->{id},
            md5 => $rv->{rows}[$rn]->{md5}
        });
    }
    return undef;
$$ LANGUAGE plperl;

Pour utiliser cette fonction vous avez besoin du support du language de programmation PL/Perl dans Postgres, celui-ci se trouve dans le paquet Debian : postgresql-plperl-

La gestion des conditions

Le choix des données à synchroniser se fait individuellement pour chaque table à l’aide de la clause WHERE de la manère suivante :

SELECT id,md5 FROM get_table_md5('nom_de_la_table') WHERE id IN(SELECT id FROM nom_de_la_table WHERE nom_de_la_table.champ LIKE 'sync');
 id |               md5
----+----------------------------------
  1 | fdd56eabd4bb997e453e33f0022d46c1
(1 row)

Implementation du script de synchronisation

La synchronisation des données peut être réalisée à l’aide de n’importe quel language de programmation,
il suffit juste de disposer d’un accèss à la base de données.

Voici un exemple de script écrit par Emmanuel Saracco en PHP5 qui se repose sur les modules PEAR suivants :

  • DB : pour l’accès à la base de donnée.
  • Console_Getopt : pour la gestion de la ligne de commande.

Ce script nécessite un fichier de configuration, en voici un exemple.
Ce fichier contiens la configuration des diffèrentes base de données et les conditions sous-forme de clauses where.

Conclusion

Cette méthode de synchronisation fonctionne, elle est en production chez un client pour une base de données de plus de 100 tables, elle permet de synchronisé le contenu d’une base vers deux autres.
Les avantages de cette méthode sont les suivants :

  • le fait de pouvoir choisir le contenu de la clause where permet de réalisé des régles de synchronisation très complexes ;
  • les performances sont très bonnes car les transfert réseau sont limités ;
  • il est possible d’écrire le script de synchronisation avec n’importe quel language de programmation.
Filed under: Perl, PHP, PostgreSQL — cscm @ 2:30 pm

May 26, 2008

Les Français sont-ils des vaches à lait? suite

Allez une copie d’écran pour le plaisir :

Un produit avec une diffèrence de prix de 36% entre la France et la Belgique !!!
Merci Pixmania!

Filed under: Hardware — cscm @ 1:42 pm
Next Page »

Powered by WordPress