Archive for June, 2006

BPI chat – 6 mois plus tard

Il y a quelques temps, environ 6 mois, j'avais testé le service de réponse à distance par Chat de la BPI. Désastreux. Mais je ne me laisse pas facilement décourager, et comme on rediscute (en vue du contrat quadriennal 2008-2011) d'un service similaire à Angers, je tente à nouveau ma chance dans le rôle du client-mystère!
La transcription du chat est ci-dessous, avec mes commentaires en italique entre crochets. En résumé: il y a progrès, j'ai eu une réponse à ma question, mais on y retrouve quelque chose que j'avais déjà vu la dernière fois: le bibliothécaire conteste la légitimité de l'utilisation, par l'internaute, du service. On a envie de dire à la BPI: si vous-même ne croyez pas au service que vous proposez, si vous dissuadez les internautes de l'utiliser, pourquoi l'ouvrez-vous?

Voici la transcription de votre CHAT avec un bibliothécaire de la Bpi :

Date: 10:26 2006/06/21
Numéro: 1674075

Transcription de la session de CHAT: Bonjour,
Je cherche des informations sur le langage de programmation Python. En particulier sur l'histoire de ce langage.

[Bibliothécaire 10:26:48]: Bonjour,

Nicolas 10:27:15]: Bonjour,

[Bibliothécaire 10:27:35]: je vais faire une recherche dans notre catalogue, mais vous pourriez la faire vous même! [Ca commence très fort: je me fais engueuler; elle (cf plus bas, les accords indiquent que c'est une dame) va le faire, mais vraiment je pourrais me démerder!]

Nicolas 10:27:54]: je vous demande pardon? [là je suis bluffé! Mais remarquez qu'elle ne répondra pas à cette remarque]

[Bibliothécaire 10:29:09]: nous avons 4 ouvrages qui traite du langage Python

[Bibliothécaire 10:29:19]: en voici les références :

[Bibliothécaire 10:29:35]: Apprendre à programmer avec Python / Gérard Swinnen. – Swinnen, Gérard [*1 doc.] – 2005 2. Programmation Python / Tarek Ziadé ; préfaces de Stéfane Fermigier et Stephan Richter ; avec l… – Ziadé, Tarek [*1 doc.] – 2006 3. Python en concentré / Alex Martelli. – Martelli, Alex [*1 doc.] – 2004 4. Scripts sous Linux : Shell Bash, Sed, Awk, Perl, Tcl, Tk, Python, Ruby / Chistophe Blaess. – Blaess, Christophe [*2 doc.] – 2004

[Nicolas 10:30:29]: Excusez-moi, mais je ne suis pas à la bibliothèque, j'aurais voulu avoir non pas des références, mais des informations directes, que je puisse utiliser en ligne… [eh oui: ce n'était pas ma question de départ; je demandais explicitement non pas des références, mais directement des informations]

[Bibliothécaire 10:30:44]: voici le résumé de Python en concentré : Traite de manière concise du langage de programation Python : ses fonctionnalités, sa syntaxe, les modules de sa bibliothèque standard et ses principales extensions

[Bibliothécaire 10:31:33]: Avez-vous besoin d'une autre information? [Elle considère que le job est fait et pour elle ça pourrait s'arrêter là]
[Nicolas 10:31:54]: Comme je disais je ne suis pas à la bibliothèque, j'aurais voulu avoir non pas des références, mais des informations directes, que je puisse utiliser en ligne…

[Bibliothécaire 10:33:14]: et bien nous n'avons pas cela d'ouvrages numérisés disponible en ligne. Avez-vous fait une recherche sur Internet.

[Nicolas 10:33:42]: Non… [je sens le truc venir…]
[Bibliothécaire 10:34:12]: je vous suggère d'essayer [bingo! Comme le catalogue: l'internaute pourrait se démerder, non? Il est manchot cet internaute, c'est pas vrai…]

[Nicolas 10:35:07]: càd que je vous pose la question à vous… [CQFD]
[Bibliothécaire 10:35:28]: Par exemple le site suivant devrait vous convenir :

