web sémantique

Comment utiliser plusieurs triplestores dans Datalift

En standard Datalift utilise deux triplestores

Le premier est le triplestore interne, celui où sont publiées toutes les sources converties en RDF. C’est le 3e étage de l’ascenseur de données Datalift. La vocation de cet espace est d’être utilisé pour les travaux intermédiaires. Le second est le triplestore externe, c’est dans celui-ci que sont publiées les données finalisées et donc prêtes pour être exploitées par les destinataires d’un projet d’élévation de données.

Détaillons un peu. Si vous devez relier plusieurs sources Open Data, vous commencerez par les ajouter comme sources dans un projet Datalift. Puis vous convertirez chacune d’elle en RDF et les publierez dans le triple store interne. Lorsque vous les aurez interconnectées pour produire un unique jeu de données liées, du linked data ou du linked open data, vous publierez ce résultat dans le triple store externe.

Cette dernière opération est réalisée en utilisant le module « Publication vers le RDF store public ».

On trouve dans le répertoire C:\Users\{vous}\AppData\Roaming\Datalift\conf, le fichier de paramètres « datalift-application.properties » où sont placées les caractéristiques de ces deux triplestores. Leurs noms sont réservés : « data » pour le triplestore public , « internal » pour le triplestore interne (ou privé). Il vous est possible de leur donner le libellé de votre choix. Par exemple :

internal.repository.label = Triple Store interne

Datalift permet aussi d’utiliser plus de deux triplestores

Attention : ceci est possible à partir de la version 0.8.1j.

Abordons cet aspect dans le cas où vous utilisez un PC sous Windows et des triplestores gérés par le Workbench de Sesame. C’est le cas standard si vous avez téléchargé Datalift (www.datalift.org) et ne l’avez pas modifié.

Commencez par récupérer le fichier « openrdf-workbench.war », il s’agit du war qui contient, comme son nom l’indique, le workbench de l’openRDF de Sesame. Dans le site http://rdf4j.org/ allez dans la section réservée au téléchargement de Sesame et prenez la version 2.7.3. Dans le fichier openrdf-sesame-2.7.3-sdk.zip obtenu, vous allez trouver, en le dézippant, le war recherché.

Maintenant, avant de lancer Datalift, placez le fichier « openrdf-workbench.war » dans le répertoire .\Datalift\webapps où se trouve déjà « datalift.war » et « openrdf-sesame.war ». Lancez maintenant Datalift.

Vous disposez ainsi de l’interface d’administration de Sesame et vous pourrez agir directement sur vos triplestores. Pour y accéder, l’URL locale est :

http://localhost:9091/openrdf-workbench/

Créer un nouveau triplestore

Vous allez maintenant pouvoir créer un nouveau triplestore.

  • Dans le navigateur, ouvrez la page http://localhost:9091/openrdf-workbench/
  • Cliquez « new repository »
  • Donnez le type « In Memory Store »
  • Cliquez sur Next
  • Donnez maintenant un nom au nouveau triplestore (par exemple « NewTS ») et un intitulé.
  • Laissez « Persist » à « Yes »
  • Donnez la valeur « 1000 » à « Sync Delay »
  • Cliquez sur Create

Paramétrer le nouveau triplestore

  • Allez dans le répertoire C:\Users\{vous}\AppData\Roaming\Datalift\conf
  • Ouvrez le fichier « datalift-application.properties »
  • Allez dans la section des repositories
  • A la ligne de la clef « datalift.rdf.repositories », ajoutez le nom du nouveau triplestore après une virgule.

Par exemple :

datalift.rdf.repositories       = data, internal, newtriplestore

  • Puis ajouter la clef repository.url de ce nouveau triplestore en lui spécifiant le nom que vous lui avez donné dans le workbench sesame.

Par exemple, avec l’ID donné plus haut, c’était NewTS,

newtriplestore.repository.url       = \

http://localhost:${datalift.port}/openrdf-sesame/repositories/ NewTS

  • Si ce doit être un triple externe, spécifiez-le comme ceci

newtriplestore.repository.public     = true

  • Et donnez-lui pour finir un intitulé, celui qui apparaîtra dans le SPARQL Endpoint de Datalift. Par exemple :

newtriplestore.repository.label     = Mon Store

Relancer Datalift

  • Stoppez et relancez Datalift
  • Veillez, le cas échéant, à bien vider le cache de votre navigateur.

