Olivier Mengué – Code & rando

Aller au contenu | Aller au menu | Aller à la recherche

vendredi 12 août 2011

ARGV::URL - a new tool for Perl one-liners

I published a new module on the CPAN : ARGV::URL. At import time it'll process @ARGV to allow handling of URLs as transparently as filenames in one-liners. Here are a few examples of its power.

Show the count of fans for Delicious's user dolmen:

$ perl -MARGV::URL -MJSON -E 'say "Fans: ", (decode_json <>)->[2]->{n}' http://feeds.delicious.com/v2/json/userinfo/dolmen
Fans: 9

Show lines starting with 'ftp ' in the document at the given URL:

$ perl -MARGV::URL -nlE 'say if /^ftp /' http://www.iana.org/assignments/port-numbers
ftp              21/tcp    File Transfer [Control]
ftp              21/udp    File Transfer [Control]
ftp              21/sctp   FTP

GitHub feature request: Fast-forward my fork

Note: I'm posting this on my blog because since May 2011 GitHub is gone in submarine mode: the Google group is closed, support requests are not public anymore and users can't keep track of their past support requests. And I got no response to the last feature request I submitted.

When my repo is a fork, I would like to be able to fast-forward all the branches that exist in my repo to the latest commit on that branch in the parent repo.
The user inteface would be a single button at the left of "Pull request".
Of course, the process should fail for branches where fast-forward (as defined by git merge) is not possible. For example if I committed directly in a branch of the parent repo (instead of branching before committing) of if the parent has done dirty things with his repo. This is a merge conflict.
The process should also warn me about branches that have been added/removed in the parent repo compared to mine and give me the option to do the same (a list of branches with checkboxes to select the ones to pull/keep/delete). The default action must be conservative (not remove the local branches if they have not been merged into another branch of the parent repo ; not add branch from the remote repo which are locally missing but have been merged into another branch of the parent repo).

Github should also warn me when I'm submitting a pull request but the local branch from which I branched for my patch is not fast-forwarded. This probably means either I missed recent commits of the parent (so my patch may not be relevant anymore) or that I did the fast-forward (on a working repo not on Github) but did not push it to GitHub.

mercredi 10 août 2011

Les noms de domaine en attente à l'AFNIC

Depuis le 1er juillet les mots réservés ont été débloqués pour la réservation de noms de domaines en .fr. C'est donc la course à la réservation de mots usuels comme nom de domaine. Voici une petite visualisation des noms en attente (examen de la légitimité des demandes) à l'AFNIC :

Wordle: 2011-08-10 Les noms de domaines en attente à l'AFNIC

Et voici le code Perl d'extraction que j'ai utilisé pour transformer les données avant de les soumettre à Wordle :

#!/usr/bin/perl -nl
s/^\d+;([^;]*)\.fr;.*;En attente \/ Pending$/\1/ and print

dimanche 26 octobre 2008

Fontaines autour de Dourdan

Cela fait bien longtemps que, malgré le titre de ce blog, je n'avais pas publié de randonnée. En voici une !

31km autour de la gare de Dourdan en passant par plusieurs fontaines (eau non potable) et les villages/hameaux des Granges-le-Roi, Sainte-Mesme, Saint-Martin de Bréthencourt, Hautbout et Denisy :

Consultez mes archives publiques de randos.

dimanche 28 septembre 2008

xmltv-fr.appspot.com est en ligne !

J'annonce xmltv-fr.appspot.com, mon grabber XMLTV qui diffuse la grille de programmes de télévision au format XMLTV.

J'avais déjà développé une solution à base de scripts shell et de feuille de style XSLT, puis un proxy en PHP il y a 6 mois, mais j'avais des problèmes de fiabilité en raison de l'hébergement chez Free.fr : un appel sur trois au service échouait. J'ai donc fait en une journée le portage en Python pour l'héberger sur Google AppEngine. Grâce à l'infrastructure de Google je ne devrait pas avoir de soucis du même type.