[Bibliothécaire 10:35:41]: http://www.easter-eggs.com/article_77_Le_langage_Python.html[OK: c'est la grande différence avec la fois d'avant: cette fois, j'ai une réponse]

[Nicolas 10:36:45]: Je vais regarder ça. Merci.

Bibliothécaire 10:36:53]: Je suis obligée de déconnecter, le temps imparti au chat pour un utilisateur étant terminé

[Bibliothécaire 10:37:03]: Au revoir

Nicolas 10:37:09]: il y a un temps imparti? [nom de Dieu, je me fais foutre dehors! Je n'avais pas vu, c'est écrit en tout petit, mais effectivement, sur leur site ils expliquent qu'il y a un temps imparti d'1/4 d'heure. Deux remarques: le 1/4 d'h. n'est pas écoulé, je ne suis connecté que depuis 10mn… Et la note sur le site explique que si le chat dure plus d'1/4 d'h. on ne vous pousse pas dehors, on prend votre mail pour répondre plus complétement par mail dans les 48h. Or cette personne ne me propose pas de poursuivre par mail: elle m'a donné 4 réf. de livre et 1 site web, pour elle il n'y a plus rien à dire… Et c'est elle qui en est juge, elle ne me demande pas si ce qu'elle m'a donné comme infos me convient à moi]

