linux

Script: Crear listas de reproducción m3u

Posted in Scripts, linux on April 12th, 2009 by mrcomputer – 6 Comments

Los archivos M3U son un tipo de archivos que sirven para almacenar listas de reproducción de archivos multimedia, y principalmente usado para listas de reproducción de audio. Estos archivos son reconocidos por la mayoría de reproductores en todos los sistemas operativos, como pueden se XMMS, VLC, Winamp, etc.

Los archivos M3U son archivos de texto plano con extensión .m3u y con una sintaxis muy sencilla.

En la primera línea de un archivo M3U siempre tiene que estar la sentencia #EXTM3U, que es lo que indica que se trata de un fichero M3U. Posteriormente se introducen en cada línea se introduce la ruta(relativa o absoluta) de los archivos multimedia que conformarán la lista de reproducción. Existen otras sentencias, pero son optativas y sirven para indicar el tiempo del archivo y el titulo en texto claro.

Como podéis ver es muy sencillo crear archivos de listas de reproducción M3U, también es muy sencillo ocultar datos en estos archivos, pero de esto hablaré en un próximo post.

Pues bien, a continuación teneis un sencillo script de bash que crea una lista de reproducción con los archivos mp3 y ogg que se encuentren en el directorio actual y recursivamente en todos los subsiguientes. También si descomentas una linea podrás agregar los archivos wav, pero la he comentado porque no es tan común tener música en .wav.

#!/bin/bash
##################################################################################
#       Script para crear archivos m3u con los arhivos a partir  del
#                               directorio actual
#               Creado por Miguel Peris(mrcomputer) version 1.0 11/04/2009
#       Uso: ./m3.sh nombre_de_la_lista.m3u
#             Sin parametros genera un nombre de lista por defecto
#       Licenciado bajo los terminos de la licencia GPL v3
##################################################################################
 
if [ -z $1 ]; then
archivo="lst-$(basename $PWD).m3u"
else
archivo=$1
fi
echo $archivo
 
# cabecera del archivo m3u y si el archivo existe lo borra
echo "#EXTM3U">$archivo
 
# genera listas para mp3 y ogg
ls -1R |find . -type f -print| grep -i .mp3 >>$archivo
ls -1R |find . -type f -print|  grep -i .ogg >>$archivo
 
# Descomentar la siguiente linea para tambien introducir los .wav a la lista
#ls -1R |find . -type f -print|  grep -i .wav >>$archivo
 
#EOF

Ahora solo hay que guardarlo como m3.sh y darle permisos de ejecución con chmod +x m3.sh. Si lo ejecutas sin parámetros el nombre de la lista de reproducción será lst-<directorio_actual>.m3u, por ejemplo si el directorio que nos encontramos se llama musica, el archivo m3u que genera el script por defecto será lst-musica.m3u.

En cambio si por parámetros le pasamos un nombre, generará la lista con ese nombre. Por ejemplo si ejecutamos nuestro script así, ./m3u.sh mi_lista.m3u generará el archivo mi_lista.m3u. También si queremos podemos pasarle el nombre con la ruta(absoluta o relativa) de la lista.

Espero que a alguien le sea de utilidad este pequeño script.

Nhopkg-fe

Posted in Noticias, linux, programación on April 5th, 2009 by mrcomputer – 8 Comments

Últimamente y ahora que tengo una semana de vacaciones con mas intensidad, estoy desarrollando (o al menos intentándolo) una GUI, interfaz gráfica, front end, o como sea ;) de nhopkg, el gestor de paquetes universal creado por jotahacker.

Lo estoy desarrollando en Gambas, un lenguaje similar al Visual Basic, pero más potente y lo que es más importante, libre. La intención es facilitar al usuario la tarea de instalar, desinstalar y manejar paquetes, y aprovechar al 99% las posibilidades que ofrecerá la nueva versión de nhopkg, la versión 0.5, que entre otras muchas mejoras incluirá repositorios.

Os dejo un pantallazo para que veáis como, más o menos, como quedará:

Aún le queda bastante que andar, pero ya implementa todas las funciones básicas, y alguna un poco mas avanzada. Espero que en unas semanas pueda ser liberado junto a la nueva versión de nhopkg

Script: tic-tac-toe (tres en raya)

Posted in Scripts, linux on April 5th, 2009 by mrcomputer – 2 Comments

