Bash, como cualquier lenguaje, tiene una sintaxis propia. Eso lo sabe todo el mundo. Lo que no todo el mundo sabe es que, además, puede usar la sintaxis de C haciendo uso de los paréntesis dobles. Unos ejemplos.
Manejo de variables
Bash es muy flexible en cuanto a los tipos de variables, ya que el declararlas o no queda a elección del programador. En caso de no declararlas, una variable admite cualquier tipo. De hecho, si hacemos
a=3
a=$a+1
la variable a tomará el valor de string "3+1" (a no ser que hayamos declarado a como entero previamente). La forma correcta de hacerlo sería
let a=$a+1
en cuyo caso a sí pasaría a valer 4. Pero podemos echar mano del C-style:
((a += 1))
o bien
((a++))
Bucles y condicionales
Y esta parte es mucho más interesante, porque de esta forma podemos hacer uso de los potentes bucles de C en bash. Algunos ejemplos:
while ((a > 3 || b != 0))
if ((a > 3 && b == 5))
Admite también el uso del operador ternario de C:
((a!=b?3:11))
y, ya la reostia en salsa, el operador coma:
for ((a=1, b=1; a <= LIMITE ; a++, b++))
Gracias a kumo por (de nuevo) ponerme sobre la pista.
30 marzo 2007
28 marzo 2007
Defina Linux
Leyendo en NeoFronteras una interesantísima noticia sobre Scientific Linux, una distro desarrollada en colaboración entre el Fermilab, el CERN y otros laboratorios y universidades del mundo, me he encontrado un párrafo que hace que el ego y el "orgullo patrio" de cualquier linuxero suba por las nubes:
Linux corre en diversos microprocesadores, es muy eficiente y tiene un excelente diseño. Es multitarea, multiusuario, multiplataforma y multiprocesador; en las plataformas Intel corre en modo protegido; protege la memoria para que un programa no pueda hacer caer al resto del sistema; carga sólo las partes de un programa que se usan; comparte la memoria entre programas aumentando la velocidad y disminuyendo el uso de memoria; usa un sistema de memoria virtual por páginas; utiliza toda la memoria libre para caché; permite usar bibliotecas enlazadas tanto estática como dinámicamente; se distribuye con código fuente; usa hasta 64 consolas virtuales; tiene un sistema de archivos avanzado pero puede usar los de los otros sistemas; y soporta redes tanto en TCP/IP como en otros protocolos. Además está prácticamente libre de virus.
Pues sí, Linux es así :)
Linux corre en diversos microprocesadores, es muy eficiente y tiene un excelente diseño. Es multitarea, multiusuario, multiplataforma y multiprocesador; en las plataformas Intel corre en modo protegido; protege la memoria para que un programa no pueda hacer caer al resto del sistema; carga sólo las partes de un programa que se usan; comparte la memoria entre programas aumentando la velocidad y disminuyendo el uso de memoria; usa un sistema de memoria virtual por páginas; utiliza toda la memoria libre para caché; permite usar bibliotecas enlazadas tanto estática como dinámicamente; se distribuye con código fuente; usa hasta 64 consolas virtuales; tiene un sistema de archivos avanzado pero puede usar los de los otros sistemas; y soporta redes tanto en TCP/IP como en otros protocolos. Además está prácticamente libre de virus.
Pues sí, Linux es así :)
27 marzo 2007
Un Automatix para Debian Etch
Seguro que conoceis Automatix. Gracias a La otra bola de cristal me entero de que alguien ha escrito algo del estilo para Debian Etch.
Lo que más he odiado siempre de instalar un nuevo sistema es todo el rollo de las "instalaciones post-instalación". Me alegra que alguien se haya tomado la molestia de ahorrar todo ese tiempo a mucha gente.
Lo que más he odiado siempre de instalar un nuevo sistema es todo el rollo de las "instalaciones post-instalación". Me alegra que alguien se haya tomado la molestia de ahorrar todo ese tiempo a mucha gente.
24 marzo 2007
Aprendiendo Python