Pour l'instant, le flux récupéré ne correspond qu'à un seul appel au site Télérama et donc ne récupère que 3h de programmes des 6 chaînes analogiques nationales. Mais je compte bien poursuivre le portage pour arriver à l'équivalent de la version PHP puis éventuellement utiliser le stockage Google pour améliorer les performances grâce à un cache.

Pour vous faire patienter, voici un peu de doc sur l'interface du grabbber PHP :

  • /xmltv/telerama.xmltv : 3h de programme à partir de maintenant sur les 6 chaînes (c'est la seule chose qui fonctionne sur xmltv-fr.appspot.com pour l'instant).
  • /xmltv/telerama.xmltv?start=20080927220000 : 3h de programme à partir du samedi 27 à 22:00 (heure de Paris)
  • /xmltv/telerama.xmltv?channels=192,4,80,34,47,118,111,445,119,195,446,444,234,78,226,481,458,482 : 3h de programme de la TNT

J'ai écrit cette semaine une feuille de style XSLT pour faire plusieurs appels au service et combiner les résultats en un seul fichier XMLTV :

xsltproc -o tv.xml http://o.mengue.free.fr/xmltv/telerama-full.xslt http://o.mengue.free.fr/xmltv/TNT.xml

Dès que j'aurais implémenté les paramètres start et channels la même feuille de style pourra aussi fonctionner pour xml-fr.appspot.com.

MàJ 2008-09-29 : le portage est complet, l'API complète (start, channels) est disponible, donc vous pouvez utiliser la même feuille de style simplement en changeant l'URL du service. Voici un exemple où je récupère le programme des 5 prochains jours (voir le format du paramètre duration) :

xsltproc -o tv.xml -stringparam xmltv-url http://xmltv-fr.appspot.com/telerama.xmltv -stringparam duration P5D http://o.mengue.free.fr/xmltv/telerama-full.xslt http://o.mengue.free.fr/xmltv/TNT.xml

Malheureusement, je m'aperçois que je rencontre les mêmes problèmes d'accès au service : je ne peux qu'en déduire que cela vient en fait du site Télérama. À suivre…

samedi 27 septembre 2008

Playing with timezones and building my own XSLT test framework

I'm currently playing with XSLT to improve my XMLTV grabbing solution. Much fun playing with a functionnal language available in most web browsers.

