Mailing List description RDF vocabulary

[Edit] : MLRDF / MaLiDeRVo has become DOAML.

Here is the draft of an RDF vocabulary aimed at describing mailing lists. You can make proposals, comment, criticize etc. via this blog. Thank you in advance for your participation :)

Copy/paste of the RDFS: (http://ns.balbinus.net/mailinglist/, or via RDFS Explorer)

<?xml version="1.0" encoding="iso-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
		xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
		xmlns:owl="http://www.w3.org/2002/07/owl#"
		xmlns:foaf="http://xmlns.com/foaf/0.1/"
		xmlns:dc="http://purl.org/dc/elements/1.1/"
		xmlns:dct="http://purl.org/dc/terms/">
	
	<owl:Ontology rdf:about="http://ns.balbinus.net/mailinglist#">
		<dc:creator>
			<foaf:Person>
				<foaf:name>Vincent Tabard</foaf:name>
				<foaf:nick>balbinus</foaf:nick>
				<foaf:mbox_sha1sum>ef755f7a687f4a443e47295cc1b3ac3b8c935037</foaf:mbox_sha1sum>
				<rdfs:seeAlso rdf:resource="http://foaf.balbinus.net/" />
			</foaf:Person>
		</dc:creator>
		<dct:created>2004-09-28T20:58:10.0CET</dct:created>
		<dc:format>application/rdf+xml</dc:format>
		<dc:description>An RDF vocabulary aimed at describing mailing lists. I thought
		that could be useful, provided that there are lots of
		mailing lists in the semantic web world...</dc:description>
	</owl:Ontology>
	
	<rdfs:Class rdf:about="http://ns.balbinus.net/mailinglist#MailingList">
		<rdfs:isDefinedBy rdf:resource="http://ns.balbinus.net/mailinglist#" />
		<rdfs:label xml:lang="en">Mailing list</rdfs:label>
		<rdfs:label xml:lang="fr">Liste de diffusion</rdfs:label>
		<rdfs:comment xml:lang="en">A Mailing list.</rdfs:comment>
		<rdfs:subClassOf rdf:resource="http://xmlns.com/foaf/0.1/Group" />
	</rdfs:Class>
	
	<rdfs:Class rdf:about="http://ns.balbinus.net/mailinglist#PrivateMailingList">
	 	<rdfs:isDefinedBy rdf:resource="http://ns.balbinus.net/mailinglist#" />
		<rdfs:label xml:lang="en">Private mailing list</rdfs:label>
		<rdfs:comment xml:lang="en">A private Mailing list, in which only members
		can post, and membership is restricted (submitted to moderator's
		approval).</rdfs:comment>
		<rdfs:subClassOf rdf:resource="http://ns.balbinus.net/mailinglist#MailingList" />
	</rdfs:Class>
	
	<rdfs:Class rdf:about="http://ns.balbinus.net/mailinglist#MemberOnlyMailingList">
		<rdfs:isDefinedBy rdf:resource="http://ns.balbinus.net/mailinglist#" />
		<rdfs:label xml:lang="en">Member-only mailing list</rdfs:label>
		<rdfs:comment xml:lang="en">A private Mailing list, in which only members
		can post.</rdfs:comment>
		<rdfs:subPropertyOf rdf:resource="http://ns.balbinus.net/mailinglist#MailingList" />
	</rdfs:Class>
	
	<rdfs:Class rdf:about="http://ns.balbinus.net/mailinglist#PublicMailingList">
		<rdfs:isDefinedBy rdf:resource="http://ns.balbinus.net/mailinglist#" />
		<rdfs:label xml:lang="en">Public mailing list</rdfs:label>
		<rdfs:comment xml:lang="en">A public Mailing list, in which anyone can
		post, even without subscribing.</rdfs:comment>
		<rdfs:subPropertyOf rdf:resource="http://ns.balbinus.net/mailinglist#MailingList" />
	</rdfs:Class>
	
	<rdf:Property rdf:about="http://ns.balbinus.net/mailinglist#subscribe">
		<rdfs:isDefinedBy rdf:resource="http://ns.balbinus.net/mailinglist#" />
		<rdfs:label xml:lang="en">subscribe</rdfs:label>
		<rdfs:comment xml:lang="en">Mail address to mail to subscribe to
		the list.</rdfs:comment>
		<rdfs:domain rdf:resource="http://ns.balbinus.net/mailinglist#MailingList" />
		<rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/mbox" />
	</rdf:Property>
	
	<rdf:Property rdf:about="http://ns.balbinus.net/mailinglist#unsubscribe">
		<rdfs:isDefinedBy rdf:resource="http://ns.balbinus.net/mailinglist#" />
		<rdfs:label xml:lang="en">unsubscribe</rdfs:label>
		<rdfs:comment xml:lang="en">Mail address to mail to unsubscribe from
		the list.</rdfs:comment>
		<rdfs:domain rdf:resource="http://ns.balbinus.net/mailinglist#MailingList" />
		<rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/mbox" />
	</rdf:Property>
	
	<rdf:Property rdf:about="http://ns.balbinus.net/mailinglist#requests">
		<rdfs:isDefinedBy rdf:resource="http://ns.balbinus.net/mailinglist#" />
		<rdfs:label xml:lang="en">requests</rdfs:label>
		<rdfs:comment xml:lang="en">Mail address to mail to send commands
		(subscribe, unsubscribe) to the list manager.</rdfs:comment>
		<rdfs:domain rdf:resource="http://ns.balbinus.net/mailinglist#MailingList" />
		<rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/mbox" />
	</rdf:Property>
	
	<rdf:Property rdf:about="http://ns.balbinus.net/mailinglist#mbox">
	 	<rdfs:isDefinedBy rdf:resource="http://ns.balbinus.net/mailinglist#" />
		<rdfs:label xml:lang="en">mail address</rdfs:label>
		<rdfs:comment xml:lang="en">Mail address to mail to send messages to
		the list subscribers.</rdfs:comment>
		<rdfs:domain rdf:resource="http://ns.balbinus.net/mailinglist#MailingList" />
		<rdfs:subPropertyOf rdf:resource="http://xmlns.com/foaf/0.1/mbox" />
		<rdfs:type rdf:resource="http://www.w3.org/2002/07/owl#InverseFunctionalProperty" />
	</rdf:Property>
	
	<rdf:Property rdf:about="http://ns.balbinus.net/mailinglist#archives">
		<rdfs:isDefinedBy rdf:resource="http://ns.balbinus.net/mailinglist#" />
		<rdfs:label xml:lang="en">archives</rdfs:label>
		<rdfs:comment xml:lang="en">The URI of one list's archives.</rdfs:comment>
		<rdfs:domain rdf:resource="http://ns.balbinus.net/mailinglist#MailingList" />
	</rdf:Property>
	
	<rdf:Property rdf:about="http://ns.balbinus.net/mailinglist#moderator">
		<rdfs:isDefinedBy rdf:resource="http://ns.balbinus.net/mailinglist#" />
		<rdfs:label xml:lang="en">moderator</rdfs:label>
		<rdfs:comment xml:lang="en">A moderator of a list.</rdfs:comment>
		<rdfs:domain rdf:resource="http://ns.balbinus.net/mailinglist#MailingList" />
		<rdfs:range rdf:resource="http://xmlns.com/foaf/0.1/Person" />
	</rdf:Property>
	
 	<rdf:Property rdf:about="http://ns.balbinus.net/mailinglist#policy">
		<rdfs:isDefinedBy rdf:resource="http://ns.balbinus.net/mailinglist#" />
		<rdfs:label xml:lang="en">policy</rdfs:label>
		<rdfs:comment xml:lang="en">The URI of a policy (privacy, P3P...)
		that concerns the list.</rdfs:comment>
		<rdfs:domain rdf:resource="http://ns.balbinus.net/mailinglist#MailingList" />
	</rdf:Property>
	
</rdf:RDF>

I have chosen not to include properties as name, topic or description. They already exist in DC (dc:title, dc:subject, dc:description), and i thought that was useless to repeat them. Do you agree with me?

Do you think some properties are missing? Comment this post!

Citations v. 0.3

[Edit] : nouvelle version : 0.4

La nouvelle version de Citations est sortie ! Ce plugin permet d'ajouter une fonction template (dcCitation::afficher()), qui affiche une citation aléatoire dans un blockquote (balise paramétrable). Vous pouvez voir le post lié à l'ancienne version.

Nouvelles fonctionnalités :

  • Test de la mise à jour à distance... A essayer :) mais je ne garantis rien !
  • Correction de la syntaxe XHTML (une petite erreur je sais plus où)
  • Paramétrabilité plus aisée de la balise (au moyen de printf) qui entoure la citation
  • Bien meilleure gestion du cache (on le by-pass complètement, en fait, voir Changeset 526 (merci Olivier !). Cela permet d'éviter la répétition trop fréquente des citations.
  • Conversion en UTF-8, pour convertir vos citations aussi en UTF-8.

J'ai dû en oublier :)

Bientôt une nouvelle version de On my playlist... également :)

