domingo, 31 de enero de 2010

Higher higher order functions in Perl

I've been toying with functional programming on and off for some time now, and there are already some apps at $work that use some FP approach.

One example of this is an app I had to do some time ago that filtered a file following user given constraints. To simplify the case, let's imagine we have a textfile with names of students followed by a qualification. We'd like to do some data managing on them. For example, get the average qualification of all students that passed.

In my case, I couldn't keep everything in memory, As I had to parse multiline objects in a 2Gb file, so I had to filter them "á lá" File::Find.

Here's the basic (simplifyed) code.



What if we wanted to change the condition based on a parameter? I thought of two different approaches, one being more clear on the code side, and the other being more robust.

One option would be getting the parameter before the closure. That way, the constraint function will be able to access the $par variable. This option works, and the code does not get much affected. On the other side, The code becomes flaky in the extensibility side. Changing the location of the closure makes the program fail. Using global variables this way isn't really nice either.



Last way I tried is making a higher order function that generates the constrain function. It ressembles some kind of currying. Well, here's the code.



The'@keep' juggling isn't needed on newer perl versions, but you'll need it in perl 5.8.8 .

Dear lazyweb, do you have any preference for one or other technique? Is there another trick to use in this case that could help me?

Here's a bit of help on 'variable X will not stay shared' warning.

Bye

sábado, 23 de enero de 2010

permutations with repetition in scheme

With my exams finished and my final project at uni also finished, I had some time to spend with my already-started-but-not-finished small coding challenges.

As you may know, some time ago I started not one but two implementations of mastermind.

One in Perl, and the other in Scheme.

I wanted to finish the scheme implementation, so I started to look at Donald Knuth's paper about Mastermind. It's not so complicated, but as I've been far from complex algorithms for some time, it scared me a bit.

First thing to do is having available all possible combinations (strictly speaking they are permutations as order matters) of colours (in our case numbers). Two nested maps, a recursive call, and you're done.

As I don't have time to comment all the code, I'll just post here the permutations part, and keep the complete code private for now. When I have the time, I'll post it all, with appropiate comments. It's a minimax algorithm, so not daunting at all, but....

Here it is:



Apart from this, I've hacked with a few things (as time permitted). If you're specially interested in something, ask.

  • net sniffing
  • Image analyzing and video tracking
  • html parsing and web scraping

lunes, 18 de enero de 2010

Variaciones de una misma historia

uno

Cuando aún el negro reinaba yo ya estaba levantado.

Mecagoen la puta, hoy tendría que dormir para estar bien concentrado para el examen, y no hay quién pegue ojo.

Me pasaba por la cabeza una mezcla de medidas de eficiencia de ethernet y gifs de 5 segundos recordando momentos mágicos de la uni. Algunos chulos, algunos embarazosos, que me hacían escabullirbe debajo del edredon, escondiéndome de la luz que entraba por la ventana.

Al final me levanto. Un día lluvioso. Un mal día para acabar este período de 9 años.

Voy a por el bus, aparco el coche en un descampado, pongo el pie en el suelo, y piso un charco. MIERDA.

El trayecto duró más de lo que esperaba. Y ya empezaban los nervios. A las 10 en la uni. 100% de desconocidos, menos los camareros del bar. "Ya te toca largarte de aquí", me digo por dentro.

Tras bastantes horas de medio estudio medio crisis nerviosa llega el examen. Tengo la sensación de irme vaciando. Llevo días vaciándome de tensión porqué he entendido que realmente no hay nada a esperar después del último examen.

El examen está en Chino. Mierda. Me he vuelto a equivocar de clase... ah pues no...se ve que es el examen de redes.
Mientras lo hago, intento escribir concienzudamente, como queriendo marcar que éstas son mis últimas palabras en esta universidad. Pero al salir, comparo soluciones y veo que no lo llevaba tan bien como creía. FAIL.

Mecagondiós! Un cuatri más. Ya me lo veo. El orgullo por los suelos. El año que viene, a ver a más desconocidos, y esos pocos perennes de la uni. Los que me interesan y los que no. La gente que esperabas perder de vista, porqué no te llevaban a ningun sitio. Pues tendras que verlos más.