Vale, sí, muy potente como lenguaje de script y un código muy eficiente. Pero donde esté la elegancia de C...
En fin, voy a ver si me busco un pet project.
Beryl y Compiz se vuelven a unir
Y visto a posteriori era lógico que sucediera. Desde luego no se ha tratado de un fork al uso. No han habido dos ramas experimentando nuevas cosas, desarrollando features distintas. Al revés, el desarrollo de Compiz y de Beryl había seguido dos líneas paralelas. cojin lo explica perfectamente en su comentario en Menéame.
En el anuncio oficial ya dicen que no se conservará ninguno de los dos nombres, sino que se usará uno nuevo. Lo que (mode ironic on) vendrá de perlas a toda la gente que recién llega a GNU/Linux y no sabe distinguir entre un entorno de escritorio y un manejador de ventanas. Un nombre más a la lista.
Al margen de eso, creo que la unión puede ser muy beneficiosa para el usuario, siempre y cuando se conserven y potencien las mejores características de uno y otro, a saber (y me remito de nuevo al comentario de cojin): estabilidad por un lado y compatibilidad y rapidez de desarrollo por el otro.
En el anuncio oficial ya dicen que no se conservará ninguno de los dos nombres, sino que se usará uno nuevo. Lo que (mode ironic on) vendrá de perlas a toda la gente que recién llega a GNU/Linux y no sabe distinguir entre un entorno de escritorio y un manejador de ventanas. Un nombre más a la lista.
Al margen de eso, creo que la unión puede ser muy beneficiosa para el usuario, siempre y cuando se conserven y potencien las mejores características de uno y otro, a saber (y me remito de nuevo al comentario de cojin): estabilidad por un lado y compatibilidad y rapidez de desarrollo por el otro.
21 marzo 2007
Devilspie: controlando las ventanas
Es difícil traducir la expresión window-matching utility, pero el concepto es sencillo: busca una ventana, y haz con ella lo que yo te diga.
Eso es Devil's Pie, una utilidad que analiza las ventanas que se crean en el escritorio, y si coinciden con unos criterios estipulados en la configuración ejecuta acciones sobre ellas: minimiza, envía a un workspace determinado, esconde su decoración... lo que queráis. Su flexibilidad es sencillamente increíble.
Devilspie se configura mediante archivos *.ds presentes en el directorio $HOME/.devilspie. Archivos que, por supuesto, hacemos a nuestro gusto, para que cada ventana en nuestro escritorio se comporte exactamente como queramos.
La configuración no es difícil, aunque tampoco intuitiva. Los archivos *.ds se componen de condicionales, booleanos y acciones. En foosel.net hay una descripción detallada de cada uno de ellos, con ejemplos de uso. Está en inglés, pero es sencillo, y los ejemplos facilitan la cosa aún más.
Como pequeño ejemplo de lo que devilspie puede hacer, os pongo alguno de archivos de configuración que uso:
(if (matches (window_name) "Eterm") (begin (pin) (undecorate) (skip_pager) (skip_tasklist) (below)))
Lo que viene a significar que si el nombre de la ventana coincide con Eterm se envíe a todos los workspaces (pin), no aparezca en el paginador (skip_pager), no aparezca en la lista de ventanas (skip_tasklist) y quede permanentemente bajo las demás ventanas (below). El resultado (combinado con una configuración específica de Eterm) lo podeis ver en esta captura de pantalla.
Otro ejemplo, más sencillo:
(if (is (window_name) "Akregator") (minimize))
Osea, si el nombre de la ventana es Akregator, se ejecute minimizada al inicio. Comodidad más que nada.
Las posibilidades son enormes: conversaciones de Gaim que se envíen automáticamente al escritorio 2, aplicaciones que permanezcan siempre sobre el resto de ventanas, programas que se abran siempre con un tamaño de ventana y una posición determinada... En una palabra: control total sobre las ventanas.
Eso es Devil's Pie, una utilidad que analiza las ventanas que se crean en el escritorio, y si coinciden con unos criterios estipulados en la configuración ejecuta acciones sobre ellas: minimiza, envía a un workspace determinado, esconde su decoración... lo que queráis. Su flexibilidad es sencillamente increíble.
Devilspie se configura mediante archivos *.ds presentes en el directorio $HOME/.devilspie. Archivos que, por supuesto, hacemos a nuestro gusto, para que cada ventana en nuestro escritorio se comporte exactamente como queramos.
La configuración no es difícil, aunque tampoco intuitiva. Los archivos *.ds se componen de condicionales, booleanos y acciones. En foosel.net hay una descripción detallada de cada uno de ellos, con ejemplos de uso. Está en inglés, pero es sencillo, y los ejemplos facilitan la cosa aún más.
Como pequeño ejemplo de lo que devilspie puede hacer, os pongo alguno de archivos de configuración que uso:
(if (matches (window_name) "Eterm") (begin (pin) (undecorate) (skip_pager) (skip_tasklist) (below)))
Lo que viene a significar que si el nombre de la ventana coincide con Eterm se envíe a todos los workspaces (pin), no aparezca en el paginador (skip_pager), no aparezca en la lista de ventanas (skip_tasklist) y quede permanentemente bajo las demás ventanas (below). El resultado (combinado con una configuración específica de Eterm) lo podeis ver en esta captura de pantalla.
Otro ejemplo, más sencillo:
(if (is (window_name) "Akregator") (minimize))
Osea, si el nombre de la ventana es Akregator, se ejecute minimizada al inicio. Comodidad más que nada.
Las posibilidades son enormes: conversaciones de Gaim que se envíen automáticamente al escritorio 2, aplicaciones que permanezcan siempre sobre el resto de ventanas, programas que se abran siempre con un tamaño de ventana y una posición determinada... En una palabra: control total sobre las ventanas.
20 marzo 2007
Entrevista con Ian Murdock