I had the need to handle timezone with daylight savings to display date/times in my timezone, Europe/Paris (same as most of western Europe), which has currently the following definition (I'm not interested in history for this project):

  • Winter is UTC + 01:00
  • Summer is UTC + 02:00
  • Transition from winter to summer occurs on the last sunday of March at 01:00 UTC
  • Transition from summer to winter occurs on the last sunday of October at 01:00 UTC

So I wrote the following template date-time-Paris which is very specialized as it handles only one specific timezone, but it is very fast. I'm using only two extensions from EXSLT: date:day-in-week() and date:add().

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:tap="test:tap"
  xmlns:date="http://exslt.org/dates-and-times"
  extension-element-prefixes="date"
  >

  <!-- Transformation de l'heure UTC en heure de Paris -->
  <!-- Copyright (c) 2008 Olivier Mengué -->
  <xsl:template name="date-time-Paris">
    <!--
      Daylight savings transitions:
      - last sunday of March at 1:00 UTC
      - last sunday of October at 1:00 UTC
      Time offsets:
      - winter: +01:00
      - summer: +02:00
    -->
    <xsl:param name="date-time-Z"/><!-- UTC -->
    <xsl:variable name="len" select="string-length($date-time-Z)"/>
    <xsl:variable name="seps" select="translate($date-time-Z, '0123456789', '')"/>
    <xsl:if test="$len &lt; 11 or substring($date-time-Z, $len, 1) != 'Z' or ($seps != '--T::Z' and $seps != '--T::.Z' and $seps != '--Z' and $seps != '--TZ' and $seps != '--T:Z')">
      <xsl:message terminate="yes">date-time-Paris: date '<xsl:value-of select="$date-time-Z"/>' invalide.</xsl:message>
    </xsl:if>
    <xsl:variable name="month" select="number(substring($date-time-Z, 6, 2))"/>
    <xsl:variable name="offset">
      <xsl:choose>
        <xsl:when test="$month &lt; 3 or $month &gt; 10">1</xsl:when>
        <xsl:when test="$month &gt; 3 and $month &lt; 10">2</xsl:when>
        <xsl:otherwise>
          <xsl:variable name="transition-day" select="32 - date:day-in-week(concat(substring($date-time-Z, 1, 7), '-31Z'))"/>
          <xsl:variable name="less" select="translate(substring($date-time-Z, 8), '-T:Z', '') &lt; $transition-day*1000000+10000"/>
          <xsl:value-of select="1+number(($less and $month = 10) or (not($less) and $month = 3))"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:value-of select="concat(translate(date:add($date-time-Z, concat('PT', $offset, 'H')), 'Z', ''), '+0', $offset, ':00')"/>
  </xsl:template>

The implementation is really short, however it is quite complex as XSLT 1.0 requires to uses many tricks to workaround languages limitations (no native date type, no string order, no xor operator). Here are some tips to follow the code:

  • (a xor b) is equivalent to ((a and not(b) ) and (not(a) and b)).
  • number(true()) is 1, number(false()) is 0.
  • March and October have the same number of days: 31.
  • $transition-day*10000000+10000 for october 2008 (26010000) is an number representation of 2008-10-26T01:00:00Z.
  • the second argument to date:add() is a ISO 8601 duration. Ex: PT2H (2 hours).

In fact I present here the fourth version of the code, the first one was much longer (5x) as I was using intermediate templates for computations (last-sunday-of-month, previous-sunday). Of course the key to debug, and then optimise and refactor the implementation was to start with a good test suite. The test suite is of course written in XML and embedded in the stylesheet so it can evolve with the code.



  <tap:suite name="date-time-Paris" xmlns:t="test:date-time-Paris">
    <t:t dt="2008-09-24T21:37:52Z"     r="2008-09-24T23:37:52+02:00"/>
    <t:t dt="2008-09-24T23:37:52Z"     r="2008-09-25T01:37:52+02:00"/>
    <t:t dt="2008-09-24T23:37:52.325Z" r="2008-09-25T01:37:52.325+02:00"/>
    <t:t dt="2008-10-01T00:00:00Z"     r="2008-10-01T02:00:00+02:00"/>
    <t:t dt="2008-10-26T00:59:59Z"     r="2008-10-26T02:59:59+02:00"/>
    <t:t dt="2008-10-26T01:00:00Z"     r="2008-10-26T02:00:00+01:00"/>
    <t:t dt="2008-10-31T12:00:00Z"     r="2008-10-31T13:00:00+01:00"/>
    <t:t dt="2008-11-24T21:37:52Z"     r="2008-11-24T22:37:52+01:00"/>
    <t:t dt="2008-12-31T23:30:00Z"     r="2009-01-01T00:30:00+01:00"/>
    <t:t dt="2009-01-01T00:00:00Z"     r="2009-01-01T01:00:00+01:00"/>
    <t:t dt="2009-03-01T12:00:00Z"     r="2009-03-01T13:00:00+01:00"/>
    <t:t dt="2009-03-29T00:59:59Z"     r="2009-03-29T01:59:59+01:00"/>
    <t:t dt="2009-03-29T01:00:00Z"     r="2009-03-29T03:00:00+02:00"/>
    <t:t dt="2009-03-30T12:00:00Z"     r="2009-03-30T14:00:00+02:00"/>
    <t:t dt="2009-07-01T00:00:00Z"     r="2009-07-01T02:00:00+02:00"/>
  </tap:suite>

A more complete testsuite can be generated from a local dump of the zoneinfo database (directly works on Ubuntu Hardy, however the zdump tool is missing on RHEL/CentOS):

zdump -v Europe/Paris | perl -ne 'm/ (Mar|Oct) (\d{2}) (\d{2}:\d{2}:\d{2}) (20[0-5]\d) UTC = ... (?:Oct|Mar) (\d{2}) (\d{2}:\d{2}:\d{2}) / && do { my $mm = sprintf "%02d", 3+7*($1 eq 'Oct'); print "    <t:t dt=\"$4-$mm-$2T$3\" r=\"$4-$mm-$5T$6\"/>\n"; }'

Now, we need is a way to run the test suite. In XSLT terms, we say: "to apply a template to the test data". This template will just apply a date-time-Paris call to each of the tests.

  <xsl:template match="t:t" xmlns:t="test:date-time-Paris">
    <xsl:call-template name="tap:is">
      <xsl:with-param name="got">
        <xsl:call-template name="date-time-Paris">
          <xsl:with-param name="date-time-Z" select="@dt"/>
        </xsl:call-template>
      </xsl:with-param>
      <xsl:with-param name="expected" select="@r"/>
      <xsl:with-param name="name" select="@dt"/>
    </xsl:call-template>
  </xsl:template>

</xsl:stylesheet>

We now have a complete stylesheet that can be used as a library in other stylesheet. But we have not yet run the tests. Also you probably wonder what are this XML namespace test:tap and the template called tap:is.

test:tap is just a small XSLT test framework that I wrote and the report test results following the Test Anything Protocol that is well known by Perl programmers. tap:is is part of the test:tap API and just check for equality and reports in the TAP format.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:tap="test:tap"
  >

  <!-- Run all the tests in the test suite -->
  <xsl:template match="tap:suite">
    <xsl:message>1..<xsl:value-of select="count(node()[name()!=''])"/></xsl:message>
    <xsl:message># Suite: <xsl:value-of select="@name"/></xsl:message>
    <!-- TODO fix this expression -->
    <xsl:apply-templates select="node()[name()!='']"/>
  </xsl:template>

  <!-- Test Anything Protocol style reporting of tests -->
  <xsl:template name="tap:is">
    <xsl:param name="got"/>
    <xsl:param name="expected"/>
    <xsl:param name="name"/>
    <xsl:choose>
      <xsl:when test="$got = $expected">
        <xsl:message>ok <xsl:value-of select="position()"/> - <xsl:value-of select="concat($name, ' -&gt; ', $got)"/></xsl:message>
      </xsl:when>
      <xsl:otherwise>
        <xsl:message>not ok <xsl:value-of select="position()"/> - <xsl:value-of select="$name"/></xsl:message>
        <xsl:message>#          got: <xsl:value-of select="$got"/></xsl:message>
        <xsl:message>#     expected: <xsl:value-of select="$expected"/></xsl:message>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

</xsl:stylesheet>

We now have two libraries. Let's add a bit more XSLT to glue them together. The main stylesheet applies tap:suite templates to all tap:suite from all imported stylesheets.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  >

  <!-- Test framework -->
  <xsl:import href="tap.xslt"/>

  <!-- All stylesheets to test -->
  <xsl:import href="date-time-Paris.xslt"/>

  <!-- Launch the tests embedded in libraires, whatever the input is -->
  <xsl:template match="/">
    <xsl:for-each select="document('')/xsl:transform/xsl:import/@href">
      <xsl:apply-templates select="document(.)//tap:suite" xmlns:tap="test:tap"/>
    </xsl:for-each>
  </xsl:template>

</xsl:transform>

We now have everything to run the test suite:

$ echo '<x/>' | xsltproc tap-run.xslt -
1..15
# Suite: date-time-Paris
ok 1 - 2008-09-24T21:37:52Z -> 2008-09-24T23:37:52+02:00
ok 2 - 2008-09-24T23:37:52Z -> 2008-09-25T01:37:52+02:00
not ok 3 - 2008-09-24T23:37:52.325Z
#          got: 2008-09-25T01:37:52.3249999999998+02:00
#     expected: 2008-09-25T01:37:52.325+02:00
ok 4 - 2008-10-01T00:00:00Z -> 2008-10-01T02:00:00+02:00
ok 5 - 2008-10-26T00:59:59Z -> 2008-10-26T02:59:59+02:00
ok 6 - 2008-10-26T01:00:00Z -> 2008-10-26T02:00:00+01:00
ok 7 - 2008-10-31T12:00:00Z -> 2008-10-31T13:00:00+01:00
ok 8 - 2008-11-24T21:37:52Z -> 2008-11-24T22:37:52+01:00
ok 9 - 2008-12-31T23:30:00Z -> 2009-01-01T00:30:00+01:00
ok 10 - 2009-01-01T00:00:00Z -> 2009-01-01T01:00:00+01:00
ok 11 - 2009-03-01T12:00:00Z -> 2009-03-01T13:00:00+01:00
ok 12 - 2009-03-29T00:59:59Z -> 2009-03-29T01:59:59+01:00
ok 13 - 2009-03-29T01:00:00Z -> 2009-03-29T03:00:00+02:00
ok 14 - 2009-03-30T12:00:00Z -> 2009-03-30T14:00:00+02:00
ok 15 - 2009-07-01T00:00:00Z -> 2009-07-01T02:00:00+02:00

So now I know that I have a failing test due to rounding occuring. For my XMLTV project it is not important as I will not have to handle decimal seconds.

dimanche 21 septembre 2008

PhotoSynth : le salon De Gaulle, au ministère de la Défense

J'ai profité des Journées Européennes du Patrimoine pour faire quelques visites d'hôtels particuliers de la rue de Grenelle.

Voici la reconstitution en 3D, grâce à PhotoSynth, du salon De Gaulle à l'hôtel de Brienne (ministère de la Défense). Ce salon fût occupé par le Général en tant que chef du gouvernement provisoire du 25 août 1944 à janvier 1946.

Pour voir en plus grand, suivez ce lien. Pour la visualisation 3D l'installation du plug-in PhotoSynth est nécessaire. Et il n'est disponible que sous Windows. XP et Vista uniquement. Désolé.

samedi 6 septembre 2008

Mise à jour du site MétéoFrance, donc de Météo Mobile

Le site de MétéoFrance a été relooké. Pas pour le mieux étant donné que l'on retrouve beaucoup de problèmes du site précédent et d'autres en plus : le changement cosmétique est malheureusement bien suffisant et encore une fois mal réalisé :

  • du Flash partout : les possesseurs d'iPhone (qui n'affiche pas le flash) seront à la fête ;
  • l'activation des cookies est nécessaire pour passer la page d'accueil : inadmissible !
  • ce cookie est défini par du code JavaScript sur la page d'accueil, donc JavaScript est nécessaire ;
  • le code HTML est changé, mais toujours aussi bogué puisque ce n'est pas du XML valide (9 erreurs relevées sur le W3C Validator sur la page d'accueil) ;
  • il y a toujours autant de pubs intrusives (popups...) ;
  • les URLs sont toujours aussi abominables. Exemple : http://marine.meteofrance.com/marine/accueil?17865.path=marinecote

