mercredi, janvier 03, 2007

Shell script to launch Saxon

Here is the little script I use to start Saxon from the command line. With the help of two or three environment variables, it can be used as your day-to-day XSLT transformer. But having options to deal with the class path, it can also be used in Makefiles (or whatever) in projects that use extensions or even modified version of Saxon.

I think the doc a the beginning of the script is clear enough. Unfortunately, I can't translate it to a Windows BATCH script as I don't know it. The script is below and can be downloaded here.


#! /bin/sh

## saxon [--b|--sa]? [--catalogs=...]* [--catalog-verbose[=...]]* \
## [--add-cp=...]* [--cp=...]* <original Saxon args>
##
## Order of arguments is not significant, but the arguments to be
## forwarded to Saxon must be at the end. See below for an
## explanation of the arguments.
##
## Depends on the following environment variables:
##
## - APACHE_XML_RESOLVER_JAR (if catalogs are used)
## - SAXON_SCRIPT_DIR (must contain saxon8.jar or saxon8sa.jar, and
## the licence file and saxon8-sql.jar if used)
## - SAXON_SCRIPT_HOME (if different from $HOME, for tilde "~"
## substitution)

JAVA=java

# Use saxon8.jar if the default has to be the B version.
SAXON_JAR="${SAXON_SCRIPT_DIR}/saxon8sa.jar"
SAXON_SQL="${SAXON_SCRIPT_DIR}/saxon8-sql.jar"

# Use net.sf.saxon.Transform if the default has to be the B version.
SAXON_CLASS=com.saxonica.Transform
CATALOG_VERB=1
USE_SQL=false
if [[ -z "$SAXON_SCRIPT_HOME" ]]; then
MY_HOME=$HOME
else
MY_HOME=$SAXON_SCRIPT_HOME
fi
CP_DELIM=";"

while echo "$1" | grep -- ^-- >/dev/null 2>&1; do
case "$1" in
# XSLT Basic version.
--b)
SAXON_CLASS=net.sf.saxon.Transform;;
# XSLT Schema-Aware version.
--sa)
SAXON_CLASS=com.saxonica.Transform;;
# Add XML Catalogs URI resolution, by adding a catalog to the
# catalog list. Resolve "~" only on the head of the option.
# May be repeated.
--catalogs=*)
# Add separator.
if [[ -n $CATALOGS ]]; then
CATALOGS="$CATALOGS$CP_DELIM"
fi
# Resolve "~".
TMP_CAT=`echo $1 | sed s/^--catalogs=//`
if echo "$TMP_CAT" | grep -- '^~' >/dev/null 2>&1; then
TMP_CAT="$MY_HOME"`echo $TMP_CAT | sed s/^~//`;
fi
CATALOGS="$CATALOGS$TMP_CAT";;
# Set the XML Catalogs resolver verbosity.
--catalog-verbose=*)
CATALOG_VERB=`echo $1 | sed s/^--catalog-verbose=//`;;
# Set the XML Catalogs resolver verbosity to 3.
--catalog-verbose)
CATALOG_VERB=3;;
# Add some path to the class path. Resolve "~" only on the
# head of the option. May be repeated.
--add-cp=*)
# Resolve "~".
TMP_CP=`echo $1 | sed s/^--cp=//`
if echo "$TMP_CP" | grep -- '^~' >/dev/null 2>&1; then
TMP_CP="$MY_HOME"`echo $TMP_CP | sed s/^~//`;
fi
ADD_CP="$ADD_CP$CP_DELIM$TMP_CP";;
# Set the class path. Resolve "~" only on the head of the
# option. May be repeated.
--cp=*)
# Resolve "~".
TMP_CP=`echo $1 | sed s/^--cp=//`
if echo "$TMP_CP" | grep -- '^~' >/dev/null 2>&1; then
TMP_CP="$MY_HOME"`echo $TMP_CP | sed s/^~//`;
fi
CP="$CP$CP_DELIM$TMP_CP";;
# Add the Saxon SQL jar to the class path.
--sql)
USE_SQL=true
esac
shift;
done

