HackIt! Nivel 11: backtracking

Después del dolor del nivel 10 (un nivel genial no quita que no pueda ser doloroso 😉 llegamos al nivel 11 un tanto «acongojados», porque asumimos que, como la dificultad vaya en aumento, nos pueden dar las uvas.

Sin embargo, tras leer el enunciado, yo creo que este nivel no debería de haber ocupado el puesto número 11, sino alguno inferior, pues es resoluble incluso por «fuerza bruta visual», es decir, cogemos lápiz, cogemos papel y se puede resolver (no es trivial, pero se puede hacer con algo de tiempo y paciencia). Pero me estoy adelantando; la prueba pide que, en el siguiente tablero, encontremos un camino tal que el número de baldosas de cada color que atravesemos sea el mismo. Por ejemplo, 2 verdes, 2 azules y dos amarillas. El blanco no cuenta (casillas inicial y final). Se sobreentiende que no se puede pisar 2 veces la misma casilla (no lo dice el enunciado pero es una asunción que hago):

Aquellos de vosotros que habéis estudiado algoritmos de backtracking en el pasado (y os acordáis de algo 😉 me imagino que os estaréis frotando las manos, porque efectivamente, es resoluble por backtracking. Por cierto, cómo cambia la carrera de informática… hoy en día, en mi facultad, la asignatura de «Estructuras de datos y algoritmos» en Ingenieros Técnicos en Informática (que por cierto me tocó impartir este año), no se incluía la parte de backtracking por distintas cuestiones que mejor me ahorro comentar (y no son todas por «culpa de los profesores»). No me parece bien. Así que, el año que viene (y si los hados me designan a Donostia otra vez) pienso dar la tabarra hasta que encaje, como antaño, esta parte de la asignatura en el temario. Tal vez tenga que pedir también que nos pongan una máquina de café más cerca del aula… 😉

Ahora que estamos en temporada de exámenes, sé que cualquier excusa es buena para dejar de estudiar (como dice mi blog-colega txipi, «incluso os enrolaríais en un carguero uzbeko» con tal de no hincar los codos 😉 …. esta prueba de HackIt tiene su cosita: es probable que aprendáis (aprender de verdad) más de recursividad y algoritmos de backtracking resolviéndola por vuestra cuenta que estudiando la teoría correspondiente. Os pasaré mi propuesta de solución en Java en unos días… aunque ahora que lo pienso, igual la guardo como ejercicio para el año que viene };-)

Assembla: mantén tus proyectos software bajo control

Los proyectos fin de carrera son una buena oportunidad para lanzar ideas que siempre has querido ver implementadas pero nunca has sacado tiempo para llevarlas a cabo por tu cuenta. Algunas de ellas terminan en el cajón de sastre (desastre 😉 , pero otras adquieren una dimensión mayor de la que preveías inicialmente. Es sobre uno de éstos últimos proyectos sobre lo que quiero hablar en este post. Un gran PFC que tiene como objetivo implantar un sistema para la gestión integral del desarrollo de proyectos software (la frase parece un bluf comercial, pero, IMHO, no lo es). Todo empezó cuando conocí Assembla.com, una espectular aplicación realizada sobre Ruby on Rails (con algunas partes en Python) que ofrece espacios de trabajo para los desarrolladores software, con soporte Subversion, Trac, blog, wiki, gestión de bugs y tickets (aparte de Trac), gestión de usuarios, múltiples proyectos, repositorio para documentación, git, Mercurial, time-tracking, anotación de imágenes, chat, alertas… y atención, para proyectos de desarrollo e investigación (sin ánimo de lucro), todo ello de forma gratuita (siempre que no te pases de 500MB de ocupación y algún detalle más que aún no he sufrido). En cualquier caso, si tuviera que desarrollar aplicaciones con ánimo de lucro no tendría ninguna duda en contratar los servicios de Assembla, pues hasta ahora, me ha funcionado a la perfección.

Pero, ¿dónde está el PFC? 🙂 En que Assembla distribuye el código fuente de toda su infraestructura bajo el nombre en clave Breakout. Eso sí, hay que tener en cuenta que 1) la documentación está obsoleta y 2) la construcción de Breakout es un infierno de dependencias. Una vez compilado, configurado y probado, dispondrás de los mismos servicios que ofrece Assembla, pero en local (aplicando misma condición de uso: gratuito para proyectos sin ánimo de lucro). La idea del PFC consiste en documentar el proceso de compilación, instalación y configuración de Breakout, integrarlo con el sistema LDAP de la UPV/EHU y abrir el servidor a los PFC sin ánimo de lucro de los alumnos de la Facultad de Informática: con 3 clicks de ratón cada PFC dispondrá de toda la infraestructura mencionada en el párrafo anterior. ¿Alguien dá más?

