VLCJ (1)

Une alternative sans doute viable pour la gestion des webcams avec Java… VLCJ : http://code.google.com/p/vlcj/

Je teste ce pilotage de VLC via Java en ce moment et cela me semble prometteur. La compatibilité windows et gnu/linux est un sérieux plus.
Peut-être une suite à SecureCam 😉

La Javadoc est minimaliste, mais c’est mieux que rien.

HTML 5 – Premiers pas

Je commence à me mettre à HTML 5…
Mieux vaut tard que jamais 🙂

L’objet Canvas semble être l’une des avancée majeure de cette version. En tout cas cette démo me plait bien
Manipulation en DOM via javascript, pratique et simple d’utilisation.

Il me reste pas mal de nouveautés à découvrir, j’espère que cela se fera assez rapidement : w3schools

Maki et Temaki

J’avais une furieuse envie de makis ce week-end et j’adore les cuisiner. Et hop, aussitôt dit, aussitôt roulés. D’habitude j’utilise de l’avocat, cela ajoute une jolie touche de vert 🙂

Blason de Kaerith

La héraldique est une science plutôt captivante, en tout cas en ce qui me concerne. Je me suis amusé à créer le blason représentant Kaerith : triste, nostalgique mais débordante d’optimisme. Le meuble choisit est un dragon, car j’ai toujours été fasciné par ces créatures légendaires.

Voici donc mon blason : de sinople, écartelé de sable, dragon d’argent.

SCALA premiers pas (1)

En vieux routard du java je ne pouvais pas passer à côté de groovy ou de scala.  Autant groovy n’a pas déclenché ma curiosité, autant je suis curieux des apports de SCALA.

Étant sensibilisé aux problématiques XML, de part mon travail, je commence par essayer de comprendre les capacités de SCALA à manipuler ce format.

Je dois avouer ne pas être déçut… Même grandement impressionné comme un marmot devant un magicien… Le bout de code suivant :

val tweet =
<div id="feedTitle">
<a id="feedTitleLink">
<img id="feedTitleImage" />
</a>
<div id="feedTitleContainer">
<h1 id="feedTitleText">Twitter / kaerith</h1>
<h2 id="feedSubtitleText">Twitter updates from kaerith /
kaerith.</h2>
</div>
</div>;

Suffit pour déclarer un objet xml en mémoire…

Afficher la valeur de H1 ? Rien de plus simple :

val c2 = tweet \\ "h1"
println (c2.text)

TrueCrypt (2) – mode nomade

Suite à ce post relatant mes premiers pas sur TrueCrypt, j’ai souhaité chiffrer un média amovible type clé usb ou disque dur externe. C’est comme je m’y attendais très simple à réaliser et la logique ne diffère pas tellement du mode fixe. Suivez mes pas…

Télécharger TrueCrypt.
Exécuter le setup mais sans installer, choisissez « extract » et un répertoire sur votre disque dur :
select extract
Insérer un média amovible dans votre ordinateur.

Attention : votre média ne doit pas contenir de données importantes, elles risquent d’être altérées.

Dans le répertoire où TrueCrypt est extrait double cliquer sur TrueCrypt.exe. Choisissez le média où déployer TrueCrypt et le mode d’auto-run. Par exemple :

Ce qui crée les fichiers suivants sur votre média :

Double-cliquer sur « TrueCryptFormat.exe » et choisir « create an encrypted file container ».

Ensuite au choix volume caché ou standard, opter pour standard dans un premier temps :

Saisir un nom de fichier sur votre média :

Sélectionner les algorithmes de chiffrement par défaut :

Choisir la taille du container à chiffrer :

Saisir un mot de passe :

FAT ou NTFS ? Cela détermine par exemple la taille des fichiers à héberger. Sur une clé USB laisser FAT, sur un disque dur externe opter pour NTFS. Ensuite « format » :

Quelques longues minutes plus tard…

