samedi, juillet 23 2011

Bug avec le pilote WL et Avahi

Si comme moi vous avez une carte wifi sur votre pc portable de type Broadcom (BCM43225 chez moi) alors vous allez avoir besoin du pilote "wl" (paquet kmod-wl chez rpmfusion...). Ce pilote fonctionne très bien mais la paquet utilise une version qui (pour le moment) a un léger bug qui peut vous engendrer une crise d'arrachage de cheveux en règle. L'idée principale est tout simplement que mon pc portable refuse catégoriquement de trouver les hôtes de mon réseau via le système d'auto-configuration de nom de domaine Avahi. Pour régler cela, je vais vous donner la marche à suivre.

Tout d'abord, pour faire un peu le "pro" je vais vous expliquer comment j'ai trouvé le bug... Rien de bien méchant, il suffisait de connaitre deux commandes: tcpdump et grep. Je vous l'explique par ce que je pense que vous pourrez apprécier de savoir faire cela pour d'autres cas.

Je savais que avahi fonctionnait simplement: au moment où une machine accroche un réseau, le démon avahi envoit un paquet "broadcast" contenant son adresse, son nom de domaine (nom de machine en fait), et quelques infos... Bref, de mon coté j'ai deux pc qui trounent: patrice-desktop et patrice-laptop.

Voilà ce que j'ai fait, bêtement: Sur le poste desktop, j'ai lancé (en root...)

tcpdump -i eth0 | grep mdns

Ce que fait cette commande est simple: afficher toutes les trames réseau qui arrivent sur l'interface réseau eth0 et filtrer seulement celle qui ont "mdns" dans les informations. En fait, sitôt que mon portable se connectera, il doit envoyer un broadcast pour dire "hého je suis patrice-laptop, et j'ai telle ip". Et dans les informations de paquet, il y aura "mdns" qui doit apparaitre, puisque c'est ce protocole qui est utilisé...

Pour faire simple, je relance simplement le service avahi-daemon sur le laptop:

su -c "service avahi-daemon restart"

et là... sur le pc de bureau je vois bien:

12:27:28.822446 IP patrice-laptop.local.mdns > 224.0.0.251.mdns: 0*- [0q] 29/0/0 (Cache flush) AAAA fe80::4e0f:6eff:fe24:6009, (Cache flush) PTR patrice-laptop.local., (Cache flush) A 10.0.0.2, (Cache flush) PTR patrice-laptop.local., (Cache flush) HINFO, PTR patrice-laptop [4c:0f:6e:24:60:09]._workstation._tcp.local., (Cache flush) SRV patrice-laptop.local.:9 0 0, (Cache flush) TXT "", PTR _workstation._tcp.local., PTR patrice-laptop._http._tcp.local., (Cache flush) SRV patrice-laptop.local.:45937 0 0, (Cache flush) TXT "u=guest", PTR _http._tcp.local., PTR Fichiers publics de patachou sur patrice-laptop.local._webdav._tcp.local., (Cache flush) SRV patrice-laptop.local.:45937 0 0, (Cache flush) TXT "u=guest" "path=/", PTR _webdav._tcp.local., PTR Virtualization Host patrice-laptop._libvirt._tcp.local., (Cache flush) SRV patrice-laptop.local.:0 0 0, (Cache flush) TXT "", PTR _libvirt._tcp.local., PTR patrice-laptop._ssh._tcp.local., (Cache flush) SRV patrice-laptop.local.:22 0 0, (Cache flush) TXT "", PTR _ssh._tcp.local., PTR patrice-laptop._udisks-ssh._tcp.local., (Cache flush) SRV patrice-laptop.local.:22 0 0, (Cache flush) TXT "", PTR _udisks-ssh._tcp.local. (855)

Ok , parfait mon laptop envoit les infos, mais faisons maintenant l'inverse, on lance la commande tcpdump sur le portable, et on relance avahi daemon sur le pc de bureau... et ba rien n'apparaissait...

