dimanche 18 décembre 2011

Mouse problem with libSDL games

Urban Terror, Tremulous et tant d'autres jeux sont d'excellents défouloirs.

Malheureusement, j'avais un problème constant au lancement de ces jeux : le curseur de souris avait des mouvements incohérents, en général se calant sur la gauche ou la droite de l'écran et ne bougeant plus que verticalement.

Google a été mon pote une fois de plus, mais la recherche a été longue. Alors autant mémoriser ici la solution :

Add this to your .bashrc file (.profile should be ok too) :
# Règle le problème de souris dans les jeux OpenGL
export SDL_VIDEO_X11_DGAMOUSE=0
And this might help other fellows as well searching with the right keywords : opengl game linux mouse problem xinerama nvidia

And now, back to game :-)

Kubuntu 9.04, Urban Terror, PulseAudio et autres

Après avoir réglé un problème de souris avec les jeux sous OpenGL, je me suis retrouvé confronté à un autre problème : au bout de quelques minutes de jeu sous Urban Terror, le son disparaissait. Difficile alors d'être plongé dans l'ambiance de la partie. Qui plus est, à chaque fois que le son disparaissait, impossible de quitter le jeu proprement : affichage figé et obligation de flinguer le serveur X pour reprendre la main.

Je n'ai jamais pu voir un message d'erreur quelconque au moment où le son disparaissait. Par contre, j'ai réussi à voir les derniers messages de UT à la fermeture, juste avant le blocage de X :

CL shutdown
Closing SDL Audio Device


Après recherche, je suis tombé sur un cas similaire sur les forum de UT avant finalement de mettre la main sur une fiche de bug sur le Launchpad et, cerise sur le gâteau, d'y trouver la solution.

Solution :
Installer libsdl1.2-debian-pulse ce qui aura pour effet de désinstaller libsdl1.2-debian-alsa

Ainsi, la bibliothèque SDL attaquera directement PulseAudio au lieu de passer par la couche Alsa et le bug sera contourné. Pour l'heure, après un quart d'heure de jeu, je n'ai plus reproduit le bug :-)

Urban Terror sous KDE et TwinView

J'avais déjà posté un mémo concernant la configuration du serveur X pour bénéficier de l'affichage sur deux écrans. Cette configuration exploitait Xinerama et me permettait de jouer à des jeux 3D type Urban Terror, basé sur la bibliothèque OpenGL.

En basculant sous Karmic Koala, j'ai cherché à mettre en œuvre les effets de bureau sous KDE4. D'après ce que j'ai trouvé, ce n'est pas possible quand le serveur X tourne en mode Xinerama. Étant donné qu'on est dans le monde libre et qu'on a donc du choix, j'ai fait quelques recherches sur l'autre mode : Twinview. Il semble toutefois que ce ne soit pas un standard, juste une particularité propre à NVidia.

J'ai donc mis au point un nouveau fichier xorg.conf, grâce d'abord à l'utilitaire nvidia-settings puis grâce à mes petites mains, permettant un affichage sur deux écrans et permettant d'activer les jolis et souvent inutiles et donc indispensables effets de bureau. Reboot de X, clic sur la boîte à cocher pour activer les effets de bureau et hop ! Tout est beau et joli :-)

Après tous ces efforts, je me suis lancé un p'tit Urban Terror. Et là, le massacre (sic) ! Lancé en plein écran (principal) l'affichage est complètement décalé horizontalement d'environ la moitié de l'écran. En mode fenêtré, c'est hyper saccadé avec un lag épouvantable. Je reprend donc les recherches.

Il faut ajouter un méta-mode dans lequel l'écran secondaire est désactivé. L'affichage se fera alors pleinement sur l'écran principal. Sous X, on bascule d'un méta-mode à l'autre grâce aux séquences de touches : CTRL-ALT + et CTRL-ALT -

