You lost the game.

Ce blog est effectivement laissé à l’abandon. J’ai mis en place une page html statique sur awesom afin de pouvoir continuer à y mettre des trucs intéressants. Si vous chercher un blog un poil actif, allez voir le blog d’heaumer

Lenovo IdeaPad S10e

J’ai eu la chance de gagner le concours robocode organisé par l’Institut Paul Lambin. Pour les intéressés, le robot est disponible ici. Le prix de ce concours était un Lenovo IdeaPad S10e.

Bien évidemment, c’est Windows xp qu’on retrouve installé par défaut sur ce netbook. Empressons nous alors d’installer autre chose dessus, à savoir ArchLinux.

Pour l’installation, il faut évidemment passer par une clé USB. On télécharge donc la version USB sur un des miroirs listés sur la page de téléchargement. Nous allons prendre le fichier latest/archlinux-2009.02-2-ftp-i686.img, mais les autres .img fonctionnent aussi bien.

Pour graver sur la clé USB,  on fait comme décrit ici, et on redémarre sur la clé, en prenant soin de se connecter à un réseau cablé, le wifi ne marchant pas directement. On laisse l’écran du machin-chose-fastboot s’éxécuter, et on se retrouve dans l’installation d’Arch. L’installation se fait comme n’importe quelle installation. Une fois l’installation terminée, on redémarre sur l’arch fraîchement installée.

Voici ce que nous donne un lspci

00:00.0 Host bridge: Intel Corporation Mobile 945GME Express Memory Controller Hub (rev 03)
00:02.0 VGA compatible controller: Intel Corporation Mobile 945GME Express Integrated Graphics Controller (rev 03)
00:02.1 Display controller: Intel Corporation Mobile 945GM/GMS/GME, 943/940GML Express Integrated Graphics Controller (rev 03)
00:1b.0 Audio device: Intel Corporation 82801G (ICH7 Family) High Definition Audio Controller (rev 02)
00:1c.0 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 1 (rev 02)
00:1c.1 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 2 (rev 02)
00:1c.2 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 3 (rev 02)
00:1d.0 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #1 (rev 02)
00:1d.1 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #2 (rev 02)
00:1d.2 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #3 (rev 02)
00:1d.3 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #4 (rev 02)
00:1d.7 USB Controller: Intel Corporation 82801G (ICH7 Family) USB2 EHCI Controller (rev 02)
00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev e2)
00:1f.0 ISA bridge: Intel Corporation 82801GBM (ICH7-M) LPC Interface Bridge (rev 02)
00:1f.1 IDE interface: Intel Corporation 82801G (ICH7 Family) IDE Controller (rev 02)
00:1f.2 IDE interface: Intel Corporation 82801GBM/GHM (ICH7 Family) SATA IDE Controller (rev 02)
00:1f.3 SMBus: Intel Corporation 82801G (ICH7 Family) SMBus Controller (rev 02)
02:00.0 Ethernet controller: Broadcom Corporation NetLink BCM5906M Fast Ethernet PCI Express (rev 02)
05:00.0 Network controller: Broadcom Corporation BCM4312 802.11b/g (rev 01)

On créé un utilisateur, on configure les dépôts francophones, on installe yaourt, le groupe de paquet base-devel

Procédons maintenant à l’installation des pilotes wifi sur cette crasse de Broadcom BCM4312. Il faut installer le paquet broadcom-wl depuis aur, qui contient les pilotes propriétaires. On suit ensuite ces étapes pour le charger.

Pour l’installation d’X, il faut prendre le soin de bien configurer hal pour le clavier et le touchpad. Cette étape est détaillée ici. Au niveau des pilotes de la carte graphique, on installe le paquet xf86-video-intel, et on active le KMS en ajoutant options i915 modeset=1 dans le /etc/modprobe.conf, intel_agp i915 dans la section MODULES du /etc/mkinitcpio.conf, et/etc/modprobe.conf dans la section FILES du même fichier. Ensuite, on recrée l’initramfs via la commande mkinitcpio -p kernel26. Soit dit en passant, on n’a pas besoin de /etc/X11/xorg.conf :)

Pour ce qui est du son, la prise casque ne fonctionne pas parfaitement avec OSS (le son ne se coupe pas dans les hauts-parleurs intégrés). Pour utiliser ALSA, il faut rajouter la ligne options snd-hda-intel enable=1 index=0 model=fujitsu dans le fichier /etc/modprobe.d/sound pour que cela fonctionne correctement (avec le modèle fujitsu, le micro fonctionne presque, mais pas encore (juste un grésillement), on pout aussi utiliser le modèle laptop ou d’autres qui fonctionnent aussi). On peut aussi blacklister snd-pcspkr afin de désactiver le beep de la carte mère.