[Bibliothécaire 10:38:30]: et oui je ne peux pas passer la journée avec vous [c'est toujours agréable à entendre…]
[Nicolas 10:39:33]: Je vois.
[Nicolas 10:39:59]: L’utilisateur a mis fin à la session. 

Advertisements

June 21, 2006 at 10:00 am 9 comments

Castore (et TEF)

Quelques notes après une réunion des 3 BU de la région Pays de Loire (Nantes, Angers, Le Mans) autour de Castore.  Participait aussi: Cédric Dumas, admin du projet.

Il y a 2 éléments importants pour nous dans la version à venir fin sept./début oct.:

  • la possibilité de charger un pdf. Actuellement le système prend les .doc, .sxw, .odt, mais pas .pdf. On passera par pdf en particulier pour gérer les thèses LaTeX, càd: LaTeX => pdf => xml (castore) => html (diffusion)
  • une gestion dite "multifond", c'est-à-dire qu'on pourra avoir plusieurs bases de documents sur une même plateforme castore. Cela permettra de faire cohabiter les 3 BU sur une même plateforme

Dans la même problématique de cohabitation de 3 universités: l'instance est à Nantes, il faut pouvoir dialoguer avec les annuaires des 3 universités. Donc: ou bien Angers et Le Mans autorisent Nantes à interroger leur ldap; ou bien on a une fédération.

On démarre tous les trois avec les thèses, donc la notion de "type de document" dans Castore est facile à déclarer: dans un premier temps il n'y aura que des thèses.

Il faut que chacun définisse:

  • des groupes d'utilisateurs qui auront des droits différant et verront des collections différentes. A priori il faudra partir des groupes qui existent dans notre ldap, éventuellement en descendant au niveau du labo, et à défaut de la composante.
  • des collections. Je suis assez tenté de les faire thématiques en les faisant correspondent aux 12 disciplines qui structurent notre site web.

Reste la question des métadonnées.

Patrick Goutefangea (Nantes) a déjà pas mal travaillé la liste des métadonnées pour les thèses à déclarer dans Castore, en veillant en particulier à prendre en compte TEF, donc STAR. Le but du jeu (c'est ce qu'explique ici Yann Nicolas) est d'avoir des métadonnées internes, basées sur DC, le plus proches possibles de TEF, pour limiter la complexité de la feuille de style xslt qui devra passer de l'un à l'autre. En conséquence, le brouillon de Patrick a un mappage presque point à point entre les éléments de métadonnées locales et TEF, Title devenant main.title, creator_affiliation devenant Thesis.degree.grantor, etc.

Restera la question du worklow entre Castore et Star. A suivre. 

June 20, 2006 at 3:06 pm Leave a comment

Python (3)

Bon, vous pouvez sauter ce post si vous en avez marre de suivre ma (lente) progression dans l'apprentissage de Python.

Rappel des épisodes précédents: j'ai un fichier xml de notices tirées du catalogue, que je parcoure pour en tirer les infos du champs 610. J'en étais à obtenir, en mémoire, une liste (au sens pythonesque du terme liste) de mots clés classés alphabétiquement.
Ce que j'ai ajouté cette fois-ci:
===============================================
Ecrire ma liste qui est en mémoire dans un fichier xml en unicode

f = open("610.xml", "w") # creates a new xml file to write in; previous content discarded

f.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<subjects>\n") # writes 1st 2 lines

i = 0 # inits counter
while i < len(sortedhints): # while counter < to total number of items in list…
  f.write("<subject>" + sortedhints[i].encode('utf-8') + "</subject>\n") # writes content to file
  i = i + 1 #increments counter

f.write("</subjects>") # writes closing line of file

f.close() # closes file

Il y a sans doute des façons beaucoup plus efficaces de programmer ça, mais ça marche.

Le résultat:

<?xml version="1.0" encoding="utf-8"?>
<subjects>
<subject>contentieux</subject>
<subject>droit civil</subject>
<subject>droit des sociétés</subject>
<subject>enfant</subject>
<subject>entreprise</subject>
<subject>entreprise en difficulté</subject>
<subject>france</subject>
<subject>gestion de patrimoine</subject>
<subject>gestion financière</subject>
<subject>institution judiciaire</subject>
<subject>juridiction civile</subject>
<subject>justice</subject>
<subject>management</subject>
<subject>ministère public</subject>
<subject>procédure civile</subject>
<subject>éducation</subject>
</subjects>

Vous remarquerez que Python place les caractères accentués à la fin de l'alphabet. Pour ce qu'on veut faire, je ne sais pas si ça a de l'importance. Quelqu'un qui taperait é comme première lettre d'un mot serait bien placé, dans les suggestions, à "éducation". A voir.

================================================
Permettre de définir, quand on lance le programme, le nom du fichier, ainsi que le champ qu'on va récupérer.
Au début du programme, j'ajoute les deux lignes suivantes:

source = raw_input("enter the name of your input file, e.g. my_records.xml: ")
fieldNumber = raw_input("enter the name of the varfield you want to extract, e.g. 610: ")

Et après dans le fichier je remplace partout notices.xml par source et 610 par fieldNumber. On est ainsi libre de donner le nom qu'on veut au fichier xml source, et on peut faire tourner le programme pour le 610 ou n'importe quel autre champ: ces deux infos vous sont demandées par un prompt dès que vous lancez le programme.

Maintenant il faut que je gère mieux le contenu des différents champs. Mon programme prend tous les sous-champs pour l'instant, et si je le fais tourner pour le champs 606, par exemple, ça donne un contenu moyen, avec des <subject>ppn029051428</subject> ou des <subject>rameau</subject>, càd y compris les sous-champs 2 et 3. Bref, à raffiner.

June 19, 2006 at 8:04 am Leave a comment

auto-dérision geek

Bon Marlène aime bien se foute de ma poire! C'est-à-dire d'un pauvre bibliothécaire besogneux qui apprend un langage de programmation… Honte à elle…

Enfin, elle m'envoit la vidéo suivante (je précise que je n'ai pas le look geeky-gras de ce personnage): I'm geeky-slim.

June 17, 2006 at 2:31 pm Leave a comment

Python, web services, oai

J'ai repris mes exerices pythonesques.

D'abord en simplifiant les lignes faites la dernière fois. En fait: importer sys n'est pas utile, et il n'est pas non plus utile de faire tout le détail s'il y a un sous champ subfield, s'il y a qq chose dedans, etc. Ici je fais directement afficher le contenu du sous-cham; s'il n'existe pas Python ne soulève pas d'exception, il passe.