Este clásico juego de mesa, que ha jugado un papel muy importante en algunas peliculas, también se puede hacer con bash.

Solo tenéis que guardar este código en un archivo llamado ttt.sh o bajarlo desde aquí y darle privilegios de ejecución con chmod +x ttt.sh. Ya podrás ejecutarlo con ./ttt.sh y jugar a este juego.

#!/bin/bash
# Sat Jul 12 16:52:30 EDT 2003
# NAME: ttt
# Copyright 2003, Chris F.A. Johnson
# Released under the terms of the GNU General Public License
 
ESC=$'\e'
 
tictactoe() {
[ $verbose -ge 1 ] &amp;&amp; echo tictactoe $* &gt;&amp;2
    board=`printf "%9.9s" "        "`
    mvnum=1
    remainder=" 1 2 3 4 5 6 7 8 9 "
    show "$board"
    while :
    do
      status
      eval \$player$P
      [ $? -ne 0 ] &amp;&amp; return
      put $_MOVE "$board"
      board=$_PUT
#      show "$board"
      mkbold "$_MOVE"
      printat 0 0 $mvnum
      printat $prompt
      sleep $pause &amp;
      mlist="$mlist $_MOVE"
      remainder=${remainder/ $_MOVE / }
 
      checkboard "$board" &amp;&amp; {
	  mkbold $win
	  printat $prompt "$cle"
	  eval winner \$player$P
	  return
      }
 
      [ $mvnum -eq 9 ] &amp;&amp; {
	  B=$U mkbold "$_MOVE"
	  winner "Neither player"
	  return
      }
      wait
      B=$U mkbold "$_MOVE"
      if [ $P = O ]
      then
	  P=X
	  OP=O
      else
	  P=O
          OP=X
      fi
      mvnum=$(( $mvnum + 1 ))
    done
}
 
winner() {
[ $verbose -ge 1 ] &amp;&amp; echo winner $* &gt;&amp;2
     printat $prompt "$cle $* wins\n\n"
}
 
status() {
[ $verbose -ge 1 ] &amp;&amp; echo status $* &gt;&amp;2
    if [ $verbose -ge 1 ]
    then
	printat 4 0
	printf "${cle}Move: %s Player: %s Board: \"%s\"  Last move: %s  Move list: %s" \
	    "$mvnum" "$P" "${board// /-}" "$_MOVE" "$mlist"
    else
	false
    fi
}
 
show() {
[ $verbose -ge 1 ] &amp;&amp; echo show $* &gt;&amp;2
    printat 0 0 $mvnum
    printat 0 $top  ##$(( ($LINES - 5) / 2 ))
    printf "  %${margin}.${margin}s | %1s | %1s\n" "${1:0:1}" "${1:1:1}" "${1:2:1}"
    printf "%${margin}.${margin}s---+---+---\n" " "
    printf "  %${margin}.${margin}s | %1s | %1s\n" "${1:3:1}" "${1:4:1}" "${1:5:1}"
    printf "%${margin}.${margin}s---+---+---\n" " "
    printf "  %${margin}.${margin}s | %1s | %1s\n" "${1:6:1}" "${1:7:1}" "${1:8:1}"
}
 
put() {
[ $verbose -ge 1 ] &amp;&amp; echo put $1 \""$2"\" &gt;&amp;2
   local n=$(( $1 - 1 ))
   _PUT=${2:-$board}
   [ "${_PUT:$n:1}" = " " ] &amp;&amp;
            _PUT=${_PUT:0:$n}$P${_PUT:$1}
}
 
checkboard() {
[ $verbose -ge 1 ] &amp;&amp; echo checkboard \"$*\" &gt;&amp;2
    case $1 in
	$P??$P??$P??) win="1 4 7" ;;
	?$P??$P??$P?) win="2 5 8" ;;
	??$P??$P??$P) win="3 6 9" ;;
	??$P?$P?$P??) win="3 5 7" ;;
        $P???$P???$P) win="1 5 9" ;;
	$P$P$P??????) win="1 2 3" ;;
	???$P$P$P???) win="4 5 6" ;;
	??????$P$P$P) win="7 8 9" ;;
        *) false ;;
    esac
}
 