Utilisation des Triples Stores internes

Datalift ne peut publier que dans un seul TS interne. En revanche, si vous avez plusieurs TS interne, vous pouvez requêter dans celui de votre choix en l’indiquant dans le SPARQL endpoint. Si vous souhaitez publiez dans un autre TS interne, vous devez stopper Datalift, modifier le fichier de configuration et redémarrer Datalift.

Utilisation des Triples Stores externes

Lorsque vous publiez une source dans un triple store externe, s’il y en a plusieurs, Datalift attend que vous indiquiez lequel. Comme pour les TS internes, vous pouvez requêter dans le TS externe de votre choix en l’indiquant dans le SPARQL endpoint.

Pour en savoir plus, pourquoi ne pas devenir membre de l’association Datalift et suivre la user-list ?

 


Aide à la traduction de l’arménien classique avec DataLift (2)

Pour combler une partie des manques du premier dictionnaire utilisé, j’ai traduit et ajouté le glossaire qu’Antoine Meillet donnait en 1913 à la fin de son fameux Altarmenisches Elementachbuch. J’ai opté pour une structure très simple : le mot et sa définition.

Nous avons donc maintenant 4 jeux de données :

ahv : livre, chapitre, rang, mot
lemme : mot, lemme, analyse
dict : source, uri, mot, prononciation, traduction
meillet : mot, definition

Dans la requête suivante, la clause UNION permet de prendre en compte les deux dictionnaires, les BIND permet de ramener les résultats sur une même variable :

PREFIX P-TEXTE: <http://localhost:9091/project/armenien/source/ahv-csv-rdf-1#>
PREFIX P-LEMME: <http://localhost:9091/project/armenien/source/lemme-csv-rdf-1#>
PREFIX P-DICT: <http://localhost:9091/project/armenien/source/dict-hy-fr-csv-rdf-1#>
PREFIX P-MEILL: <http://localhost:9091/project/armenien/source/meillet-csv-rdf-1#>

SELECT ?rang ?mot ?traduction {
?s1 P-TEXTE:mot ?mot;
P-TEXTE:chapitre "ch1.2";
P-TEXTE:rang ?rang.

OPTIONAL {
?s2 P-LEMME:mot ?mot;
P-LEMME:lemme ?lemme;
P-LEMME:analyse ?analyse.

{ ?s3 P-DICT:mot ?lemme;
P-DICT:traduction ?trad1.
BIND (concat("C: ",?analyse," ",?trad1) as ?traduction)
} UNION
{ ?s4 P-MEILL:mot ?lemme;
P-MEILL:definition ?trad2.
BIND (concat("M: ",?trad2) as ?traduction)
} }

}
ORDER BY ?rang
LIMIT 35

Les 35 premiers résultats sont :

