Divers


Afficher une webcam sur son site (version Linux)

Il y a déjà un article pour afficher sa webcam sur une page web mais en plus d'être un peu à la rue, il ne fonctionne pas sur Linux.

Nous allons voir comment intégrer une webcam sur son site web sous Linux.

Il nous faut :

  • Un serveur web
  • Un accès SSH
  • Une webcam
  • Un ou deux logiciels en local

Note : je travail sur Debian, il faut donc transposer mes commandes pour votre distribution.

Étape 1 : les logiciels en local

Afficher/masquer le code
# aptitude update
# aptitude install openssh-client vgrabbj rsync imagemagick screen
  • openssh-client : notre client SSH
  • vgrabbj : il permettra de capturer les images de la webcam
  • rsync : il sera notre outil d'upload d'image et va s'appuyer sur SSH
  • imagemagick : pour faire un traitement sur l'image (ajouter du texte)
  • screen : pour lancer le script sans monopoliser un terminal

Étape 2 : préparation des répertoires de travail

On va créer un répertoire qui accueillera le script et la capture :

Afficher/masquer le code
# le répertoire du script
$ if [ -d "$HOME/bin" ] || mkdir "$HOME/bin"
# le répertoire de la capture
$ if [ -d "$HOME/.webcam" ] || mkdir "$HOME/.webcam"

Création du fichier :

Afficher/masquer le code
$ cd "$HOME/bin"
$ touch webcam
$ chmod +x webcam

Étape 3 : Et on édite le script

Je propose de faire ça en simple shell, donc pas de bash mais un bon vieux sh (ou dash sur Debian).

Afficher/masquer le code
#!/bin/sh

On prépare des variables de configuration :

Afficher/masquer le code
# Le login et le serveur
SSH_SERVER="simon@exemple.com"
# Des options à passer au client SSH
# -p indique le port de connexion
# -i permet de paramétrer une clé SSH
SSH_OPTIONS=" -p 22 -i $HOME/.ssh/id_dsa" 

# Chemin vers l'image que va générer la webcam
IMG_LOCAL="$HOME/.webcam/webcam.jpg"

# Le chemin de l'image sur le serveur distant
IMG_REMOTE="/services/web/www/exemple.com/public_html/ressources/webcam.jpg"

# Qualité de l'image générée (de 1 à 100 et plus c'est grand, plus c'est zoli)
IMG_QUALITY=75

# Les dimensions de l'image
# sqcif= 128x96,     qsif = 160x120,
# qcif = 176x144,    sif  = 320x240,
# cif  = 352x288,    vga  = 640x480,
# svga = 800x600,    xga  = 1024x768,
# sxga = 1280x1024,  uxga = 1600x1200
IMG_SIZE=sif

# Je vais afficher du texte sur l'image donc je paramètre sa couleur et sa position
IMG_TEXT_COLOR=black
IMG_TEXT_X=8
IMG_TEXT_Y=16

# Le périphérique webcam à utiliser
VIDEO_INPUT=/dev/video0

# Le temps entre deux captures (en secondes)
WAIT=5

# la fonction text va retourner le texte à afficher sur la webcam
text() {
	# ça donnera : login @ mm/jj/aa hh:mm:ss
	echo "$USER @ $(date +'%D %r')"
}

On ajoute une sécurité : ne pas avoir deux scripts qui tente un accès à la webcam en même temps :

Afficher/masquer le code
LOCK="$HOME/.webcam/.lock"

while [ -f "$LOCK" ]; do
	sleep 1
done

touch "$LOCK"

On termine par les commandes de capture, d'écriture du texte et d'upload :

Afficher/masquer le code
# On capture l'image
vgrabbj -i "$IMG_SIZE" -f "$IMG_LOCAL" -d "$VIDEO_INPUT" -q "$IMG_QUALITY" -a 3 -n