J'ai donc prospecté, et j'ai appris que la version du pilote donné dans rpmfusion n'est pas patché pour corriger le souci. Alors on va palier le souci le temps que l'auteur (que j'ai prévenu) fasse la correction.

Tout d'abord, on récupère le pilote broadcom:

#on va utiliser un répertoire pour notre compilation
mkdir ~/broadcom
cd ~/broadcom

#les sources du  module pour 64 bits
wget http://www.broadcom.com/docs/linux_sta/hybrid-portsrc_x86_64-v5_100_82_38.tar.gz
tar zxf hybrid-portsrc_x86_64-v5_100_82_38.tar.gz

#pour les 32 bits utilisez ceci:
#wget http://www.broadcom.com/docs/linux_sta/hybrid-portsrc_x86_32-v5_100_82_38.tar.gz
#tar zxf hybrid-portsrc_x86_32-v5_100_82_38.tar.gz

#on récupère le patch
wget http://www.broadcom.com/docs/linux_sta/5_100_82_38.patch
patch -p0 < 5_100_82_38.patch

A partir de là, vous avez les sources prêtes à être compilées.

Et bien allons-y, on compile:

make

Maintenant que ça a compilé, et seulement si ça a compilé, on va supprimer le paquet kmod-wl et virer le module:

su -lc "rmmod wl; yum remove kmod-wl -y"

Et enfin, on va installer le module que nous avons compilé:

su -c "make install && insmod wl.ko"

Normalement, votre connexion va se relancer et vous aurez le wifi qui marchera... notez que vous devrez pour le moment refaire la manipulation de compilation à chaque fois que vous mettrez à jour votre noyau.

Ainsi j'ai enfin eut mon réseau qui troune avec "mdns" (donc avahi en fait) et je peux pinger, me connecter ou lister tous les postes de mon réseau sans connaitre leur ip :) Désolé mais j'adore.

Bon j'espère que le mainteneur du paquet kmod-wl a lut mon message... car c'est pas marrant pour tout le monde de devoir se compiler soit même un pilote... Quoique la méthode est pas si complexe...

vendredi, juillet 22 2011

Jouer avec le bash pour faire un benchmark

Avant toutes choses, je ne suis pas un dieu du bash, loin de là. J'avais besoin de faire un petit benchmark entre node.js, php et python. Et je vous avoues que j'avais pas très envie de créer des scripts partout pour une opération "one shot"... Connaissant un peu les capacités de bash, j'ai tapé instinctivement (je vous assure) les commandes que je vais vous expliquer. Le but était à la base de créer le moins de fichiers possibles. En fait tout ce dont j'avais besoin c'était de créer les fichier de résultats de temps et de visualiser un graphique. Vous allez voir que ce que je vais vous présenter ne crée que 3 fichiers, en fait un fichier de "log" de temps d'exécution par langage. Pour le reste, c'est bash qui va s'occuper de me rendre service, ainsi que le fabuleux gnuplot.

Juste une petite parenthèse, ce billet est surtout là pour montrer à quel point le terminal de commandes est puissant si l'on se penche un peu sur l'ensemble des commandes utiles. Un peu d'entrainement permet de régler des tas de soucis, mais aussi, comme dans mon cas présenté ici, de permettre des travaux qui peuvent paraître compliqués... mais finalement réglé en quelques minutes... Encore une fois, je connais bien Bash et cela vient naturellement, mais je n'ai pas plus d'aptitude que la plupart des linuxiens sur un terminal. Ma seule performance ici est d'avoir la folie et l'amour des lignes de commandes pour ce genre de process.

Très bien, pour être précis mes benchmarks se portaient sur le calcul de 32 rangs de la suite de fibonnacci. Pour ceux qui ne la connaissent pas, je vous la présente rapidement: 0 1 1 2 3 5 8 13 etc...

En fait c'est simple, on part de 0 puis 1, ensuite il faut ajouter les deux nombres précédents pour trouver le nombre du rang "n".

  • 0 et 1 engendre: 0+1=1
  • la suite est donc 0 1 1
  • ensuite je prend les deux derniers chiffres: 1 et 1, je les additionne: 1+1=2
  • la suite devient 0 1 1 2
  • on continue de la même manière, les deux derniers chiffres de la suite étant 1 et 2: 1+2=3
  • la suite devient 0 1 1 2 3
  • et ainsi de suite, les deux derniers chiffre étant 2 et 3: 2+3=5
  • la suite devient 0 1 1 2 3 5
  • etc...

Algorithmiquement, cela peut se résoudre par une fonction itérative:

fonction fibo (n)
    si n vaut 0 ou 1 on retroune n
    sinon on retourne fibo(n-2)+fibo(n-1)

Ok, pour python, php et node (javascript) cela va se faire en 3 ou 4 lignes... et plutôt que de créer un script, je fais appel aux interpréteurs directement en ligne de commande. Par exemple pour avoir le rang 10 en PHP:

php -r '
function fibo ($n) {
return ($n==0 || $n==1) ? $n : fibo($n-1)+fibo($n-2);
}
fibo(10);
'

Ça fonctionne bien.

Reste que je veux calculer tous les rangs allant de 0 à 32... et bien bash me permet de boucler:

for i in $(seq 1 32)
do
php -r '
function fibo ($n) {
return ($n==0 || $n==1) ? $n : fibo($n-1)+fibo($n-2);
}
fibo('$i');
done

Pas mal... mais il me reste un truc à faire, chronométrer le processus... alors oui je sais, il existe la commande "time" mais elle est pas si simple à gérer en terme de sortie, moi j'ai besoin d'avoir juste le temps total, seconde et milisecondes comprises... et bien c'est simple, on va enregistrer le timestamp + les nanosecondes via la commande "date" avant puis après le processus. Il suffira de soustraire les temps pour avoir le différenciel.

Voilà comment je benchmark PHP:

for i in $(seq 1 32); do 
echo -n $i" "
_s=$(date +%s.%N)
php -r '
function fibo ($n) {
return ($n==0 || $n==1) ? $n : fibo($n-1)+fibo($n-2);
}
fibo('$i');
'
echo $(date +%s.%N)-$_s | bc -l
unset _s
done

Je vous explique. je boucle 32 fois sur la suite de commande:

  • echo -n $i" " : pour savoir où j'en suis, j'ajoute un espace après le nombre, et j'utilise "-n" pour ne pas revenir de suite à la ligne
  • _s=$(date +%s.%N) : je place la date en timestamp (nombre de secondes depuis 1970) suivit de "." et les nanosecondes en cours
  • php -r... : on exécute le code php
  • echo $(date +%s.%N)-$_s | bc -l : j'écris l'opération "date courante avec nanoseconde" - "date enregistré avant le process" et je l'envois à "bc -l" qui va calculer ça
  • unset _s : juste pour virer la vairable $_s qui va plus nous servir.

Bon, vous avez compris, me reste plus qu'à enregistrer le résultat dans un fichier. Je vais donc dans /tmp et je crée un répertoire "bench":

mkdir /tmp/bench
cd /tmp/bench

et je fais le logs, pour PHP en premier (dieu que c'est lent...):

for i in $(seq 1 32); do 
echo -n $i" "
_s=$(date +%s.%N)
php -r '
function fibo ($n) {
return ($n==0 || $n==1) ? $n : fibo($n-1)+fibo($n-2);
}
fibo('$i');
'
echo $(date +%s.%N)-$_s | bc -l
unset _s
done>php.log

On fait pareil pour node:

for i in $(seq 1 32)
do
echo -n $i" "; _s=$(date +%s.%N);
node <<JS
function fibo(n) {
return (n==0 || n==1 ) ? n : fibo(n-2)+fibo(n-1);
}
fibo($i);
JS
echo $(date +%s.%N)-$_s | bc -l; 
unset _s; 
done>node.log

et enfin pour python:

for i in $(seq 1 32)
do 
echo -n $i" "
_s=$(date +%s.%N); python -c '
def fibo(n):
   return n if (n==0 or n==1) else fibo(n-1)+fibo(n-2)
fibo('$i')
'
echo $(date +%s.%N)-$_s | bc -l; 
unset _s; 
done>python.log

J'ai donc là 3 fichier qui contiennent chacun des logs de temps, je vous montre celui de PHP:

$ cat php.log 
1 .036828663
2 .025703992
3 .026992606
4 .033444640
5 .035266864
6 .033452564
7 .028677243
8 .036187726
9 .035308338
10 .033860607
11 .030994306
12 .031643060
13 .030666493
14 .033131695
15 .037534009
16 .034849018
17 .036111420
18 .042433952
19 .044907994
20 .052853506
21 .068992452
22 .086515691
23 .125384399
24 .180959996
25 .279442730
26 .412510010
27 .648189657
28 1.019483322
29 1.626384710
30 2.644171263
31 4.257360111
32 6.938595991

Mon souci va être d'utiliser les 3 fichiers en même temps dans gnuplot... plutôt que de passer par 3 commandes en entrée (je vais vous montrer comment on fait dans gnuplot) je vais utiliser une commande que j'adore: paste

Cette commande est magique, elle "colle" en colonnes les fichiers les uns à coté des autres, voici ce que ça donne chez moi:

$ paste *.log
1 .065706975    1 .036828663    1 .051057606
2 .075880231    2 .025703992    2 .046552158
3 .073986169    3 .026992606    3 .046123806
4 .073072239    4 .033444640    4 .042877291
5 .070891448    5 .035266864    5 .045012469
6 .074523262    6 .033452564    6 .047550418
7 .072727132    7 .028677243    7 .042658307
8 .075226716    8 .036187726    8 .045704715
9 .069166717    9 .035308338    9 .046088504
10 .071344391   10 .033860607   10 .043567632
11 .072756556   11 .030994306   11 .043765426
12 .073284181   12 .031643060   12 .043340776
13 .072755513   13 .030666493   13 .045153174
14 .068839918   14 .033131695   14 .047908738
15 .079993544   15 .037534009   15 .050165910
16 .072923693   16 .034849018   16 .048907127
17 .074823342   17 .036111420   17 .047513241
18 .073899009   18 .042433952   18 .053685052
19 .069858333   19 .044907994   19 .048828831
20 .071467252   20 .052853506   20 .050347929
21 .073423093   21 .068992452   21 .049505150
22 .074624496   22 .086515691   22 .060360949
23 .071165563   23 .125384399   23 .068465359
24 .076328627   24 .180959996   24 .079916752
25 .076409643   25 .279442730   25 .100771059
26 .079967605   26 .412510010   26 .136666736
27 .076491429   27 .648189657   27 .198588958
28 .085810737   28 1.019483322  28 .293586222
29 .095436353   29 1.626384710  29 .434787310
30 .104759161   30 2.644171263  30 .675019713
31 .125979134   31 4.257360111  31 1.074293193
32 .155473948   32 6.938595991  32 1.705526686

S'en est presque poétique... non ? Vous avez remarqué qu'on a besoin ici des colonnes 1, 2, 4 et 6 pour avoir la valeur de 'n' et le temps d'exécution pour chaque langage. Notez aussi que les colonnes représentent les fichier dans l'ordre alphabétique du nom du fichier de log, ainsi de gauche à droite on a "node", puis "php" et enfin "python"...

Bon on passe à gnuplot, on lance la commande gnuplot et on tape ceci:

gnuplot> set title "Benchmark Fibonnacci"
gnuplot> set xlabel "n value"
gnuplot> set ylabel "time in seconds"
gnuplot> set grid
gnuplot> plot "< paste *.log" using 1:2 with line title "node", "< paste *.log" using 1:4 with line title "php",  "< paste *.log" using 1:6 with line title "python"

Je sais que j'aurais put utiliser les fichier les uns après les autres mais la commande "paste" me permet des copier/coller rapides de mes commandes sans avoir à changer le nom du fichier à chaque fois... et puis je voulais vous parler de cette commande d'abord hein !

Bref, le résultat est de cette forme: Fibonnacci benchmark gnuplot

Vous l'aurez donc compris, en maitrisant un peu le bash on peut effectuer des opérations assez poitilleuses sans pour autant à avoir à gérer un projet complet de scipts... le tout est de s'entrainer, et tout devient instinctif.

Je le répète, j'ai fait ces opérations sans me poser de questions, et comme je me suis rendu compte que ça pourrait intéresser certains... je me suis dit qu'il serait bon de montrer un peu comment je procède.

Et bien voilà, explication terminée. En espérant que ça vous ait donné envie de taper des lignes de commandes plutôt que de passer par un tableur... ;)

PS: désolé pour les fautes d’orthographe mais j'ai du mal à les trouver ce soir... je corrigerai demain...

mardi, juillet 12 2011

Parlons Gnash

Me revoilà après quelques temps de latence obligatoires et j'ai enfin put prendre le temps de passer à Fedora 15. Non sans mal, étant donné ma configuration de machine (donc cela ne tenait qu'à moi) mais cela m'a donné une occasion de me débarrasser d'un "truc" gênant sur mon poste depuis des lustres: Flash-Plugin. Et pour être plus clair, mon passage un peu forcé (mais pas trop) à Gnash.