1,արդ,"C: adv. 1) or conj., 2) maintenant adv."
1,արդ,M: (§ 171); tout à l'heure; maintenant; or; donc.
1,արդ,M: -ոյ forme; ornement.
2,իւրով,M: (pass. § 72); sien ; le gén. pl. իւրանց permet de traduire ‘leur’ (§ 76) ; իւր est aussi le gén. du réflexif (§ 76).
3,արեամբն,C: noun.ins.sg.def. sang nm.
3,արեամբն,M: -եան sang; αἷμα.
4,փրկեցելոյ,
5,զմեզ,M: (pronom; § 75); nous.
6,տեառն,"C: noun.gen.dat.sg. maître, seigneur, propriétaire nm."
6,տեառն,M: տեառն instr. տերամբ; nom. pl. տեարք; § 59 h; seigneur; κύριος (habituellement abrévié ՟տր [ պատիւ; § 26; rem. 4]; lorsqu'il s'agit de Dieu – de տի-այր ; cf. տի-կին).
7,եւ,C: conj. et conj.
7,եւ,M: (§ 164); aussi; et; même.
8,տուեալ,"C: verb.pfv.nom.acc.sg. 1) belle-soeur nf. 2) donner, livrer, offrir vt."
9,զհոգին,"C: noun.nom.acc.sg. 1) esprit nm., âme nf., 2) personne nf."
9,զհոգին,M: -ւոյ; -ւով (§ 46); esprit; πνεῦμα (cf. ոգի; §27 C).
10,իւր,M: (pass. § 72); sien ; le gén. pl. իւրանց permet de traduire ‘leur’ (§ 76) ; իւր est aussi le gén. du réflexif (§ 76).
11,փոխանակ,C: noun.nom.acc.sg. au lieu de prép.
11,փոխանակ,M: adv. (avec gén.) à la place de; փլայ (§ 109); je m'écroule; je tombe en ruine (cf. փուլ).
11,փոխանակ,M: emprunt (cf. փոխեմ).
12,հոգւոյս,"C: noun.gen.dat.abl.sg.poss1. 1) esprit nm., âme nf., 2) personne nf."
12,հոգւոյս,M: -ւոյ; -ւով (§ 46); esprit; πνεῦμα (cf. ոգի; §27 C).
13,մերոյ,C: pron.adj.gen.sg. notre adj.
13,մերոյ,M: (adj. poss. § 72); notre.
14,եւ,C: conj. et conj.
14,եւ,M: (§ 164); aussi; et; même.
15,զմարմինն,C: noun.nom.acc.sg. corps nm.
15,զմարմինն,M: մարﬓոյ corps; chair; σῶμα.
16,իւր,M: (pass. § 72); sien ; le gén. pl. իւրանց permet de traduire ‘leur’ (§ 76) ; իւր est aussi le gén. du réflexif (§ 76).
17,փոխանակ,C: noun.nom.acc.sg. au lieu de prép.
17,փոխանակ,M: adv. (avec gén.) à la place de; փլայ (§ 109); je m'écroule; je tombe en ruine (cf. փուլ).
17,փոխանակ,M: emprunt (cf. փոխեմ).
18,մարմնոյս,C: noun.gen.dat.abl.sg.poss1. corps nm.
18,մարմնոյս,M: մարﬓոյ corps; chair; σῶμα.
19,մերոյ,C: pron.adj.gen.sg. notre adj.
19,մերոյ,M: (adj. poss. § 72); notre.


Aide à la traduction de l’arménien classique avec DataLift

Depuis mon dernier post relatif à l’analyse grammaticale automatique de l’arménien classique avec DataLift, j’ai ajouté quelques petits ingrédients pour faire de la traduction. Au final, ce sont donc trois jeux de données que j’injecte dans la plateforme : une tokennisation d’un texte (le début du livre V de la version arménienne de l’Adversus Haereses d’Irénée de Lyon), une base de lemmatisation et un dictionnaire. Les trois sont des aux formats CSV dont les structures sont :

ahv : livre, chapitre, rang, mot
lemme : mot, lemme, analyse
dict : source, uri, mot, prononciation, traduction

La liaison est évidemment faite sur le « mot ». Voici une requête destinée à la traduction des 20 premiers mots du chapitre 1.2 :

PREFIX P-TEXTE: <http://localhost:9091/project/armenien/source/ahv-csv-rdf-1#>
PREFIX P-LEMME: <http://localhost:9091/project/armenien/source/lemme-csv-rdf-1#>
PREFIX P-DICT: <http://localhost:9091/project/armenien/source/dict-hy-fr-csv-rdf-1#>

SELECT ?rang ?mot ?analyse ?traduction {
?s1 P-TEXTE:mot ?mot;
P-TEXTE:chapitre "ch1.2";
P-TEXTE:rang ?rang.

OPTIONAL {
?s2 P-LEMME:mot ?mot;
P-LEMME:lemme ?lemme;
P-LEMME:analyse ?analyse.

?s3 P-DICT:mot ?lemme;
P-DICT:traduction ?traduction.
} }
ORDER BY ?rang
LIMIT 20

Comme vous pouvez le voir, le résultat est une bonne aide :

1; արդ; adv.; "1) or conj.; 2) maintenant adv."
2; իւրով; ;
3; արեամբն; noun.ins.sg.def.; sang nm.
4; փրկեցելոյ; ;
5; զմեզ; ;
6; տեառն; noun.gen.dat.sg.; "maître; seigneur; propriétaire nm."
7; եւ; conj.; et conj.
8; տուեալ; verb.pfv.nom.acc.sg.; "1) belle-soeur nf. 2) donner; livrer; offrir vt."
9; զհոգին; noun.nom.acc.sg.; "1) esprit nm.; âme nf.; 2) personne nf."
10; իւր; ;
11; փոխանակ; noun.nom.acc.sg.; au lieu de prép.
12; հոգւոյս; noun.gen.dat.abl.sg.poss1.; "1) esprit nm.; âme nf.; 2) personne nf."
13; մերոյ; pron.adj.gen.sg.; notre adj.
14; եւ; conj.; et conj.
15; զմարմինն; noun.nom.acc.sg.; corps nm.
16; իւր; ;
17; փոխանակ; noun.nom.acc.sg.; au lieu de prép.
18; մարմնոյս; noun.gen.dat.abl.sg.poss1.; corps nm.
19; մերոյ; pron.adj.gen.sg.; notre adj.
20; եւ; conj.; et conj.

