Je viens d'installer l'application Picasa de Google pour gérer toutes mes photos de vacances sur mon MacBook. J'ai été tout simplement bluffé par la fonction qui permet de reconnaître les visages sur les photos et les classer... J'ai cherché un peu de documentation sur le fonctionnement... mais Google n'est pas vraiment la société la plus ouverte qui soit...
En cherchant un peu plus, j'ai fini par trouver : opencv et ça tombe plutôt bien, opencv s'intègre très bien avec Python.
Pour installer Opencv sur votre ordinateur Apple préféré, il suffit d'avoir MacPort et de lancer la commande suivante :
sudo port install opencv
11/14/2010
11/13/2010
Lucene et Jython
Au début, je souhaitais seulement tester un peu la technologie LUCENE : vous savez ce projet de la fondation APACHE, qui vous permet d'utiliser la même technologie que les grands moteurs de recherche sur Internet. Je me suis dis que la meilleure solution était d'utiliser une bibliothèque python... comme pylucene... mais après 1H sur le site à regarder comment j'allais pouvoir faire fonctionner ce machin, je me suis dit : il faut laisser à JAVA ce qui appartient à JAVA... mais je ne voulais pas pour autant quitter le monde des pythoniens... ça tombe bien, d'autres personnes ont déjà fait ce chemin et ont créé un interpréteur python, qui fonctionne au dessus d'une JVM (Java Virtual Machine) et qui permet d'utiliser les bibliothèques JAVA : JYTHON.
Bon, il faut le dire, la documentation LUCENE est pas vraiment des plus explicite et il n'y a pas tant de code qui traine sur Internet... Bon, après une journée à me familiariser avec JYTHON et une autre à me familiariser avec LUCENE, j'ai fini par écrire un "indexer" :
et un système de recherche :
Bon si vous êtes un peu familier avec le python, ce code ne devrait pas trop vous dérouter. Pour le reste, vous aurez noter la présence du fichier "lucene-core-3.0.2.jar" là où je lance mes commandes :
jython createindex.py
et
jython queryindex.py
Amusez-vous bien et n'hésitez pas à me poser des questions si vous rencontrez des difficultés.
Bon, il faut le dire, la documentation LUCENE est pas vraiment des plus explicite et il n'y a pas tant de code qui traine sur Internet... Bon, après une journée à me familiariser avec JYTHON et une autre à me familiariser avec LUCENE, j'ai fini par écrire un "indexer" :
import sys
# Add jars to classpath
jars = ["./lucene-core-3.0.2.jar"]
for jar in jars:
sys.path.append(jar)
from org.apache.lucene.analysis.standard import *
from org.apache.lucene.index import *
from org.apache.lucene.store import *
from org.apache.lucene.util import *
from org.apache.lucene.document import Document, Field
from java.io import File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;
import glob
import os
def listdirectory2file(path):
l = glob.glob(path+"/*")
for i in l:
if os.path.isdir(i):
print "Directory :"+i
print listdirectory2file(i)
else:
print i
indexfile(i)
def indexfile(filename):
global writer
f = open(filename, 'r')
content = f.read()
doc = Document ()
doc.add(Field("name", filename, Field.Store.YES,Field.Index.ANALYZED))
doc.add(Field("content", content, Field.Store.YES,Field.Index.ANALYZED))
writer.addDocument(doc)
path = './toindex'
INDEX_DIR = File("index")
analyzer = StandardAnalyzer(Version.LUCENE_CURRENT)
writer = IndexWriter(FSDirectory.open(INDEX_DIR),analyzer, 1, IndexWriter.MaxFieldLength.LIMITED)
listdirectory2file(path)
#writer.DocCount()
writer.optimize()
writer.close()
et un système de recherche :
import sys
# Add jars to classpath
jars = ["./lucene-core-3.0.2.jar"]
for jar in jars:
sys.path.append(jar)
from org.apache.lucene.analysis.standard import *
from org.apache.lucene.index import *
from org.apache.lucene.store import *
from org.apache.lucene.util import *
from org.apache.lucene.document import Document, Field
from org.apache.lucene.search import IndexSearcher, TopScoreDocCollector
from org.apache.lucene.queryParser import QueryParser
from java.io import File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;
querystring = "test"
path = './toindex'
INDEX_DIR = File("index")
hitsPerPage = 10
analyzer = StandardAnalyzer(Version.LUCENE_CURRENT)
searcher = IndexSearcher(SimpleFSDirectory(INDEX_DIR))
query = QueryParser(Version.LUCENE_CURRENT, "content", analyzer).parse(querystring)
hits = searcher.search(query,hitsPerPage)
for hit in hits.scoreDocs:
print "====="
print hit.score, hit.doc, hit.toString()
doc = searcher.doc(hit.doc)
print doc.get("name").encode("utf-8")
Bon si vous êtes un peu familier avec le python, ce code ne devrait pas trop vous dérouter. Pour le reste, vous aurez noter la présence du fichier "lucene-core-3.0.2.jar" là où je lance mes commandes :
jython createindex.py
et
jython queryindex.py
Amusez-vous bien et n'hésitez pas à me poser des questions si vous rencontrez des difficultés.
5/19/2010
Gource et Dokuwiki : en couleur
ça y est suite aux différentes demandes, je viens d'ajouter la coloration de la représentation Gource. Vous pouvez donc télécharger la nouvelle version.
#!/bin/python
"""
This program parse logs of a dokuwiki
and tranform them for gource (a log viewer)
http://code.google.com/p/gource/
developped by WolverineX02
site : http://wolverinex02.blogspot.com
"""
import glob
import os.path
import getopt
import sys
import re
WHITE = "11FFAA"
GREEN = "00F000"
vector = (1,10,100)
start_page_name = "start"
def RGBToHTMLColor(rgb_tuple):
""" convert an (R, G, B) tuple to #RRGGBB """
hexcolor = '#%02x%02x%02x' % rgb_tuple
# that's it! '%02x' means zero-padded, 2-digit hex values
return hexcolor
def HTMLColorToRGB(colorstring):
""" convert #RRGGBB to an (R, G, B) tuple """
colorstring = colorstring.strip()
if colorstring[0] == '#': colorstring = colorstring[1:]
if len(colorstring) != 6:
raise ValueError, "input #%s is not in #RRGGBB format" % colorstring
r, g, b = colorstring[:2], colorstring[2:4], colorstring[4:]
r, g, b = [int(n, 16) for n in (r, g, b)]
return (r, g, b)
def colormodify(colorstring):
rgb_tuple = HTMLColorToRGB(colorstring)
r, g, b = (rgb_tuple[0]+vector[0]) % 255,(rgb_tuple[1]+vector[1]) % 255,(rgb_tuple[2]+vector[2]) % 255
return RGBToHTMLColor((r, g, b))
def listdirectory(path,color):
l = glob.glob(path+"/*")
for i in l:
if os.path.isdir(i):
listdirectory(i,colormodify(color))
else:
readfile(i,color)
def listdirectory2(path):
"""list all the files like *.changes,
read them and output them in gource's log syntax
"""
for root, dirs, files in os.walk(path):
for i in files:
if (re.search('\.changes$', i)):
fichier = os.path.join(root, i)
readfile(fichier,GREEN)
def readfile(fichier,color):
"""read the file and output for each line of this
file a log line for Gource
"""
myfile = open(fichier, 'r')
for line in myfile.readlines():
mots = line.split('\t')
if len(mots)>=6:
resultat = mots[0] + "|"
if mots[4] == '':
mots[4] = 'Anonymous'
resultat += mots[4] + "|"
resultat += translate(mots[2]) + "|"
resultat += mots[3].replace(':', '/')
if mots[3].rfind(start_page_name) == len(mots[3])-len(start_page_name):
resultat += "|" + color
else:
resultat += "|" + colormodify(color)
print resultat
myfile.close()
def translate(mot):
"""translate the dokuwiki vocabulary to the gource one
C (also cc and sc from discussion plugin) ->A
E (also ec from discussion plugin) -> M
D (also dc and hc from discssion plugin) -> D
other -> M
"""
if mot.upper == "C" or mot == 'cc' or mot == 'sc':
return "A"
elif mot.upper == "E" or mot == 'ec':
return "M"
elif mot.upper == "D" or mot == 'dc' or mot == 'hc':
return "D"
else:
return "M"
def main(argv):
"""principal function
"""
try:
opts, args = getopt.getopt(argv, "hd:", ["help", "dokuwiki="])
except getopt.GetoptError:
usage()
sys.exit(2)
for opt, arg in opts:
if opt in ("-h","--help"):
usage()
sys.exit()
elif opt in ("-d","--dokuwiki"):
print listdirectory(arg,WHITE)
def usage():
"""this function will display how to use this script
"""
print "This script will output change logs of a dokuwiki"
print "in a friendly way for gource"
print "how to use it :"
print "python gourcedoku.py -d ~/Sites/MyDokuwiki/ | sort > dokusort.log"
print "and then :"
print "gource --log-format custom dokusort.log --stop-position 1.0 \ "
print "--stop-on-idle --file-idle-time 10000000"
print "---"
print "-h : help "
print "-d : meta directory of your dokuwiki"
if __name__ == "__main__":
main(sys.argv[1:])
5/15/2010
Gource et Dokuwiki : la video
La vidéo :
obtenue avec la ligne de commande suivante :
obtenue avec la ligne de commande suivante :
gource --log-format custom dokusort.log --stop-position 1.0 --stop-on-idle --file-idle-time 10000000 --output-ppm-stream - | ffmpeg -y -b 3000K -r 60 -f image2pipe -vcodec ppm -i - -vcodec mpeg4 gource.mp4C'est un peu long mais ça marche super bien ;-)
Emulsion de Wasabi
Nous avions goûté cette préparation dans un très bon resto...
En devinant les ingrédients qui pouvaient s'y trouver... nous sommes parvenus à recréer une recette d' Emulsion au Wasabi bien sympa et très simple à réaliser :-)