En ella habla de cosas como el modo en que afectan al Proyecto los retrasos en las releases, la necesidad de un DPL fuerte y sus preocupaciones con el futuro del proyecto Ubuntu en cuanto a la compatibilidad con Debian.
Colabora!
Seguro que muchos, como usuarios de software libre, habeis sentido el impulso/deseo/necesidad de, de un modo u otro, colaborar en su desarrollo. Sí, hablo de esas ocasiones en que os sentís frustrados por no ser expertos programadores o por no tener conocimientos suficientes para crear documentación de calidad. Seguro que sabeis de lo que hablo. Uno de esos impulsos fue precisamente el que me llevó a comenzar este blog...
Pero no hace falta tanto para colaborar con el desarrollo del software libre. Hoy leo en Kernel Source que el grupo de desarrollo de Konsole propone una encuesta para que los desarrolladores conozcan cosas como qué características nos parecen más útiles, cuáles nos gustarían ver en el Konsole de KDE4, cuáles nos parecen más fáciles/difíciles de configurar, etc. Está en inglés, pero vamos, que el nivel es muy básico.
No hay excusas: Colabora!!!
Pero no hace falta tanto para colaborar con el desarrollo del software libre. Hoy leo en Kernel Source que el grupo de desarrollo de Konsole propone una encuesta para que los desarrolladores conozcan cosas como qué características nos parecen más útiles, cuáles nos gustarían ver en el Konsole de KDE4, cuáles nos parecen más fáciles/difíciles de configurar, etc. Está en inglés, pero vamos, que el nivel es muy básico.
No hay excusas: Colabora!!!
16 marzo 2007
Un agujero en OpenBSD siempre es noticia
Y más uno de este calibre. Pero empecemos por el principio.
OpenBSD es un sistema operativo de tipo UNIX basado en 4.4BSD, creado en un principio como un fork de NetBSD. La característica más significativa de este sistema es su seguridad. No en vano la implementación de SSH usada en todos los sistemas *NIX es OpenSSH. Eso lo dice todo. De hecho, en su web se jactan de haber tenido ¡Sólo un agujero de seguridad remoto en la instalación predeterminada en más de 8 años!. Tendrán que ser dos a partir de ahora.
Y es que la implementación del protocolo IPv6 de OpenSSH adolece de una vulnerabilidad (calificada por Secunia de altamente crítica) de tipo BoF (buffer overflow). Con todo lo que ello conlleva. Y es que:
Y eso en un sistema usado como firewall, IDS y otras aplicaciones de seguridad.
La buena noticia: OpenBSD ha publicado ya un parche que soluciona el problema, como no podía ser de otra manera.
Y sí, hay exploit, publicado por el propio descubridor del bug, Alfredo Ortega, de Code Security.
Fuente: El blog de la tecnología
OpenBSD es un sistema operativo de tipo UNIX basado en 4.4BSD, creado en un principio como un fork de NetBSD. La característica más significativa de este sistema es su seguridad. No en vano la implementación de SSH usada en todos los sistemas *NIX es OpenSSH. Eso lo dice todo. De hecho, en su web se jactan de haber tenido ¡Sólo un agujero de seguridad remoto en la instalación predeterminada en más de 8 años!. Tendrán que ser dos a partir de ahora.
Y es que la implementación del protocolo IPv6 de OpenSSH adolece de una vulnerabilidad (calificada por Secunia de altamente crítica) de tipo BoF (buffer overflow). Con todo lo que ello conlleva. Y es que:
- Afecta a la instalación por defecto, ya que IPv6 está incluido en ella
- Es explotable de forma remota
- Permite la ejecución de código arbitrario en el contexto del kernel
Y eso en un sistema usado como firewall, IDS y otras aplicaciones de seguridad.
La buena noticia: OpenBSD ha publicado ya un parche que soluciona el problema, como no podía ser de otra manera.
Y sí, hay exploit, publicado por el propio descubridor del bug, Alfredo Ortega, de Code Security.
Fuente: El blog de la tecnología
13 marzo 2007
11 marzo 2007
Controlando Linux con el mando de la Wii
kumo me ha puesto sobre la pista, y como buen geek no he podido evitarlo: había que investigar :)
De momento la cosa está en pañales, pero promete, y mucho. La cuestión es establecer una conexión vía Bluetooth entre el mando de la Wii y el sistema para controlar éste a través de aquél, como con cualquier otro HID.
Lo primero, como es lógico, es contar con un adaptador de Bluetooth y tener implementada la pila de protocolos BT (bluez). Tras esto comprobamos que podemos detectar el mando (debemos ponerlo en modo sync):