La base de lemmatisation est incomplète, l’utilisation de la clause OPTIONAL est donc bien utile pour faire tout de même apparaître les mots non traduits. Une traduction aboutie de ce passage est : « Donc, le Seigneur nous a sauvés par son propre sang, donnant sa propre Âme pour notre âme, sa propre chair pour notre chair, et »
A suivre…


Analyse grammaticale automatique de l’arménien classique avec DataLift

Je me suis demandé combien de temps cela me prendrait de faire une analyse grammaticale … Ca ne m’a pris que 10 minutes. Voici comment (et vous pourrez vous y essayer aussi).

  1. Installer Datalift, il suffit de télécharger Datalift ici et de le deziper
  2. Vous créez un projet, appelons-le « armenien »
  3. Vous ajoutez la première source, ce sera un texte arménien tokennisé (voir mon post précédent sur la tokennisation de l’arménien). Là j’ai choisi la préface du livre V de l’Adversus Haereses d’Irénée de Lyon (voir le post où je l’ai posté). Avec le tokenniseur, j’ai créé un CSV avec 3 colonnes (chapitre ; rang ; mot). Je l’ai appelé : preface.csv
  4. Vous ajoutez la deuxième source, là j’ai pris mon CSV de lemmisation. Il a 3 colonnes aussi (mot ; lemme ; analyse). Je l’ai appelé : lemmisation.csv
  5. Vous élevez les deux jeux de données pour en faire des sources RDF. Pour l’élévaton de preface.csv, j’ai demandé le changement de type de la colonne « rang » pour que son contenu soit des entiers. J’ai donc obtenu ainsi : preface-csv-rdf-1 et lemmisation-csv-rdf-1
  6. Il ne reste plus qu’à interconnecter. J’ai écrit la requête d’interconnexion suivante :
    PREFIX P-LEMME: <http://localhost:9091/project/armenien/source/lemmisation-csv-rdf-1#>
    PREFIX P-TEXTE: <http://localhost:9091/project/armenien/source/preface-csv-rdf-1#>

    SELECT ?rang ?mot ?lemme ?analyse WHERE {
    ?s P-TEXTE:mot ?mot;
    P-TEXTE:rang ?rang.
    ?s2 P-LEMME:mot ?mot;
    P-LEMME:lemme ?lemme;
    P-LEMME:analyse ?analyse.
    }
    ORDER BY ?rang

  7. J’ai opté pour une sortie en CSV. Je vous recopie les premières lignes

    rang,mot,lemme,analyse
    2,սիրելի,սիրել,verb.pot.nom.acc.loc.sg.
    3,ամենայն,ամենայն,pron.nom.acc.sg.
    5,ի,ի,prep.
    6,չորս,չորք,num.acc.loc.pl.
    7,գիրս,գիր,noun.acc.loc.pl./nom.acc.sg.poss1.
    8,յառաջ,յառաջ,adj.
    9,քան,քան,conj./prep.
    10,զայս,այս (սա),pron.acc.sg.
    11,քեզ,դու,pron.acc.dat.sg.
    12,առաքեալս,առաքել,verb.pfv.acc.loc.pl./nom.acc.loc.sg.poss1.
    13,ի,ի,prep.
    14,մէնջ,մեք,pron.abl.pl.
    15,եւ,եւ,conj.
    17,նոցա,նա,pron.gen.dat.abl.pl.
    18,յայտնի,յայտնի//յայտնել,adj.nom.acc.loc.sg.//verb.pres.3per.sg.pass.
    19,երեւեցելոց,երեւել,verb.pfv.gen.dat.abl.pl.
    20,եւ,եւ,conj.

Et voilà, le tour est joué ! Chaque ligne commence par le rang du mot analysé dans le texte de départ. Vous voyez ainsi que le premier mot n’est pas présent. Cela signifie tout simplement que cette forme du mot n’est pas renseigné dans mon lemmisateur. Le 16e est dans le même cas.