# On ajoute le texte
mogrify -fill "$IMG_TEXT_COLOR" -pointsize 11 -annotate +"$IMG_TEXT_X"+"$IMG_TEXT_Y" "$(text)" "$IMG_LOCAL"

# On upload 
rsync -avz -e "ssh $SSH_OPTIONS" "$IMG_LOCAL" "$SSH_SERVER":"$IMG_REMOTE"
# Note : certains seront peut-être plus à l'aise avec scp, c'est comme vous voulez

On termine par boucler tout ça :

Afficher/masquer le code
# on délock l'accès à la webcam
rm -f "$LOCK"

# On fait attendre un peu le script
sleep $WAIT

# On l'exécute lui-même 
"$0"&

# Et on arrête l'exécution courante
exit 0

Le script complet (sans commentaire) :

Afficher/masquer le code
#!/bin/sh

SSH_SERVER="simon@exemple.com"
SSH_OPTIONS=" -p 22 -i $HOME/.ssh/id_dsa" 

IMG_LOCAL="$HOME/.webcam/webcam.jpg"

IMG_REMOTE="/services/web/www/exemple.com/public_html/ressources/webcam.jpg"

IMG_QUALITY=75
IMG_SIZE=sif
IMG_TEXT_COLOR=black
IMG_TEXT_X=8
IMG_TEXT_Y=16

VIDEO_INPUT=/dev/video0

WAIT=5

text() {
	echo "$USER @ $(date +'%D %r')"
}

LOCK="$HOME/.webcam/.lock"
 
while [ -f "$LOCK" ]; do
	sleep 1
done

touch "$LOCK"

vgrabbj -i "$IMG_SIZE" -f "$IMG_LOCAL" -d "$VIDEO_INPUT" -q "$IMG_QUALITY" -a 3 -n
mogrify -fill "$IMG_TEXT_COLOR" -pointsize 11 -annotate +"$IMG_TEXT_X"+"$IMG_TEXT_Y" "$(text)" "$IMG_LOCAL"
rsync -avz -e "ssh $SSH_OPTIONS" "$IMG_LOCAL" "$SSH_SERVER":"$IMG_REMOTE"

rm -f "$LOCK"

sleep $WAIT
"$0"&
exit 0

Étape 4 : la page html

Afficher/masquer le code
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Ma webcam</title>
<script>
// Deux helpers pour attacher un évenement à un object et un selecteur rapide d'élement par id
var addEvent = function(object, eventName, myFunction) {
	if(object.addEventListener) {
		object.addEventListener(eventName, myFunction, false);
	} else if(object.attachEvent) {
		object.attachEvent('on'+eventName, myFunction);
	}
}
var $ = function(id) {
	return document.getElementById(id);
}

// On ne veut pas de clignottement donc entre chaque
// chargement d'image, on attend que celui-ci soit 
// terminé pour mettre à jour l'image dans la page
var image_reload = function(id, time) {
	var img = $(id);
	if(img) {
		var _img = new Image();
		var src = (img.getAttribute('src')).split('?')[0]+'?'+Math.random();
		_img.src = src;
		addEvent(_img, 'load', function() {
			img.setAttribute('src', src);
		});
		window.setTimeout(function() {
			image_reload(id, time);
		}, time);
	}
}

addEvent(window, 'load', function() {
	// id de l'image de la webcam et temps de rafraissement
	image_reload('webcam', 2000); 
});
</script>
<body>

<p><img data-dimension="destroy" id="webcam" src="/ressources/webcam.jpg" alt="" title=""/></p>

</body>

Étape 5 : lancer le script

Afficher/masquer le code
$ screen
$ ./bin/webcam

C'est terminé :)


Barbecue - Light Painting

le feu a toujours attiré des gogoles qui jouent avec. Ce soir, Bastien et moi avont décidé de triper avec les braises pour faire un peu de Light Painting ^^ Voici les meilleurs images :


Les jeux vidéos sont le mal !

