martes, 22 de septiembre de 2009

zsh spell checking

I was talking to David about bash vs zsh features, and looking at the wikipedia page on comparison between shells We saw They only mentioned a couple (maybe 4) things where zsh is superior to bash.

One of the things that seem to make a very little difference (if any at all) is spell checking. Is it useful?

Well, the answer is: Definately!

If the next command outputs a zero, then you don't need this feature

history| grep 'ks\|,ale\|male\|gi\|' | grep -v "history" | wc -l

Otherwise, keep reading.

For short commands you don't use tab, you can misspell them and zsh guesses what you meant.

rgrau@ares [ ~ ] %,ake
zsh: correct ',ake' to 'make' [nyae]? y
make: *** No targets specified and no makefile found. Stop.
rgrau@ares [ ~ ]:2 %ks
zsh: correct 'ks' to 'ls' [nyae]? n
zsh: command not found: ks
rgrau@ares [ ~ ]:127 %
Great, If you ask me.


Hoy me he levantao indeciso, y he salido a la calle silbando y mirando al cielo, como disimulando...

Creo que no se han dado cuenta.

lunes, 21 de septiembre de 2009


That's one of the funniest codes I've seen in a long time.

It's a JAPH 2.0, a social JAPH, a traveler JAPH. I don't know how to describe it....

Perl is movin' along with the times, right?

Its a kind of traveller japh. that fetches another twitt, forks into 2 other twitts, and ends showing a growing string. I'm still on my way to fully understand it, but it's worth the time.


This one had to be a post full of puns, but in the end, there's none. Really

domingo, 20 de septiembre de 2009

Fully vim style linux - part 3 - Get geeker

In this third part (part1, part2) , I'll explain how to get a couple of programs act like vim. With 'act like vim' I mean understand hjkl, and probably nothing more, but if you are really addicted to vim, you know it makes a great difference, right?

pdf viewer

If you're on ubuntu (then you should try vectorlinux, really) , you probably use evince to open pdf files. Well, surprise! evince (at least in ubuntu 8.04 with no extra tweaks) knows what hjkl mean, so you're done :)

If you use xpdf, you can teach it hjkl adding the next lines to your ~/.xpdfrc

bind h any scrollLeft(16)
bind l any scrollRight(16)
bind k any scrollUp(16)
bind j any scrollDown(16)
you can find out more about theese comands in xpdf's man page

xchm viewer

Chances here are xchm, kchmviewer or firefox with a chm viewer plugin.

I haven't seen any option if you use xchm, but kchmviewer can be configured to behave vim-ish (only if compiled with qt libs enabled). pressing ctrl in kchmviewer underlines all links in the view, and makes them accessible with a keystroke.

One of the safest options is using any firefox plugin. Then, hopefully, vimperator will do all the dirty job.


Apart from all those programs, you'll end writing your own tools to help you in your daily tasks.

Then I recommend you a couple of apps/libs.

First is ratmen/9menu/ratmenu . A simple menu aplication that generates menus navigable with hjkl. Priceless

If you feel like programming your own tools, perl module Curses::UI has all bindings you need... by DEFAULT!

On part 4 I'll talk about shells and gtk, and maybe...emacs!

PS: If you have suggestions, or you just liked the post, or... please comment!

viernes, 18 de septiembre de 2009

Una red....

Davide Careglio cuenta en la primera clase efectiva de XC:
"Internet es una red de paquetes".

Joder, si solo fuera internet....
De paquetes, y de mediocres, y de ansiedades,
De síes pero noes, de cobardes,
de 'lo hablamos más adelante',
de 'estas horas no se cobran',
de porfin es viernes, y tampoco tengo nada que hacer.
Yo el primero.
Si 'la internet' fuera 'la' red de paquetes me daba de baja del ADSL.

Pero en la first-life tb estamos 4 paquetes dándonos porsaco unos a otros, buscando maneras de llegar a otros sitios y esnifando que hace la vecina de enfrente. Aunque de esta no tengo ganas de darme de baja.

zsh saved my home

zsh has just saved my whole /home/rgrau directory .

I was hacking like crazy, listening to some techno music, typing as if I were mad, and that's what happened:

rgrau@ares [ ~/Desktop/pharo ] %cd ..
rgrau@ares [ ~/Desktop ] %cd ..
rgrau@ares [ ~ ] %rm *
zsh: sure you want to delete all the files in /home/rgrau [yn]? n
rgrau@ares [ ~ ]:1 %
Obviously, what I wanted to do is delete all files under Desktop/pharo dir , but I typed the 2 cd .. commands without thinking (I suppose I wanted to do a cd ..;rm -fr pharo )

Anyway, zsh asked me and I read what I was going to do... cold sweat... typed 'n', and went to smoke a cigarette.

Thank you zsh. I really love you.

Btw, if you don't want zsh to save your life, you can add setopt rmstarsilent to your .zshrc .

upgrading mercurial and closing branches