Voilà à quoi peut servir Datalift, dans le monde de la linguistique.


Quelques techniques d’analyse rapide de textes

Devant un texte, il y a tant et tant de façon de s’y prendre pour le comprendre, y répondre, le résumer, le traduire, etc. C’est le monde du traitement automatique des langues naturelles (TALN). Les techniques sont complexes et réclament des compétences de haut niveau. Mais avant de se lancer à corps perdu dedans, vous pourriez vouloir vous essayer à quelques techniques simples, en tout cas relativement, pour toucher du doigt ce monde du langage naturel. Alors, faisons connaissance avec quelques unes d’entre-elles.

Tokenisation (ou tokenization) ou normalisation

C’est de loin la plus facile ! Elle consiste à consommer le texte et à en réduire tous les mots, quelques soient leurs différentes formes, en jetons (token). Vous pourrez ainsi, par exemple, compter combien de fois un mot donné se trouve dans un texte, ou bien retrouver les textes qui contiennent certains mots en utilisant même les fréquences d’apparition pour donner un peu de pertinence au passage…

Stemming ou racinisation (voire désuffixation)

La précédente techno était trop facile, vous êtes plus fort que ça. Alors, en voilà une autre. La racine d’un mot correspond à la partie du mot restante une fois que l’on a supprimé son préfixe et/ou son suffixe, on trouve alors sa racine. On l’appelle aussi parfois « stemme » du mot. Contrairement au lemme qui correspond à un mot réel de la langue, la racine ou stemme ne correspond généralement pas à un mot réel. Par exemple, le mot marcher a pour radical ou stemme march qui ne correspond pas à un mot réel. Par contre, dans l’exemple de montagne, le radical ou stemme est mont qui lui l’est.

Les algorithmes de racinisation sont de simples algorithmes de manipulation de chaînes de caractères qui dépendent des règles qui identifient les affixes qui peuvent être ôtés (par affixe, on entend préfixe comme suffixe). Ces algorithmes doivent connaître des règles telles que le doublement de la consonne, l’alternance consonantique n/m devant un b ou p, etc. Donc, bien sûr connaître les exceptions. Pour cela, ces algorithmes ont généralement besoin d’un dictionnaire.

L’algorithme le plus connu pour l’anglais est celui de Martin Porter, publié en 1979. Son usage original était la recherche d’information. On trouve des bibliothèques prêtes à l’emploi. Par exemple, celle de www.oleandersolutions.com, basée sur Porter, inclut des raciniseurs (ou stemmers) de l’anglais, du danois, du hollandais, du français, de l’allemand, de l’italien, du norvégien, du portugais, de l’espagnol, du suédois et du russe. Bref, c’est une bonne aide !

Pour en savoir un plus, comme d’hab, il y a wikipedia. Notamment, sur la différence entre lemmatisation et racinisation. Si vous allez sur le site de Jérôme Pasquelin, (Referenceur et Webmaster), vous pourrez essayer son outil de lemmatisation en ligne.

Tagging ou marquage de POS, l’étiquetage morpho-syntaxique

Les POS, ce sont les parties du discours (POS = part of speech). Le marquage des POS consiste à identifier les catégories de mots en restant relativement indépendant de la structure de la phrase. Il existe des moyens assez différents de parvenir à ce résultat. Les étiquettes (tag) sont associées aux mots. Par exemple, la phrase : « Le chien d’Emmanuel chante une mélodie connue » devient « Le/ART chien/NC d’/ART Emmanuel/NP chante/VRB une/ART mélodie/NC connue/PART ».

Le terme consacré, en français, pour cette technique, c’est l’étiquetage morpho-syntaxique. Avouez que ça fait bien. Les outils qui réalisent ce traitement s’appellent des étiqueteurs grammaticaux, ou « POS tagger » en anglais. Autant il en existe beaucoup pour la langue anglaise, autant ils sont difficiles à trouver pour notre langue. Il y a celui du LIA de l’Université d’Avignon.

Ces étiqueteurs grammaticaux prennent donc en entrée un texte brut pour produire en sortie un fichier d’annotations où chaque mot du texte d’entrée est associé à deux entités : son lemme et sa catégorie syntaxique, selon une classification donnée.

Pour continuer dans Wikipedia en français, mais l’article anglais est plus fouillé encore.

Chunking (shallow parsing) ou parsing par morceaux (morcellement)

