Entries Tagged as ''

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)