if [[ -z "$CP" ]]; then
CP="$SAXON_JAR"
fi

if [[ "$SAXON_CLASS" = com.saxonica.Transform ]]; then
CP="$CP$CP_DELIM$SAXON_SCRIPT_DIR"
fi

if [[ "$USE_SQL" ]]; then
CP="$CP$CP_DELIM$SAXON_SQL"
fi

if [[ -z "$CATALOGS" ]]; then
"$JAVA" \
-cp "$CP$ADD_CP" \
$SAXON_CLASS \
"$@"
else
"$JAVA" \
-cp "$CP$CP_DELIM$APACHE_XML_RESOLVER_JAR$ADD_CP" \
-Dxml.catalog.files="$CATALOGS" \
-Dxml.catalog.verbosity=$CATALOG_VERB \
$SAXON_CLASS \
-r org.apache.xml.resolver.tools.CatalogResolver \
-x org.apache.xml.resolver.tools.ResolvingXMLReader \
-y org.apache.xml.resolver.tools.ResolvingXMLReader \
"$@"
fi

mercredi, décembre 13, 2006

Saterday Night Fever

This saterday, party at home. Below is the nice ad from Raf. Congrats Raf!



mercredi, février 01, 2006

XSLT Debugger

J'ai reflechi a propos d'un debugger XSLT pour Emacs. Voici les quelques idees sur son architecture et la maniere de continuer l'investigation.

J'ai poste un email sur la ML Saxon, afin de voir les possibilites du cote Saxon. Au pire, il devrait toujours etre possible de detourner 'TraceListener', se servant de sa nature de hook dans tous les moments clefs du traitement. Il faudrait alors voir les infos disponibles depuis ce mecanisme, et celles qu'il faudra cacher dans Emacs. 'AbstractTraceListener' est evidemment un exemple d'utilisation de 'TraceListener'.

Cote architecture, un programme autonome en ligne de commande. Ce sera l'interface utilisee depuis Emacs (et avec une lib genre ReadLine, ce sera utilisable comme un shell).

Pour les breakpoints, il devrait etre simple de poser des breakpoints sur des lignes de l'arbre source, ou des instructions XSLT. A chaque appel de 'enter()', on verifie s'il y a un BP sur cette instruction. A chaque appel de 'startCurrentItem()', on verifie s'il y a un BP sur le nouveau noeud (si un noeud).

Et lorsque l'on rencontre un BP, on appelle une fonction qui boucle sur des entres (genre ReadLine), permettant un ensemble de commandes. Dans un premier temps, supporter quelques affichages simples. Sur un 'quit', la fonction retourne et le traitement continue (si l'on utilise 'step', il faut bien sur faire en sorte que le prochain appel a 'enter()' et/ou 'startCurrentItem()' fasse ce qu'il faut [concept de mode d'execution : stepping or running or stopped or ...]).

Comme premier test, realiser un tel petit programme qui permet de poser des breakpoints et afficher quelques infos interessantes.

Tags:

lundi, novembre 21, 2005

Javascript et Prototype

Je me met doucement à bricoler avec Javascript. Ian m'a renseigné aujourd'hui un bibliothèque très intéressante, Prototype. Plutôt petite et dépouillée, elle contient pourtant les fonctionalités intéressantes et des idées nouvelles.

Outre sa fonctionnalité première de simplification intelligente de l'utilisation d'AJAX, elle offre des routines de base (toggle du display), un sélecteur d'éléments par IDs, etc.

La doc originale a été traduite en français. Voir aussi les projets associés, comme Rico et Behaviour, sur la homepage de Prototype. D'autres liens proposes par Ian : RIALTO et dojo (qui a l'air TRES interessant, voir par exemple la Fisheye List ou l'Editor Widget).

Tags:

vendredi, novembre 11, 2005

Découverte des Web Services, de SOA, et mise en pratique