Prochain post, comment utiliser un container chiffré 😉

TrueCrypt (1) – premiers pas

robocop

robocop

Recopie d’un de mes anciens posts sur Overblog, du 11 janvier 2008.
[Mode parano on]
Je me suis parfois posé la question de la sécurité des données que je transporte sur des clés USB. Ces trucs sont tellement petits que je suis bien capable d’en paumer une ou pire de m’en faire piquer une…
Un individu malveillant pourrait alors accéder aux fichiers que je balade.
Concernant mes données personnelles c’est en général anodin, à part la recette super secrète de la tarte aux pommes meringuées (que je tiens de ma grand-mère). Mais il m’arrive parfois de balader des fichiers de travail, notamment en me rendant chez un client. Toujours dans mon cas, je ne travaille normalement pas avec des données sensibles, mais au cas où…
[Mode parano off]

Je me suis donc mis en quête d’un logiciel de chiffrement de données. Ah oui, tant que j’y suis : cryptage est un anglicisme et n’existe pas en français, il faut utiliser le mot chiffrement. En même temps, tout le monde comprend le mot cryptage 🙂

Chiffrement :

« Procédé utilisé en cryptographie permettant de protéger un document en le rendant incompréhensible à toute personne ne possédant pas la clé. »

Source wiktionary.

Reprenons. Je veux utiliser un soft gratuit capable de travailler sur les OS que j’utilise, Windows et Linux. Après une brève recherche je suis tombé sur Truecrypt, existant sur les 2 systèmes sus-cités (si j’en crois la future release note, MAC OSX sera supporté dans la version prévue ce mois de Janvier). Pour ne rien gâcher, Truecrypt est open-source.
Le logiciel est capable de monter toutes sortes de containers, que ce soit sous forme de disque ou bien de fichier (sur n’importe quel média : disque dur, clé usb, etc…). Différents algorithmes de chiffrement peuvent être utilisé (AES-256, Serpent, and Twofish… N’y connaissant absolument rien je vous laisse les liens qui seront plus explicites que moi).
Enfin, Truecrypt permet de créer des containers invisibles. Ce sont des containers qui n’apparaissent pas dans le système de fichiers, renforçant leur inviolabilité puisqu’il faut deviner leur existence.

Sous Windows

Installation sans problèmes. Je décide de commencer simple, je crée donc un container de 400Mo sur une clé USB (pour ne pas utiliser toute la clé en mode chiffrement). Voici quelques captures issues de la documentation :


Premier écran de création d’un volume chiffré


Choix de créer le container dans un fichier ou dans un lecteur complet

En ce qui me concerne j’ai laissé les options par défaut et saisi un mot de passe lorsque la procédure me l’a demandé.
La documentation pour Windows étant très bien faite et ce billet n’étant pas un tutoriel, je stop ici la présentation pour ce système.
Enfin si, tout de même : avant de démonter le container j’y ai copié quelques fichiers et répertoires. La prochaine étape sera donc de les lire sur Linux.

Sous Linux (Ubuntu 7.10)

Installation du .deb et lancement du programme. Première surprise, contrairement à la version Windows, pas d’interface graphique. Pas bien grave.

Je crée un répertoire tc sous /mnt.
J’insère la clé usb et :
root@kaerith-desktop:~# truecrypt /media/KAERITH/perso/perso /mnt/tc

Prompt mot de passe :
Enter password for '/media/KAERITH/perso/perso':

Les fichiers sont là :
root@kaerith-desktop:~# cd /mnt/tc
root@kaerith-desktop:/mnt/tc# ls
En concert A la Cigale Favourite Songs Recycled

A suivre

Je n’ai présenté que mes premiers pas sur Truecrypt et il est possible qu’un prochain billet vienne compléter celui-ci. Mon objectif premier est en tout cas atteint : chiffrer et déchiffrer des données de Windows vers Linux. La recette de tarte aux pommes meringuées de ma grand mère est en sécurité…

