Je me suis acheté un ordinateur portable...

J'explique comment j'ai installé Linux, comment je l'ai configuré, comment j'ai résolu (ou pas) les problèmes que j'ai rencontrés, quels logiciels j'utilise ou envisage d'utiliser.

Ces notes couvrent une période d'un mois (mais rassurez-vous : pendant un mois, je n'ai pas passé mon temps uniquement à configurer l'ordinateur, je l'ai avant tout utilisé).

Première installation de Linux (Mandrake 8.0)

Se débarasser de Windows

Je branche la machine, je l'allume. J'appuie sur F2 quand la publicité pour Dell apparait. Je me retrouve dans le BIOS. Je préciser l'ordre dans lequel je veut que l'ordinateur cherche des disques sur lesquels il pourra booter : d'abord le CD (avec une vieille distribution de Linux).

Je reboote. Ca ne marche pas, le CD est illisible (et il fait à peu près le même bruit qu'un mixeur de cuisine). Je me retrouve presque sous Windows : comme c'est la première utilisation de Windows, on me demande si j'accepte le logiciel et sa licence. On me laisse même lire cette licence (plus précisément le CLUF) ! Bien évidemment je refuse. La machine me dit que ce n'est pas la bonne réponse, que je dois accepter, que je dois me soumettre à Microsoft (mais je suis tétu : je ne veux pas). Avant de rebooter, je retire le CD, l'observe (il y a effectivement de nombreuses traces, mais je ne sais pas si elles viennent de ce qui vient de se passer ou si elles étaient déjà là. J'essuie la surface du CD et je le replace dans le lecteur.

Je reboote la machine (CTRL-ALT-SUPPR). Elle refuse de rebooter et me présente un écran noir (le voyant indiquant que la machine est sous tension est toujours allumé). J'essaye d'éteindre la machine, ça ne marche pas. Jessaye d'appuyer sur toutes les touches, ou sur certaines combinaisons de touches -- sans effet. Je débranche la machine -- la batterie prend le relai... Je cherche où se trouve la batterie -- je ne trouve pas. Je regarde alors dans la documentation : ils ne disent pas où se trouve la batterie -- par contre, je sais maintenant comment enlever le disque dur... Je continue à tourner la machine dans tous les sens, et après une dizaine de minutes, je finis par trouver : la batterie se trouve juste à côté du lecteur de disquettes (qui me semble un anachronisme sur ce genre de machine), mais pour la retirer, il faut d'abord enlever la sécurité qui se trouve en dessous de la machine.

Installation de Mandrake 8.0

C'est une vieille version (un peu plus d'un an), mais c'est ce que j'ai trouvé de plus récent et je n'ai pas payé les CDs. Néanmoins, les choses marchent à peu près comme il faut. Il suffit de suivre les instructions.

Comme je veux effacer Windows et comme j'aimerais bien pouvoir utiliser plusieurs systèmes d'exploitation sur cette machine (par exemple, Debian GNU/Linux et des choses plus exotiques, comme freebsd ou Hurd), je fais attention au partitionnement du disque : deux partitions Linux (4 et 5 Go) pour des systèmes d'exploitation différents, une partition de Swap (1 Go) et une partition Linux /home (le reste, une vingtaine de Go).

Première utilisation

Pas de problème. Toutefois, certains éléments ne sont pas reconnus (cela vient du fait que la distribution a plus d'un an).

En particulier, la carte vidéo n'est pas reconnue. Cela a une conséquence assez facheuse : la seule résolution utilisable est le 800x600, alors que l'écran fait 1400x1050. Je peux donc choisir entre une image qui fait effectivement cette taille, mais qui n'occupe qu'une partie de l'écran (ça doit faire 8 pouces de diagonale au lieu de 15), ou une image zoomée qui occupe tout l'écran (pour cela, taper Fn-F5, la touche Fn est une touche que l'on trouve sur les portables à côté de la touche ALT pour compenser la petitesse du clavier), mais qui n'est pas nette.

A titre purement indicatif, voici ce que donne la commande dmesg (ie, la liste des messages affichés lorsque la machine boote).

Linux version 2.4.3-20mdk (chmou@no.mandrakesoft.com) 
  (gcc version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release / Linux-Mandrake 8.0)) #1 
  Sun Apr 15 23:03:10 CEST 2001
BIOS-provided physical RAM map:
 BIOS-e820: 0000000000000000 - 000000000009fc00 (usable)
 BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved)
 BIOS-e820: 0000000000100000 - 000000000ffe2800 (usable)
 BIOS-e820: 000000000ffe2800 - 0000000010000000 (reserved)
 BIOS-e820: 00000000feda0000 - 00000000fee00000 (reserved)
 BIOS-e820: 00000000ffb80000 - 0000000100000000 (reserved)