mkbold() {
[ $verbose -ge 1 ] &amp;&amp; echo mkbold $* &gt;&amp;2
  for sq in $*
  do
    row=$(( ($sq - 1) / 3 ))
    col=$(( ($sq - 1) % 3 + 1 ))
    printat $(( ($col * 4) + $margin - 2 )) $(( ($row * 2) + $top ))
    printf "${B}$P${U}"
  done
}
 
human() {
[ $verbose -ge 1 ] &amp;&amp; echo human $* &gt;&amp;2
   while :
   do
       key "Select ($remainder)"
#       case $_MOVE in
#	  "$ESC") read -sn1; read -sn1 kp; continue ;;
#       esac
       _MOVE=$_KEY
       case $_MOVE in
	   1|2|3|4|5|6|7|8|9) [ "${board:_MOVE-1:1}" = " " ] &amp;&amp; break ;;
	   q|Q|x|X) echo; return 5 ;;
	   p) printat $prompt
	      KEYECHO= KEYMAX=$(( $COLUMNS - 10 )) key "Enter delay in seconds"
	      pause=$_KEY
	      ;;
	   "") set -- $remainder
	       _MOVE=$1
	       [ $verbose -ge 1 ] &amp;&amp; echo "|$_MOVE|" &gt;&amp;2
	       break ;;
	   *) printat $prompt
	      printf "\r%s%s\r" "  "$cle" $_MOVE: Invalid move"
	      sleep 1
	      printf "%s\r" "$cle" ;;
       esac
   done
}
 
randy() {
[ $verbose -ge 1 ] &amp;&amp; echo randy $* &gt;&amp;2
    randstr $remainder
    _MOVE=$_RANDSTR
}
 
key() {
[ $verbose -ge 1 ] &amp;&amp; echo key $* &gt;&amp;2
    printat $prompt "$cle$CVIS$beep"
    read -${KEYECHO}n$KEYMAX -p "${1:-PAK}: " _KEY 2&gt;&amp;1
    printf "$CINV"
}
 
getkey() {
    local OKchars=${1:-${remainder// /}}
    local kp2 kp3
    stty -echo
    while :
      do
      prompt="==&gt;"
      prompt
      IFS= read -r -sn1 -p " " kp 2&gt;&amp;1 || exit 2 #cleanup
      case $OKchars in
          *"$kp"*)
              case $kp in
                  $ESC)
                      read -st1 -n1 kp2
                      case $kp2 in
                          \[) read -st1 -n1 kp3
                              case $kp3 in
                                  A) kp=$UP; break ;;
                                  B) kp=$DN; break ;;
                                  C) kp=$RT; break ;;
                                  D) kp=$LF; break ;;
                              esac
                              ;;
                       esac
                       ;;
                  *) break ;;
              esac
              ;;
       esac
    done
    _KEY=$kp
}
 