If you follow my blog (unlikely), you already know I've been reading about source version control alternatives.

At $work, we use mercurial, but we had a quite old mercurial version (0.9.5). At that time, mercurial wasn't able to close named branches, so when you opened a new branch, you had to carry that branch with you forever. It was not really suited for a-branch-per-feature workflow.

Since mercurial 1.2 though, we can close branches with a --close-branch flag when commiting.

First things first. Upgrading mercurial is not that easy (at least in Ubuntu 8.04)

There's a launchpad user that seems to upload mercurial builds, but I never figured out how to use launchpad. My damn ubuntu can't manage the gpg key or whatever.

Installing from source requires python-dev and python-setuptools. apt-get install them .

Then, you can easy_install Mercurial, and hopefully it'll work.......OOOOOPS, no :)

you see some warnings there, right?
***** failed to import extension hgext.hbisect: No module named hbisect**
ok, as root, go to /etc/mercurial/hgrc.d/hgext.rc and comment the line with


After that, you'll have a working updated mercurial, but probably, your hg view command will disappear.

you can find hgk in the source mercurial package, in the contrib directory.

Just untargz, and move mercurial-1.3.1/contrib/hgk to anywhere in your path.

Now with mercurial 1.3.1, my workflow can follow a-branch-per-feature without problems.

hg branch checkSinglePond
echo "say 'hey! I'm a new feature' ; " >>
hg commit -m "fin de feature"
hg up default
hg merge myNewFeature
hg up myNewFeature
hg commit --close-branch -m "closed"
That's what I did the first time, but well, I thought if I could close a branch when commiting real stuff. It only makes sense if later, we plan on merging.

hg branch BarFeature
echo "say 'bar' "; >>
hg commit --close-branch -m "added and closed"
hg branches # only shows 'default'
hg up default
hg merge BarFeature
hg commit -m "I'm Tip, with BarFeature Merged after closing"
Here's a screenshot of the mess :)

I'll keep posting my findings about version control and how I keep modifying my workflow to fit its 'best practices' ¬¬ .

jueves, 17 de septiembre de 2009

Perl Prgogrammin mini courses. Thankyou ironmen

I've been an addicted follower of perl ironman challenge since t=0 .

There are posts of all kinds, but I'd like to underline some posts that are starting to be more and more common (and I really love them).

I'm thinking of those posts made of sub-posts, like chapters in a book, that go into a problem and try to solve it in many different ways, improving the solution on every new post. It's like reading one of those books that start with a little history and tells us the way to solve the problem, and giving simple solutions at first, changes to OOP solutions, and ends with Higher Order Functions and closures. (Intermediate Perl maybe?) (in spanish)

Now a series of blogposts by brunorc about Catalyst

On my part, I've been writing some more code and tests for my Mastermid Game. Guesser can play in 2 modes for the moment: Totally random guesses and cached Random (in order not to repeat guesses). Next step is implementing the black/white pin answer, and then try to make it play wisely.

martes, 15 de septiembre de 2009

Las estadísticas de google trends

A veces, a uno se le da por probar los servicios beta de google, como google trends, y desde que me compré el netbook AAO, como me lo llevo a todos lados, pues me da por buscar 'qué interés tiene la gente de esto?'

Vamos a hacer cuatro pruebas:
Esta primera me vino a la cabeza mirando 'Se lo que hicistes...'. ¿Quién está más buenorra, Pilar Rubio o Patricia Conde?. El pueblo decide.

No podia faltar algo que ahora esta tan de moda: Arenys de Munt . Independencia o no, lo que han conseguido es mas popularidad que 'La Belén Esteban'.
Hablando de Belén Esteban, Me sorprende (o no) ver que tiene muchísimas más busquedas por "belen esteban" sin tilde (que a todo eso no tengo muy claro que tilde lleve o no tílde) que "belén esteban" . Yo tampoco soy un crack de la ortografía, pero vaya... ahí queda

Y la batalla final. las 2 Belenes contra arenys. Y gana.... "belen esteban", sin tilde, claro

Ahora un WIN clasico:

La paradoja de los buscadores: google y yahoo

Os dejo con otro estudio (bastante más currao, por cierto) de alguien que tb pierde el tiempo como yo, pero lo emplea mejor (si es que es posible emplear bien el tiempo perdido). Es del 2006, pero es curioso igual.


lunes, 14 de septiembre de 2009

read-only IRC channels using erc

Sometimes, when one is managing lots of windows, no matter how well you structured your desktop (GNU Screen, emacs, vim, tiling wm (ratpoison for me)), we can do some nasty things because our mind is in a window, and our desktop focus is in other one.

Tell me if you never wrote ':wq' in a msn window, or ls in an IRC channel :) .

Well, today, I had the pleasure of participating on #perl6 channel at freenode with a great collaboration (My nick is kidd).

it seems some irssi user already thought of that, and wrote a perl script named that keeps messages from a list (configurable) without sending. By default the list contains '^ls '. Instead of just deleting the message, it executes a /names comand, but well, the good thing is you don't bug others.

