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

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

Il faut vraiment beau dehors, vous êtez sur de vouloir regarder la télévision?
I’ve wrote an Zoneminder plugin for Freevo.
The first release of the plugin support the fallowing features :
I’ve planned to add :
Please feel free to ask any other feature. Patches and bug reports are welcome
|
|
|
|
You can download the freevo plugin from the subversion repository :
svn co http://svn.csquad.org/zoneminder_freevo/
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).
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.
|
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 :
Le tout pour la modique somme de 120$ soit au taux de change en vigeur aujourd’hui 75 euros. |
Le constructeur propose des modèles plus evolués equipés des options suivantes :
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).
Voici quelques benchmark réalisés avec les commande des commandes courrantes :
|
|
|
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 constructeur fournit un système pour monter le boîtier derrière un écran LCD. |
La machine ne dispose pas d’un lecteur de CD-ROM, pour la méthode d’installation vous avez le choix entre :
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.
Cette machine répondre à plusieurs besoins :
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.
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.
![]() |
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 :
You can download theses plugins from the subversion repository : Enjoy and feel free to report bugs and suggest new graphs. |
|
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 … 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. Résultat des courses, les deux composants sont incompatibles, vous avez donc les choix suivants :
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. |
This document explain how to build and load an Not eXactly C program for the Lego Mindstoms NXT Robot under Debian GNU/Linux.
Lego does not provide tools for building programs for the NXT under Linux.
I don’t like Bricxcc, because :
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/
Let’s try to build and send a simple hello world program to the robot :
$ cat > hello.nxc <
TextOut(0, 0, "Hello world!");
Wait(1000);
}
EOF
$ nbc hello.nxc -O=hello.rxe
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…
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 :
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.
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
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
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
Cette méthode apporte les avantages suivants :
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.
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.
![]() |
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 :
|
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 :
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-
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)
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 :
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.
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 :
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!
Powered by WordPress