Pour la mise en veille, nous utilisons uswsusp (voir http://wiki.archlinux.org/index.php/Suspend_to_Disk#Uswsusp_method), et le s2disk ainsi que le s2ram fonctionnent tous les deux parfaitement.

Au niveau de la webcam, elle fonctionne directement.

Au niveau du temps de boot, voici le bootchart :

bootchart

Cela irait bien plus rapidement avec un kernel adapté (avec les modules compilés, et pas d’initramfs), et sans wicd (si quelqu’un à un autre gestionnaire de réseau potable adapté à un ordinateur portable, je suis preneur). Il faut quand même noter qu’on peut se logger bien avant les 25s, environ à 15s.

Et voilà comment rendre un netbook utilisable. Il faudra noter que nous n’avons pas réussi à faire fonctionner le micro malgré tout.

Pour info, voilà mon /etc/rc.conf :

LOCALE="fr_BE.UTF8"
HARDWARECLOCK="UTC"
USEDIRECTISA="no"
TIMEZONE="Europe/Brussels"
KEYMAP="fr-dvorak-bepo"
CONSOLEFONT=
CONSOLEMAP=
USECOLOR="yes"
MOD_AUTOLOAD="yes"
MODULES=(!b43 !ipv6 !pcspkr !snd-pcsp lib80211_crypt_tkip wl)
USELVM="no"
HOSTNAME="nel"
gateway="default gw 192.168.0.1"
ROUTES=(!gateway)
DAEMONS=(syslog-ng !network !netfs dbus @wicd !crond hal !sshd @alsa !oss @mpd)

Xorg 1.6 et Ctrl-Alt-Backspace

Une fonction bien pratique dans X est la possibilitée de le killer via un simple raccourci (Ctrl-Alt-Backspace).

Hélas, depuis la version 1.6 (disponible dans les dépôts testing d’archlinux), cette fonction est désactivée, apparement après certaines plaintes (Ce raccourci est aussi un raccourci dans emacs, ou bien des gens qui tapent ce raccourci par erreur)

Après un minimum de recherche (3 secondes à tout casser), on trouve qu’il suffit simplement de désactiver l’option DontZap dans la section ServerFlags du fichier /etc/X11/xorg.conf :

Section "ServerFlags"
  Option "DontZap" "False"
EndSection

Et voilà, il suffit de redémarrer X (en cherchant la fonction pour quitter son WM)

Calculer le temps mis pour une expression en python

Dans le langage clojure est présente une fonction bien pratique : time. Elle est similaire au time de bash.
Cette fonction bien pratique n’est pas présente dans la plupart des langages, alors qu’elle peut être fort utile.

user=> (time (* 6 7))
"Elapsed time: 0.07012 msecs"
42

Nous allons donc écrire une telle fonction pour python.

Il est évident que nous avons besoin d’importer le module time.
La manière de calculer le temps est plus que simple :

  • On récupère le temps avant l’évaluation du code
  • On évalue le code
  • On récupère le temps après l’évaluation
    Le temps pris par le code sera la différence entre le premier
    temps

La difficulté réside dans la façon d’appeler la fonction à évaluer. En effet, alors que les langages dérivés du lisp (dont
clojure fait partie) possèdent un système de macro puissant, python n’a pas de telle fonctionnalité. Nous ne pouvons donc pas appeler notre fonction time comme tel :

time(f(foo, bar))

Alors qu’en scheme par exemple, grâce aux macros on peut (code compatible avec guile uniquement, à cause de l’utilisation de la fonction current-time):

"Elapsed time : "" s"

Heureusement, python nous permet d’utiliser des fonctions à paramètre multiples, ainsi que d’appeler une fonction avec ses paramètres donnés dans une liste, ce qui nous permet de définir une fonction time utilisable.

def f(*args):
  return args

et

>>> apply(lambda x,y: x * y, [10, 5])
50

Nous pouvons alors définir notre fonction time, en faisant bien attention à ne pas importer le module time tel quel, sinon en appelant time.time(), python pensera qu’on souhaite appeler notre fonction time et retournera une erreur.

import time as t
 
def time(f, *args):
  start = t.time()
  apply(f, list(args))
  return t.time() - start

Et nous utiliserons notre fonction time comme suit :

>>> time(t.sleep, 10)
10.037008047103882
>>> time(lambda x, y: x * y, 6, 7)
2.002716064453125e-05

Le nombre retourné est le nombre de secondes qu’à duré l’exécution de l’appel de la fonction.

Nous pouvons aussi plus suivre ce que fait la fonction time de clojure via une définition comme cela :

def time(f, *args):
  start = t.time()
  res = apply(f, list(args))
  print "Elapsed time: ", (t.time() - start)*1000, " msecs"
  return res

Et le résultat :

>>> time(lambda x, y: x * y, 6, 7)
Elapsed time0.0240802764893  msecs
42
>>> time(t.sleep, 2)
Elapsed time2010.07699966  msecs

Sinon, il existe aussi le module timeit qui nous permet aussi de faire cela (mais de manière assez moche je trouve)

Monter une image nero

Petite astuce pour monter une image CDROM faite avec Nero (*.nrg).
Tout d’abord, on peut soit la convertir en ISO, puis monter l’ISO comme on le fait habituellement, soit directement la monter en passant les parties inutiles du fichier.

Pour convertir le .nrg en .iso, on peut soit le faire via l’utilitaire nrg2iso, soit simplement avec dd, étant donné que le format .nrg est le même que le .iso après les 300Ko d’entête (on ne copie donc pas cet entête)

# Convertit :
dd bs=1k if=image-nero.nrg of=image-iso.iso skip=300
# Ou :
nrg2iso image-nero.nrg image-iso.iso
# Monte
sudo mount -o loop image-iso.iso /mnt/iso

La seconde méthode, on monte à partir des 300Ko de l’image (307200 octets donc) :

sudo mount -o loop,offset=307200 image-nero.nrg /mnt/iso

Voilà, en espèrant que ça peut être utile à certains :)