Cette réorganisation impacte ma passerelle de consultation des bulletins sur téléphone mobile, Météo Mobile, qui ne fonctionnait donc plus :

  • l'URL des bulletins a changé. Exemple d'un bulletin côtier : http://marine.meteofrance.com/marine/accueil?MARINE_PORTLET.path=marinecotebulletinCOTE_RAPH_MENT ;
  • il faut maintenant envoyer le cookie IntersticielPerso=done pour ne pas être redirigé vers la page d'accueil (voir le code source de la page d'accueil sans cookie) ;
  • il y a encore des problèmes de XML, différents de la version précédente, donc on ne peut toujours pas utiliser un analyseur XML pour extraire le texte du bulletin.

Voici comment j'ai testé le requêtage HTTP pour récupérer la page d'un bulletin :

C:\>curl -i --header "Cookie: IntersticielPerso=done" http://marine.meteofrance.com/marine/accueil?MARINE_PORTLET.path=marinecotebulletinCOTE_RAPH_MENT

J'ai adapté le code de récupération. L'ancien code était très simple, grâce à file_get_contents() :

$url = 'http://www.meteofrance.com/FR/mer/bulCote.jsp?LIEUID=COTE_' . $lieu;
$data = file_get_contents($url);

Pour passer le cookie, j'ai dû utiliser la libcurl ainsi :

