Mostrando entradas con la etiqueta S.L.. Mostrar todas las entradas
Mostrando entradas con la etiqueta S.L.. Mostrar todas las entradas

martes, 13 de mayo de 2008

El demonio cpufreqd

Me gusta probar nuevas distribuciones en mi portátil, aunque me cuesta salir de las "debian-based". El asunto es que aunque no tengo una gran máquina (un Centrino 1.7 Ghz) me gusta aprovechar las cosas al máximo.

Este procesador, como casi todos los de portátiles, tiene una función llamada escalado de frequencia que es una tecnología que permite hacer trabajar el procesador a frecuencias menores con el objetivo de ahorrar batería al mismo tiempo que disminuye el calentamiento.

Hay muchas formas de retocar esta funcionalidad, a mi me gusta cpufreqd por su sencillez. Este tipo de aplicaciones definen una política de comportamiento para diferentes estados como pueden ser:
  • Portátil conectado a la red eléctrica.
  • Portátil en modo batería con carga entre 70-100 %
  • Portatil con modo batería con carga menor al 20%
  • ...
El motivo que me hizo "descubrir" esta aplicación fueron los problemas tanto con Debian como con Ubuntu que tenía en mi portátil. Por algún motivo dichas distribuciones configuraban mi máquina para funcionar siempre a la máxima frecuencia (1.7Ghz) cuando está conectada a la red eléctrica.

Aparentemente esto es lo deseable ya que así rinde al máximo, pero no para mí. Cuando trabajo con el portátil suelo estar navegando o editando código, tareas que, sobre todo la última, no necesitan el procesador a pleno rendimiento y que sin embargo si necesitan, sobre todo la última, un mínimo de concentración. Y aquí es donde surge mi problema, ya sea por la edad del portátil o porque es un Amilo Pro (no es la gama más alta del mercado), el ventilador hace mucho ruido, y cuando el procesador trabaja a 1.7Ghz hace que esté continuamente haciendo el pulsing (arrancando y frenando a ritmo constante).

El ruido es bastante molesto, así que me puse manos a la obra para solucionar el problema. Instalé los paquetes cpufreqd y cpufreq-utils que están disponibles via apt. Eliminé también el paquete powernowd que es el que traen las últimas distribuciones basadas en Ubuntu.

El primer paso es ver si el demonio cpufreqd es capaz de arrancar, en mi caso no arrancaba porque le tenía que indicar el tipo de tecnología de mi procesador, la cual es speedstep-centrino. Para ello hay que editar el fichero /etc/default/cpufreq.d y añadir la línea CPUFREQ_CPU_MODULE="speedstep-centrino". Por supuesto hay que reiniciar el demonio para que los cambios surtan efecto.

Una herramienta útil es cpufreq-info con la que podemos saber el estado actual del procesador y las posibilidades que da. En mi caso la respuesta es:

cpufrequtils 002: cpufreq-info (C) Dominik Brodowski 2004-2006
Report errors and bugs to linux@brodo.de, please.
analyzing CPU 0:
driver: acpi-cpufreq
CPUs which need to switch frequency at the same time: 0
hardware limits: 800 MHz - 1.73 GHz
available frequency steps: 1.73 GHz, 1.33 GHz, 1.07 GHz, 800 MHz
available cpufreq governors: conservative, ondemand, powersave, userspace, performance
current policy: frequency should be within 800 MHz and 1.73 GHz.
The governor "ondemand" may decide which speed to use
within this range.
current CPU frequency is 800 MHz.

Son importantes las líneas hardware limits: 800 MHz - 1.73 GHz y available frequency steps: 1.73 GHz, 1.33 GHz, 1.07 GHz, 800 MHz que marcan las posibilidades del procesador que tengamos.

