Un algoritmo de búsqueda de elementos similares

Es curioso, hay momentos en los que uno tiene que buscar una solución a un problema sencillo, por ejemplo, dadas varias listas de elementos, buscar la más parecida a otra nueva, y encontrar una solución (muy simple!). Pero esta solución no aparece en ningún otro sitio, a alguien se le tuvo que ocurrir! será tan simple (y tan inferior a otras), que no merece la pena documentarla?, simplemente uno no es capaz de encontrarla?... es probable :P...

Después de hacer alguna prueba más... resulta que no escala bien, y con grandes datos pierde ventaja rápidamente xD

Bueno, siendo como fuere, ahí va un algoritmo para buscar la lista (o listas), mas cercana a una dada, sin tener que comparar todos los elementos de todas.

La utilidad es bastante directa, en el campo de la IA (Inteligencia Artificial) hay una serie de algoritmos para hacer clasificación, dado un conjunto de entrenamiento etiquetado (con cada elemento asignado a una categoría) encuentra al conjunto al que pertenece un nuevo elemento.

Evolucionando decoders [1]: Brainfuck

Ya va casi un año desde el último post, como pasa el tiempo...

Esta época he estado liado con varios proyectos, he acabado mi Trabajo de Fin de Grado, del que intentaré hablar más adelante, y he participado en algún CTF. Algo que he notado es que en lo que se refiere a pruebas criptográficas suele haber dos tipos, en las que el algoritmo está claro desde el principio y hay que atacarlo. Y en las que se da un texto cifrado y se plantea el reto de obtener el flag que hay en el.

La idea detrás de este segundo tipo de pruebas (supongo) es determinar la capacidad de reconocer similitudes con cifrados ya existentes, de realizar un análisis de los datos (entropía, ...) y extraer conclusiones a partir de ahí. Hay gente que es muy buena haciendo esto...

Yo no.

Otra opción es hacer pruebas hasta que vaya apareciendo algo interesante, pero es un proceso largo y que no necesariamente da frutos, sería interesante poder automatizarlo, verdad?

Writeup de inBINcible [NcN CTF Quals]

Lleva un tiempo el blog parado, pero traigo algo interesante, veamos como reversear un binario de los presentados en las quals del CTF de la No Con Name.

Aviso: Soy bastante novato en esto, así que seguro que se podrían obviar muchos pasos o hacer más sencillo con los conocimientos y herramientas adecuadas. Si sabes algo de esto, mejor ve ya a la parte curiosa ;).

El binario en cuestión es “inbincible”, si lo ejecutamos produce el siguiente resultado:

1
2
3
$ ./inbincible
Nope!
$

Obviamente no es el que nos interesa, así que veamos lo que hace, abrimos con gdb y buscamos una función desde la que empezar

Extracting .mkv subtitles

Actually this was already posted but it was lost on some migration... so here it is again

All the parsing and extraction is implemented by mkvtoolnix, so first step is installing it...

1
sudo apt-get install mkvtoolnix

After this we can see the tracks in the file

1
mkvinfo video.mkv

Migrando ownCloud de MySQL a SQLite

En su momento realicé una instalación de ownCloud utilizando MySQL como base de datos, más tarde se hizo obvio que esta no era la opción correcta y que la necesidad de ahorrar toda la memoria RAM posible y el hecho de que no hubiera más accesos que los míos apuntaron a que debía haber optado por SQLite, el proceso es algo complicado la primera vez así que aquí queda explicado por si hay que repetirlo...

Lo primero es convertir la propia base de datos a SQlite, idealmente esto supondría sacar un mysqdump, pasárselo a SQLite y el estándar del lenguaje haría el resto...

Pero esto no es tan sencillo, resulta que hay incompatibilidades entre estos dos dialectos y resolverlas a mano requeriría un tiempo del que probablemente no dispongamos, para esto podemos recurrir a sequel, con Ruby y las librerías de desarrollo de los clientes de MySQL y SQLite instaladas podemos conseguirlo haciendo

1
2
3
gem sqlite3
gem mysql
gem sequel

Making MySQLdumps more friendly

Some time ago I had to work with some MySQL database dumps generated by mysqldump(1), lacking a version control software (which fortunately hasn't been needed) more specific, the one used was git(7). Now, git allows to make diff across versions, but this (at least by default) is made line by line so mysqldumps get a lot of data changes even if only a row is the one changed to solve this issue this program was written sqlsplit.c.

The program isn't too polished, it has a main function that only opens the file and another which (with the help of two macro *_*) simulates something like a state automata (actually with a stack), the compilation is simple

1
gcc sqlsplit.c -o sqlsplit

So, for example, if the input is

1
2
3
4
5

Using andEngine from emacs

I was trying to test some game programming in android, a good looking library is AndEngine, the tutorials I found were Eclipse centered, but after trying and ending a couple of times with a segfault, importing a project! it's time to go back to the classics, so let's see how to do it with emacs.

Escribiendo un port de Erlang

Resulta que este cuatrimestre ha habido una asignatura cuya práctica se ha desarrollado en Erlang, un lenguaje funcional que favorece la programación concurrente y la comunicación de los procesos usando paso de mensajes. El resultado de la práctica es un crawler donde cada dominio tiene asignado un “hilo” que tendrá que hacer las peticiones al servidor web, más otro que se encargará de descargar imágenes e indexarlas utilizando pHash, el programa se compone de más partes pero ahora nos centraremos en esto.

(Por cierto, el proyecto se ha desarrollado en abierto, tenéis el código en su repositorio de GitHub, EPC).

Al principio cada hilo simplemente hacía una llamada a httpc:request, que es la forma que ofrece la libería estándar del lenguaje de hacer estas peticiones, pero parece que la concurrencia que ofrece deja que desear, esto producía inanicción en el proceso de indexación.

Más abajo la especificación muestra una posible solución:

Writting an Erlang port

This quarter we had an subject with a an assignment to be developed in Erlang, a functional language which oriented to concurrent programming and interprocess communication through message passing. The result is a crawler where each domain has an assigned “thread” which has to make the requests to the web server, plus another one to download the images and index them using pHash, the program is composed of more parts but now we'll center in this.

(By the way, the project has been developed on the open, the code is available at it's GitHub repository, EPC).

At the beggining each thread simply made a call httpc:request, which is the way that the standard library offers to make this requests, but it seems that the concurrency is not very well handled, this produced starvation on the indexation process.

Further down on the specification a possible solution is shown:

Working on a Debian repo

Update: It looks like M.A.R.S. is now on the official repo ^_^ , so it's useless to maintain this one.

After spending the last hours spewing commands without direction I was able to setup a Debian repo, packaging M.A.R.S. and uploading it, the idea is to make a compilation of libre games which aren't on the official repo (I'd try to send it there but I lack the constancy to mantain it).

The repo is set up on codigoparallevar.com/debian/ and the public key used to sign is the same as always, 0x453125AC

And seems a good time to stop for today...

ps: At this time it only supports amd64 and doesn't list directory entries, I'll polish it later. The configuration would be this:

deb http://codigoparallevar.com/debian/ unstable/$(ARCH)/
deb-src http://codigoparallevar.com/debian/ unstable/source/
Newer posts Older posts