On node 0 totalpages: 65506
zone(0): 4096 pages.
zone(1): 61410 pages.
zone(2): 0 pages.
hm, page 01000000 reserved twice.
Kernel command line: auto BOOT_IMAGE=linux ro root=305 hdb=ide-scsi quiet
ide_setup: hdb=ide-scsi
Initializing CPU#0
Detected 1595.326 MHz processor.
Console: colour dummy device 80x25
Calibrating delay loop... 3185.04 BogoMIPS
Memory: 254928k/262024k available (976k kernel code, 6708k reserved, 287k data, 696k init, 0k highmem)
Dentry-cache hash table entries: 32768 (order: 6, 262144 bytes)
Buffer-cache hash table entries: 16384 (order: 4, 65536 bytes)
Page-cache hash table entries: 65536 (order: 6, 262144 bytes)
Inode-cache hash table entries: 16384 (order: 5, 131072 bytes)
VFS: Diskquotas version dquot_6.5.0 initialized
CPU: Before vendor init, caps: 3febf9ff 00000000 00000000, vendor = 0
CPU: L1 I cache: 12K, L1 D cache: 8K
CPU: L2 cache: 512K
Intel machine check architecture supported.
Intel machine check reporting enabled on CPU#0.
CPU: After vendor init, caps: 3febf9ff 00000000 00000000 00000000
CPU: After generic, caps: 3febf9ff 00000000 00000000 00000000
CPU: Common caps: 3febf9ff 00000000 00000000 00000000
CPU: Intel(R) Pentium(R) 4 Mobile CPU 1.60GHz stepping 04
Enabling fast FPU save and restore... done.
Enabling unmasked SIMD FPU exception support... done.
Checking 'hlt' instruction... OK.
POSIX conformance testing by UNIFIX
mtrr: v1.40 (20010327) Richard Gooch (rgooch@atnf.csiro.au)
mtrr: detected mtrr type: Intel
PCI: PCI BIOS revision 2.10 entry at 0xfbfee, last bus=2
PCI: Using configuration type 1
PCI: Probing PCI hardware
Unknown bridge resource 2: assuming transparent
PCI: Discovered primary peer bus 08 [IRQ]
PCI: Using IRQ router PIIX [8086/248c] at 00:1f.0
PCI: Found IRQ 11 for device 00:1f.1
PCI: The same IRQ used for device 00:1d.2
PCI: The same IRQ used for device 02:00.0
  got res[10000000:100003ff] for resource 5 of PCI device 8086:248a (Intel Corporation)
  got res[f4000000:f4000fff] for resource 0 of Texas Instruments PCI4451 PC card Cardbus Controller
  got res[f4001000:f4001fff] for resource 0 of Texas Instruments PCI4451 PC card Cardbus Controller (#2)
isapnp: Scanning for PnP cards...
isapnp: No Plug & Play device found
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
apm: BIOS version 1.2 Flags 0x03 (Driver version 1.14)
Starting kswapd v1.8
vesafb: framebuffer at 0xe0000000, mapped to 0xd0800000, size 65536k
vesafb: mode is 800x600x16, linelength=1600, pages=2
vesafb: protected mode interface info at c000:e140
vesafb: scrolling: redraw
vesafb: directcolor: size=0:5:6:5, shift=0:11:5:0
Console: switching to colour frame buffer device 100x37
fb0: VESA VGA frame buffer device
pty: 256 Unix98 ptys configured
block: queued sectors max/low 169314kB/56438kB, 512 slots per queue
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
Uniform Multi-Platform E-IDE driver Revision: 6.31
ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx
PCI_IDE: unknown IDE controller on PCI bus 00 device f9, VID=8086, DID=248a
PCI: Enabling device 00:1f.1 (0005 -> 0007)
PCI: Found IRQ 11 for device 00:1f.1
PCI: The same IRQ used for device 00:1d.2
PCI: The same IRQ used for device 02:00.0
PCI_IDE: chipset revision 2
PCI_IDE: not 100% native mode: will probe irqs later
    ide0: BM-DMA at 0xbfa0-0xbfa7, BIOS settings: hda:DMA, hdb:DMA
    ide1: BM-DMA at 0xbfa8-0xbfaf, BIOS settings: hdc:pio, hdd:pio
hda: HITACHI_DK23DA-30, ATA DISK drive
hdb: Samsung CD-RW/DVD-ROM SN-308B, ATAPI CD/DVD-ROM drive
ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
hda: 58605120 sectors (30006 MB) w/2048KiB Cache, CHS=3648/255/63
Partition check:
 hda: hda1 < hda5 hda6 hda7 hda8 >
RAMDISK: Compressed image found at block 0
Uncompressing....done.
Freeing initrd memory: 71k freed
Serial driver version 5.05 (2000-12-13) with HUB-6 MANY_PORTS MULTIPORT SHARE_IRQ SERIAL_PCI ISAPNP enabled
ttyS00 at 0x03f8 (irq = 4) is a 16550A
md driver 0.90.0 MAX_MD_DEVS=256, MD_SB_DISKS=27
md.c: sizeof(mdp_super_t) = 4096
autodetecting RAID arrays
autorun ...
... autorun DONE.
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP, IGMP
IP: routing cache hash table of 2048 buckets, 16Kbytes
TCP: Hash tables configured (established 16384 bind 16384)
Linux IP multicast router 0.06 plus PIM-SM
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
VFS: Mounted root (ext2 filesystem).
SCSI subsystem driver Revision: 1.00
VFS: Mounted root (ext2 filesystem) readonly.
change_root: old root has d_count=3
Trying to unmount old root ... okay
Freeing unused kernel memory: 696k freed
Adding Swap: 1020088k swap-space (priority -1)
scsi0 : SCSI host adapter emulation for IDE ATAPI devices
  Vendor: SAMSUNG   Model: CDRW/DVD SN-308B  Rev: U005
  Type:   CD-ROM                             ANSI SCSI revision: 02
Linux PCMCIA Card Services 3.1.25
  kernel build: 2.4.3-20mdk #1 Sun Apr 15 23:03:10 CEST 2001
  options:  [pci] [cardbus] [apm]
Intel PCIC probe: PCI: Found IRQ 11 for device 02:01.0
PCI: The same IRQ used for device 02:01.1
PCI: The same IRQ used for device 02:01.2
PCI: Found IRQ 11 for device 02:01.1
PCI: The same IRQ used for device 02:01.0
PCI: The same IRQ used for device 02:01.2
  
  TI 4451 rev 00 PCI-to-CardBus at slot 02:01, mem 0xf4000000
    host opts [0]: [ring] [pci + serial irq] [pci irq 11] [lat 32/32] [bus 3/6]
    host opts [1]: [ring] [pci + serial irq] [pci irq 11] [lat 32/32] [bus 7/10]
    ISA irqs (scanned) = 3,4,5,7,9,10,15 PCI status changes
PCI: Found IRQ 11 for device 02:00.0
PCI: The same IRQ used for device 00:1d.2
PCI: The same IRQ used for device 00:1f.1
3c59x.c:LK1.1.13 27 Jan 2001  Donald Becker and others. http://www.scyld.com/network/vortex.html
See Documentation/networking/vortex.txt
eth0: 3Com PCI 3c905C Tornado at 0xec80,  00:08:74:03:fe:ac, IRQ 11
  product code 0000 rev 00.6 date 01-09-02
  8K byte-wide RAM 5:3 Rx:Tx split, autoselect/Autonegotiate interface.
  MII transceiver found at address 24, status 7809.
  Enabling bus-master transmits and whole-frame receives.
eth0: scatter/gather enabled. h/w checksums enabled
eth0: using NWAY device table, not 8

On constate que la carte réseau est reconnue (si je veux pouvoir réinstaller le système à partir du réseau, c'est préférable).

Pour avoir d'autres informations sur les différents composants de l'ordinateur, on peut regarder dans le BIOS.

Modification de la configuration

Lancer DrakConf. En particulier, dans Sécurité -> Niveau de sécurité, ne pas choisir le niveau de sécurité de plus élevé, car les répertoires du genre /usr ou /etc ne sont plus accessibles en lecture, ce qui est très génant : d'une part l'utilisateur curieux que je suis sera obligé de devenir root quand il voudra mettre son nez un peu partout, d'autre part, l'utilisateur normal n'aura pas le droit de demander aux logiciels éminemment graphiques dont il est dépendant d'aller regarder dans /usr/share/pixmaps...

Ne pas oublier de se débarasser du beep dans les terminaux. Je ne sais pas si c'est quelque part dans le cliquodrome, mais il suffit de taper dans une fenêtre (une seule)

xset b off

Ca marcherait probablement si la carte son était reconnue... Ici, on peut s'en tirer en tapant

xset b 0 100 0

Ce qui veut dire que le velume est à zéro (cela n'a aucun effet), dont la fréquance est à 100 Hz (cela n'a aucun effet non plus) et dont la durée est de 0 milisecondes (c'est ça qui marche).

Configuration du réseau

On utilise toujours DrakConf, à l'aide des informations fournies par l'ingénieur système (adresse IP de la machine, adresse IP de la passerelle (gateway, en anglais), masque réseau, DNS.

A la main, on procèderait ainsi (ces notes sont un peu plus vieilles).

Imaginons que l'adresse de ma machine soit 134.157.61.84, que son masque réseau soit 255.255.255.0, que la passerelle soit 134.157.61.254 et que les DNS soient 134.156.13.103 et 134.157.0.129 (ces données correspondent en fait au TX (TC, en fait) devant lequel je suis ; je les ai obtenues en demandant une console (CTRL-ALT-SHIFT-F1), en tapant 'ifconfig' et en revenant sous X11 (ALT-F2)).

On configure la carte réseau (normalement, on ne doit pas changer l'adresse MAC de la carte, mais...)

ifconfig lo 127.0.0.1
ifconfig eth0 134.157.61.84 netmask 255.255.255.0 hw 00:10:DC:5F:55:D7 up

On dit à l'ordinateur comment atteindre une machine en connaissant son adresse (soit c'est la machine sur laquelle on est, soit il faut contacter la passerelle).

route add -host 127.0.0.1 lo
route add -net 134.157.61.84 netmask 255.255.255.0 eth0
route add default gw 134.157.61.254

Configurons le DNS

echo 'domain institut.math.jussieu.fr' > /etc/resolv.conf
echo 'search institut.math.jussieu.fr math.jussieu.fr jussieu.fr' >> /etc/resolv.conf
echo 'name server 134.156.13.103' >> /etc/resolv.conf
echo 'name server 134.157.0.129'  >> /etc/resolv.conf

Pour certaines adresses, il n'est pas nécessaire de passer par le DNS.

echo '127.0.0.1 localhost loopback' >  /etc/hosts
echo '134.157.61.84 tcthesards7c1.institut.math.jussieu.fr' >> /etc/hosts

QUESTION : ne faut-il pas relancer (kill -HUP) un certain démon pour que ces fichiers de configuration soient relus ?

Pour que tout cela soit définitif, il convient de modifier les fichiers /etc/rc*

Pour terminer, un peu de vocabulaire (sous réserve que j'aie bien compris le sens de ces termes).

LAN : réseau local.

Hub : Les différentes machines d'un réseau local peuvent être reliées à un Hub, auquel cas chacune des machines peut voir ce que les autres reçoivent ou émettent.

Switch : Comme un Hub, mais le Switch n'envoie les données qu'à la bonne machine (sauf si on a réussi à le perturber, par exemple en usurpant des adresses MAC, auquel cas il envoie tout à tout le monde, comme un Hub).

Routeur : machine qui relie deux LAN différents

Bridge : Comme un routeur, mais c'est transparent ; tout se passe comme s'il n'y avait qu'un seul LAN.

Deuxième installation de Linux (Debian 3.0)

Comme je suis relié au réseau, je vais pouvoir tout installer à partir du réseau, sans avoir à graver tous les CDs. Pour booter, j'ai juste besoin du premier CD -- en fait, un morceau de 200 Mo du premier CD suffit. Gravons cette image minimale.

Les CDRW...

Je commence par essayer avec un CDRW que j'ai acheté hier...

su -p
cdrecord -scanbus
cdrecord -v speed=8 dev=0,0,0 -data woody-i386-1.iso

Je ne sais pas si ça a planté ou si ça a marché :

Cdrecord 1.9 (i586-mandrake-linux-gnu) Copyright (C) 1995-2000 Jörg Schilling
TOC Type: 1 = CD-ROM
scsidev: '0,0,0'
scsibus: 0 target: 0 lun: 0
Linux sg driver version: 3.1.17
Using libscg version 'schily-0.1'
atapi: 1
Device type    : Removable CD-ROM
Version        : 0
Response Format: 2
Capabilities   :
Vendor_info    : 'SAMSUNG '
Identifikation : 'CDRW/DVD SN-308B'
Revision       : 'U005'
Device seems to be: Generic mmc CD-RW.
Using generic SCSI-3/mmc CD-R driver (mmc_cdr).
Driver flags   : SWABAUDIO
Drive buf size : 1353728 = 1322 KB
FIFO size      : 4194304 = 4096 KB
Track 01: data  185 MB
Total size:     213 MB (21:06.37) = 94978 sectors
Lout start:     213 MB (21:08/28) = 94978 sectors
Current Secsize: 2048
ATIP info from disk:
  Indicated writing power: 3
  Reference speed: 6
  Is not unrestricted
  Is erasable
  Disk sub type: High speed Rewritable (CAV) media (1)
  ATIP start of lead in:  -11940 (97:22/60)
  ATIP start of lead out: 335975 (74:41/50)
  speed low: 4 speed high: 8
  power mult factor: 1 5
  recommended erase/write power: 5
  A2 values: 00 00 00
Disk type:    Phase change
Manuf. index: 43
Manufacturer: Acer Media Technology, Inc.
Blocks total: 335975 Blocks current: 335975 Blocks remaining: 240997
Starting to write CD/DVD at speed 8 in write mode for single session.
Last chance to quit, starting real write in 1 seconds.
Waiting for reader process to fill input buffer ... input buffer ready.
Performing OPC...
cdrecord: Input/output error. send opc: scsi sendcmd: retryable error
CDB:  54 01 00 00 00 00 00 00 00 00
status: 0x0 (GOOD STATUS)
cdrecord: Resource temporarily unavailable. OPC failed.
cdrecord: fifo had 64 puts and 0 gets.
cdrecord: fifo was 0 times empty and 0 times full, min fill was 100%.

Pour vérifier ce qui s'est passé, on va tenter de monter ce système de fichiers.

mount -t iso9660 /dev/cdrom /mnt/cdrom

Ca ne marche pas, alors que

mount -t iso9660 -o ro,loop=/dev/loop0 woody-i386-1.iso /mnt/cdrom

marche très bien. Réessayons en effaçant préalablement le CDRW.

  cdrecord -v speed=4 blank=fast dev=0,0,0 -data woody-i386-1.iso

Ca plante encore :

cmd finished after 206.868s timeout 9600s
cdrecord: Cannot blank disk, aborting.

On réessaye, plus lentement :

cdrecord -v speed=2 blank=fast dev=0,0,0 -data woody-i386-1.iso

Eh bien non, il accepte juste les vitesses 4 et 8. Ca plante toujours.

Comme le problème vient de l'effacement du CDRW, on va procéder en deux temps : d'abord l'effacer, complètement, puis l'écrire.

cdrecord -vv -force speed=4 blank=all dev=0,0,0

Là non plus, je ne sais pas quoi penser du message que j'obtiens :

cdrecord: Input/output error. blank unit: scsi sendcmd: retryable error
CDB:  A1 00 00 00 00 00 00 00 00 00 00 00
status: 0x0 (GOOD STATUS)
cmd finished after 1367.778s timeout 9600s

cdrecord -v speed=0 dev=0,0,0 -data woody-i386-1.iso

Ca plante encore...

 cdrecord: Input/output error. prevent/allow medium removal: scsi sendcmd: retryable error
 CDB:  1E 00 00 00 00 00
 status: 0x0 (GOOD STATUS)
 cmd finished after 40.999s timeout 40s

Les CDR

Je remplace le CDRW par un CDR,

cdrecord -v speed=8 dev=0,0,0 -data woody-i386-1.iso

et ça marche tout seul...

mount -t iso9660 /dev/cdrom /mnt/cdrom

Installation de Débian

Aller dans le BIOS et dire de rebooter sur le CD. Rebooter.

Repondre aux questions. Quand il demande s'il faut rajouter des modules pour le disque ou la carte réseau, ne rien mettre.

Il lance ensuite tasksel (pour installer des paquetages, plusieures centaines à la fois) et propose de lancer dselect (pour ajouter des paquetages un par un -- je n'y comprends rien).

Le tetechargement prend une vingtaine de minutes. Avant l'installation elle-même, il pose plein de questions.

Ensuite, il faut encore attendre longtemps (c'était beaucoup plus rapide avec Mandrake -- mais je n'aurai plus a constater l'absence de logiciels de base, comme telnet ou zsh... [Par contre, je m'appercevrai plus tard qu'il n'y a pas de cdrecord...])

A la fin, ça plante vraiment : la carte graphique n'est pas reconnue. Comme je ne sais pas quel est l'utilitaire qui permet de la configurer (il y a bien Xconfigurator, mais il fonctionne en mode graphique...), je ne peux rien faire. (Je pourrais lancer le serveur à la main, en regardant quelles sont les options de startx, et après avoir modifié, toujours à la main, le fichier /etc/X11/...)

J'essaye donc de rebooter sous Mandrake -- heureusement que Debian proposait de garder un autre système d'exploitation !

Mais ça ne marche plus... En s'installant, Debian a du installer un peu trop de choses...

Pire encore, je n'arrive pas à utiliser le CD de Mandrake pour réparer cela (je m'imaginais qu'en tapant "rescue root=/dev/hda1", ça marcherait, mais non. Je me trouve juste avec un RAMdisc, sur lequel je ne parvient même pas à monter la partition (la commande mount semble fonctionner, après cela la commande df donne des résultats tout à fait cohérents, mais le répertoire de montage reste désespérément vide).

Je reviens donc sous Debian, en mode Console, en espérant graver les CDs de Mandrake 8.2. Mais il n'y a pas de commande cdrecord sous Debian ! Et je ne peux pas utiliser celui de la vieille Mandrake 8.0 (dont le système de fichiers est monté), car il est conçu pour un noyau 2.4, trop récent pour la Debian 3.0 sortie il y a à peine quelques semaines...

Troisième installation de Linux (Mandrake 8.0)

Finalement, je réinstalle Mandrake 8.0 et je peux graver les CDs de Mandrake 8.2.

Quatrième installation de Linux (Mandrake 8.2)

J'intalle Mandrake 8.2. Ouf !

Carte vidéo

Cette fois-ci, la carte son est reconnue. Par contre, pour la carte vidéo, c'est plus difficile : elle est reconnue comme un vieux modèle de la même marque, et ça plante complètement. Le message d'aide en bas de l'écran m'indique alors qu'il faut prendre "carte inconnue" et le serveur utilisant le Frame Buffer. Je me retrouve avec une résolution un peu plus grande (1024x768).

Sur le site de NVidia, on peut télécharger les fichiers nécessaires à l'utilisation de leurs cartes sous Linux.

rpm -ivh NVIDIA_kernel.i386.rpm
rpm -ivh NVIDIA_GLX.i386.rpm

Plus précisément

root@pczoonek HOME/ISO/ISO # rpm -ivh NVIDIA_kernel-1.0-2960.mdk82up.i586.rpm
Preparing...                ########################################### [100%]
   1:NVIDIA_kernel          ########################################### [100%]
Warning: loading /lib/modules/2.4.18-6mdk/kernel/drivers/video/NVdriver will taint the kernel: non-GPL license - NVIDIA

NVdriver installed successfully

root@pczoonek HOME/ISO/ISO # rpm -ivh NVIDIA_GLX-1.0-2960.i386.rpm
Preparing...                ########################################### [100%]
  --- WARNING!!
    libglx.a
    libGLcore.a
    libGL.so.1.0
    libGL.so.1.2
    libGL.so.1.3.401
 --- The above file(s) possibly belong to a conflicting MESA rpm.
 --- They have been renamed to xxx.<originalFile>.RPMSAVE to
 --- avoid conflicting with the files contained within this
 --- package.
 --- Please see the FREQUENTLY ASKED QUESTIONS section of
 --- /usr/share/doc/NVIDIA_GLX-1.0/README for more details.
   1:NVIDIA_GLX             ########################################### [100%]

Attention, le fichier de configuration de X est désormais

/etc/X11/XF86Config-4

(ils ont pris un nom différent lors du passage à la versin 4, car la syntaxe a changé)

On suit la documentation :

If you already have an XF86Config file working with a different driver
(such as the 'nv' or 'vesa' driver), then all you need to do is find
the relevant Device section and replace the line:

  Driver "nv"
  (or Driver "vesa")

with

  Driver "nvidia"

In the Module section, make sure you have:

  Load   "glx"

You should also remove the following lines:

  Load  "dri"
  Load  "GLcore"

Sur Internet, on trouve des gens qui arrivent à utiliser leur écran 1400x1050 à la bonne résolution.

Section "Monitor"
  Identifier   "Monitor0"
  VendorName   "Monitor Vendor"
  ModelName    "Monitor Model"
  VertRefresh   31.5-82
  HorizSync     40-110
  Modeline "1400x1050" 107.85 1400 1450 1500 1999 1050 1058 1070 1150
EndSection

Dans les anciennes versions (3.*), il y avait un exécutable de XFree86 par type de carte, par exemple

/usr/X11R6/bin/XF86_FBDev
/usr/X11R6/bin/XF86_SVGA

alors que pour la version 4, il n'y a qu'un seul exécutable, qui va charger cetains modules.

/usr/X11R6/bin/XFree86

Pour une raison que j'ignore, Mandrake a installé à la fois XFree86 3.* et 4.* -- et il utilise la vieille version...

Je passe en mode non graphique

init 3

et je lance directement XFree86 (version 4) : il charge bien les modules NVidia, et la commande xdpyinfo me dit que je suis en 24 bits. Par contre, l'écran n'a toujours pas la bonne taille.

Je change maintenant la section Screen, en rajoutant "1400x1050" partout et en rajoutant une SubSection pour la profondeur 24 bits. Je fixe la profondeur par défaut à 24 bits.

Ca marche presque ! On est bien en 24 bits, mais la résolution est simplement de 1280x1024... Les messages d'erreur sont les suivants.

(II) NVIDIA(0): Not using mode "1400x1050" (vrefresh out of range)
...
(II) NVIDIA(0): Not using mode "1400x1050" (no mode of this name)

Il y a donc un problème avec vrefresh. Le mien est de 59-75. Essayons de le monter à 82 -- pas d'erreur, mais aucun effet. Si je le descent à 40, ça plante, mais les messages d'erreur sont un peu différents.

(WW) NVIDIA(0): Not using mode "1400x1050":
(WW) NVIDIA(0):   horizontal sync start (1450) not a multiple of 4
(WW) NVIDIA(0):   horizontal sync width (1500 - 1450 = 50) not a multiple of
(WW) NVIDIA(0):      4
(WW) NVIDIA(0):   horizontal frame length (1999) not a multiple of 4
(EE) NVIDIA(0): No modes remaining for Display Device 0
(EE) NVIDIA(0):  *** Aborting ***

C'est donc la ligne que je ne comprends pas qui pose problème... Si j'enlève la ligne, ça plante aussi.

(WW) NVIDIA(0): Not using mode "1400x1050":
(WW) NVIDIA(0):   horizontal sync width (1784 - 1464 = 320) greater than 256
(EE) NVIDIA(0): No modes remaining for Display Device 0
(EE) NVIDIA(0):  *** Aborting ***

D'après le manuel, la syntaxe est la suivante

ModeLine "1400x1050" clock hdisp hsyncstart hsyncend htotal vdisp vsyncstart vsyncend vtotal

Mais le manuel ne dit pas ce que ça veut dire...

Comme le message d'erreur demandait des multiples de 4, j'arrondis...

Et ça marche. Youpi.

Voici donc une copie de mon fichier XF86Config-4 :

Section "Files"
    RgbPath	"/usr/X11R6/lib/X11/rgb"
    FontPath   "unix/:-1"
EndSection
  
Section "ServerFlags"
    # Uncomment this to disable the <Crtl><Alt><BS> server abort sequence
    #DontZap
    # Uncomment this to disable the <Crtl><Alt><KP_+>/<KP_-> mode switching
    #DontZoom
    # This  allows  the  server  to start up even if the
    # mouse device can't be opened/initialised.
    AllowMouseOpenFail
EndSection
  
Section "InputDevice"
  
    Identifier "Keyboard1"
    Driver      "Keyboard"
    Option "AutoRepeat"  "250 30"
  
    Option "XkbRules" "xfree86"
    Option "XkbModel" "pc105"
    Option "XkbLayout" "fr"
  
EndSection
  
# **********************************************************************
# Pointer section
# **********************************************************************

Section "InputDevice"

    Identifier "Mouse1"
    Driver      "mouse"
    Option "Protocol"    "PS/2"
    Option "Device"      "/dev/mouse"
    Option "Emulate3Buttons"
    Option "Emulate3Timeout" "50"
  
EndSection
  
Section "Module"
    Load	"dbe"
    Load        "v4l"
    SubSection	"extmod"
	#Option	"omit xfree86-dga"
    EndSubSection
    Load	"type1"
    Load	"freetype"
    Load         "glx"
EndSection
  
Section "Monitor"
    Identifier "Generic|Generic Laptop Display Panel 1400x1050"
    VendorName "Generic"
    ModelName  "Unknown"
    HorizSync  31.5-90
    VertRefresh 40-75
    ModeLine "1400x1050" 107.85 1400 1448 1500 2000 1050 1058 1070 1150

ModeLine "1024x480"    65.00 1024 1032 1176 1344   480  488  494  563 -hsync -vsync
ModeLine "768x576"     50.00  768  832  846 1000   576  590  595  630
ModeLine "768x576"     63.07  768  800  960 1024   576  578  590  616
  
EndSection
  
Section "Device"
    Identifier "Generic VGA"
    Driver     "vga"
EndSection
  
Section "Device"
    Identifier  ""
    VendorName  "NVidia"
    BoardName   "GeForce 4 (64Mo)"
    Driver      "nvidia"
    # Clock lines
  
    # Uncomment following option if you see a big white block        
    # instead of the cursor!                                          
    #    Option      "sw_cursor"
  
    Option      "DPMS"  "on"
EndSection
  
Section "Screen"
    Identifier "screen1"
    Device      ""
    Monitor     "Generic|Generic Laptop Display Panel 1400x1050"
    DefaultColorDepth 24
    Subsection "Display"
        Depth       8
        Modes       "1400x1050" "1024x768" "800x600" "640x480"
        ViewPort    0 0
    EndSubsection
    Subsection "Display"
        Depth       15
        Modes       "1400x1050" "1024x768" "800x600" "640x480"
        ViewPort    0 0
    EndSubsection
    Subsection "Display"
        Depth       16
        Modes       "1400x1050" "1024x768" "800x600" "640x480"
        ViewPort    0 0
    EndSubsection
    SubSection "Display"
    	Depth       24
	Modes	    "1400x1050"
	ViewPort    0 0
    EndSubsection
EndSection
  
Section "ServerLayout"
    Identifier "layout1"
    Screen     "screen1"
  
    InputDevice "Mouse1" "CorePointer"
  
    InputDevice "Keyboard1" "CoreKeyboard"
EndSection

Il ne reste plus qu'à dire à Mandrake de lancer ce serveur-là et pas le version 3...

Il ne faudrait pas faire comme ça, mais il est bientôt minuit...

cd /usr/X11R6/bin
mv XF86_FBDev XF86_FBDev.old
ln -s XFree86 XF86_FBDev

Et on repasse en mode graphique.

init 5

Ca marche...

Carte graphique (explications)

(quelques jours plus tard)

Voici un peu plus d'explications sur la line ModeLine.

ModeLine "1400x1050" 107.85 1400 1448 1500 2000 1050 1058 1070 1150
                     A      B    C    D    E    F    G    H    I

C'est pertinent pour les moniteurs à tube cathodique, ça permet d'avoir des images non déformées (ça date d'une époque où les moniteurs n'avaient pas de boutons de réglage pour ce genre de choses...).

Le premier nombre (A) indique la fréquence d'horloge de la carte graphique, que l'on trouve normalement dans la documentation (je crois que c'est quelque chose comme 200MHz ou 300MHz -- j'ai déjà perdu la documentation de l'ordinateur).

Les nombres B (1400) et F (1050) qui apparaissent un peu après correspodent à la résolution.

Dans un moniteur à tube cathodique, il y a un canon à électrons qui envoie des électrons sur l'écran, le balayant ligne par ligne. Mais après avoir affiché une ligne, il revient au début de la ligne suivante, ce qui prend un peu de temps : c'est ce temps, ainsi que le temps passé dans les marges gauche et droite qu'indiquent les autres nombres (je suis très scpetique sur la pertinence de ces explications pour les écrans à cristaux liquides).

E = 1.25 * B 
C = B + 32
D = E - 32

On peut donner des règles tout aussi approximatives pour les autres nombres (qui s'occuppent du balayage vertical), mais comme ça va beaucoup plus lentement, on peut prendre des marges moindres.

I = 1.05 * F
G = F + 2
H = I - 2

Le nombre d'images par seconde est

  A * 1E6 
-----------
  E * I

Soit ici : 47 images par secondes (heureusement que c'est un écran à cristaux liquides, car sinon, ça scintillerait affreusement : normalement, ça doit être au delà de 60 Hz).

Revenons un instant sur les lignes

    HorizSync  31.5-90
    VertRefresh 40-75

que j'avais quelques scrupules à modifier. On peut baisser le chiffre le plus bas sans aucun scrupule : la seule conséquence sera qu'X proposera un nombre de modes beaucoup plus grand (mais des modes en basse résolution). A priori, ça n'a aucun intéret, mais en fait, c'est ce dont on a besoin si on veut regarder un DVD.

Carte graphique (fin)

J'utilise maintenant

ModeLine "1400x1050" 138 1400 1448 1500 2000 1050 1058 1070 1150

Ce qui fait 60 images par seconde

Pour les DVD, j'en prends quelques uns et je regarde quelle est leur résolution.

720x480, 30 images par seconde (NTSC)
720x576, 25 images pas seconde (PAL)

Je rajoute donc les lignes

ModeLine "720x480" 27 720 752 848 880 480 484 500 504
ModeLine "720x576" 38 720 752 868 900 576 578 602 604

(pour cela, j'ai dû baisser le hsync à 20).

Quand on est sous X, on peut changer la résolution en faisant

Ctrl-Alt-Moins
Ctrl-Alt-Plus

avec le Moins du pavé numérique. Sur un clavier de portable, il n'y a pas de pavé numérique, mais on peut avoir la touche correspondante en faisant Fn + la touche adéquate (pour moi, celle avec un + ou un - bleu, à savoir M ou P).

A FAIRE : ça ne marche pas.
La taille de l'écran est bien réduite, mais 
aucun logiciel ne le sait...
xdpyinfo dit que la taille de l'écran n'a pas changé.
(quand je désire vraiment changer la taille de l'écran,
je quitte X (init 3), je modifie le fichier de configuration,
et je relance X (init 5)).

Le clavier

On utilise généralement XKb pour faire des modifications sur le clavier, mais pour des modifications ponctuelles, xmodmap demeure plus simple.

Les touches inutiles sont les suivantes.

² (en haut à gauche du clavier)
la touche Windows, entre les touches ALT et FN
la touche CTRL droite
la touche Caps-Lock

Avant, j'avais trois touches pour Windows, que je pouvais transformer en \ { et } -- il va falloir trouver autre chose.

J'aimerais pouvoir taper facilement les caractères suivants :

` { } \

Essayons donc

²          -> `
Shift-²    -> \
Win        -> {
CTRL-droit -> }

Pour cela, on a besoin des keycodes de ces diverses touches : la commande xev va nous les donner (mettre le pointeur de la souris dans la fenêtre qui apparait et appuyer sur la touche voulue).

xev

Essayons de mettre cela dans un fichier ~/.xmodmap

keycode 49  = grave backslash
keycode 115 = braceleft bracketleft
keycode 109 = braceright bracketright

On vérifie que ça marche.

xmodmap ~/.xmodmap

Il ne reste plus qu'à faire en sorte que ce soit lancé automatiquement, en mettant cette commande dans le ~/.xsession. (voir plus loin)

Documentation

La documentation est présente sous plusieures formes. Tout d'abord les pages de manuel, par exemple

man ps

pour connaitre "toutes" les options de la commande ps. Si on ne connait pas ne nom de la commande que l'on cherche, on peut essayer avec apropos.

% apropos processus
...
idle                 (2)  - Rendre le processus 0 inactif
inittab              (5)  - format du fichier inittab utilisé dans le processus de démarrage des systèmes UNIX SYSTEM V et compatibles
ipc                  (5)  - Mécanisme Système V de communication entre processus
kill                 (1)  - Envoyer un signal à un processus
kill                 (2)  - Envoyer un signal à un processus
killall              (1)  - Envoyer un signal à des processus indiqués par leurs nomskillpg
                     (2)  - Envoyer un signal à un groupe de processus
killpg               (3)  - Envoi d'un signal à tous les membres d'un groupe du processus
...

S'il n'y a rien dans le manuel, on peut essayer avec la commande info.

info glame

On peut aussi essayer de regarder dans les HOWTOs, qui contiennent beaucoup d'information, pas sur les logiciels, mais sur ce que l'on peut faire avec la machine. Par exemple, pour résoudre mes problèmes avec la carte vidéo, je peux essayer

locate video ; locate Video

(ensuite, comme il s'agit de fichiers HTML, on les lit avec lynx ou mozilla.)

Pour presque chaque logiciel, il y a quelques fichiers dans /usr/share/doc : ils ne contiennent jamais rien d'intéressant (tout au plus les instructions pour installer le logiciel (mais si ces fichiers sont là, c'est qu'il est déjà installé) et éventuellement une ou deux phrases indiquant ce qu'il fait).

Attention : les pages de manuel en français sont souvent obsolètes -- par exemple, la page de manuel de la commande "ps" ne mentionne pas l'option --forest, qui pourtant existe depuis plusieures années. Il est donc parfois utile d'abandonner la langue française (le problème, c'est que rien ne nous indique que les pages de manuel françaises sont obsolètes).

unset LANG
unset LANGUAGE
unset LC_MESSAGES

Je conseille même carrément d'ENLEVER LES PAGES DE MANUEL EN FRANÇAIS. (j'ai aussi eu des problèmes avec la commande grep, dont le comportement ne correspond plus à ce qui est décrit sur la page de manuel française ; et l'option qui permet de retrouver ce comportement n'est bien sûr pas mentionnée non plus).

Si tout a échoué, il reste Google

http://www.google.fr/
http://www.google.fr/grphp?q=&ie=UTF-8&oe=UTF-8&hl=fr&meta=

Démarrage de la machine

Commençons par rappeler ce qui se passe lorsque la machine démarre -- je ne mentionne que ce que l'on peut configurer : il est possible que j'oublie quelques étapes.

Tout d'abord, elle lit le début du disque dur, où elle trouve un logiciel d'amorçage (généralement Lilo, parfois Grub), qui propose différentes manières de booter. Dans le cas de Lilo, on peut modifier ce comportement en éditant le fichier lilo.conf et en relançant lilo, pour mettre à jour le début du disque dur.

Ensuite, la machine, lance le processus init, qui choisit un "runlevel", d'après le fichier /etc/inittab. Par exemple, 5 pour un système normal, 3 pour un système sans fenêtre, 0 pour arréter la machine ou 6 pour la rebooter. On peut par la suite lancer soi-même init pour changer ce runlevel (d'où l'intérêt du 0 ou du 6). Pour chaque service suceptible d'être lancé (serveur X, serveur de fontes, serveur Web, base de données, etc.), il y a un script dans /etc/initd, qui permet à la fois de le démarrer et de l'arréter (on lui donne un argument comme start, stop, restart, reload, status). A chaque runlevel, correspond un répertoire /etc/rc*.d/ qui contient des liens symboliques vers ces fichiers, de manière que l'on sache ce qu'il faut lancer ou arrêter quand on passe d'un runlevel à un autre (le nom de ces liens symboliques, par exemple S90mysql indique à init ce qu'il faut faire avec le service (S comme Start, K comme Kill), le numéro indique l'ordre dans lequel il faut faire les choses). C'est donc dans ces répertoires-là que se décide ce qui doit être lancé au déparrage de la machine.

Parmi les choses qu'init lance, il y a les différents terminaux (texte) sur lesquels on peut se logguer (Alt-F1, Alt-F2, etc. (ou Ctrl-Alt-F1, si on est dans un environement graphique), Alt-F7 pour l'environement graphique), ainsi que la fenêtre de login graphique (kdm, mais on pourrait aussi utiliser gdl ou xdm).

Examinons ces services un par un (pour le runlevel 5). Les fichiers de configuration de ces différents services sont généralement dans /etc/sysconfig.

S01usb : regarde s'il y a quelque chose de brancé sur le port USB (une imprimante, une souris, une tablette graphique, etc.) et charge les modules correspondants.

S03iptables : c'est le firewall du noyau.

S05harddrake : regarde s'il y a un nouveau matériel connecté à l'ordinateur et propose de le configurer "automatiquement".

S05kudzu : pareil (regarde s'il y a un nouveau matériel connecté à l'ordinateur et propose de le configurer "automatiquement").

S08ipvsadm : pour avoir plusieures machines (avec des noms et des numéros IP différents) sur une même carte réseau.

S10network : configure le réseau, en lançant ifconfig,

S11internet : idem.

S11pcmcia : regarde s'il y a des cartes PCMCIA.

S11portmap : lance portmap (si on fait tourner des serveurs, i.e. des programmes qui écoutent un port, et (généralement) qui sont capables de traiter plusieures connexions simultanées.

S12jserver : pour pouvoir écrire en japonais.

S12syslog : permet de centraliser les journaux de bord.

S14nfslock : permet de bloquer l'accès à un fichier (pour éviter que deux programmes ne le modifient en même temps) NFS.

S20random

S25netfs : monte les systèmes de fichiers NFS ou Samba précisés dans /etc/fstab.

S26apmd : précise ce qu'il faut faire si la batterie du portable est à plat.

S40atd : lance le démon atd, qui permet de lancer une commande à une heure fixée (voir plutôt anacron).

S56rawdevices : Permet l'accès "direct" (je ne sais pas ce que ça veut dire) à certains périphériques, comme les disques. Le fichier /etc/sysconfig/rawdevices contient

/dev/raw/raw1 /dev/dvd

S56xinetd : Généralement, quand on veut qu'un processus écoute ce qui se passe sur un port donné, on commence par lancer le processus et ensuite il écoute. Si on a beaucoup de ports à écouter, on se retouve avec beaucoup de processus, qui occupent de la mémoire, mais qui ne font rien la plupart du temps. Inetd et son successeur xinetd offrent une alternative à ce gaspillage de ressources : c'est le processus xinetd qui écoute, et il ne va lancer le démon correspondant que quand quelque chose arrive sur le port correspondant.

Généralement, on ne veut pas que xinetd soit lancé (par défaut, il ne lance rien de génant, mais...)

rm /etc/rc.d/rc5.d/*xinetd*
mv /etc/xinetd.conf /etc/xinetd.conf.old
touch /etc/xinetd.conf
mv /etc/xinetd.d /etc/xinetd.d.old
mkdir /etc/xinetd.d

S70alsa : Alsa n'est pas installé.

S71sound : Configuration de la carte son

S75keytable : configuration du clavier

S80partmon : Regarde s'il y a une partition presque pleine.

S80prelude : C'est un IDS, i.e., un détecteur d'intrusion. Il faut lire /var/log/prelude/ de temps à autres.

S85gpm : pour pouvoir utiliser la souris en mode console.

S85httpd

S90crond : un peu comme atd, mais pour lancer des processus régulièrement (tous les jours, toues les semaines, etc.), à heure fixée.

S90mysql

S90postgresql

S90xfs : serveur de fontes.

S95anacron : remplacement des commandes cron et at pour les machines qui ne sont pas allumées en permanence.

S95kheader (ne pas effacer).

S99devfsd (je ne comprends pas vraiment ce que ça fait, mais il faut le laisser).

S99linuxconf

S99local

S99medusa Moteur de recherche, comme locate, mais avec le contenu des fichiers. Utilisé par Nautilus (que je n'utilise pas). A effacer.

rm /etc/rc.d/rc5.d/*medusa*

Il y a aussi le serveur X et kdm : ils sont lancés directement depuis le fichier /etc/inittab.

Il y a parfois des problèmes lorsque la machine boote : par exemple, toutes les 40 fois, elle lance fsck. Mais il n'y a rien d'affiché, donc on ne sait pas du tout ce qui se passe -- on se contente de deviner que fsck a été lancé, car le voyant du disque dur reste allumé et ça dure très longtemps. Pire : s'il y a un problème, fsck pose une question -- mais comme rien n'est affiché, on ne sait pas qu'il faut répondre quelque chose. Pour toutes ces raisons, je préfère que l'ordinateur me dise ce qu'il fait. Je crois que cela si trouve dans /etc/lilo.conf : j'enlève "quiet" dans la ligne suivante.

append="devfs=mount hdb=ide-scsi quiet"

Il ne faut pas oublier de relancer lilo.

lilo

Tâches périodiques

Il y a aussi certaines tâches qui sont lancées périodiquement, en particulier pour mettre de l'ordre sur le disque ou mettre des bases de données à jour. Historiquement, cela se fait avec la commande cron, qui permet de lancer un processus, régulièrement, toujours au même moment (toutes les heures à la même minute, tous les jours à la même heure, toutes les semaines, tous les mois, etc.) -- voir aussi la commande "at", pour lancer une commande une seule fois, à un instant précis. Mais sur une machine qui n'est pas alluméee en permanence, ce n'est pas très pertinent : la commande anacron pallie à ce problème, en lançant certaines commandes tous les jours ou toutes les semaines, sans trop faire attention à l'heure. En fait, crontab n'est pas utilisé :

# crontab -l
no crontab for root

On se contente d'anacron :

# find /etc/cron*
/etc/cron.d
/etc/cron.daily
/etc/cron.daily/tmpwatch
/etc/cron.daily/rpm
/etc/cron.daily/makewhatis.cron
/etc/cron.daily/logrotate
/etc/cron.daily/tetex.cron
/etc/cron.daily/slocate.cron
/etc/cron.daily/medusa.cron
/etc/cron.daily/0anacron
/etc/cron.daily/msec
/etc/cron.hourly
/etc/cron.hourly/msec
/etc/cron.monthly
/etc/cron.monthly/0anacron
/etc/crontab
/etc/cron.weekly
/etc/cron.weekly/makewhatis-fr.cron
/etc/cron.weekly/makewhatis.cron
/etc/cron.weekly/0anacron

Tmpwatch efface les fichiers des répertoires temporaires /tmp et /var/tmp qui n'ont pas été utilisés depuis 10 jours. Logrotate s'arrange pour qu'on ne garde que 4 semaines de fichiers de log (les "journaux de bord" du système). Slocate (plus simplement, locate) permet de chercher un fichier en connaissant simplement son nom : pour cela, on construit tous les jours une liste des fichiers du disque (ça prend un bon quard d'heure), et on cherche directement dans cette liste plutôt que sur le disque -- cette liste de fichiers n'est donc pas toujours à jour. Tetex lance texhash, qui fait la même chose mais pour les fichiers de (La)TeX. makewhatis fait la même chose, mais avec les pages de manuel (que l'on peut interroger à l'aide des commandes man, apropos, whatis). Medusa fait la même chose, mais avec aussi le contenu des fichiers (attention, l'index peut être énorme) : on peut effectuer des recherche à partir de Nautilus (le gestionnaire de fichiers de Gnome) ou à l'aide de la commande msearch -- par défaut, c'est desactivé, voir le fichier /etc/medusa/medusa.conf.

Lancement d'autres programmes au démarrage

Plutôt que de jouer avec les liens symboliques dans les divers répertoires /etc/rc*, on peut simplement éditer le fichier /etc/rc.d/rc.local.

Les démons en trop

On peut connaitre la mémoire libre à l'aide de la commande free.

Regardons quels sont les démons qui tournent.

ps -auxww

Ce qui ne prend pas du tout de mémoire, ce sont des morceaux du noyau (ça prend de la mémoire, mais pas en tant que processus).

USER    PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
root      1  0.0  0.0  1412   80 ?        S    09:30   0:03 init
root      2  0.0  0.0     0    0 ?        SW   09:30   0:00 [keventd]
root      3  0.0  0.0     0    0 ?        SW   09:30   0:00 [kapmd]
root      4  0.0  0.0     0    0 ?        SWN  09:30   0:00 [ksoftirqd_CPU0]
root      5  0.0  0.0     0    0 ?        SW   09:30   0:03 [kswapd]
root      6  0.0  0.0     0    0 ?        SW   09:30   0:00 [bdflush]
root      7  0.0  0.0     0    0 ?        SW   09:30   0:00 [kupdated]
root      8  0.0  0.0     0    0 ?        SW<  09:30   0:00 [mdrecoveryd]
...

Voici maintenant de vrais processus.

root     63  0.0  0.3  1796  824 ?        S    09:30   0:00 devfsd /dev
root    799  0.0  0.2  1524  556 ?        S    09:35   0:00 /sbin/cardmgr
rpc     823  0.0  0.1  1544  460 ?        S    09:35   0:00 portmap
root    844  0.0  1.5  5248 3928 ?        S    09:35   0:00 /usr/bin/Wnn4/jserver
root    866  0.0  0.2  1484  572 ?        S    09:35   0:00 syslogd -m 0
root    875  0.0  0.4  2092 1072 ?        S    09:35   0:00 klogd -2
root    910  0.0  0.2  1552  560 ?        S    09:35   0:00 rpc.statd
root   1008  0.0  0.1  1396  408 ?        S    09:35   0:00 /usr/sbin/apmd
daemon 1034  0.0  0.1  1436  284 ?        S    09:35   0:00 /usr/sbin/atd
root   1083  0.0  0.3  2304  920 ?        S    09:35   0:00 xinetd
root   1316  0.0  0.1  1440  340 ?        S    09:35   0:00 gpm
root   1487  0.0  0.2  1620  608 ?        S    09:35   0:00 crond
xfs    1615  0.0  2.0  6472 5124 ?        S    09:35   0:01 xfs
root   1640  0.0  0.2  1452  600 ?        S    09:35   0:00 anacron
root   1775  0.0  0.1  1380  408 tty1     S    09:35   0:00 /sbin/mingetty tty1
root   1776  0.0  0.1  1380  408 tty2     S    09:35   0:00 /sbin/mingetty tty2
root   1777  0.0  0.1  1380  408 tty3     S    09:35   0:00 /sbin/mingetty tty3
root   1778  0.0  0.1  1380  408 tty4     S    09:35   0:00 /sbin/mingetty tty4
root   1779  0.0  0.1  1380  408 tty5     S    09:35   0:00 /sbin/mingetty tty5
root   1780  0.0  0.1  1380  408 tty6     S    09:35   0:00 /sbin/mingetty tty6
root   1783  0.0  0.0  2404    4 ?        S    09:35   0:00 /usr/bin/kdm -nodaemon
root   2423  0.0  0.1  2772  488 ?        S    09:40   0:00 /usr/bin/prelude_report
root   2435  0.0  0.2  6256  628 ?        S    09:40   0:00 /usr/bin/prelude
root   2436  0.0  0.1  2772  412 ?        S    09:40   0:00 /usr/bin/prelude_report
root   2437  0.0  0.2  6256  628 ?        S    09:40   0:00 /usr/bin/prelude
root   2438  0.0  0.2  6256  628 ?        S    09:40   0:00 /usr/bin/prelude
root   4253  0.0  0.2  1452  620 ?        S    10:05   0:00 anacron

Le serveur Web Apache :

root   1457  0.0  0.9  6688 2396 ?        S    09:35   0:00 httpd-perl
apache 1465  0.0  0.5  6796 1440 ?        S    09:35   0:00 httpd-perl
apache 1466  0.0  0.5  6796 1440 ?        S    09:35   0:00 httpd-perl 
apache 1467  0.0  0.5  6796 1440 ?        S    09:35   0:00 httpd-perl 
apache 1468  0.0  0.5  6796 1440 ?        S    09:35   0:00 httpd-perl

La base de données MySQL :

root   1509  0.0  0.4  2472 1232 ?        S    09:35   0:00 /bin/sh /usr/bin/safe_mysqld
root   1510  0.0  0.2  1684  580 ?        S    09:35   0:00 logger -t safe_mysqld
mysql  1547  0.0  1.7 26952 4424 ?        S    09:35   0:00 /usr/sbin/mysqld
mysql  1582  0.0  1.7 26952 4424 ?        S    09:35   0:00 /usr/sbin/mysqld
mysql  1583  0.0  1.7 26952 4424 ?        S    09:35   0:00 /usr/sbin/mysqld
mysql  1584  0.0  1.7 26952 4424 ?        S    09:35   0:00 /usr/sbin/mysqld

La base de données PostgreSQL :

postgres  1580  0.0  0.5  6824 1432 ?        S    09:35   0:00 /usr/bin/postmaster
postgres  1585  0.0  0.1  7816  396 ?        S    09:35   0:00 postgres: stats buffer process
postgres  1586  0.0  0.2  6848  604 ?        S    09:35   0:00 postgres: stats collector process

Si la machine n'a plus suffisemment de mémoire, on peut choisir de se débarasser de certains de ces processus.

Si on utilise un gestionnaire de fenêtres assez complet, on verra aussi plein d'autres choses, beaucoup plus gourmandes en mémoire.

Si on ne sait pas comment a été lancé un processus, on peut essayer l'option --forest de la commande ps (ne la cherchez pas dans la page de manuel française, elle n'y est pas encore, car elle est apparue il y a juste trois ou quatre ans -- la page de manuel anglaise est à jour).

Démarrage de l'environement graphique d'un utilisateur.

Créer un fichier ~/.xsession et mettre ce que l'on veut dedans (au moins un gestionnaire de fenêtres, par exemple startkde, startgnome, etc.).

rpm

Très souvent, quand je veux installer un logiciel pour lequel il n'y a pas de RPM, en le compilant, je ne peux pas le compiler, car il manque certaines bibliothèques -- les bibliothèques partagées sont bien là, mais pas les fichiers *.h (pourtant, ils ne sont pas gros !).

Pour chaque paquetage installé, je vais donc regarder s'il y a un paquetage *devel* correspondant, et l'installer.

La liste des paquetages installés

rpm -qa

En fait, non, on va procéder différemment : on va prendre la liste des paquetages *devel* sur les CDs, et on va essayer de les installer -- si ça plante à cause des dépendances, c'est qu'il ne fallait pas l'installer.

mkdir CD
cd CD
cp /mnt/cdrom/**/*devel*.rpm .

En tout, il y a 160 Mo et plus de 400 paquetages (mais certains sont déjà installés).

for i in *.rpm
do
  nohup rpm -iv $i
done

Je le lance plusieures fois, car il se peut que certains de ces paquetages en demandent d'autres : lors de la première passe, ils refuseront de s'installer, mais lors de la suivante, il se peut que le paquetage manquant ait été installé.

C'est long...

Par ailleurs, j'ai parfois des problèmes avec les RPMs.

Si je fais des mises à jour au bureau, quand je suis sur Internet, il peut y avoir des paquetages que je suis dans l'impossibilit d'installer simplement à partir des CD, car ils dépendent d'un autre paquetage, dont la version est alors trop élevée.

La base de donnée est facilement corrompue... Ce sont les gros problèmes que j'avais eu avec Red Hat il y a quelques années : il était devenu complètement impossible d'installer ou de desinstaller quoi que ce soit.

Mais pour l'instant, ça n'a pas l'air de poser de problèmes...

extracting xscreensaver-4.00-4mdk.i586                                 
extracting xscreensaver-gl-4.00-4mdk.i586
extracting xscreensaver-gl-4.00-4mdk.i586
installation de /mnt/cdrom/Mandrake/RPMS/xscreensaver-gl-4.00-4mdk.i586.rpm
rpminst didn't install: 'xscreensaver-4.00-4mdk'
'xscreensaver-4.00-4mdk' added to the already_installed_list
already installed: 'xscreensaver', SHOULD NOT HAPPEN

Xemacs

Je veux une version multilingue d'XEmacs, et je préfère avoir une version béta : je vais donc recompiler XEmacs.

(Si Canna était là -- c'est le cas sous Red Hat -- on rajouterait --with-canna)

tar zxvf /home/zoonek/spool/ftp/xemacs-21.5.8.tar.gz
  
mkdir /usr/local/lib/xemacs
cd /usr/local/lib/xemacs
mkdir /usr/local/lib/xemacs
bzip2 -dc ~/spool/ftp/xemacs-sumo-2002-07-20.tar.bz2 | tar xvf -
bzip2 -dc ~/spool/ftp/xemacs-mule-sumo-2002-07-20.tar.bz2 | tar xvf -
cd -
  
./configure --with-mule --with-wnn
make
make gzip-el
su -p
make install
make gzip-el

On vérifie que ça marche.

/usr/local/bin/xemacs &
Options -> Encoding -> Buffer File -> UTF8
M-x set-input-method
japanese-skk

Ca ne marche pas, car il ne trouve pas le dictionnaire, qui se trouve pourtant là :

/usr/local/lib/xemacs/mule-packages/etc/skk/SKK-JISYO.L

Il fallait peut-être le mettre dans le répertoire racine de l'utilisateur _avant_ de lancer xemacs (il a a trois dictionnaires : un petit, un moyen et un gros, c'est à chaque utilisateur de choisir celui qu'il veut).

cp /usr/local/lib/xemacs/mule-packages/etc/skk/SKK-JISYO.L ~/.skk-jisyo

Maintenant, ça marche.

Il est peut-être utile de rappeler le fonctionnement de skk : on tape les mots phonétiquement, quand commence un mot en Kanji, on met une majuscule, s'il n'est pas accompagné d'okurigana, on met un espace après (et on appuie plusieures fois sur la barre d'espace si ce n'est pas la bonne écriture), s'il y a des okurigana, on met une majuscule au début des okurigana. Par exemple :

Nihongo gaKaKeroyo.

Avec wnn, ça ne marche pas non plus.

M-x set-input-method
japanese-wnn

Il y a bien un démon Wnn qui tourne :

% ps -auxww | egrep -i 'wnn|jserver'
root  1031 0.0 1.5 5180 3860 ?     S 14:36 0:00 /usr/bin/Wnn4/jserver
root 32000 0.0 0.2 1972  760 pts/1 R 16:08 0:00 egrep wnn|jserver

Par contre, il n'y a pas de démon kinput (je rappelle que les différents logiciels permettant de taper des langues non alphabétiques utilisent tous des protocoles différents, que chaque logiciel client ne peut pas connaitre : kinput les connait tous et les transforme en un protocole unique, plus standardisé, que tous les clients connaissenti -- si j'ai bien compris).

kinput2.wnn4 &

Et ça marche. Le principe de Wnn est un peu différent : on peut taper des phrases entières, il est généralement capable de les découper en mots. On appuie ensuite sur la barre d'espace et on corrige éventuellement les conversions à l'aide des touches de curseur (gauche-droite pour aller d'un mot à l'autre, haut-bas pour passer d'une proposition à une autre) et on appuie enfin sur entrée. Exemple :

nihongogakakeruyo. RIGHT DOWN RET

On peut demander à l'ordinateur de lancer kinput2 automatiquement, par exemple en le mettant dans le ~/.xsession. On peut aussi utiliser le fichier ~/.i18n

cd /etc/X11
grep -i kinput **/*(.)
grep -i xim **/*(.)
less xinit/XIM
less /etc/sysconfig/i18n

Le fichier de configuration d'Emacs est dans ~/.emacs, alors que celui de XEmacs est dans ~/.xemacs/init.el. Néanmoins, XEmacs va lire le ~/.emacs si on n'a pas créé de ~/.xemacs (en fait, dans ce cas, il se propose de mettre le code du ~/.emacs dans le ~/.xemacs).

Pour débugguer ce fichier de configuration, on peut lancer xemacs avec l'option -debug-init.

Je commance par demander une fonte un peu plus grande.

(set-face-font       'default
"-b&h-lucidatypewriter-bold-r-normal-sans-24-240-75-75-m-140-iso8859-1")

Ensuite, je constate qu'il ne se place pas tout seul en mode LaTeX, mais simplement en mode TeX. On lui demande donc d'utiliser AucTeX.

(load "/usr/local/share/emacs/site-lisp/tex-site.el")

Quand on ouvre un environement "document", il ne met pas l'en-tête complet auquel je suis habitué : rajoutons-le.

(load "/usr/local/lib/xemacs/xemacs-packages/lisp/auctex/tex-site.el")
(add-hook 'LaTeX-mode-hook '(lambda ()
  (LaTeX-math-mode)
  (setq LaTeX-default-environment "defi")
  (setq LaTeX-default-style "article")
  (setq LaTeX-default-options '("a4paper,12pt"))
  (LaTeX-add-environments
    '("theoenum" LaTeX-env-item)
    '("axiomenum" LaTeX-env-item)
    '("exercices" LaTeX-env-item))
  (add-hook 'LaTeX-document-style-hook '(lambda nil
  (save-excursion
    (search-backward "\\documentclass")
    (search-forward "\n")
    (insert "\
\\usepackage[latin1]{inputenc}\n\
\\usepackage[T1]{fontenc}\n\
\\usepackage[right]{eurosym}% Use as \EUR{1\,075}.\n\
\\usepackage{amsmath,amssymb}\n\
\\usepackage[frenchb,english]{babel}\n\
%\\usepackage[all]{xy}\n"))))))

Pour avoir une nouvelle fenêtre XEmacs (tout en restant dans le même processus), je tape F5-2 (normalement, c'est C-x 5 2).

(global-set-key [f5] (key-binding "\C-x5") )

Pour taper certains accents, s'ils ne sont pas sur le clavier : la syntaxe est F8 accent lettre, par exemple F8 , c pour ç.

(load "iso-insert")
(global-set-key [f8] (key-binding "\C-x8") )

Quand on utilise les touches PageUp et PageDown pour se déplacer dans un fichier, on ne peut pas se retrouver à la première ou à la dernière ligne du fichier. Je corrige ce comportement.

; Beau difilememnt.. sans beeps (toy)
(defun toy-scroll-up (&optional n)
  (interactive "p")
  ( next-line (* (or n 1)
                 (- (window-height) next-screen-context-lines ))))
(defun toy-scroll-down (&optional n)
  (interactive "p")
    ( previous-line (* (or n 1)
                       (- (window-height) next-screen-context-lines ))))
(fset 'scroll-down 'toy-scroll-down)
(fset 'scroll-up 'toy-scroll-up)

Le correcteur orthographique (par défaut, il ne reconnait que l'anglais).

; Correcteur orthographique
(setq ispell-dictionary-alist
     '((nil "[A-Za-z]" "[^A-Za-z]" "[']" nil ("-B") nil)
       ("english" "[A-Za-z]" "[^A-Za-z]" "[']" nil ("-B") nil)
;       ("francais" "[A-Za-z]" "[^A-Za-z]" "[`'^-]" t nil nil)
       ("francais" "[A-Za-zÀÂÆÇÈÉÊËÎÏÔÙÛÜàâæçèéêëîïôùûü]" "[^A-Za-zÀÂÄÆÇÈÉÊËÎÏÔÖÙÛÜàâäæçèéêëîïôöùûü]" "[---']" t nil "~list")
       ))
(setq ispell-dictionary "francais")
(autoload 'ispell-word "ispell"
  "Check the spelling of word in buffer." t)
(global-set-key "\e$" 'ispell-word)
(autoload 'ispell-region "ispell"
  "Check the spelling of region." t)
(autoload 'ispell-buffer "ispell"
  "Check the spelling of buffer." t)
(autoload 'ispell-complete-word "ispell"
  "Look up current word in dictionary and try to complete it." t)
(autoload 'ispell-change-dictionary "ispell"
  "Change ispell dictionary." t)
(autoload 'ispell-message "ispell"
  "Check spelling of mail message or news post.")
(setq ispell-program-name "/usr/bin/aspell")

On peut aussi rajouter une interface à Edict (M-_ pour traduire un mot japonais, qu'il faut préalablement sélectionner).

; Dictionnaire japonais
(autoload 'edict-search-english "edict"
  "Search for a translation of an English word")
(global-set-key "\e*" 'edict-search-english)
(autoload 'edict-search-kanji "edict"
  "Search for a translation of a Kanji sequence")
(global-set-key "\e_" 'edict-search-kanji)
(autoload 'edict-insert "edict" "Insert the last translation")
(global-set-key "\e+" 'edict-insert)
;(setq *edict-files* "~/gnu/Linux/lib/Nihon/")
(setq edict-dictionaries '( "/usr/local/lib/Nihon/edict"
  "/usr/local/lib/Nihon/enamdict" "/usr/local/lib/Nihon/compdic"))

XEmacs ne reconnait pas tout seuls les fichiers en UTF8 : on peut lui dire explicitement que tous les fichiers sont en UTF8 (à utiliser avec beaucoup de prudence, car tous les fichiers ne sont pas en UTF8, loin de là : on peut mettre cette ligne dans un fichier et demander à XEmacs de lire ce fichier quand c'est nécessaire).

(set-file-coding-system-for-read 'utf-8)

vim

Mon fichier de configuration de vim (le clone de vi que l'on obtient quans on appelle vi) contient :

set paste
set ignorecase

LaTeX

Je stocke mes macros dans un répertoire ~/.texmf

cd
mkdir .texmf
cd .texmf

mkdir tex
cd tex
ln -s ../../tex/inputs generic
cd ..

mkdir bibtex
cd bibtex
ln -s ../../tex/inputs bst
cd ..

Dans le fichier /usr/share/texmf/web2c/texmf.cnf, je modifie les lignes suivantes.

HOMETEXMF = $HOME/.texmf
%TEXMF = !!$TEXMFMAIN
TEXMF = {$HOMETEXMF,!!$TEXMFMAIN}

(ne pas oublier de retirer "original" dans la première ligne du fichier)

On peut alors mettre les abses de données à jour :

mktexlsr

LaTeX

J'utilise parfois des fontes TTF. En particulier Cyberbit (une fonte Unicode, contenant tous les caractères asiatiques dont j'ai besoin)

ftp://ftp.netscape.com/pub/communicator/extras/fonts/windows/

Arial Unicode MS (la fonte Unicode de Microsoft, très complète, mais qui n'est plus disponible gratuitement -- mais j'en ai une vieille copie).

arialuni.ttf

Les fontes Kochi (japonaises) (on pourrait aussi utiliser les fontes msgothic et msmincho de Microsoft)

kochigothic.ttf
kochimincho.ttf

La fonte code2001 (une fonte unicode, très complète au niveau des caractères non asiatiques).

code2001.ttf

La fonte Bookman Old Style (je ne sais pas d'où elle vient ni quelle est sa licence -- il y en a aussi une version PostScript dans TeXLive), que j'utilise pour mon courrier.

bookosbi.ttf
bookos.ttf
bookosb.ttf
bookosi.ttf

La fonte lucidablackletter.ttf

perl ~/public_html/LaTeX/FontInstall/fontinstall.pl --name=lucidablackletter --roman=lucidablackletter.ttf --texmf=/usr/share/texmf

Pendant qu'on y est, on peut aussi installer les autres fontes de Microsoft, qui ne sont plus librement disponibles (mais on peut toujours les trouver, car l'ancienne licence autorisait leur redistribution). En particulier, il m'est déjà arrivé d'utiliser la fonte Comic.

andalemo.ttf
arialbd.ttf
arialbi.ttf
ariali.ttf
arial.ttf
ariblk.ttf
comicbd.ttf
comic.ttf
courbd.ttf
courbi.ttf
couri.ttf
cour.ttf
georgiab.ttf
georgiai.ttf
georgia.ttf
georgiaz.ttf
impact.ttf
timesbd.ttf
timesbi.ttf
timesi.ttf
times.ttf
trebucbd.ttf
trebucbi.ttf
trebucit.ttf
trebuc.ttf
verdanab.ttf
verdanai.ttf
verdana.ttf
verdanaz.ttf
webdings.ttf

Pour choisir les fontes que l'on veut installer parmi les millier qui trainent sur Internet, on peut procéder ainsi. (Pour les fontes textuelles, il est bon de se limiter à celles qui sont complète, i.e., qui contiennent tous les caractères accentués dont on peut avoir besoin en français.)

for i in *.ttf
do
  ftstrpnm -p 50 $i "Coucou ! Mémoire, uræus." | pnmtopng > $i.png
done

On reconnait facilement les fontes utilisables pour le texte normal. On a parfois besoin de fontes dans lesquelles chaque caractère a la même taille : on peut les repérer ainsi.

for i in *.ttf
do
  echo $i `ttf2afm $i | grep -i IsFixedPitch` | grep -i true
done | less

(En fait, il y en a très peu...)

J'installe ces fontes à l'aide de la commande

perl fontinstall.pl --texmf /usr/share/texmf/

pour les fontes non-unicode et

perl font_install_unicode.pl

pour les fontes unicode.

Nous avons déjà vu à quoi ressemble l'en-tête d'un fichier LateX dans la partie sur XEmacs.

Omega est une version multilingue de LaTeX, qui utilise Unicode. On le lance avec la commande "lambda". Ca marche très bien, à un gros détail près : l'utilitaire ovp2ovf, utiliser lors de l'installation de nouvelles fontes pour Omega, ne marche pas. J'en reprends donc une vieille version (celle de TeXLive6).

mv /usr/bin/ovp2ovf /usr/bin/ovp2ovf.bug
cp /home/zoonek/spool/JUSSIEU/spool/OK/Omega/ovp2ovf /usr/bin/ovp2ovf

J'installerais bien TeXLive (c'est une distribution de TeX avec TOUT ce que l'on peut vouloir), mais il occuppe deux CDs alors qu'il reste à peine 800 Mo sur ma partition /...

ftp://ftp.loria.fr/ctan/systems/texlive/Images/texlive7-20020604-cd1.iso.bz2
ftp://ftp.loria.fr/cta/systems/texlive/Images/texlive7-20020604-cd2.iso.bz2

ConTeXt est un autre remplacement de LaTeX (toujours basé sur TeX, donc le résultat est de qualité). Il est beaucoup plus configurable que LaTeX (il est très facile, et même vivement conseillé, de redéfinir les têtes de chapitres, de sections, etc.) et s'interface très bien avec MétaPost (pour faire certains dessins) et PDF. Le seul problème, c'est que la gestion des mathématiques n'est pas aussi évoluée qu'avec LaTeX : il manque amsmath. Néanmoins, si on n'a pas de mathématiques à taper, ou très peu, c'est mieux que LaTeX.

Il arrive que LaTeX plante car il n'a pas suffisemment de mémoire (la quantité maximale de mémoire que TeX peut utiliser est fixée au départ). On peut y remédier en utilisant hugelatex à la place de latex ou en modifiant le fichier de configuration de LaTeX, texmf.conf puis en recréant les formats (*.fmt). Je ne l'ai pas fait, mais pour ceux que cela intéresse, voici une copie des notes que j'ai prises la dernière fois (fin 2001).

mkdir -p $HOME/g u/`uname`/lib/texmf/web2c
cd $HOME/gnu/`uname`/lib/texmf/web2c
cp /usr/share/texmf/web2c/* .
#cp `locate texmf.cnf | head -1` .

vi texmf.cnf

TEXMFMAIN  = /share/nfs/users1/umr-tge/zoonek/gnu/Linux/lib/texmf
TEXMFIS    = /usr/share/texmf
TEXMFLOCAL = /usr/share/texmf.local
TEXMFTEXLIVE = /share/nfs/i686/local/texlive4/texmf
TEXMFCJK   = /share/nfs/users1/umr-tge/zoonek/gnu/Linux/lib/texmf.CJK
TEXMFPS   = /share/nfs/users1/umr-tge/zoonek/gnu/Linux/lib/texmf.PS
TEXMFTTF   = /share/nfs/users1/umr-tge/zoonek/gnu/Linux/lib/texmf.TTF
HOMETEXMF  = $HOME/.texmf

TEXMF = {!!$HOMETEXMF,!!$TEXMFCJK,!!$TEXMFTTF,!!$TEXMFPS,!!$TEXMFMAIN,!!$TEXMFIS,!!$TEXMFLOCAL,!!$TEXMFTEXLIVE}

main_memory = 4000000 % words of inimemory available; also applies to inimf&mp
hash_extra = 15000
pool_size = 500000
string_vacancies = 45000
max_strings = 55000
pool_free = 47500
nest_size = 500     % simultaneous semantic levels (e.g., groups)
param_size = 1500   % simultaneous macro parameters
save_size = 5000    % for saving values outside current group
stack_size = 1500   % simultaneous input sources
font_mem_size = 500000

perl -p -i.bak -e 's/(([\w*-]+)\.ini)/-mltex $1/; s/-mltex // if m/omega/;' fmtutil.cnf
texhash
fmtutil --all
mpost -ini mpost.ini

(Ce qui suit ne concerne plus la mémoire)
  
-----------------

mkdir -p $HOME/gnu/`uname`/lib/texmf/tex/generic/
cp QED.sty $HOME/gnu/`uname`/lib/texmf/tex/generic/

-----------------

tar zxvf t1utils.tar.gz
cd t1utils/
./configure --prefix=$HOME/gnu/`uname`/
make
make install

----------------

tar zxvf cjk-current.tar.gz
cd icjk-current/
mkdir -p ~/gnu/`uname`/lib/texmf.CJK/tex/generic/Wadalab
cp -r texinput/* ~/gnu/`uname`/lib/texmf.CJK/tex/generic
cp contrib/wadalab/*.fd ~/gnu/`uname`/lib/texmf.CJK/tex/generic/Wadalab
mkdir ~/gnu/`uname`/lib/texmf.CJK/dvips/config
cp contrib/wadalab/wadalab.map ~/gnu/`uname`/lib/texmf.CJK/dvips/config

cd ..
mkdir Wadalab
cd Wadalab
for i in ../got* ../mar* ../min* ../sym*
do
  tar zxvf $i
done
#cp ../wftodm.c .
#recode ibmpc..latin1 wftodm.c
#patch <../cjk-current/contrib/wadalab/DNP.doc

make wftodm
wftodm -FontBase dg wadalab-sym/jis*.ps wadalab-gothic-0-13/goth-*.ps
wftodm -FontBase dm wadalab-sym/jis*.ps wadalab-mincho-0-12/min-*.ps
wftodm -FontBase mc wadalab-sym/jis*.ps wadalab-mincho-0-8/min-*.ps
wftodm -FontBase mr wadalab-sym/jis*.ps wadalab-maru-0-8/maru-*.ps
wftodm -FontBase mc2 wadalab-mincho-1-8/min*.ps
wftodm -FontBase mr2 wadalab-maru-1-8/maru*.ps

for i in *.afm
do
  afm2tfm $i
done

for i in *pfa
do
  t1binary $i > $i.pfb
done

rename 's/\.pfa\.pfb$/\.pfb/' *.pfb

mkdir -p ~/gnu/`uname`/lib/texmf.CJK/fonts/type1/
mv *.pfb ~/gnu/`uname`/lib/texmf.CJK/fonts/type1/
mkdir -p ~/gnu/`uname`/lib/texmf.CJK/fonts/tfm
mv *.tfm ~/gnu/`uname`/lib/texmf.CJK/fonts/tfm

vi $HOME/.dvipsrc
  p +Wadalab.map

echo Vérifications
  cd ../cjk-current/examples
  cp JIS.tex JIS1.tex
  perl -p -i -e 's/^.begin.CJK.*/\\begin{CJK*}\[dnp]{JIS}{maru}/' JIS1.tex
  latex JIS1 ; dvips -o JIS1.ps JIS1.dvi
  cp JIS.tex JIS2.tex
  perl -p -i -e 's/^.begin.CJK.*/\\begin{CJK*}\[dnp]{JIS}{min}/' JIS2.tex
  latex JIS2 ; dvips -o JIS2.ps JIS2.dvi
  cp JIS.tex JIS3.tex
  perl -p -i -e 's/^.begin.CJK.*/\\begin{CJK*}\[dnp]{JIS}{goth}/' JIS3.tex
  latex JIS3 ; dvips -o JIS3.ps JIS3.dvi

---------------------
Je n'utilise pas Free Type 2 mais Free Type 1 (je ne trouve pas de ttf2pk avec FT2)
tar zxvf freetype-current.tar.gz
tar zxvf freetype1-contrib-current.tar.gz
cd freetype-current/
./configure --prefix=$HOME/gnu/`uname`/
make
make install

tar zxvf ../freetype1-contrib-current.tar.gz
cd freetype1-contrib-current/ttf2pk
./configure --prefix=$HOME/gnu/`uname`/ --with-kpathsea-dir=/usr/lib --with-kpathsea-include=/usr/include --with-kpathsea-lib=/usr/lib
NE PAS FAIRE ATTENTION AU MESSAGE DISANT QU'IL N'UTILISERA PAS KPATHSEA...
cp -r ../freetype1-contrib-current/ttf2pk/ .
make
make install
  Je ne sais pas où il faut installer le fichier T1-WGL4.enc
cp **/T1-WGL4.enc ~/gnu/`uname`/share/texmf/dvips/base/
texhash

Vérifier que ttf2pk utilise bien kpathsea
ttf2pk --version

--
FreeType 2 peut s'installer ainsi :
tar zxvf freetype-2.0.1.tar.gz
cd freetype
make setup CFG=--prefix=$HOME/gnu/`uname`/
make
make install
--

Dans texmf.cnf, rajouter TTF2PKINPUTS
% TrueType outline fonts.
TTFONTS = .;$TEXMF/fonts/truetype//
TTF2PKINPUTS = .;$TEXMF/fonts/truetype//

----------

Fontes TTF Unicode

locate Unicode.sfd
ttf2tfm cyberbit.ttf cyberb@/share/nfs/share/scratch/i686/texlive5/texmf/ttf2pk/Unicode@ |
  tail -1 >ttfonts.map

TTF=$HOME/gnu/`uname`/lib/texmf.TTF
mkdir -p $TTF/fonts/truetype
mkdir -p $TTF/fonts/tfm
cp cyberbit.ttf $TTF/fonts/truetype
cp *tfm $TTF/fonts/tfm
cp ttfonts.map $TTF/fonts/truetype/cyberbit.map
rm $TTF/fonts/truetype/ttfonts.map
cat $TTF/fonts/truetype/*.map > $TTF/fonts/truetype/ttfonts.map

Rajouter $TTF dans texmf.cnf

mktexlsr
(ou texhash)

Vérifier que l'on peut bien compiler UTF8.tex

Pour pdftex (ca ne marche pas très bien, je préfère l'éviter pour le moment...) :

mkdir -p /share/nfs/users1/umr-tge/zoonek/gnu/Linux/lib/texmf.TTF/pdftex/config/
cp /usr/share/texmf/pdftex/config/pdftex.cfg $HOME/gnu/`uname`/lib/texmf.TTF/pdftex/config/

--
Remarque : on peut précompiler les fontes de la manière suivante

PS  = $(patsubst %.tex,%.ps,  $(TEX))
GIF = $(patsubst %.tex,%.gif, $(TEX))

TFM  = $(wildcard *.tfm)
BASE = $(patsubst %.tfm,%, $(TFM))

all:
        for i in *.html ; do perl 2.pl $$i > $$i.tex ; latex $$i.tex ; done
        perl 2.kana.pl niveau_kana.html > niveau_kana.html.tex
        latex niveau_kana.html.tex

first:
        ttf2tfm Cyberbit.ttf cyberb@Unicode@ | tail -1 >ttfonts.map

tfm:
        rm -f *.html.tex *pk *.tfm *.dvi *.ps *.aux *.log *\~

pk: 720 1037 600 657 360 1493

720:
        for i in $(BASE) ; do ttf2pk -q $$i 720 ; done

600:
        for i in $(BASE) ; do ttf2pk -q $$i 600 ; done

657:
        for i in $(BASE) ; do ttf2pk -q $$i 657 ; done

360:
        for i in $(BASE) ; do ttf2pk -q $$i 360 ; done

1037:
        for i in $(BASE) ; do ttf2pk -q $$i 1037 ; done

1493:
        for i in $(BASE) ; do ttf2pk -q $$i 1493 ; done

clean:
        rm -f *.tfm *pk *.log *.aux *.log *.dvi *.ps *.html.tex ttfonts.map *\~

-------------

cp -r ~/tmp/TTF_OK TTF/
cd TTF
for i in **/*(/)
do
  (
  cd $i
  make FONTINSTALL=$HOME/fontinstall.pl
  )
done &

texhash

-------------

Si j'installe quelques fontes PostScript :

mkdir -p $HOME/gnu/`uname`/lib/texmf.PS/dvips/config/

cp /share/nfs/i686/local/share/texmf.local/dvips/config/config.ps $HOME/gnu/`uname`/lib/texmf.PS/dvips/config/config.ps


--------------

passage à texlive5

Dans texmf.cnf
  TEXMFTEXLIVE = /share/nfs/i686/local/texlive5/texmf

cp /share/nfs/share/scratch/i686/texlive5/texmf/web2c/*pool .
fmtutil --all
mpost -ini mpost.ini

NE PAS OUBLIER :

  mf -ini mf.ini

Perl

Installer tous les modules dont le nom contient Perl, sauf ceux pour lesquels ça plante (s'il y a un seul problème, il n'installe rien) : perl-vision, perl-menu, perl-hires (pour celui-là, le problème vient du fait qu'il y a deux RPM différents, il suffit d'en prendre un).

Je trouve pratique d'avoir une copie locale de CPAN. En fait, on n'a pas besoin de tout (sur CPAN, il y a aussi les vieilles versions de tous les modules). R. Schwartz nous explique comment faire :

http://www.perlmonks.org/index.pl?node_id=188527
http://www.stonehenge.com/merlyn/LinuxMag/col42.html

Voici le code.

#!/usr/bin/perl -w
use strict;
$|++;

### CONFIG

my $REMOTE = "http://www.cpan.org/";
# my $REMOTE = "http://fi.cpan.org/";
# my $REMOTE = "http://au.cpan.org/";
# my $REMOTE = "file://Users/merlyn/MIRROR/CPAN/";

## warning: unknown files below this dir are deleted!
my $LOCAL = "/Users/merlyn/MIRROR/MINICPAN/";

my $TRACE = 1;

### END CONFIG

## core -
use File::Path qw(mkpath);
use File::Basename qw(dirname);
use File::Spec::Functions qw(catfile);
use File::Find qw(find);

## LWP -
use URI ();
use LWP::Simple qw(mirror RC_OK RC_NOT_MODIFIED);

## Compress::Zlib -
use Compress::Zlib qw(gzopen $gzerrno);

## first, get index files
my_mirror($_) for qw(
                     authors/01mailrc.txt.gz
                     modules/02packages.details.txt.gz
                     modules/03modlist.data.gz
                    );

## now walk the packages list
my $details = catfile($LOCAL, qw(modules 02packages.details.txt.gz));
my $gz = gzopen($details, "rb") or die "Cannot open details: $gzerrno";
my $inheader = 1;
while ($gz->gzreadline($_) > 0) {
  if ($inheader) {
    $inheader = 0 unless /\S/;
    next;
  }

  my ($module, $version, $path) = split;
  next if $path =~ m{/perl-5};  # skip Perl distributions
  my_mirror("authors/id/$path", 1);
}

## finally, clean the files we didn't stick there
clean_unmirrored();

exit 0;

BEGIN {
  ## %mirrored tracks the already done, keyed by filename
  ## 1 = local-checked, 2 = remote-mirrored
  my %mirrored;

  sub my_mirror {
    my $path = shift;           # partial URL
    my $skip_if_present = shift; # true/false

    my $remote_uri = URI->new_abs($path, $REMOTE)->as_string; # full URL
    my $local_file = catfile($LOCAL, split "/", $path); # native absolute file
    my $checksum_might_be_up_to_date = 1;

    if ($skip_if_present and -f $local_file) {
      ## upgrade to checked if not already
      $mirrored{$local_file} = 1 unless $mirrored{$local_file};
    } elsif (($mirrored{$local_file} || 0) < 2) {
      ## upgrade to full mirror
      $mirrored{$local_file} = 2;

      mkpath(dirname($local_file), $TRACE, 0711);
      print $path if $TRACE;
      my $status = mirror($remote_uri, $local_file);

      if ($status == RC_OK) {
        $checksum_might_be_up_to_date = 0;
        print " ... updated\n" if $TRACE;
      } elsif ($status != RC_NOT_MODIFIED) {
        warn "\n$remote_uri: $status\n";
        return;
      } else {
        print " ... up to date\n" if $TRACE;
      }
    }

    if ($path =~ m{^authors/id}) { # maybe fetch CHECKSUMS
      my $checksum_path =
        URI->new_abs("CHECKSUMS", $remote_uri)->rel($REMOTE);
      if ($path ne $checksum_path) {
        my_mirror($checksum_path, $checksum_might_be_up_to_date);
      }
    }
  }


  sub clean_unmirrored {
    find sub {
      return unless -f and not $mirrored{$File::Find::name};
      print "$File::Find::name ... removed\n" if $TRACE;
      unlink $_ or warn "Cannot remove $File::Find::name: $!";
    }, $LOCAL;
  }
}

Il y a d'autres manières de synchroniser les fichiers qui sont sur deux machines différentes, par exemple rsync ou unison.

Pour que cette copie de CPAN soit reconnue, lancer

perl -MCPAN -e shell

et répondre aux questions. En particulier,

Policy on building prerequisites (follow, ask or ignore)? [ask] follow

Please enter your CPAN site: [] file:///home/zoonek/spool/CPAN
Enter another URL or RETURN to quit: []
New set of picks:
  file:///home/zoonek/spool/CPAN/

On peut dès lors installer des modules :

perl -MCPAN -e shell
install Foo::Bar

zsh

On change le shell par défaut pour /bin/zsh.

chsh zoonek

Zsh est un shell à la fois plus puissant et plus versatile que bash (si on veut, on peut même lui demander de se comporter exactement comme un vieux csh).

Voici certains des avantages de zsh par rapport à bash (en fait, je crois que bash permet maintenant de faire à peu près tout ça, mais la syntaxe n'est pas la même).

La complétion automatique des arguments d'une commande est plus configurable (sous bash, par défaut, il propose uniquement les noms de fichiers du répertoire courrant). A zsh, on peut dire que le premier argument d'une commande comme xargs, nice ou nohup est une autres commande, que l'argument d'une commande comme ssh ou slogin est le nom d'une machine (et on lui dit sur quelles machines on a l'habitude de se logguer), que l'argument de la commande unset est le nom d'une variable d'environement, que le premier argument de la commande tar est "xvf", "xcf", "zxvf" ou "zcvf", que le second argument est un fichier *.tgz ou *.tar ou *.tar.gz, que le troisième argument est souvent un répertoire (ou à défaut, un ou des fichiers), etc.

Lorsque l'on utilise la touche de tabulation sous bash, il propose les différentes complétions possibles, mais s'il y en a plusieures, il va absolument vouloir que l'on tape la lettre suivante : Zsh comprend un peu mieux la fénéantise de l'utilisateur que je suis -- il suffit d'appuyer encore une fois sur la touche de tabulation, et il propose le premier choix (puis le second, etc.), de sorte que l'on n'a à appuyer sur aucune autre touche.

Zsh permet de faire beaucoup de choses sans la commande find, par exemple

xmms **/*.mp3(m-2)

donne à xmms les fichiers mp3 datant d'il y a au plus deux jours et contenus dans le répertoire courrant ou dans un de ses sous-répertoires. Autre exemple :

rename 'y/A-Z/a-z/' **/*(.)

renomme tous les fichiers normaux (pas les répertoires) contenus dans le répertoire courrant ou l'un de ses sous-répertoires, pour qu'ils soient en minuscules (lma commande rename n'est pas standard : c'est un script en Perl, dont le source doit être quelque part dans ce document).

Zsh permet aussi de manipuler de manière transparente des pipes nommés. Il arrive parfois que l'on écrive une suite de commandes et qu'on veuille en donner le résultat à une commande. La plupart du temps, on fait cela avec des pipes, mais si la commande en question attend plusieurs arguments, ça n'est pas possible. C'est le cas, par exemple, de la commande diff. Dans une telle situation, on peut mettre les données dans des fichiers intermédiaires, qu'il ne faudra pas oublier d'effacer après (en espérant qu'ils ne soient pas démesurément gros). Mais on peut aussi utiliser des pipes nommés (pour la commande qui les reçoit en argument, c'est comme un fichier, mais quand on le lit, on ne peut pas revenir en arrière).

diff <( GET http://foo.com/ ) <( GET http://bar.com )

Le manuel donne des exemples du genre

paste <(cut -f1 file1) <(cut -f3 file2) |
  tee >(process1) >(process2) >/dev/null

On a aussi des boucles, par exemple une boucle for.

for (( i=1 ; i<=10 ; i++ ))
do
  echo $i
done

On peut aussi faire des calculs arithmériques.

i=1
echo $(( (i+17 )/3 ))

Java

Java est un langage soit-disant portable, mais il y a quand-même des différences entre les divers JRE : on va en installer plusieurs.

Il y a plein de sigles en Java. Un JRE (Java Run-time Environment), c'est ce qu'il faut pour exécuter des programmes en Java (déjà compilés). Un JDK (Java Development Kit), c'est ce qu'il faut pour écrire des programmes en Java (un compilateur, avec bien sûr aussi un JRE). Un IDE (Integrated Desktop Environment), c'est un cliquodrome, construit autour d'un éditeur de textes, pour aider à l'écriture des programmes en Java (ou en un autre langage) -- ce n'est pas nécessaire, un éditeur de texte rudimentaire suffit. J2SE, J2EE signifient Java 2 Standard Edition, Java 2 Enterprise Edition.

Les numéros de version sont aussi troublants : c'est bien Java 2, mais le JDK a pour version 1.4.

Commençons par installer le JDK de Sun.

su -p
cd /usr/local/lib
~/src/Java_Sun/j2sdk-1_4_0_01-linux-i586.bin

Il manque toutefois quelque chose de très important : la documentation. Il y a bien quelques fichiers *.zip sur le site de Sun, mais ils ne contiennent que quelques tutoriels (pas tous), et ne contiennent pas la documentation des API. On ramène donc tout, un peu violemment.

wget -r -l 0 -np -nc -x -k -Q 2000M -R pdf,zip -D java.sun.com http://java.sun.com/docs/

http://java.sun.com/j2se/1.4/docs/

(je n'ai pas encore vraiment réussi)

Pendant qu'on y est, on peut aussi le livre de B. Eckel, Thinking in Java (qui est aussi disponible en librairies).

http://www.mindview.net/Books/TIJ/

On pourrait aussi installer le JDK de Blackdown.

mozilla http://www.blackdown.org/
./blackdown_j2sdk-1.4.1-beta-linux-i586.bin

On peut aussi installer une plus vieille version du JDK de Sun (c'est parfois nécessaire à cause des problèmes d'incompatibilité...)

(Je crois qu'il existe aussi un autre JDK, de chez IBM, mais leur site Web est absolument incompréhensible.)

Pour passer d'un JDK à un autre, je crée un script qui fixe les variables d'environement PATH et CLASSPATH.

#! /usr/local/bin/perl -w
use strict;

# Liste of available JDKs
my %choices = (
  1.3 => { DIR => '/usr/local/lib/jdk1.3',
           CLASSPATH => [],
       },
  1.4 => { DIR => '/usr/local/lib/j2sdk1.4.0_01',
           CLASSPATH => [],
       },
);

# Usage
die "usage $0 [". join('|', (keys %choices)) ."]"
  unless defined($ARGV[0]) and exists $choices{$ARGV[0]};

# Setting the environment variables
$ENV{PATH} = $choices{$ARGV[0]}->{DIR} ."/bin:".
             $choices{$ARGV[0]}->{DIR} ."/lib:".
           $ENV{PATH};
$ENV{CLASSPATH} = $ENV{CLASSPATH} || "";
$ENV{CLASSPATH} = join( ':',  @{ $choices{$ARGV[0]}->{CLASSPATH} },
                              glob( $choices{$ARGV[0]}->{DIR} . "/lib/*.jar" ),
                              glob( $choices{$ARGV[0]}->{DIR} . "/jre/lib/*.jar" ),                      )
                  .":".
                $ENV{CLASSPATH};
my $shell = $ENV{SHELL} || "/bin/sh";

# Printing the environment variables
foreach (qw/SHELL PATH CLASSPATH/) {
  print STDERR "$_:\n";
  foreach (split(':', $ENV{$_})) {
    print STDERR "  $_\n";
  }
}


# Forking
system $shell;

print STDERR "WARNING: The java environment variables are no longer set!\n";
print STDOUT "WARNING: The java environment variables are no longer set!\n";

On peut vérifier que cela fonctionne. Voici un petit programme en Java.

/** Premier programme en Java
 * (ceci est un commentaire javadoc, qui va donc
 * se retrouver dans la documentation
 */
class HelloWorld {
  public static void main (String args []) {
    System.out.println("Hello World");
    System.out.println("Number of arguments: " + args.length);
    for(int i=0; i<args.length; i++) {
      System.out.println("  Argument " + i + " = " + args[i]);
    }
  }
}

Après avoir fixé les variables d'environement

JAVA 1.4

on le compile

javac HelloWorld.java

et on l'exécute

java HelloWorld

Si on veut toujours utiliser le même JDK, on peut appeler fixer les variables d'environement une bonne fois pour toutes dans le ~/.xsession.

Configuration

Il y a quelques petites choses à effectuer à chaque fois que je me loggue. Par exemple, changer la variable PATH (on pourrait faire ça directement dans le shell, mais j'ai parfois besoin que les variables d'environement soient fixées sans qu'il y ait de shell, pour les applications qui seraient lancées directement par le gestionnaire de fenêtres). Il faut aussi changer certaines touches du clavier (il y a des touches inutiles que l'on va pouvoir réaffecter à des caractères courrants mais pénibles à taper). Il y a aussi certaines applications à lancer (et à tuer lorsque je me déloggue), par exemple kinput2 (si on veut pouvoir taper du texte en japonais : voir plus haut, lors de l'installation d'XEmacs).

Je vais aussi abandonner KDE pour un gestionnaire de fenêtres plus spartiate : sawfish. Il présente un léger défaut : par défaut, il ne permet pas de visualiser le bureau virtuel (mais en fait, si on arrive à se limiter à 4 ou 5 bureaux virtuels, ce n'est pas trop génant -- sin on en a besoin, on peut ajouter un "pager" (il s'appelle spager), qui permet de les visualiser).

Pour configurer sawfish, on clique sur le bouton du milieu, et on joue avec les menus. En particulier, je configure les raccourcis-clavier.

C-A-T konsole --font '-b&h-lucidatypewriter-medium-r-normal-sans-24-240-75-75-m-140-iso8859-15' &
C-A-K kterm -sb -sl 2048 -km euc -fl '-*-fixed-medium-r-normal--24-*,-*-gothic-medium-r-normal--24-*,-*-mincho-medium-r-normal--24-*' -e xjdic_sa &
C-A-S-left  changement de bureau virtuel
C-A-S-right changement de bureau virtuel
C-A-S-q     quitter sawfish
C-A-S-down  met la fenêtre courrante à l'arrière-plan (déjà configuré ainsi)

(Rectification : pour la fonte de konsole, il faut en lancer une, faire un clic droit sur la fenêtre, puis sur "Police", choisir la police, puis cliquer sur "Enregistrer la configuration".)

Quand on choisit l'environement graphique, Mandrake va lancer les scripts startkde, startgnome, startsawfish, etc. On va donc partir d'un de ces scripts, le copier dans ~/.xinitrc, et le modifier. Eh bien non, ça ne marche pas. Et avec ~/.xsession non plus.

C'est portant simple... kdm lance /etc/X11/Xsession, dont la lecture est très instructive. En voici quelques extraits (un peu simplifiés).

# read the user (~/.i18n) or system-wide (/etc/sysconfig/i18n) i18n settings
. /etc/profile.d/lang.sh

xsetroot -solid "#21449C"
  
AGENT=$(type -p ssh-agent)
SSH_AGENT="$AGENT --"

xrdb -merge /etc/X11/Xresources
xrdb -merge $HOME/.Xresources
xrdb -merge $HOME/.Xdefaults
    
# userxkbmap=$HOME/.Xkbmap.$DISPLAY
# [ ! -r "$userxkbmap" ] && userxkbmap=$HOME/.Xkbmap
# setxkbmap `cat $userxkbmap`

usermodmap=$HOME/.Xmodmap.$DISPLAY
xmodmap $usermodmap

export BROWSER=`which mozilla`
export HELP_BROWSER="$BROWSER"

# Pour mettre à jour les menus des divers
# gestionnaires de fichiers, de manière qu'ils soient
# à jour et reflètent les logiciels effectivement installés.
for i in /etc/X11/xinit.d/*
do
  $i &
done

if [ -f $HOME/.desktop ]
then
  . $HOME/.desktop >/dev/null 2>&1
fi

. /etc/X11/xinit/XIM
      
# First time wizard
exec drakfw
   
if [ -x "$HOME/.xsession" ]
then
  exec $SSH_AGENT "$HOME/.xsession"
elif [ -x "$HOME/.Xclients" ]
then
  exec $SSH_AGENT "$HOME/.Xclients"
fi

C'est donc bien le fichier ~/.xsession qu'il faut créer...

Ah, j'ai trouvé : il faut le rendre exécutable...

date >> $HOME/.xsession.debug
PATH=$HOME/bin:/usr/local/bin:$PATH
Esetroot -fit ~/Wallpapers/Anime/geocities.com_desktopcandy2_hellsing.jpg
xmodmap $HOME/.Xmodmap
Eterm --font '-b&h-lucidatypewriter-medium-r-normal-sans-24-240-75-75-m-140-iso8859-15' &
kinput2.wnn4 &
xscreensaver &
exec /usr/X11R6/bin/sawfish

Les fichiers de configuration du shell

Dans le fichier vi /etc/profile.d/alias.sh

Enlever rm -i
Enlever aussi l'alias de "du"

Economiseur d'écran

xscreensaver-demo &

En particulier, essayer :

gflux
xlyap
superquadrics
molecule
circuit

Pour finir, je mets simplement des images qui défilent.

http://www.jwz.org/xscreensaver/faq.html#slideshow

Je modifie le ~/.xscreensaver comme suit :

splash:               False
mode:         one
selected:     0
programs:                                                                   \
  default-n:     "slideshow"  chbg -deffects 15,17,19,20                    \
                                  -speed 1 -mode maximize -randomize        \
                                -effect 1 -interval 0.02 -screensaver       \
                                -R $HOME/Wallpapers/                      \n\

Je rajoute une ligne dans le ~/.xsession :

xscreensaver &

Tablette graphique

Je me suis aussi acheté une tablette graphique (Graphire 2, USB, A6, 95 EUR, chez topachat.com).

http://www.tldp.org/HOWTO/mini/Wacom-USB-mini-HOWTO.html
http://www.tldp.org/HOWTO/Wacom-Tablet-HOWTO.html
http://www.gtk.org/%7Eotaylor/xinput/howto/xinput.html
http://www.runkel-it.de/wacom_tablet_howto-1.html

Elle s'installe sans trop de problème : le module wacom.o pour la gérer est déjà là. Il suffit de modifier le fichier de configuration d'X :

 Section "InputDevice"
    Identifier        "stylus"
    Driver    "wacom"
    Option    "Type" "stylus"
    Option    "Device" "/dev/input/event0"
    Option      "Mode" "Absolute"
EndSection
Section "InputDevice"
    Identifier        "eraser"
    Driver    "wacom"
    Option    "Type" "eraser"
    Option    "Device" "/dev/input/event0"
    Option      "Mode" "Absolute"
 EndSection
Section "InputDevice"
    Identifier        "cursor"
    Driver    "wacom"
    Option    "Type" "cursor"
    Option    "Device" "/dev/input/event0"
    Option      "Mode" "relative"
EndSection

Section "ServerLayout"
    Identifier "layout1"
    Screen     "screen1"
    InputDevice "Mouse1" "CorePointer"

    InputDevice "stylus" "AlwaysCore"
    InputDevice "eraser" "AlwaysCore"
    InputDevice "cursor" "AlwaysCore"

    InputDevice "Keyboard1" "CoreKeyboard"
EndSection

Il est peut-être nécessaire de rajouter la ligne suivante dans /etc/fstab

none /proc/bus/usb usbdevfs defaults 0 0

Il n'est peut-être pas nécessaire de créer les périphériques :

mknod /dev/input/mouse0 c 13 32
mknod /dev/input/event0 c 13 64
mknod /dev/input/event1 c 13 65
mknod /dev/input/event2 c 13 66
mknod /dev/input/event3 c 13 67

Il est nécessaire de relancer le serveur X et de rebooter la machine (on n'est pas obligé de la rebooter, mais il y a plein de choses qui se passent lorsque la machine reboote, qu'il serait compliqué de faire à la main).

Si une fenêtre apparait lorsque la machine reboote pour configurer la "souris USB" : refuser.

On peut maintenant utiliser la tablette sous Gimp : regarder les menus

Image -> Dialogs -> Input devices
Image -> Dialogs -> Device Status

Il y a d'autres programmes pour tester la tablette : xinput (je n'obtient rien d'autre qu'un message d'erreur), gsumi (je n'arrive pas à le compiler).

Installation de divers logiciels

xjdic (un dictionnaire Japonais-Anglais)

Récupérer les fichiers

xjdic23.tgz
edict
enamdict
compdic
kanjidic

Mettre les dictionnaires là où il faut.

mkdir /usr/local/lib/Nihon
cp edict enamdict compdic kanjidic /usr/local/lib/Nihon
cp vconj kanjstroke radicals.tm radkfile romkana.cnv /usr/local/lib/Nihon

Préciser, dans le source, où ils se trouvent.

perl -p -i -e 's~^\#define\s+DEFAULT_DICDIR.*~\#define DEFAULT_DICDIR \"/usr/local/lib/Nihon\"~' *.c *.h

Compiler et installer les exécutables.

make
cp exjdxgen  xjdic_cl  xjdic_sa  xjdserver  xjdxgen /usr/local/bin

Préparer les tables de hachage.

for i in edict enamdict compdic kanjidic
do
  xjdxgen /usr/local/lib/Nihon/$i
done

Ca ne marche pas : il ne trouve pas les fichiers (j'ai pourtant mis le nom du répertoire en dur dans l'exécutable...)

pczoonek% xjdic_sa
XJDIC Version 2.3 (Japanese Dictionary) Copyright J.W.Breen 1998.
  Stand-alone mode
No control file detected!
Loading Dictionary and Index files.  Please wait...
Unable to open: kanjidic

On va à nouveau préciser ce nom de répertoire dans le fichier de configuration.

kanamode
dicdir  /usr/local/lib/Nihon
kdicfile        kanjidic
dicfile edict
dicfile enamdict
dicfile compdic
kdnoshow YELUQMKZ

Maintenant, ça marche (dans une fenêtre kterm).

Pour ceux qui sont intéressés par les dictionnaires, voir dict.org (c'est un dictionnaire monolingue anglais en ligne, auquel on peut accéder par un protocole Internet ("protocole", ça veut dire quelque chose comme HTTP, mais ce n'est pas HTTP)) ou http://www.dictionary.com/Dir/Reference/Dictionaries/

chasen, ipadic, kakasi (analyseur morphologiquede phrases japonaises)

Chasen est un découpeur de phrases japonaises en mots. Ipadic est un morceau de Chasen.

tar zxvf chasen*gz
tar zxvf ipadic*gz

cd chasen*/
./configure
make
su -p
make install

cd ../ipadic*/
./configure
make
su -p
make install

Kakasi est déjà là : ce logiciel permet de trouver la prononciation d'un mot japonais (il y a aussi un module Perl du même nom).

Acroread

Ne pas le télécharger sur le site d'Adobe, mais plutôt utiliser un mirroir. On peut en trouver ici :

http://www.alltheweb.com/?cat=ftp

tar zxvf linux-506.tgz
tar zxvf jpnfonts.tgz
su -p
./INSTALL
cd JPNKIT
./INSTLANG

Ca plante, c'est prévu pour la version 5.0
d'acrobat, pas la 5.0.6

bladeenc, lame (encodeurs MP3)

En fait, on n'en a pas besoin : on a déjà un encodeur OggVorbis, format dont la qualité est (parait-il) meilleur -- car le "bitrate" est variable, il peut donc augmenter quand c'est nécessaire.

Mozilla

Mozilla est déjà installé, mais on peut vouloir ajouter quelques plugins. En particulier, flash et RealPlayer.

rp8_linux20_libc6_i386_cs2_rpm
flash_linux.tar.gz

Wine

C'est un émulateur Windows, qui peut fonctionner même si on n'a pas Windows. Je n'ai uniquement utilisé pour récupérer le contenu d'archives autoextractibles (si les archives autoextractibles contiennent un fichier ZIP, on peut les lire avec unzip (qui ne tient pas compte de la partie exécutable), mais ce n'est pas toujours le cas...)

Récupérer un RPM de Wine

http://www.winehq.com/download/

l'installer

rpm -ivh wine-cvs-unstripped-081202-1.i386.rpm

et lire l'article d'Onlamp sur le sujet :

http://www.onlamp.com/lpt/a/1222

Il suffit en fait de mettre les fichiers que les applications Windows attendent (comme je n'ai pas Windows, les fichiers seront vides, mais ça n'est pas grave).

mkdir -p /usr/local/lib/win/windows
cd /usr/local/lib/win/windows
mkdir system
touch win.ini
cd system
touch shell.dll shell32.dll winsock.dll wsock32.dll
cd ..
chown -R zoonek:zoonek .

Modifier le fichier de configuration de Wine, pour qu'il utilise ce répertoire comme répertoire Windows (par défaut, il cherche un répertoire /c/, qui n'existe bien évidemment pas).

vi /etc/wine/config

[Drive C]
"Path" = "/usr/local/lib/win"

Il faut que chaque utilisateur ait un fichier de configuration de Wine.

rm -rf ~zoonek/.wine
cp -r /etc/wine ~zoonek/.wine

Et on peut utiliser Windoze :

wine foobar.exe &

Compression, décompression

Pour manipuler ses propres fichiers, on peut utiliser tar et bzip2. (bzip2 compresse plus que gzip ou zip).

Pour les fichiers RAR (*.rar, *.r01, *.r02, etc.), on peut utiliser la commande unrar :

http://www.rarlab.com/rar_add.htm

On peut décompresser les fichiers ACE (*.ace) avec unace :

http://www.winace.com/

On peut décompresser les archives CAB avec cabextract :

http://www.kyz.uklinux.net/cabextract.php3

On peut décompresser les fichiers *.lha ou *.lhz avec lha :

http://www.infor.kanazawa-it.ac.jp/~ishii/lhaunix/

Pour d'autres fichiers (en particulier ceux qui proviennent d'un Mac), j'ai généralement moins de chance. Regarder néanmoins pkzip, unarj, et autres sur

http://freshmeat.net/browse/42/

Utilisation ludique de l'ordinateur

Gimp

C'est un logiciel :

de dessin (en fait, les dessinateurs qui utilisent l'ordinateur dessinent sur papier, scannent leur dessin, et n'utilisent l'ordinateur que pour la couleur : on peut par exemple colorier avec des couleurs unies, avec des gradients, ou à l'aérographe -- mais pour ce genre de chose, il vaut mieux avoir une tablette graphique) ;

de retouche d'image (par exemple, pour faire disparaitre les défauts sur une photo ou une image scannée, pour faire disparaitre des dominantes colorées (provoquées par l'éclairage lors de la prise de vue, par un défaut de l'appareil photo, de la pellicule, ou du scanner), pour corriger une image (en partie) sur- ou sous-exposée, pour préparer une image pour l'impression (les imprimantes, même lors de l'impression d'un livre, ne peuvent pas distinguer les tons très clairs ou les tons très sombres, on doit donc préalablement assombrir légèrement les tons les plus clairs et éclaircir les tons les plus sombres, sous peine d'avoir des surfaces complètement noires (ça ne choque pas, mais il y a une perte de détails) ou complètement blanches, laissant apparaitre le blanc du papier (là, c'est flagrant et très laid -- certains livres présentent ce défaut)), pour effacer des détails (un bouton sur votre visage, un poteau électrique au milieu d'un paysage bucolique), ajouter divers effets à une photo (virage sépia, solarisation, effet de toile, etc.)) ;

de photomontage (modifier les couleurs d'une image (rendre une orange bleue), déformer un visage (rallonger les dents pour faire ressemler le modèle à un vampire, aggrandir un sourire comme sur certaines publicités, allonger le nez de votre homme politique préféré), mélanger plusieurs photos).

Pour plus de détails, lire le livre "Grokking the Gimp" (essentiellement axé sur la retouche d'image, mais il présente les principes de base du logiciel et de la retouche d'image en général, donc il sera utile à tous), disponible gratuitement sur Internet :

http://gimp-savvy.com/BOOK/

On peut aussi en acheter une version papier.

La plupart des livres sur photoshop (enfin, tous ceux qui ont un contenu réel et ne se limitent pas à une liste des raccourcis-clavier du logiciel) sont aussi valables pour Gimp.

Un bon exercice pour comprendre la puissance du logiciel consiste à tenter d'imaginer comment ont été réalisées les images que l'on rencontre dans les magazines ou sur internet (par exemple, très simplement, les images que l'on utilise comme fond d'écran ont souvent été manipulées ainsi).

Blender

C'est un logiciel de dessin en 3D, qui permet en fait aussi de créer des animations ou des jeux. Comme il n'est pas libre (mais il va soit le devenir, soit disparaitre : la société le développant a fait faillite), il n'est pas sur le CD.

On peut le récupérer, ainsi qu'un peu de documentation, ici :

http://www.elysiun.com/
http://jmsoler.free.fr/didacticiel/blender/tutor/

Musique

Pour lire des fichiers MP3 (ou autres) :

xmms &

Pour les fichiers Midi, il y a un problème : xmms ne sait pas les lire (???). Timidity est capable de les jouer, mais il est mal configuré : dans le fichier /usr/share/timidity/timidity, les lignes suivantes ne doivent pas être commentées.

source gravis.cfg
source midia.cfg

On peut alors écouter des fichiers Midi :

timidity foo.mid

Pour coder des CD : on ne va pas utiliser le format MP3, mais plutôt le format Ogg/Vorbis, qui est un peu plus libre.

Remarque : plutôt que de tout faire à la main, comme moi, on peut directement utiliser le cliquodrome grip (qui se connecte automatiquement à une base de donnée contenant le titre et l'auteur de chaque morceau : ces informations sont rajoutées au fichier *.ogg ainsi créé).

Commençons par regarder le contenu d'un CD audio.

cdparanoia -vsQ

Voici le résultat.

cdparanoia III release 9.7 (December 13, 1999)
(C) 1999 Monty <monty@xiph.org> and Xiphophorus
  
Report bugs to paranoia@xiph.org
http://www.xiph.org/paranoia/
  
Checking /dev/cdrom for cdrom...
	Testing /dev/cdrom for cooked ioctl() interface
		/dev/scd0 is not a cooked ioctl CDROM.
	Testing /dev/cdrom for SCSI interface
		generic device: /dev/sg0
		ioctl device: /dev/scd0
		CDROM sensed: SAMSUNG CDRW/DVD SN-308B U005 
  
Checking for SCSI emulation and transport revision...
	Drive is ATAPI (using SCSI host adaptor emulation)
	NOTE: Our ATAPI/SCSI guessing algorithm will detect the
	drive type incorrectly on older kernels; please e-mail the
	output of 'cdparanoia -vQ' to paranoia@xiph.org
  
Checking for MMC style command set...
	Drive is MMC style
Verifying CDDA command set...
	Expected command set reads OK.
  
Looking at revision of the SG interface in use...
	New style SG with scatter/gather memory management
	DMA scatter/gather table entries: 256
	table entry size: 32768 bytes
	maximum theoretical transfer: 3566 sectors
	Setting default read size to 13 sectors (30576 bytes).
  
Table of contents (audio tracks only):
track        length               begin        copy pre ch
===========================================================
  1.    27180 [06:02.30]        0 [00:00.00]    no   no  2
  2.    24277 [05:23.52]    27180 [06:02.30]    no   no  2
  3.    28500 [06:20.00]    51457 [11:26.07]    no   no  2
  4.    22188 [04:55.63]    79957 [17:46.07]    no   no  2
  5.    21585 [04:47.60]   102145 [22:41.70]    no   no  2
  6.    18530 [04:07.05]   123730 [27:29.55]    no   no  2
  7.    17907 [03:58.57]   142260 [31:36.60]    no   no  2
TOTAL  160167 [35:35.42]    (audio only)

Codons maintenant un CD.

cdparanoia -vXB

On se retrouve avec plein de fichiers *.wav, très gros. on les compresse :

oggenc *.wav

On peut ensuite les effacer.

rm -f *.wav

On peut vouloir faire l'opération inverse, et transformer un fichier MP3 ou Ogg en Wav (par exemple pour le manipuler avec glame).

Pour ogg, c'est facile, c'est marqué dans le manuel.

man oggenc
man ogg123
ogg123 -d wav -f toto.wav toto.ogg

Pour MP3, c'est aussi marqué dans le manuel, mais un peu plus profondément.

man mpg123
man sox
man soxexam
mpg123  -b 10000 -s filename.mp3 | 
  sox -t raw -r 44100 -s -w -c 2 - filename.wav

Pour trouver des fichiers MP3, le plus simple est sans doute d'utiliser des logiciels de peer-to-peer, tels edonkey morpheus, audiogalaxy, Freenet, OpenNAP, Gnutella, Publius. La plupart de ces logiciels sont des spyware : ils espionnent l'utilisateur, les connections qu'il fait, les fichiers qui sont sur son disque, les programmes qu'il utilise ; ils peuvent aussi utiliser le réseau pour transférer d'autres données ; ils peuvent faires des choses auxquelles on ne s'attend peut-être pas, comme faire apparaitre des publicités ou utiliser la machine pour participer à une attaque DDOS. Comme je suis derrière un (et même deux, en fait) firewall(s), je ne peux pas utiliser ce genre de logiciel.

Il existe aussi quelques moteurs de recherche qui référencent les MP3.

http://www.yourmp3.net/search.php?By=Artist&String=Lifehouse
http://www.mp3raid.com/archive/archive/l/7/
http://www.alltheweb.com/?cat=mp3&cs=iso-8859-1&ftype=4&q=

CD

On peut graver des fichiers MP3 (ou ogg) sur un CD audio.

lynx file:///usr/share/doc/HOWTO/HTML/en/mini/MP3-CD-Burning/index.html

for i in *.mp3
do 
  mpg123 -w "$i.wav" "$i"
done

Vérifier que les fichiers sont bien en 16 bit, stereo 44100 Hz.

file *.wav

Graver

cdrecord -v dev=0,0,0 -dao *.wav

Si ça ne marche pas, essayer

cdrecord -v dev=0,0,0 -dao -pad *.wav

Radio

On peut écouter des radios sur le Web. Certaines sont diffusées au format MP3 : on peut les récupérer (par exemple pour les écouter plus tard, quand on n'est plus relié au Web) avec streamripper.

http://streamripper.sourceforge.net/index.php

On trouve des listes de radios sur le site de Shoutcast.

http://www.shoutcast.com/

On peut par exemple récupérer les fichiers ainsi

GET 'http://www.shoutcast.com/sbin/shoutcast-playlist.pls?rn=806115&file=filename.pls' | 
  perl -n -e 's/.*http/http/&&print' | head | xargs ./streamripper

(Il y a parfois des erreurs du genre "mpglib error" : ce sont des erreurs lors du décodage du flux MP3. On peut les ignorer, car streamripper se contente de décoder le flux pour trouver des silences et ainsi séparer les morceaux : dans le pire des cas, on se retrouvera avec un morceau coupé en deux.)

Certaines radios diffusent en Real Audio : on ne peut pas (pour l'instant) les récupérer directement, mais on peut utiliser realplyer, qui va décoder le flux audio et l'envoyer sur (croit-il) la carte son, et vsound, qui détourne ce qui est envoyé sur la carte son et le met dans un fichier.

http://osl.iu.edu/~tveldhui/radio/

Signalons aussi que vsound a eu quelques problèmes avec les lois américaines sur le copyright : dans certains pays, il est répréhensible d'écouter la radio en différé.

Voici comment je récupère l'émission de Radio 4 "A book at bedtime" (pour ceux qui ne connaissent pas, Radio 4 est la radio culturelle de la BBC, un peu l'équivalent de France Culture).

for i in mon tue wed thu fri
do
  killall realplay
  vsound realplay http://www.bbc.co.uk/radio4/arts/ram/book_bedtime_$i.ram &
  VSOUND_PID=$!
  sleep 1020
  killall realplay
  wait $VSOUND_PID
  mv vsound.wav $i.wav
  (nice oggenc $i.wav ; rm $i.wav) &
done

(Ces quelques lignes ne sont pas satisfaisantes, car il faut donner explicitement la durée de l'émission.)

CD (encore)

On peut aussi mettre des données sur les CDs.

mkisofs -r -o cd1.iso CD1/
mount -t iso9660 -o ro,loop=/dev/loop0 cd1.iso /mnt/cdrom
cd /mnt/cdrom
find 
cd -
umount /mnt/cdrom

cdrecord -v speed=8 dev=0,0,0 -data cd1.iso
cd /mnt/cdrom
find
cd -
rm cd1.iso
rm -rf CD1/

Je ne comprends pas vraiment combien on peut mettre sur un CD (684883968 octets, ça passe). (731512832 aussi). (probablement 700Mo ?)

On peut aussi copier, textuellement, des CDs : on récupère l'image iso ainsi :

cat /dev/cdrom > image.iso

Mais il faut s'assurer qu'il n'y a pas eu d'erreur de lecture, en vérifiant que l'on peut bien monter l'image ISO comme un CD, en vérifiant que le contenu des fichiers est le même :

cd /mnt/cdrom
find -type f | sort | perl -p -e 's/(.*)/"$1"/' |
  xargs chksum > CDROM.chksum

S'il y a des données en dehors des fichiers (voir un numéro de Linux Magazine France, ou de MISC, d'il y a quelques mois), on peut aussi récupérer l'image deux fois et comparer les résultats.

DVDs

Il n'y a pas de /dev/dvd : il suffit de le créer (pour avoir le nom exact du device, il suffit de demander au Mandrake Control Center, aussi appelé DrakConf).

ln -s /dev/scd0 /dev/dvd

On peut vérifier, avec xine (ou mplayer), qu'il est possible de lire des DVDs.

xine -pdf

Attention : avec des DVDs de mauvaise qualité (une grande partie des DVDs pirates, surtout les vieux), l'image est absolument horrible, alors qu'elle est tout à fait tolérable sur une télé. (je reconnais avoir cherché longtemps, avant de prendre un autre DVD...) Par défaut, pour des raisons de licence, xine est incapable de lire des DVD non-multizones, i.e., les DVD officiels -- dois-je voir cela comme une incitation à me procurer des DVD pirates ?

Par ailleurs, il est préférable de lancer X avec une résolution proche de celle du DVD, de sorte qu'il n'y a pas de redimentionnement à faire.

Xine indique quand il est obligé de sauter des images : si c'est le cas, il y a un problème, qu'il faut traquer et résoudre.

Pour tenter de l'identifier, on peut lancer

xine-check

Parmi les messages, on trouve :

[ good ] /dev/dvd points to /dev/scsi/host0/bus0/target0/lun0/cd
[ hint ] Your DVD drive seems not to be attached via ATAPI.
         This might be due to the use of an ide-scsi emulation.
         If you really have a SCSI DVD drive, your SCSI controller is likely
         to do perfect DMA, so there's no reason to worry about this.
         However, if you're using ide-scsi, there is a chance that DMA is
         disabled for the DVD drive. Moreover, I don't know how to enable
         DMA in that case, so you probably have to live with some performance
         loss. (FIXME: check for /proc/ide, provide solution)

Je ne sais pas quoi faire.

On most linux-based systems, you can use hdparm to check this. 
  Example:

  hdparm /dev/hda
    ...
    using_dma    =  1 (on)
    ...

  You can enable DMA mode with the following command:
    hdparm -d1 device_of_your_drive_that_supplies_video_data

  More information about this may be found here:
    http://oreilly.linux.com/pub/a/linux/2000/06/29/hdparm.html

Mais il n'y a pas de commande hdparm : il faut intaller le RPM correspondant. Et il ne reconnait pas le lecteur :

% hdparm /dev/dvd
/dev/dvd not supported by hdparm

Autre essai :

set up and use raw devices for dvd access

Raw devices should be available in linux kernel 2.4.x
To use raw devices, first connect a free raw device to your dvd
device, use something like:
  raw /dev/raw1 /dev/hdc
then create a link named "rdvd" pointing to that raw device:
  ln -s /dev/raw1 /dev/rdvd

Ça a déjà été fait (lorsque la machine boote).

Et il y a aussi le problème des zônes...

input_dvd: Désolé, xine ne peux pas jouer des DVDs encryptés. Le status légal du
           decryptage CSS n'est pas clair et nous ne fournirons pas un tel code.

Essayons avec ogle, un autre lecteur de DVDs.

urpmi libdvdcss-1.2.2-fr1.i386.rpm
urpmi libdvdcss-devel-1.2.2-fr1.i386.rpm
urpmi libdvdread-0.9.3-ogle1.i386.rpm
urpmi libdvdread-devel-0.9.3-ogle1.i386.rpm
urpmi ogle-0.8.5-ogle1.i586.rpm
urpmi ogle-devel-0.8.5-ogle1.i586.rpm

http://www.dtek.chalmers.se/groups/dvd/redhat.shtml

C'est beaucoup mieux que Xine : on a accès aux menus des DVDs... On peut lire des DVDs cryptés (on n'est donc pas obligé d'acheter des DVDs pirates).

L'image est un peu saccadée (comme avec Xine).

Il y a un message qui m'inquiète :

Note[ogle_vout]: Xinerama extension not found/active

Il y a un autre message, beaucoup plus inquiètant :

Debug[ogle_audio]: 1.+015229173 s off, resyncing

(ça veut dire qu'il y a un décallage d'une seconde entre le son et l'image -- ça s'entend !)

Touches :

p    play (when the film was paused)
c    Resume (after you jump to a menu)
i    JPEG
s    subtitle toggle
,    ralenti
.    accélère
fF   plein écran
>    épisode suivant
<    épisode précédent

t    title menu 
r    root menu 
a    audio menu 
S    subtitle menu
P    chapter menu

J'ai donc l'impression qu'on ne peut pas revenir de quelques secondes en arrière ???

*

Certains DVDs sont dits PAL, d'autres NTSC : en fait, ça n'a rien à voir avec le codage PAL ou NTSC utilisé par les chaines de télé (il s'agit de codage de l'image en un signal analogique), ça indique juste le format de l'image : 720 x 576 (PAL) ou 720 x 480 pixels (NTSC). Dans les deux cas, le nombre d'images par seconde est variable.

http://www.michaeldvd.com.au/Articles/PALvsNTSC/PALvsNTSC.asp

Question : est-ce que le "low latency patch" résoudrait ce genre de problème ?

Montage vidéo

On peut convertir des DVDs en divx, avec par exemple dvd::rip (c'est un programme en Perl, qui utilise transcode pour manipuler la vidéo). On peut utiliser cela à des fins pas trop répréhensibles, par exemple, pour faire du montage vidéo.

<http://www.cosmosstudio.net/un-fit [cosmosstudio.net].mpg>

Mais je ne sais pas ce qui existe sous Linux pour faire du montage vidéo (i.e., prendre plusieures vidéos, les mélanger (avec des fondus, etc.), les modifier (appliquer divers filtres sur les images), extraire, modifier ou remettre la bande son, synchroniser l'image et le son (par exemple, faire en sorte que le claquement d'une porte coïncide avec le son de la batterie), etc.)

Cinelerra (anciennement Broadcast 2000)
http://heroinewarrior.com/cinelerra.php3

Pour lire de la vidéo qui n'est pas sur DVD, je préfère mplayer (il reconnait un plus grand nombre de formats).

Glame

Il s'agit d'un éditeur de sons (i.e., pour ceux qui viennent du monde Windoze, l'équivalent de SoundForge, WaveLab ou CoolEditPro), qui permet de manipuler des fichiers *.wav. Voici quelques exemples d'utilisation.

Mélanger plusieures sources, par exemple mettre des morceaux de musique les uns après les autres, avec un "fade-out" à la fin de chacun et un "fade-in" au début de chacun . ils peuvent se chevaucher.

Ajouter des bruitages sur une musique.

Ajouter des bruitages sur un discours (par exemple des percussions pour en augmenter le suspence).

Enlever un mot dans une phrase, changer un mot dans une phrase (par exemple les innombrables "Heu.." de Chirac), ajouter une hésitation dans une phrase (par exemple pour ajouter les "Heu" de Chirac à l'un de ses concurrents), modifier un mot dans une phrase (à l'aide d'un filtre adéquat on peut ajouter un zozottement), etc.

Transformer, en temps réel, l'entrée (du micro), en lui ajoutant de l'écho ou d'autres effets.

Je ne l'ai jamais vraiment utilisé -- pour plus de détails, lire la documentation :

info glame

Petite précision : lors de la première utilisation, il faut dire où se trouvent l'entrée et la sortie. Pour la sortie, choisir oss_audio_out et /dev/dsp (si on a aussi un micro, j'imagine qu'il faut mettre oss_audio_in et /dev/dsp1 -- mais en fait il faut peut-être intervertir /dev/dsp etg /dev/dsp1).

Il existe d'autres éditeurs audio (je n'en ai utilisé réellement aucun, donc je ne peux pas les comparer), en particulier snd (programmable en lisp et en ruby), wavesurfer et audacity.

http://www.speech.kth.se/wavesurfer/
http://audacity.sourceforge.net/
http://ccrma-www.stanford.edu/planetccrma/software/soundapps.html#SECTION00024100000000000000

Pour créer des sons à partir de rien, on peut utiliser des logiciels comme csound (une antiquité, qui ressemble beaucoup au Fortran), jMax (successeur de csound, avec une interface graphique, en Java -- je n'ai jamais réussi à l'utiliser) ou PD (Pure Data).

http://www.nn.iij4u.or.jp/~shirano/pd/pdlinks.html

soundtracker

Un Tracker est un logiciel permettant de créer un morceau de musique en mettant bout à bout des échantillons (un échantillon, c'est un enregistrement d'une seule note d'un instrument). Par exemple, je décide de mettre de la batterie aux instants 1, 2, 5 et 15 ; une autre percussion aux instants 8 et 16, un peu de guitare par-ci par-là (on peut modifier la hauteur du son). C'est tout. (Ca a commencé à se répandre dans les années 80, en particulier sur Amiga -- je ne sais pas exactement ce que les musiciens utilisent réellement à l'heure actuelle.)

Les fichiers créés par un Tracker s'appellent des modules : on peut les écouter avec soundtracker (*.mod, *.xm) lui-même ou plus généralement avec xmms (*.mod, *.xm, *.it, *.s3m). Soundtracker permet de voir comment le morceau est construit, quels sont les échantillons, comment ils se combinent ; on peut aussi voir ce qui se passe si on en enlève un ou deux (les morceaux comportant quatre voix sont assez faciles à analyser, les autres sont plus complexes, mais très souvent les innombrables voix ne servent qu'à rajouter des instruments légèrement différents qui jouent la même chose).

Il convient tout d'abord d'en écouter quelques uns, pour voir ce qu'il est possible de faire (attention, on cotoie le meilleur comme le pire) et comment cela a été fait. Pour en trouver, un bon point de départ est :

http://www.united-trackers.org/

Pour faire de la musique, il nous faut ensuite des échantillons, i.e., des notes de divers instruments (réels ou de synthèse, auxquel ont peut être été appliqués divers effets) enregistrés au format WAV. On peut aussi utiliser des instruments, qui se présentent sous la forme de fichiers *.xi, et qui sont en fait des ensembles d'échantillons (i.e., différentes notes jouées par un même instrumenent : si on veut une note qui n'est pas là, le son est moins maltraité et donc plus réaliste qu'avec un échantillon unique).

http://www.maz-sound.com/archives/demopack.zip
http://www.relaypoint.net/~emillan/ft2/samples.htm
http://www.modarchive.com/waveworld/

Sous WinDaube, on entend souvent parler de SoundFonts, qui ressemblent beaucoup aux instruments *.xi. Timidity est capable de jouer un fichier MIDI en utilisant une soundfont : si on veut les utiliser, on peut recourrir à un éditeur Midi, par exemple rosegarden, jazz, brahms (je n'en ai utilisé aucun).

Pour notre premier essai, commençons par choisir quelques instruments : des percussions (scifi.xi, xr10.xi), un son grave pour servir de basse (dark.xi) et un son plus aigu pour la "mélodie" (clean.xi). Dans soundtracker, on clique sur fichier (pas en haut de la fenêtre, mais au milieu), on charge un instrument, on change le numéro de l'instrument (toujours au milieu de la fenêtre), et on passe au suivant. On clique ensuite sur tracker (toujours au milieu de la fenêtre), et on peut composer notre morceau. On choisit un instrument (avec sont numéro, comme précédemment), on appuie sur ESC, et on utilise les touches de la dernière ligne du clavier (wxcvbn,;:!) comme les touches d'un piano (pour les touches noires, c'est la ligne juste au dessus). soundtracker ne tient pas compte du rythme, et met les notes les unes après les autres -- si on veut que la note dure plus longtemps, appuyer sur Suppr pour se retrouver un temps plus loin). Pour les autres instruments, on utilise les autres colonnes (appuyer sur TAB, ou utiliser la souris). On peut ensuite écouter notre oeuvre.

Chaque colonne est constituée d'une myriade de chiffres :

E-5 05 1c 108
--- 00 1c 208

La première colonne désigne la note, la seconde l'instrument, la troisième un effet (vibrato, volume, tempo, stéréo, etc. : il y a la liste dans la rubrique "aide"), la dernière un éventuel argument de cet effet.

Je ne met pas mon premier essai ici, car d'une part c'est mon premier essai d'autre part, je n'ai aucun talent musical -- écoutez plutôt les modules que vous aurez préalablement trouvés sur Internet.

Il est possible de manipuler ces modules directement en Perl, à l'aide de Audio::MikMod.

perldoc Audio::MikMod
info mikmod

Cela permet de jouer des modules, mais aussi, de prendre des échantillons et de les combiner. (Si je ne met pas d'exemple, c'est parce que j'entends des "clics" dans le résultat, sans que je comprenne d'où ils viennent.)

Une autre manière de naviguer sur Internet (ou comment choisir une image de fond)

J'utilise très souvent des aspirateurs de pages Web (en particulier wget et larbin). Voici un exemple complet.

Après avoir récupéré quelques (dizaines) d'adresses de sites proposant des images de fond d'écran, je lance l'aspiration.

for i in `cat URLs`
do
  wget -r -l 5 -np -nc -Q 100M $i &
done

S'il y a plus de quelques dizaines d'adresses, ce n'est peut-être pas une très bonne idée de lancer tout en même temps. On peut alors procéder ainsi

for i in `cat URLs`
do
  echo wget -r -l 5 -np -nc -Q 100M $i
done | fork

où fork est le programme suivant.

#! /usr/bin/perl -w
use strict;
my $MAX_PROCESSES = shift || 10;

use Parallel::ForkManager;
my $pm = new Parallel::ForkManager($MAX_PROCESSES);
while(<>){
  my $pid = $pm->start and next;
  system($_);
  $pm->finish; # Terminates the child process
}

Il faut maintenant faire le ménage dans ces fichiers, en selectionnant les images de taille suffisemment grande.

#! /usr/bin/perl -w
use strict;
use Image::Magick;
my $Magick = new Image::Magick;
use File::Find;
my $output_dir = "../OUTPUT_FLAT_IMG/";
mkdir $output_dir;
mkdir $output_dir."large";
mkdir $output_dir."small";
mkdir $output_dir."non-picture";
sub wanted {
  stat($_);
  return unless -f _;
  my $name = $_;
  $name =~ s#^\./##;
  my ($width, $height, $size, $format);
  print STDERR "checking: $name\n";
  ($width, $height, $size, $format) = $Magick->Ping($name);
  my $prefix;
  if($width) {
    if( $width >500 and $height > 300 ){
      $prefix = "large/";
    } else {
      $prefix = "small/";
    }
  } else {
    $prefix = "non-picture/";
  }
  my $new = $name;
  $new =~ s#/#_#g;
  rename $name, $output_dir.$prefix.$new;
}

find({wanted => \&wanted, no_chdir => 1}, '.');

Ah, non, ça plante...

Can't opendir(./animebgx.darkscape.net): Too many open files

(je suggère de le relancer jusqu'à ce qu'il n'y ait plus de message d'erreur) (le problème demeure si je fais de $Magick une variable locale qui n'est utilisée qu'une seule fois)

Il a aussi des problèmes avec les fichiers MP3 (pourtant, ça ne ressemble pas à une image).

mkdir ../OUTPUT_FLAT_IMG/MP3
mv **/*mp3 ../OUTPUT_FLAT_IMG/MP3

Exercice : modifier le programme ci-dessus pour qu'il récupère uniquement les images suceptibles d'être des fonds d'écran, i.e., dont le format est proche de 4/3.

Ensuite, il n'y a plus qu'à faire le tri, à la main, avec des visualiseurs d'images, du genre ee, gqview, xv, compupic ou qiv. Pour un grand nombre d'images, xv ou compupic sont les plus pratiques (en particulier, les vignettes occuppent presque tout l'écran), mais ils sont aussi les plus buggués...

display -backdrop -background black -geometry 1400x1050 -delay 2

Base de données

Initialement, je voulais montrer à quel point il est simple d'utiliser une base de données pour, par exemple, gérer la liste de ses livres, CDs ou DVDs. En fait, je ne suis pas parvenu à me convaincre moi-même que c'était simple...

Poursuivons quand-même.

Une base de données peut servir à le catalogue d'une bibliothèque (la liste des livres/CD/DVDs qui s'accumulent sur mes étagères) -- dans ce cas, il s'agira d'une table isolée. Il peut aussi s'agir de données plus complexes, par exemple si on fait du commerce sur ebay, à grande échelle, on peut mettre son stock, l'historique des commandes, la liste et les coordonnées des clients dans une base de données -- il s'agit alors de plusieures tables (marchandises, clients, commandes), reliées entre elles.

Ces bases de données utilisent le "langage SQL" : c'est juste un langage pour faire des recherches dans une base (pour dire, par exemple, je veux tous les livres qui ont le même auteur que "Le loup des Steppes" dont j'ai oublié le nom). Avec des logiciels plus professionnels (Oracle, PostgreSQL), on dispose aussi d'un vrai langage de programmation (PL/SQL pour Oracle, Pg/SQL pour PostgreSQL : mais les deux sont presque identiques). Il faut connaitre SQL.

http://directory.google.com/Top/Computers/Programming/Languages/SQL/FAQs,_Help,_and_Tutorials/?tc=1
http://dmoz.org/Computers/Programming/Languages/SQL/

Je ne trouve pas la documentation de mysql ou de PostgreSQL.

http://www.mysql.com/documentation/mysql/full/index.html

http://www.ca.postgresql.org/docs/aw_pgsql_book/index.html
http://www.commandprompt.com/ppbook/
http://www.fr.postgresql.org/users-lounge/docs/#7.2

Il y a néanmoins quelques exemples

locate .sql

Les deux bases de données libres les plus répandues sous Linux sont MySQL (très rapide, très économe en place disque, mais pas très sûre (à éviter pour gérer des commandes), et incomplet (il n'y a pas tout le SQL dont on peut avoir besoin)) et PostgreSQL (un peu plus lent, un peu moins économe en mémoire, plus sûr et plus complet : requêtes imbriquées, procédures stockées). Il existe d'autres bases de données libres, mais je ne les connais pas : Interbase, Firebird (qui vient d'Interbase), SAPDB. Lors de l'installation de Mandrake, j'ai choisi PostgreSQL.

Le problème, c'est que je ne sais pas du tout comment il est installé : pour pouvoir utiliser la base de données, j'ai besoin que PostgreSQL me connaisse (login et mot de passe -- il ne faut pas prendre le même que pour se logguer !), j'ai besoin de pouvoir créer de nouvelles base, de nouveaux utilisateurs, etc. Les fichiers de configuration de PostgreSQL s'appellent pg_hba.conf, pg_ident.conf, postgresql.conf. Mais la commande locate ne me permet pas de les trouver (voyez-vous pourquoi ? -- réponse quelques lignes plus bas).

locate pg_hba.conf

On regarde donc comment PostgreSQL est lancé, directement dans le fichier /etc/rc.d/init.d/postgresql. On constate que la base de données est dans le répertoire

PGDATA=/var/lib/pgsql/data

Les fichiers de configuration s'y trouvent aussi. Si la commande locate ne les trouvait pas, c'est parce que ces fichiers ne sont accessibles qu'à l'utilisateur postgres...

Après avoir tout effacé (ça n'est peut-être pas nécessaire)

su - postgres
pg_ctl stop
rm -rf /var/lib/pgsql/data
initdb --pgdata=/var/lib/pgsql/data
pg_ctl start -D /var/lib/pgsql/data
createdb postgres

Je crée un nouvel utilisateur et je l'associe à une base de données.

su  - postgres
createdb postgres
createdb zoonek
psql
CREATE USER zoonek PASSWORD ''

On peut maintenant utiliser cette base de données. Il existe plusieurs cliquodromes pour manipuler facilement des bases de données : je n'en ai jamais utilisé. Essayons quand-même de regarder ce qu'ils proposent.

Premier essai : gnomedb, libgda -- je n'ai pas trouvé de documentation pour l'utilisateur de base.

Deuxième essai : pgaccess (une interface à PostgreSQL en Tcl/Tk). On se connecte à la base de donnée que l'on vient de créer (comme le serveur utiliser uniquement des socket Unix, il ne faut mettre ni nom de machine (effacer "localhost") ni numéro de port). On peut alors créer une nouvelle table et mettre des données dedans. On peut créer des formulaires (pour permettre à des personnes autres que l'administrateur de la base de données de rajouter des données) (j'ai l'impression que c'est du code Tcl (du texte, donc), qui est stocké directement dans la base de données). Je ne suis pas du tout convaincu de l'utilisabilité de ce genre de chose...

Troisième essai : knoda.

Je n'ai pas encore essayé, mais ça devrait être plus simple.

Quatrième essai : phpMyAdmin. C'est une interface en php à MySQL. C'est par exemple ce qu'il utilisent chez free.fr.

En vrac

IM (Instant Messaging -- un peu comme IRC) : gabber, qui utilise le protocole Jabber.

Calcul formel (comme Maple) : mupad.

Calcul normal (comme Matlab) : scilab.

Calcul statistique (comme S, SAS) : R.

wget -r -l 1 -nc -Q 100M http://cran.r-project.org/manuals.html
wget -r -l 1 -nc -Q 100M http://cran.r-project.org/other-docs.html

Apprendre à utiliser rapidement le clavier : tuxtyping (graphique), gtypist, ktouch, typespeed (calcule la vitesse de frappe), xletters.

Editeurs de texte : emacs (énorme), xemacs (idem), picoe (petit, simple et peu puissant), joe (petit, simple (???) et puissant (?)), jed (petit, simple et puissant).

Utilitaires système divers :

DrakConf
kdesktop-network : regarde l'état du réseau.
kpm, gtop
karm : traqueur de temps
userdrake
rpmdrake
urpmi
fdisk (puis "p", comme print)
diskdrake
printdrake, printtool
/etc/printcap
CUPS
linuxconf ????
iptables (j'en ai parlé, mais je n'ai pas dit comment on les configurait ;
c'est très semblable à ifconfig : c'est une commande, qui attend
des arguments très compliqués, que l'on peut mettre, par exemple,
dans /etc/rc.d/rc.local)
DrakConf Sécurité -> Pare Feu
gkrellm (affiche diverses informations sur l'ordinateur : CPU, disque, etc.)

Je n'ai pas parlé de la recompilation du noyau : elle est utile si on veut avoir un noyau plus petit, i.e., si on veut économiser de la mémoire. On ne touche pas aux modules (car ils ne sont chargés que s'ils sont nécessaires), mais on enlève ce qui est inclus dans le noyau, comme les systèmes de fichiers ou les contrôleurs de disque dur (SCSI) dont on n'a pas besoin. Un autre avantage, c'est qu'on bénéficie alors d'un noyau plus récent.

make clean
make dep
make bzImage
make modules
make modules_install
cp **/bzImage /boot/vmlinuz-2.4.67

Je n'ai pas parlé des logiciels de dessin vectoriel (sketch, sodipodi, kontour), des navigateurs Web (Mozilla, konqueror, galeon, Dillo), des tableurs (gnumeric (généraliste), gnucash (pour gérer ses comptes), ilias (pour les enseignants (?)), etc.) des suites bureautiques (abiword (léger), openoffice, etc.).

Je n'ai pas parlé des tableurs : en particulier gnumeric (généraliste, par exemple, pour gérer les notes de ses élèves), mais aussi gnucash (pour faire ses comptes).

Je n'ai pas du tout parlé de programmation, qu'il s'agisse des langages dont on dispose (C, C++, Java, Eiffel, Perl, Python, Ruby, etc.), des IDE (i.e., environement de programmation, i.e., éditeurs de textes améliorés, par exemple : scite, anjuta, scintilla, kdevelop, emacs, netbeans), des systèmes de gestion de version (cvs, subversion, bitkeeper), des logiciels de traquage de bugs, des logiciels de réplication (si on utilise à la fois le portable et une machine fixe, mais en voulant avoir les mêmes fichiers sur les deux : rsync, unison)

unison $HOME ssh://cantor/ -path notes -path public_html -path tex

Je n'ai pas parlé non plus de développement Web (apache, php, mod_perl, AOLServer (je crois que c'est un serveur Web libre), Zope ; wwwoffle, htdig ; éditeurs HTML : bluefish, emacs ; hébergeurs : free.fr, levillage.org, gratuitetsanspub.fr.st, news://fr.réseaux.internet.hebergement ; hébergeurs avec du Java (Heu... des CGI en Java ?) www.isavvix.com, www.mycgiserver.com)

Je n'ai pas parlé de la configuration du firewall.

Humour

Je crois qu'il y a une publicité Dell-Intel qui dit "Nos machines à x MHz sont vraiment à x MHz". En fait, non :

dmesg
...
Dell Inspiron with broken BIOS detected. Refusing to enable the local APIC.
...
Detected 1595.332 MHz processor.

Vincent Zoonekynd
<zoonek@math.jussieu.fr>
latest modification on Wed Jan 22 21:57:43 CET 2003