Una vez comprobado esto, tenemos que preparar el sistema. Primero el software que necesitamos:
Hay que parchear Python. Para ello editamos el archivo /usr/share/python-support/python-xlib/Xlib/protocol/display.py y buscamos la línea donde dice:
recv = self.socket.recv(2048)
En mi caso está en la línea 531. Lo sustituimos por
recv = self.socket.recv(4096)
Cargamos (tirando de modprobe) los módulos uinput y evdev. Si no los teneis, ya sabeis, toca recompilar. Tras esto comprobamos que se ha creado el dispositivo uinput:
find /dev -name uinput
Si no lo teneis en /dev/misc/uinput lo linkais desde donde lo tengais, ya que PyBluez querrá acceder al dispositivo en esa ruta. Hay que darle permisos para los usuarios (chmod 666 /dev/misc/uinput).
Ya casi están los preparativos. Falta configurar el servidor X. Para ello editamos el archivo /etc/X11/xorg.conf y añadimos un InputDevice:
Section "InputDevice"
Identifier "Wiimote"
Driver "evdev"
Option "Name" "Nintendo Wiimote"
EndSection
y en la sección ServerLayout añadimos la línea
InputDevice "Wiimote"
Listo. Reiniciamos el servidor X (invoke-rc.d [gdm|kdm|xdm] restart) y a otra cosa, mariposa. Uséase, a por el controlador.
WMD (Wiiwanna Motte Dammiit!) es un script en Python que actua como controlador para el Wiimote, usando PyBluez como wrapper para la comunicación Bluetooth, como seguramente ya habríais imaginado a juzgar por el software que hemos instalado. La última versión es la 0.1.2, aunque he tenido problemas con ella y he usado la 0.1.1. Por cierto, el WMD could make your Wii explode! del disclaimer es una coña marinera, que nadie se me acojone :D
En fin, éste es un vídeo con el resultado. Como veis la cosa, como digo más arriba, está en pañales aún, pero con un potencial increíble.
De momento la cosa está en pañales, pero promete, y mucho. La cuestión es establecer una conexión vía Bluetooth entre el mando de la Wii y el sistema para controlar éste a través de aquél, como con cualquier otro HID.
Lo primero, como es lógico, es contar con un adaptador de Bluetooth y tener implementada la pila de protocolos BT (bluez). Tras esto comprobamos que podemos detectar el mando (debemos ponerlo en modo sync):

