Just Another Geek

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

Une image de moi

Archive du blog de Nicolas Bareil · restaurée à partir d’Internet Archive · commentaires fermés

samedi 26 février 2005

Explication du billet précédent

extensions=''${(fR)${(M)${(f)"$(< /etc/mime.types)"}##video*}##video[[:alnum:]./-]##[\t ]#}''
  1. $(< /etc/mime.types) - on extrait le contenu du fichier
  2. ${(f)"..."} - on fait du line-splitting
  3. ${(M)${...}##video*} - on ne sélectionne que les lignes matchant video*
  4. ${(R)${...}##video[[:alnum:]./-]##[\t ]#} - on matche la partie gauche de la ligne et on garde le reste.

Maintenant, la variable $extensions contient les extensions dans un fouilli pas encore utilisable : ce qu'on veut, c'est construire une expression rationnelle qui matche un nom de fichier associé à une vidéo. On veut *(wmv|avi|mkv|mpg). Pour le moment, on a une chaine de ce genre :

wmv     avi mkv         mpg
videos="(#i)*(${(j:|:)${(z)extensions}})"
  1. ${(z)extensions} - on fait un word-splitting classique (les éléments sont séparés par $IFS)
  2. ${(j:|:)...} - on joint tous les mots/éléments par le caractère '|'
  3. (#i)*(...) - on mets le flag "case insensitive" et le {début,fin} de l'expression rationnelle.

vendredi 25 février 2005

Globbing des fichiers vidéos

Comme je racontais la dernière fois, j'ai un répertoire où j'entasse tous les fichiers de la journée, cela peut être des vidéos, papiers, codes, etc.

J'aime bien visionner toutes les vidéos sans avoir me prendre la tete, donc j'aimerai bien faire :

% mplayer *

Ca marche, mais vous êtes d'accord que c'est pas terrible : mplayer tente de lire même les fichiers pdf et ca ne lui plait pas toujours... Alors on tente d'affiner :

% mplayer *(avi|mpg|mkv)

Mais comme le veut Murphy, on oublie toujours d'indiquer un format, et puis c'est long de taper (et de se souvenir) de toutes les extensions possibles.

Utilisons alors le fichier /etc/mime.types pour récupérer toutes ces extensions. Utilisons du Perl pour faire ca :

% videos="(#i)*($(perl -lane 'push @x, $F[1] if /video/ && defined $F[1];END{print join q/|/,@x}' /etc/mime.types))"
% echo $videos
(#i)*(dl|fli|gl|mpeg|mp4|qt|mxu|dif|lsf|mng|asf|wm|wmv|wmx|wvx|avi|movie)
% echo $~videos
bl.avi bl.AVI

Ce qui marche plutot bien... Mais comme c'est encore trop simple comme solution, utilisons zsh uniquement : pas besoin de gaspiller un fork() !

% extensions=''${(fR)${(M)${(f)"$(< /etc/mime.types)"}##video*}##video[[:alnum:]./-]##[\t ]#}''
% videos="(#i)*(${(j:|:)${(z)extensions}})"

(bon, j'y ai passé une heure, mais ca a plus de gueule non ? On pourrait encore factoriser une ou deux expressions mais j'ai mal à la tête...)

Pourquoi faire simple lorsqu'on peut faire compliqué ?

mardi 15 février 2005

Sebek et read() LD_PRELOAD hijacking

Pourquoi faire simple quand on peut faire compliqué ? Voici une solution tellement simple [archive] afin de bypasser Sebek [archive] que ca me dégoûte d'avoir passé autant de temps sur une chose du même genre en me cantonnant à n'utiliser que l'appel système mmap() pour remplacer read().

En plus, y avait tellement de limitations à ma version que c'était pas drôle :(