En voici la recette :
- Liste des ingrédients :

Suggestion :
Vous pouvez la servir à l'apéritif avec des gressins, en accompagnement d'un sashimi de saumon.
Bonne dégustation !
En devinant les ingrédients qui pouvaient s'y trouver... nous sommes parvenus à recréer une recette d' Emulsion au Wasabi bien sympa et très simple à réaliser :-)
En voici la recette :
- Liste des ingrédients :
- 1 càs de wasabi (en tube et non en poudre)
- 1 càs de sauce soja
- le jus d'un demi citron
- 200 ml de crème fleurette
Suggestion :
Vous pouvez la servir à l'apéritif avec des gressins, en accompagnement d'un sashimi de saumon.
Bonne dégustation !
Gource et Dokuwiki
J'ai découvert comme tout un chacun les superbes vidéos de Gource permettant de faire une représentation des modifications faites sur un système de gestion de version comme GIT ou SVN. Je me suis alors rappelé que mon wiki préféré (DOKUWIKI) est lui aussi un système de gestion de version comme un autre... Il suffit en effet de soulever le capot et d'aller regarder dans l'arborescence des dossiers pour y trouver le dossier "data/meta" dans lequel les fichiers "*.changes" renferment justement les informations recherchées. Par exemple, le fichier "systemes_visualisation.changes" ressemble à :
1263135717 ::1 C informatique:systemes_visualisation Wolverine crééeExplication :
1263135988 ::1 E informatique:systemes_visualisation Wolverine
1263136423 ::1 E informatique:systemes_visualisation Wolverine
- Le première colonne est un Unix Timestamp,
- la deuxième est l'adresse IP (je suis en localhost ;-) ),
- la troisième l'action réalisée (C pour créée, E pour éditée,...),
- la quatrième est claire, la cinquième est l'identifiant de la personne ayant modifié la page
- et enfin la dernière colonne est le petit texte que vous pouvez remplir quand vous modifiez une page...
#!/bin/pythonPour le lancer, rien de plus simple : il suffit de se placer dans l'arborescence de son magnifique dokuwiki et la commande magique :
"""
This program parse logs of a dokuwiki
and tranform them for gource (a log viewer)
http://code.google.com/p/gource/
developped by WolverineX02
site : http://wolverinex02.blogspot.com
"""
import os.path
import getopt
import sys
import re
def listdirectory2(path):
"""list all the files like *.changes,
read them and output them in gource's log syntax
"""
for root, dirs, files in os.walk(path):
for i in files:
if (re.search('\.changes$', i)):
fichier = os.path.join(root, i)
myfile = open(fichier, 'r')
for line in myfile.readlines():
mots = line.split()
if len(mots)>=5:
resultat = mots[0] + "|"
resultat += mots[4] + "|"
resultat += translate(mots[2]) + "|"
resultat += fichier
print resultat
elif len(mots)==4:
resultat = mots[0] + "|Anonymous|"
resultat += translate(mots[2]) + "|"
resultat += fichier
print resultat
myfile.close()
def translate(mot):
"""translate the dokuwiki vocabulary to the gource one
C -> A
E -> M
other -> M
"""
if mot == "C":
return "A"
elif mot == "E":
return "M"
else:
return "M"
def main(argv):
"""principal function
"""
try:
opts, args = getopt.getopt(argv, "hd:", ["help", "dokuwiki="])
except getopt.GetoptError:
usage()
sys.exit(2)
for opt, arg in opts:
if opt in ("-h","--help"):
usage()
sys.exit()
elif opt in ("-d","--dokuwiki"):
print listdirectory2(arg)
def usage():
"""this function will display how to use this script
"""
print "This script will output change logs of a dokuwiki"
print "in a friendly way for gource"
print "how to use it :"
print "python gourcedoku.py -d ~/Sites/MyDokuwiki/ | sort > dokusort.log"
print "and then :"
print "gource --log-format custom dokusort.log --stop-position 1.0 \ "
print "--stop-on-idle --file-idle-time 10000000"
print "---"
print "-h : help "
print "-d : meta directory of your dokuwiki"
#print listdirectory2(sys.argv[1])
if __name__ == "__main__":
main(sys.argv[1:])
python gourcedoku.py -d ~/Sites/MyDokuwiki/ | sort > dokusort.logpuis visualiser le résultat avec Gource avec la commande suivante :
gource --log-format custom dokusort.log --stop-position 1.0 --stop-on-idle --file-idle-time 10000000Je vais essayer de mettre ce code sur le site de Gource pour la communauté ;-) N'hésitez pas à me poser des questions ou à améliorer mon script.
Libellés :
dokuwiki,
HowTo,
informatique,
New Product,
Python,
site web,
wiki
1/24/2010
Chromoxy
Je viens de parcourir l'article de LifeHacker sur comment bloquer les publicités dans le navigateur Chrome de Goolge... ce serait un peu comme l'extension AdBlock Plus pour Chrome ;-) voir même encore un peu plus que seulement filtrer les publicités sur Chrome... Je me suis dit que c'est pas mal mais pas très automatique ;-) j'ai donc écrit un petit script pour cela :