Il y a toujours eu des gens cons qui aimaient coller des étiquettes sur le jeux vidéo en qualifiant ce loisir comme dangereux. Bien souvent, si un joueur pète une pile IRL, on clame que c'est les heures de jeux passer sur CS et Quake qui sont derrière tout ça.

J'ai toujours défendu le contraire et je ne suis pas le seul à le penser. Je considère que les jeux peuvent être des facteurs déclenchants mais ils ne sont pas la source des pathologies.

Aujourd'hui, c'est le gouvernement qui vient mettre son grain de sel en faisant un projet de loi débile à souhait et qui ne s'appuie sur aucune vraie étude (ça me rappel Hadopi) :

On considère qu'une personne est « accro » aux jeux lorsqu'elle passe plus de 2 heures par jour sur l'ordinateur ou sur console. Nous avons réalisé une étude dans notre école auprès d'un échantillon d'enfants âgés de 8 à 12 ans. Elle montre que les enfants ont tendance à enfreindre les règles de sécurité pourtant données par leurs parents et à adopter des comportements à risque. 42 % des enfants ne respectent pas les temps de jeux et 60 % la classification par âge du système européen d'information sur les jeux (PEGI).

C'est les parents qui ne font pas leur boulot et pas besoin de jeux vidéo pour le constater : les gamins portent la culotte. Quand j'étais môme, c'était 30 minutes sur le pc. Chaque minute en plus était une claque. Et puis, je crois que la majorité de joueurs n'ont pas 12 ans...

Alcool, tabac, drogue... Face à ces redoutables fléaux et risques pour la santé, force est de développer la prévention.
Son but : changer le regard des jeunes porté sur les jeux vidéo pour lutter contre les risques d'addiction.

Ouai t'as raison, comparez le jeux à ces merdes....*soupir*. Quand vont-il comprendre que leur pub anti-tabac ne fonctionnent pas ? Pourquoi cela marcherait-il avec les jeux ?

Dans un délai d'un an suivant l'entrée en vigueur de la présente loi, le ministre chargé de la santé élabore une charte éthique qui amène l'industrie des jeux vidéo à s'orienter vers une politique du jeu responsable, en favorisant notamment des sessions de jeu plus courtes et marquées de pauses obligatoires de trente minutes, voire plus pour des jeux de longue durée.

Article 3

J'imagine bien le mec, en plein rush, voir son jeu lui dire "Euh...Pause obligatoire mec" XD Ils sont vraiment sérieux ?

Les charges qui pourraient résulter pour l'État de l'application de la présente loi sont compensées à due concurrence par la création d'une taxe additionnelle aux droits sur les tabacs visés aux articles 575 et 575 A du code général des impôts.

Article 4

Alors comme toutes leurs lois de merdes non réfléchie coûtent du fric (oh, j'ai encore Hadopi en tête), il faut bien aller chercher de quoi les financer et aujourd'hui c'est une idée de génie : ce sont les addicts aux clopes qui vont payer la "prévention" pour les potentiels addict aux jeux vidéo XD Du grand n'importe quoi...

Vous n'avez rien d'autre à foutre sérieusement ?


Linux Identity

Alors que j'étais en Angleterre, la rédactrice Caroline Torner qui fait partie de l'équipe de rédaction du magasine « Linux Identity » m'a contacté pour me demander de rédiger un articles sur « Les trucs & astuces pour Debian ». Une proposition intéressante que je me suis empressé de remplir !

Linux Identity

Voila quelques images, je vais essayer de trouver une version PDF du magasine (ou au moins des trois pages qui m'ont été confiées).

Linux IdentityLinux IdentityLinux IdentityLinux Identity

Une expérience supplémentaire à ajouter au CV !


Les hauteurs de Fesches-le-Châtel

Panorama 360° des hauteurs de Fesches-le-Châtel.

Panorama 360° des hauteurs de Fesches-le-Châtel

Afficher : image (jpeg, 5Mo) / Viewer flash