Bon pour vous résumer, j'ai un petit souci depuis mon redémarrage, et encore une fois, cela n'est valable que pour moi, le plugin flash a dut mal à s'installer... Et mise à part Youtube, je me disais "en fait, à quoi bon me prendre la tête..." et puis malheureusement je me suis vu devant une page Youtube, bloqué devant une vidéo qui ne voulait pas apparaitre, tout bonnement parce que la version HTML5 de Youtube a un souci... Rage profonde, je commençais à me dire "va encore falloir que j'en bave avec ce foutu plugin qui fait ramer mon poste"... et bien non !

Je me suis souvenu du projet Gnash qui est un lecteur de contenu flash et qui en plus de cela nous propose un plugin tout propre et tout bien qu'il est. Oui, Gnash est libre, sous licence GPL et s'installe depuis les paquets. Plus de souci avec les version 64bits, plus de prise de tête à se demander pourquoi chromium le voit pas... l'installation a pris 3 secondes via le bon vieux:

su -c "yum install gnash-plugin"

Arrivé devant la page Youtube, en désactivant avant tout le mode "HTML5" (et à mon grand regret, je vous assure) me revoilà devant une vidéo qui passe sans souci !

Alors, je commence à me dire "attends mais ça à l'air en plus un peu plus soft pour mon CPU" et effectivement, mon processeur me remercie de ne pas dépasser les 15% de charge. La vie est belle... mais à ce point ?

