in_array en Perl

Le perl

Bonjour ! Voici un petit article sur le Perl. Oui bon de la programmation dans blog dédié à Debian... je sais, je sais. Mais mon crédo depuis plusieurs années : "si tu peux pas le faire, fait le en Perl". Et pour l'instant ça passe plutôt bien ! Bref, ce que j'aime bien avec Perl, c'est qu'il existe plein de possibilités pour parvenir à ces fins. Malheureusement, quel façon de faire et dans quel contexte ?
Prenons, un cas simple une recherche dans un tableau. En PHP, nous avons la fonction in_array... mais en Perl il existe plusieurs façons de faire. Voici un petit script "benchmark" pour tester 3 techniques :

#!/usr/bin/perl
use Benchmark;
my @list;
for (1..10_000) {
    push @list, $_;
}

timethese(10000, {
  'grep'    => sub {
            if ( grep(/^5000$/o, @list) ) {
                # code
            }
        },
  'hash'    => sub {
            my %params = map { $_ => 1 } @list;
            if ( exists($params{5000}) ) {
                # code
            }
        },
   '~~'	   => sub {
            if ( 5000 ~~ @list ) {
                # code
            }
	}
});
$ perl bench.pl
Benchmark: timing 10000 iterations of grep, hash, ~~...
      grep:  7 wallclock secs ( 6.17 usr +  0.00 sys =  6.17 CPU) @ 1620.75/s (n=10000)
      hash: 33 wallclock secs (33.29 usr +  0.00 sys = 33.29 CPU) @ 300.39/s (n=10000)
        ~~:  1 wallclock secs ( 1.36 usr +  0.00 sys =  1.36 CPU) @ 7352.94/s (n=10000)

Mon interprétation :

  1. grep est utile pour une recherche avec regex. Perf "moyenne"
  2. hash... à oublier !
  3. très performant avec pour des recherches exactes.

J'espère que ce petit test a plu... j'en refaire plein d'autres :)

Soucis avec Dropbox : Please run "echo 100000 | sudo tee /proc/sys/fs/inotify/max_user_watches"

Petite astuce à connaitre pour éviter de toujours recevoir des erreurs avec Dropbox... Il se peut que ta Dropbox contienne beaucoup de fichiers... mais vraiment beaucoup (comme dans mon cas). Cette erreur qui n'en n'est pas une signifie que inotify ne peut pas scanner tous les fichiers (par défaut 8192 sur Debian Lenny)... Voici la petite astuce du jour pour que ça corrigé "en dur" :

echo "fs.inotify.max_user_watches = 100000" >> /etc/sysctl.conf && sysctl -p

Retrouver les paquets installés manuellement sous Debian

Problématique du jour, à on PC du boulot je suis sous une vieille version d'ubuntu avec l'ancêtre (et tellement regretté Gnome2). Je souhaite réinstaller tout mon système avec XFCE et avoir tous les paquets installés manuellement (xmoto, wormux...). Mon soucis : système installé depuis des années, je ne peux pas parse les logs de dpkg. J'ai commencé à faire un code "sale" du genre :

dpkg -l | grep '^ii' | awk '$2 !~ /^(lib|xserver-xorg|ttf|x11|xul|ubuntu|cups|apt|compiz|firefox|usb|update|unity|linux|gnome)/ { print }' | egrep -v 'GNOME|LibreOffice' | less

J'ai encore pas mal de merdier (766 lignes)... Bref, projet où on se casse les dents pour 30 paquets à se souvenir. Après quelques recherches, je suis tombé sur le programe debfoster. Avec une utilisation détournée, on peut retrouver les paquets recherchés :

$ sudo debfoster -q
$ vim /var/lib/debfoster/keepers
$ wc -l /var/lib/debfoster/keepers
134 /var/lib/debfoster/keepers

Après lecture du fichier, il reste quelques paquets à supprimer de la liste comme language-pack-gnome-en, linux-headers-*, linux-image-*, les drivers proprios.

Bref, astuce à connaitre poru éviter de s'embarquer dans un script foireux.

Bonne journée!