Je commence de découvrir le monde des Web Services et de SOA. Je pense que de bons points de départs sont les entrées de WikiPedia Service-oriented architecture, Web service et d'autres comme SOAP, WSDL, UDDI ou BPEL. Me familiariser également avec les OASIS Web Services Committees et le Web Services Activity du W3C.

La lecture d'un bon bouquin sera le point suivant. Je préfère pour l'instant lire un livre en français, puisqu'au-delà de l'aspect technique, il y a un aspect de découverte sémantique (et je ne maîstrise pas suffisamment l'anglais pour ça). J'ai découvers quelques bouquins, listés sur ma wish list web Amazon.

Le point suivant est de mettre en pratique les infos acquises, en réalisant un ou deux petits clients en CL pour les Web Services de Google, Yahoo! (notamment Flickr) ou Amazon (voir le blog dédié).

L'idée est de commencer bas-niveau, avec une bibliothèque HTTP, et éventuellement SOAP, XML et XML Schema, et d'accéder de manière utile aux Web Services. L'idée à moyen terme est bien sûr de me familiariser avec ces technologies, et éventuellement d'en dégager une vue d'assez haut-niveau pour réaliser une bibliothèque de support dédiée côté client. À plus long terme, le côté serveur serait intéressant, mais je n'en suis pas là.

Tags:

dimanche, juillet 24, 2005

Développement Web, UCW, SourceForge et Lisp on Lines

Il semble que UCW n'ai plus strictement besoin d'un serveur Web (plutôt, il peut utiliser SLIME). Voir si cela peut faire en sorte d'être installé sur SF. Par exemple en utilisant des redirections. En fait, dans le pire des cas, il devrait être possible d'utiliser 'mod_perl' et un script qui forwarde vers un sous-serveur CL. Cfr. l'article <42ecfb69@news.broadpark.no> sur c.l.lisp.

Documenter alors cette installation.

Regarder aussi au blog de Bill Clementson, et au Lisp on Lines de 'drewc', similaire à 'Ruby on Rails'.

Marco a donné sur c.l.lisp des infos d'install d'UCW, dans l'article <m2mznzdn8v.fsf@soma.local> :
  • 1) grab ucw, arnesi and yaclml from darcs:

    $ darcs get http://common-lisp.net/project/ucw/repos/ucw_dev
    $ darcs get http://common-lisp.net/project/bese/repos/arnesi
    $ darcs get http://common-lisp.net/project/bese/repos/yaclml

  • 2) grab puri, iterate and rfc2388 for the respective web sites.

  • 3) create a directory with symlinks to the .asd files for all these libs.

  • 4) add said directory to you asdf:*central-regstry* (put something along the lines of (push "/path/to/dir/systems/" asdf:*central-regstry*) to your .sbclrc or similar)

  • 5) edit ucw/bin/start.lisp and make sure that your using the httpd backend (the (use-httpd-backend) form should be uncommented, all the others commented or just deleted).

  • 6) from a terminal load up ucw/bin/start.lisp (do this from a "fresh" lisp image (iow don't load up any packages or onything before loading the start.lisp file)).

  • 7) point your browesr to http://127.0.0.1:8080/ucw/examples/index.ucw

    since you're using the httpd backend you wont get the stylesheets or the javascirpt stuff (i haven't yet taught it to server static content) but it should be enough to get you started.

  • 8) open up emacs+slime, type M-x slime-connect RET RET RET.


Tags:

samedi, juillet 09, 2005

TODO manager, PIM, Wiki, etc.

En fait, je me demande si une solution à base de WikiMode (ou plutôt Muse) ne serait pas intéressante, ne serait-ce que comme mise en oeuvre rapide.

Cfr. par exemple le présent wiki/blog/.... Lui demander ce qu'il utilise exactement comme configuration. Je pense que ce pourrait être un bon départ. Cfr. également, intéressant pour des idées, Blogs Are Dead, Emacs Wiki Blog et EmacsWiki Patches.

L'aspect application web n'est cependant pas à perdre de vue. Et l'application CL est toujours d'actualité. Notamment pour la gestion des différents types d'éléments, et leur catégorisation. Au delà de la gestion des données en externe, il y aurait un front-end Emacs, bien sûr.