Et bien écoutez (oui lisez....) j'ai donc joué à tourner un peu sur quelque sites, la plupart du temps je me suis retrouvé devant une animation de pub (et ba ouais certain sites ont besoin de pub pouv vivre...) mais je n'ai encore pas vu de site qui perdait tout son sens avec Gnash.

Evidemment que gnash-plugin n'est pas l'égal de flash-plugin, et je suis persuadé que pas mal de site vont me hurler dessus... mais moi qui ne suit pas un mordu de ses animations qui servent à rien, ou qui pourraient fonctionner parfaitement en HTML5/CSS3... et bien gnash-plugin est une très bonne alternative. D'autant plus que je me libère du dernier système proprio de ma machine étant donné que le pilote propriétaire de ATI (AMD...) a juste trop de mal avec gnome 3 alors que le pilote Radeon (libre) fonctionne sans aucun souci...

Me voilà donc enfin avec un poste sans paquet utilisant du code propriétaire...

Pour information, voici les derniers passages de logiciels "propriétaire ou presque" dont je me suis débarrassé:

  • Google Chrome, je suis passé à Chromium qui est exactement le même produit, les informations envoyées à Google en moins
  • FGLRX (kmod-catalyst), je suis sous pilote Radeon
  • Flash-plugin, j'utilise sans aucun souci Gnash-plugin