Y ya son las 21:30, voy a cojer el bus y...lo pierdo. Venga, perfecto, voy a llegar a casa a las 23:30.
Y al llegar al coche otra vez, me vuelvo a encontrar con (léase pisar) el charco porque ha llovido todo el día. ¿Lo véis? un mal dia para acabar

------------------------------
dos

No he podido dormir de nervios. Acabo la carrera!

Desde las 6 que estoy en danza. Joder, esque no cada día acabas la carrera. Una mierda de carrera, sí, pero no me digas que no la has disfrutado. Aún en la cama, me acuerdo de los grandes, y las.

Venga, me levanto, a ver si avanzo un poco. Aunque no por mucho madrugar, amanezca blablabla, siempre puedes empezar a currar en la oscuridad.

Oh, mierda, llueve. Seguro que el tráfico esta fatal, ya verás.
Al entrar en el bus, me encuentro un euro en 1 asiento, y decido sentarme ahí. Quizás es mi "euro de la suerte".

Nah, me lo gasto en una cocacola nada más llegar a la uni.

En mi tercera cocacola de la mañana, veo a unos colegas. Y todos: "venga tío, dale fuerte y cómetelos con patatas!". Aunque no les escucho y sólo estoy mirando de reojo a la izquierda. Joder, que guapa está....

Consciencia: Tio, no te comas la olla, y a lo tuyo, que tienes que pirarte de aquí en 2 días.
Yo: yaya, pero...
Consciencia: Shhhhsthtt!!!

El examen, pues una mierda, como todos, pero con un poco de suerte apurebo sin rodilleras.

Salgo del examen y llamo a uno: "tío, creo que me pasa algo, creo que ya soy ingeniero". He apañao unas birras para mañana y otras para el jueves. :)

Cuando voy a por el bus, lo veo pasar por delante, pero ni me afecto. Tengo la preocupación en huelga. Voy a por el tren, lo pillo, me siento, respiro hondo 3 veces, pongo FatBoySlim y me digo: "tio, intenta escribir lo que te ha pasado hoy desde esos 2 prismas que te hablan todo el tiempo".

A todo esto, ¿Os acordáis que llovía?, pues ahora ya no.

jueves, 14 de enero de 2010

Ocean's one

Es como preparar robar un casino. Todo tiene que ir rodao.
Pero aquí estas más solo que la one.

El crono está en marcha.
Mañana imprimo, finde de estudio, el lunes examen, el miercoles entrego, y el siguiente presento.

Estoy de algoritmos genéticos hasta donde pueda estar uno.
Para motivarme ya escuho musica para robar casinos.

En dos semanas, finikitao. Y a volver a lo de antes: Musiquita los martes, frikismo los miercoles, cervecitas, futbolines, ensayos.... Hasta que me vuelva a cansar de casi todo.

Solo falta que aparezca Julia Roberts en el último momento. Y nos piramos a México. O donde sea.

martes, 12 de enero de 2010

resolve git merge conflicts

My first experience merging non trivial merges on git went ok, but I didn't wrote down the steps, so I already forgot them.

Here's a quick summary of the steps to follow (my second non automatic merge).
git pull
This pulls new updates to your local repo /working directory and notifies you there are conflicts that couldn't be automatically merged.
git mergetool
Opens your favourite $EDITOR with a 3-vertical panel split. Showing you local, merge and remote buffers. Edit the file and clean it.
git add fileWithConflict
git commit
Git knows what you're trying to do, so it will write the "merged from github...." for you.

git user manual explains how to do it fairly well. Of course, you can search on stackoverflow for user help. Many use rebase to "flatten" the branch history. That's up to you. Myself, I'm not confident enough to use those smart commands (Although git fans say that rebase is a git killer feature).

domingo, 10 de enero de 2010

Banish mouse pointer on emacs

In ratpoison and stumpwm, there's a 'banish' command that exiles the mouse pointer to a corner of the screen. It's quite useful when you don't want the mouse to distract you or clobber the text you are writing.