Récupération de l’ancienne bannière

Utiliser Nio (1) – la copie de fichiers

Premier post traitant d’une possible longue série décrivant mes expérimentations autour du package java.nio.

Mon expérience me montre que le package java.nio est assez peu utilisé, souvent par méconnaissance. NIO étant réputé plus rapide que IO concernant la manipulation de gros fichiers, je vais tenter d’en faire l’expérience en Java SUN 1.6.

Première étape : la copie d’un fichier de 16.5 mo d’un endroit du filesystem vers un autre.

Version classique java.io :

 /**
 
* copy file to new target. If new target doesn't exist, it ll be created.
 
*
 
* @param source
 
*            sourceFile
 
* @param target
 
*            target file
 
* @throws IOException
 
*             exception
 
*/
 
public static void copyFile(final File source, final File target)
 
throws IOException {
 
FileInputStream fis = null;
 
FileOutputStream fos = null;
 
try {
 
if (!target.exists()) {
 
target.createNewFile();
 
}
 
fis = new java.io.FileInputStream(source);
 
fos = new java.io.FileOutputStream(target);
 
final byte buffer[] = new byte[256 * 1024];  // 256Ko
 
int nbLecture;
 
while ((nbLecture = fis.read(buffer)) != -1) {
 
fos.write(buffer, 0, nbLecture);
 
}
 
} finally {
 
fis.close();
 
fos.close();
 
}
 
}

Version java.nio :

/**
 
* copy file to new target. If new target doesn't exists, it ll be created.
 
*
 
* @param source
 
*            sourceFile
 
* @param target
 
*            target file
 
* @throws IOException
 
*             exception
 
*/
 
public static void copyFile(final File source, final File target)
 
throws IOException {
 
if (!target.exists()) {
 
target.createNewFile();
 
}
 
FileChannel fileChannel = null;
 
FileChannel destination = null;
 
try {
 
fileChannel = new FileInputStream(source).getChannel();
 
destination = new FileOutputStream(target).getChannel();
 
destination.transferFrom(fileChannel, 0, fileChannel.size());
 
} finally {
 
if (fileChannel != null) {
 
fileChannel.close();
 
}
 
if (destination != null) {
 
destination.close();
 
}
 
}
 
}

Performances du disque dur

Performance Specifications

Rotational Speed 7,200 RPM (nominal)

Buffer Size 16 MB

Average Latency 5.50 ms (nominal)

Seek Times

Read Seek Time 12.0 ms

Track-To-Track Seek Time 2.0 ms (average)

Transfer Rates

Buffer To Host (Serial ATA) 3 Gb/s (Max)

Résultats :

A suivre…

Liens :

http://stackoverflow.com/questions/1605332/java-nio-filechannel-versus-fileoutputstream-performance-usefulness

http://java.sun.com/j2se/1.5.0/docs/api/java/nio/channels/FileChannel.html#transferTo(long,%20long,%20java.nio.channels.WritableByteChannel)

Video surveillance en Java

L’objectif de ce mini-projet est la manipulation d’images 2D en java, en abordant par la même occasion différents algorithmes de détection de mouvement (motion detection).

Cahier des charges simplifié :

1.fonctionne sous GNU/linux Ubuntu
2.upload des images d’infraction par ftp
3.ajout facile de différents algo de motion detection en respectant simplement une interface Java.

Java ne semble pas être le langage idéal pour la video surveillance, la lenteur des opérations de traitement d’images risquant d’altérer l’ensemble du programme. Qu’en est-il vraiment ?

Ubuntu

Après quelques heures de recherches et d’essais, il me semble que JMF n’est pas le bon candidat. Trop obsolète.

Je me suis donc tourné vers un projet open source nommé : v4l4j.

Installation sans soucis sur mon fixe en ubuntu 8.10 et mon umpc en ubuntu 9.04.
Upload des images d’infraction via FTP