No sé si llegaremos a tiempo para dejar pulido el proyecto para junio… tal vez para obtener todos los resultados esperados, haya que trabajar un poco más en verano y presentarlo en septiembre. Lo sabremos en menos de 15 días.

HackIt! Nivel 10: solución detallada

Lo primero que haremos será abrir con objdump el ejecutable ./go, para conocer la dirección de entrada (saber desde dónde, desde qué dirección de memoria, empieza el programa a ejecutarse):

sh-3.2$ objdump -x ./go ./go: file format elf32-i386 ./go architecture: i386, flags 0x00000102: EXEC_P, D_PAGED start address 0x08048f50

Apuntamos la dirección de inicio: 0x08048f50

Necesitamos preparar el terreno un poco más. Vamos a examinar el ejecutable con elfsh:

$ elfsh</p> <blockquote> <p>load go

A continuación, dentro de elfsh, pediremos la lista de direcciones de las funciones a las que llama el juego:

</p> <blockquote> <p>rel (elfsh-0.81-a8-dev@local) rel [RELOCATION TABLES] [Object go] {Section .rel.dyn} [000] R_386_GLOB_DAT 0x0804D488 sym[004] : <strong>gmon_start<strong> => Create GOT entry [001] R_386_COPY 0x0804DA40 sym[051] : stderr => Copy symbol at runtime {Section .rel.plt} [000] R_386_JMP_SLOT 0x0804D498 sym[001] : XDrawString => Create PLT entry [001] R_386_JMP_SLOT 0x0804D49C sym[002] : XLookupKeysym => Create PLT entry [002] R_386_JMP_SLOT 0x0804D4A0 sym[003] : sprintf => Create PLT entry [003] R_386_JMP_SLOT 0x0804D4A4 sym[004] : </strong>gmon_start</strong> => Create PLT entry [004] R_386_JMP_SLOT 0x0804D4A8 sym[006] : XAutoRepeatOff => Create PLT entry [005] R_386_JMP_SLOT 0x0804D4AC sym[007] : _ZdlPv => Create PLT entry [006] R_386_JMP_SLOT 0x0804D4B0 sym[008] : XSetTile => Create PLT entry [007] R_386_JMP_SLOT 0x0804D4B4 sym[009] : XSetClipMask => Create PLT entry [008] R_386_JMP_SLOT 0x0804D4B8 sym[010] : XSetFont => Create PLT entry [009] R_386_JMP_SLOT 0x0804D4BC sym[011] : XpmCreatePixmapFromData => Create PLT entry [010] R_386_JMP_SLOT 0x0804D4C0 sym[012] : XSetFillStyle => Create PLT entry [011] R_386_JMP_SLOT 0x0804D4C4 sym[013] : __libc_start_main => Create PLT entry [012] R_386_JMP_SLOT 0x0804D4C8 sym[014] : XCreateSimpleWindow => Create PLT entry [013] R_386_JMP_SLOT 0x0804D4CC sym[015] : XAutoRepeatOn => Create PLT entry [014] R_386_JMP_SLOT 0x0804D4D0 sym[016] : XOpenDisplay => Create PLT entry [015] R_386_JMP_SLOT 0x0804D4D4 sym[017] : gettimeofday => Create PLT entry [016] R_386_JMP_SLOT 0x0804D4D8 sym[018] : XDrawLine => Create PLT entry [017] R_386_JMP_SLOT 0x0804D4DC sym[019] : XCloseDisplay => Create PLT entry [018] R_386_JMP_SLOT 0x0804D4E0 sym[020] : XSetForeground => Create PLT entry [019] R_386_JMP_SLOT 0x0804D4E4 sym[021] : XFillRectangle => Create PLT entry [020] R_386_JMP_SLOT 0x0804D4E8 sym[022] : fclose => Create PLT entry [021] R_386_JMP_SLOT 0x0804D4EC sym[023] : XFreeGC => Create PLT entry [022] R_386_JMP_SLOT 0x0804D4F0 sym[024] : XDrawRectangle => Create PLT entry [023] R_386_JMP_SLOT 0x0804D4F4 sym[025] : fopen => Create PLT entry [024] R_386_JMP_SLOT 0x0804D4F8 sym[026] : XNextEvent => Create PLT entry [025] R_386_JMP_SLOT 0x0804D4FC sym[027] : XMapWindow => Create PLT entry [026] R_386_JMP_SLOT 0x0804D500 sym[028] : _Znwj => Create PLT entry [027] R_386_JMP_SLOT 0x0804D504 sym[029] : select => Create PLT entry [028] R_386_JMP_SLOT 0x0804D508 sym[030] : XCreateGC => Create PLT entry [029] R_386_JMP_SLOT 0x0804D50C sym[031] : fwrite => Create PLT entry [030] R_386_JMP_SLOT 0x0804D510 sym[032] : XSelectInput => Create PLT entry [031] R_386_JMP_SLOT 0x0804D514 sym[033] : XFlush => Create PLT entry [032] R_386_JMP_SLOT 0x0804D518 sym[034] : XTextWidth => Create PLT entry [033] R_386_JMP_SLOT 0x0804D51C sym[035] : XChangeGC => Create PLT entry [034] R_386_JMP_SLOT 0x0804D520 sym[036] : XCopyColormapAndFree => Create PLT entry [035] R_386_JMP_SLOT 0x0804D524 sym[037] : XLoadQueryFont => Create PLT entry [036] R_386_JMP_SLOT 0x0804D528 sym[038] : XParseColor => Create PLT entry [037] R_386_JMP_SLOT 0x0804D52C sym[039] : XAllocColor => Create PLT entry [038] R_386_JMP_SLOT 0x0804D530 sym[040] : puts => Create PLT entry [039] R_386_JMP_SLOT 0x0804D534 sym[041] : XSetStandardProperties => Create PLT entry [040] R_386_JMP_SLOT 0x0804D538 sym[042] : XFreePixmap => Create PLT entry [041] R_386_JMP_SLOT 0x0804D53C sym[043] : fread => Create PLT entry [042] R_386_JMP_SLOT 0x0804D540 sym[044] : XCreatePixmap => Create PLT entry [043] R_386_JMP_SLOT 0x0804D544 sym[055] : __gxx_personality_v0 => Create PLT entry [044] R_386_JMP_SLOT 0x0804D548 sym[045] : _Unwind_Resume => Create PLT entry [045] R_386_JMP_SLOT 0x0804D54C sym[046] : XSetWindowColormap => Create PLT entry [046] R_386_JMP_SLOT 0x0804D550 sym[047] : XPending => Create PLT entry