Facile non ;-) si vous êtes intéressés, je peux continuer à développer cette "application". J'attends vos retours
et en utilisant Platypus, il devient super facile de créer ensuite une véritable application :
#!/bin/sh
# Demarrage de Privoxy
cd /Applications/privoxy/
./privoxy &
# demarrage de Chrome
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --proxy-server="http://127.0.0.1:8118"
# retour maison
cd

Facile non ;-) si vous êtes intéressés, je peux continuer à développer cette "application". J'attends vos retours
Libellés :
Chrome,
Google,
informatique,
MacOSX,
New Product
12/13/2009
Utiliser les icônes Mac OS X dans Visio
Vous connaissez certainement le programme Visio de suite Microsoft Office qui permet de faire de très beaux schémas... le seul petit hic, ce sont les icônes qui elles sont particulièrement moches... Je vous propose donc deux petites techniques pour importer les très belles icônes de Snow Leopard dans votre Visio.
Première méthode : à la main
Sélectionnez l'application dont vous voulez récupérer l'icône (avec le fameux Pomme+C), puis ouvrez l'application Aperçu
et choisissez "Créer à partir du presse-papiers"
il ne vous reste plus qu'à enregistrer sous et choisir le format PNG. Vous pouvez maintenant importer votre image dans Visio.Deuxième méthode : avec un script
La précédente méthode permet d'extraire une image à la fois, si vous voulez récupérer toutes les icônes d'un Mac OS X, vous pouvez utiliser le script python suivant :
Attention à l'indentation, c'est du python ;-) ... Vous cherchez dans un premier temps l'ensemble des fichiers au format icns (c'est le format des icônes de Mac OS X ;-) ;-) ), puis vous appliquez une transformation de format grâce à l'utilitaite sips disponible sous Mac OS X. L'ensemble des fichiers au format PNG sera disponible dans votre répertoire photos...
#!/bin/python
import os
import re
text = "0000"
out = "~/Pictures/"
stdout_handle = os.popen("find / -name *.icns", "r")
while (text!=""):
text = stdout_handle.readline()
regnamefile = re.compile('\/([^//]*)\.icns')
namefile = regnamefile.findall(text)[0]
regline = re.compile('(\/.*\.icns)')
line = regline.findall(text)[0]
os.system("sips -s format png "+line+" --out "+out+namefile+".png")
Voilà ;-) j'espère que vous ferez de beaux schèmas après ça.
7/06/2009
Chromium (ou Chrome) enfin sous Mac OS X