$url = 'http://marine.meteofrance.com/marine/accueil?MARINE_PORTLET.path=marinecotebulletin/COTE_' . $lieu;

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
// C'est ici qu'est la partie spéciale du site de MétéoFrance
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Cookie: IntersticielPerso=done"));

curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 4); // 4 secondes
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$page = curl_exec($ch);

if (curl_errno($ch)) {
    // Faire quelque chose de curl_error($ch)
    $page = '';
}
curl_close($ch);

Comme vous l'avez vu j'utilise pour l'instant les bulletins publiés sur le site web public. Mais je préfèrerais avoir un accès direct au bulletin texte brut. Je n'ai rien trouvé sur le site FTP de MétéoFrance. Alors, si vous connaissez l'URL d'une telle source, je suis intéressé.

mercredi 6 août 2008

Just released: curlIE

I just published on Google Code a small software project I wrote about one year ago but that I just rediscovered on my hard drive a few weeks ago: curlIE. This is an implementation of a subset of cURL, the command line tool for transferring files with URL syntax, in JScript in the Windows Script Host environment using the XMLHttpRequest object. This is the first piece of code since I write JavaScript/WSH code (more than 10 years now) that I found good enough to be worth publishing. There is probably more to dig in my hard disk...

As you can see in the source, the code that deals with HTTP is very small as everything is delegated to the XMLHttpRequest object. In fact, half of the lines are a generic command line parser that implements the classic UNIX-style argument parsing with short and long options to match cURL. Just the few major options are currently implemented. I will add others if I get incoming feature requests...