Comment installer le changeset

Le changeset 526 (la gestion du by-pass du cache) est inclus dans le package du plugin. Il vous suffit de le renommer en class.mysql.php et de le mettre à la place du fichier homonyme déjà présent dans inc/classes.

Qu'est-ce que change le changeset ?

Il ne change rien à l'utilisation normale de DotClear. Il permet seulement de faire des requêtes non cachées (dont les résultats ne sont pas sauvegardés). Le cache des résultats évite de nombreuses requêtes pour l'affichage des posts, mais gèle les citations (non-renouvellement). Vous pouvez vous passer de l'installer sans aucun problème... mais ne vous plaignez pas du gel des citations !

Un intérêt du Logiciel Libre : la réutilisation du code

J'ai créé, pendant les vacances, une série d'outils liés à DOAP, The DOAPy Family (ou, plus court, les "doapies"). J'ai réutilisé, pour la présentation, la CSS de bonjourlesmouettes. J'ai également créé une bibliothèque de fonctions pour créer des documents RDF XML (qui sont en fait des wrappers des fonctions DOM de PHP). Je suis en train de créer un nouvel outil, MAYB-e, lié toujours à RDF, mais cette fois-ci à FOAF. C'est donc tout naturellement que j'ai réutilisé la CSS de bonjourlesmouettes.org (pour le développement tout au moins), et ma librairie de fonctions RDF/XML (que j'ai un peu améliorée au passage).

On peut voir dans ces quelques exemples l'intérêt de la réutilisation du code "en interne" : ne pas perdre du temps à redévelopper les mêmes choses, à réinventer sans cesse la roue. Bien sûr, j'avais quelques besoins spécifiques avec MAYB-e, mais comme ils étaient principalement liés à la présentation (notamment le positionnement à droite du logo), j'ai utilisé le principe de base des CSS : feuilles de style en cascade : j'ai défini dans une CSS spécifique à MAYB-e le style h1#top img à float: right.

Mais ce n'est pas tout. Dans les 2 cas, j'ai utilisé la classe IzForm, créée par bballizlife, pour les formulaires (super pratique). Et, esprit du libre faisant, je lui ai proposé deux - trois améliorations pour sa classe (notamment un attribut de style manquant, qui m'a forcé à "hacker" de manière peu pratique sa classe, parce qu'il était en vacances :). Cette classe étant sous licence BSD-like, j'ai pu la réutiliser dans mes projets (libres eux aussi, mais la BSD ne l'oblige pas) sans problèmes.