Bon, c'est une bonne idée à court terme, jusqu'à début septembre :-). D'ici là, ça me permettera d'y voir plus clair ...

mardi, juillet 05, 2005

lundi, juillet 04, 2005

TODO: todo mode, drkm-mml et EIEIO

Il faut absolument que je me trouve un TODO Mode pour Emacs, et que j'arrête d'utiliser mon blog à cette fin (ce n'est vraiment pas adapté). Voir à ce sujet une discussion récente (3 juillet 2005) sur gnu.emacs.help. (Re-)tester ORG Mode, mais je n'en étais pas vraiment satisfait. ÀMHA, la solution PIM externe (en CL) + interface Emacs (+ interface web) devrait être intéressante.

En fait, je pense que je vais dépenser un peu de temps dans Planner. Cfr. PlannerMode, MuseMode et PlannerMusePort. Et également une discussion récente sur f.c.a.emacs (vers le 5 juillet).

M'occuper également de 'drkm-mml', dont le but est de modifier Gnus MML pour ne plus générer du MultiPart MIME, mais utiliser un 'taggage' du message, afin d'être compatible avec tous les lecteurs de news (notamment Google Groups). Cfr. une note que j'y ai ajouté, vers la fin du fichier.

M'occuper également de EIEIO avant la sortie de CEDET 1.0. La première chose à faire est de documenter les mécanismes internes (représentations des classes, des objets, des generic functions, des méthodes, mécanisme d'appel des generic functions, etc.). Après, ..., ben après je verrai bien. Une plus grande conformance à CLOS serait fortement intéressante. Et l'introduction de MOP à certains endroits également (par exemple créer des objets pour les generic functions et les méthodes pourraient aider à l'implémentation d'une 'no-next-method' plus standard). Cfr. pour commencer une discussion récente avec Eric sur cedet-devel (commencée le 2 juillet, nommée « no-next-method in SemanticDB ».

vendredi, juin 17, 2005

TODO: FAQ de f.c.a.emacs