mercredi 9 juillet 2008

Utiliser une base Access dans OpenOffice.org

Il est possible d'utiliser et de modifier sous Windows les données d'une base de données Microsoft Access sans le logiciel Microsoft Access.

Le pilote d'accès aux bases de données Access, Microsoft Jet Engine, est depuis longtemps un composant intégré à Windows. Voici comment paramétrer OpenOffice.org 2.4 sous Windows pour utiliser une base et ainsi profiter du requêteur graphique (semblable à celui d'Access), réaliser des mailings, etc.

Lire la suite...

vendredi 4 juillet 2008

À Vélib’, pratiquez-vous la « chronoculture » ?

Depuis le 14 juin Vélib’ a ajouté une caractéristique au compte abonné : le « Bonus V’+ ». Le principe est de récompenser les utilisateurs qui ramènent des Vélib’ aux stations les plus dépourvues : celles situées en haut des collines de Paris. Découvrez la chronoculture !

Lire la suite...

mardi 27 mai 2008

My first Perl 6 / rakudo patch

<rakudo_svn> r27835 | pmichaud++ | [rakudo]:
<rakudo_svn> r27835 | pmichaud++ | * Add an implementation of infix:<xx>, from RT#54870 (dolmen++)
<rakudo_svn> r27835 | pmichaud++ | * Patch courtesy Olivier Mengu?\195?\169 <olivier.mengue xxatxx gmail.com>
<rakudo_svn> r27835 | pmichaud++ | * One minor change to handle negative repetition values.

dimanche 18 mai 2008

Journées Perl 2008, à Albi

Les journées Perl 2008 auront lieu à la fin du mois à Albi. Une fois de plus je ne présenterai pas de Perl. Il y a un an et demi j'avais présenté l'ORM de Django aux Journées Perl 2006. Cette fois-ci, ce ne sera pas du Python, mais du shell Unix (ksh, bash...) : ma présentation est intitulée Mieux programmer en shell. Le contenu sera fortement inspiré du guide de style non officiel d'OpenSolaris.

Mise à jour : voici les dispositives de ma présentation « Mieux programmer en shell ».

dimanche 2 mars 2008

Télérama → XMLTV : mise à jour

J'ai mis en ligne une version corrigée des mes outils de transformation de la grille télé de Télérama en XMLTV (voir mon billet précédent). Maintenant l'applet OnTV disponible pour le bureau Gnome fonctionne avec ces outils.

Capture de l'affichage des programmes avec OnTV

Lire la suite...

mercredi 20 février 2008

Je vais au FOSDEM 2008

I’m going to FOSDEM, the Free and Open Source Software Developers’ European Meeting