Sabiendo las posibilidades de nuestra máquina, lo único que resta hacer es editar el fichero /etc/cpufreqd.conf y elegir la política que queremos o editar la nuestra propia. En mi caso sustituí la Perfomance High que siempre mantenía el procesador al 100% por On Demand High, que pone la frecuencia entre 800 Mhz y 1.7Ghz según la demanda del sistema. Como se puede observar al escribir esto estaba funcionando a 800Mhz estando conectado a la red.

Silencioso y eficiente ;)

lunes, 14 de abril de 2008

Latex: Más vale tarde que nunca

Viendo ahora los resultados que se pueden obtener usando Latex me arrepiento bastante de no haberlo descubierto antes de terminar la carrera. Pero bueno, más vale tarde que nunca y voy a tratar de usarlo a partir de ahora.

Si quieres saber como va esto te lo explico. Yo estoy escribiendo un trabajo usando Vim, pero se puede usar cualquier cosa. Siguiendo la sintaxis que puedes encontrar en cualquier tutorial la forma de obtener tu documento es:

# latex trabajo.tex

# dvipdf trabajo.dvi trabajo.pdf

Y listo. Pensando en lo que hay que hacer para escribir un documento con referencias de más de 100 páginas en Word u OpenOffice.org, puedo asegurar que nunca dejaré el Latex.

jueves, 20 de diciembre de 2007

La maldad de los asistentes

Es un hecho que las distribuciones modernas de GNU/Linux están cada vez más adaptadas al usuario inexperto. Para casi todo existen cómodos asistentes que nos ayudan a cosas triviales como conectar a la red, actualizar el sistema o importar nuestra colección musical.

El problema es que si tú, como usuario avanzado, caes en el uso contínuo de los asistentes, empiezas a abstraerte y poco a poco, vas olvidando como funcionan las cosas por dentro. Personalmente, ese fue uno de los motivos que me hizo pasar a GNU/Linux, el entender como funcionan las cosas.

Comento esto porque me siento avergonzado. Hace poco tuve que configurar un portatil con la distribución Guadalinex, todo fue de perlas hasta que quise activar el WiFi. El caso es que la tarjeta externa Conceptronic no conseguía entrar a la red, a pesar de que la veía.

Sigo sin entender, por qué ese asistente no detecta la red, cuando en Ubuntu Edgy (sistema anterior del portatil) si la detectaba y en teoría son distribuciones similares.

El caso es que abriendo un terminal la solución era bien sencilla, pero llevo tanto tiempo gestionando mi sistema con asistentes que no lo recordaba.

¿Sera que no detecta la tarjeta? Era tan fácil como:
# iwconfig

Pues ahí aparecía la tarjeta ese no es el problema.

¿Será que no ve la red? Solución:
# sudo iwlist ra1 scan

Pues sí, sí la ve. Aunque desde el asistente la detecta con intensidad 0% y desde aqui con 78%. Puede que por ahí esté el problema.

Pero es un problema del asistente, ¿cómo configurar la red sin asistentes ni NetworkManager ?

Pues en mis comienzos hace años no tenía problema para lidiar con /etc/network/interfaces, sólo es cuestión de recordar como gestionar la red desde consola.

Para probar simplemente tengo que hacer:
# sudo ifconfig ra1 up
# sudo iwconfig ra1 essid elnombredelaESSID
# sudo iwconfig ra1 key s:lacontraseña
# sudo dhclient ra1


Y ya funciona. Conclusión: Mi Hardware funciona perfectamente, así como los drivers. El problema: El asistente de NetworkManager.

Ahora ya lo he automatizado todo y no tengo problema para conectar, pero ¿realmente era necesario recurrir a google para eso? De ahora en adelante trataré de recordar porqué es mejor hacerlo todo desde consola, para tener una idea clara de como funcionan las cosas, sin capas que impidan ententer.

Conste que me parece fenómeno que haya asistentes, porque es una forma de atraer al usuario común, pero a los que nos gusta este mundillo, deberíamos no olvidar las buenas costumbres.

Un saludo.

P.D. Información extraida de un post Helektron.com.