Meilleure gestion des groupes avec StumpWM

StumpWM est un gestionnaire de fenêtres en mosaïque, comme awesome, écrit entièrement en Common Lisp. Pour plus d’informations, je vous recommande d’aller voir sa documentation.

Un des seuls points négatifs que j’y ait trouvé, est la gestion des groupes (l’équivalent des bureaux virtuels). Si vous voulez mettre une fenêtre dans un autre groupe, il faut d’abord créer le groupe (C-t g c), nommer le groupe, ensuite déplacer la fenêtre vers le groupe (C-t g m suivis du nom du groupe). Le fait que StumpWM soit écrit entièrement en Common Lisp nous permet d’implémenter un peu toutes les fonctionnalitées que l’on veut. J’ai donc développé une gestion des groupes similaires à wmii ou awesome.

Il faut donc modifier le .stumpwmrc situé dans le home. Tout d’abord, on va créer 5 groupes, nommés de 0 à 4, puis supprimer le groupe créée automatiquement au démarrage (“Default”). On se déplace ensuite sur le premier groupe (groupe 0), et finalement on bind des raccourcis pour changer de groupe, et pour déplacer une fenêtre d’un groupe à l’autre. Les raccourcis seront C-t [1,2,3,4,5] Pour changer de groupe, et C-t C-[1,2,3,4,5] pour déplacer une fenêtre.

Voilà le code :

;; Modification des groupes : 5 groupes crées par défaut (nommés 0, 1, 2, 3, 4)
; On crée les 5 groupes si ils n'existent pas déjà (appel de loadrc par ex.)
(loop for n in '("0" "1" "2" "3" "4") do
      (if (not (find-group (current-screen) n))
	  (add-group (current-screen) n)))
; On supprime le groupe Default s'il existe (groupe au démarrage)
(let ((default-group (find-group (current-screen) "Default")))
  (if default-group
      (kill-group default-group (find-group (current-screen) "0"))))
 
; On se place bien sur le groupe 0
(switch-to-group (find-group (current-screen) "0"))
 