La contrainte est alors de basculer dans ce mode avant de lancer le jeu. Après une session de défoulement, on pourra revenir dans le mode normal. De ce point de vue là, ça marche bien. Mais le jeu est lent, scintille, même dans des résolutions mini alors qu'avec Xinerama et le même matos, ça pulsait bien :-( Je repeaufine alors la config : c'est le serveur X qui assure la synchro verticale, ce n'est plus le jeu. Etc… Rien n'y fait…

Après réflexions, je désactive les effets de bureau et lance Urban Terror : tout marche nickel ! Il me faut donc désactiver ces effets de bureau absolument inutiles durant le jeu et les réactiver après pour le côté eye-candy. Autant que cela se fasse dans le script de lancement de Urban Terror, non ? Un peu de recherche et hop ! Nous y voilà :-)

Voici le script de lancement de Urban Terror qui prend soin de désactiver les effets de bureau si ceux-ci sont actifs :
RESET="false"
 RESULT=`qdbus org.kde.kwin /KWin org.kde.KWin.compositingActive`
 if [ "$RESULT" = "true" ]
 then
   RESET="true"
   qdbus org.kde.kwin /KWin org.kde.KWin.toggleCompositing
   sleep 2
 fi 
 # 
 # put your commands to run with compositing disabled here
 ./ioUrbanTerror.i386
 #
 [ "$RESET" = "true" ] && qdbus org.kde.kwin /KWin org.kde.KWin.toggleCompositing

et voici mon fichier xorg.conf dans lequel l'écran 22" 1680x1050 est l'écran principal et le 15" 1024x768 est le secondaire, désactivé durant le jeu :

# nvidia-settings: X configuration file generated by nvidia-settings
# nvidia-settings: version 1.0 (buildd@palmer) Sun Feb 1 20:21:04 UTC 2009

# cette config définit 2 méta-modes :
# + mode normal 2 écrans
# + mode jeu avec un ecran 22"
#
# xorg.conf (X.Org X Window System server configuration file)
#
# This file was generated by dexconf, the Debian X Configuration tool, using
# values from the debconf database.
#
# Edit this file with caution, and see the xorg.conf manual page.
# (Type "man xorg.conf" at the shell prompt.)
#
# This file is automatically updated on xserver-xorg package upgrades *only*
# if it has not been modified since the last upgrade of the xserver-xorg
# package.
#
# If you have edited this file but would like it to be automatically updated
# again, run the following command:
# sudo dpkg-reconfigure -phigh xserver-xorg

Section "ServerLayout"
Identifier "Default Layout"
Screen 0 "Screen0" 0 0
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Mouse0" "CorePointer"
EndSection

Section "Files"
FontPath "/usr/local/share/fonts"
EndSection

Section "Module"
Load "glx"
Load "freetype"
EndSection

Section "ServerFlags"
Option "Xinerama" "0"
Option "DontZap" "off"
EndSection

Section "InputDevice"
# generated from default
Identifier "Keyboard0"
Driver "kbd"
EndSection

Section "InputDevice"

# generated from default
Identifier "Mouse0"
Driver "mouse"
Option "Protocol" "auto"
Option "Device" "/dev/psaux"
Option "Emulate3Buttons" "no"
Option "ZAxisMapping" "4 5"
Option "Resolution" "1000"
EndSection

Section "Monitor"
Identifier "Configured Monitor"
EndSection

Section "Monitor"
Identifier "Monitor0"
VendorName "Unknown"
ModelName "Maxdata (RogenTech) BelArtist22W"
HorizSync 30.0 - 84.0
VertRefresh 55.0 - 77.0
EndSection

Section "Monitor"
Identifier "Monitor1"
VendorName "Unknown"
ModelName "Maxdata (RogenTech)"
HorizSync 31.0 - 60.0
VertRefresh 56.0 - 85.0
EndSection

Section "Device"
Identifier "Configured Video Device"
Driver "nvidia"
EndSection

Section "Device"
Identifier "Videocard0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce 7300 GS"
BusID "PCI:1:0:0"
Screen 0
EndSection