Una vez comprobado esto, tenemos que preparar el sistema. Primero el software que necesitamos:
- Ya hemos nombrado la pila de protocolos (apt-get install bluetooth bluez-utils)
- PyBluez, un conjunto de wrappers Python sobre Bluetooth (apt-get install python-bluez).
- Python-Xlib, interfaz para Python del protocolo X11 (apt-get install python-xlib).
- Es recomendable PyGame (apt-get install python-pygame) para poder observar la respuesta del sistema a los movimientos del mando.
Hay que parchear Python. Para ello editamos el archivo /usr/share/python-support/python-xlib/Xlib/protocol/display.py y buscamos la línea donde dice:
recv = self.socket.recv(2048)
En mi caso está en la línea 531. Lo sustituimos por
recv = self.socket.recv(4096)
Cargamos (tirando de modprobe) los módulos uinput y evdev. Si no los teneis, ya sabeis, toca recompilar. Tras esto comprobamos que se ha creado el dispositivo uinput:
find /dev -name uinput
Si no lo teneis en /dev/misc/uinput lo linkais desde donde lo tengais, ya que PyBluez querrá acceder al dispositivo en esa ruta. Hay que darle permisos para los usuarios (chmod 666 /dev/misc/uinput).
Ya casi están los preparativos. Falta configurar el servidor X. Para ello editamos el archivo /etc/X11/xorg.conf y añadimos un InputDevice:
Section "InputDevice"
Identifier "Wiimote"
Driver "evdev"
Option "Name" "Nintendo Wiimote"
EndSection
y en la sección ServerLayout añadimos la línea
InputDevice "Wiimote"
Listo. Reiniciamos el servidor X (invoke-rc.d [gdm|kdm|xdm] restart) y a otra cosa, mariposa. Uséase, a por el controlador.
WMD (Wiiwanna Motte Dammiit!) es un script en Python que actua como controlador para el Wiimote, usando PyBluez como wrapper para la comunicación Bluetooth, como seguramente ya habríais imaginado a juzgar por el software que hemos instalado. La última versión es la 0.1.2, aunque he tenido problemas con ella y he usado la 0.1.1. Por cierto, el WMD could make your Wii explode! del disclaimer es una coña marinera, que nadie se me acojone :D
En fin, éste es un vídeo con el resultado. Como veis la cosa, como digo más arriba, está en pañales aún, pero con un potencial increíble.
08 marzo 2007
CPU Frequency Scaling
He encontrado gracias al blog de mUammAr la forma de regular la frecuencia del procesador en función de la carga que soporta. En un sobremesa no es algo muy útil, pero en un ordenador portátil esto es un mundo, ya que conlleva un ahorro de energía y por tanto alarga la duración de la batería. Él dice haber conseguido que su batería durara casi una hora más. La mía dura ahora más de una hora más que antes.
Describiría el procedimiento, pero ya lo ha hecho él perfectamente y yo no podría aportar nada nuevo, lo único que haría sería hacer un copipega. Sólo quería hacerme eco y dar fe de que realmente es así.
Así que lo mejor que podéis hacer es pinchar el enlace y ponerlo en práctica :)
Describiría el procedimiento, pero ya lo ha hecho él perfectamente y yo no podría aportar nada nuevo, lo único que haría sería hacer un copipega. Sólo quería hacerme eco y dar fe de que realmente es así.
Así que lo mejor que podéis hacer es pinchar el enlace y ponerlo en práctica :)
06 marzo 2007
Nuevo escritorio
Entre partida y partida a la Wii :D he estado redecorando el escritorio. Y como me gusta cómo ha quedado, pues lo planto aquí :)

El monitor de sistema (a la derecha) lo he hecho yo mismo porque no he encontrado ninguno que me terminara de gustar en KDE Look. Los otros desklets (al igual que el fondo de escritorio) sí los he bajado de ahí aunque (perdón a los autores) no he guardado el enlace.
El anterior escritorio que tenía era éste.

El monitor de sistema (a la derecha) lo he hecho yo mismo porque no he encontrado ninguno que me terminara de gustar en KDE Look. Los otros desklets (al igual que el fondo de escritorio) sí los he bajado de ahí aunque (perdón a los autores) no he guardado el enlace.
El anterior escritorio que tenía era éste.
05 marzo 2007
No es plagio, pero como si lo fuera