Je me suis inspiré du projet timcam. Comme lui j’utilise les sources de jFtp de Bea Petrovicova. L’objectif étant la découverte d’algo de détection de mouvement et pas FTP en soit.
Ajout facile de différents algo de motion detection en respectant simplement une interface Java

package kaerith.securecam.movedetector;

import java.awt.image.BufferedImage;

public interface IMotionDetector {

/**

* Alerte en fonction des 2 imges en parametre

* @param oldImage image de référence

* @param currentImage image actuelle

* @return boolean l’alerte est déclanchée

*/

public boolean bMoveAlert(BufferedImage oldImage, BufferedImage currentImage);

/**

* Accessor pour le nom du detecteur

* @return nom du detecteur

*/

public String getName();

}

Algorithme moyenne des pixels

Cet algorithme, qui s’est au final révélé fort peu intéressant fait la moyenne pour chaque image des différentes couleurs rouge, vert et bleu des pixels.

Pour cela on récupère dans chaque image tous les pixels :

PixelGrabber grabber = new PixelGrabber(image, 0, 0, -1, -1, false);

int[] data = (int[]) grabber.getPixels();

Puis, pixel par pixel on récupère sa valeur R, puis G puis B :

Color c = new Color(pixels[i]);

blue = blue + c.getBlue();

red = red + c.getRed();

green = green + c.getGreen();

Il ne reste plus qu’a faire une moyenne, en ajoutant ou non un certain degré de tolérance.

Algorithme soustraction simple


Cet algorithme pourtant plus simple donne de meilleurs résultats que le précédant, du moins tant que la luminosité ne change pas trop vite.

Son principe est simple : récupérer les valeurs des différents pixels de chaque images et les soustraire un à un. La encore en se laissant une tolérance paramétrable.

Pour récupérer un tableau de toutes valeurs de pixels d’un image :

int[] BufferedImage.getRGB(int x, int y)

Puis soustraire :

int[] tImgRef = imgRef.getRGB(0, 0, w, h, null, 0, w);

int[] tImgNew = imgNew.getRGB(0, 0, w, h, null, 0, w);

int[] tRet = new int[tImgRef.length];

for(int i = 0; i < tRet.length; i++) {

int diff = tImgNew[i] – tImgRef[i];

if( diff >= tolerance) {

nbRet++;

}

}

Variante : transformer les images en niveaux de gris, afin d’atténuer légèrement les problèmes de fausses détection à cause des changements de luminosité.

Algorithme soustractions multiple


La soustraction de deux images montre elle aussi rapidement ses limites en cas de brusque changement de luminosité.

Comment limiter au maximum l’influence de la luminosité ?

Au cours de différents essais, j ‘ai pu me rendre compte qu’il est très improbable que la luminosité chute d’un seul coup de façon importante. La nuit ne tombe pas si vite, pas vrai ? A l’inverse, si entre 2 images la luminosité à énormément variée, c’est certainement parce que quelqu’un est passé entre une source lumineuse et la caméra. Dans ce dernier cas, lever une alerte reste légitime.

Par contre, en condition de faible variation de luminosité il est fort probable qu’une petite zone de l’image changeant fortement sera susceptible de lever une alerte.

L’algorithme de découpage puis soustraction est une amélioration de celui de simple soustraction. Il permet de modérer les alertes non seulement sur les écarts entre les pixels de deux images mais aussi sur le nombre de zones modifiées.

Le principe est simple, les 2 images à comparer sont découpées en carrés. Chaque carré est soustrait de son supposé jumeaux, la tolérance de soustraction s’appliquant là aussi.
Pour chaque carré différent un compteur est incrémenté ; la position du carré est mémorisée.
Dès que tous les carrés ont été comparés, si le nombre de carrés différent dépasse le seuil fixé, l’alerte est donnée.

Les sources de Meduse 0.1 (alias SecureCam).

Prochaine version :
– gestion de plusieurs webcam

Haut de Page