Conviene fijarse en algunas funciones como: sprintf, fopen, fread, fclose…
En un post anterior vimos que el ejecutable busca un fichero desde el que leer el serial number, así que saber dónde se hace un fopen/fread/fclose es sumamente interesante 😉

Ahora que tenemos unas pequeñas ayudas con las direcciones de esas funciones, y sabemos dónde poner el primer punto de ruptura, podemos empezar a depurar con GDB: Sigue leyendo HackIt! Nivel 10: solución detallada

Inauguración del Repositorio Software de ESLE

ESLE, la Asociación de Empresas de Software Libre de Euskadi y SPRI, la Sociedad para la Promoción y Reconversión Industrial presentarán oficialmente, el próximo jueves, 29, en el Parque Tecnológico de Zamudio, el nuevo  repositorio de aplicaciones libres de ESLE , con el que se quieren poner a disposición de todas las empresas aplicaciones de software libre y open source, junto con su documentación, creadas en la comunidad autónoma vasca y disponibles de forma gratuita y universal.

Se pretende, a través de este evento, dar a conocer los servicios para generar negocio que ofrece el repositorio, así como los objetivos y potencialidades del mismo.

Además, se dará a conocer el programa Kzlankidetza de la SPRI, a través del cual se han realizado algunos de los desarrollos de software que pueden encontrarse en el Repositorio de ESLE, y al que pueden adherirse las empresas y asociaciones.

Se presentarán casos de asociaciones y empresas que han podido beneficiarse de este programa y que han aportado sus desarrollos al repositorio respectivamente.

El acto está dirigido a empresas usuarias, a asociaciones sectoriales y al sector TIC en general

Cómo borrar anotaciones en OpenOffice

Redactas un documento en OpenOffice y se lo pasas a un revisor para que te haga anotaciones, correcciones, comentarios, etc. El revisor lo hace y te devuelve el documento. Corriges lo necesario y a continuación quieres borrar las anotaciones. ¡Sorpresa! En el menú contextual de Writer 2.4 no hay «Borrar anotación». Tras pinchar en distintos menús no aparece la dichosa opción.

Bien, ¡tranquilidad! Existe la posibilidad, aunque encontrarla no es, en mi opinión, algo trivial:

  1. Pulsa F5 (navigator)
  2. Pulsa en «Notes»
  3. En la lista de notas que aparecerá, selecciona la anotación que quieres borrar
  4. Pulsa el botón «Suprimir»
  5. Repite desde 3 tantas veces como quieras

Recuerda que en la parte izquierda tenemos la categoría «OOo» con muchos otros tips sobre esta suite.