Comme chaque année depuis 2005, je vais au Free and Open Source Software Developers’ European Meeting, à Bruxelles, le week-end prochain. J'avais publié l'année dernière mon compte-rendu de 2006. Il est toujours utile pour ceux qui hésitent à venir à cet évènement.

lundi 11 février 2008

Les programmes télé de Télérama en XMLTV

XMLTV est un format informatique pour les programmes de télévision. Ce format est utilisable dans un nombre grandissant d'applications. Le magazine Télérama propose sur son site une grille des programmes télé, mais juste consultable sur le web. Pas de XMLTV.

Je vous propose donc de combler ce manque avec un petit cours de reverse engineering sur le web et la démonstration de quelques outils pour arriver rapidement à vos fins. La grille de Télérama est une excellente cible pour ce genre d'exercice parce que, vous le verrez, la tâche n'est pas simple, mais possible. Elle donne l'ocassion de montrer l'usage de plusieurs outils (curl, XSLT, Perl) et c'est un exemple de ma démarche de prototypage rapide en utilisant le meilleur de chacun.

MàJ 2008-02-15 : j'ai profondément remanié l'introduction et la conclusion suite à quelques commentaires de lecteurs.

Lire la suite...

jeudi 24 janvier 2008

Formule Excel : extraire le nom de fichier d'un chemin

Voici une formule bien utile pour les administrateurs système qui manipulent des listes de noms de fichiers avec Excel. Elle permet de supprimer le répertoire d'un chemin. Par exemple, « /abc/def/ghi/truc.txt » devient « truc.txt ». A1 est la cellule contenant le texte d'origine.

=SI(ESTERREUR(TROUVE("/";A1));A1;STXT(A1;
 TROUVE(CAR(1);SUBSTITUE(A1;"/";CAR(1);
 NBCAR(A1)-NBCAR(SUBSTITUE(A1;"/";""))))+1;
 NBCAR(A1)))

Sur un Excel anglophone, ou sur Google Document et Tableur cela s'écrit (notez que CHAR(1), l'équivalent anglais de CAR(1) ne fonctionne pas sur Google Document et Tableur) :

=IF(ISERROR(FIND("/";A1));A1;MID(A1;
 FIND("¤";SUBSTITUTE(A1;"/";"¤";
 LEN(A1)-LEN(SUBSTITUTE(A1;"/";""))))+1;
 LEN(A1)))

En Perl, cela s'écrirait :

s@.*/@@;

Est-ce que quelqu'un osera dire qu'Excel c'est simple et que Perl, c'est compliqué ?

Une partie de cette formule Excel est bien utile dans d'autres cas : il s'agit de la recherche de la dernière occurence d'une chaîne.

=TROUVE(CAR(1);SUBSTITUE(A1;"/";CAR(1);
 NBCAR(A1)-NBCAR(SUBSTITUE(A1;"/";""))))

Et en anglais :

=FIND("¤";SUBSTITUTE(A1;"/";"¤";
 LEN(A1)-LEN(SUBSTITUTE(A1;"/";""))))

Un peu d'explications :

  • NBCAR(A1)-NBCAR(SUBSTITUE(A1;"/";"")) calcule le nombre d'occurences de "/" ;
  • le SUBSTITUE() qui l'entoure permet de remplacer cette occurence par un caractère spécial (ici CAR(1) est le caractère dont le code est 1) ;
  • le TROUVER() englobant permet de trouver la position de ce caractère spécial.

Et pour vous faire rire un peu, voici la formule que le support Microsoft propose (à valider en technique matricielle avec Ctrl+Maj+Entrée). Cette fois, le texte dans lequel on cherche est dans la cellule A2 pour bien distinguer de la cellule A1 utilisée dans la formule matricielle.

=STXT(A2;MAX(SI(ESTERREUR(
 CHERCHE("/";A2;LIGNE(DECALER(INDIRECT("A1");;;NBCAR(A2)))));0;
 CHERCHE("/";A2;LIGNE(DECALER(INDIRECT("A1");;;NBCAR(A2))))))+NBCAR("/");
 NBCAR(A2))

Laquelle préférez-vous ?

mercredi 23 janvier 2008

Maman utilise Ubuntu !