Et j'ai ajouté des trucs:

  • je prends plusieurs notices, il cherche tous les 610
  • avant de traiter le fichier xml, je créé une liste vide: hintslist
  • je n'imprime plus le contenu du sous-champ, je l'ajoute à la suite dans la liste, en le transformant en minuscules à la volée. J'ai donc une liste, en minuscules, de tous les champs 610 rencontrés.
  • je créé une seconde liste (sortedhints), qui prend le contenu de la première liste et applique deux traitement: dédoublonner les sujets et trier par ordre alphabétique.

Ce qui donne:

from elementtree import ElementTree

intslist = [] # creates an empty list, or empties the list if it existed

tree = ElementTree.parse("2notices.xml")

for node in tree.findall(".//varfield"): # gets all the varfield nodes

if node.get("id") == "610": # only gets varfield with 610, subject in Unimarc

for child in node: # loop: for each subfield..

hintslist.append(child.text.lower()) # appends text of subfield to hintslist, in lowercase

sortedhints = [] # creates another empty list, to be used to sort and deduplicate results

for hints in sorted(set(hintslist)):

sortedhints.append(hints)

Par contre pour le web service, ça va pas le faire.

J'ai bien trouvé comment interroger un web service en python, mais je m'aperçois que dans Aleph, x-Server limite l'ensemble résultat à 1000 réponses. Tout mon catalogue de 400.000 notices a découper en tranches de 1000 notices, ça va pas le faire du tout.

Par contre il y a un serveur OAI-PMH sur Aleph. Que j'ai commencé à paramétrer. La commande http://corto.uang:8991/OAI-script?verb=Identify me donne:

<OAI-PMH xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd"&gt;
<responseDate>2006-06-17T10:26:07Z</responseDate>
<request verb="Identify">http://corto.uang:8991/OAI-script</request&gt;
<Identify>
<repositoryName>Bibliotheque Universitaire d'Angers</repositoryName>
<baseURL>http://corto.uang:8991/OAI-script</baseURL&gt;
<protocolVersion>2.0</protocolVersion>
<adminEmail>nicolas.morin@univ-angers.fr</adminEmail>
<earliestDatestamp>2005-12-20</earliestDatestamp>
<deletedRecord>no</deletedRecord>
<granularity>YYYY-MM-DD</granularity>
</Identify>
</OAI-PMH>

Le serveur OAI-PMH d'Aleph supporte oai-dc comme format d'export des notices, c'est-à-dire le même format d'export que le web service, pour lequel j'ai écrit mon script Python.

Je vais plutôt suivre cette piste.

June 17, 2006 at 11:31 am 2 comments

links for 2006-06-15

June 16, 2006 at 12:19 am Leave a comment

del.icio.us daily blog post

La question m'ayant été posé plusieurs fois de la façon dont on peut intégrer ce qu'on met dans son compte del.icio.us, j'explique comment je m'y suis pris dans un post à part (la procédure peut changer à l'avenir, elle est valable aujourd'hui):

  1. se connecter à del.icio.us
  2. aller dans settings
  3. à droite dans Experimental, cliquer sur daily blog posting, ce qui vous amène à l'adresse http://del.icio.us/settings/mon_identifiant/daily
  4. Vous avez un formulaire qu'il convient de remplir comme suit:
    • job_name : Mon_delicious_quotidien [par ex]
    • out_name :morinn [votre login de blog; pour moi wordpress]
    • out_pass : ***** [votre mot de passe de blog]
    • out_url : https://morinn.wordpress.com/xmlrpc.php [càd url de votre blog + adresse xmlrpc]
    • out_time : 23 [l'heure GMT à laquelle vous voulez que ça tourne]
    • out_blog_id : [laisser blanc pour WordPress]
    • out_cat_id : 493 [ici le numéro ID de la catégorie dans laquelle vous voulez poster dans votre blog; j'ai pour ma part préalablement créé une catégorie del.icio.us, dont c'est le num. Si blanc, catégorie par défaut du blog, j'imagine]

June 14, 2006 at 1:28 pm Leave a comment

Older Posts


Feeds