ACM2 / Open Seminar Exchange Format

Présentation Mathrice d'octobre 2005
Version du document: 1.0

Rédacteur : David Delavennat (UMR CNRS 8050)

Relecteur : Alain Prignet (UMR CNRS 8050)

ACM 1.0
( l'existant )

ACM 1.0 : Description (1/2)

L'Agenda des Conférences de Mathématiques, créé par Stéphane Cordier en 1998, permet via un système de balises, de collecter les informations relatives aux séminaires sur les sites web des laboratoires qui en font la demande.

ACM 1.0 : Description (2/2)

ACM 1.5
( normalisation )

ACM 1.5 : Quelle(s) évolution(s)?

Spécifier un format d'échange permettant notamment :

ACM 1.5 : Quelle(s) évolution(s)?

Dans le but d'améliorer le service fourni par l'ACM, il est proposé les éléments suivants :

ACM 1.5 : Méthodologie de diffusion des listes de séminaires

Un laboratoire souhaitant faire référencer ses séminaires sur le serveur de dépôt commun peut facilement les soumettre au format OSEF depuis son propre serveur web.

par exemple : http://mon-laboratoire.mon-domaine.fr/umr9089.osef

Un script exécuté à interval régulier (chaque jour) sur le serveur de dépôt récupère ce fichier depuis les serveurs des laboratoires ayant demandé leur affiliation et le valide à l'aide du schéma XML-OSEF.

Si un fichier est valide, les données qu'il contient sont importées dans le dépôt commun SQL (dans la négative, on peut par exemple envoyer un mail au contact ACM du laboratoire).

ACM 1.5 : Méthodologie d'alimentation du dépôt SQL

Pour garder la compatibilité avec la méthodologie d'alimentation du dépôt SQL de l'ACM 1.0, le référentiel est l'ensemble des fichiers XML OSEF, pas le dépôt SQL qui est détruit avant chaque nouvelle alimentation.

Ainsi la mise à jour ou la supression d'un séminaire se fait dans les fichiers XML OSEF eux mêmes et sont répercutées au dépôt SQL lors de l'alimentation suivante.

Les fichiers XML OSEF valides (au sens XML Schéma) sont ajoutés au dépot, en séquence.

API d'abstraction « Open Seminar Exchange Format »

Nous définissons ci-dessous une API indépendante du format XML-OSEF lui même.

Note 1 : les notations correspondent au langage Ruby mais sont assez proches d'un langage de spécification Objet.

Note 2 : OSEF est un module, Osef un objet, new une methode.

API d'abstraction « Open Seminar Exchange Format »

MéthodeDescription
OSEF::Osef.new("fichier.osef") crée un objet OSEF abstrait à partir du fichier XML OSEF
OSEF::Osef.echo retourne une chaine de caractère au format XML OSEF
OSEF::Osef.version retourne un réel positif représentant le numéro de version OSEF
ex: 0.1
OSEF::Osef.etablissement retourne une chaine de caractère représentant le nom
de l'établissement auquel est rataché le laboratoire.
ex: "CNRS"
OSEF::Osef.id retourne une chaine de caractère représentant l'identifiant
du laboratoire dans son établissement.
ex: "UMR 8050"

API d'abstraction « Open Seminar Exchange Format »

MéthodeDescription
OSEF::Osef.nom retourne une chaine de caractère représentant le nom
du laboratoire.
ex: "Laboratoire d'Analyse et de Mathématiques Appliquées"
OSEF::Osef.urlretourne une chaine de caractère contenant un lien vers la page internet du laboratoire
ex: "http://umr-math.univ-mlv.fr/"
OSEF::Osef.maj retourne une table de hashage contenant l'horodate de dernière mise à jour.
ex: { :jour=>"26", :mois=>"05", :annee=>"2005", :heure=>"12", :minute=>"30" }

API d'abstraction « Open Seminar Exchange Format »

MéthodeDescription
OSEF::Osef.seminairesretourne un tableau de séminaires
OSEF::Seminaire.horodate retourne une table de hashage contenant l'horodate à laquelle se déroule le séminaire.
ex: { :jour=>"15", :mois=>"06", :annee=>"2005", :heure=>"9", :minute=>"30" }
OSEF::Seminaire.lieu retourne une chaine de caractère représentant le lieu où se déroule le séminaire
ex: "UMLV 3.075"
OSEF::Seminaire.cadre retourne une chaine de caractère représentant le cadre dans lequel se déroule le séminaire
ex: "Groupe de travail méthodes probabilistes en convexité"

API d'abstraction « Open Seminar Exchange Format »

MéthodeDescription
OSEF::Seminaire.domaine retourne une chaine de caractère représentant le domaine d'appartenance du séminaire
ex: "Probabilités"
OSEF::Seminaire.intervenant retourne une table de hashage contenant les caractéristiques de l'intervenant.
ex: { :prenom=>"Grigoris", :nom=>"PAOURIS", :etablissement_nom=> "University of Crete", :etablissement_nationalite=>"Grèce" }
OSEF::Seminaire.sujet retourne une chaine de caractère représentant le sujet du séminaire
ex: "A short proof of the Harris-Kesten theorem on the percolation Z2 d'après Bollobas and Riordan"

Le format XML-OSEF

Le bloc XML « references » permet de définir les informations administratives relatives au laboratoire. Le bloc XML « seminaires » contient la succession de blocs XML décrivant un séminaire.

<?xml version='1.1' encoding='iso-8859-1'?>
<osef xmlns="http://acm.smai.emath.fr/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://acm.smai.emath.fr seminaires.xsd">
    <references>
        ...
    </references>
    <seminaires>
        ...
    </seminaires>
</osef>

Le format XML-OSEF : Example

<?xml version='1.1' encoding='iso-8859-1'?>
<osef xmlns="http://seminaire.math.cnrs.fr/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://seminaire.math.cnrs.fr osef.xsd">
    <description>seminar exchange format</description>
    <version>0.1</version>
    <references>
        <etablissement>CNRS</etablissement>
        <nom>Laboratoire d'Analyse et de Mathématiques Appliquées</nom>
        <id>UMR 8050</id>
        <url>http://umr-math.univ-mlv.fr/</url>
        <maj>
            <jour>26</jour>
            <mois>05</mois>
            <annee>2005</annee>
            <heure>12</heure>
            <minute>30</minute>
        </maj>
    </references>
    ...

Le format XML-OSEF : Example

    ...
    <seminaires>
        <seminaire>
            <horodate>
                <jour>24</jour>
                <mois>05</mois>
                <annee>2005</annee>
                <heure>10</heure>
                <minute>30</minute>
            </horodate>
            <lieu>UMLV 3.075</lieu>
            <cadre>Groupe de travail méthodes probabilistes en convexité</cadre>
            <domaine>Probabilités</domaine>
            <intervenant>
                <prenom>Grigoris</prenom>
                <nom>PAOURIS</nom>
                <etablissement>
                    <nom>University of Crete</nom>
                    <nationalite>Grèce</nationalite>
                </etablissement>
            </intervenant>
            <sujet>
                A short proof of the Harris-Kesten theorem
                on the percolation Z2 d'après Bollobas and Riordan
            </sujet>
            <url>http://umr-math.univ-mlv.fr/seminaires/documents/conf-p12-13012005-1430-mendes.pdf</url>
        </seminaire>
        ...

Le format XML-OSEF : Example

        ...
        <seminaire>
            <horodate>
                <jour>24</jour>
                <mois>05</mois>
                <annee>2005</annee>
                <heure>10</heure>
                <minute>30</minute>
            </horodate>
            <lieu>UMLV 3.075</lieu>
            <cadre>Groupe de travail méthodes probabilistes en convexité</cadre>
            <domaine>Probabilités</domaine>
            <intervenant>
                <prenom>Matthieu</prenom>
                <nom>FRADELIZI</nom>
                <etablissement>
                    <nom>Université de Marne-la-Vallée</nom>
                    <nationalite>France</nationalite>
                </etablissement>
            </intervenant>
            <sujet>
                A short proof of the Harris-Kesten theorem
                on the percolation Z2 d'après Bollobas and Riordan
            </sujet>   
        </seminaire>
    </seminaires>
</osef>

Implantation de l'API OSEF en Ruby (1/2)

require 'rexml/document'
module OSEF
    class Osef
        attr_reader :version, :etablissement, :id, :nom, :url, :maj, :seminaires
        def initialize(_filename)
            @xml           = REXML::Document.new(File.new(_filename))
            @version       = @xml.elements["//version"].text
            @etablissement = @xml.elements["//references/etablissement"].text
            @id            = @xml.elements["//references/id"].text
            @nom           = @xml.elements["//references/nom"].text
            @url           = @xml.elements["//references/url"].text
            @maj           = {
                :jour   => @xml.elements["//references/maj/jour"].text,
                :mois   => @xml.elements["//references/maj/mois"].text,
                :annee  => @xml.elements["//references/maj/annee"].text,
                :heure  => @xml.elements["//references/maj/heure"].text,
                :minute => @xml.elements["//references/maj/minute"].text
            }
            @seminaires    = @xml.elements.to_a("//seminaires/seminaire/")
            @seminaires.collect!{|seminaire|
                Seminaire.new(seminaire)
            }
        end
        def echo
            return @xml
        end
    end

Implantation de l'API OSEF en Ruby (2/2)


    class Seminaire
        attr_reader :horodate, :lieu, :cadre, :intervenant, :sujet
        def initialize(_xml_entity) 
            @xml         = _xml_entity
            @horodate    = {
                :jour   => @xml.elements["horodate/jour"].text,
                :mois   => @xml.elements["horodate/mois"].text,
                :annee  => @xml.elements["horodate/annee"].text,
                :heure  => @xml.elements["horodate/minute"].text,
                :minute => @xml.elements["horodate/minute"].text
            }
            @lieu        = @xml.elements["lieu"].text
            @cadre       = @xml.elements["cadre"].text
            @intervenant = {
                :prenom                    => @xml.elements["intervenant/prenom"].text,
                :nom                       => @xml.elements["intervenant/nom"].text,
                :etablissement_nom         => @xml.elements["intervenant/etablissement/nom"].text,
                :etablissement_nationalite => @xml.elements["intervenant/etablissement/nationalite"].text
            }
            @sujet       = @xml.elements["sujet"].text
        end
        def echo
            return @xml
        end
    end
end
ACM 2.0
( Web Services )

API du service WEB d'interrogation du dépôt SQL

On fournit une liste définie de RPC permettant de soumettre des requêtes programmées auprès de l'ACM.
Les données sont retournées en XHTML 1.1 permettant à la fois l'affichage à destination humaine et le traitement par des robots.

requêtedescription
http://domaine.tld/rpc/?action=display_current_day affiche tous les séminaires du jour courant
http://domaine.tld/rpc/?action=display_current_day&id=UMR8050 affiche tous les séminaires de l'UMR8050 du jour courant
http://domaine.tld/rpc/?action=display_known_days affiche tous les séminaires du jour courant et à venir
http://domaine.tld/rpc/?action=display_known_days&id=UMR8050 affiche tous les séminaires de l'UMR8050 du jour courant et à venir

D'autres requêtes assez simples pourraient être ajoutées à cette liste.

RSS 2.0 : Syndication

Really Simple Syndication / Rich Site Summary est une technologie utilisée par le monde de la presse pour diffuser de l'information sans que le diffuseur ait une connaissance explicite du consommateur de cette information.

C'est le consommateur qui fait la démarche de se syndiquer/désyndiquer directement sur son poste informatique.

Il est dès lors assez simple de définir des flux RSS correspondant aux séminaires publiés par l'ACM par domaine d'intérêt.

L'utilisateur a la liberté de s'abonner au(x) flux de son choix et d'être prévenu automatiquement des nouveaux séminaires publiés par l'ACM sans intervention spécifique de celui-ci.

Il est à noter que le fonctionnement actuel de l'ACM est incompatible avec l'usage de RSS; via Thunderbird par exemple.

NB : Un service web de validation de fil RSS est disponible à l'adresse http://feedvalidator.org/

RSS 2.0 : Exemple (1/2)

<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
	<title>UMR8050 - Laboratoire d'Analyse et de Mathématiques Appliquées</title>
	<link>http://umr-math.univ-mlv.fr/</link>
	<description>Séminaires de l'UMR8050</description>
	<language>fr</language>
	<generator>Ruby Web Engine</generator>
	<lastBuildDate>08 Jun 2005 17:40:00 CEST</lastBuildDate>
	<item> ... </item>
	...
	<item> ... </item>
</channel>
</rss>

RSS 2.0 : Exemple (2/2)

...
<item>
	<title>Groupe de travail méthodes probabilistes en convexité</title>
	<link>http://umr-math.univ-mlv.fr/seminaires/#UMR8050-GTMPC-21062005-MLV-0.375-1030</link>
	<description>
		Intervenant: Grigouris PAOURIS
		Etablissement: University of Crete, Grèce
		Lieu: Université de Marne-la-Vallée
		Salle: 3.075
		Titre: P-centroid bodies
	</description>
	<pubDate>Tue, 21 Jun 2005 10:30:00 +0200</pubDate>
</item>
...

RSS 2.0 : Détails

Les dates doivent être exprimées au format date-time de la RFC-822

date-time = [ day "," ] date time        ; dd mm yy | hh:mm:ss zzz
day       = "Mon" / "Tue" / "Wed" / "Thu" / "Fri" / "Sat" / "Sun"
date      = 1*2DIGIT month 2DIGIT        ; day month year
                                     ;  e.g. 20 Jun 82
month     = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"
time      =  hour zone                    ; ANSI and Military
hour      =  2DIGIT ":" 2DIGIT [":" 2DIGIT] ; 00:00:00 - 23:59:59
zone      =  "UT"  / "GMT"                  ; Universal Time
                                            ; North American : UT
          /  "EST" / "EDT"                  ;  Eastern:  - 5/ - 4
          /  "CST" / "CDT"                  ;  Central:  - 6/ - 5
          /  "MST" / "MDT"                  ;  Mountain: - 7/ - 6
          /  "PST" / "PDT"                  ;  Pacific:  - 8/ - 7
          /  1ALPHA                         ; Military: Z = UT;
                                            ;  A:-1; (J not used)
                                            ;  M:-12; N:+1; Y:+12
          / ( ("+" / "-") 4DIGIT )          ; Local differential
                                            ;  hours+min. (HHMM)

Une description doit comporter uniquement du texte, pas de formatage HTML.

RSS 2.0 par la pratique

RSS 2.0 / Firefox, Les Marque-Pages Dynamiques

Les marque-pages dynamiques sont une nouvelle technologie de Firefox qui permet de visualiser les titres des actualités et des blogs RSS dans la barre d'outils et le menu des marque-pages.

D'un coup d'oeil, vous pouvez consulter les grands titres de vos sites favoris et vous rendre directement sur les pages qui vous intéressent. Un site est compatible avec les marque-pages dynamiques quand vous voyez cette icône RSS dans le coin inférieur droit du navigateur.

En cliquant sur cette icône, vous pourrez choisir "s'inscrire à RSS" et ajouter un marque-page dynamique qui apparaîtra avec vos autres marque-pages. Firefox signale un fil RSS associé à une page web sous réserve de le déclarer dans l'entête.

<link rel="alternate" type="application/rss+xml" title="Mozilla Europe - News" href="/fr/news.rdf" />

RSS 2.0 / Firefox, Les Marque-Pages Dynamiques en action

Beaucoup de sites utilisent RSS pour publier leurs mises à jour.

Le site détermine le nombre de titres affichés et à quelle fréquence ils sont mis à jour.

Live Bookmarks Screenshot

Titres de Slashdot RSS et de BBC News RSS affichés dans la barre latérale.

Un clic sur un titre vous amène directement à l'article.

RSS 2.0 / Thunderbird (1/3)

Thunderbird propose l'abonnement aux flux RSS et présente les nouvelles comme des courriers électroniques classiques.
Thunderbird RSS screenshot

RSS 2.0 / Thunderbird (2/3)

L'identifiant unique (au sens clé de base de données) est le Site Web.
http://domaine.tld/page1 <=> http://domaine.tld/page1
http://domaine.tld/page#1 <=> http://domaine.tld/page#2
Thunderbird RSS screenshot Si l'on choisi sous Thunderbird d'afficher la description et non le lien, celle-ci est rendue sous forme de texte brute.
Il n'est pas possible sous RSS d'inclure de formatage HTML dans le champ description.

RSS 2.0 / Thunderbird (3/3)

Thunderbird peut afficher le site web associé à la balise <link></link>.
Thunderbird RSS screenshot