miércoles, 21 de noviembre de 2007

Instalar un servidor LAMP en 3 clicks

Debido a cuestiones académicas me veo obligado a empezar a trastear con el mundillo de los servidores LAMP (Linux + Apache + MySQL + PHP).

Durante este último año he estado trabajando con Turbogears y la verdad es que siguiendo la guía es bastante fácil instalar automáticamente todos los paquetes necesarios.

En cuanto a LAMP, pues al a ver tantísima información en la Web, uno no sabe muy bien como guiarse para conseguir hacerlo rápido y empezar a programar inmediatamente.

Pues buscando, buscando, me topé con una de esas funcionalidades que no sabes que existen y que una vez descubierta, no puedes creer que vivieras sin ella. Me refiero al marcar paquetes por tareas de Synaptic.

  1. Bien, abrimos Synaptic/Editar/Marcar paquetes por tareas... (1º click)
  2. Señalamos servidor LAMP (2º click)
  3. Le damos a aplicar (3º click)
Servidor instalado, gracias Synaptic ;)

Como sabéis, ya sólo queda colocar vuestros documentos en /var/www y a tocar localmente todo lo que necesitéis.

lunes, 22 de octubre de 2007

Configurando un cliente para el CVS de sourceforge

Esto es algo bastante común cuando se quiere trabajar en aplicaciones libres, y aunque parece que la tendencia augura un mejor futuro a SVN, nunca está de más tener a mano una forma rápida de descargar un proyecto de software y tenerlo listo para participar.

Para esta configuración es fundamental tener instalado el Open Secure Shell y CVS.

1.- Se crean los archivos .cvsignore y .cvsrc en el home del usuario, un ejemplo del contenido para un proyecto escrito en python puede ser:

  • .cvsignore:
*.png *.jpg *.xpm *.bak *.gladep *~ *dump*.sql *.pdf *.conf* *.pyc *.pyo .*.swp *.pywc
  • .cvsrc:
update -Pd
diff -uw
cvs -z 3

2.- El siguiente paso es exportar las variables:

#export CVSROOT= :ext:user@n_proyecto.cvs.sourceforge.net:/cvsroot/n_proyecto
#export CVS_RSH=ssh

3.- Y por último sólo tenemos que hacer el checkout para descargar el código

# cvs checkout nombre_rama_proyecto


Tras introducir nuestra clave de usuario de sourceforge se descarga el código. Entre las opciones de cvs recordar las tres fundamentales:
  • cvs update
  • cvs ci
  • cvs add fichero

jueves, 30 de agosto de 2007

Impresión a la carta: pdfnup

¿Cuántas veces has tenido que imprimir una presentación y has querido poner 6 diapositivas en una página para ahorrar papel?

¿Cuántas veces has intentado poner dos hojas por cara, separar pares de impares, etc, etc y el resultado han sido folios y folios para reciclar?

Salvemos los bosques, todo es mucho más sencillo: PDFNup

PDFNup es una aplicación de consola incluida en el paquete PDFJam. Escrita por David Firth, es realmente útil y básicamente sirve para realizar transformaciones en archivos PDF o PostScript.

Existe alguna GUI para manejarlo, pero es bastante sencillo de manejar directamente. Tras instalar el paquete abrimos una shell y ya está listo para funcionar. Supongamos que hemos bajado una revista electrónica, y la queremos imprimir, pero con dos hojas por folio porque no sabemos donde meter tantos papeles. Es tan simple como:

#pdfnup --nup 2x1 fichero.pdf

Y esto nos crea otro pdf que tiene la estructura que queremos, sencillo ¿no?

No, es que lo quiero con las páginas en vertical. Pues nada:

#pdfnup --nup 1x2 fichero.pdf

