occams razor 05 01

Upload: coopsolpy

Post on 08-Apr-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/6/2019 Occams Razor 05 01

    1/33

  • 8/6/2019 Occams Razor 05 01

    2/33

  • 8/6/2019 Occams Razor 05 01

    3/33

    EditorialFeliz 2011!

    by The Occams Razor Team

    OccamsRazor

    Nmero 5. Invierno 2010

    Direccin:

    David Martnez Oliveira

    Editores:

    David Martnez Oliveira

    Fernando Martn Rodrguez

    Colaboradores:

    Fernando Martn Rodrguez,

    Laura I. Rodrguez Gonzlez, Er

    Tresd, Casper van der Guorm,

    Er Che vi Gan, Er Mangante

    Mengunate, er Corta de Yervas

    Maquetacin y Grafismo

    Laura I. Rodrguez Gonzlez

    Publicidad

    Occams Razor Direct

    [email protected]

    Impresin

    Por ahora tu mismo. . . Si te

    apetece

    c2010 The Occams Razor

    TeamEsta obra est bajo una licencia

    Reconocimiento 2.5 Espaa 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.

    Consulta la pgina 32 paralas excepciones a esta

    licencia

    No poda terminar 2010 sin que Occams Razor diera seales de vida.As que aqu estamos, en el lmite con una pequea revista que esperamosos entretenga durante el pequeo break navideo, e intentando mantenernuestra periodicidad de ao y medio :).

    Aunque la mayora de vosotros estaris leyendo estas lneas en 2011, lo ciertoes que este nmero 5 se ha terminado el 31 de Diciembre de 2010. Hemoshecho un pequeo esfuerzo para que nuestra periodicidad, en la prctica, deao y medio no se alargue ms.

    Este nmero es un poco ms corto de lo habitual, pero esperamos que osguste tanto como los anteriores. En l encontraris, un par de artculos sobresoftware y un interesante dossier sobre el nuevo movimiento de hardwarelibre.Las ratas de biblioteca nos introducen esta vez en el mundo de los grficos 3Dy la realidad virtual, junto con los chicos de la cacharrera que nos cuentancomo empezar a construir un Dataglove.En este nmero hemos sustituido El Rincn de los Lectores por una nuevaseccin que hemos llamado Comunidad. En esta nueva seccin no solo nosharemos eco de vuestros mensajes, sino tambin de los eventos ms intere-santes en nuestra lista de correo y en nuestro canal de YouTube. Esperamosveros a todos por all.

    Deseamos que la distrutis y ....

    Feliz 2011!

    The Occams RazorTeam

    Las opiniones expresadas en los artculos, as como los contenidos de los mismos, son responsa-

    bilidad de los autores de stos.

    Puede obtener la versin electrnica de esta publicacin, as como el cdigo fuente de la mismay los distintos ficheros de datos asociados a cada artculo en el sitio web:

    http://webs.uvigo.es/occams-razor

    3| OCCAMs Razor

  • 8/6/2019 Occams Razor 05 01

    4/33

    DESAFO CRIPTOGRFICO

    La solucinDesvelamos la clave de nuestro desafo

    por Fernando Martn Rodrguez

    Estaba claro que tras el desafo del nmeroanterior tenamos que publicar la solucin. Allva.

    EL PROGRAMA DESCIFRADOR

    Los profesores sabemos que en cualquier ejercicio pue-

    de haber diferencias grandes de dificultad segn laforma de redactar el enunciado y tambin segn quapartados se pidan y en qu orden. En el caso que nosocupa queremos descifrar un criptograma. Lo ms f-cil es empezar por analizar el cifrador y crear undescifrador.

    El cifrador eran dos funciones de matlab... repito aqula principal:

    function c r i p t o g ra m a = C i f r a r T e x t o ( l l a n o , c l a v e )r a i z = f loor ( sqrt ( c l a v e ) ) ;r e s t o = c l a v er a i z ^2 ;

    N = length ( l l a n o ) ;for i =1:N,

    [ r a i z , r e st o , d i g i t o ] =D i g i t o D e c i ma l R a i z Cu a d ra d a ( r a i z , r e s t o ) ;c f r = l l a n o ( i )+ d i g i t o ;i f cf r >90

    c f r = ( c f r 91)+65;end

    c r i p t o g ra m a ( i ) = c h a r ( c f r ) ;end

    La lnea 8 (llano(i) + digito) hace un trabajo fun-damental. El programa obtiene una serie de dgitos(nmeros entre 0 y 9) y los suma al texto en llano.Estamos suponiendo que el texto en llano son carac-teres es ASCII y que slo usamos maysculas, esto es:llano(i) va de 65 a 90 (la condicional que sigue asegu-

    ra que la suma sea circular). Visto esto parece claroque si restamos en vez de sumar deberamos tener unsistema descifrador. Esto es:

    function l l a n o = D e s C i f r a rT e x t o ( c r i p t o g r a m a , c l a v e )r a i z = f loor ( sqrt ( c l a v e ) ) ;r e s t o = c l a v er a i z ^2 ;

    N = length ( c r i p t o g r a m a ) ;for i =1:N,

    [ r a i z , r e st o , d i g i t o ] =D i g i t o D e c im a l R a i z Cu a dr a d a ( r a i z , r e s t o ) ;

    c l l a n o = c r i p t o g ra m a ( i )d i g i t o ;i f cl la no =0)

    d i g i t o = c o n t ;break ;

    end

    end

    r a i z = r a i z 010 + d i g i t o ;

    El mtodo funcionar si somos capaces de generar n-

    meros (dgitos) aparentemente aleatorios a partir dela clave. Esto es: conociendo la clave debe ser fcil ge-nerar la secuencia mientras que en caso contrario debeparecer aleatoria. Como podis deducir del nombre dela funcin a m se me ocurri utilizar la aleatoriedadde los decimales de un nmero irracional. De clave, portanto, nos vale un nmero entero que no sea cuadradoperfecto.

    Hemos implementado el algorit-mo de la riz utilizando un par

    de funciones Matlab

    Fijaos que quiero los dgitos exactos, sin redondeos,para eso utilic el muy olvidado algoritmo de la razcuadrada (que todos estudiamos en el colegio algunavez). Como todo, se puede encontrar en Internet:

    Algoritmo de la raz

    Realmente esta forma de hacerlo puede tener sus cos-quillas... fijaos que el mtodo dejar de ser exacto almismo tiempo que la aritmtica entera de matlab de-

    je de serlo. En el programa, los nmeros decimales

    siempre se multiplican por una potencia de 10 paraque sean enteros pero est claro que cualquier sistemaperder precisin al trabajar con muchos dgitos, loque va a ocurrir con mensajes largos.

    OCCAMs Razor | 4

    http://platea.pntic.mec.es/anunezca/ayudas/algoritmo_raiz/algoritmo_raiz.htmhttp://platea.pntic.mec.es/anunezca/ayudas/algoritmo_raiz/algoritmo_raiz.htm
  • 8/6/2019 Occams Razor 05 01

    5/33

    DESAFO CRIPTOGRFICO

    LA SOLUCIN

    Pues a partir del criptograma:

    DWSGNGGJBVVPIWYXXKJSGHVLLPXVHQYWYAJBTLEDNLAROLXTBGINPFZYJRPXUMUFCVCJTMXRDKXIFUXRW

    La idea era probar por fuerza bruta hasta lograr untexto llano coherente. Para no liarlo mucho decid ele-gir una clave menor que 100 con lo que no haba muchoque probar. Adems, algo dentro me deca que el sis-tema podra ser ms seguro si la clave es un nmeroprimo (je, je, esto no haca falta adivinarlo).

    Probando con clave = 67 obtenemos unllano no slo coherente sino conocido:

    CONDIEZCANONESPORBANDAVIENTOEN-POPAATODAVELANOCORTAELMARSINO-

    VUELAUNVELEROBERGANTIN (ver Cancindel Pirata, poema de Jos de Espronceda).

    S, s, se eliminaron los espacios, los acentos y las ees.No debera ser muy difcil tener eso en cuenta... Ocomplicar el mtodo para tener desplazamientos ma-yores que 9 (agrupando dos dgitos, por ejemplo).

    LOS ACERTANTES Habamos prometido pu-blicar sus nombres, all van:

    Bultza (pseudnimo).

    Jorge Muoz Castaer.

    Sergio Mendieta.

    Enhorabuena!

    Las SolucionesComo han resuelto el problema los acertantes

    Desafo Criptogrfico I

    enviado por Jorge Muoz Castaer

    27 de Agosto de 2009

    Hola Fernando,Pues nada... que me he puesto con el enigma cripto-grfico y lo he sacado. Te cuento:

    Nombre completo: Jorge Muoz Castaer

    Criptograma descifrado:

    CONDIEZCANONESPORBANDAVIENTOENPOPAATODAVELANOCORTAELMARSINOVUELAUNVELEROBERGANTIN

    Valor de la clave: 67

    Una explicacin breve de lo que hace el mtodo y decmo lo habis atacado:

    El mtodo coge cada carcter, su cdigo ASCII, y lesuma un dgito de la raz cuadrada de la clave. Al pri-mer carcter el primer dgito y as en adelante. Si esnecesario se calculan decimales de la raz para tenerdgitos suficientes.

    Para atacarlo he usado el poco ortodoxo mtodo de"fuerza bruta con diccionario inteligente". Primero es-crib la funcin que desencripta un mensaje sabiendola clave y la dej corriendo con enteros sucesivos comoclave. Para sacar el texto en claro inicial me centr enla primera palabra del mensaje. Por cmo est escritoel cifrador slo se pueden usar en el texto letras ma-

    ysculas y cada letra del mensaje cifrado solamente sepuede corresponder con ella misma o una de las nueveanteriores (porque se le suma una cifra). As que laprimera palabra tena que comenzar con U, V, W, X,

    Y, Z, A, B, C o D. Prob con algunas palabras (usan-do grep a pelo sobre el fichero de posibles mensajes)hasta que di con un texto con sentido. Si llego a verque tardaba mucho as me habra puesto a ver los ca-racteres posibles para el segundo carcter del mensaje

    y as sucesivamente.Aprovecho para felicitar a los redactores, editores ycolaboradores de esta revistaza (vosotros s que soisunas malas bestias ;-).

    Un abrazo,

    Jorge Muoz

    PD: Aprovecho y os comento algunos articulillos quesi tenis a bien podais trabajar para el prximo n-mero:

    Sistemas empotrados Open Source y Hardware (Ar-duino, por ejemplo)

    Intro a las FPGAs y OpenCores

    Desafo Criptogrfico II

    enviado por Bultza

    18 de Septiembre 2009

    Mi enhorabuena por la revista, vi el anuncio en barra-punto y me ha encantado. aqu la solucin:

    Mensaje llano:

    CONDIEZCANONESPORBANDAVIENTOENPOPAATODAVELANOCORTAELMARSINOVUELAUNVELEROBERGANTIN

    Clave: 67

    5| OCCAMs Razor

  • 8/6/2019 Occams Razor 05 01

    6/33

    DESAFO CRIPTOGRFICO

    El mtodo que usais es sencillo pero interesante, setrata de una sustitucin cesar utilizando en vez deun nmero constante de dgitos, los decimales de unaoperacin de hacer la raiz cuadrada sobre la clave (esdecir los decimales de un nmero irracional). El pro-blema de este mtodo es que como el usuario meta unnmero que sea cuadrado perfecto entonces el texto

    encriptado es igual al mensaje llano.Estaba estudiando el mtodo para romperlo y se mehaba ocurrido atacarlo a mano, es decir, es una susti-tucin cesar muy sencilla y una letra encriptada estarno ms lejos de 10 dgitos, con eso y en algn puntodel mensaje se podra encontrar alguna palabra, unavez hecho esto buscar un nmero de forma bruta cuyosdecimales coincidiesen con los nmeros encontrados yas saber el resto de desplazamientos y la clave. Era unmtodo horriblemente inatractivo. Las primeras supo-siciones tras probar yo mismo el mtodo eran que elmensaje vuestro era en maysculas y sin espacios o

    tendramos carcteres raros por todo el criptogramaOtra idea es que algunas letras no iban a ser encrip-tadas, cada letra tiene una probabilidad del 10 % deno ser encriptada, en un mensaje largo se podra en-contrar incluso palabras completas.

    Sin embargo he de reconocer que he descubierto elmensaje y la clave de forma bruta con el siguientecdigo:

    %D e s c i f r a r c r i p t o g r a m a F u e r za B r ut a :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 ra m a ,

    deDonde , aDonde)for x = deDonde :1: aDonde

    c l a ve = x ;r a i z = f loor ( sqrt ( c la ve ) ) ;

    r e s t o = c l a ve r a i z ^2 ;N = length ( c r i p t o g r a m a ) ;for i =1: N,

    [ r ai z , r es t o , d ig it o ] =D i g i t o D e c i ma l R a i z Cu a dr a d a ( r a i z , r e s t o ) ;

    c f r = c r i p t o g ra m a ( i ) d i g i t o ;%di sp ( cf r ) ;i f c f r < 6 5

    c f r = ( c f r + 91 ) 6 5 ;end

    l l a n o ( i ) = c h a r ( c f r ) ;end

    disp ( c l a v e ) ;disp ( [ l l a n o : l l a n o ] ) ;

    end

    Que lo nico que hace es probar claves e imprimirlascmodamente en la pantalla. Lo hice para descifrarmis mensajes y ver que funcionaban, haba intentadodescrifrar las primeras 10 letras, para ello he queridoprimero comprobar que vuestro mensaje si lo descri-fraba con cualquier otra clave siempre me iba a darpara la letra D, siempre letras desde T hasta Z y des-de A hasta D, as que imprim las 100 primeras y megolpe al ojo el CONDIEZ pues pensaba que esta-ba leyendo mi propio apellido, y coo, me sali un"mierda!.en vez de un "toma ya", pues no era mi in-tencin descubrirlo de esta forma, de hecho pensaba

    que habrais utilizado un nmero con decimales perotampoco sera cuestin de hacer eso...

    Un mtodo ms lgico hubiese sido empalmar mi pro-grama de arriba con una comprobacin con un diccio-

    nario de palabras que siempre aparecen tipo onde.etcpero eso s que podra ser un proceso muy largo.

    Voy a seguir pensando algn mtodo ms matemticoporque seguro que lo hay, tengo ganas de leer una res-puesta convincente a esto pero mi cabeza no da paramucho ms as que no esperis que llegue a ningunsitio ;).

    Un saludo

    Desafo Criptogrfico III

    enviado por Sergio Mendieta

    Septiembre 2009

    Buenos Das Seor Fernando Martn, Disculpe la inte-rrupcin, es para hacerle una pregunta sobre el tema

    Un Desafo Criptogrfico de la revista OCCAMsRazor,

    La verdad, tal vez solo este algo perdido, veamos:La raiz(67) = 8.1853527718724499699537037247339294588804868154980399630667

    Resalto hasta el carcter 31 despus del punto da-do que es hasta all lo que nos da la calculadora dewindow, pero como indica usted en el desafi utili-za matlab, por lo tanto tal vez est manejando masdgitos despus del carcter 31, que es lo que indicalas funciones de cifrado, con lo cual cifrara todo elmensaje o sea los 81 caracteres.

    Pero el resultado aplicando el descifrador:

    clave=67(C),criptograma=DWSGNGGJBVVPIWYXXKJSGHVLLPXVHQYWYAJBTLEDNLAROLXTBGINPFZYJRPXUMUFCVCJTMXRDKXIFUXRW

    llano=CONDIEZCANONESPORBANDAVIENTOENPUPWE...

    Lo resaltado parece coherente (tal vez sea un men-saje para despistar), pero despus de esto vienen unconjunto de letras que no lo son, ahora la funcin decifrado no indica que se realicen otras operaciones,como el cambio de alfabeto, o el uso recursivo de lamisma, etc

    Mi pregunta es si el criptograma est correcto? lo queme ayudara a seguir, no me de mas pista, solo afirmeque el criptograma este bien.

    En todo caso si el criptograma esta bien, el ci-frado se debi realizar de esta forma cifrarTex-to(texto1+cifrarTexto(texto2, clave2), clave1), peroesto son solo ideas.

    Le agradezco su atencin, creo que este correo va aser inentendible! :(

    Si bien Sergio no resolvi completamente el desafo

    debido a errores de redondeo en las herramientas que

    utiliz, hemos considerado como vlida su respuesta.

    OCCAMs Razor | 6

  • 8/6/2019 Occams Razor 05 01

    7/33

    COMUNIDAD

    La Comunidad de OccamLista de Correo, Vdeos y ms.

    por The Occams Razor Team

    NUESTRA LISTA DE CORREO

    Todava en sus primeros pasos, la lista de correo deOccams Razor ya lleva funcionando ms de un aocon unos 65 miembros oficiales. La lista es totalmenteabierta as que cualquiera puede leer las discusionessin necesidad de suscribirse.

    Aqu tenis alguno de los temas que hemos tratado enla lista.

    Hacks de media tarde. WebCam 3D

    Un sencillo programa para conseguir imgenes anagli-fas utilizando dispositivos v4lloopback. Con un peque-o programa leemos fcilmente imgenes de dos cma-ras, las procesamos y las hacemos disponibles a otrasaplicaciones como si se tratase de una tercera cmara.

    Ms...

    Lua en 5 minutos

    Vimos como aadir un interprete LUA a vuestras apli-caciones en 5 minutos. Con unas pocas lneas de c-digo aadimos a nuestros programas la capacidad deejecutar scripts LUA y de hacer que esos scripts eje-

    cuten funciones definidas en nuestros programas.Mas...

    Compressed sensing

    Hablamos sobre compressed sensing y superresoluciny proporcionamos algunos enlaces para introducirnosen el tema.

    Mas..

    Mensajera Instantnea Mejorada

    Una versin mejorada del sistema de mensajera ins-tantnea que introdujimos en el artculo de Netcat en

    el nmero 1 de Occams, utilizando OSD (On-ScreenDisplay) y un sencillo interfaz grfico con Xdialog.

    Mas..

    Time-Lapse Videos con mplayer y ffmpeg

    Un sencillo script que usa mplayer para capturar im-genes con una webcam cada cierto tiempo, para final-mente generar un video a partir de todas esas imge-nes utilizando ffmpeg. Sabais como utilizar el modoremoto de mplayer?

    Mas..

    Los miembros de la lista reciben la revista antes que

    nadie y adems tienen la posibilidad de ofrecer sus co-mentarios antes de que se publique oficialmente. Ade-ms, estamos preparando nuevas actividades relacio-nadas con la revista.

    NUESTROS VIDEOS

    En nuestro canal de YouTube hemos publicado dosvdeos. El primero es una modificacin del artculo devideo vigilancia del nmero 4, en la que las cmarasse configuran para obtener una visin panormica.

    El segundo vdeo que hemos aadido fue generado conel script aparecido en la lista de correo para generar time-lapsed videos.

    Si habis producido algn video a partir de los ar-tculos de Occams Razor nos encantara conocerlos yaadirlos como favoritos en nuestro canal o como vi-deo respuestas si estn relacionados con alguno de losvideos ya disponibles.

    UNIROS A LA COMUNIDAD!

    Nos vemos en nuestra lista de correo y canal deyoutube.

    Grupo Occams Razor

    Canal YouTube

    OS ESPERAMOS!!!!

    7| OCCAMs Razor

    http://groups.google.com/group/revista-occams-razor/browse_thread/thread/5b05f3fafa4d2c19http://groups.google.com/group/revista-occams-razor/browse_thread/thread/08164aec9ca4b397http://groups.google.com/group/revista-occams-razor/browse_thread/thread/d76f8a6a98fc7f3chttp://groups.google.com/group/revista-occams-razor/browse_thread/thread/17fa16116fd9806bhttp://groups.google.com/group/revista-occams-razor/browse_thread/thread/7faeda679d786d99http://youtube.com/picoflamingohttp://groups.google.com/group/revista-occams-razorhttp://www.youtube.com/user/RevistaOccamsRazorhttp://www.youtube.com/user/RevistaOccamsRazorhttp://groups.google.com/group/revista-occams-razorhttp://youtube.com/picoflamingohttp://groups.google.com/group/revista-occams-razor/browse_thread/thread/7faeda679d786d99http://groups.google.com/group/revista-occams-razor/browse_thread/thread/17fa16116fd9806bhttp://groups.google.com/group/revista-occams-razor/browse_thread/thread/d76f8a6a98fc7f3chttp://groups.google.com/group/revista-occams-razor/browse_thread/thread/08164aec9ca4b397http://groups.google.com/group/revista-occams-razor/browse_thread/thread/5b05f3fafa4d2c19
  • 8/6/2019 Occams Razor 05 01

    8/33

    RATAS DE BIBLIOTECA

    Visualizacin Fcil de Modelos 3DSlo 3 lneas con OpenScenegraph

    por Er Tresd

    Cargar y visualizar modelos 3D a mano noes algo que podamos contar en una sola pginade Occams Razor. Sin embargo, con la ayudade una librera (o conjunto de libreras para serms exactos) como OpenScenegraph, se puedeconvertir en una tarea trivial. En este artculoos contaremos como visualizar modelos 3D uti-lizando esta librera en solo 3 lneas de cdigo!

    OpenScenegraph es una de las muchas libreras dispo-nibles para el desarrollo de aplicaciones 3D. Esta enconcreto se suele considerar la sucesora de la incre-ble SGI Performer, desarrollada por Silicon Graphicshace algunos aos y que ya ha dejado de existir. Hayotras muchas, ms orientadas al desarrollo de juegos(Ogre3D, Irrlicht, ...) o con modelos de programacinms alejados de Performer.

    En cualquier caso, OpenScenegraph ofrece muchsi-mas funcionalidades y volveremos a hablar de ella, enms detalle, en prximos nmeros. Por ahora, veamoscomo mostrar un modelo 3D.

    OpenScenegraph es un conjuntode libreras muy potente para eldesarrollo de aplicaciones grfi-cas 3D

    EL CDIGOAqu estn las prometidas tres lneas de cdigo (claro3D... 3Lneas :).

    #include #include

    us ing na mes pa ce os gD B;i nt main( i n t ac , char a ){

    o s g Viewer : : Viewer viewer ;viewer . s etSceneD a ta ( rea dNo deFi le (a [ 1 ] ) ) ;

    return viewer . run ( ) ;

    }

    Ms fcil no se puede. Nuestro programa tiene unanica variable, el visor (viewer). Esta clase se encar-

    ga, si nosotros queremos, de todo; crear la ventana,calcular la posicin de la cmara, manejar los eventosde ratn y teclado,...

    Tres lneas son suficientes paravisualizar modelos 3D

    Lo nico que necesitamos decirle es que datos quere-

    mos visualizar y ponerla en marcha (con el mtodorun).

    Este sera el Makefile para compilar nuestro sencillovisor.

    MY_CFLAGS=I$ {DEV_DIR}/ i n cl ud eMY_OSG_LIBS=L$ {DEV_DIR}/ l i b l o s g V i e w e r

    mini : minivie wer . cppg++ o $@ $< ${MY_CFLAGS} ${MY_OSG_LIBS}

    En este makefile estamos usando una variable deentorno de soporte. Si habis instalado OSG en eldirectorio por defecto, simplemente dadle el valor/usr/local/. Sino, probablemente sabris lo que es-tis haciendo y no necesitis ms ayuda :P.

    UN POQUILLO DE SALSILLA

    Aunque el programa mola (3 lneas y podis ver unmontn de modelos 3D), es un poco soso. As que va-mos a modificarlo para hacer que nuestro modelo rote.

    Bsicamente lo que haremos ser crear un grafo de

    escena (efectivamente, un scene graph) y sustituir lallamada a viewer.run() por nuestro propio bucle, deforma que podamos hacer rotar nuestro modelo 3Dantes de pintar cada cuadro.

    Para ello tenemos que aadir a nuestro grafo un nodoque nos permita transformar nuestro modelo, girar-lo en este caso. De las muchas posibilidades que nosofrece OSG, PositionAttitudeTransformes la mssencilla de utilizar.

    Una vez creado este nodo, podemos aadir tantos no-dos hijo como queramos, y todos ellos se vern afec-tados por nuestra transformacin.

    Con este nuevo grafo, ya solo tenemos que actuali-zar la orientacin del nodo de transformacin en cadaiteracin de nuestro bucle principal, antes de pedir aOpenScenegraph que pinte nuestra escena.

    OCCAMs Razor | 8

    http://openscenegraph.org/http://openscenegraph.org/
  • 8/6/2019 Occams Razor 05 01

    9/33

    RATAS DE BIBLIOTECA

    #include #include #include < o s g / 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 >#include

    u s i n g n a me s pa c e o s g ;u s i n g n a m es p a ce o sg GA ;u s i n g n a m es p a ce o s g V i e we r ;

    int main( int argc , char argv ){

    ref _pt r model ;Viewer v i e we r ;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 ;T r a c k b a l l M a n i p u l a t o r m a n i p u l a t o r ;f loat r o t = 0 . 0 f ;

    m a n i p u l a to r = n ew T r a c k b a l l M a n i p u l a t o r ( ) ;view er . setCameraManipul ator ( mani pulat or );

    model = osgDB : : readN odeF ile (argv [ 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 ;pa t>a d d Ch i l d ( m o d el ) ;

    v i e w e r . s e t S c e n e Da t a ( p a t ) ;

    while (! vi ewer . done () )

    { r o t += 2 . 0 ;pa t> s e t A t t i t u d e ( Q ua t ( D e g re e s To R a di a n s ( r o t ) , V ec 3 ( 1 , 0 , 0 ) ,

    D e g r e e s To Ra d i a n s ( 0 . 0 ) , V e c3 ( 0 , 1 , 0 ) ,D e g r e e s To Ra d i a n s ( r o t ) , V e c3 ( 0 , 0 , 1 ) ) ) ;

    v i e w e r . f r a me ( ) ;u s l e e p ( 5 0 0 0 ) ;

    }}

    POSICIN Y ORIENTACIN

    Los nodos PositionAttitudeTransformson los mssencillos de utilizar. Una vez creados, podremos aa-dir nodos hijos con el mtodo addChild. De hecho, es-te mtodo lo proporciona la super clase |verb!Group!,pero no vamos a profundizar en el modelo OO de lalibrera.

    Los dos mtodos ms importantes que nos proporcio-na esta clase son:

    setAttitude, que nos permite definir la orien-tacin (rotacin) para la transformacin que es-tamos definiendo.

    setPosition, que nos permite definir la tras-lacin para la transformacin que estamos defi-niendo.

    El mtodo setAttitude espera como parmetro unquaternion. En nuestro ejemplo, lo creamos dinmi-camente a partir de ngulos de Euler. Como podisver en el cdigo, al crear nuestro quaternion, le pa-samos como parmetros el ngulo que queremos rotaren cada uno de los ejes estndar. De la misma forma elmtodo setPosition espera un objeto del tipo Vec3.

    Ahora ya solo necesitamos crear un bucle, y actuali-zar la orientacin de nuestra transformacin en cadacuadro, y luego decirle a OSG que pinte ese cuadrollamando al mtodo frame de la clase Viewer.

    MANIPULADORES DE CMARA

    Hay dos lneas de las que casi no hemos hablado.Cuando utilizamos el mtodo run del visualizador, lalibrera se encarga de que podamos mover la cmaray adems, de situarla en una posicin adecuada paraque podamos ver la escena.

    Al modificar nuestro programa para controlar comose ejecuta el bucle principal de la aplicacin, hemosperdido esa funcionalidad. La forma de reactivarla(por decirlo de alguna forma), es aadiendo lo que seconoce como un manipulador de cmara.

    En nuestro ejemplo hemos utilizado un manipuladorde tipo Trackball, el mismo que nos proporciona elmtodo run.

    Resumiendo, las dos lneas al principio de nuestro pro-

    grama, crean ese manipulador y le dicen al visualiza-dor (viewer) que lo use para controlar la cmara.

    Si eliminis esas dos lneas, veris que la cmara esta-r en la posicin (0.0, 0.0, 0.0), al igual que el modelo,y por lo tanto, dependiendo del modelo 3D que estisutilizando, puede ocurrir que no veis nada. En esecaso, podis utilizar el mtodo setPosition de nues-tro nodo de transformacin para mover la cmara (oel modelo segn se mire).

    HASTA LA PRXIMA

    Bueno, esperamos que esto os de para introduciros enel maravilloso mundo de los grficos 3D. OpenScene-graph es una librera enorme, y ofrece una cantidad deherramientas monstruosa... horas y horas de diversinasegurada :). Hasta la prxima.

    9| OCCAMs Razor

  • 8/6/2019 Occams Razor 05 01

    10/33

    M RPIDO

    El Programa FantasmaAnalizamos el gusano de Morris

    por Casper van der Guorm

    Hace algunos aos le una noticia sobre elaniversario del gusano de Morris, ese que colap-so una gran parte de internet all por los 80.Quise saber un poco ms sobre el tema y meencontr con algunas cosas curiosas que siguenfuncionando en la actualidad. En este artculoos vamos a contar estas curiosidades creando....EL PROGRAMA FANTASMA!!!

    El programa fantasma es un sencillo programa queuna vez ejecutado desaparece misteriosamente mien-tras intenta asustarnos con aterradores mensajes y te-rrorficos sonidos.

    Nuestro programa fantasma des-aparecer misteriosamente unavez ejecutado

    Para ellos vamos a utilizar algunas de las tcnicas queus el gusano de Morris hace algunos aos. Para losque estis interesados en el tema, comprobad la ca-

    ja de recursos con algunos enlaces interesantes. No osvamos a hablar de los exploits que el gusano us, nide como se transfera de un ordenador a otros... sim-plemente vamos a hacer... un programa fantasma!

    CAMUFLAGE

    Bien, lo primero que vamos a hacer, es que nuestroprograma fantasma sea invisible. Para ello vamos autilizar distintas tcnicas.La primera consiste en cambiar el nombre de nues-tro programa, de forma que la salida del comando psno muestre nada sospechoso. A continuacin, elimi-naremos nuestras pistas del disco duro, y finalmenteharemos que sea complicado encontrar nuestro PID.

    Veamos como sera un programa como este para acontinuacin explicar en detalle cada una de estas ca-ractersticas.

    #include < s tdio .h>#include < s t d l i b . h>

    #include < s t r i n g . h>

    void l i m p i a_ d i s co ( char n ) {p r i n t f ( " B or ra nd o F i ch e r o \ n" ) ;

    }

    s t a t i c c ha r nombre_prg = "phantom" ;

    i nt main ( i n t argc , char a rg v [ ] ) {pr in tf (" Ho la s o y el Pro grama Fanta sma \n" ) ;l i m p i a _ d i s c o ( a r g v [ 0 ] ) ;s trc py ( a rg v [0 ] , nombre_ prg );

    while ( 1) {i f ( f o rk ( ) > 0) e x i t ( 0 ) ;

    s l ee p ( 1 ) ;

    }

    return 0 ;}

    Efectivamente, la funcin que borra el ejecutable deldisco no hace nada por el momento. Enseguida ve-remos como implementarla. Pero el resto de nuestrasfuncionalidades ya estn ah.

    Como todos sabis, el primer argumento que recibecualquier programa es el nombre del programa ejecu-tado, as que si simplemente modificamos el valor de

    este parmetro, el nombre que, utilidades como ps ,ver ser precisamente el valor de ese parmetro. Ennuestro caso estamos utilizando phantom, para poderidentificarlo fcilmente. Para la versin final utilizare-mos algo como sh. Bastante ms discreto.

    Luego entramos en el bucle principal de nuestro pro-grama. Aqu haremos algunas cosas aterradoras, peropor el momento simplemente cambiamos nuestro iden-tificador de proceso PID, cada segundo.

    Modificando argv[0] podemoscambiar el nombre de nuestroprograma

    Para ello, solo tenemos que crear un nuevo procesoutilizando la llamada al sistema fork. fork crearuna copia exacta del proceso que la ejecuta, as que sisimplemente matamos el proceso original, podremoscontinuar nuestra ejecucin con un PID diferente.

    PROBANDO... PROBANDO

    Vamos a probar el programa. Grabamos nuestro c-digo en un fichero llamado test.c y compilamos conun sencillo make test.

    Veamos que ocurre al ejecutarlo.

    OCCAMs Razor | 10

  • 8/6/2019 Occams Razor 05 01

    11/33

    M RPIDO

    occams@razor$ ./test

    Hola soy el Programa Fantasma

    Borrando Fichero

    occams@razor$ ps ax | grep test

    31245 pts/7 R+ 0:00 grep test

    occams@razor$ ps ax | grep phantom

    30620 pts/6 S 0:00 phantom

    30623 pts/7 R+ 0:00 grep phantom

    occams@razor$ ps ax | grep phantom30626 pts/6 S 0:00 phantom

    30630 pts/7 R+ 0:00 grep phantom

    occams@razor$ killall test

    Como podis observar, hemos ejecutado nuestro pro-grama de test, pero cuando listamos los procesos enejecucin filtramos la salida de ps con el nombre quehabamos elegido y no hay ni rastro del programa lla-mado test.

    Adems observad como en cada ejecucin de ps elproceso phantom tiene un PID diferente. Bueno, porahora vamos bien :).

    OTROS USOS DE argv[0]El uso ms comn de argv[0] lo encontramos en pa-quetes como BusyBox que ofrece un entorno shellbastante completo con un tamao muy reducido.BusyBox genera un nico ejecutable esttico queincluye la funcionalidad de todos los comandos deeste entorno (comandos como ls o chmod). Cuandoel sistema se instala, se generan un montn de en-laces a este fichero, cada uno con el nombre de unode los comandos implementados por el ejecutableprincipal.

    La funcin principal del programa comprueba el va-lor de argv[0], el cual ser distinto para cada uno delos enlaces creados y segn su valor ejecutar unafuncin u otra.

    DESAPARECIENDO

    Para que nuestro programa sea realmente un fantas-ma, tenemos que hacer que desaparezca del disco duro.Si hablamos de un gusano o virus real, borrar cual-quier pista del disco duro hace ms difcil el posterioranlisis del cdigo para la eliminacin del malware.

    Lo interesante de todo esto es que, una vez que nuestroprograma est en ejecucin, podemos borrar el ejecu-table del disco y seguir funcionando. Es ms, podemosleernos completamente en memoria y volver a escribir-nos en el disco... lo que se llama la tcnica Guadiana.

    Veamos como de sencillo sera hacer esto.

    #include < s ys / types .h>#include < s y s / s t a t . h>#include < f c n t l . h>

    #include < unis t d .h>

    s t a t i c c ha r cod e = NULL;

    s t a t i c l on g co de_ len =

    1;s t a t i c c ha r nombre = NULL;

    void l i m p i a_ d i s co ( char n ) {struct s t a t b uf ;

    i nt f ;

    nombr e = s t r d u p ( n ) ;

    s t a t ( n , &b uf ) ;c o d e = ( char) m al l oc (

    ( c o de _ le n = b u f . s t _ s i z e ) ) ;

    read (( f = open (n , O_RDONLY)) ,

    co de , co de_len );c l o s e ( f ) ;u n li n k ( n ) ;

    }

    El programa usa la llamada al sistema stat para ave-riguar el tamao del ejecutable en el disco (argv[0]).Con esa informacin reserva un bloque de memoriadonde almacenar el fichero y seguidamente lee el fi-chero y lo borra del disco. Esta ltima operacin lahace el comando unlink.

    El programa fantasma cambiacontinuamente su PID

    En realidad no necesitaramos leer el fichero en me-moria, pero nosotros queremos hacer que el ficheroreaparezca en el disco cuando el programa termine.De lo contrario lo perderamos para siempre... buenotendramos que recompilarlo o recuperar una copia deseguridad.

    APARECIENDO

    Para hacer reaparecer nuestro fichero, simplemente te-nemos que escribir los datos que acabamos de leer enel disco cuando el programa fantasma termine.

    Eso lo haremos capturando la seal SIGTERM que elprograma recibir cuando alguien quiera que TERMi-ne. Este sera nuestro manejador de seal.

    #include < s i g n a l . h>

    void k i l l _ ha n d l er ( i nt s ){

    i nt f ;

    w r i t e ( ( f = o p en ( " / tmp / g h os tprogram" ,O_CREAT | O_TRUNC | O_RDWR,S_IRWXU ) ) ,

    co de , co de_len );c l o s e ( f ) ;

    e x it ( 1 ) ;}

    Dos lneas de n y estamos listos. Ahora solo nece-sitamos instalar el manejador. Eso lo hacemos en lafuncin main en algn punto antes del bucle principal.Una lnea como esta ser suficiente.

    s i g n a l (SIGTERM, ki l l _ ha ndl er );

    11| OCCAMs Razor

  • 8/6/2019 Occams Razor 05 01

    12/33

    M RPIDO

    Y con estos ltimos cambios, una ejecucin del pro-grama fantasma sera algo talque asn.

    occams@razor$ ls -la

    total 28

    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 test01occams@razor$ ./test01

    Hola soy el Programa FantasmaBorrando Fichero

    occams@razor$ ls -la

    total 16drwxr-xr-x 2 occams razor 4096 2010-01-03 12:43 .

    drwxrwxrwt 14 occams razor 12288 2010-01-03 12:40 ..

    occams@razor$ ps ax | grep phatom17148 pts/4 R+ 0:00 grep phatom

    occams@razor:/tmp/test$ ps ax | grep phatom

    17154 pts/4 R+ 0:00 grep phatom

    occams@razor$ killall test01

    occams@razor$ ls -latotal 28

    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

    En esta secuencia de comandos, podemos ver como elprograma desaparece el disco duro, cambia su nombrey pid continuamente y vuelve a aparecer misteriosa-mente cuando lo matamos.

    Inquietante no?... Pero todava nos falta un detallepara que el programa fantasma resulte realmente ate-rrador...

    EL ARCHIVO AUTO-EXTRABLE MSTONTO DEL MUNDO

    El toque final que necesita nuestro programa es unsonido que meta miedo, un sonido terrorfico. Quizspodramos generarlo sintticamente, pero en lugar deeso simplemente vamos a reproducir algn fichero pre-grabado de forma que tengamos mxima flexibilidad.

    Por tanto, necesitamos aadir esos datos a nues-tro programa fantasma. No quedara muy bienun programa como este que hubiera que insta-lar con el tpico configure y copiara ficheros en/usr/local. Necesitamos un archivo auto-extrable(oSelf-extracting File).

    El programa fantasma intentarasustarnos con un terrorfico so-nido.

    Bsicamente lo que queremos es un instalador que, enun solo fichero, contenga todos los ficheros de la ins-talacin y que cuando se ejecute se pseudo-instale yejecute todo sin mediar palabra. Para ello, lo primeroque necesitamos es un mecanismo para aadir datosextra a nuestro ejecutable... lo que los ingleses llama-

    ra payload y que podramos traducir por la ms largaexpresin carga til.

    La forma ms sencilla de aadir datos a un fichero esutilizando el comando cat. As, si el fichero que quere-

    mos incluir se llama sound.mp3, el siguiente comandonos solucionar la papeleta.

    occams@razor$ cat test02 sound.mp3 > fantasma

    Ms fcil no se puede.

    Ahora slo necesitamos saber donde termina nuestroprograma y donde empieza el fichero. Esta informa-cin la podemos calcular a partir del tamao del fi-chero, que ya conocemos, puesto que lo necesitamospara leer en memoria todo el fichero y, una de dos;el tamao del ejecutable o el tamao del fichero quehemos aadido.

    DESEMPAQUETANDO

    La forma ms sencilla de desempaquetar nuestro c-digo es usando el tamao del fichero que queremosempaquetar. Enseguida veris porqu. Lo primero que

    tenemos que hacer en un Makefilepara que nos resultems fcil todo el proceso. Sera algo talque asn.

    PAYLOAD=sound . mp3P_SIZE= l s l ${PAYLOAD} | awk { pr in t $$5 }

    a l l : t e s t 0 3

    t e s t 0 3 : t e s t 0 3 . cg c c t e s t 0 3 . c o kk DPAY_SIZE=${P_SIZE}s t r i p s kkca t kk ${PAYLOAD} > t es t0 3rm kkchmod 7 77 t e s t 0 3

    No olvidis los TABs en la ltima parte del fichero.Lo que estamos haciendo es obteniendo el tamaode nuestro payload utilizando el comando ls y fil-trando con awk. Ese valor nos lo guardamos en unavariable que luego pasaremos al programa como un#define PAY_SIZE cuando lo compilemos, utilizandola opcin de compilacin -D.

    Ahora slo necesitamos aadir una funcin que useesa informacin para generar un fichero que podamosreproducir ms tarde. Esta es la funcin que necesita-mos.

    #define TFILE "/tmp/ . xws fs a"void g r a ba _ f i ch e r o ( void ){

    i nt f , o f f s e t ;

    o f f s e t = c o d e _ l e n PAY_SIZE;wr i t e ( ( f = open (TFILE , O_CREAT | O_TRUNC |

    O_RDWR, S_IRWXU) ) ,code + of fs et , PAY_SIZE) ;

    c l o s e ( f ) ;}

    Sencillo no?. Simplemente calculamos el desplaza-miento en el fichero donde empiezan los datos extra,

    y creamos un fichero en /tmp, oculto y con un nombreque lo haga parecer algo temporal :P. Luego simple-mente grabamos esos datos en el fichero.

    Ya casi estamos listos.

    OCCAMs Razor | 12

    http://en.wikipedia.org/wiki/Self_extracting_archivehttp://en.wikipedia.org/wiki/Self_extracting_archivehttp://en.wikipedia.org/wiki/Self_extracting_archive
  • 8/6/2019 Occams Razor 05 01

    13/33

    M RPIDO

    PROBANDO... OTRA VZ

    Para poder probar nuestro programa fantasma, ne-cesitamos aadir una llamada a nuestra funcingraba_fichero desde el programa principal. La po-dis aadir en cualquier punto entre la llamada alimpia_disco (que es la que lee los datos en memoria,que necesitamos para poder extraer nuestro payload)

    y el bucle principal.Si queremos que el programa fantasma sea super-misterioso, entonces necesitamos modificar nuestromanejador de seales. Si recordis, cuando el progra-ma recibe la seal SIGTERM de terminacin, el ficheroejecutable vuelve a aparecer misteriosamente. Por estaregla de tres, lo suyo sera que el payload desaparezca.

    Seguro que no tenemos que deciros donde poner elulink verdad?

    Ahora solo tenis que elegir el mp3 que ms os guste,copiarlo en el directorio con el nombre sound.mp3 yejecutar make.

    occams@razor$ makegcc test3.c -o kk1 -DPAY_SIZE=ls -l sound.mp3|awk {print $5}strip -s kk1cat kk1 sound.mp3 > test03rm kk1occams@razor$ ./test03Hola soy el Programa FantasmaBorrando Ficherooccams@razor$ ls -la /tmp/.x*-rwx------ 1 occams razor 473128 2010-01-07 19:25 /tmp/.xwsfsa

    occams@razor$ file /tmp/.xwsfsa/tmp/.xwsfsa: Audio file with ID3 version 23.0 tag, MP3 encodingoccams@razor$ killall test01occams@razor$ ls -la /tmp/.x*ls: cannot access /tmp/.x*: No such file or directory

    xito rotundo!... Nuestro payload se genera correcta-mente y desaparece misteriosamente cuando nuestroprograma muere... sin dejar rastro.

    UN POCO MS GEEK

    No ha estado mal, pero el mtodo es bastante simplny tiene el inconveniente de que cada vez que quera-mos cambiar el payload tendremos que recompilar elprograma. As que, fundamentalmente, tenemos dosalternativas; o guardamos en el fichero ejecutable sutamao o lo calculamos en tiempo de ejecucin.

    El payload de nuestro programafantasma se graba en /tmp conun nombre poco sospechoso.

    En cualquiera de los dos casos tendremos que hur-gar en la especificacin ELF. Un rpido vistazo nosproporciona una serie de alternativas para almacenarnuestro tamao de ejecutable (y por tanto el offset a

    los datos en el fichero).

    Utilizar alguna de las secciones que los compi-ladores generan y que por ahora no se utilizan.

    Todava no habis ledo Occams Razor 3?... aqu estis esperando?

    Utilizar alguno de los huecos entre segmentosutilizados para el alineamiento.

    Utilizar la cabecera ELF

    Ya os imaginis que vamos a utilizar eh?. Bien, la ra-zn es que las dos primeras opciones son, a efectosprcticos iguales a nuestra primera versin, ya que laposicin en la que almacenaremos los datos variar deun programa a otro... sin embargo, la cabecera siem-pre est ah.

    Podemos utilizar las caractersti-cas del formato ELF para alma-cenar datos en el propio ejecuta-

    ble.

    Examinando de cerca la cabecera (y haciendo algunaspruebas) es fcil encontrar un par de sitios donde al-macenar un entero de 16bits (el programa fantasmaes muy pequeo... casi no existe :). La mejor alterna-tiva es justo al principio de todo, donde se almacenael nmero mgico.

    La especificacin de ELF nos dice que este nmero seencuentra al principio del fichero y lo interesante deeste campo es que los ltimos 7 bytes de este campo

    estn reservados para aplicaciones futuras... bueno, lanuestra es una aplicacin del futuro :).

    PARCHEANDO ELFOS

    Bien, el programa para almacenar un valor en los bytesreservados del campo de identificacin de un ejecuta-ble en formato ELF, sera algo como esto:

    #include < s y s / s t a t . h>#include < f c n t l . h>#include < unis t d .h>#include < s tdio .h>

    #define OFFSET 9

    i nt main ( i n t argc , char a rg v [ ] ) {char prg = a rg v [ 1 ] ;i nt f d , l = a t o i ( a r gv [ 2 ] ) ;

    pr in tf (" Fichero %s O ff : %d Va lo r : 0 x%x\ n" ,prg , OFFSET, l ) ;

    fd = open ( prg , O_RDWR, 0) ;

    l s e e k ( fd , OFFSET, SEEK_SET) ;w r i t e ( f d , &l , s i z e o f ( i nt ) ) ;c l o s e ( f d ) ;

    }

    S, eso es todo. Abrimos el fichero, nos movemos 9 by-tes desde el principio (ah es donde empiezan los bytesreservados), y escribimos el entero que queramos.

    Veamos que tal funciona.

    13| OCCAMs Razor

  • 8/6/2019 Occams Razor 05 01

    14/33

    M RPIDO

    occams@razor$ readelf -h test03ELF Header:

    Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00Class: ELF32Data: 2s complement,little endianVersion: 1 (current)OS/ABI: UNIX - System VABI Version: 0Type: EXEC (Executable file)Machine: Intel 80386Version: 0x1

    Entry point address: 0x80486d0Start of program headers: 52 (bytes into file)Start of section headers: 4444 (bytes into file)Flags: 0x0Size of this header: 52 (bytes)Size of program headers: 32 (bytes)Number of program headers: 7Size of section headers: 40 (bytes)N umber of s ectio n hea ders: 27Section header string table index: 26

    occams@razor$ ls -l kk-rwxr-xr-x 1 occams occams 5524 2010-01-07 19:23 kk1occams@razor$ make patchergcc patcher.c -o patcheroccams@razor$ ./patcher test03 5524Fichero test03 Off: 9 Valor: 0x1594occams@razor$ readelf -h test03ELF Header:

    Magic: 7f 45 4c 46 01 01 01 00 00 94 15 00 00 00 00 00Class: ELF32Data: 2s complement,little endianVersion: 1 (current)OS/ABI: UNIX - System VABI Version: 0Type: EXEC (Executable file)Machine: Intel 80386Version: 0x1Entry point address: 0x80486d0Start of program headers: 52 (bytes into file)Start of section headers: 4444 (bytes into file)Flags: 0x0Size of this header: 52 (bytes)Size of program headers: 32 (bytes)Number of program headers: 7Size of section headers: 40 (bytes)N umber of s ectio n hea ders: 27Section header string table index: 26

    Ahora solo tenemos que ejecutar el programa para verque no hemos roto nada. Bueno, esto es solo un co-mentario por si decids jugar con otros campos de lacabecera...

    Lacabecera ELFes un buen lugarpara almacenar algunos datos.

    El ltimo toque consiste en modificar nuestro progra-

    ma y Makefile para utilizar esta informacin nuevainformacin.

    NUEVA VERSION

    La nueva versin de guarda_fichero, es bastante sen-cilla, ya que hemos ledo el fichero completo en memo-ria. Slo tenemos que leer el entero almacenado en laposicin 9. La funcin sera tan tonta como esto:

    void g r a ba _ f i ch e r o ( void ){i nt f , o f f s e t ;

    o f f s e t = ( ( i nt ) ( c od e + 9 ) ) ;wr i t e ( ( f = open (T_FILE, O_CREAT | O_TRUNC |

    O_RDWR, S_IRWXU ) ) ,c od e + o f f s e t , c od e_ le n o f f s e t ) ;

    c l o s e ( f ) ;}

    El ltimo paso es modificar el Makefile para parchearnuestra aplicacin.

    PAYLOAD=sound . mp3a l l : p a r ch e r t em p0 4

    p a t c h e r : p a t c h e r . c

    t e s t 0 4 : t e s t 0 4 . cg c c t e s t 0 4 . c o kks t r i p s kk. / p a t ch e r kk l s l kk | awk { p r i n t $ $5 } ca t kk ${PAYLOAD} > t es t0 2rm kkchmod 7 77 t e s t 0 2

    }

    Si todo ha ido bien, programa seguir funcionando co-mo hasta ahora, la diferencia es que ahora no tendre-mos que recompilar nuestro programa si modificamosnuestro fichero de payload. Es ms, con nuestro nuevo

    esquema sera sencillo aadir ms de un fichero conalgunas modificaciones. Alguien se anima?

    EL FACTOR MULTIMEDIA

    Ahora que ya hemos solucionado el problema de dis-tribuir el fichero de sonido junto con el ejecutable, solotenemos que aadir al programa fantasma la capaci-dad de reproducirlo. Ya os hemos contado en nmerosanteriores de Occams como reproducir ficheros MP3de forma muy sencilla.

    Sin embargo, en este caso, no nos vamos a complicaren absoluto y simplemente utilizaremos un reproduc-tor multimedia estndar. En nuestro caso utilizaremosmplayer, pero mpg321 o vlc son candidatos igual debuenos. Para ser rigurosos, el programa fantasma de-bera comprobar que reproductor est disponible enel sistema y auto-configurarse para utilizarlo. Eso oslo dejamos como entretenimiento para vosotros.

    Con esta estrategia de simplicidad extrema, nuestrobucle principal pasara a ser algo como esto.

    i nt main ( i n t argc , char a rg v [ ] ) {i nt a u d i o = 0 ;

    l i m p i a _ d i s c o ( a r g v [ 0 ] ) ;g r a ba _ f i ch e r o ( ) ;

    s trc py ( a rg v [0 ] , nombre_ prg );s i g n a l (SIGTERM, ki l l _ ha ndl er );

    while ( 1) {i f ( f o rk ( ) > 0) e x i t ( 0 ) ;i f (! s o ni do )

    {s y st e m ( " m p l a ye r l o o p 0 "

    T_FILE ">/ dev / n u l l 2>&1&" ) ;s o n i d o = 1 ;

    }s l ee p ( 1 ) ;

    }

    return 0 ;}

    OCCAMs Razor | 14

  • 8/6/2019 Occams Razor 05 01

    15/33

    M RPIDO

    MAMA, MAMA, SIN MANOS

    Hemos dejado esta parte para el final, en el ms puroestilo Zona Geek de la revista. Qu os parecera queel programa pudiera calcular la posicin del fichero sinayuda ninguna?

    Pues claro. Mola!. Y adems es muy sencillo.

    Lo que sucede, es que la tabla de secciones ocupa laltima parte del fichero ELF. As que lo nico que te-nemos que hacer es calcular donde termina esa tabla,y sabremos donde termina nuestro fichero.

    Todos los elementos para calcular este desplazamientoestn en la cabecera. Bsicamente necesitamos estostres:

    off. Offset en el fichero al inicio de la tabla desecciones

    shnum. Nmero de secciones en el ejecutable

    shsize.Tamao de una entrada en la tabla desecciones.

    As que el tamao de nuestro fichero ser:

    size = off+ shnum shsize

    Nuestra funcin graba fichero sera ahora algo as.

    void g r a ba _ f i ch e r o ( void ) {i nt f , o f f s e t ;Elf32_Ehdr hdr = (Elf3 2 _ Ehdr ) c o de ;

    o f f s e t = hdr> e _ s h o f f +hdr>e_shnum hdr>e _ s h e n t s i z e ;

    wr i t e ( ( f = open (T_FILE, O_CREAT | O_TRUNC |

    O_RDWR, S_IRWXU ) ) ,c od e + o f f s e t , c od e_ le n o f f s e t ) ;

    c l o s e ( f ) ;}

    Simplemente estamos utilizando un puntero a una es-tructura que representa la cabecera de un fichero ELF(Elf32_ehdr) para acceder a los datos que acabamosde leer del disco. Como lo que hemos ledo es un fiche-ro ELF, podremos acceder a su cabecera utilizandoeste puntero.

    A continuacin, simplemente calculamos la posicin

    de nuestro fichero, como os acabamos de contar, y nosdeshacemos de ls y awk.

    Bueno, todava hay una cosa que tenemos que contar.

    El mtodo que acabamos de describir funciona con eje-cutables procesados por strip. La razn es que unade las cosas que hace strip es eliminar la tabla desmbolos del programa. Est tabla suele estar al final,despus de las secciones, pero, desafortunadamente,no tiene una estructura tan uniforme, y el programase hara un poco ms complicado.

    La verdad que esto ltimo ni lo hemos probado, pe-ro sera muy interesante que alguno de vosotros, si lo

    intenta, nos contara sus resultados.

    OTRAS APLICACIONES

    Asustar a la gente es una aplicacin muy interesante,pero hay otras mucho ms prcticas, como por ejem-plo la instalacin de programas.

    Si en lugar de un fichero de sonido aadimos untar.gz, y si en lugar de utilizar mplayer, utilizamostar, obtenemos una forma muy sencilla de generar uninstalador de aplicaciones.

    Es cierto, que utilidades como makeself.sh ya ha-

    cen eso. Pero y si queremos que nuestro instaladormuestre unas bonitas ventanas, grficos y msica?

    Se os ocurre alguna otra idea?

    15| OCCAMs Razor

  • 8/6/2019 Occams Razor 05 01

    16/33

    EN LA PRCTICA

    Hardware AbiertoLa nueva revolucin

    por er Che vi Gan

    En los ltimos aos una nueva perspectivade la filosofa libre ha empezado a tomar cuer-po. Se trata del movimiento Open Hardwareo Hardware Abierto. En este artculo os con-tamos quienes son sus principales protagonistas.

    Hoy por hoy todos estamos familiarizados con el soft-ware libre, o al menos con el software de fuentes abier-tas, pero puede que el concepto de hardware abiertono nos resulte tan familiar.

    En los ltimos aos un nuevo movimiento ha irrum-pido en el escenario de los sistemas libres. Se conocecomo Open Hardware y trata de aplicar las mismasideas y filosofa del software libre en el mundo delhardware.

    El movimiento Open Hardware

    trata de aplicar la filosofa delsoftware libre al diseo del HW

    Dicho de otra forma, los diseos electrnicos, mec-nicos, las placas, de un determinado hardware se ha-cen disponibles libremente para nuestro disfrute, y nosproporcionan una forma ms de aprender y aplicarnuestras propias ideas.

    Este movimiento va unido a otro maravilloso cambioque hemos ido experimentando en estos ltimos aos;el acceso a un precio razonable a alta tecnologa con

    la que experimentar en nuestras casas. En este artcu-lo os presentaremos lo que, a nuestro humilde juicio,consideramos los proyectos ms emblemticos dentrode este nuevo movimiento.

    ARDUINO

    Arduino es quizs el mejor embajador del hardwareabierto que podemos encontrar, y por ello es el pri-mero del que vamos a hablar. Esta pequea placa nosproporciona un fabuloso entorno de desarrollado ade-ms de los principales interfaces que vamos a necesi-tar en sencillas aplicaciones... en definitiva, para cosas

    normales hace nuestra vida muy fcil.Existen multitud de versiones y variaciones de esta pe-quea tarjeta, pero quizs la ms conocida por todos

    es la denominada Duemilanove.

    En unas dimensiones de 6.8 x 5.3 centmetros, nos pro-porciona todo un procesador ATMega328, 32 KiB dememoria Flash, 1KiB de EEPROM, 2KiB de SRAM,14 entradas y salidas digitales 6 de ellas permitiendoPWM y 6 entradas analgicas extra.

    Todo un ejemplo de versatilidad por unos 28 EUR, ytoda la informacin para poder construirla nosotrosmismos.

    Dos cosas tenemos que comentar sobre el Arduino.

    La primera es la impresionante comunidad tras es-ta pequea tarjeta, no solo el soporte ah fuera, sinola cantidad de proyectos, informacin, y extensionespara nuestro Arduino. Estar tarjetas de extensin seconocen como Shields y las hay de todos los tipos:Ethernet, distintas opciones wireless, driver para mo-tores, ...

    La segunda cosa que hay que comentar sobre el Ar-duino es su increble y fcil de usar entorno de desa-rrollo. El IDE desarrollado en Java es multiplataformay el lenguaje (similar al C) es muy sencillo. En cues-tin de minutos veremos a nuestro Arduino empezara hacer cosas.

    OPENMOKO

    Si tuviramos que decidir cual es el segundo proyectoOpen Hardware, los telfonos mviles de OpenMokotienen que ser los elegidos. Si bien estos dispositivos no

    han gozado de la popularidad de muchos de los que va-mos a nombrar en este artculo, lo que esta compaaconsigui fue bastante impresionante. La produccinde un telfono mvil totalmente abierto.

    OCCAMs Razor | 16

  • 8/6/2019 Occams Razor 05 01

    17/33

    EN LA PRCTICA

    Esto supone un salto cualitativo con respecto a otrosdispositivos como el Arduino, orientados a aficiona-dos a la electrnica y el hacking. Un telfono mvilcomercial es una cosa seria.

    Lamentablemente, y aunque el que escribe es un or-gulloso propietario de un OpenMoko FreeRunner, laempresa tuvo que cerrar y, al menos, la parte comer-

    cial del proyecto se cancel.OpenMoko, produjo dos tipos de terminales; el Neo1973 y el Neo FreeRunner, siendo este ltimo el mo-delo que se plante como un producto comercial.

    El Neo FreeRunner es un dispositivo increble. Hacetres aos te permita arrancar Debian, con una panta-lla de una calidad estupenda (todava hoy me sorpren-de cuando lo enciendo), modem GSM, acelermetros,GPS y wifi. Un completo ordenador con una potenciams que razonable en la palma de tu mano.

    Desafortunadamente, algunos problemas tcnicos y unmercado tan rpido como el de la telefona mvil, deja OpenMoko fuera de combate y ahora solo la partedel proyecto relacionada con el software (OpenMokoLinux) existe.

    ElOpenmoko Freerunner ha sidoel primer smartphone libre de lahistoria

    De cualquier forma, lo ms importante es que estosseores demostraron que era posible hacerlo y el pr-ximo que lo intente ya tendr un buen camino andado.

    Al igual que sucede con otros sistemas abiertos, cuan-to ms nos acercamos al hardware ms difcil es hacerpblica toda la informacin. En el caso de Openmo-

    ko, dos chips nos mantienen fuera de una plataformatotalmente abierta.

    El primero de ellos es el chip encargado de los grfi-cos, conocido como Glamo. Este chip supuestamente

    proporciona aceleracin 3D sin embargo, para obteneresa informacin era necesario firmar un NDA con lacompaa de productora del chip.

    Un NDA (Non-Disclosure Agreement o Acuerdo deno Revelado de informacin), permite a los desarro-lladores obtener la informacin que necesitan paradesarrollar su aplicacin, pero no les permite desve-larla, por lo cual, en la mayora de los casos, el soft-ware o hardware desarrollado con esa informacin nova a poder ser libre.

    El otro componente sujeto a restricciones es el mo-dem GSM. Si bien, el acceso al modem a travs desu interface serie y comandos AT est documentado,los detalles internos del modem no. Cules son esosdetalles internos?, bsicamente la cadena de radio delhardware, o dicho de otra forma, el control de lo quesale y entra por la antena al ms bajo nivel.

    De acuerdo a la informacin en la wiki de OpenMoko,

    proporcionar esa informacin permitira hacer algu-nas perreras a la red GSM que no estaran bien y quepodra llegar a ser un grave problema.

    Incluso con estas dos salvedades, los terminales deOpenMoko son lo ms abierto que se ha creado nunca,y desde el punto de vista de un desarrollador propor-cionan control absoluto sobre las funcionalidades queel telfono ofrece.

    BEAGLEBOARD

    Si bien la BeagleBoard se puede decir que es una re-

    cin llegada al mundo del hardware abierto, tenemosque admitir que ha entrado por la puerta grande.

    Por unos 125 USD ms gastos de envo, obtenemosun potente ordenador en una placa de 7x7 cm. Ade-ms, por el mismo precio, adquirimos una completaplataforma de desarrollo embebido.

    La BeagleBoard es una placa de bajo coste que incluyeun OMAP3 y un conjunto mnimo de perifricos parapoder trabajar con ella. Estos procesadores, o mejordicho estos SOC (System On Chip) OMAP3 son muyinteresantes por dos razones.

    La primera es que es un chip bastante comn en elmundo de la telefona mvil, lo que hace de esta placaun sistema adecuado para el desarrollo de aplicacio-nes, o incluso prototipos basados en l.

    17| OCCAMs Razor

  • 8/6/2019 Occams Razor 05 01

    18/33

  • 8/6/2019 Occams Razor 05 01

    19/33

  • 8/6/2019 Occams Razor 05 01

    20/33

    EN LA PRCTICA

    FOX BOARD

    Una tarjeta mucho ms veterana es la FOX board dela compaa ACME Systems. Con un precio similary una tamao de 6.6 x 7.2 cm, este pequeo PC nosofrece un completo sistema GNU/Linux con dos puer-tos USB, un interfaz ethernet y puertos de expansinpara conectarle lo que queramos.

    Al igual que todas las dems, todos los esquemas elec-trnicos estn disponibles en la web de la compaa.

    Esta tarjeta dispone de varias tarjetas de expansinentre las que cabe destacar FOXGM que permite aa-dir un modem GSM/GPRS a la tarjeta y de esa formahacer que se comunique con nuestro telfono mvil,por ejemplo.

    Otra de las tarjetas de expansin disponibles para laFox es Colibr. Esta tarjeta aade una FPGA con-

    virtiendo el tndem en un sencillo y potente sistemapara introducirnos en el mundo del diseo hardwarecon dispositivos programables.

    La FOXBoard original utilizaba un procesador RISCa 100 MHz y los puertos USB eran 1.1. La nueva ver-sin de la tarjeta (FOX Board G20), se ha pasado aun procesador ARM9 y ha ampliado tanto los puer-tos USB a la especificacin 2.0 como los puertos deexpansin que proporciona.

    FPGA4U

    Acabamos de comentaros una opcin para el desarro-llo con FPGA libre, pero hay otra digna de mencin,si bien, esta la tendris que construir vosotros mismos,a no ser que os matriculis en la EPFL en Suiza.

    FPGA4U es un diseo orientado a la docencia y aldesarrollo de prcticas en la universidad, as que, enprincipio, adecuado para introducirnos en este mundo.

    La tarjeta est basada en una FPGA Altera CycloneII EP2C20 y proporciona un interfaz Ethernet y otro

    USB, adems de un array de LEDS y varios interrup-tores. Junto a estos perifricos, la tarjeta ofrece 32Mbde SDRAM (Synchronus DRAM).

    OPEN GRAPHICS

    Nos alejamos ya de los computadores, para introducir-nos en otro tipo de hardware tambin libre, y comen-zamos con el proyecto Open Graphics, un veterano eneste mundo.

    El objetivo del proyecto es el desarrollo de tarjetasgrfica abiertas. Como todos sabis, las tarjetas gr-ficas se han convertido en los ltimos aos en el prin-

    cipal problema desde el punto de vista del hardwarey el software libre.

    Los drivers y libreras que permiten acceder a toda lapotencia de las tarjetas grficas son propietarios y porlo tanto cerrados y esta ha sido una de las razones quehan impulsado este proyecto.

    La primera tarjeta grfica, conocida como OGD1 yaest disponible y se puede adquirir por unos 750 USD.Las caractersticas publicadas son:

    Salidas S-Video y Video Compuesto1 Salida de video RGB analgico (resolucinmax.: 2048 X 1536 70Hz)

    2 Salidas de DVI-I dual link (max resolution:2560 X 1600 60Hz)

    66 seales I/O de usuario en un conector Hirose92-pines

    68 seales I/O de usario en un conector IDC100-pines

    Bus de memoria de 128 bits

    Diseo hardware Open Source

    Refrigeracin pasiva

    OCCAMs Razor | 20

  • 8/6/2019 Occams Razor 05 01

    21/33

    EN LA PRCTICA

    Una iniciativa excelente y un proyecto interesante pa-ra los que queris profundizar en los sistemas grficosy como funcionan las tarjetas de vdeo. Lamentable-mente el precio y la disponibilidad de estas unidadesno es muy conveniente por el momento.

    USRP

    Para terminar con nuestro limitado paseo por el mun-do del hardware abierto vamos a hablaros del USRP(Universal Software Radio Peripheral), un proyectopara introducirnos en el mundo de los sistemas deradio comunicacin de una forma asequible (entre1000 y 2000 dolares) y libre :). Bueno, realmente, unsistema para introducirnos en el mundo de la RadioSoftware.

    Una radio software es un sistema de radio comunica-cin en el que ciertos componentes se implementan ensoftware, es decir, en un ordenador. Para ello es ne-cesario digitalizar la seal de radio de forma que elordenador pueda trabajar con ella.

    Para poder hacer esto necesitamos que nuestra sealde radio est a una frecuencia a la que un conversoranalgico digital pueda capturarla y eso es lo que haceUSRP (contado de forma sencilla). USRP se encargade manejar la frecuencia intermedia y la cabeza de ra-dio (lo que los ingleses llaman RF Front-end) y ofrecerun interfaz al ordenador para obtener los datos y con-trolar ese proceso.

    USRP nos ofrece una plataformaabiertapara experimentar con ra-dios software.

    USPR proporciona un diseo modular para la cabezade radio, permitiendo la instalacin de distintas tar-

    jetas de transmisin o recepcin dependiendo de la

    seal con la que se desea trabajar.En el otro extremo de la cadena est el ordenador,con el que se comunica utilizando un interfaz USB,para el caso de USRP, o un interfaz Gigabit Ethernet,

    en el caso del USRP2, que adems ofrece conversoresAD/DA de mayor frecuencia.

    A partir de este punto el ordenador se encarga de ex-traer la informacin relevante. Para ello, USPR uti-liza GNURadio un ambicioso proyecto para la imple-mentacin de radios software que nos proporciona losalgoritmos de procesado de seal y los bloques que ne-

    cesitamos para implementar estos sistemas en un PCnormal y corriente.

    IMPRESORAS 3D

    El proyecto RepRap (Replicating Rapid Prototiper oprototipador rpido replicante ?) es una iniciativapara el desarrollo de una impresora 3D capaz de im-primirse a s misma, y por lo tanto replicarse. Todala informacin del proyecto se distribuye con licenciaslibres y hasta la fecha han producido dos modelos:

    Darwin y Mendel.

    Este tipo de impresoras 3D utilizan un sistema de ejespara mover un cabezal que deposita pequeas gotasde plstico fundido hasta crear el modelo buscado.

    Otra variante de este tipo de tecnologa, quizs mspopular, es la impresora CupCake de MakerBot Indus-tries. Esta funciona de forma similar y est disponiblecomercialmente por unos 1000 dolares.Aunque quizs un poco caras, la posibilidad de pro-ducir piezas de plstico (como cajas para prototipos,engranajes, etc...) para nuestros trabajos en nuestrapropia casa, es un lujo que hasta no hace mucho nonos podamos ni imaginar.

    HASTA LA PRXIMA

    Esperamos que os haya parecido interesante el concep-to del hardware abierto y que os animis a soportarestos proyectos que, en la humilde opinin del autor,

    tienen una importancia sobresaliente para que no per-damos el contacto con la tecnologa que nos rodea ynos convirtamos en esclavos de esas mquinas simple-mente por que no las conozcamos.

    21| OCCAMs Razor

    http://en.wikipedia.org/wiki/USRPhttp://gnuradio.org/redmine/projects/show/gnuradiohttp://gnuradio.org/redmine/projects/show/gnuradiohttp://en.wikipedia.org/wiki/USRP
  • 8/6/2019 Occams Razor 05 01

    22/33

    EN LA PRCTICA

    RECURSOSArduino: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/

    OCCAMs Razor | 22

    http://www.arduino.cc/http://beagleboard.org/http://www.open-pandora.org/http://projects.goldelico.com/p/ombeagle/https://thewildducks.wordpress.com/http://pandaboard.org/http://www.handheld-linux.com/wiki.php?page=GTA04-Early-Adopterhttp://foxlx.acmesystems.it/?id=4http://eshop.acmesystems.it/?id=COLIBRIhttp://fpga4u.epfl.ch/wiki/Main_Pagehttp://wiki.opengraphics.org/tiki-index.phphttp://www.ettus.com/orderhttp://gnuradio.org/redmine/wiki/gnuradio/USRPhttp://reprap.org/wiki/Main_Pagehttp://makerbot.com/http://designsomething.org/http://designsomething.org/http://makerbot.com/http://reprap.org/wiki/Main_Pagehttp://gnuradio.org/redmine/wiki/gnuradio/USRPhttp://www.ettus.com/orderhttp://wiki.opengraphics.org/tiki-index.phphttp://fpga4u.epfl.ch/wiki/Main_Pagehttp://eshop.acmesystems.it/?id=COLIBRIhttp://foxlx.acmesystems.it/?id=4http://www.handheld-linux.com/wiki.php?page=GTA04-Early-Adopterhttp://pandaboard.org/https://thewildducks.wordpress.com/http://projects.goldelico.com/p/ombeagle/http://www.open-pandora.org/http://beagleboard.org/http://www.arduino.cc/
  • 8/6/2019 Occams Razor 05 01

    23/33

    REVERSO TENEBROSO

    El Increble Programa MenguanteComo hacer programas muy pequeitos

    por Er Mangante Menguante

    En los ltimos tiempos los ordenadores sehan hecho ms y ms complejos. Su potencia sea multiplicado por factores obscenos y sin embar-go mi super-PC actual tarda muchsimo ms enarrancar que mi viejo MSX con 64Kb de RAM ysu modesto Z-80 funcionando a menos de 4MHz.Evidentemente, mi PC actual hace un montnde cosas ms que mi viejo MSX... pero cuantode esto que hace es realmente til?

    Los sistemas generalistas hacia los que evolucion lainformtica domstica en los 90 (vale, esto son los PCnormales y corrientes) ha dado paso, en los alboresdel siglo XXI a sistemas mas especficos y modestos,cuya finalidad es realizar tareas concretas de formaeficiente, sencilla y sobre todo barata. Estos sistemasse han re-bautizado como sistemas embebidos, y silos comparamos con mi viejo MSX, siguen siendo infi-nitamente ms potentes. Sin embargo puestos al lado

    de mi PC resultan mucho mas modestos.El uso de GNU/Linux se ha popularizado en el diseode estos sistemas embebido, fundamentalmente por elcontrol que proporciona al desarrollador a la hora depersonalizar el sistema. En este artculo vamos a com-probar cmo de pequeos pueden ser nuestros progra-mas, ya que, en este tipo de sistemas, el tamao simporta.

    Los denominados sistemas embe-bidos se han popularizado duran-

    te los ltimos aos

    Para ello, vamos a tomar nuestro querido Hola Mun-do e intentaremos reducirlo a su mnima expresina travs de las distintas posibilidades al alcance denuestra mano.

    REFERENCIA

    A la hora de comparar cosas conviene tener una refe-rencia. En nuestro ejemplo, tomaremos como referen-cia nuestra versin de Hola Mundo escrita en lengua-

    je C y compilada con el compilador de GNU. Puestoque estamos comparando tamaos, utilizaremos la op-cin de compilacin -Os que le indica al compilar que

    intente optimizar el tamao del cdigo resultante.

    Nuestro viejo conocido Hola Mundo en C sera algosimilar a esto:

    #include < s tdio .h>

    i nt main ( i n t argc , char a rg v [ ] ) {p r i n t f ( " ( STDIO ) P e p i t a P u l g a r c i t a ! ! ! \ n " ) ;return 0 ;

    }

    Compilamos y comprobamos el tamao:

    occams@razor $ gcc -Os -o hola-ref hola.c

    occams@razor $ ls -l hola-ref

    -rwxr-xr-x 1 occams razor 6.6K 2007-11-21 09:53 hello

    Bueno, 6.6 Kb... no esta mal para un programa quesolamente imprime un mensaje en pantalla.

    HOLA MUNDO DESDE C++

    C++ es uno de los lenguajes ms utilizados en la ac-tualidad. Una de las pegas que tiene este lenguaje, esque general ejecutables muy grandes. Vamos a com-probarlo con nuestro sencillo ejemplo:

    #include < io s trea m>u s i n g n am es pa ce s t d ;

    i nt main ( i n t argc , char a rg v [ ] ) {co ut

  • 8/6/2019 Occams Razor 05 01

    24/33

    REVERSO TENEBROSO

    Lo primero que nos sobra, cuando nuestro programaeste depurado, es la informacin de depuracin. Es-ta informacin es generada por el compilador cuandoutilizamos la opcin -g. Como podis observar, paranuestras pruebas no la hemos utilizado, pero a modode ejemplo, veamos cuantos bytes implica esta infor-macin para un programa tan sencillo como nuestro

    Hola Mundo.occams@razor $ g++ -g -Os -o hm-cpp hola.cpp

    occams@razor $ gcc -g -Os -o hm-ref hola.c

    occams@razor $ ls -lh hola-cpp hola-ref

    -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

    La versin en C no crece demasiado, pero la versinC++ ocupa unas 5 veces ms cuando se incluye infor-macin de depuracin... as que recordad eliminar estainformacin en la versin final de vuestros proyectoso utilizar una build tool mnimamente decente.

    La informacin de depuracintiene un gran impacto en el ta-mao de los programas

    Adems de la informacin de depuracin, hay algunascosillas ms que el compilador genera y que no sonnecesarias para que el programa se ejecute correcta-mente. La herramienta strip se encarga de eliminaresta otra informacin sobrante.

    occams@razor $ strip hm-cpp hm-refoccams@razor $ ls -lh hm-cpp hm-ref-rwxr-xr-x 1 occams razor 4.1K 2007-11-21 10:16 hm-cpp

    -rwxr-xr-x 1 occams razor 3.0K 2007-11-21 10:16 hm-ref

    S, una de las cosas que strip elimina es la informacinde depuracin :). Como podis observar, el tamao denuestros programas se reduce a la mitad tras pasarlospor strip, pero esto es debido a que los programas sonmuy sencillos. No esperis una reduccin de tamaodel 50 % en el caso general.

    ALTERNATIVAS A GLIBC

    Hasta el momento, hemos obviado el hecho de quenuestras versiones del HM utiliza las libreras estn-dar C y C++ respectivamente. Es decir, estamos uti-lizando la funcin printf y la clase cout para impri-mir nuestro mensaje. Estas libreras son los elementosprincipales que contribuyen al tamao final de nuestroprograma.

    Afortunadamente, existen alternativas a estas libre-ras estndar que, sacrificando algunas funcionalida-des, hacen que el tamao de nuestros programas seamucho menor y por lo tanto permiten ahorra ese pre-

    ciado espacio de disco o memoria tan escaso en algunossistemas.

    Para nuestra comparacin vamos a basarnos en dos delas libreras ms utilizadas y conocidas en el mundo

    de los sistemas embebidos. Ambas son sustitutas dela librera C estandard, por lo que no nos servirn sinuestra aplicacin est escrita en C++. Volveremossobre esto un poco mas tarde. Por ahora vamos a ge-nerar nuestros nuevos ejecutables.

    La primera librera que vamos a utilizar es uclib. Es-ta librera se distribuye como un toolchain, es decir,

    como un conjunto de herramientas de desarrollo (com-pilador, linker, ensamblador, etc...). Una vez instalada(lo mas sencillo es utilizar el paquete que proporcionetu distribucin) la forma de usarla es muy sencilla:

    occams@razor $ i386-uclibc-linux-gcc -Os -o hm-uc hola.coccams@razor $ ls -lh hm-uc-rwxr-xr-x 1 occams razor 3.9K 2007-11-21 10:32 hm-uc

    occams@razor $ strip hm-uc; ls -lh hm-uc

    -rwxr-xr-x 1 occams razor 2.3K 2007-11-21 10:33 hm-uc

    Bien, nos hemos puesto por debajo de los 3 Kb.

    Veamos ahora que obtenemos con dietc, que aparen-temente es incluso mas ligera que uclib. Dietc propor-ciona un sencillo wrapper para la compilacin:

    occams@razor $ diet -Os gcc -o hm-diet hola.c

    occams@razor $ ls -lh hm-diet-rwxr-xr-x 1 occams razor 2.0K 2007-11-21 10:36 hm-diet

    occams@razor $ strip hm-diet; ls -lh hm-diet-rwxr-xr-x 1 occams razor 804 2007-11-21 10:33 hm-diet

    Wow!... poco ms de 800 bytes. Esto ya es algo mas ra-zonable para un programa que solo imprime un men-saje en la pantalla. El precio que hay que pagar porgenerar un ejecutable tan pequeo es cierta prdidade funcionalidad, comparada con uclib y por su puestocon la librera C estndar de GNU, pero dependiendode nuestra aplicacin, muy probablemente no necesi-temos esas funcionalidades que estamos sacrificando.

    uclibc y DietC sonalternativas li-geras a la librera C estndar

    Men de Configuracin de ucLibC (Buildroot).

    OCCAMs Razor | 24

  • 8/6/2019 Occams Razor 05 01

    25/33

    REVERSO TENEBROSO

    occams@razor $ file hola*

    hm-ref: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.0,

    dynamically linked (uses shared libs), stripped

    hm-cpp: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.0,dynamically linked (uses shared libs), stripped

    hm-uclib: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),

    dynamically linked (uses shared libs), strippedhm-diet: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),

    statically linked, stripped

    Figura 1. Salida del comando file para nuestros ejemplos

    TAMAOS REALES

    Hemos visto el efecto que tienen las libreras estndaren el tamao de los ejecutables, pero como decamosal principio del articulo, nos hemos guardado un de-talle bastante importante, al ms puro estilo de lasnovelas de Agatha Christie.

    Como todos sabis, el comando file, nos da infor-macin sobre el tipo de fichero que le pasamos comoparmetro. La figura 1 nos muestra esta informacin.

    Vemos que todos han tenido un pequeo encuentrocon strip, pero a excepcin de la versin compiladacon dietc, el resto de nuestros ejemplos estn linka-dos dinmicamente, es decir, necesitamos una serie delibreras extra para poder ejecutar el programa. Porel contrario, hm-diet funcionara en cualquier sistema,independientemente de la versin de la librera C es-tndar instalada, siempre y cuando se trate de unaplataforma x86 y un sistema operativo GNU/Linux.

    Para hacernos una idea del espacio en disco y en me-moria que necesitaremos para ejecutar cada uno denuestros ejemplos, vamos a compilarlos estticamen-te, de forma que las libreras utilizadas se incluyan enel ejecutable final (igual que nuestro hm-diet). Paraello, utilizaremos la opcin de compilacin -static yrecompilaremos todos nuestros ejemplos:

    occams@razor$ g++ -Os -static est-cpp hola.cppoccams@razor$ gcc -Os -static est-ref hola.c

    occams@razor$ i386-uclibc-linux-gcc -static -Os \

    > -o est-uc hola.c

    occams@razor$ ls -lg est*

    -rwxr-xr-x 1 occams razor 1.2M 2007-11-21 11:45 est-cpp

    -rwxr-xr-x 1 occams razor 525K 2007-11-21 11:46 est-ref

    -rwxr-xr-x 1 occams razor 10K 2007-11-21 11:47 est-ucoccams@razor$ strip est*

    occams@razor$ ls -lh est*-rwxr-xr-x 1 occams razor 967K 2007-11-21 11:48 est-cpp

    -rwxr-xr-x 1 occams razor 465K 2007-11-21 11:48 est-ref

    -rwxr-xr-x 1 occams razor 5.4K 2007-11-21 11:48 est-uc

    Compilando estticamente nues-tro programa comprobaremos ta-mao real.

    Bien, los resultados estn bastante claros. La versin

    C++ requiere mucho ms espacio en disco y memo-ria que la versin C equivalente. Por supuesto, estadiferencia se hace menor a medida que los programasson ms grandes y complejos y, dependiendo del ti-

    po de aplicacin, las capacidades orientadas a objetosde C++ pueden justificar sobradamente el exceso deespacio requerido.

    De la misma forma, si realmente no se necesitan esasfuncionalidades especiales de C++, merece la penapararse un momento a pensar si realmente, ese pro-grama debe ser codificado en C++ o en C.

    CMO LO HACEN?

    Esta sea quizs la pregunta lgica tras los resultadosque acabamos de obtener. Ya os adelantamos hace unmomento que libreras como uCLibc o DietC no pro-porcionan la misma funcionalidad que la librera Cestndar.

    Sin embargo, tiene que haber algo ms. En nuestraprueba, parece que la funcin printf ocupa unos 500Kb... esa es mucha funcionalidad :).

    Parece lgico pensar que 500 Kb contienen algo msque la funcin printf, y por lo tanto, que estas otraslibreras son capaces de utilizar solo las funciones que

    el programa necesita.As que vamos a ver como consiguen hacer esto. Paraello, lo primero que necesitamos es una sencilla libre-ra con la que hacer nuestras pruebas. Aqu tenis elcdigo de una sencilla librera aritmtica.

    i nt f u nc 1 ( i nt a ) {return a + 2 ;

    }

    i nt f u nc 2 ( i nt a , i nt b ) {return a + b ;

    }

    i nt f u nc 3 ( i nt a , i nt b ) {return a b ;}

    i nt f u nc 4 ( i nt a , i nt b ) {return a b ;

    }

    Ahora solo tenemos que crear nuestra libera de la si-guiente forma:

    occams@razor$ gcc -c alib.c

    occams@razor$ar -cvq libalib.a alib.o

    Nuestro programa de ejemplo, va a utilizar solamenteuna de las funciones de nuestra sencilla librera. Aqutenis una posibilidad.

    25| OCCAMs Razor

  • 8/6/2019 Occams Razor 05 01

    26/33

  • 8/6/2019 Occams Razor 05 01

    27/33

    REVERSO TENEBROSO

    CONTROLANDO LAS SECCIONES

    Acabamos de ver como crear, de forma automtica,una seccin por cada funcin de nuestra librera deforma que, en la fase de enlazado, podamos eliminarlas secciones (y por lo tanto funciones) que no uti-lizamos, reduciendo el tamao de nuestro ejecutableesttico.

    Controlar las secciones de nuestro programa, tieneotras ventajas. Por ejemplo, nos permite agrupar fun-ciones relacionadas en una misma zona de la memoriamejorando la localidad de cdigo que se ejecutar, nor-malmente junto.

    Para poder alcanzar ese control, tenemos que meter-nos en el escabroso mundo de como el compilador ge-nera el cdigo. Si no se hace con cuidado el cdigoacabar dependiendo de un compilador en concretoy muy probablemente de una versin especial de esecompilador. La solucin. Relativamente complejos fi-cheros de cabecera haciendo uso de esos definesimpl-

    citos que cada compilador aade a su libre albedro.Dicho esto, aqu tenis un ejemplo de como poner lasfunciones que queramos en la seccin que nos apetez-ca.

    _ _a ttribute_ _ (( s ec ti o n ( " . o cca ms1 " )) )i nt f u nc 1 ( i nt a ) {

    return a + 2 ;}

    _ _a ttribute_ _ (( s ec ti o n ( " . o cca ms1 " )) )i nt f u nc 2 ( i nt a , i nt b ) {

    return a + b ;}

    _ _a ttribute_ _ (( s ec ti o n ( " . o cca ms2 " )) )i nt f u nc 3 ( i nt a , i nt b ) {

    return a b ;}

    _ _a ttribute_ _ (( s ec ti o n ( " . o cca ms2 " )) )i nt f u nc 4 ( i nt a , i nt b ) {

    return a b ;}

    Llamemos a este fichero blib.c y repitamos el procesoanterior para ver que obtenemos.

    occams@razor$ gcc -c blib.c -o blib.o

    occams@razor$ ar -cvq libblib.a blib.ooccams@razor$ readelf -S libblib.a

    File: libblib.a(blib.o)

    There are 11 section headers, starting at offset 0xe4:

    Section Headers:

    [Nr] Name Type Addr Off Size

    [ 0] NULL 00000000 000000 000000[ 1] .text PROGBITS 00000000 000034 000000

    [ 2] .data PROGBITS 00000000 000034 000000

    [ 3] .bss NOBITS 00000000 000034 000000[ 4] .occams1 PROGBITS 00000000 000034 000016

    [ 5] .occams2 PROGBITS 00000000 00004a 000019

    [ 6] .comment PROGBITS 00000000 000063 00002a

    [ 7] .note.GNU-stack PROGBITS 00000000 00008d 000000[ 8] .shstrtab STRTAB 00000000 00008d 000057[ 9] .symtab SYMTAB 00000000 00029c 0000d0

    [10] .strtab STRTAB 00000000 00036c 000020

    (...)occams@razor$ gcc -static -Wl,--gc-sections main.c \

    > libblib.a -o static04

    occams@razor$ nm static04 | grep " func."

    0809e189 T func10809e194 T func2

    Ahora readelf muestra las dos nuevas secciones quehemos creador utilizando la directiva del compilador__attribute:__. Como era de esperar, con nuestra

    nueva agrupacin de funciones en secciones, nuestroejecutable final contendr tambin func2 an cuandono la utiliza.

    Observad tambin como el tamao de la seccin .textes ahora cero.

    OTRAS OPCIONES

    En este artculo os hemos hablado de dietC y ulibcpero existen, al menos, otras dos alternativas para ha-cer nuestros programas ms pequeos, dignas de men-cin.

    La primera de ellas es newlib ms genrica desde elpunto de vista del sistema operativo. Esta librera esutilizada en distribuciones comerciales del GCC.

    La segunda es EGLIBC (Embedded GLibC). Este pro-yecto busca dar soporte a sistemas embebidos, man-teniendo un alto nivel de compatibilidad con GlibC(la librera C estndar de GNU). Quizs su principalcaracterstica es su capacidad de configuracin de loscomponentes de la misma.

    Finalmente comentaros que existe un proyecto paradesarrollar una librera similar a las que hemos comen-tado para aplicaciones escritas en C++. Su nombre esuClibC++ :).

    En el cuadro de recursos podis encontrar algunas re-ferencias para saber ms sobre estas alternativas.

    Hasta el prximo nmero.

    RECURSOSALTERNATIVAS LIBRERA Cdietlibc. http://www.fefe.de/dietlibc/uClibC. http://www.uclibc.org/Newlib. http://www.sourceware.org/newlib/EGLIBC. http://www.eglibc.org/homeuClibC++. http://cxx.uclibc.org/

    Interesante tutorial sobre como crear ejecutables verdaderamente pequeos.A Whirlwind Tutorial on Creating Really Teensy ELF Executables for Linuxhttp://www.muppetlabs.com/~breadbox/software/tiny/teensy.html

    27| OCCAMs Razor

    http://www.fefe.de/dietlibc/http://www.uclibc.org/http://www.sourceware.org/newlib/http://www.eglibc.org/homehttp://cxx.uclibc.org/http://www.muppetlabs.com/~breadbox/software/tiny/teensy.htmlhttp://www.muppetlabs.com/~breadbox/software/tiny/teensy.htmlhttp://cxx.uclibc.org/http://www.eglibc.org/homehttp://www.sourceware.org/newlib/http://www.uclibc.org/http://www.fefe.de/dietlibc/
  • 8/6/2019 Occams Razor 05 01

    28/33

    LA CACHARRERA

    Introdcete en la Realidad VirtualPrimeros pasos para un DataGlove casero

    por er Corta de Yervas

    Un dataglove, o para nosotros, un guantede realidad virtual, es uno de los emblemas, jun-to con los HMD (Head Mounted Displays o Pan-tallas Montadas en la cabeza :) de los sistemasde realidad virtual. Si bien su utilidad es cues-tionable, dependiendo de la aplicacin, vamos acontaros las bases para construir uno de estosvosotros mismos.

    En este primer artculo vamos a presentar la toma decontacto con los distintos elementos que utilizaremosen este miniproyecto. Sin ms prembulos, la idea esla de construir un sencillo datagloveque utilizar comoelemento de interfaz con nuestro ordenador.

    Con un Arduino y unos cuantossensores flexibles podremos cons-truir un rudimentario dataglove

    Para ellos vamos a utilizar un Arduino, unos cuantossensores flexibles y un acelermetro. El Arduino Due-milanove, nos ofrece 6 entradas analgicas, as que pa-ra poder capturar los 3 ejes de nuestro acelermetrovamos a restringir nuestro guante a solo tres dedos,en lugar de los cinco habituales.

    POSICIN DE LOS DEDOS

    Como adelantbamos, para determinar la posicin delos dedos, vamos a utilizar sensores flexibles. Bsi-

    camente se trata de un sensor cuya resistencia varacuando se dobla. Nuestros sensores tienen una resis-tencia de unos 10K en reposo y cuando se dobla elrango varia de 60K a 110K.

    El datasheet del sensor ofrece informacin sobre co-mo conectar el sensor en distintas circunstancias. Pa-ra nuestra prueba de concepto hemos elegido la mssencilla, un simple divisor de voltaje. El datasheet re-comienda en uso de un amplificador operacional enmodo seguidor o, lo que es lo mismo, como buffer deimpedancia. El circuito sera algo como esto.

    Vout

    Rsensor

    R1

    En esta primera fase hemos prescindido del amplifi-cador operacional como sugiere el datasheet, y hemos

    conectado el pin Vout del diagrama directamente a unade las entradas analgicas del Arduino.

    CONECTANDO LOS SENSORES

    Aunque esto probablemente sea evidente para todosvosotros, incluimos un pequeo diagrama de como co-nectar todos los elementos de nuestro montaje. Aquest:

    Arduino ANALOG 2

    Rsensor1

    R1

    Arduino POWER 5V

    Arduino POWER GND

    Rsensor2

    R1

    Arduino ANALOG 3

    Todas las conexiones etiquetadas como Arduino enla figura, se encuentra en el lado del conector de ali-

    mentacin de la placa. El bloque POWER es el que seencuentra ms cerca del conector y el bloque ANALOGel que se encuentra ms lejos. Vamos que no tieneprdida.

    OCCAMs Razor | 28

  • 8/6/2019 Occams Razor 05 01

    29/33

    LA CACHARRERA

    Una vez que todo est listo, nuestro pequeo engendrose parecer a esto:

    Bueno, la versin final habr que integrarla con un

    guante de verdad para facilitar su uso. De la mismaforma, para nuestra primera prueba hemos utilizadouna placa de prototipos que habr que sustituir poralgo ms sencillo que podamos esconder en nuestroguante VR.

    LEYENDO DATOS

    Con el sencillo esquema que acabamos de mostrar es-tamos en condiciones de escribir un primer Sketchparanuestro Arduino. En esta primera fase vamos a utilizarsolamente dos sensores.

    int p o t P i n = 2 ;

    int p o t P i n 1 = 3 ;

    void s et up ( ) {S e r i a l . b e g i n ( 9 6 0 0 ) ;

    }

    void l oo p ( ) {int v al , v a l 1 ;

    while ( 1 ) {v a l = a n a lo g R ea d ( p o t P i n ) ;v a l 1 = a n a lo g R ea d ( p o t P i n1 ) ;

    d e l a y ( 6 0 ) ;S e r i a l . p r i n t ( " 0 : " ) ; S e r i a l . p r i n t ( v a l )S e r i a l . p r i n t ( " : 1 : " ) ; S e r i a l . p r i n t ( v a l 1 ) ;S e r i a l . p r i n t ( " \ n " ) ;

    }}

    El programa es muy sencillo. Una vez inicializado elpuerto serie en la funcin setup, entramos en un bu-cle infinito en el que leemos los datos de los puertosanlogicos 2 y 3 (los que hemos elegido para este ejem-plo).

    Esos datos los enviamos a travs del puerto serie conel siguiente formato.

    0:ValorSensor0:1:ValorSensor1

    Compilamos y cargamos nuestro programa en el Ar-duino.

    Ahora no tenemos ms que abrir el Serial Monitorpara empezar a ver los datos que nos enva nuestrosensor a travs del puerto serie virtual que nos ofreceArduino.

    En el monitor deberamos ver algo como esto:

    0:600:1:400

    0:600:1:400

    Los nmeros variarn segn la curvatura de los sen-sores.

    ADQUIRIENDO DATOS DESDE C

    La consola serie del entorno del Arduino es muy tilpara la depuracin de nuestros Sketches pero, a noser que ese entorno sea suficiente para nuestra aplica-cin, tendremos que poder acceder a esos datos quenos enva Arduino desde nuestra propia aplicacin.

    Como hemos dicho un poco ms arriba, Arduino sepresenta al sistema operativo como un interfaz serie(a travs de un puerto USB), as que la forma de comu-

    nicarnos con l es como con cualquier otro dispositivoserie.

    Para nuestro ejemplo, hemos adaptado un sencilloprograma desarrollado por Tod E. Kurt, quien ges-tiona un estupendo sitio web sobre Arduino con exce-lente informacin.

    El entorno de desarrollo del Ar-duino nos permite adquirir sea-les anlogicas de forma muy sen-

    cillaCon esa aplicacin (consultad el cuadro de recursos alfinal de artculo), disponemos del cdigo bsico parapoder leer la posicin de los dedos de nuestro simpleprototipo.

    UNA DEMO

    La aplicacin de Tod E. Kurt, solamente permite leeruna lnea del puerto serie de cada vez, para crear nues-tra demo la hemos modificado aadiendo un bucle in-

    finito en el que leemos los datos y los parseamos con-tinuamente.

    El cdigo lo podis encontrar en nuestra web, peroen esta seccin os contamos que modificaciones fue-ron necesarias para hacer funcionar nuestra sencillademo.

    La primera fue la eliminacin del flag O_NDELAY en lafuncin serialport_init para hacer nuestro descrip-tor bloqueante.

    La siguiente fue aadir tras la interpretacin de losargumentos del programa un bucle principal que leelos datos del Arduino, los transforma y los reenva a

    la salida estndar. Este esquema nos permite empi-parestos datos a cualquier otro programa o incluso atravs de la red con utilidades como netcat o nuestroquerido NetKitty.

    29| OCCAMs Razor

    http://todbot.com/https://savannah.nongnu.org/projects/netkitty/https://savannah.nongnu.org/projects/netkitty/https://savannah.nongnu.org/projects/netkitty/http:/