randstr() {
[ $verbose -ge 1 ] &amp;&amp; echo randstr $* &gt;&amp;2
#    [ -n "$1" ] || return 1
    n=$(( ($RANDOM % $#) + 1 ))
    eval _RANDSTR=\${$n}
}
 
isblock() {
[ $verbose -ge 1 ] &amp;&amp; echo isblock $* &gt;&amp;2
    win=
    block=
    for _MOVE in $remainder
    do
        P=$OP put $_MOVE
	P=$OP checkboard "$_PUT" &amp;&amp; return
    done
    _MOVE=
}
 
block() {
[ $verbose -ge 1 ] &amp;&amp; echo block $* &gt;&amp;2
    block=
    for _MOVE in $remainder
    do
        put $_MOVE
	checkboard "$_PUT" &amp;&amp; return
        P=$OP put $_MOVE
	P=$OP checkboard "$_PUT" &amp;&amp; block=$_MOVE
    done
    [ "$block" ] &amp;&amp; { _MOVE=$block; return; }
    randy
}
 
computer() {
[ $verbose -ge 1 ] &amp;&amp; echo computer $* &gt;&amp;2
   local r c
   case $mvnum in
       1) randstr 1 3 7 9
	  _MOVE=$_RANDSTR ;;
       2)
	   if [ "${board:4:1}" = " " ]
	   then
	       _MOVE=5
	   else
	       randstr 1 3 7 9
	       _MOVE=$_RANDSTR
	   fi
	   ;;
       3)  r=${mlist// /}
	   c='1 3 7 9'
	   randstr ${c//[$r]/}
#	   randstr ${remainder//[$r]/}
	   _MOVE=$_RANDSTR
	   ;;
       4)
	   isblock
	   [ "$_MOVE" ] &amp;&amp; return
	    r=${mlist// /}
	    c='2 4 6 8'
	    randstr ${remainder//[$r]/}
	    _MOVE=$_RANDSTR
	    ;;
       *) block ;;
   esac
}
 
printat() { #== print arguments 3-... at Y=$2 X=$1
[ $verbose -ge 1 ] &amp;&amp; echo printat $* &gt;&amp;2
    [ $# -lt 2 ] &amp;&amp; return 1
    local y=$2
    local x=$1
    shift 2
    msg="$*"
    printf "\e[%d;%dH%b" $y $x "$msg"
}
 
version()
{
    echo "    $progname, version $version
    Copyright $copyright, $author $email
    This is free software, released under the terms of the GNU General
    Public License.  There is NO warranty; not even for MERCHANTABILITY or
    FITNESS FOR A PARTICULAR PURPOSE.
"
}
 
usage()
{
echo "
    ${B}NAME${U}:  $progname - Tic-Tac-Toe
 
    ${B}USAGE${U}: $progname [OPTIONS]
 
    ${B}OPTIONS${U}:
 
        -x player1         - specify first player
        -o player2         - specify second player
        -c player1,player2 - specify both players
        -p seconds         - time to pause between moves
 
        -h, --help       - help: print this message
        -H, --help_long  - help: print more detailed message (if available)
        -v, --verbose    - sends messsages to \$HOME/tttlog
        -V, --version    - print version information
 
    Copyright 2003, Chris F.A. Johnson
"
}
 
verbose=0
longusage=0
version="1.0"
copyright=2003
author="Chris F.A. Johnson"
progname=${0##*/}
P=X
OP=O
 
playerX=human
playerO=computer
co=
li=
 
if tput ce &gt;/dev/null 2&gt;&amp;1
then ## e.g. FreeBSD
    co=co
    li=li
elif tput el 2&gt;/dev/null
then ## e.g. Linux
    co=cols
    li=lines
fi
 
UNBOLD=$'\E[0m'
standout=$'\E[0;1;7m'
cle=$'\E[K'
clb=$'\E[1K'
ULINE=$'\E[0;4m'
REVERSE=$'\E[0;7m'
BLINK=$'\E[0;5m'
BOLD=$'\E[0;1m'
CINV=$'\E[0;8m'
 
R=$REVERSE
U=$UNBOLD
B=$BOLD
BR=$B$R
Cl=$'\f'
if [ "$co" ]
then
    tput reset
    COLUMNS=${COLUMNS:=`tput $co`}
else
    COLUMNS=${COLUMNS:-80}
fi
top=6
margin=11
prompt="3 $(( $top + 9 ))"
beep=  #$'\a'
pause=1
KEYMAX=1
KEYECHO=s
 
while getopts vVhH-:xoX:O:c:p: var
do
 case "$var" in
 
     x) playerX=human
	playerO-computer
	;;
     o) playerO=human
	playerX=computer
	;;
     X) playerX=$OPTARG ;;
     O) playerO=$OPTARG ;;
     c|C) playerO=${OPTARG#*,}
	  playerX=${OPTARG%,*}
	  ;;
     p) pause=$OPTARG ;;
 
    -) case $OPTARG in
         help) usage; exit ;;
         verbose) verbose=$(( $verbose + 1 )) ;;
         version) version; exit ;;
       esac
       ;;
    h) usage; exit ;;
    H) longusage=1; usage; exit ;;
    v) verbose=$(( $verbose + 1 )) ;;
    V) version; exit ;;
    *);;
 esac
done
shift $(( $OPTIND - 1 ))
 
if [ "$co" ]
then
    COLUMNS=`tput $co`
else
    COLUMNS=${COLUMNS:-80}
fi
margin=11  ##$(( ($COLUMNS - 11) / 2 ))
clear
 
if [ $verbose -ge 1 ]
then
    exec 2&gt;$HOME/tttlog
    set -x
fi
 
tictactoe
printat $prompt "\n$CVIS\n"

Fuente: http://cfaj.freeshell.org/shell/scripts/ttt-sh.html

Gráfico: Años de longevidad de las distros Linux

