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

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

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 ?

samedi 3 novembre 2007

Rotation JPEG sans perte, suite

Suite à mon précédent post, j'ai profité qu'exiftool est un module Perl pour re-développer en Perl mon outil de rotation des images JPEG vraiment sans perte. Voici ci-dessous le code et les astuces pour l'intégration dans Nautilus.

Lire la suite...

jeudi 12 avril 2007

Simple Perl wrapper for non-Perl TAP programs

TAP (Test Anything Protocol) is a simple protocol to report the result of a testsuite. It was initially designed for test suites of Perl modules, but developers of the Test::Harness modules have seen the potential for a more generic usage of the protocol outside of the Perl ecosystem and libraries are in development for other programming languages.

I'm writing C code and contrary to most programming langages today, there is no library to build test suites in a standard way. Java has JUnit, Perl has Test::Simple and Test::More...

Someone has developped libtap, but no one uses it (except FreeBSD developers as advertised on the site). Also, I do not like the library interface because it exports functions such as ok() or diag() which could conflict with existing code. So, I wrote my own library that I will publish one day. But that is not the point of this post.

When you have written a program conforming to the TAP, you want tools to analyse the result of the tests. And the main advantage of using a standardized protocol is to be able to use generic tools and avoid to implement/test/debug them yourself. The problem with TAP is that the only tool that is available is prove and it suffers of a major flaw: it is designed to run only Perl tests.

Here is a simple TAP-compliant C program that outputs the result of a static testsuite:

#include <stdio.h>

int main(int argc, char *argv[])
{
  puts("1..1\nok 1");
  return 0;
}

And the output:

$ gcc a.c
$ ./a.out
1..1
ok 1

When trying to run it with prove, perl complains it did not found Perl code:

$ prove a.out
a....Unrecognized character \x7F at a.out line 1.
a....dubious
        Test returned status 9 (wstat 2304, 0x900)
FAILED--1 test script could be run, alas--no output ever seen

So I wrote the following generic Perl wrapper a.out.t that just runs a.out:

# vim:set ft=perl:

use strict;
use File::Spec;
my $exe = File::Spec->rel2abs($0);
$exe =~ s/\.t$//;

exec $exe $exe or die "$exe: $!";

And now, success is achieved:

$ prove a.out.t
a.out....ok
All tests successful.
Files=1, Tests=1,  0 wallclock secs ( 0.01 cusr +  0.01 csys =  0.02 CPU)

samedi 25 novembre 2006

Django aux Journées Perl 2006

Hé oui, Django c'est du Python, et pourtant on j'en parlerais aux Journées Perl 2006 ce week-end à la Cité des Sciences et de l'Industrie.

J'ai deux présentations au programme :

  • 14h00 Introduction aux ORM : un introduction générale sur les ORM et une présentation du modèle de données utilisé en commun dans plusieurs des présentations : un mini modèle représentant une association de randonneurs.
  • 14h10 Les modèles de Django : une petite introduction générale sur Django puis l'accent sera mis sur la définition des modèles Django, l'API de requêtes et comment les spécificités de Python sont utilisées. L'objectif est de montrer un modèle de conception d'ORM et comment le sucre syntaxique du langage peut être mis à profit.

Je vous invite à aller voir les autres présentations sur les ORMs qui ont lieu le samedi après-midi.