Latest entries
Flashear con Arduino IDE en Ubuntu
17 February 2012
Si intentamos programar con Arduino en Ubuntu y nos encontramos con un error similar a este "Serial port COM1 not found. Did you select the right one from the Tools>Serial Port menu ?". Lo más posible es que no tengamos permisos para acceder al USB como usuario normal. Para solucionar esto podemos crear una regla udev:
$ sudo gedit /etc/udev/rules.d/98-ftdi.rules
y añadimos la siguiente linea:
SUBSYSTEMS=="usb", ATTRS{product}=="FT232R USB UART", ATTRS{idProduct}=="6001", ATTRS{idVendor}=="0403", SYMLINK+="ttyUSB%n"
Y por último, recargamos las reglas de udev:
$ sudo udevadm control --reload-rules
Activar autologin sin necesidad de XDM, GDM, KDM, etc.
16 February 2012
Usualmente, las distribuciones de Linux utilizan un Display Manager, como pueden ser XDM, GDM ó KDM.
Vamos a editar el fichero /etc/rc.local y añadiremos al final la siguiente línea:
su - user -c startx
donde user es el usuario que arrancará la sesión gráfica.
Para desactivar el arranque automático, bastará con comentar o borrar la línea anterior.
Nota importante
Vamos a entender lo que está pasando aquí. Básicamente, con el método anterior antes de que se llegue a llamar a la consola tty1, "startx" es llamado por rc.local. Así que, básicamente mientras estés en el escritorio no estará disponible la consola de inicio de sesión tty1 (la que se obtiene al pulsar Ctrl-Alt-F1).
Para poder acceder a la consola, habrá que cerrar sesión en el escritorio en cuestión y tendremos acceso a tty1. Podremos volver a acceder al entorno gráfico ejecutando "startx" una vez logueados.
Preparar un Alix para exposiciones (Parte 1)
16 February 2012
Estos días he posteado acerca de cómo instalar y configurar Debian en cualquier Alix. Hoy me voy a centrar en un modelo particular Alix.1D, el cuál trae salida VGA, lo cuál lo hace especialmente atractivo para realizar pequeñas exposiciones, pases de diapositivas, museos, etc.
Para ello, partiendo de una instalación básica como la que ya se ha comentado, en esta serie de artículos trataré de describir muchos de los aspectos que se pueden tener en cuenta.
Hacer una petición a un WebService con curl
15 February 2012
Para comprobar rápidamente si un WebService está funcionando podemos utilizar el comando curl para hacer una petición y obtener la respuesta.
Para ello:
$ curl -d @request.xml http://localhost/soap/service
donde request.xml es el fichero que contiene la petición SOAP.
Actualización: 16/02/2012 0:44
Se me olvidó poner las cabeceras que son necesarias para que todo funcione:
$ curl -d @request.xml -H "SOAPAction: http://localhost/soap/service/action" -H "Content-Type: text/xml; charset=UTF-8" http://localhost/soap/service
Invalid MIT-MAGIC-COOKIE-1 key
14 February 2012
Haciendo unas pruebas con el servidor X he me encontrado con un mensaje misterioso error: Invalid MIT-MAGIC-COOKIE-1 key. Para solucionarlo he borrado los archivos .Xauthority de mi directorio personal.
rm ~/.Xauthority*
Instalación de Debian sobre Alix (Parte 2)
14 February 2012
Ayer contaba como podemos hacer una instalación básica de Debian sobre Alix. En concreto, faltó la instalación de un kernel y un gestor de arranque para tener un sistema operativo funcional. Cada uno puede elegir el software y las versiones que quiera. Yo en mi caso particular voy a utilizar la versión estable de linux para 486 y Grub2.
Proteger la edición de Grub2 con password
14 February 2012
En ciertos equipos son importantes algunas medidas de seguridad. En este caso voy a explicar cómo podemos proteger partes del arranque mediante contraseña. Podemos enfocarlo desde distintos puntos de vista:
- Edición de las entradas del menú: no se puede editar ninguna entrada sin contraseña
- Protección de arranque: no se puede arrancar una o varias entradas del menú sin contraseña
Edición de las entradas
Este caso es el más sencillo. Simplemente hay que editar el fichero /etc/grub.d/00_header y añadimos al final lo siguiente:
cat << EOF
set superusers="user"
password user 1234
EOF
Ahora, cada vez que alguien intente editar una entrada del menú, tendrá que autenticarse. Es importante tener en cuenta que estos usuarios no tienen nada que ver con los usuarios del sistema.
Protección de arranque
Aquí es posible realizar distintos tipos de configuraciones, debido a que suelen existir varias entradas en cada instalación. Por ejemplo, supongamos que queremos proteger todas las entradas de Linux, pero no nos importan el resto del sistemas operativos instalados. Para ello editaremos el fichero /etc/grub.d/10_linux sustituyendo la siguiente línea
printf "menuentry '${title}' ${CLASS} {\n" "${os}" "${version}"
por
printf "menuentry '${title}' ${CLASS} --users user {\n" "${os}" "${version}"
Si se quieren proteger todas las entradas, será necesario editar todos los ficheros que hay en /etc/grub.d/.
Actualizando los cambios
No se debe modificar nunca directamente el fichero /boot/grub/grub.cfg, ya que en la versión 2 de Grub éste se genera automáticamente a través del fichero /etc/default/grub y los que hay en /etc/grub.d/.
Para terminar, vamos a regenerar el fichero /boot/grub/grub.cfg:
$ sudo update-grub2
Instalación de Debian sobre Alix
13 February 2012
Alix es un pequeño PC empotrado que utiliza procesadores AMD Geode LX. Estos equipos son muy pequeños y no se calientan, por lo que no es necesaria refrigeración externa (ni siquiera un ventilador). La limitación de la mayoría de los dispositivos Alix es la falta de salida VGA y el dispositivo de almacenamiento: CompactFlash. Por tanto, la instalación típica se hace desde un PC en la tarjeta de memoria y luego Debian arrancará desde la tarjeta de memoria una vez colocada en Alix.
OnlyGL
2 February 2012
Últimamente he estado bastante liado, entre el trabajo, la carrera y el máster apenas tengo tiempo para escribir.
Como resultado de unas prácticas de una asignatura, Diseño Asistido por Computador, he desarrollado un pequeño Framework en Python con OpenGL cuyo objetivo es desarrollar escenas 3D de forma rápida y sencilla. En unas pocas líneas de código podemos ver los resultados rápidamente.
He liberado el código fuente del Framework y está disponible en GitHub: OnlyGL. Aunque en principio no tengo intención de seguir evolucionando OnlyGL, acepto sugerencias y no tengo problema en invertir algún tiempo si alguien está interesado en algo concreto.
Capturar señales en Python
9 December 2011
A continuación dejo un pequeño ejemplo de como se pueden capturar señales con Python:
import signal
import time
import sys
def signal_handler(sig, func=None):
print 'SignalHandler. Saliendo...'
sys.exit(0)
if __name__=='__main__':
signal.signal(signal.SIGTERM, signal_handler)
print 'Esperando 15 segundos...'
time.sleep(15)
print 'Finalizado'
La idea es muy simple, el programa espera 15 segundos y finaliza. Si se envía la señal SIGTERM (señal 15) el proceso terminará sin esperar. Veamos como se ejecuta de forma normal:
$ python test.py
Esperando 15 segundos...
Finalizado
Y aquí podemos ver cómo se capturan las señales y se finaliza antes el proceso:
$ python test.py &
[1] 8172
Esperando 15 segundos...
$ kill -15 8172
SignalHandler. Saliendo...
[1]+ Hecho python test.py
$
Mútliples interfaces con Madwifi
8 December 2011
Hoy me he encontrado con el siguiente problema, necesito montar dos interfaces virtuales sobre una tarjeta Wifi Atheros. Una de estas interfaces debe estar en modo Station (en modo cliente, como suelen funcionar las tarjetas en los portátiles) y otra en modo Ad-Hoc.
Para ello tengo instalado madwifi y funcionando perfectamente. Tras mucho pelear, me he dado cuenta que es importante el orden de creación de las interfaces virtuales. Madwifi sólo permite una interfaz en modo Station sobre una tarjeta física, y una vez creada una, ya no se permite crear más y nos encontramos con el siguiente error:
# wlanconfig ath create wlandev wifi0 wlanmode adhoc
wlanconfig: ioctl: Input/Output error
Por tanto, si vamos a crear un VAP es necesario dejar la Station para la última.
LPCXpresso: Ee(07). Bad ACK returned from status - wire error
30 November 2011
Hace unos días conseguí una placa de evaluación LPC1343 de NXP, descargué LPCXpresso y todo iba bien. Tras trabajar algunos días con ella, me he encontrado el siguiente error al intentar flashear:
Error launching Debug\blinky.axf
02:Failed on connect: Ee(07). Bad ACK returned from status - wire error.
Cómo deshabilitar cuenta de invitado en Ubuntu 11.10
30 November 2011
En esta última versión de Ubuntu, 11.10, por defecto trae instalado LightDM. Por defecto viene activa la cuenta de invitado, y a veces no es deseable. Para deshabilitarla es necesario editar el fichero /etc/lightdm/lightdm.conf y añadirle el parámetro allow-guest=false.
Breves: Instalar bácula para PostgreSQL sin MySQL
28 November 2011
Iba a instalar Bacula en Ubuntu y me he encontrado con que intenta instalar todas las dependecias de MySQL (cerca de 30MB). Cómo estoy utilizando PostgreSQL, no necesito instalar todas estas dependencias. Para ello:
# apt-get install bacula-common-pgsql bacula-director-pgsql bacula-server bacula
Configurar Gitosis
28 November 2011
Gitosis es básicamente una herramienta que nos permite gestionar los accesos a repositorios Git. Esto lo realiza a través de SSH, gestionando el fichero authorized_keys del usuario gitosis.
Instalación
Para su instalación, bastará con ejecutar lo siguiente:
$ sudo apt-get install git-core gitosis
dependiendo de la versión de Ubuntu/Debian disponible, el paquete que contiene Git se puede llamar git o git-core.
Una vez instalado, vamos a dar acceso al administrador. Para ello, supongamos un usuario con permisos de administración llamado user.
$ sudo -H -u gitosis gitosis-init < /home/user/.ssh/id_user.pub
Initialized empty Git repository in /srv/gitosis/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /srv/gitosis/repositories/gitosis-admin.git/
Ahora, desde el cliente, vamos a probar la conexión SSH:
$ ssh gitosis@miservidor.com
Si todo ha ido bien, tenemos el acceso al servidor, así que ya podemos cerrar la conexión SSH.
Añadir repositorios y usuarios
Lo primer es clonar el repositorio de administración. A través de él podremos controlar los repositorios y los usuarios de forma simple y sencilla.
$ git clone gitosis@miservidor.com:gitosis-admin.git
Cloning into gitosis-admin...
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 0), reused 5 (delta 0)
Receiving objects: 100% (5/5), done.
Aquí tenemos disponibles dos elementos claves:
- gitosis.conf: Fichero de configuración
- keydir: directorio con las claves públicas de los usuarios que tienen acceso
Vamos a crear otro repositorio nuevo llamado miproyecto, para ello editamos gitosis.conf:
[gitosis]
[group gitosis-admin]
writable = gitosis-admin
members = user
[group miproyecto]
writable = miproyecto
members = user member1 member2
Y añadimos las claves de los usuarios member1 y member2:
$ cd gitosis-admin
$ cp ~/member1.pub keydir/
$ cp ~/member2.pub keydir/
Ahora vamos a subir los cambios al servidor:
$ git add keydir gitosis.conf
$ git commit -m 'miproyecto con member1 y member2'
$ git push
Creando nuevos repositorios
Hasta ahora, hemos indicado a gitosis que habrá un nuevo repositorio y los usuarios que tienen acceso a él. Ahora vamos realmente a crear el repositorio. Todo esto se hace desde el lado del cliente:
$ git init miproyecto.git
Initialized empty Git repository in /home/member1/miproyecto.git/.git/
$ cd miproyecto.git/
$ git remote add origin gitosis@miservidor.com:miproyecto.git
Si tratamos de subir los cambios al servidor, nos indicará que el repositorio está vacío.
$ git push origin master
Initialized empty Git repository in /srv/gitosis/repositories/miproyecto.git/
error: src refspec master does not match any.
error: failed to push some refs to 'gitosis@miservidor.com:miproyecto.git'
Así que vamos a crear algo de contenido:
$ echo "" > README
$ git add README
$ git commit
[master (root-commit) 0dcec56] Initial commit
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 README
$ git push origin master
Initialized empty Git repository in /srv/gitosis/repositories/miproyecto.git/
Counting objects: 3, done.
Writing objects: 100% (3/3), 215 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To gitosis@miservidor.com:miproyecto.git
* [new branch] master -> master
Y con esto todo listo :)
La teoría es cuando crees saber algo, pero no funciona.
La práctica es cuando algo funciona, pero no sabes por qué.
Los programadores combinan la teoría y la práctica:
Nada funciona y no saben por qué.
