domingo, 29 de agosto de 2010

Cita

 “El sistema operativo era una chapucera imitación del CP/M; los gráficos en color eran sólo una opción, y aunque el usuario pagara una suma obscena para conseguirla, sólo había cuatro colores en pantalla por vez; se podía escoger entre un conjunto de colores fríos y un conjunto de colores cálidos, pero eso no compensaba las deficiencias. El sonido salía por un altavoz pequeño y repulsivo que zumbaba como una chicharra. Era como si alguien hubiera examinado el Atari 800 y el Commodore 64 y hubiera decidido desmantelarlos para que no quedara nada que pudiera interesar a un ser humano.” (...)
    Orson Scott Card,  Niños Perdidos

Prompt del bash de Ubuntu en color

En este documento explico de forma introductoria y sencilla como se puede cambiar la configuración de color del terminal en Ubuntu y otras distribuciones que usen el archivo .bashrc del que hablo más abajo.

Resulta que cada usuario dispone de un archivo propio de configuración del bash denominado .bashrc (ojo porque está oculto, se puede ver con ls -a). Si abrimos dicho archivo con cualquier editor de texto se pueden ver las lineas

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes


Bueno, pues simplemente quitándole el comentario (el símboo #) a la última línea (force_color_prompt=yes) obtenemos el bash en color (cuando abramos un nuevo terminal)

Si además lo vemos un poco chillón, se pueden cambiar los colores de los distintos elementos. Busca la línea

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '


Fíjate que en la línea que empieza por PS1 hay varios números que terminan en una m (32m, 00m,34m,00m). Bien, pues el primero se refiere al color del nombre de usuario@maquina.  El segundo se refiere a los dos puntos. El tercero al color del directorio en el que estamos y finalmente el cuarto al símbolo $. Puedes probar entre otros estos colores:

  •     30: negro
  •     31: rojo
  •     32: verde
  •     33: amarillo/marrón
  •     34: azul
  •     35: púrpura
  •     36: cian
  •     37: blanco o gris

O con estos lo que cambias es el fondo en lugar de las letras:
  •     40: fondo negro
  •     41: fondo rojo
  •     42: fondo verde
  •     43: fondo amarillo
  •     44: fondo azul
  •     45: fondo púrpura
  •     46: fondo cian
  •     47: fondo blanco (o gris)

También es posible conseguir efecto de negrita. Fíjate por ejemplo en el primer número que acaba en m, el que corresponde al color del usuario@máquina. Este se encuentra entre corchetes con un 01: [01;32m\] Ese 01 indica negrita. Si ponemos 00 eliminamos esa negrita y cambiando a otros valores se consiguen otros efectos. También se pueden añadir a las otras partes del prompt.

Anímate a probar otros valores de colores para conseguir un prompt completamente personalizado.

sábado, 28 de agosto de 2010

Diferenciando IP externas de internas para Moodle

Tratando de instalar la plataforma Moodle en mi centro, me encontré con el problema de que si ponía como IP de Moodle la IP pública en el fichero config.php y ajustaba la NAT del router todo iba bien... desde fuera de la red del centro. Pero desde la LAN interna se redireccionaba al programade configuración del router que no ejercía NAT por no ser una llamada externa. Esto provocó que la simple entrada:

 $CFG->wwwroot   = IP_Pública;  //Por ejemplo 81.94.107.111

no funcionara. Claro, tampoco puedo sustituir la IP_Pública por la IP interna del servidor pues eso provoca que la plataforma deje de funcionar desde fuera de la LAN (Bueno, funciona pero no carga bien las CSS) Así que tampoco vale la entrada en config.php:

$CFG->wwwroot   = IP_interna_del _servidor; //Por ejemplo 192.168.1.100

Soluciones hay varias. La más evidente es colocar la plataforma en un servidor externo con lo que me olvido de todos los problemas. Pero si nos apetece tener todo en nuestro servidor, podemos aplicar un simple IF en PHP para detectar si la máquina que se está conectando es de una red interna o externa. Así, y suponiendo que la red interna tiene IPs tipo 192.168.1.XXX (si no es así hay que cambiar la expresión regular), el código a meter en config.php sería:

        $client_ip =$_SERVER['REMOTE_ADDR'];

    if ( preg_match("/^192\\.168\\.1\\.*/",  $client_ip) )
    {
            $CFG->wwwroot   = 'http://192.168.1.100';
    }
    else
    {
            $CFG->wwwroot   = 'http://81.94.107.111';
    } 

$_SERVER['REMOTE_ADDR'] devuelve la IP remota (no nos preocupan posibles proxies para este caso)

preg_match comprueba si una cadena (en este caso $client_ip) encaja en una expresión regular (en este caso la expresioń regular busca IP que empiecen por 192.168.1.). Si coinciden se usa la dirección interna pues estamos en la red interna. Si no, se usa la dirección externa.

La idea la obtuve de este artículo de EsLoMas (¡Gracias!).