Tiens, mettre sur pieds une FAQ pour f.c.a.emacs. (installation, différentes distro, obtenir un backtrace, demander de l'aide, etc.)

jeudi, juin 16, 2005

TODO: nXML et liens

Développer le support pour nXML des "liens". Par exemple des a/@href pour XHTML, etc. Il faut bien sûr tenir compte de XLink. Lennart Borgman a proposé un truc ce soir sur la liste nXML. Mais je pense que cela est trop orienté XHTML et même juste a/@href (à première vue).

Ce qu'il faut, c'est un moyen générique d'identifier les liens en fonction du type de document utilisé. En fait, pour ce qui est du folding également. Il serait intéressant pour nXML de disposer d'infos parallèles aux schémas RNG pour ce genre de choses (p.e. pour XHTML : a/@href représente un lien, extractible par ..., etc.).

Au moins, permettre de spécifier un chemin XPath (au moins une succession d'éléments et attributs) qui contiennent des URIs.

samedi, juin 11, 2005

PIM

TODO: Cette entrée n'est pas finie. Rédiger. Et reprendre mes notes manuscrites.

Une page intéressante est la homepage de Bill Clementson. Elle regroupe un ensemble d'outil, comme des moteurs de recherche, des annuaires, des dictionnaires, des recherches de livres ou de films, etc.

Des pages comme « Mon Yahoo! » ou « My SF.net » peuvent également être intéressantes.

Je pourrais également inclure des bibliographies. Avec liens vers Amazon (comme sur la page d'accueil de Plone. Ou comme les « z'idées cado » d'Amazon.

Content Management System

En fait, je m'oriente de plus en plus vers quelque chose comme un CMS (Content Management System) -- ou ECM (Enterprise Content Management). Les exemples les plus connus sont Plone et CPS Project (Collaborative Portal Server). EmacsFR utilise d'ailleurs CPS.

Serveur de pages web statiques vs/ serveur applicatif

Il s'agirait donc bien d'une application réelle, utilisant UCW. Mais le serveur Web pourrait servir lui-même certaines pages, plus statiques (en fait, la plupart des requêtes devraient être de telles pages).

UCW servirait alors pour modifier les pages. Lors d'une modification, il modifie les pages statiques. Ou lors de requêtes de recherche plus spécifique, en lecture seule alors.

Personal Information Manager

En fait, c'est même vers un PIM complet que je m'oriente. Agenda, bookmarks, carnet d'adresses, blog, etc. Le tout interconnecté. Et sous forme web, donc disponible de partout. En un unique endroit.

Bibliothèques Common Lisp

Le but est alors de fournir une série de bibliothèques Common Lisp de gestion de tels éléments (un peu la partie modèle d'une architecture MVC). Ces bibliothèques seraient utilisables indépendamment, dans des applications standalone.

Il y aurait alors au-dessus le site proprement dit (la partie vue/controleur), faisant le pont vers UCW.

...

Un exemple de DotClear se trouve ici.

DotClear
screenshots
themes
Moon over Moscow
Newspaper 1.0
Triptik, colonnes fluides

Exponent (Exponent Content Management System) semble avoir une architecture modulaire intéressante. Voir la liste des modules disponibles : article manager, bulletin board, faq, image gallery, listing manager, page displayer et slideshow.

Même chose pour XOOPS, qui lui propose plus d'une centaine de modules, et semble bien plus complet.

Tiré d'une introduction à XOOPS :

XOOPS is a powerful, flexible and easy to use Content Management System (CMS) based on the scripting language PHP. When installed on a web server with MySQL, it allows administrators to manage dynamic websites, build online communities, handle users, modify at will a site's layout, and feed content through a simple interface. XOOPS handles 'the hard stuff' leaving you free to focus on the content of your website.

XOOPS stands for: eXtensible Object Oriented Portal System.

[...]

Chapter 3. Summary of Features

3.1. Easy Installation
3.2. Database-driven
3.3. Modular, Object-Oriented Design
3.4. Layout and Theme Management System
3.5. Smarty Template Engine
3.6. Group-based Permission and Access
3.7. Great Search Function
3.8. User Management
3.9. Multi-byte Language Support
3.10. Built in Image Manager
3.11. Friendly, Supportive Community
3.12. Organized Development Process

Chapter 4. Official Modules

4.1. News
4.2. NewBB
4.3. Polls
4.4. Web Links
4.5. Downloads
4.6. Headlines
4.7. FAQ
4.8. Partners
4.9. Members
4.10. Contact Us


How do I decide what is the best CMS for me? - My Dream CMS! - OSCOM - The international association for Open Source Content Management

Conclusion (et où tout commence)

Bon, tout ce monde m'est encore plutôt inconnu. Voici les deux premières choses par où commencer, en parallèle :

* dresser un inventaire des solutions existantes et intéressantes (CMS et PIMs), et en dégager les concepts majeurs, et fonctionalités intéressantes (ce qui aboutira en la rédaction, enfin, de cette entrée ; en fait de deux entrées : CMS & PIM, et conception de mon PIM Web ) ;

* programmer un système simple de gestion de bookmarks avec UCW (commcer éventuellement par le Wiki qu'ils donnent en exemple) pour ma familiariser avec la bête (et voir les possibilités réelles).

Je pense que je vais m'orienter pour une architecture style MVC, de modules (+/-) indépendants (admin, bookmarks, agenda, blog, ...). Une idée intéressante est celle de My Yahoo!, où l'on se crée une page en assemblant des modules (ce qui est assemblé sont des VUES spéciales, résumées, des services).

Pour le côté Web, la couche VUE se sépare en deux. La génération XHTML, qui est plus une structuration logique de la vue, et CSS, qui spécialise effectivement l'apparence.

vendredi, juin 03, 2005

Common Lisp Web Programming

Je me suis un peu intéressé à la programmation d'un site web en Common Lisp. Voici les infos que j'ai pu trouver. Il y a d'un côté les sytèmes de publication et autres serveurs web supportant Common Lisp, et de l'autre côté les hébergeurs supportant Common Lisp.

TODO: Cfr. CL Web Server Options, et intégrer ces infos ici.

Outils

Il y a d'abord eu récemment un fil intéressant sur comp.lang.lisp, « open source e-commerce ». C'est à cette occasion que j'ai découvert UnCommon Web (a.k.a. UCW), grâce à Pascal Bourguignon. Dans un autre fil intéressant, « Lisp and Web Programming », il en dit : « If you're serrious about web programming, consider UCW. UnCommon Web is a Common Lisp web application development framework. »

C'est également à l'occasion de ce premier fil que j'ai entendu parler de bknr. Je ne suis pas certain de bien coprendre la place de ce dernier. Sa description sur cliki en dit : « bknr is an object datastore, a template system, a web framework and support for images, blogs, billboards, etc. »

Côté serveurs, j'ai entendu parler de Araneida, un serveur en Common Lisp, et mod_lisp, une extension Apache pour le support de Common Lisp. Mais je n'ai pas regardé plus loin.

À noter également la page de cliki dédiée aux « web clients, servers, application servers, browsers, etc. », où l'on retrouve entre autres toutes ces références : c'est ici.

Hébergement

Pour ce qui est de l'hébergement, il y a eu également un fil à ce sujet : « Lisp hosting?. Voici les infos que j'en ai retirées. Mais ne t'y précipites pas, j'ai gardé le meilleur pour la fin.

J'y ai d'abord découvert tech.coop. Le prix de base d'un hébergement est de 7.50 CAD (dollar canadien), mais cela monte très vite dès que l'on ajoute des options ou de l'espace disque. Pour le support Lisp, on ne s'en sort pas en dessous de 20 ou 25 CAD (une quainzaine d'Euros, au 2005-06-03).

À ce prix là, un hôte virtuel peut sembler une solution bien plus souple. On dispose d'un serveur dédié (ou plutôt d'un Linux tournant en UML, simmulant un hôte dédiée, avec accès root, en fait partagé entre plsuieurs). On peut trouver, par exemple sur Bytemark, un tel serveur pour 15 GBP (livre sterling, 22,27 Euros au 2005-06-03).

Et c'est enfin dans ce fil que j'ai découvert la page Lisp-friendly Web Hosting, listant de tels hébergeurs. Le parcours de la liste n'est pas des plus palpitants, et puis, le dernier élément : RootRoute. Ils offrent à la fois de l'hébergement et des serveurs dédiés. Ces derniers sont hors de prix, mais l'hébergement est tout à fait abordable, et comporte quasiment toutes les fonctionalités d'un serveur dédié (y compris la permission d'installer ses propres softs).

Ces offres d'hébergement s'étallent de 10 à 30 USD (dollar US), par tranches de 5 USD, donc de 8 à 25 Euros au 2005-06-03. Bien sûr, l'offre à 10 USD n'offre par exemple que 200 Mo. d'espace disque, et quelques fonctionalités en moins. Mais celle à 15 USD offre déjà 1 Go. Et il y a déjà une liste réellement impressionante de fonctionalités communes. En plus de l'évolutivité liée aux différents services de base, il existe en plus une série d'options activables indépendemment.

En conslusion, concernant les hébergeurs, je pense que RootRoute fournit une solution extrêmement abordable, tout en ayant une série impressionnante de fonctionalités et étant évolutive.

C'est donc à cette occasion que j'ai découvert *hyper-cliki*, un wiki Lisp hébergé par tech.coop. Il contient à ce sujet deux entrées très intéresantes : Web Programming et Web/Continuation.

mardi, mai 31, 2005

L'île aux fleurs

La trop inconnu cinéma brésilien réserve de bonnes surprises ...

dimanche, mai 29, 2005

Start

Ok. Je me lance finalement dans un blog. Le but étant de voir un peu plus ce que cela vaut et comment cela marche exactement. Notamment cette offre de blogger.com.

(À suivre ...)