Ça y est, depuis samedi ma mère utilise Ubuntu au lieu de Windows !

Mon vieux PC de 1998 a fait son temps, et même si c'était le top à l'époque (Céléron 300 MHz overclocké à 400, nVidia TNT) il devenait insuffisant pour utiliser Firefox et Thunderbird en même temps, sans compter l'antivirus AVG qui prenait aussi de plus en plus de place. D'autant plus qu'il y a un an j'avais dû restreindre à 160 Mo la mémoire utilisée par Windows au lieu des 196 Mo physiquement installés en raison d'un défaut sur l'une des barrettes (paramètre /MAXMEM dans le boot.ini).

Je préparais cette migration depuis plusieurs années en essayant de remplacer petit à petit les logiciels habituels de mes parents par des solutions libres, en cherchant toujours un logiciel pour Windows existant également sous Linux. Le bourrage de crâne concernant l'intérêt des logiciels libres était léger, mais régulier.

Voici les logiciels qu'ils utilisent :

  • Firefox pour la navigation web (depuis 4 ans). Mon père continue malgré tout à utiliser IE6, bien plus véloce pour ses transaction sur eBay.
  • Thunderbird pour la messagerie. Outlook Express n'est remplacé que depuis 4 mois, parce qu'il a fallu que j'attende Thunderbird 2 pour que le module d'import des e-mails sache importer les messages en respectant la structure des dossiers existant. Lors de cette migration j'en avait profité pour séparer les comptes e-mails sous deux profils différents. Mes parents utilisaient auparavant un seul compte Windows et un seul compte Outlook Express, ce qui était plus pratique à l'époque de la connexion par modem : celui qui se connectait à Internet récupérait d'un seul coup les e-mails pour toute la famille.
  • Picasa, pour le classement des photos numériques (depuis 2 ans et demi). Ce n'est pas libre, mais c'est le seul logiciel de ce type existant à la fois pour Windows et Linux. Et c'est gratuit.
  • The Gimp pour la retouche de photos. Mon père l'a même utilisé pour faire les plans de modification de leur maison !
  • OpenOffice.org : ma mère a même pu vanter à l'un de ses collègues de cours d'anglais la fonction d'export PDF intégré, fonction qui n'existe pas dans la suite de Microsoft.

Finalement, ce que je craignais le plus, le changement de système d'exploitation, est passé comme une lettre à la poste. Maman ne voit pas la différence entre l'Explorateur Windows et Nautilus. Le menu Raccourcis de Gnome est toujours bien accessible et il n'y a pas à chercher parmi les 14 lettres de lecteur (de A: à O:) de Windows. Insérer/éjecter une clé USB est très semblable même si le vocabulaire diffère un peu. Peut-être faudra-t-il juste que j'ajoute un raccourci Win+E pour accéder rapidement à Nautilus puisque mes parents y sont habitués.

J'avais envisagé un temps d'utiliser un NAS pour qu'ils puissent partager des fichiers entre les deux PC mais il semble que la migration soit complète et définitive et que l'ancien PC sous Windows 2000 puisse être abandonné d'ici quelques semaines.

J'ai même pu éprouver Wine avec le CD d'un logiciel d'astrologie que ma mère vient d'avoir gratuitement avec un magazine. Mis à part quelques problèmes de polices de caractères, tout s'exécute bien.

Il me reste toutefois encore quelques tâches pour que la migration soit complète :

  • installer l'imprimante laser HP 1018 : je ne m'inquiète pas trop à ce sujet parce que la compatibilité Linux était un critère de choix du modèle à l'époque.
  • migrer les photos et surtout les méta données enregistrées par Picasa : je n'ai trouvé aucune info là-dessus pour l'instant.

Sous le capot d'une station Vélib’

Ce soir, j'ai assisté par hasard au reboot d'une station Vélib’.

Lire la suite...

lundi 5 novembre 2007

A simple ksh framework prototype

Nothing is as good as a old Unix shell for running and monitoring batchs. Here is a proposition for a simple framework that will improve readabilty of the code while increasing error reporting in the output.

Lire la suite...

- page 1 de 4