Esos son los usos más comunes para mí pero mirando la ayuda (#pdfnup --help) o las páginas man del programa (#man pdfnup) se pueden ver muchísimas más opciones que pueden que os hagan falta en un momento dado. Algunas de las posibilidades son:
  • Seleccionar las páginas que se quieren
  • Seleccionar la orientación de las páginas
  • El tamaño del papel
  • Poner marcos
  • Márgenes personalizados
  • Espacio entre páginas
  • ...
Bueno, pues recomendar esta aplicación, que muchos no sabrán que existe y que es EXTREMADAMENTE útil.

Un saludo

lunes, 16 de abril de 2007

Manejo analógico de vehículo mediante GamePad

En esta entrada voy a comentar como realicé la conexión del mando Logitech Dual Action, para poder usarlo en simulaciones con PlayerStage.

La API que utilicé fue la Light Weight Java Game Library, que descargué y añadí en eclipse como biblioteca de usuario mediante Build Path (vía de acceso de construcción)

Para hacer uso de la biblioteca es necesario decirle a la JVM donde se encuentran los binarios (.dll en Windows o .so en linux). Están en el directorio native del paquete lwjgl que descargamos en el paso anterior. Es decir, que en eclipse nos vamos a "Ejecutar...", y en los argumentos de la VM ponemos (en mi caso):
-Djava.library.path=/home/diego/JavaLibraries/lwjgl-1.0beta4/native/linux

Dependiendo de la instalación ponermos el directorio correspondiente. En MS Windows podría ser:
-Djava.library.path=C:\JavaLibraries\lwjgl-1.0beta4\native\windows

Y el código de mi GamePad.java sería:


import org.lwjgl.LWJGLException;
import org.lwjgl.input.Controller;
import org.lwjgl.input.Controllers;


public class GamePad {

public static final int START = 4;
public static final int END = 6;
private Controller controller = null;
private int buttonCount;
private int axisCount;
private int SO = -1; /* 0 GNU/Linux || 1 MS Windows */

public GamePad() {


try {
Controllers.create();
} catch (LWJGLException e) {
e.printStackTrace();
}

int numberOfControllers = Controllers.getControllerCount();

if (numberOfControllers==0)
{
System.out.println("No se han encontrado controladores");
}

for(int i=0;i<numberofcontrollers;i++)
{
controller = Controllers.getController(i);
System.out.println(controller.getName());
}

buttonCount = controller.getButtonCount();
axisCount = controller.getAxisCount();

System.out.println("El controlador tiene " +
buttonCount + " botones y " +
axisCount + " ejes");

//Configuración de mando para sistemas MS y Linux
System.out.println("El sistema operativo es " + System.getProperty("os.name"));
if (System.getProperty("os.name").equalsIgnoreCase("Linux"))
this.SO = 0;
else
this.SO = 1;

}

public float[] getRightAxisValues(){
float[] values = new float[2];
Controllers.poll();
if (this.SO == 1){ //MS Windows
//Valor vertical (aceleracion)
values[0] = controller.getAxisValue(0)*(-1.0f);
//Valor horizontal (direccion)
values[1] = controller.getAxisValue(1)*(-1.0f);
}
else if (this.SO == 0){ //Linux
//Valor vertical (aceleracion)
values[0] = controller.getAxisValue(3)*(-1.0f);
//Valor horizontal (direccion)
values[1] = controller.getAxisValue(2)*(-1.0f);
//System.out.println(values[0] +" "+ values[1]);

}
else
System.exit(-1);

return values;
}

public boolean getButton(int n){
try{
Controllers.poll();
return controller.isButtonPressed(n);
}catch(Exception e){
return false;
}
}

}

En la caso de ejecución en GNU/Linux tuve un problema con un mensaje:
/dev/input/event0 cannot open device event0

La solución fue alterar los permisos de los dispositivos que eran 660 para el usuario root. Haciendo sudo chmod 666 /dev/input/event* se soluciona el problema.

Espero le sea útil a alguien.

jueves, 12 de abril de 2007

Los ficheros de configuración de PlayerStage

Para lanzar el servidor necesitamos un fichero .cfg que define los drivers que necesitaremos para la simulación.

Para cargar el simulador Stage y los dispositivos a simular del robot (el propio robot y dispositivo de ultrasonidos), el fichero sería el siguiente:

# load the Stage plugin simulation driver
driver
(
name "stage"
provides ["simulation:0" ]
plugin "libstageplugin"

# load the named file into the simulator
worldfile "simple.world"
)

driver
(
name "stage"
provides ["position2d:0" "sonar:0"]
model "robot1"
)

En primer lugar veamos el fichero de configuración del entorno en el que realizaremos la simulación. En el fichero .cfg teníamos:
worldfile "simple.world"

Esta línea, especifica en el driver de Stage que configuración de entorno (world) usaremos. En este caso el contenido del fichero simple.world es:

# Importamos el archivo en el que están definidos los datos del robot a utilizar
include "pioneer.inc"

# Importamos el archivo en el que están definidos los parametros del mapa
include "map.inc"

# Tamaño del entorno en metros
size [60 45]

# set the resolution of the underlying raytrace model in meters
resolution 0.02

# Configuraión de la ventana (tamaño, centro y escalado)
window ( size [ 800.000 600.000 ] center [0.000 0.000] scale 0.08 )

# Carga de la imagen con el mapa y definición del tamaño respecto al entorno
map
(
bitmap "bitmaps/robotux.png"
size [60 45]
)

# El robot
pioneer2dx
(
name "robot1"
color "red"
pose [-7.603 -4.391 -490.303]
)

El robot por defecto es el Pioneer2DX que si observamos en el fichero pioneer.inc da la posibilidad de configurarse con 8 ó 16 sónares en el anillo. En nuestro caso usaremos un anillo de 7 sonares por lo que debemos crear esa nueva configuración, lo único que hay que hacer es añadir a robot.inc la siguiente configuración:

# ---[ Configuración de anillo de 7 sonares ]---
define mi_sonar7 ranger (
scount 7
# transducer pose [Xpos Ypos Heading]
spose[0] [ 0.075 0.130 90 ]
spose[1] [ 0.115 0.115 60 ]
spose[2] [ 0.150 0.080 30 ]
spose[3] [ 0.170 0.025 0 ]
spose[4] [ 0.170 -0.025 -30 ]
spose[5] [ 0.150 -0.080 -60 ]
spose[6] [ 0.075 -0.130 -90 ]
# transducer size in meters [X Y] (affects the Stage window)
ssize[0] [ 0.01 0.05 ]
ssize[1] [ 0.01 0.05 ]
ssize[2] [ 0.01 0.05 ]
ssize[3] [ 0.01 0.05 ]
ssize[4] [ 0.01 0.05 ]
ssize[5] [ 0.01 0.05 ]
ssize[6] [ 0.01 0.05 ]
# transducer viewing parameters [Range_min Range_max FOV]
sview[0] [ 0 5.0 15 ]
sview[1] [ 0 5.0 15 ]
sview[2] [ 0 5.0 15 ]
sview[3] [ 0 5.0 15 ]
sview[4] [ 0 5.0 15 ]
sview[5] [ 0 5.0 15 ]
sview[6] [ 0 5.0 15 ]
)

Y al final de la definición estándar del robot (el bloque define pioneer2dx position) añadir el driver del anillo que hemos creado añadiendo la línea mi_sonar7() :

# use the sonar array defined above
mi_sonar7()
)