In ratpoison, you only have to execute the command :banish, and it will move the cursor. You can bind it to a shortcut (for me it's 'c-t B').

emacs has a more sophisticated way to do it, and you can automate it to banish the cursor only when your typing is getting close to the mouse pointer, or just when you start typing in a buffer.

the function is namend mouse-avoidance-mode, and accepts some diferent symbol arguments: banish, exile, jump, animate, cat-and-mouse or proteus.

I chose banish because it's the simplest and most determinist. The "problem" there is that the mouse moves to the top-right corner, and when the active buffer is an erc buffer, the mouse is over the channel topic line, and a tooltip is displayed, distracting me. If I could only change the position where the mouse gets moved to....

Hey, it's emacs, so you can rewrite nearly all functions. Browsing through the mouse-avoidance-mode code, you can see the function that tells emacs where to place the mouse is
mouse-avoidance-banish-destination.

Just redefine it in your .emacs file like


and you're done. Now the mouse gets placed 1 line below the title line, so no tooltip window gets displayed.

If you're a seasoned emacser, this will say nothing to you, but for me, it's my first emacs 'hack', so I'm very happy it was so easy to do.

Some time ago I did some kind of modification to emacs, but was basically assisted by davazp.

viernes, 8 de enero de 2010

bibtex is too smart for me

I've been struggling for some minutes with an error when compiling a bibtex file (the LaTeX bibliography system).

The error reads like:
Too many commas in name 1 of "Abhishek Verma, Xavier Llora, Roy H. Campbell, David E. Goldberg" for entry VLCG09
Well, after scratching my head and a few change-compile-fail-swear loops, I found out that bibtex notices the "and" token and the commas in the author tag.

The trick was changing
author="Abhishek Verma, Xavier Llora, Roy H. Campbell, David E. Goldberg",
to
author="Abhishek Verma, Xavier Llora, Roy H. Campbell and David E. Goldberg",
It's cool that bibtex knows so much about correct formating, but... yeah, maybe it's too smart for me.

----------

Update


The lazyweb returned me a clarification about all that mess. In fact, the "proper" way to insert the authors of a bibliography entry is spliting different authors with "and", no matter if it's the last or not, and commas are used to separate surnames and names.

So you can forget everything before this "update".
Thanks D.A. for the tip.

sábado, 2 de enero de 2010

Live blog

Estamos ahora mismo a 2 de enero, y son poco más de las 10:00.

Me he levantado tan temprano, siendo sábado post-resaca de fin de año, porqué he tenido que ir a buscar un paquete a correos. La notificacion ponía: 2 paquetes de USA. Todo cuadra, porqué había comprado 2 libros (Smalltalk-80: The language, y C++ programming language, el Stroustrup) hace poco, y estaba esperando que llegaran.

Pues bien. Llego a correos, y mientras me esperaba, eso que no tienes nada mejor que hacer que intentar buscar tu paquete de entre todos los que ves en las estanterías. Grandes, pequeños, cajas, etc..... Hasta hay una caja envuelta con papel rosa, y ositos, que serà de algun chaval/a al que le mandan un regalo por correo. (Los reyes magos tambien pueden utilizar correos, no?)

Pues atención... en una esquina hay una etiqueta con un nombre,...
RAICIÑO!!!!!

!!!!! COMORRRR????! Esto huele a gallegada... sigo buscando en las etiquetas... Beceiro...
Joder, vaya cracks, yo riéndome sólo, y la peña mirandome...y llega mi turno... le doy la notificación a la tía, y mientras me buscaba los paquetes de USA. Me los da, y yo le digo:

-Creo que eso de ahí tambien es mío.
- Ah sí, toma... Firma aquí, y aquí, y aquí, y aquí, y aquí, y pon tu dni aquí y aquí y aquí...

Total, ya estoy en casa y no lo he abierto aún.

Ya sí.

Una hoja de papel y una caja de alcohol. En la hoja, guiños sin parar. Qué habrá en la caja..nosé podría ser un barco, o una caja. Sí, podría ser una caja. Sabes que siempre hemos querido una caja (*).

Creo que ha sido la primera sorpresa del año, y estoy sin palabras. El subidón de la sorpresa. Luego llamaré a eric (jack sparragow) y se lo cuento. No va a dar crédito. Ni hipotecário ni del outro.

Solo puedo decir: Gracias por todo....e veña jas!

Y como ya he dicho en algun otro lado:
Mis mejores deseos para quien se lo merezca, y quien no, pues que le den porsaco, hoy, en 2011, y en 2100, aquí en pekín y en pokón.


(*) guiño Padre de familia(guiño, guiño), si no entiendes nada, no t preocupes....