Configuring MSYS for real work

Posted by pulkomandy on Mon Jul 16 21:18:16 2012  •  Comments (0)  • 

People always request Windows binaries for some of my project, so I'm using a fairly complete MinGW/MSYS setup to get this done. However, the default setup for MSYS is not very efficient and doesn't manage to blend well in a Windows install (which is kind of expected). Here are some tricks to make it behave a bit better.

Bash prompt

An improvement on my existing "exit-status-colored" bash prompt. In Windows the path get long very easily (starting with "/c/Document and Settings/user/My Documents" before you've even got anywhere!). So here's a bash prompt that looks just like the previous one, but truncates the path to the last 4 elements. It's rather useful for other OSes, as well.

function exitstatus {
 if [ "$?" -eq "0" ]
 then
	COLOR=32
 else
	COLOR=31
 fi
}

PROMPT_COMMAND=exitstatus

PS1='$(
 IFS="/"
 d=3
 p=($(echo "\w"))
 e=$((${#p[@]}-1))
 P="\w"
 if [ $d -lt $e ]; then
 b=$(($e-$d+1))
 P="${p[$((b++))]}"
 for ((;$e-$b+1; b++)); do
 P="$P/${p[$b]}"
 done
 fi
 echo -n "\[\e[01;$COLOR;40m\]\u@\h\[\e[39m\]:\[\e[01;34m\]$P \[\e[0m\e]0;$P\$\a\]\$ "
 )'

While you're setting up bashrc and profile, you likely also want to setup $EDITOR, and the usual ll and la aliases (to ls --color).

Terminal emulator

The default setup uses Windows' DOS shell window to run bash. This gets annoyingvery quickly : it is not resizeable and has a lot of other bugs. I tried Console2 for a while but wasn't too happy with it either. The MinGW-provided rxvt seems to work fine. MinTTY looks interesting, but I didn't notice it before I was done with rxvt. Maybe next time...

Anyway, the default settings for rxvt are not too nice. I did some changes to make it a bit nicer and more useful. The first step is to open MSYS.BAT and replace the rxvt start command (start %WD%rxvt ...) with this:

set HOME=/home/USER
start %WD%rxvt -backspacekey ^H -sl 2500 -fn "Lucida Console-11" -fb "Lucida Console-11" -sr -geometry 132x50 -e /bin/sh --login -i

The HOME variable is set so rxvt can find .Xdefaults, and I also changed the font, increased the window size, and removed some color-related options.

Next step is to add a .Xdefaults file in the aformementionned HOME directory. There we'll setup the colors to look a bit nicer. Notice I used the same font for bold and normal text (rxvt bold rendering looks bad). So I set up different colors for bold and non-bold, so I can see all the 16 colors (rxvt could support up to 256, but this is not compiled in the mingw version). Here's my colorscheme.

Rxvt*color0: black
Rxvt*color1: orangered
Rxvt*color2: forestgreen
Rxvt*color3: gold
Rxvt*color4: dodgerblue4
Rxvt*color5: indigo
Rxvt*color6: cyan4
Rxvt*color7: azure3
Rxvt*color8: darkgrey
Rxvt*color9: crimson
Rxvt*color10: darkolivegreen1
Rxvt*color11: darkorange
Rxvt*color12: dodgerblue
Rxvt*color13: deeppink
Rxvt*color14: aquamarine
Rxvt*color15: white
Rxvt*background:gray7
Rxvt*foreground:aliceblue

More apps

Now install vim and svn (tortoiseSVN provides svn command-line client as an option in the installer), add them to bash path, and you're ready to go.

A little annoyance left : when started from bash, vim will read config in /home/user. When started from anywhere else, it will read in document and settings/user instead. So you have to copy your vimrc and vimfiles in both places.

Prompt Bash

Posted by pulkomandy on Sun Jul 17 16:50:09 2011  •  Comments (0)  • 

This bash prompt shows up in red when the last command failed ; green if everything is fine. It also sets xterm window title to the current directory. It displays a classical user@host$ prmpt, other than that. Put this in your bashrc file to enjoy it.

#fonction exécutée avant chaque affichage du prompt
function exitstatus {
        #récupère la sortie de la dernière commande
 if [ "$?" -eq "0" ]
 then
        # 32 : vert
     PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
 else
        # 31 : rouge
     PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
 fi
    # Ajoute le changement de titre des fenêtres xterm
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\W\$\a\]$PS1"
}

PROMPT_COMMAND=exitstatus

A variant for mksh is also available (with default/red colors, but it also prints the error code!). Put this in your mkshrc file.

function precmd {
	typeset e=$?

	(( e )) && print -n "\x1B[31m$e|"
}
PS1='
$(precmd)${USER:=$(ulimit -c 0;id -un 2>&-||print \?)}@${HOSTNAME%%.*}:$(
	typeset d=${PWD:-?} n p=~; [[ $p = ?(*/) ]] || d=${d/#$p/~}
	(( ${#d} > (n = (COLUMNS/3 < 7 ? 7 : COLUMNS/3)) )) && {
	d=${d:(-n)}; p=...; } || p=; print -nr -- "$p$d") '"$PS1 "

Trac subcomponents

Posted by pulkomandy on Thu Jul 14 16:50:15 2011  •  Comments (0)  • 

Just a little note, I set up a repository for APlayer and wanted to use subcomponents for issue reporting. This was a feature I used for years in Haiku bugtracker. It turned out to be a customization from the Haiku project. You can grab it there, along with other useful Trac mods.

Recuperer un fichier efface

Posted by pulkomandy on Tue Aug 4 19:07:12 2009  •  Comments (0)  • 

Une fausse manipulation peut arriver à tout le monde (surtout à moi)... Voici l'astuce secrète que j'utilise pour récupérer un fichier effacé par erreur. Elle a ses limites mais elle m'a déjà rendu quelques services.

grep -aC 1000 "morceau de contenu du fichier" /dev/hda2 > /mnt/autrepart/dump

Comment ça marche : grep va lire le contenu complet de la partition où se trouve le fichier effacé (ici hda2), filtrer ce bazar et retrouver le morceau que vous lui spécifiez, pour chaque occurence trouvée, il va l'enregistrer dans le fichier dump, avec les 1000 lignes précédentes, et les 1000 suivantes. Il ne vous reste plus qu'à récupérer les morceaux de votre fichier dans ce dump...

Cette méthode est limitée : d'abord ça marche mal avec les fichiers binaires. En plus, ça prend beaucoup de temps et il faut plein de place pour stocker le fichier dump. Il faut aussi se souvenir d'un morceau caractéristique de votre fichier, ce qui n'est pas toujours évident. Mais, c'est déjà mieux que rien. Pensez quand même aux sauvegardes...

FluxBB et Gravatar

Posted by pulkomandy on Sun Jun 28 00:58:17 2009  •  Comments (1)  • 

gravatar.com est un site qui offre un service global de stockage d'avatars. On s'inscrit une fois, on uploade un avatar, et on peut l'utiliser pour tous les sites qui supportent le système. Je suis administrateur d'un forum fluxbb et j'ai décidé de mettre ça en place plutôt que de laisser les utilisateurs remplir mon serveur avec leurs avatars. Ça a été plutôt simple a faire:

gravatar.com is a website allowing his users to register, upload their favorite avatar once, and then use it everywhere. I've added support for it to a fluxbb forum. The hack was pretty simple:

(code original de fluxbb dans view_post.php) (original code in view_post.php)

  if ($pun_config['o_avatars'] == '1' && $cur_post['use_avatar'] == '1' && $pun_user['show_avatars'] != '0')
  {
   if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.gif'))
    $user_avatar = '<img src="'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.gif" '.$img_size[3].' alt="" />';
   else if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.jpg'))
    $user_avatar = '<img src="'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.jpg" '.$img_size[3].' alt="" />';
   else if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.png'))
    $user_avatar = '<img src="'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.png" '.$img_size[3].' alt="" />';
  }
  else
   $user_avatar = '';

(a remplacer par) (replace with)

  $grav_url = "http://www.gravatar.com/avatar.php?gravatar_id=".md5( strtolower($cur_post['email']) ).
//  "&default=".urlencode("http://une_belle_image").
  "&size=60";

  $user_avatar = '< img src="'.$grav_url.'">';

Le seul problème est que ça oblige tous vos utilisateurs a utilise gravatar pour leur avatar, il n'est plus possible de l'uploader chez vous ou de le faire venir d'un autre site. Mais vous saurez surement trouver une solution plus propre pour faire ça :)

The only drawback is that it enforces your users to upload their avatars to gravatar. They can't use another website or your own server. But i'm sure you can find a proper way to do it if you want :)

Convertir un script en HTML avec vim

Posted by pulkomandy on Fri Jun 26 22:17:31 2009  •  Comments (2)  • 

Une petite astuce qui permet de gagner du temps pour un site comme celui ci.

Plutôt que de parser mes pages à chaque affichage pour convertir les scripts et mettre des couleurs dedans, éviter les problèmes de mise en page lors de l'utilisation de < ou de &, j'utilise vim pour mettre mes scripts en couleur.

Il suffit d'utiliser la commande :TOhtml de vim qui s'occupe de tout. Ne reste plus qu'à enlever les en-têtes html générés automatiquement par vim et à copier le résultat dans un article. Ma feuille de style contient les classes utilisées et je peux choisir les couleurs facilement.

Script d'upload rapide en ftp

Posted by pulkomandy on Fri Jun 26 22:14:05 2009  •  Comments (0)  • 

Ce script vous permet d'envoyer facilement des fichiers sur un serveur depuis bash. Je l'utilise pour partager rapidement des fichiers depuis mon pc personnel directement sur mon serveur. À adapter pour votre serveur, login, mot de passe et dossier de destination, bien sûr...

#!/bin/sh
for i in "$@"
do
        if [ -f "$i" ]
        then
                HOST='serveur.com'
                USER='moi'
                PASSWD='mot_de_passe'
                FILE="\"$i\""
                ftp -n $HOST <<END_SCRIPT
                quote USER $USER
                quote PASS $PASSWD
                cd /ftp_upload
                put $FILE
                chmod 644 $FILE
END_SCRIPT
        else
                echo "$i is not a file !"
        fi
done

Configuration d'un serveur Debian

Posted by pulkomandy on Fri Jun 26 17:13:53 2009  •  Comments (1)  • 

Dans cet article, je vais détailler un peu la configuration de ce serveur. Le but était d'utiliser une machine peu puissante, mais peu bruyante et consommant peu d'électricité. Je considère que ce n'est pas terminé, donc, faites moi part de vos idées et de vos astuces pour l'améliorer.

Bien configurer le BIOS

Tout commence par là. J'ai désactivé dans le BIOS tous les périphériques inutiles. Cela permet d'économiser un peu d'électricité grâce à la gestion ACPI, et ça permet aussi d'éviter de charger des modules noyau inutiles, donc on récupère un peu de RAM. On enlève donc les lecteurs de disquettes et de CDrom (les alimentations sont débranchées), mais aussi les port séries et parallèle.

D'autre part, le mode de gestion d'énergie ACPI dans le bios est "économie maximale". Le processeur tourne lentement et chauffe moins, le disque dur est mis en veille au bout de 2 minutes

On gagne: de la mémoire et de l'électricité

On perd: la posibilité de brancher un terminal VT100 et de démarrer sur une disquette. Rien d'utile. On perd un peu en temps de réponse avec le disque dur en veille.

Les réglages de Debian

Il est également importnat de bien configurer Debian. Les deux modifications que j'ai fait sont le déplacement de /var/log et de /tmp dans des ramdisks afin d'éviter des accès inutiles au disque dur, et la desactivation de getty dans /etc/inittab. En effet getty occupe 6 fois 500Ko, et la mémoire vive est précieuse.

La mémoire vive libérée est utilisée par Linux comme cache disque. Mon système occupe moins de 16Mo de mémoire, il reste donc beaucoup de place pour ce cache. Cela permet d'avoir la plupart des pages de mon site dedans, ce qui fait qu'il est très rare que le disque dur soit réveillé lorsqu'un visiteur vient sur le site.

J'ai également monté tous mes disques avec l'option noatime, ce qui évite d'avoir à faire une écriture sur le disque à chaque lecture qui pourrait rester dans le cache.

On gagne: De la mémoire et du silence

On perd: La possibilité de brancher un écran sur la carte vga et un clavier ps/2 pour accéder à un prompt. Pensez à configurer openssh avant.

Les logiciels

lighttpd pour le web, vsftpd pour le ftp et openssh. On évite Apache et proftpd qui sont beaucoup trop gros sans apporter grand chose d'utile.

La gestion des pages est faite à l'aide de scripts perl mais sans base de données SQL. J'utilise des fichiers et des dossiers, les utilisateurs UNIX et les dates de modifications. Ça allège beaucoup le serveur et ça ne limite pas forcément les possibilités.

On gagne: De la mémoire et de la réactivité, et de la sécurité (pas d'injections SQL)

On perd: Le confort de php/MySQL, un peu de souplesse

Trucs qui restent à faire

  • Recompiler le noyau en enlevant tous les trucs inutiles devrait permettre d'alléger encore le système.
  • Configurer lighttpd pour utiliser perl en fastcgi pour gagner encore en vitesse de réponse.
  • Mettre en place une authentification http utilisant directement les utilisateurs unix pour éviter d'avoir à gérer deux listes de logins.