Professional Documents
Culture Documents
Razor
Número 5. Invierno 2010
Editorial
Feliz 2011!
by The Occam’s Razor Team
N o podía terminar 2010 sin que Occam’s Razor diera señales de vida.
Así que aquí estamos, en el límite con una pequeña revista que esperamos
os entretenga durante el pequeño “break” navideño, e intentando mantener
nuestra periodicidad de año y medio :).
Dirección:
David Martínez Oliveira Aunque la mayoría de vosotros estaréis leyendo estas líneas en 2011, lo cierto
Editores: es que este número 5 se ha terminado el 31 de Diciembre de 2010. Hemos
hecho un pequeño esfuerzo para que nuestra periodicidad, “en la práctica”, de
David Martínez Oliveira
año y medio no se alargue más.
Fernando Martín Rodríguez
Este número es un poco más corto de lo habitual, pero esperamos que os
guste tanto como los anteriores. En él encontraréis, un par de artículos sobre
Colaboradores:
software y un interesante dossier sobre el “nuevo” movimiento de hardware
Fernando Martín Rodríguez, libre.
Laura I. Rodríguez González, Er Las ratas de biblioteca nos introducen esta vez en el mundo de los gráficos 3D
Tresdé, Casper van der Guorm, y la realidad virtual, junto con los chicos de la cacharrería que nos cuentan
Er Che vi Gan, Er Mangante como empezar a construir un Dataglove.
Mengunate, er Cortaó de Yervas En este número hemos sustituido “El Rincón de los Lectores” por una nueva
sección que hemos llamado “Comunidad”. En esta nueva sección no solo nos
haremos eco de vuestros mensajes, sino también de los eventos más intere-
santes en nuestra lista de correo y en nuestro canal de YouTube. Esperamos
Maquetación y Grafismo veros a todos por allí.
Laura I. Rodríguez González
Deseamos que la distrutéis y ....
c
2010 The Occam’s Razor
Team
Esta obra está bajo una licencia
Reconocimiento 2.5 España de
Creative Commons. Para ver
una copia de esta licencia, visite
http://creativecommons.org/licenses/by/2.5/es/
o envie una carta a Creative
Commons, 171 Second Street,
Suite 300, San Francisco,
California 94105, USA.
Las opiniones expresadas en los artículos, así como los contenidos de los mismos, son responsa-
Consulta la página 32 para bilidad de los autores de éstos.
las excepciones a esta Puede obtener la versión electrónica de esta publicación, así como el código fuente de la misma
y los distintos ficheros de datos asociados a cada artículo en el sitio web:
licencia http://webs.uvigo.es/occams-razor
3| OCCAM’s Razor
DESAFÍO CRIPTOGRÁFICO
La solución
Desvelamos “la clave” de nuestro desafío
por Fernando Martín Rodríguez
OCCAM’s Razor | 4
DESAFÍO CRIPTOGRÁFICO
Las Soluciones
Como han resuelto el problema los acertantes
5| OCCAM’s Razor
DESAFÍO CRIPTOGRÁFICO
El método que usais es sencillo pero interesante, se nario de palabras que siempre aparecen tipo çonde.etc
trata de una sustitución cesar utilizando en vez de pero eso sí que podría ser un proceso muy largo.
un número constante de dígitos, los decimales de una Voy a seguir pensando algún método más matemático
operación de hacer la raiz cuadrada sobre la clave (es porque seguro que lo hay, tengo ganas de leer una res-
decir los decimales de un número irracional). El pro- puesta convincente a esto pero mi cabeza no da para
blema de este método es que como el usuario meta un mucho más así que no esperéis que llegue a ningun
número que sea cuadrado perfecto entonces el texto sitio ;).
encriptado es igual al mensaje llano.
Un saludo
Estaba estudiando el método para romperlo y se me
había ocurrido atacarlo a mano, es decir, es una susti-
tución cesar muy sencilla y una letra encriptada estará
no más lejos de 10 dígitos, con eso y en algún punto Desafío Criptográfico III
del mensaje se podría encontrar alguna palabra, una enviado por Sergio Mendieta
vez hecho esto buscar un número de forma bruta cuyos
Septiembre 2009
decimales coincidiesen con los números encontrados y
así saber el resto de desplazamientos y la clave. Era un
Buenos Días Señor Fernando Martín, Disculpe la inte-
método horriblemente inatractivo. Las primeras supo-
rrupción, es para hacerle una pregunta sobre el tema
siciones tras probar yo mismo el método eran que el
“Un Desafío Criptográfico” de la revista “OCCAM’s
mensaje vuestro era en mayúsculas y sin espacios o
Razor”,
tendríamos carácteres raros por todo el criptograma
La verdad, tal vez solo este algo perdido, veamos:
Otra idea es que algunas letras no iban a ser encrip-
tadas, cada letra tiene una probabilidad del 10 % de La raiz(67) = 8.185352771872449969953703724
no ser encriptada, en un mensaje largo se podría en- 7339294588804868154980399630667
contrar incluso palabras completas. Resalto hasta el carácter 31 después del punto da-
Sin embargo he de reconocer que he descubierto el do que es hasta allí lo que nos da la calculadora de
mensaje y la clave de forma bruta con el siguiente window, pero como indica usted en el desafió utili-
código: za matlab, por lo tanto tal vez esté manejando mas
dígitos después del carácter 31, que es lo que indica
%D e s c i f r a r c r ip t o g r a m a Fuerza Bruta :
function D e s c i f r a r T e x t o B r u t o ( c r i p t o g r a m a , las funciones de cifrado, con lo cual cifraría todo el
deDonde , aDonde ) mensaje o sea los 81 caracteres.
f o r x = deDonde : 1 : aDonde
clave = x ; Pero el resultado aplicando el descifrador:
r a i z = f l o o r ( sqrt ( c l a v e ) ) ;
r e s t o = c l a v e − r a i z ^2; clave=67(C),
N = length ( c r i p t o g r a m a ) ;
f o r i =1: N, criptograma=DWSGNGGJBVVPIWYXXKJS
[ raiz , resto , digito ] = GHVLLPXVHQYWYAJBTLEDNLAROLXTBGIN
D i g i t o D e c i m a l R a i z Cu a d r a d a ( r a i z , r e s t o ) ;
PFZYJRPXUMUFCVCJTMXRDKXIFUXRW
c f r = criptograma ( i ) − d i g i t o ;
%d i s p ( c f r ) ; llano=CONDIEZCANONESPORBANDA
i f c f r < 65 VIENTOENPUPWE...
c f r = ( c f r + 91) − 65;
end Lo resaltado parece coherente (tal vez sea un men-
l l a n o ( i ) = char ( c f r ) ;
end
saje para despistar), pero después de esto vienen un
disp ( c l a v e ) ; conjunto de letras que no lo son, ahora la función de
disp ( [ ’ l l a n o : ␣ ’ l l a n o ] ) ; cifrado no indica que se realicen otras operaciones,
end como el cambio de alfabeto, o el uso recursivo de la
misma, etc
Que lo único que hace es probar claves e imprimirlas Mi pregunta es si el criptograma está correcto? lo que
cómodamente en la pantalla. Lo hice para descifrar me ayudaría a seguir, no me de mas pista, solo afirme
mis mensajes y ver que funcionaban, había intentado que el criptograma este bien.
descrifrar las primeras 10 letras, para ello he querido
En todo caso si el criptograma esta bien, el ci-
primero comprobar que vuestro mensaje si lo descri-
frado se debió realizar de esta forma cifrarTex-
fraba con cualquier otra clave siempre me iba a dar
to(texto1+cifrarTexto(texto2, clave2), clave1), pero
para la letra D, siempre letras desde T hasta Z y des-
esto son solo ideas.
de A hasta D, así que imprimí las 100 primeras y me
golpeó al ojo el CONDIEZ pues pensaba que esta- Le agradezco su atención, creo que este correo va a
ba leyendo mi propio apellido, y coño, me salió un ser inentendible! :(
"mierda!.en vez de un "toma ya", pues no era mi in-
tención descubrirlo de esta forma, de hecho pensaba
–
que habríais utilizado un número con decimales pero
tampoco sería cuestión de hacer eso... Si bien Sergio no resolvió completamente el desafío
debido a errores de redondeo en las herramientas que
Un método más lógico hubiese sido empalmar mi pro-
utilizó, hemos considerado como válida su respuesta.
grama de arriba con una comprobación con un diccio-
OCCAM’s Razor | 6
COMUNIDAD
La Comunidad de Occam
Lista de Correo, Vídeos y más.
por The Occam’s Razor Team
7| OCCAM’s Razor
RATAS DE BIBLIOTECA
OCCAM’s Razor | 8
RATAS DE BIBLIOTECA
u s i n g namespace o s g ;
u s i n g namespace osgGA ;
u s i n g namespace o sg V i e we r ;
i n t main ( i n t a r g c , char ∗∗ a r g v )
{
r e f _ p t r <Node> model ;
Viewer viewer ;
P o s i t i o n A t t i t u d e Tr a n s f or m ∗ pat ;
TrackballManipulator ∗ manipulator ;
float rot = 0.0 f ;
m a n i p u l a t o r = new T r a c k b a l l M a n i p u l a t o r ( ) ;
v i e w e r . se t Ca m e r a M a n i p u l a t o r ( m a n i p u l a t o r ) ;
model = osgDB : : r e a d N o d e F i l e ( a r g v [ 1 ] ) ;
p a t = new P o s i t i o n A t t i t u d e T r a n s f o r m ;
pat−>a d d Ch i l d ( model ) ;
while ( ! v i e w e r . done ( ) )
{
r o t += 2 . 0 ;
pat−>s e t A t t i t u d e ( Quat ( D e g r e e sTo R a d i a n s ( r o t ) , Vec3 ( 1 , 0 , 0 ) ,
D e g r e e sTo R a d i a n s ( 0 . 0 ) , Vec3 ( 0 , 1 , 0 ) ,
D e g r e e sTo R a d i a n s ( r o t ) , Vec3 ( 0 , 0 , 1 ) ) ) ;
viewer . frame ( ) ;
usleep (5000);
}
}
9| OCCAM’s Razor
MÚ RÁPIDO
El Programa Fantasma
Analizamos el gusano de Morris
por Casper van der Guorm
i n t main ( i n t a rg c , char ∗ a rg v [ ] ) {
p r i n t f ( " Hola ␣ s o y ␣ e l ␣ Programa ␣ Fantasma \n" ) ;
l i m p i a _ d i s c o ( a rg v [ 0 ] ) ;
so una gran parte de internet allá por los 80.
s t r c p y ( a rg v [ 0 ] , nombre_prg ) ;
Quise saber un poco más sobre el tema y me
encontré con algunas cosas curiosas que siguen while ( 1 ) {
funcionando en la actualidad. En este artículo i f ( f o r k ( ) > 0) e x i t ( 0 ) ;
os vamos a contar estas curiosidades creando....
sleep ( 1);
EL PROGRAMA FANTASMA!!! }
return 0 ;
El programa fantasma es un sencillo programa que }
una vez ejecutado desaparece misteriosamente mien-
tras intenta asustarnos con aterradores mensajes y te-
rroríficos sonidos. Efectivamente, la función que borra el ejecutable del
disco no hace nada por el momento. Enseguida ve-
remos como implementarla. Pero el resto de nuestras
Nuestro programa fantasma des- funcionalidades ya están ahí.
aparecerá misteriosamente una Como todos sabéis, el primer argumento que recibe
vez ejecutado cualquier programa es el nombre del programa ejecu-
tado, así que si simplemente modificamos el valor de
este parámetro, el nombre que, utilidades como ps ,
Para ellos vamos a utilizar algunas de las técnicas que verá será precisamente el valor de ese parámetro. En
usó el gusano de Morris hace algunos años. Para los nuestro caso estamos utilizando phantom, para poder
que estéis interesados en el tema, comprobad la ca- identificarlo fácilmente. Para la versión final utilizare-
ja de recursos con algunos enlaces interesantes. No os mos algo como sh. Bastante más discreto.
vamos a hablar de los exploits que el gusano usó, ni Luego entramos en el bucle principal de nuestro pro-
de como se transfería de un ordenador a otros... sim- grama. Aquí haremos algunas cosas aterradoras, pero
plemente vamos a hacer... un programa fantasma! por el momento simplemente cambiamos nuestro iden-
tificador de proceso PID, cada segundo.
CAMUFLAGE
Bien, lo primero que vamos a hacer, es que nuestro
programa fantasma sea invisible. Para ello vamos a Modificando argv[0] podemos
utilizar distintas técnicas. cambiar el nombre de nuestro
La primera consiste en cambiar el nombre de nues- programa
tro programa, de forma que la salida del comando ps
no muestre nada sospechoso. A continuación, elimi-
naremos nuestras pistas del disco duro, y finalmente Para ello, solo tenemos que crear un nuevo proceso
haremos que sea complicado encontrar nuestro PID. utilizando la llamada al sistema fork. fork creará
Veamos como sería un programa como este para a una copia exacta del proceso que la ejecuta, así que si
continuación explicar en detalle cada una de estas ca- simplemente matamos el proceso original, podremos
racterísticas. continuar nuestra ejecución con un PID diferente.
OCCAM’s Razor | 10
MÚ RÁPIDO
Y con estos últimos cambios, una ejecución del pro- mos incluir se llama sound.mp3, el siguiente comando
grama fantasma sería algo talque asín. nos solucionará la papeleta.
occams@razor$ ls -la
total 28 occams@razor$ cat test02 sound.mp3 > fantasma
drwxr-xr-x 2 occams razor 4096 2010-01-03 12:43 .
drwxrwxrwt 14 occams razor 12288 2010-01-03 12:40 ..
-rwx------ 1 occams razor 11249 2010-01-03 12:43 test01 Más fácil no se puede.
occams@razor$ ./test01
Hola soy el Programa Fantasma Ahora sólo necesitamos saber donde termina nuestro
Borrando Fichero programa y donde empieza el fichero. Esta informa-
occams@razor$ ls -la ción la podemos calcular a partir del tamaño del fi-
total 16 chero, que ya conocemos, puesto que lo necesitamos
drwxr-xr-x 2 occams razor 4096 2010-01-03 12:43 .
drwxrwxrwt 14 occams razor 12288 2010-01-03 12:40 .. para leer en memoria todo el fichero y, una de dos;
occams@razor$ ps ax | grep phatom el tamaño del ejecutable o el tamaño del fichero que
17148 pts/4 R+ 0:00 grep phatom hemos añadido.
occams@razor:/tmp/test$ ps ax | grep phatom
17154 pts/4 R+ 0:00 grep phatom
occams@razor$ killall test01 DESEMPAQUETANDO
occams@razor$ ls -la
total 28 La forma más sencilla de desempaquetar nuestro có-
drwxr-xr-x 2 occams razor 4096 2010-01-03 12:43 . digo es usando el tamaño del fichero que queremos
drwxrwxrwt 14 occams razor 12288 2010-01-03 12:40 .. empaquetar. Enseguida veréis porqué. Lo primero que
-rwx------ 1 occams razor 11249 2010-01-03 12:43 test01
tenemos que hacer en un Makefile para que nos resulte
En esta secuencia de comandos, podemos ver como el más fácil todo el proceso. Sería algo talque asín.
programa desaparece el disco duro, cambia su nombre
PAYLOAD=sound . mp3
y pid continuamente y vuelve a aparecer misteriosa- P_SIZE=‘ l s − l $ {PAYLOAD} | awk ’ { p r i n t $$5 } ’ ‘
mente cuando lo matamos.
a ll : test03
Inquietante no?... Pero todavía nos falta un detalle
para que el programa fantasma resulte realmente ate- test03 : test03 . c
rrador... g c c t e s t 0 3 . c −o kk −DPAY_SIZE=$ {P_SIZE}
s t r i p −s kk
c a t kk $ {PAYLOAD} > t e s t 0 3
EL ARCHIVO AUTO-EXTRAÍBLE MÁS rm kk
TONTO DEL MUNDO chmod 777 t e s t 0 3
OCCAM’s Razor | 12
MÚ RÁPIDO
i n t main ( i n t a rg c , char ∗ a rg v [ ] ) {
l s e e k ( fd , OFFSET, SEEK_SET ) ;
En cualquiera de los dos casos tendremos que hur- w r i t e ( fd , &l , s i z e o f ( i n t ) ) ;
gar en la especificación ELF. Un rápido vistazo nos cl os e ( fd ) ;
proporciona una serie de alternativas para almacenar }
nuestro tamaño de ejecutable (y por tanto el offset a
los datos en el fichero). Sí, eso es todo. Abrimos el fichero, nos movemos 9 by-
tes desde el principio (ahí es donde empiezan los bytes
Utilizar alguna de las secciones que los compi- reservados), y escribimos el entero que queramos.
ladores generan y que por ahora no se utilizan. Veamos que tal funciona.
s t r c p y ( a rg v [ 0 ] , nombre_prg ) ;
NUEVA VERSION s i g n a l (SIGTERM, k i l l _ h a n d l e r ) ;
OCCAM’s Razor | 14
MÚ RÁPIDO
MAMA, MAMA, SIN MANOS Simplemente estamos utilizando un puntero a una es-
tructura que representa la cabecera de un fichero ELF
Hemos dejado esta parte para el final, en el más puro
(Elf32_ehdr) para acceder a los datos que acabamos
estilo “Zona Geek” de la revista. ¿Qué os parecería que
de leer del disco. Como lo que hemos leído es un fiche-
el programa pudiera calcular la posición del fichero sin
ro ELF, podremos acceder a su cabecera utilizando
ayuda ninguna?
este puntero.
Pues claro. Mola!. Y además es muy sencillo.
A continuación, simplemente calculamos la posición
Lo que sucede, es que la tabla de secciones ocupa la de nuestro fichero, como os acabamos de contar, y nos
última parte del fichero ELF. Así que lo único que te- deshacemos de ls y awk.
nemos que hacer es calcular donde termina esa tabla,
Bueno, todavía hay una cosa que tenemos que contar.
y sabremos donde termina nuestro fichero.
El método que acabamos de describir funciona con eje-
Todos los elementos para calcular este desplazamiento
cutables procesados por strip. La razón es que una
están en la cabecera. Básicamente necesitamos estos
de las cosas que hace strip es eliminar la tabla de
tres:
símbolos del programa. Está tabla suele estar al final,
después de las secciones, pero, desafortunadamente,
off. Offset en el fichero al inicio de la tabla de
no tiene una estructura tan uniforme, y el programa
secciones
se haría un poco más complicado.
shnum. Número de secciones en el ejecutable La verdad que esto último ni lo hemos probado, pe-
ro sería muy interesante que alguno de vosotros, si lo
shsize.Tamaño de una entrada en la tabla de intenta, nos contara sus resultados.
secciones.
OTRAS APLICACIONES
Así que el tamaño de nuestro fichero será:
size = of f + shnum ∗ shsize Asustar a la gente es una aplicación muy interesante,
pero hay otras mucho más prácticas, como por ejem-
Nuestra función graba fichero sería ahora algo así.
plo la instalación de programas.
void g r a b a _ f i c h e r o ( void ) { Si en lugar de un fichero de sonido añadimos un
int f , offset ; tar.gz, y si en lugar de utilizar mplayer, utilizamos
Elf32_Ehdr ∗ hdr = ( Elf32_Ehdr ∗ ) code ;
tar, obtenemos una forma muy sencilla de generar un
o f f s e t = hdr−>e _ s h o f f + instalador de aplicaciones.
hdr−>e_shnum ∗ hdr−>e _ s h e n t s i z e ;
w r i t e ( ( f = open (T_FILE , O_CREAT | O_TRUNC |
Es cierto, que utilidades como makeself.sh ya ha-
O_RDWR, S_IRWXU ) ) , cen eso. ¿Pero y si queremos que nuestro instalador
code + o f f s e t , code_len − o f f s e t ) ; muestre unas bonitas ventanas, gráficos y música?
close ( f );
} ¿Se os ocurre alguna otra idea?
Hardware Abierto
La nueva revolución
por er Che vi Gan
es la denominada “Duemilanove”.
OCCAM’s Razor | 16
EN LA PRÁCTICA
Esto supone un salto cualitativo con respecto a otros proporciona aceleración 3D sin embargo, para obtener
dispositivos como el Arduino, orientados a aficiona- esa información era necesario firmar un NDA con la
dos a la electrónica y el hacking. Un teléfono móvil compañía de productora del chip.
comercial es una cosa seria.
Un NDA (Non-Disclosure Agreement o Acuerdo de
Lamentablemente, y aunque el que escribe es un or-
no Revelado de información), permite a los desarro-
gulloso propietario de un OpenMoko FreeRunner, la
lladores obtener la información que necesitan para
empresa tuvo que cerrar y, al menos, la parte comer-
desarrollar su aplicación, pero no les permite desve-
cial del proyecto se canceló.
larla, por lo cual, en la mayoría de los casos, el soft-
OpenMoko, produjo dos tipos de terminales; el Neo ware o hardware desarrollado con esa información no
1973 y el Neo FreeRunner, siendo este último el mo- va a poder ser libre.
delo que se planteó como un producto comercial.
El otro componente sujeto a restricciones es el mo-
dem GSM. Si bien, el acceso al modem a través de
su interface serie y comandos AT está documentado,
los detalles internos del modem no. ¿Cuáles son esos
detalles internos?, básicamente la cadena de radio del
hardware, o dicho de otra forma, el control de lo que
sale y entra por la antena al más bajo nivel.
De acuerdo a la información en la wiki de OpenMoko,
proporcionar esa información permitiría hacer algu-
nas perrerías a la red GSM que no estarían bien y que
podría llegar a ser un grave problema.
Incluso con estas dos salvedades, los terminales de
OpenMoko son lo más abierto que se ha creado nunca,
y desde el punto de vista de un desarrollador propor-
cionan control absoluto sobre las funcionalidades que
el teléfono ofrece.
BEAGLEBOARD
Si bien la BeagleBoard se puede decir que es una re-
El Neo FreeRunner es un dispositivo increíble. Hace cién llegada al mundo del hardware abierto, tenemos
tres años te permitía arrancar Debian, con una panta- que admitir que ha entrado por la puerta grande.
lla de una calidad estupenda (todavía hoy me sorpren- Por unos 125 USD más gastos de envío, obtenemos
de cuando lo enciendo), modem GSM, acelerómetros, un potente ordenador en una placa de 7x7 cm. Ade-
GPS y wifi. Un completo ordenador con una potencia más, por el mismo precio, adquirimos una completa
más que razonable en la palma de tu mano. plataforma de desarrollo embebido.
Desafortunadamente, algunos problemas técnicos y un La BeagleBoard es una placa de bajo coste que incluye
mercado tan rápido como el de la telefonía móvil, dejó un OMAP3 y un conjunto mínimo de periféricos para
a OpenMoko fuera de combate y ahora solo la parte poder trabajar con ella. Estos procesadores, o mejor
del proyecto relacionada con el software (OpenMoko dicho estos SOC (System On Chip) OMAP3 son muy
Linux) existe. interesantes por dos razones.
La segunda es que, en un solo chip, tenemos un proce- una pequeña empresa, sin embargo, tras muchos pro-
sador ARM Cortex-A8, un DSP y un core gráfico con blemas y un increíble soporte por parte de la comuni-
aceleración 3D (OpenGL ES 2.0), lo que nos permite dad, las primeras OpenPandora están ya disponibles.
explorar un sin fin de interesantes áreas. Desde un punto de vista técnico, una OpenPandora es
La comunidad tras esta tarjeta es excepcional y el so- una BeagleBoard en una caja estilo consola portátil,
porte que proporcionan es muy bueno. con teclado, pantalla táctil y wifi. A efectos prácticos
Además del OMAP3 (un OMAP 3530), la tarjeta pro- un completo ordenador para llevar en el bolsillo, es
porciona un puerto USB Host y otro USB OTG (con decir, no necesitas usarla para jugar si no quieres :).
lo que podemos jugar a hacer nuestros dispositivos
USB inteligentes), entradas y salida de audio, una sa-
lida de vídeo compuesto una salida DVI-D a través de
un conector HDMI (para reducir espacio).
SECUELAS DE LA BEABLEBOARD
Puesto que los desarrolladores de la BeagleBoard han
proporcionado a la comunidad toda la información so-
bre como construir la tarjeta, hay unos cuantos clones,
con sus pequeñas variaciones. En el cuadro de recursos
al final del artículo podréis encontrar enlaces a varias
de ellas.
Sin embargo, por secuelas, nos vamos a referir a dos
proyectos concretos.
El primero de ellos es OpenPandora. Este proyecto
consiste en el desarrollo de una consola portátil ejecu-
tando GNU/Linux y haciendo uso de todos los emula- Esta nueva versión utiliza una versión mejorada del
dores de otras consolas disponibles para este sistema SoC de la BeagleOriginal, un DM3730. Este chip ofre-
operativo. ce lo mismo que el anterior OMAP 3530, pero mejora-
Al igual que sucedió con OpenMoko, tener como ob- do. Un procesador ARM Cortex-A8 a 1GHz, un DSP
jetivo el mercado de masas es un gran handicap para a 800 MHz y una versión más potente del core gráfico
SGX.
OCCAM’s Razor | 18
EN LA PRÁCTICA
Además del nuevo cerebro de la tarjeta, los periféricos antes de que el nuevo terminal salga a la venta.
también se han mejorado. La BeagleBoard-XM inclu-
ye un hub USB en la propia placa, proporcionando 4 PANDABOARD
puertos USB, además incluye un interfaz de red RJ-45,
el puerto serie ahora tiene un conector canon sub-D La PandaBoard es, por decirlo de alguna forma la her-
estándar, y se ha incluido un conector para acceder mana mayor de la BeagleBoard. Para hacernos una
directamente al interfaz de cámara que proporciona idea, es una mala bestia. Esta tarjeta está disponible
el DM3730. El OMAP 3530 también disponía de es- desde verano del 2010 y promete.
te interfaz, pero en la BeagleBoard original no estaba Con la misma filosofía y por unos 174 USD, dipon-
disponible. dremos de todo un OMAP4... si la nueva versión del
La BeagleBoard-XM además proporciona los mismos OMAP3.
buses de expansión y de conexión de LCD que ya en-
contramos en las últimas versiones de la BeagleBoard
original.
BEAGLEPHONES
También basados en la BeagleBoard, hay dos intere-
santes proyectos relacionados con la telefonía móvil.
El primero de ellos es el proyecto Wild Ducks, que
busca desarrollar un diseño de referencia de un telé-
fono móvil ejecutando Symbiam3 a un precio asequi-
ble. El proyecto está progresando muy bien y en su
página web podéis encontrar interesante información
sobre como trabajar con Symbian o módulos GSM que
podéis utilizar en otras aplicaciones.
FOX BOARD
Una tarjeta mucho más veterana es la FOX board de FPGA4U es un diseño orientado a la docencia y al
la compañía ACME Systems. Con un precio similar desarrollo de prácticas en la universidad, así que, en
y una tamaño de 6.6 x 7.2 cm, este pequeño PC nos principio, adecuado para introducirnos en este mundo.
ofrece un completo sistema GNU/Linux con dos puer-
La tarjeta está basada en una FPGA Altera Cyclone
tos USB, un interfaz ethernet y puertos de expansión
II EP2C20 y proporciona un interfaz Ethernet y otro
para conectarle lo que queramos.
USB, además de un array de LEDS y varios interrup-
tores. Junto a estos periféricos, la tarjeta ofrece 32Mb
de SDRAM (Synchronus DRAM).
OPEN GRAPHICS
Nos alejamos ya de los computadores, para introducir-
nos en otro tipo de hardware también libre, y comen-
zamos con el proyecto Open Graphics, un veterano en
este mundo.
El objetivo del proyecto es el desarrollo de tarjetas
gráfica abiertas. Como todos sabéis, las tarjetas grá-
ficas se han convertido en los últimos años en el prin-
cipal problema desde el punto de vista del hardware
y el software libre.
Los drivers y librerías que permiten acceder a toda la
Al igual que todas las demás, todos los esquemas elec- potencia de las tarjetas gráficas son propietarios y por
trónicos están disponibles en la web de la compañía. lo tanto cerrados y esta ha sido una de las razones que
Esta tarjeta dispone de varias tarjetas de expansión han impulsado este proyecto.
entre las que cabe destacar FOXGM que permite aña- La primera tarjeta gráfica, conocida como OGD1 ya
dir un modem GSM/GPRS a la tarjeta y de esa forma está disponible y se puede adquirir por unos 750 USD.
hacer que se comunique con nuestro teléfono móvil, Las características publicadas son:
por ejemplo.
Otra de las tarjetas de expansión disponibles para la
Fox es Colibrí. Esta tarjeta añade una FPGA con-
virtiendo el tándem en un sencillo y potente sistema
para introducirnos en el mundo del diseño hardware
con dispositivos programables.
La FOXBoard original utilizaba un procesador RISC
a 100 MHz y los puertos USB eran 1.1. La nueva ver-
sión de la tarjeta (FOX Board G20), se ha pasado a
un procesador ARM9 y ha ampliado tanto los puer-
tos USB a la especificación 2.0 como los puertos de
expansión que proporciona.
FPGA4U
Acabamos de comentaros una opción para el desarro- Salidas S-Video y Video Compuesto
llo con FPGA libre, pero hay otra digna de mención,
1 Salida de video RGB analógico (resolución
si bien, esta la tendréis que construir vosotros mismos,
max.: 2048 X 1536 70Hz)
a no ser que os matriculéis en la EPFL en Suiza.
2 Salidas de DVI-I dual link (max resolution:
2560 X 1600 60Hz)
66 señales I/O de usuario en un conector Hirose
92-pines
68 señales I/O de usario en un conector IDC
100-pines
Bus de memoria de 128 bits
Diseño hardware Open Source
Refrigeración pasiva
OCCAM’s Razor | 20
EN LA PRÁCTICA
Una iniciativa excelente y un proyecto interesante pa- en el caso del USRP2, que además ofrece conversores
ra los que queráis profundizar en los sistemas gráficos AD/DA de mayor frecuencia.
y como funcionan las tarjetas de vídeo. Lamentable- A partir de este punto el ordenador se encarga de ex-
mente el precio y la disponibilidad de estas unidades traer la información relevante. Para ello, USPR uti-
no es muy conveniente por el momento. liza GNURadio un ambicioso proyecto para la imple-
mentación de radios software que nos proporciona los
USRP algoritmos de procesado de señal y los bloques que ne-
cesitamos para implementar estos sistemas en un PC
Para terminar con nuestro limitado paseo por el mun-
normal y corriente.
do del hardware abierto vamos a hablaros del USRP
(Universal Software Radio Peripheral), un proyecto
para introducirnos en el mundo de los sistemas de IMPRESORAS 3D
radio comunicación de una forma “asequible” (entre El proyecto RepRap (Replicating Rapid Prototiper o
1000 y 2000 dolares) y libre :). Bueno, realmente, un prototipador rápido replicante ?¿) es una iniciativa
sistema para introducirnos en el mundo de la Radio para el desarrollo de una impresora 3D capaz de “im-
Software. primirse” a sí misma, y por lo tanto replicarse. Toda
la información del proyecto se distribuye con licencias
libres y hasta la fecha han producido dos modelos:
“Darwin” y “Mendel”.
RECURSOS
Arduino:
http://www.arduino.cc/
BeagleBoard y Beagleboard-XM:
http://beagleboard.org
OpenPandora:
http://www.open-pandora.org/
OMBeagle:
http://projects.goldelico.com/p/ombeagle/
Wild Ducks:
https://thewildducks.wordpress.com/
PandaBoard:
http://pandaboard.org/
EAP GTA04:
http://www.handheld-linux.com/wiki.php?page=GTA04-Early-Adopter
FOX Board:
http://foxlx.acmesystems.it/?id=4
Colibri (FPGA para FOX Board):
http://eshop.acmesystems.it/?id=COLIBRI
FPGA4U:
http://fpga4u.epfl.ch/wiki/Main_Page
ODG1:
http://wiki.opengraphics.org/tiki-index.php
USRP:
http://www.ettus.com/order
GNURadio:
http://gnuradio.org/redmine/wiki/gnuradio/USRP
RepRap:
http://reprap.org/wiki/Main_Page
MakerBot:
http://makerbot.com/
DesignSomething:
http://designsomething.org/
OCCAM’s Razor | 22
REVERSO TENEBROSO
Los sistemas generalistas hacia los que evolucionó la occams@razor $ gcc -Os -o hola-ref hola.c
informática doméstica en los 90 (vale, esto son los PC occams@razor $ ls -l hola-ref
-rwxr-xr-x 1 occams razor 6.6K 2007-11-21 09:53 hello
normales y corrientes) ha dado paso, en los albores
del siglo XXI a sistemas mas específicos y modestos,
cuya finalidad es realizar tareas concretas de forma Bueno, 6.6 Kb... no esta mal para un programa que
eficiente, sencilla y sobre todo barata. Estos sistemas solamente imprime un mensaje en pantalla.
se han “re-bautizado” como sistemas embebidos, y si
los comparamos con mi viejo MSX, siguen siendo infi- HOLA MUNDO DESDE C++
nitamente más potentes. Sin embargo puestos al lado
de mi PC resultan mucho mas modestos. C++ es uno de los lenguajes más utilizados en la ac-
tualidad. Una de las pegas que tiene este lenguaje, es
El uso de GNU/Linux se ha popularizado en el diseño
que general ejecutables muy grandes. Vamos a com-
de estos sistemas embebido, fundamentalmente por el
probarlo con nuestro sencillo ejemplo:
control que proporciona al desarrollador a la hora de
personalizar el sistema. En este artículo vamos a com- #include <i o s t r e a m >
probar cómo de pequeños pueden ser nuestros progra- u s i n g namespace s t d ;
mas, ya que, en este tipo de sistemas, el tamaño sí
importa. i n t main ( i n t a rg c , char ∗ a rg v [ ] ) {
c o u t << " (STDIO) ␣ P e p i t a ␣ P u l g a r c i t a ! ! ! " << e n d l ;
return 0 ;
}
Los denominados sistemas embe-
bidos se han popularizado duran- Compilamos nuestra versión C++ y comprobamos su
te los últimos años tamaño.
Para ello, vamos a tomar nuestro querido “Hola Mun- occams@razor $ g++ -Os -o hola-cpp hola.cpp
occams@razor $ ls -l
do” e intentaremos reducirlo a su mínima expresión
-rwxr-xr-x 1 occams razor 8.2K 2007-11-19 14:56 hola-cpp
a través de las distintas posibilidades al alcance de
nuestra mano.
Como era de esperar el tamaño es mayor que el de
REFERENCIA su versión C, pero tampoco parece algo exagerado...
Bueno, me voy a guardar un par de detalles al más pu-
A la hora de comparar cosas conviene tener una refe- ro estilo Agatha Christie para sorprender más tarde
rencia. En nuestro ejemplo, tomaremos como referen- :).
cia nuestra versión de “Hola Mundo” escrita en lengua-
je C y compilada con el compilador de GNU. Puesto
ELIMINANDO LO QUE SOBRA
que estamos comparando tamaños, utilizaremos la op-
ción de compilación -Os que le indica al compilar que A la hora de reducir el tamaño de un ejecutable hay
ciertas partes de éstos que se pueden eliminar.
Lo primero que nos sobra, cuando nuestro programa de los sistemas embebidos. Ambas son sustitutas de
este depurado, es la información de depuración. Es- la librería C estandard, por lo que no nos servirán si
ta información es generada por el compilador cuando nuestra aplicación está escrita en C++. Volveremos
utilizamos la opción -g. Como podéis observar, para sobre esto un poco mas tarde. Por ahora vamos a ge-
nuestras pruebas no la hemos utilizado, pero a modo nerar nuestros nuevos ejecutables.
de ejemplo, veamos cuantos bytes implica esta infor- La primera librería que vamos a utilizar es uclib. Es-
mación para un programa tan sencillo como nuestro ta librería se distribuye como un ‘toolchain, es decir,
“Hola Mundo”. como un conjunto de herramientas de desarrollo (com-
pilador, linker, ensamblador, etc...). Una vez instalada
occams@razor $ g++ -g -Os -o hm-cpp hola.cpp
occams@razor $ gcc -g -Os -o hm-ref hola.c
(lo mas sencillo es utilizar el paquete que proporcione
occams@razor $ ls -lh hola-cpp hola-ref tu distribución) la forma de usarla es muy sencilla:
-rwxr-xr-x 1 occams razor 44K 2007-11-21 10:12 hm-cpp
-rwxr-xr-x 1 occams razor 7.3K 2007-11-21 10:12 hm-ref
occams@razor $ i386-uclibc-linux-gcc -Os -o hm-uc hola.c
occams@razor $ ls -lh hm-uc
La versión en C no crece demasiado, pero la versión -rwxr-xr-x 1 occams razor 3.9K 2007-11-21 10:32 hm-uc
C++ ocupa unas 5 veces más cuando se incluye infor- occams@razor $ strip hm-uc; ls -lh hm-uc
mación de depuración... así que recordad eliminar esta -rwxr-xr-x 1 occams razor 2.3K 2007-11-21 10:33 hm-uc
información en la versión final de vuestros proyectos
o utilizar una “build tool” mínimamente decente.
Bien, nos hemos puesto por debajo de los 3 Kb.
Veamos ahora que obtenemos con dietc, que aparen-
La información de depuración temente es incluso mas ligera que uclib. Dietc propor-
tiene un gran impacto en el ta- ciona un sencillo wrapper para la compilación:
OCCAM’s Razor | 24
REVERSO TENEBROSO
Compilando estáticamente nues- Ahora solo tenemos que crear nuestra libería de la si-
tro programa comprobaremos ta- guiente forma:
maño real.
occams@razor$ gcc -c alib.c
occams@razor$ar -cvq libalib.a alib.o
Bien, los resultados están bastante claros. La versión
C++ requiere mucho más espacio en disco y memo-
ria que la versión C equivalente. Por supuesto, esta Nuestro programa de ejemplo, va a utilizar solamente
diferencia se hace menor a medida que los programas una de las funciones de nuestra sencilla librería. Aquí
son más grandes y complejos y, dependiendo del ti- tenéis una posibilidad.
occams@razor$ gcc -fdata-sections \ Vemos que el tamaño de nuestra sección .text es aho-
> -ffunction-sections -c alib.c -o alib1.o ra cero, y que tenemos cuatro secciones adicionales...
occams@razor$ar -cvq libalib1.a alib1. una por cada una de las funciones que hemos definido
en nuestra libería.
Esta es la información que el linker va a utilizar para
Estas opciones le dicen al compilador que genere una
incluir solo las secciones de interés en nuestro progra-
sección por cada bloque de datos y por cada función
ma estático.
en el código. Y que es eso de las secciones. Os pregun-
taréis. A ello vamos. Ahora ya podemos recompilar nuestro programa y ge-
nerar un ejecutable solo con las funciones que realmen-
te necesitamos. Una vez más necesitamos una opción
Con las opciones de compilación de compilación especial, bueno, realmente una opción
de linkado... La opción que le dice al linker que ignore
adecuadas podemos incluir solo las secciones que no son utilizadas.
las funciones que utilizamos en
nuestros programas. occams@razor$ gcc -static -Wl,--gc-sections main.c \
> libalib1.a -o static03
occams@razor$ nm static03 | grep " func."
Para poder ver las secciones de nuestras librerías uti- 080481de T func2
lizaremos la utilidad readelf. La salida de este pro-
grama para nuestra librería inicial es la siguiente. Sí, el flag -Wl, nos permite pasar opciones directa-
mente al linker, y la opción --gc-sections es la que
occams@razor$ readelf -S libalib.a elimina lo que sobra (gc viene de Garbage Collection
o recolección de basura).
File: libalib.a(alib.o)
There are 9 section headers, starting at offset 0xd4: Si comprobáis el tamaño del nuevo ejecutable, veréis
que es ligeramente más pequeño. La diferencia no es
Section Headers:
mucha, ya que lo gordo viene de la librería C que
[Nr] Name Type Addr Off Size
[ 0] NULL 00000000 000000 000000 no hemos compilado para producir secciones por cada
[ 1] .text PROGBITS 00000000 000034 00002f función.
OCCAM’s Razor | 26
REVERSO TENEBROSO
RECURSOS
ALTERNATIVAS LIBRERÍA C
dietlibc. http://www.fefe.de/dietlibc/
uClibC. http://www.uclibc.org/
Newlib. http://www.sourceware.org/newlib/
EGLIBC. http://www.eglibc.org/home
uClibC++. http://cxx.uclibc.org/
Interesante tutorial sobre como crear ejecutables verdaderamente pequeños.
A Whirlwind Tutorial on Creating Really Teensy ELF Executables for Linux
http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html
cuando se dobla. Nuestros sensores tienen una resis- Arduino ANALOG 3 Arduino ANALOG 2
OCCAM’s Razor | 28
LA CACHARRERÍA
Una vez que todo está listo, nuestro pequeño engendro En el monitor deberíamos ver algo como esto:
se parecerá a esto:
0:600:1:400
0:600:1:400
Este bucle principal será algo como esto: cluyen modelos 3D... pero también se puede utilizar
para visualizar un cubo :).
while ( 1 )
{ Este programa es capaz de interpretar el comando que
memset ( buf , 0 , 2 5 6 ) ;
i f ( ! s e r i a l p o r t _ r e a d _ u n t i l ( f d , buf , ’ \n ’ ) )
recibe a través de la entrada estándar, y además uno
{ de los comandos que interpreta es ROT... casualidad?...
buf [ s t r l e n ( buf ) − 1 ] = 0 ;
s s c a n f ( buf , "0: %d : 1 : % d" , &v [ 0 ] , &v [ 1 ] ) ;
yo no lo creo :).
i f ( v [ 0 ] > max [ 0 ] ) max [ 0 ] = v [ 0 ] ;
i f ( v [ 0 ] < min [ 0 ] ) min [ 0 ] = v [ 0 ] ;
RECURSOS
Código C para leer datos de Arduino
http://todbot.com/blog/2006/12/06/arduino-serial-c-code-to-talk-to-arduino/
Video del prototipo funcionando
http://www.youtube.com/watch?v=SHHILSQaSaU&feature=mfu_in_order&list=UL
Sensores Flexibles y Datasheet
http://www.sparkfun.com/products/8606
OCCAM’s Razor | 30
TRUCOS
gnome-screenshot -w -d 2 -e shadow
while (true) do
wget $1 -O ${HOME}/imagen.jpg Otra utilidad interesante de esto es la configuración
gconftool-2 --type string \
--set /desktop/background/picture_filename \ del escritorio de máquinas recién instaladas.
imagen.jpg
sleep 60 # Espera un minuto y repite Envía tus trucos
done
Puedes enviarnos esos trucos que usas a diario para
compartirlos con el resto de lectores a la dirección:
Sí, todos los browsers tienen la opción de poner una
imagen como fondo de escritorio... occams-razor@uvigo.es
EN LA PRÁCTICA
En el artículo “Open Hardware” en la sección “En la práctica”, hemos utilizado las siguientes imágenes:
OpenMoko FreeRunner
Licencia: Creative Commons Attribution-Share Alike 3.0 Unported
Autor: OpenMoko Web Site (http://openmoko.com)
RepRap
Licencia: Creative Commons Attribution-Share Alike 3.0 Unported
Autor: CharlesC (CharlesC)
OpenPandpora
Licencia: Creative Commons Attribution 1.0 Generic
Autor: Michael Mrozek
Beagleboard-XM
Licencia: Creative Commons Attribution-Share Alike 3.0 license
Autor: BeagleBoard Web Site (http://beagleboard.org)
Pandaboard
Licencia: Creative Commons Attribution-Share Alike 3.0 license
Autor: Pandaboard Web Site (http://pandaboard.org)
Fox Board
Licencia: Creative Commons Attribution-ShareAlike 3.0 License
Autor: ACME Systems Web Site http://www.acmesystems.it/articles/00060/FOXLX416.jpg
FPGA4U
Licencia: GNU Free Documentation License 1.2.
Autor: FPGA4U Wiki Web Site (http://fpga4u.epfl.ch/wiki/Main_Page)
Open Graphics
Licencia: GPL Autor: Open Graphics Project: http://www.opengraphics.org/
USRP
Licencia: Dominio Público
Autor: Polvi
Arduino
Licencia: Dominio Público
Autor: H0dges
OTROS ARTÍCULOS
Logo OSG artículo sección “Ratas de Biblioteca”
Autor: Openscenegraph Web Site (http://www.openscenegraph.org/)
Gracias al proyecto OpenClipart (http://www.openclipart.org/) for sus estupendas imágenes cedidas al dominio
público. Hemos utilizado las siguientes imágenes de este excelente sitio.
OCCAM’s Razor | 32