Ainsi, toute la communauté progresse grâce à elle-même : de petits bouts en petits bouts, par accrétion, on arrive à quelque chose de vraiment complet. Un autre exemple, plus lié à "accrétion" qu'à "vraiment complet", mon agrégateur de feeds RSS : je l'ai créé à partir de deux classes PEAR : XML_RSS et Cache_Lite. J'ai adapté la première (sous licence PHP 2.0) de manière à la rendre indépendante de PEAR (elle avait des appels à XML_Parser et PEAR_Error), en reprenant un vieux bout de code de RDFPic Extended pour lui faire utiliser le parseur XML de PHP. J'ai également "emballé" Cache_Lite dans Cache_Lite_Basic, qui permet un accès plus rapide aux fonctions de Cache_Lite.

Ces deux derniers exemples montrent que l'on n'est pas "bloqué" avec tel ou tel système lorsque l'on réutilise le travail des autres ; des licences telles que la GNU / GPL permettent de modifier ce travail. Le cas s'est produit de manière plus qu'évidente avec les doapies, où j'ai utilisé une partie de RAP (seulement une partie, car RAP est très complet mais aussi très lourd :) de manière peu conventionnelle (en bref, en ne passant pas par l'interface fournie).

De plus, dans la majorité des cas, s'applique une des constantes du LL : there's more than one way to do it (il y a plus d'une manière de faire cela) : la classe qui permet de faire des requêtes HTTP de PEAR (HTTP_Request) ne me convenait pas, j'ai pris celle d'Incutio ! Si le sujet n'est pas trop pointu, il existe bien souvent au moins deux possibilités... Le meilleur exemple étant le choix d'un CMS.

Deux dernières choses importantes à propos du LL : un jour, quelqu'un vous proposera de traduire bénévolement votre application en japonais. Ce jour-là, j'ai été heureux de voir que mes applications intéressaient des gens ;). Et n'oubliez surtout pas : partagez vos créations ! et rédigez un DOAP au passage ;)

[PS] : C'est mon post numéro 100 !!!