Pues GTS Digital lo ha tomado al pie de la letra. Con todo el morro del mundo. Y eso que se dedican al diseño gráfico...
Visto en ghostbar's blog
04 marzo 2007
03 marzo 2007
Análisis forense de sistemas
Esta mañana, releyendo el magnífico tutorial Análisis forense de sistemas de neófito (lo podeis encontrar en la sección Tutoriales en PDF), he decidido retomar el tema, que dejé aparcado hace muuuuuucho tiempo.
El análisis forense es, según la definición de la Wikipedia, una metodología de estudio ideal para el análisis posterior de incidentes, mediante el cual se trata de reconstruir cómo se ha penetrado en el sistema, a la par que se valoran los daños ocasionados. Puesto así no suena tan interesante como en realidad es.
Así que me he vuelto a descargar las imágenes de disco de un sistema comprometido del Proyecto Honeynet y he abierto un caso con Autopsy. El tutorial de neófito os guiará paso a paso sobre cómo hacerlo.

Si a alguien más le gusta el tema y se anima podemos compartir información y descubrimientos :P
Enlaces:
forensic-es
Honeynet Project: The Forensic Challenge
Análisis forense de sistemas GNU/Linux, UNIX
El análisis forense es, según la definición de la Wikipedia, una metodología de estudio ideal para el análisis posterior de incidentes, mediante el cual se trata de reconstruir cómo se ha penetrado en el sistema, a la par que se valoran los daños ocasionados. Puesto así no suena tan interesante como en realidad es.
Así que me he vuelto a descargar las imágenes de disco de un sistema comprometido del Proyecto Honeynet y he abierto un caso con Autopsy. El tutorial de neófito os guiará paso a paso sobre cómo hacerlo.

Si a alguien más le gusta el tema y se anima podemos compartir información y descubrimientos :P
Enlaces:
forensic-es
Honeynet Project: The Forensic Challenge
Análisis forense de sistemas GNU/Linux, UNIX
01 marzo 2007
mp3blaster
Siempre he dicho que el poder de Linux radica en su shell. Y además he predicado con el ejemplo. Durante mi época "dura" usé durante varios meses mis sistemas sin entorno gráfico. Navegaba con Lynx, conectaba a IRC con BitchX, a la red MSN con TMSNC, usaba mencoder+dvdauthor+cdrecord para grabar las películas y verlas en el DVD del salón... Sí, demasiado radical, ya lo sé, pero no podeis imaginar la soltura que se coge con la shell así :D
El caso es que durante esa época sí eché algo de menos: un buen reproductor de música. Tiraba de mpg123 o de mplayer, pero eso sólo permite reproducir canciones, nada más. Me hice incluso un sencillo script que aún conservo, que dibujaba en la consola una primitiva GUI para elegir la canción (si le echais un ojo al código fuente vereis que incluso soporta búsquedas):

El caso es que, ahora, dos años y pico después, encuentro lo que necesitaba: mp3blaster.

Como podeis ver en la captura, mp3blaster es un reproductor para consola con prácticamente todas las opciones que tiene uno gráfico. No llega al nivel de amaroK pero ¿qué otro reproductor llega a su nivel? El caso es que en la GUI que este programa dibuja en la consola no se echa en falta absolutamente nada. Ains, ojalá lo hubiera conocido antes.
El caso es que durante esa época sí eché algo de menos: un buen reproductor de música. Tiraba de mpg123 o de mplayer, pero eso sólo permite reproducir canciones, nada más. Me hice incluso un sencillo script que aún conservo, que dibujaba en la consola una primitiva GUI para elegir la canción (si le echais un ojo al código fuente vereis que incluso soporta búsquedas):

El caso es que, ahora, dos años y pico después, encuentro lo que necesitaba: mp3blaster.

Como podeis ver en la captura, mp3blaster es un reproductor para consola con prácticamente todas las opciones que tiene uno gráfico. No llega al nivel de amaroK pero ¿qué otro reproductor llega a su nivel? El caso es que en la GUI que este programa dibuja en la consola no se echa en falta absolutamente nada. Ains, ojalá lo hubiera conocido antes.
Suscribirse a:
Entradas (Atom)