Btw, I've been using emacs as my irc client, for a few reasons (I wanted to start using emacs but couldn't leave vim for editing codes, so I now use emacs for everything but editing text... well, that's not really true but...).

As you know, emacs is scriptable using elisp. Well, then let me paste a code that davazp wrote as we were talking about this problem in #emacs-es. This snippet builds a list where you should write the channels where you want to stay silent. Then, it sets a hook on erc-join-channel, and compares the buffer name with each name on the list. If it matches, it puts the buffer in read-only mode (c-x c-q).

And here is the snippet. Thx to davazp for this little nifty hack :)

jueves, 10 de septiembre de 2009

Mastermind in Perl

CPAN is an awesome repository of perl libs and apps. It's a bit like emacs plugins: Everything is there and, if not, you should rethink what you're doing because it's probably in a wrong direction.

I learned about MasterMind from a German friend and they called it 'SuperHirn'. When she taught me how to play I thought: "Hey, I bet I could write a Genetic Algo to play this thing". Lately, I've been looking for some toy project to hack in (preferably in perl). I've looked at making an installer for vectorlinux, or doing some crazy app to evolve classes using Io Language (I'll talk about this in another post).

I wanted it to be perl because I needed somewhere to apply what I learnt on YAPC::EU::2009. Things like autobox, Moose, extensive testing, Devel::Cover, PodCoverage, Perlcritic...

Then I decided to implement a MasterMind app in perl. It's clearly overengineered, because in CPAN there are already implementations for this in 200 lines (more or less). The thing is I wanted to review some MVC and OOP concepts I might have forgotten (too much blind hacking).

On the other side, I was kind of following JJMerelo's blog and twitter, and among many many amazing readings like His proposals for Undergrad projects (Really great ideas. In fact I've already read something about parasite computing, but again, that's for another post), I read that he just uploaded a code to play mastermind using Evolutionary Computation .

Now my next mission is finishing the code of the SuperHirn framework (I thought it as MVC, so I could write a GUI, or a CUI or even a web interface (if I ever learn Catalyst) ) and merge it with Merelo's code.

My current code is really messed up. Not well tested, and it doesn't even use Moose as it should be used, but it's my first experience with it so I'm already rewriting it as I implement the features.

Merelo++ for pushing me to write my code quicker (even without knowing it).

lftp, I love you

There are little programs that surprise me positively now and then.

One of theese programs is lftp. It's a ftp/scp/sftp console program, but it's so well thought and so intuitive, that in 30 seconds I just managed to do the following:

I wanted to connect to my ssh server and download some files. Normally I'd do it with scp, but as I haven't still set up my public/private keys (so I can't use tab completion on scp), I thought There should be a way to stay connected and browse through a remote directory and download what I want. In fact, I already implemented this functionality in ratfinder, using Casiano's GRID::Machine , but I wanted a console app.

I installed lftp (slapt-get --install lftp from vectorlinux), and then connected to my server.

$ lftp
Password: ******

Then I read the man page, and noticed there's a protocol called fish that seems to do exactly what I want.

so, now I wrote in a terminal

$ lftp -u kidd fish://
Password: ******

and I was there!!!

Now with a simple 'get' I can transfer my files :)

miércoles, 9 de septiembre de 2009

mercurial vs git which one to choose?

Lately I've been more and more concerned about the importance of version control systems due to my late work on multiple features at the same time on one of my Evolutionary Algorithm app at $work.

I've been reading some texts about distributed vs centralized version control and the advantages of DVCS seem clear, but not being used to work with other people, nor maintaining various developement branches, I find a bit daunting managing my codes without some reading about DVCS.

Let's do some reading then!

I've briefly skimmed some blogposts and homemade comparisons, and finally I tried to find complete free books.

That's the order I think it's the best to understand pros and cons of one and the other system.
In this first article ( ) they explain the main differences between the two.

Fairly the well-known stuff:
git is more flexible,
git is more cumbersome at first.
git is faster than mercurial.
git installs about 150 binaries in your /usr/local/bin
git makes branching cheap

hg is very robust
hg is well documented (better than git)
hg is ready to use
hg is more compact than git

It seems that hg uses the motto "convention over configuration", and git is just the other way.

Here there are a couple of webs that compare one to other in a more procedural way. How git people tend to work and how hg do it.

And here there are some comparison between workflows in both, git and mercurial. Theese are the key to understand branchy development.

different workflows explained:

Git evangelists && book is clearly progit, so it may not be updated respect hg

Mercurial evangelists && book

Yesterday I just finished the 'mercurial definitive guide' book, and theese days I'll take a look at 'pro git', but I think that today, mercurial has the same facilities as git when it comes to branching, and despite not having the staging area, and some other little idiosyncrasies, one can use mercurial with the same workflow as git (one branch for qw/feature bug release experiment/ ). Being able to close branches allows us to use branching instead of cloning , and then end with a update, merge, commit and --close-branch . There's a lot of outdated info about mercurial branching system... you know, teh intertubez is full of moving targets.

All in all, I think I'll keep using hg at $work, and try git here and there on my little github projects.

Next book to finish reading: Effective Perl Programming.
Book I allow myself to start again (and probably won't end): SICP

domingo, 6 de septiembre de 2009

Borracheras y sentimentalismos de autocomplacencia destructiva

Que harias si vivieras indefinidamente? pongamos 14000 años. Esta pregunta me
lleva dando vueltas por la cabeza durante exactamente 2 dias, y ya esta haciendo

Los dias, los años, cada vez pasan más rápido, y si tienes una persona inquieta,
siempre quieres progresar. Como puedes mantener el ritmo de progreso, a la
misma velocidad, si cada vez dispones de menos tiempo no recorres la misma
distancia... Pues sencillamente, no puedes.

Y tienes que buscar otro plano en el que puedas mantener el ritmo que llevabas.
Pero los planos se acaban.

Y cuando ves que se esta acabando una época, un plano? Porque las cosas evolucionan de
forma que no puedes entenderlas, y las borracheras son cada vez más
destructivas. Y las amistades más volátiles. Y te vuelves inflexible con los
que les debes respeto, y dejas entrar gente en tu vida que sabes que no
conviene. Y lo haces por buscar cosas nuevas, pero en 2 semanas te das cuenta
que no es el rumbo. Y cambias otra vez. Y otra vez. Y una vez más.

Y un dia explotas, y te caen lágrimas de niño. De quien no entiende porque sus
padres se separan, o porque una enfermedad, o un beso, o un abrazo caen en una
persona y no en otra. Y las sueltas sin consideración, a una desconocida que te ha
tendido una mano. Y despues de verte así huye. Yo también lo haría.

"It's time to move on". Fin de verano, y necesito poner mi cabeza en un sitio
firme. Un sitio para empezar, y tener 10 años para reaprender, y para volver a
fallar. Pero como la historia se repite, y no sabemos cambiar sino que nos
convertimo en lo que somos, acabaré en el mismo sitio, pero en distinto plano.
Solo espero que el próximo salto me lleve a casa.

Se me estan acabando las ganas de ser 'Él'. De sacar punta a todo. De dar
vueltas a la mandarina. No tener que excusarme en nada, ni ponerme hilos en los
brazos y piernas para convertirme en una marioneta nocturna. De escudarme en la oscuridad para pasarlo bien, para hacer locuras. La noche no es mi único momento. Disfrutar de 24h. Sólo me falta el 'quién' y el 'porqué'.

Gracias, perdón, lo siento, a la mierda, bésame, hasta la próxima. Aplícate la que te parezca adecuada.

martes, 1 de septiembre de 2009

recursividad, perl, memoize, OOP, Borges y haskell

Hola, este post solo es un reminder a todo el que lea esto (unos 20), que hay vida en el intertubez . Esta tarde, he estado charlando con rbistolfi sobre lo 'usual': Programación, filosofia, i software. Hemos charlado sobre memoización (un tipo de programación dinámica).

Pensaba arreglar un poco el code, y hacerlo en forma de post, pero como me gusta tanto el rollo de la conversación, y como derivamos de un sitio a otro, os posteo el churro entero de texto (lo mejor formateado que se)

*** You have joined channel #vectorlinux-es [16:03]
*** Users on #vectorlinux-es: kidd_ rbistolfi T800
*** #vectorlinux-es modes: +tnc [16:04]
*** #vectorlinux-es was created on Tuesday 2009/08/18 04:01:26 PM
*** rbistolfi_ (n=rbistolf@ has joined channel #vectorlinux-es
[kidd_] wb rbistolfi_
[rbistolfi_] ty kidd_ [16:39]
[rbistolfi_] bon dia
[kidd_] buenas
[kidd_] que hay tio
[rbistolfi_] hey buena idea la de wikipedia
[rbistolfi_] la niña me ha atrapao en una casita que le regalamos toda la
mañana [16:40]
[kidd_] si, verdad? Ahi podemos editar todos? o tienes que estar registrado?
[rbistolfi_] :D
[kidd_] jajaja
[rbistolfi_] kidd_: creo que tienes que estar registrado
[kidd_] oh :( bueno...
[kidd_] no se si nos dejaran registrar y meter links en el mismo dia [16:41]
[kidd_] (ya me entiendes, no somos los primeros)
[rbistolfi_] seguro que no lo somos
[rbistolfi_] pues en un rato pruebo aver que pasa
[rbistolfi_] anoche me puse a leer un poco sobre recursion :) [16:42]
[rbistolfi_] me dormi a las 3am
[kidd_] lol
[kidd_] donde lo leiste? [16:43]
[kidd_] yo ayer estuve leyendo cositas raras tb
[rbistolfi_] "How to think like a computer scientist"
[kidd_] aps, no lo conozco
[rbistolfi_] es bastante guay
[rbistolfi_] muy facil al principio, pero avanza rapido [16:44]
[kidd_] como PLAI
[rbistolfi_] sips
[rbistolfi_] luego me puse a navegar algunos de los temas, y di con esta
[rbistolfi_] def fibonacci(n):
[rbistolfi_] "Return the nth fibonacci number."
[rbistolfi_] if n in (0, 1):
[rbistolfi_] return n
[rbistolfi_] return fibonacci(n-1) + fibonacci(n-2) [16:45]
[kidd_] sips, es la clasica recursiva, junto con el factorial
[rbistolfi_] yap
[kidd_] esta serie tiene muchas particularidades
[rbistolfi_] es insane
[rbistolfi_] :D
[kidd_] esta relacionada con la proporcion aurea
[rbistolfi_] pues el flujo de esa funcion es una locura :D [16:46]
[kidd_] ¿?
[kidd_] el flujo?
[rbistolfi_] el flow, digamos
[kidd_] ah, la ejecucion.
[rbistolfi_] va agregando istancias de si misma al stack [16:47]
[kidd_] jaj, claro... esta funcion es memoizable 100%
[rbistolfi_] si, la encontre con un ejemplo de memoize
[kidd_] pq para calcular fib(n-1), tiene que calcular fib(n-2) y fib(n-3) ,
pero fib(n-2) ya esta siendo calculada como 'hermana' de fib(n-1)
[rbistolfi_] /Memoize
[rbistolfi_] claro [16:48]
[kidd_] veo que python hace un objeto para memoizar [16:49]
[kidd_] en perl, la cosa va a nivel funcion (y de hecho, una funcion no es un
objeto en perl...) [16:50]
[rbistolfi_] se puede hacer con una funcion tambien
[kidd_] ah
[kidd_] esque creia que en python, las closures eran un poco .... feas
[rbistolfi_] pues no se si son feas, pero normalmente python ofrece un idioma
para lo que quieras hacer en lugar de la closure [16:51]
[rbistolfi_] y ademas un objeto provee ya la persistencia que logras en muchas
de las closures de functional programming
[kidd_] ya... nose donde lo leí esto de python [16:52]
[rbistolfi_] pero por lo que he visto, en la mayoria de los casos la closure
se puede reemplazar con un generator o un decorator
[rbistolfi_] pues no es un idioma comun, eso seguro
[rbistolfi_] kidd_: pero cuentame como se implementa en perl :) [16:53]
[kidd_] jej. en perl, las closures son tan faciles como meter un bloque que
este por fuera la funcion [16:54]
[kidd_] p.ejemplo
[kidd_] { my $a=0 sub counter{ ++$a} }
[kidd_] counter; #1
[kidd_] counter; #2
[kidd_] .... [16:55]
[kidd_] ok?
[rbistolfi_] sips
[kidd_] ok, ahora un poco mas complicado. quiero hacer una funcion que genere
counters, dando puntos de partida
[kidd_] [16:57]
[kidd_] sub countGen{
[kidd_] my $a = shift;
[kidd_] return sub {
[kidd_] ++$a;
[kidd_] };
[kidd_] }
[kidd_] my $fun_ref= countGen(5);
[kidd_] $fun_ref->(); #6
[kidd_] $fun_ref->(); #7
[kidd_] ...
[rbistolfi_] okis [16:58]
[kidd_] pues si a esto le metes lo de poder entrar funciones como args
[kidd_] haces un meta-wrapper que inserta la logica de inicializar un hash, y
devolver una funcion wrapeada que hace la comprovacion de si los
params estan en el hash y si estan devuelve el valor. sino, ejecuta y
guarda el valor en el hash [16:59]
[kidd_] me explico? es como el ultimo ejemplo , pero anidado una vez mas
[rbistolfi_] wow, que chulo
[rbistolfi_] sips
[kidd_] en perl, ademas, puedes cambiar la tabla de simbolos [17:00]
[kidd_] osea, que la misma funcion memoize('mifun'); busca en la tabla de
simbolos mifun
[kidd_] ejecuta el meta-wrapper, y la wrappeada la llama temporalmente
[kidd_] entonces a la mifun le llama mifun_dentro [17:01]
[kidd_] y cambia finalmente mifun_XYZ por mifun, que llama a mifun_dentro
[kidd_] (el tipico swap)
[kidd_] total, que tu programa sigue llamando a mifun
[kidd_] y no tienes que cambiar nada en absoluto
[rbistolfi_] ya, se van pasando la funcion internamente [17:02]
[kidd_] otra de las ventajas de que se hace en tiempo de ejecucion, es que
puedes memoizar solo las funciones que se llaman mucho
[rbistolfi_] claro
[kidd_] mantener contadores (con closures) para saber cuanto has llamado a una
[kidd_] y hacer un wraper general que diga que de una lista de funciones puras
que tu le dices, memoice a partir de las 1000 llamadas [17:03]
[kidd_] como ves, es mucho mas home_made, pero tienes todo el poder en tus
[kidd_] es lo que tiene perl (en general)
[rbistolfi_] pfff que bonito
[rbistolfi_] pues si, es meta-codigo inteligente :D
[kidd_] el libro higher order perl habla de esto exactamente
[kidd_] y no es necesario saber mucho perl para estas partes [17:04]
[kidd_] si quieres un dia lo repasamos
[kidd_] pq es muy bonito
[rbistolfi_] ya, es solo el concepto este de pasar bloques o subs como args
[rbistolfi_] guay sisi
[rbistolfi_] estaria muy bien
[kidd_] y tb sera una excusa para volver a HOP [17:05]
[kidd_] que lo abandoné hace tiempo
[rbistolfi_] jej no esta mal repasar un pco
[rbistolfi_] ah, cual era el asuto de OOP de anoche? [17:06]
[rbistolfi_] *asunto
[kidd_] ah, esque era una movida... sin el code no se si lo sabre explicar
(tengo el code del Mastermind en el lappy)
[rbistolfi_] ah np [17:07]
[kidd_] imagina tengo unas clases: juego, tablero, jugada, jugador ,
[kidd_] la idea es que el tablero es un array de jugadas
[rbistolfi_] sips
[kidd_] el juego tiene como attrs un tablero y 2 jugadores
[rbistolfi_] nice [17:08]
[kidd_] pues bien, el juego tiene una funcion run, que hace que vayan jugando
los 2 players
[kidd_] y va comprobando si el juego ha acabado o no
[kidd_] pues bien, desde el juego hago $self->jugador1->juega
[kidd_] pero el jugador no sabe donde tiene que jugar
[kidd_] pq no tiene relacion con el tablero, ni con la jugada. solo con el
juego mismo, pero el no puede llegar [17:09]
[kidd_] una manera es llamarlo como $self->jugador1-juega($self)
[kidd_] pasando el propio juego por parametro
[rbistolfi_] claro
[kidd_] pero nose... no se si esta era la manera de hacerlo
[rbistolfi_] lindo problem [17:10]
[rbistolfi_] yo diria que la dependencia logica es de tablero
[kidd_] tb podria hacer que el jugador tenga como atributo el juego al que
[rbistolfi_] la jugada depende del estado de tablero
[kidd_] osea, mandarlo asi [17:11]
[rbistolfi_] esa ultima parece ser la mas indicada desde el punto de vista
formal al menos
[kidd_] $self->jugador1-juega->($self->tablero)
[kidd_] sips
[kidd_] puede ser
[kidd_] pero nose... normalmente no hay estas relaciones cruzadas [17:12]
[rbistolfi_] claro
[kidd_] pq los objetos son datos más que nada
[kidd_] pero cuando los tratas como 'actores'
[rbistolfi_] exacto
[kidd_] para conversar, necesitan conocerse los dos
[kidd_] o tener alguien que llama explicitamente a cada funcion de cada uno,
con el parametro adecuado [17:13]
[rbistolfi_] ya, aparece la situacion, o el estado general
[kidd_] sips
[rbistolfi_] porque cada jugador debera derivar su jugada de tablero, pero si
lo piensas profundamente, esa dependencia transforma
probablemente a jugador en atributos de tablero [17:14]
[rbistolfi_] al final, el juego desarrolla su logica sin jugador xD
[kidd_] claro, esque son 2 formas de enfocarlo distintas
[kidd_] pero hay una en la que desaparece el jugador, pq en el fondo es el
propio juego que cambia de estado
[rbistolfi_] exacto [17:15]
[kidd_] pero entonces necesitas que el propio juego se rija el mismo, y se
haga avanzar
[kidd_] esta es la manera 'normal' de un programa
[rbistolfi_] como en la peli
[rbistolfi_] la que la compu declara la guerra y debe aprender
[kidd_] pero si lo quiero hacer interactivo, y con jugadores e interficies
[rbistolfi_] como se llama?
[kidd_] ¿?
[kidd_] no se [17:16]
[rbistolfi_] no importa :D
[kidd_] nada, pues eso... que estoy con esas cosas
[rbistolfi_] ya, el juego requiere jugador1 y jugador2
[kidd_] como son toy projects, no da miedo cagarla, pero siempre gusta hacerlo
[kidd_] sips
[rbistolfi_] pues claro
[kidd_] de hecho, uno es Player::Master y el otro Player::Guesser
[rbistolfi_] si jugador1 y jugador2 son impresindibles, entonces son
observadores de tablero [17:17]
[rbistolfi_] que es la representacion natural del juego
[kidd_] y el juego tiene un metodo run, y attrs jug1, jug2, tablero
[rbistolfi_] ta, juego tiene que notificar a los players del cambio en el
tablero [17:18]
[kidd_] bueno, al ser por turnos, si el metodo jugar recibe el tablero como
[kidd_] ya no hay problema
[kidd_] no es a tiempo real
[kidd_] si tuviera que hacer observers... esto seria otro rollo [17:19]
[rbistolfi_] claro, entonces tendrias un tablero en el scope de juego, que lo
puedes pasar a cualquiera de los players segun el turno
[kidd_] bueno, lo que tengo es esto. un tablero que lo paso a los players
cuando les toca [17:20]
[kidd_] lo del observer seria que los jugadores vieran los cambios aunque no
fuera su turno
[kidd_] osea, imagina un juego de 4 players
[kidd_] una aproximacion es a cada turno le paso al player i el tablero actual
[rbistolfi_] exacto, 4 no solo ve la jugada de 3, sino de 2 y de 1
[rbistolfi_] pues si
[kidd_] la otra (con observers) es : cada vez que un player toca el tablero,
todos los demas se enteran (no solo el i+1) y pueden estar pensando
estrategias a hacer con este estado [17:22]
[kidd_] si solo hay 2 players no tiene mucho sentido, aunque seria un buen
[rbistolfi_] pues es interesante, aunque ya la implementacion requiere un poco
[rbistolfi_] pero si, estaria muy chulo
[rbistolfi_] que se puede leer sobre el asunto :) [17:23]
[rbistolfi_] hace rato que quiero leer algo mas abstracto
[rbistolfi_] tipo... patrones de diseño
[kidd_] si llegados a un punto, puedo hacer que el que lleve el juego sea un
controller, y 'juego' solo tenga funciones para modificar el estado
del tablero y devolverlo, podriamos jugar con jugadores via socket
[kidd_] o hacer una vista tipo web
[rbistolfi_] guaaaaaaaay [17:24]
[kidd_] rbistolfi_: tengo el libro de design patterns
[kidd_] ya te lo pasare
[kidd_] pero es un poco toston de leer
[rbistolfi_] me lo imagino
[kidd_] yo no me he leido mas de 10 pags seguidas
[kidd_] y no es agradable
[kidd_] es como un manual de ref
[rbistolfi_] es "el" libro de design patterns no?
[kidd_] sips
[kidd_] el de los 'gang of four' [17:25]
[rbistolfi_] ya
[kidd_] dicen que esta esto de los patrones estan inspirados en la
[kidd_] tio, has visto el ritmo de updates de #squeak?
[kidd_] altisimo
[rbistolfi_] sisi, el bot ya esta con la lengua afuera
[kidd_] lol
[rbistolfi_] se ve que se viene la release [17:30]
[kidd_] sips. hoy he mirado la pag de pharo
[kidd_] estan en beta ya
[rbistolfi_] me estuve pensando el otro dia en la discusion
[rbistolfi_] y me parece que el merge, o la migracion total de squeak a pharo
es inevitable [17:31]
[rbistolfi_] si como dice Randal, se ha aceptado la critica de los pharistas
[rbistolfi_] y el goal hacia 4.0 es "limpiar" el kernel y modularizar todo lo
que sea "accesorio"
[rbistolfi_] en un momento squeak y pharo van a superponerse [17:32]
[kidd_] ya, osea que squeak tenia previsto ser pharo, pero de aqui a un tiempo
[kidd_] osea que el camino es el mismo
[rbistolfi_] eso quiere decir que el asunto dejara de ser tecnico para ser
[rbistolfi_] ya
[rbistolfi_] solo queda decidir quien es el lider, si el board de pharo o el
de squeak [17:33]
[rbistolfi_] me acorde de unos versos de Borges, por el tema del juego [17:36]
[rbistolfi_] lo tendras que citar en el doc
[rbistolfi_] "Dios mueve al jugador y el jugador a la pieza / [17:37]
[kidd_] ok. hecho
[rbistolfi_] Que dios detras de dios la trama empieza?"
[rbistolfi_] es de un poema que se llama "Ajedrez"
[rbistolfi_] muy pertinente
[rbistolfi_] es la misma pregunta que nos hemos hecho :D [17:38]
[rbistolfi_] si hay jugador, o solo tablero
[kidd_] joer, si??
[rbistolfi_] ese es el final "Dios mueve al jugador, y el jugador a la pieza,
que dios detras de dios la trama empieza, de polvo tiempo, sueño
y agonia?" [17:39]
[rbistolfi_] [17:40]
[kidd_] joer, demasiao pa mi :)
[kidd_] ah, thx
[rbistolfi_] ya, es rebuscao el poema [17:41]
[kidd_] todo lo meta me mola :) [17:43]
[rbistolfi_] pues si :)
[kidd_] el otro dia volví a hablar de Gödel , Escher Bach con un colega y en
breve lo volveré a pillar
[kidd_] a ver si lo encuentras en alguna biblio o algo
[kidd_] pq vas a alucinar [17:44]
[rbistolfi_] es que es muy dificil no enrollarse con estas cosas
[rbistolfi_] ya, lo tengo que buscar
[rbistolfi_] lo encontre en una lib por aqui, pero eran como 200€
[kidd_] ¿?!!!
[rbistolfi_] un edicion preciosa, eso si :D
[kidd_] joder!
[rbistolfi_] tusquets me parece
[kidd_] sips.
[rbistolfi_] hay uno de bolsillo que es mas barato, pero aun no lo he visto
[rbistolfi_] por aca
[kidd_] ah, esque como celebraron los 20 años, igual hicieron alguna edicion
Edicion 'golden'
[kidd_] sip, esta de bolsillo yo la vi por 17 Euros
[kidd_] los mejores 17 euros en mucho tiempo. palabra [17:46]
[rbistolfi_] joder, 17€ [17:47]
[rbistolfi_] es cierto que lo mas valioso no tiene precio
[kidd_] como ya decíamos ayer
[kidd_] :)
[rbistolfi_] hace un tiempo pense en ello, porque encontre una edicion de la
iliada en un cajon de la basura
[rbistolfi_] quien puede tirar la iliada a la basura [17:48]
[rbistolfi_] eso prueba que estamos involucionando hacia el mono
[rbistolfi_] :D
[kidd_] jaj
[rbistolfi_] kidd_: tio, parece que gambas no tiene namespaces ni nada 0.o
[rbistolfi_] no puedes importar modulos escritos en gambas [17:57]
[kidd_] jaj
[kidd_] me lo creo
[kidd_] son lenguajes hechos a im. i sem de VB
[rbistolfi_] eso quiere decir que m0e tiene que pasar el estado del installer
a la siguente etapa del wizard cada vez :/
[kidd_] como? no t pillo [17:58]
[kidd_] ooooostia!
[kidd_] ahora t pillo
[rbistolfi_] hay step1.gambas
[rbistolfi_] para que step2.gambas sepa de step1
[rbistolfi_] ya me lo pillaste [17:59]
[kidd_] y la info se tiene que ir pasando , pq no mantiene viva la info de
[rbistolfi_] claro
[kidd_] pero esto no es de namespaces....
[kidd_] bueno si... a menos que llames a todo de forma diferente
[rbistolfi_] ya, no es directamente de namespaces
[kidd_] pero son colisiones generales [18:00]
[kidd_] que todo son vars globales
[rbistolfi_] exactly
[kidd_] y no puedes mantener el estado de un objeto
[kidd_] pfff
[rbistolfi_] al menos eso es lo desprendo de lo que dice M0E
[kidd_] joer, comparando esto con las cosas superteoricas de PLAI (me lo
estuve mirando ayer...) [18:01]
[kidd_] da pena que contemporaneamente se programe en gambas y en haskell
[rbistolfi_] ya, es increible
[kidd_] puess rbistolfi_ , si el rollo de la recursividad te esta gustando,
mira la manera de definir funs en haskell
[rbistolfi_] fue una mala eleccion
[kidd_] len [] = 0
[kidd_] len (x:s) = 1 + len s
[rbistolfi_] me lo voy a mirar
[kidd_] esta es la funcion len
[rbistolfi_] 0.o [18:02]
[kidd_] [] = lista vacia
[kidd_] osea, le dices len de lista vacia , devuelve 0
[kidd_] (caso base)
[rbistolfi_] ya
[kidd_] y len de una lista, donde el primer elem lo llamo x y el resto s
(car, cdr)
[kidd_] devuelve 1 mas len de el cdr [18:03]
[rbistolfi_] :)
[kidd_] eso tb es poesia
[rbistolfi_] totalmente
[kidd_] listCopy [] = []
[kidd_] listCopy (x:s) = x : listCopy s
[kidd_] otra igual [18:04]
[kidd_] fijate que haskell es fuertente tipado, pero puedes picar sin tipos
[kidd_] pq tiene inferencia de tipos con polimorfismo
[kidd_] osea, que el presupone cosas
[rbistolfi_] pero una vez efinido un tipo lo tienes que respetar [18:05]
[kidd_] y mientras vayan cumpliendose, pues no pasa nada, y a la que no se
cumplen, el tio mira si las 2 vars tienen un tipo antecesor comun
[kidd_] si es así, pues presupone aquel tipo mas generico
[rbistolfi_] nice
[rbistolfi_] tenemos que empaquetar haskell [18:06]
[rbistolfi_] VL7.0 va a estar guay :D
[kidd_] jej
[rbistolfi_] lo pillaremos desde el ppio [18:07]
[rbistolfi_] bueno tio, me voy a comer y luego al curro
[kidd_] oki
[kidd_] hablamos
[rbistolfi_] laters

Esto ha sido todo... espero que os hayais enterado de algo... si necesitáis referencias, pues las pedís por los comments, y así sé si alguien lee esto.

No hace falta decir que estais invitados a #vectorlinux-es en irc freenode.

Gracias a rbistolfi por colaborar en el 50% del articulo