lunes, 5 de febrero de 2007

Javaclient2

Aunque considero que la mejor opción para trastear con Player/Stage es mediante Python, es cierto que en los ambientes universitarios se trabaja más con Java y que para los no universitarios que saben de Python, en el 99% de los casos, se sabe trabajar a nivel básico con Java.

Por todo esto considero, que una muy buena opción para empezar a programar cosas y probar el simulador es la JavaClient2.

Proporciona una forma bastante cómoda de acceder a la API de Player/Stage. Para instalarla la descargamos y descomprimimos.

Suponiendo que usamos un entorno de desarrollo como Eclipse, la forma de importar la javaclient2 es pulsando con el botón derecho al proyecto en Build Path/Add Library/User Library. Creamos una User Library dandole un nombre (javaclient2) y continuación le agregamos el .jar correspondiente que está en el directorio donde lo hemos descomprimido.

Ahora ya tenemos acceso a la biblioteca, podemos consultar la página de la Javaclient2 donde encontraremos toda la documentación necesaria, y diversos ejemplos.

martes, 30 de enero de 2007

El simulador Player/Stage

Si queremos trabajar en navegación autónoma dentro de la inteligencia artificial necesitaremos un simulador debido a dos motivos fundamentales:

- El precio de los componentes hardware.
- La velocidad de desarrollo