Posted in Sin categoria, linux on April 3rd, 2009 by mrcomputer – 1 Comment

Hace unos días  se cumplió el quinto aniversario de Ubuntu. Y zootropo de Mundo Geek ha creado una gráfica comparativa del tiempo que llevan algunas distribuciones en el “mercado”.

Como podemos observar la mas longeva es Debian (aunque Slackware es unos meses mayor) y tan solo es una adolescente aún, con solo 16 años de vida.

Via: Mundo Geek

Dos monitores en Linux

Posted in Trucos, linux on March 22nd, 2009 by mrcomputer – 4 Comments

Tener dos monitores puede resultar muy ventajoso sobre todo si eres programador, en uno tienes la documentación y la consola y en otro monitor el editor de código. Si eres editor de vídeo o audio también es muy cómodo teniendo el área de previsualización en uno de los monitores.

Con Linux se puede hacer al igual que en otros sistemas operativos. Se recomienda tener dos monitores iguales si se va a extender el escritorio, ya sean monitores LCD o monitores de tubo.

Para hacerlo conectamos el monitor a la segunda salida de vídeo y en si usamos Gnome, nos vamos a Preferencias/Resolución de la pantalla.

Ahí seleccionamos si queremos duplicar la imagen o no y elegimos la resolucion y la frecuencia de refresco, en ambos monitores ha de elegirse la misma resolución.

Backup de codigo desde una cuenta shell

Posted in Trucos, linux on March 10th, 2009 by mrcomputer – 5 Comments

Si eres estudiante de una universidad o simplemente trabajas con una cuenta shell de un servidor a través de shh o telnet muchas veces te habrá sido incomodo sacar una copia externa del código fuente con el que estás trabajando. Tendrías que subirlo a un ftp o algo similar.

Pero se puede hacer de otra forma mas sencilla y con un simple comando. El comando que pongo a continuación envía el archivo de código al mail que queramos:

 cat main.c | mail mrcomputer89@gmail.com -s ssoo

La opción -s indica el asunto. El comando envía el archivo main.c a mi email. Solo hay que cambiar el mail y el archivo por que que queráis. Para hacerlo mas cómodo se puede indicar un alias metiendo la siguiente linea en el archivo .bashrc:

 alias envio="cat main.c | mail mrcomputer89@gmail.com -s ssoo"

Este post es más bien como recordatorio para mí, pero lo publico por si a alguien mas le sirve.

Script: prefijos telefónicos españoles

Posted in Scripts, linux on March 7th, 2009 by mrcomputer – Comments Off

He encontrado este pequeño script que puede resultar útil cuando te llaman de un numero de fuera de tu comunidad y no reconoces el prefijo. El script de bash te pide el numero de teléfono y te da los los datos relativos a la provincia, ciudad, operadora y fecha de asignación.

Solo tienes que descargar este archivo, descomprimirlo y darle permisos de ejecución con chmod +x prefijos.sh

Fuente: Freesoftwareando

Los virus y Linux

Posted in Opinion, linux on February 13th, 2009 by mrcomputer – 2 Comments

Hace un tiempo inclusa me paso un interesantísimo articulo de la revista todolinux sobre los virus y linux. El artículo esta bajo licencia creative commons y los podéis descargar desde aquí.

El articulo comenta la total imposibilidad de virus dañinos y yo estoy prácticamente de acuerdo con el autor del articulo, aunque me viene a la cabeza que si en un futuro hubiese una distribución mayoritaria que ocupe casi todo el mercado(mas del 90% de los equipos con linux) un virus sería mas viable, ya que si tiene una vulnerabilidad es fácil difundir mucho un virus, y también debido a la uniformidad de configuraciones, rutas, etc que haría mas fácil la tarea de crear un virus efectivo.

Si Ubuntu u otra distro llega a esos extremos es posible que empiecen a aparecer virus(aunque debido a la dureza de los sistemas unix no serian tan dañinos como en Windows).

Y vosotros, ¿qué opinais sobre esto?

Script para descomprimir muchos archivos rar

Posted in Scripts, linux on February 6th, 2009 by mrcomputer – 9 Comments

Javier Parra me ha enviado un mail sugiriéndome que hiciese un script para descomprimir todos los archivos rar que se encuentren en la misma carpeta y con la misma contraseña.

Pues bien aquí está el script:

#!/bin/bash
 