Il s’agit, avec cette technique, d’identifier les principaux constituant d’une phrase. On ne cherche pas à reconnaître la structure de la phrase ni interne (dans le morceau), ni externe (entre les morceaux). Le morcellement peut donc laisser certaines parties du texte non analysées.

Un morceleur (chunker) est un algorithme qui détermine des séquences de mots, souvent en utilisant le texte étiqueté comme entrée. Les règles de morcellement peuvent être aussi simples que les expressions régulières – d’ailleurs on compare souvent les chunker au analyseur lexicaux des compilateurs. Les chunkers peuvent réaliser des encapsulations, mais en général, sans remonter de beaucoup de niveau. L’article de référence est celui de Steven P. Abney, en 1994 ; il est très compréhensible.

En conclusion

Ces techniques sont abordables, vous en conviendrez. Vous les avez déjà rencontrées, sans le savoir, dans les chat bots, ces programmes capables de dialoguer avec un usager en langue naturelle sur des sujets de nature générale ou bien sur des sujets ayant trait à un domaine particulier. Le premier chat bot, ELIZA, a été réalisé par J. Weizenbaum en 1965. Aujourd’hui, on les trouve dans des applications socio-ludiques sur l’Internet, comme les agents de conversation dans des sites où ils répondent à des questions dans un domaine bien spécifique.

Ils peuvent être utilisés dans des applications très ciblées où le vocabulaire et la syntaxe sont très contraints : commande vocale de machine outils ; commande de téléphone mobile ; langage militaire, etc. Un autre usage vient aussi de ce qu’il s’agit aussi d’un moyen simple permettant de faire un premier profilage. A vous de trouver votre cas d’usage !


Petit panorama d’outils sur les ontologies : les traducteurs

Les ontologies sont codées à l’aide de langages particuliers. Le plus connu est OWL. Sa page officielle au W3C est ici. Fin 2012, une recommandation du W3C présentait OWL 2.

Les ontologies peuvent aussi représentées en UML, ou encore graphiquement… On se demande alors naturellement s’il n’existe pas des traducteurs pour passer d’une expression à une autre. Une partie de la réponse se trouve déjà dans les éditeurs d’ontologie et les modeleurs d’ontologie.

Il existe des outils totalement dédiés à la traduction. Je ne les ai pas essayé, mais je suis intéressé par vos retours d’expérience. Parmi ces outils, il y a :

  • UML2OWL, qui se présente comme un « Fast Transformation Tool ».
  • sql2owl, un outil qui facilite la generation de modèles OWL à partir de modèle de bases de données.

Si vous en connaissez d’autres, merci d’avance de me les signaler, je mettrai à jour ce post.


Petit panorama d’outils sur les ontologies : aides

La création d’une ontologie n’est pas chose facile. La faire évoluer non plus, tout comme la référencer, ou encore la cataloguer, etc. Alors où trouver de l’aide ? Qui peut répondre à vos questions ? Pour apporter des réponses aux courageux ontologues débutants, il y a quelques bonnes adresses (mais elles sont rares) où poser ses questions et où lire des réponses aux questions que d’autres ont posées.

Si vous connaissez d’autres sites d’entre-aide, merci d’avance de me les signaler, je mettrai à jour ce post.


Petit panorama d’outils sur les ontologies : les modeleurs

Ces outils permettent de concevoir une ontologie en la modelant. L’UX et l’ergonomie de ces outils est leur principal valeur ajoutée. En voici quelques-uns…

Catégorie : ceux qui marchent

Catégorie : les morts-vivants, on ne sait pas trop

Catégorie : les disparus



Petit panorama d’outils sur les ontologies : les browsers

Ce ne sont pas vraiment des éditeurs puisque leur propos est de naviguer dans une ontologie pour en découvrir les coins et les recoins. Ce sont des outils utiles pour comprendre une ontologie et pour l’utiliser. L’UX et l’ergonomie de ces outils est leur principal valeur ajoutée. En voici quelques-uns…

Catégorie : ceux qui marchent et sont d’un usage général

Catégorie : ceux qui marchent et sont spécialisés


  • Catégories

  • Calendrier

    novembre 2024
    L M M J V S D
    « Mai    
     123
    45678910
    11121314151617
    18192021222324
    252627282930  
  • Archives

  • Copyright © 1996-2010 Blogabriel. All rights reserved.
    iDream theme by Templates Next | Powered by WordPress