Dentro del mundo de los simuladores libres, sin duda uno de los máximos exponentes es el proyecto Player/Stage.

Este simulador tiene una arquitectura algo compleja que sería inútil explicar aquí, ya que en la página del proyecto se pueden encontrar recursos de sobra.

Hablando mal y rápido diremos que el software tiene una estructura donde un servidor (player) atiende peticiones de clientes heterogéneos de forma transparente. Por lo que podemos acceder con todo tipo de clientes ya sean de hardware real, como un Pioneer o un Khephera, o de un software de simulación, como sería Stage, y que es lo que instalaremos aquí.

Como vamos a usar Player junto con Stage deberemos bajar los fuentes de la página del proyecto. Personalmente he instalado la versión 2.0.3 en una Ubuntu 6.10 Edgy Eft, y esos serán los pasos que explicaré, pero no tiene que ser muy distinto para otras distribuciones.

Una vez que decargamos los fuentes, antes de instalarlos debemos comprobar que tenemos todas las dependencias instaladas. Para ubuntu necesitaremos los paquetes build-essential, libjpeg62-dev y libltdl3-dev (además de libgtk2-dev para stage), para lo que hacemos desde un terminal:

# sudo apt-get install build-essential libjpeg62-dev libltdl3-dev libgtk2-dev


Una vez hecho eso pasamos a instalar Player. Nos vamos al directorio donde descargamos los fuentes y hacemos:

# tar -jxvf player-2.0.3.tar.bz2

# cd player-2.0.3

# ./configure

Al terminar la configuración se muestra una lista con los dispositivos que se han instalado y los que no. Si hemos hecho toda la parte de dependencias correctamente deberíamos ver el mensaje Support for plugin drivers will be included en la lista, que es lo necesario para poder instalar Stage.

NOTA: Es muy interesante la librería para acceder a PlayerStage desde Python. Para ello son necesarios otros paquetes que serán analizados en un próximo post dedicado a la API para Python, para el que también es muy interesante el proyecto Pyro

Para terminar hacemos:

# sudo make install

Con esto ya tenemos listo Player. Ahora tan sólo queda repetir el proceso para Stage:

# tar -jxvf stage-2.0.3.tar.bz2

# ./configure

# sudo make install

Y con esto hemos terminado con la instalación. Es conocido un error en Ubuntu al tratar de arrancar un fichero de Stage en el que recibimos el mensaje:
err: unable to open color database /usr/X11R6/lib/X11/rgb.txt : No such file or directory (stage.c stg_lookup_color)
Fallo de segmentación (core dumped)

Este error (bastante feo por cierto) se debe a que el fichero que busca está ubicado en otro sitio . Concretamente, el fichero se encuentra en /etc/X11/ y en /usr/lib/X11/. La solución más rápida es crear un enlace a nuestro fichero en la ruta en la que espera Player que esté el fichero. Para esto hacemos:

# sudo ln -s /usr/lib/X11/rgb.txt /usr/X11R6/lib/X11/rgb.txt

Y con esta chapucilla ya tenemos listo nuestro simulador. En un próximo post haremos algo interesante con alguna librería cliente.

Saludos !!