#si los parametros por consola son menos que 2 mostramos la ayuda
if [ "$#" -lt "3" ]; then #si los parametros por consola son menos que 3 mostramos la ayuda
	echo "AYUDA"
	echo "$0 <ruta de los rar> <ruta de destino> <contraseña>  "
	echo
	echo "Ejemplo: $0 ./Descargas /home/mrcomputer/musica pass"
else
 
#Usamos un bucle for para ir recorriendo todos los archivos rar de la carpeta e ir descomprimiendolos
for archivos in $(ls $1/*.rar); do
	rar x -p$3 $archivos $2
done
 
fi

Solo teneis que guaradarlo con un archivo(por ejemplo rarp.sh) y darle permisos de ejecucion con chmod +x rarp.sh. Solo queda ejecutarlo con ./rarp.sh y os mostrara la ayuda para ver el orden de los parametro que hay que pasarle.

También he hecho la version para descomprimir archivos rar de una misma carpete pero esta vez si contraseña:

#!/bin/bash
 
#si los parametros por consola son menos que 2 mostramos la ayuda
if [ "$#" -lt "2" ]; then #si los parametros por consola son menos que 2 mostramos la ayuda
	echo "AYUDA"
	echo "$0 <ruta de los rar> <ruta de destino>"
	echo
	echo "Ejemplo: $0 ./Descargas /home/mrcomputer/musica"
else
 
#Usamos un bucle for para ir recorriendo todos los archivos rar de la carpeta e ir descomprimiendolos
for archivos in $(ls $1/*.rar); do
	rar x $archivos $2
done
 
fi

La instrucciones para ejecutarlo son las mismas.

En ambos scripts es necesario tener instalado el programa rar.

Retrolinux: ejecutando un sistema con el kernel 0.01

Posted in linux, retroinformatica on January 10th, 2009 by mrcomputer – 2 Comments

La versión 0.01 de Linux fue lanzada el 17 de Septiembre de 1991 por Linus Torvalds y es la primera versión de Linux y que Torvalds ya había anunciado un mes antes en el grupo de noticias comp.os.minix con el siguiente mensaje (traducido al español):

Hola a todos aquellos que usan Minix -

Estoy haciendo un sistema operativo (gratuito) (solamente una afición, no será grande ni profesional como el GNU) para clones 386(486) AT. Este ha estado gestándose desde abril, y está comenzando a estar listo. Me gustaría recibir cualquier comentario sobre las cosas que gustan/disgustan en minix, ya que mi OS se le parece un poco. (la misma disposición física del sistema de archivos, debido a motivos prácticos, entre otras cosas).

Actualmente he portado bash(1.08) y gcc(1.40), y las cosas parecen funcionar. Esto implica que conseguiré algo práctico dentro de unos meses, y me gustaría saber que características quiere la mayoría de la gente. Cualquier sugerencia es bienvenida, pero no prometeré que las pondré en práctica :-)

Linus Benedict Torvalds (torvalds@kruuna.helsinki.fi)

PD. Sí – es libre de cualquier código de minix, y tiene un sistema de archivos multi-hilo. NO es portable (usa 386 una conmutación de tarea etc.), y probablemente nunca será soportada por nada más que los discos duros AT, así que esto es todo que tengo :-(.

Pues bien, podemos nosotros usar unas pequeñas imágenes de disco para poder probar este kernel desde una máquina virtual con Qemu.

En primer lugar hemos de bajarnos la imagen del disco duro y una pequeña imagen de disquete para arrancarlo.

Una vez descargadas y descomprimidas, nos aseguramos que tenemos instalado qemu , sino lo instalamos y ejecutamos el siguiente comando en el directorio donde tengamos las imágenes de disco:

qemu -hdb hd_oldlinux.img -fda linux0.01-3.3.img -boot a

¡Ya está! tenemos un sistema linux con el kernel 0.01. Aunque el bash y las utilidades son algo mas modernas el núcleo es el original.

También como curiosidad os dejo la nota de lanzamiento y que la parte mas curiosa es la de los requerimientos de hardware:

Hardware needed for running linux:
	- 386 AT
	- VGA/EGA screen
	- AT-type harddisk controller (IDE is fine)
	- Finnish keyboard (oh, you can use a US keyboard, but not
	  without some practise :-)

Código fuente del kernel 0.01