Section "Device"
Identifier "Videocard1"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce 7300 GS"
BusID "PCI:1:0:0"
Screen 1
EndSection

Section "Device"
Identifier "Device0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce 7300 GS"
EndSection

Section "Device"
Identifier "Device1"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce 7300 GS"
BusID "PCI:1:0:0"
Screen 1
EndSection

Section "Screen"
Identifier "Default Screen"
Device "Configured Video Device"
Monitor "Configured Monitor"
DefaultDepth 24
Option "NoLogo" "True"
SubSection "Display"
Depth 24
Modes "1680x1050"
EndSubSection
EndSection

Section "Screen"
Identifier "Screen0"
Device "Device0"
Monitor "Monitor0"
DefaultDepth 24
Option "TwinView" "1"
Option "TwinViewXineramaInfoOrder" "CRT-0"
Option "metamodes" "CRT-0: 1680x1050 +1024+0, CRT-1: 1024x768 +0+0; CRT-0: 1680x1050 +0+0, CRT-1: NULL"
SubSection "Display"
Depth 24
EndSubSection
EndSection

Section "Screen"
Identifier "Screen1"
Device "Device1"
Monitor "Monitor1"
DefaultDepth 24
Option "TwinView" "0"
Option "metamodes" "CRT-1: 1024x768 +0+0"
SubSection "Display"
Depth 24
EndSubSection
EndSection

Javascript code prettifier

I use the Prettify program to prettify the code I put on this blog. It's easy to use and can be customized. It can be found in the Google Code Repo.

To mark up a piece of code like this one

sentence = "Once upon in a time"
words = sentence.split()
for word in words:
print word,
print "The truth is elsewhere."

I need to mark the text with quotes like those :
sentence = "Once upon in a time"
words = sentence.split()
for word in words:
    print word,
print "The truth is elsewhere."

Modification des droits en masse d'une arborescence de fichiers


Pour ne modifier les droits que des fichiers de /tmp:
find /tmp -type f -exec chmod a+r {} \
Pour ne modifier les droits que sur les sous répertoires de /tmp:
find /tmp -type d -exec chmod a+r {} \

Memento MySQL, to be replaced by MariaDB

Lancer le client dans un terminal :
mysql --database=db_name --user=toto --password=foobar --host=le_serveur --port=3306

Créer un utilisateur toto avec mot de passe foobar :
CREATE USER toto IDENTIFIED BY 'foobar' ;

Créer une base de données (avec les paramètres par défaut) :
CREATE DATABASE db_name;

samedi 10 décembre 2011

Parsing the command line

Code from http://krondo.com/?p=1247
import optparse

def parse_args():
    usage = """usage: %prog [options] poetry-file
    This is the Slow Poetry Server, blocking edition.
    Run it like this
    python slowpoetry.py 

    If you are in the base directory of the twisted-intro package,
    you could run it like this:
    python blocking-server/slowpoetry.py poetry/ecstasy.txt

    to serve up John Donne's Ecstasy, which I know you want to do.
    """

    parser = optparse.OptionParser(usage)

    help = "The port to listen on. Default to a random available port."
    parser.add_option('--port', type='int', help=help)

    help = "The interface to listen on. Default is localhost."
    parser.add_option('--iface', help=help, default='localhost')

    help = "The number of seconds between sending bytes."
    parser.add_option('--delay', type='float', help=help, default=.1)

    help = "The number of bytes to send at a time."
    parser.add_option('--num-bytes', type='int', help=help, default=10)

    options, args = parser.parse_args()

    if len(args) != 1:
    parser.error('Provide exactly one poetry file.')

    poetry_file = args[0]

    if not os.path.exists(args[0]):
    parser.error('No such file: %s' % poetry_file)

    return options, poetry_file

def main():
    options, poetry_file= parse_args()
    
    # options attributes can then be used like this :
    # options.num-bytes, options.delay, options.port and so on...