Voilà, le libre avance on dirait, doucement, mais il avance bien !

vendredi, mars 11 2011

Carte télé sous Fedora

J'ai testé de faire marcher la télé avec une carte CINERGY T Stick HD sur mon poste, et alors que tout me paraissait assez clair... impossible de voir une image. La solution est simple: tout est dut au format vidéo utilisé pour la TNT, en l’occurrence le MPEG2. Voici un moyen simple de faire marcher votre carte et voir les chaines tourner.

Lire la suite...

dimanche, mars 6 2011

Catpure vidéo écran screencast sous Fedora avec ffmpeg

La capture vidéo d'écran est un sujet maintes fois soulevé sous Linux et il existe de jolis services fais pour ça. Mais quand ça ne marche pas on a du mal à trouver des solutions simples... Istanbul, gtk-recordMyDesktop, je les ai essayé... mais à chaque fois un souci apparait, soit avec le son, soit avec la vidéo. Alors pourquoi ne pas passer par la ligne de commande ? ffmpeg est juste parfait ! alors on se lance. Encore une fois, si je trouve pas ce qui me plait, je le code :) donc vous aurez un script en bas de billet qui fait tout ça.

Lire la suite...

jeudi, mars 3 2011

Bleachbit et votre PC souffle un peu

On télécharge, on joue avec des compilations de programme, on se teste au package, on ferme brutalement des éditeurs de texte, on utilise firefox et google-chrome... et puis un jour on se rend compte que son PC est un peu lent, que le disque "craque" et que l'espace disque commence à manquer. Je vais vous présenter l'outil magique qui va vous soulager la douleur.

Lire la suite...

dimanche, février 20 2011

Cython pour optimiser Python

Cython permet de coder des extensions python compilées via un mécanisme de traduction en C. Mais il permet aussi de créer un exécutable de votre programme python. Les performances sont spectaculaires et nous allons le voir dans ce billet

Lire la suite...

page 2 de 2 -