ça y est il est enfin disponible : le navigateur de Google a été porté sous Mac OS X.
si vous voulez l'installer : rien de plus simple, rendez-vous sur le blog de Chromium. J'aime beaucoup l'avertissement ;-)
6/26/2009
Comment changer une icone sur Mac OS X
Je me suis longtemps posé la question ;-) surtout quand je branche plusieurs clé USB en même temps... C'est en fait très simple :
NB : ma clé USB est noire
- cliquer 1 fois sur l'icone de la clé
- puis Pomme + I (permet d'ouvrir le volet information d'un fichier ou d'un dossier)
- faites glisser votre nouvelle icone en haut à gauche (il y a une petite icone, c'est celle que vous allez remplacer)
NB : ma clé USB est noire
6/03/2009
Lire en même temps des fichiers ac3 et avi
Il vous est certainement déjà arrivé d'avoir une vidéo dans une langue donnée (par exemple du russe ou du chinois) et de vouloir avoir la bande son québécoise (c'est beaucoup plus marrant que la française "Hein René !"). C'est pourquoi vous avez parfois deux fichiers :
Il ne vous reste plus qu'à choisir votre bande son dans l'onglet "audio" de VLC. Bonne vidéo ;-)
Ce ne doit pas être bien plus compliqué sous Linux, par contre sous Windows, je ne sais pas si VLC peut être lancé en ligne de commande
- un fichier avi qui contient le film et une bande son (mais pas la bonne)
- un fichier ac3 qui contient la bonne bande son
/Applications/VLC.app/Contents/MacOS/VLC monfilm.avi --input-slave='monfilm.ac3'
Il ne vous reste plus qu'à choisir votre bande son dans l'onglet "audio" de VLC. Bonne vidéo ;-)
Ce ne doit pas être bien plus compliqué sous Linux, par contre sous Windows, je ne sais pas si VLC peut être lancé en ligne de commande
1/31/2009
LaTeX on Blogger is back
Je n'avais plus vraiment le temps de m'occuper de mon script pour écrire en LaTeX dans Blogger, heureusement qqn vient de reprendre le développement ;-) Merci
http://lifeandmath.blogspot.com/2009/01/fellow-bloggercom-mathematicians.html
http://lifeandmath.blogspot.com/2009/01/fellow-bloggercom-mathematicians.html
11/22/2008
Une citation tellement vraie
Le cerveau est la seule chose qui s'use quand on ne l'utilise pas
cette citationest à rapprocher de cette article du New York Time dans lequel l'auteur écrit :
In fact, the more new things we try — the more we step outside our comfort zone — the more inherently creative we become, both in the workplace and in our personal lives.
Je vous laisse méditer...
LaTeX sur Mac OS X
Il suffit de télécharger sur le site du CTAN le paquet BasicTeX.pkg. Allez voir à cette addresse : http://ctan.tug.org/tex-archive/systems/mac/mactex/. Je vais enfin pouvoir taper correctement mes exercices de math sur mon tout nouveau MacBook ;-)
Papa Noël : je veux des LEGOs
suite au poste suivant, j'ai continué à regarder les vidéos sur Youtube portant sur ces robots et autres voitures en LEGO : c'est génial ;-) Enfin des jeux pour les enfants (ou pour les adultes) qui font vraiment travailler la matière grise. Avec ça, vous allez enfin sentir votre cerveau penser ;-) maintenant quelques vidéos impressionnantes :
- dans celui-ci une roue tournante détecte les obstacles : si elle est bloquée, c'est qu'il y a un obstacle, elle fait donc demi-tour... Je me demande d'où vient la roue LEGO
- dans celui-ci, ce qui est vraiment impressionnant c'est le franchissement de l'obstacle
- dans celui-ci, l'ingénieur (à ce niveau là, il ne peut être qu'ingénieur ou le devenir ;-) ) a remplacé les petits moteurs LEGO par de plus gros moteurs... Regardez bien les différentiels sur les côtés ;-)
Un coffre fort en LEGO
Je viens de tomber sur cette vidéo faite par un passionné des LEGO ou par un des ingénieurs de LEGO (je crois vraiment que je vais me reconvertir et postuler chez LEGO) :
A priori :
A priori :
- il est équipé d'un détecteur de mouvement
- visiblement c'est un code à 5 nombres (de 1 à 32)
- l'ouverture et la fermeture de la porte est automatique
- il y a des bonbons à l'intérieur ;-)
11/16/2008
Minefield : Firefox sous emphétamines
je viens de tester la beta de la future version de Firefox : surnommée Minefield... Vous pouvez la télécharger à l'adresse suivante : http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/ elle est même disponible pour Mac... Au final pas beaucoup de nouvelles fonctionnalités mais une vitesse époustouflante (grace au nouveau moteur TraceMonkey) : enfin Gmail, Adsense ou Blogger se chargent à une vitesse convenable ;-) je vais continuer mais tests et utiliser cette version en lieu et place de mon Firefox... Rendez-vous dans quelques jours pour connaître la suite de mes aventures ;-)
Note supplémentaire : A souligner aussi : la possibilité d'utiliser le mode "private browsing", je ne sais pas ce qu'il en est exactement... point à creuser....
Note supplémentaire : A souligner aussi : la possibilité d'utiliser le mode "private browsing", je ne sais pas ce qu'il en est exactement... point à creuser....
Gmail et la vidéo
ça y est Gmail se tourne aussi vers la vidéo :
finalement pas grand chose de neuf par rapport à MSN messenger... Google continue seulement à rattrapper son retard sur le géant de Redmond...
finalement pas grand chose de neuf par rapport à MSN messenger... Google continue seulement à rattrapper son retard sur le géant de Redmond...
6/15/2008
Firefox 3 et la gestion des Bookmarks
Juste une petite vidéo expliquant comment Firefox 3 révolutionne la gestion des bookmarks... ça c'est le genre de trucs que j'adore et que je sens que je vais utiliser...
Libellés :
informatique,
New Product,
Web Developpement
6/07/2008
Howto : utiliser Wikicalc dans Mediawiki
L'extension médiawiki wikicalc permet d'inclure une feuille de calcul wikicalc dans une page du mediawiki, au moyen d'une nouvelle balise.
La feuille de calcul apparaît dans un cadre avec 2 liens :
Pour intégrer une feuille de calcul dans une page, il faut utiliser la balise . Par exemple :
Pour créer une nouvelle feuille de calcul, rendez-vous à l'adresse suivante : http://wikicalc.wolverinex02.googlepages.com/wikicalccgi.pl
Filtrage selon la couleur
L'attribut important permet de n'afficher que les lignes contenant au moins une cellule de couleur rouge.
Pour plus de flexibilité, l'attribut color= est aussi présent. Cela marche comme l'attribut important sauf qu'on peut choisir la couleur.
Installation de l'extension
Ajouter dans LocalSettings.php :
Créer le nouveau fichier ''extensions/wikicalc.php'' :
Gestion de la concurrence
Les conflits d'édition ne sont pas aussi bien gérés que dans mediawiki.
Si 2 personnes modifient en même temps une feuille de calcul wikicalc, elles peuvent voir les modifications des autres en actualisant la page (en passant de l'onglet edit à publish par exemple).
Par contre, si les 2 personnes modifient en même temps la même cellule, c'est la dernière modification qui est prise en compte (la précédente est écrasée).
La feuille de calcul apparaît dans un cadre avec 2 liens :
- Modifier la feuille de calcul : renvoie directement vers le serveur wikicalc (requiert un login/mdp selon la configuration de wikicalc). Ne pas oublier de publier la page (onglet publish) pour enregistrer la nouvelle feuille de calcul.
- Actualiser : permet de regénérer le cache de la page (nécessaire après avoir modifié la feuille de calcul sur wikicalc).
Pour intégrer une feuille de calcul dans une page, il faut utiliser la balise
Pour créer une nouvelle feuille de calcul, rendez-vous à l'adresse suivante : http://wikicalc.wolverinex02.googlepages.com/wikicalccgi.pl
Filtrage selon la couleur
L'attribut important permet de n'afficher que les lignes contenant au moins une cellule de couleur rouge.
Pour plus de flexibilité, l'attribut color= est aussi présent. Cela marche comme l'attribut important sauf qu'on peut choisir la couleur.
Installation de l'extension
Ajouter dans LocalSettings.php :
###Extension wikicalc##
require_once("$IP/extensions/wikicalc.php");
Créer le nouveau fichier ''extensions/wikicalc.php'' :
/**
*
*
*
* SYNOPSIS
*
* <include src="[URL]" [important] [color="[r,v,b]"] />
*
* INSTALL
*
* Placer ce script dans le dossier 'extensions' de mediawiki :
* "$IP/extensions/wikicalc.php"
* o˘ $IP est le chemin d'installation de MediaWiki.
* Ensuite, ajouter cette ligne dans LocalSettings.php:
* require_once("$IP/extensions/wikicalc.php");
*
* DESCRIPTION
*
* Cette extension vous permet d'inclure une feuille de calcul wikicalc dans
* une page mediawiki.
*
* ATTRIBUTES
*
* La balisedoit toujours avoir au moins un attribut 'src'.
*
* src="[URL]"
* Vous devez inclure 'src' pour indiquer l'URL de la feuille de calcul html.
*
* important
* Seulement les lignes contenant des cellules rouges seront affichées.
*
* color="[r,v,b]"
* Seulement les lignes contenant des cellules de la couleur indiquée seront
* affichÈes.
* Remarque : color="255,0,0" est équivalent au tag 'important'
*/
$wgExtensionFunctions[] = "wf_wikicalc"; $wgExtensionCredits['other'][] = array (
'name' => 'wikicalc',
'author' => 'Matthieu',
'url' => 'yenapa',
'description' => 'Permet d\'inclure une page html distante crÈÈe par wikicalc.',
)
function wf_wikicalc() {
global $wgParser;
$wgParser->setHook( "wikicalc", "render_wikicalc" );
}
/**
* parse_color
*
* retire les lignes (...) contenant des cellules de la couleur $color
*
* $color est une chaine de caractères de la forme "r,v,b" où r,v,b sont des
* entiers entre 0 et 255.
* Par ex : "255,0,0" pour le rouge
*
*/
function parse_color( $table, $style, $color ) { // on recherche le nom des classes css qui correspondent à la bonne couleur de fond. preg_match_all("/\.(s[\d]+) \{[^\}]*background-color:rgb\(".$color."\)[^\}]*}/s", $style, $css_matches, PREG_SET_ORDER);
$tr = "";
// on utilise "/pattern/s" pour éviter le pb des retours à la ligne. // le "?" permet d'inverser la 'greediness' de la regex. preg_match_all("/.*?<\/tr>/s", $table, $tr_matches, PREG_SET_ORDER); foreach ($tr_matches as $tr_tmp) {
foreach ($css_matches as $css_tmp) {
if ( ereg ('(.*)', $tr_tmp[0])) { $tr .= $tr_tmp[0]; } } }
return preg_replace("/.*&<\/tr>/s", $tr, $table); }
/**
* render_wikicalc
*
* This is called automatically by the MediaWiki parser extension system.
* This does the work of loading a file and returning the text content.
* $argv is an associative array of arguments passed in thetag as
* attributes.
*
* @param mixed $input unused
* @param mixed $argv associative array
* @param mixed $parser unused
* @access public
* @return string
*/
function render_wikicalc ( $input , $argv, &$parser )
{
if ( ! isset($argv['src']))
return "ERROR:tag is missing 'src' attribute.";
$output=file_get_contents($argv['src']);
if ($output === False)
return "ERROR: include could not read the given src URL.";
if (ereg ("()", $output, $table_reg)) {
$table = $table_reg[1];
} else {
echo "erreur";
}
if (ereg ("()", $output, $style_reg)) {
$style = $style_reg[1];
$style = ereg_replace("body[^\}]*}", "", $style);
} else {
echo "erreur ';
$purge = '[[{{fullurl:{{FULLPAGENAME}}|action=purge}} {{{1|Actualiser}}}]]';
$parsedText = $parser->parse($purge, $parser->mTitle, $parser->mOptions, false, false);
$purge = $parsedText->getText();
return $style2.$style.'';
'.$purge.$edit.' '.$table.'
}
?>
Gestion de la concurrence
Les conflits d'édition ne sont pas aussi bien gérés que dans mediawiki.
Si 2 personnes modifient en même temps une feuille de calcul wikicalc, elles peuvent voir les modifications des autres en actualisant la page (en passant de l'onglet edit à publish par exemple).
Par contre, si les 2 personnes modifient en même temps la même cellule, c'est la dernière modification qui est prise en compte (la précédente est écrasée).
Libellés :
HowTo,
informatique,
site web,
Web Developpement
Inscription à :
Articles (Atom)