;; Meilleurs raccourcis pour la gestion des groupes
; C-t 1, C-t 2, ... -> va au groupe 0, 1, ...
; C-t C-1, ... -> bouge la fenêtre dans le groupe 0, ...
; Les touches &, é, ", ', ( sont les caractères présents
; sur les touches 1, 2, 3, 4, 5 sur un clavier belge,
; à adapter selon le clavier
(let ((keys '("&" "eacute" "\"" "'" "(")))
  (loop for key in keys ; Les touches 1, 2, ...
	do
	(progn
	  (define-key *root-map* (kbd key)
	    (concatenate 'string
			 "gselect "
			 (write-to-string (position key keys))))
	  (define-key *root-map*
	    (kbd (concatenate 'string "C-" key))
	    (concatenate 'string
			 "gmove "
			 (write-to-string (position key keys))))
	)))

Et en « bonus », une autre feature à la wmii : pour se déplacer entre les fenêtres, on bind C-t [h,j,k,l], et pour déplacer les fenêtres, C-t C-[h,j,k,l] :

;; Utilisation de C-t h,j,k,l pour se déplacer dans les fenêtres
;; Si controle pressé, ça déplace la fenêtre dans cette direction
;; Si controle pressé, ça déplace la fenêtre dans cette direction
(let ((directions '(("h" "left")
		    ("l" "right")
		    ("k" "up")
		    ("j" "down"))))
  (dolist (dir directions)
     (define-key *root-map* (kbd (car dir))
      (concatenate 'string "move-focus " (cadr dir)))
    (define-key *root-map* (kbd (concatenate 'string "C-" (car dir)))
      (concatenate 'string "move-window " (cadr dir)))
    ))

Sur ce, bon amusement avec StumpWM :)

Éxécuter un script lisp avec SBCL en bash

Voilà une petite astuce pour lancer un fichier lisp (ou un .fasl) avec SBCL à partir d’un prompt bash :

sbcl --noinform --load fichier.lisp --eval '(quit)'

C’est vraiment très simple, on peut aussi faire ça ainsi

sbcl --noinform --eval '(load "fichier.lisp")' --eval '(quit)'

Vous l’aurez compris, les –eval sont évalués dans l’ordre dans lequel ils sont passé en argument.
Avec ça, on peut aussi définir une commande pour compiler un fichier :

sbcl --noinform --eval '(compile-file "fichier.lisp")' --eval '(quit)'

Et donc, pour lancer le fichier compilé (un .fasl) :

sbcl --noinform --load fichier.fasl --eval '(quit)'

Évidemment, si on ne spécifie pas le (quit), une fois l’éxécution du fichier terminée, on se retrouve dans la boucle REPL de sbcl.

Gravure en console avec wodim (cdrecord)

Voici quelques astuces pour graver facilement des CD/DVD en console, avec wodim (anciennement cdrecord, appartenant au paquet cdrkit sur la plupart des distribs)

[Read more →]

awesome 3 et les tilings wm

Cela fait quelques jours que je suis en train de tester awesome, un tiling wm, qui est sortit dans sa version 3 il y a quelques temps.

À première vue, ça fait beaucoup penser à wmii (ils sont tous deux dérivés de dwm, normal donc), et en regardant d’un peu plus près le fichier de configuration en Lua, la configuration à l’air assez puissante, y a moyen de faire des trucs bien sympatique avec ça.

Sinon à part ça, on peut ressortir le fait qu’il soit dynamique, et place lui même les fenêtres, vous pouvez juste intervertir les fenêtres et choisir une autre disposition de fenêtre (et il y a un concept très intéréssant de « Fenêtres maîtres » qui permet d’avoir certaines fenêtres privilégiées dans l’affichage).

Niveau rapidité, on a pu lire qu’il serait plus rapide car il utilise xcb et non plus xlib, mais le changement est très peu voyant (voir invisible, je ne le trouve pas spécialement plus rapide que wmii).

Pour ma part, je continuerait donc à utiliser stumpwm, qui à certains avantages que je n’ai retrouvé chez aucun autre wm (possibilitée de modifier absolument tout via Common Lisp, une fonction ultra pratique “run-or-raise” qui permet de mettre au premier plan emacs ou le navigateur par exemple), mais je garde une bonne estime de awesome, qui m’a agréablement surpris surtout au niveau de la configuration.

À conseiller donc.

Oxyradio, la radio jeune et libre

Oxyradio

Hier, via la dépêche sur linuxfr, j’ai découvert Oxyradio, une webradio ne diffusant que de la musique sous licences libres ou Creative Commons (parfois non libres, il pourrait y avoir des ND parait-il, mais ceux qui s’occupent du projet comptent mettre un peu plus les licences en avant apparement )

Pour ce qui est des émissions, il n’y a que deux émissions pour le moment, OxyLibre le samedi de 16 à 18h, et Les enfants du web le dimanche entre 21 et 22h, évidemment, les sujets de ces émissions tournent autour de la culture libre et des logiciels libres.

La musique qui y passe est plutôt orientée Pop/Rock, et via le site on peut même “coter” les musique, avec un Top :)

Pour l’écouter, vous avez plusieurs méthodes, pour ma part, je l’écoute avec mpd, il suffit de faire :

mpc add http://www.oxyradio.net:8000/live.ogg

(Si vous voulez savoir le nom du titre joué, il faudrait passer par le mp3)
Bonne et libre écoute :)