Archive for febrero, 2009

Porque me gusta GIT


2009
02.16

Hace unos días Dieguito (aka DLL) me dijo que los manejadores de versiones distribuidos (dcvs, según sus siglas en inglés) no lo convencían y me preguntó porqué me gusta GIT.
Empecemos respondiendo cuales a mi manera de ver son las ventajas de un dcvs. La principal ventaja dada su naturaleza distribuida es que no hay un servidor central al cual conectarse para obtener y/o publicar cambios realizados a un proyecto, aunque nadie impide que los encargados de un proyecto definan a un repositorio como el central, en otras palabras esto permite que cada proyecto utilice el workflow que mejor le parezca. Por ejemplo la gente del kernel del linux utiliza un mecanismo estratificado donde Linus Torvals recibe updates de los desarrolladores en los que confía y a su vez estos hacen los mismo un nivel más abajo, creando así una estructura jerárquica. Como son distribuidos son menos propensos a fallas y o perdidas en el caso de que el servidor central falle total o parcialmente, ya que podremos usar cualquier otra instancia mientras que la falla persista. También permite que un grupo de desarrolladores trabajen en conjunto mandándose modificaciones unos a otros sin necesidad de polucionar el servidor con sus cambios. Hasta acá parece que sólo tiene ventajas para el grupo desarrollo, pero también es interesante que uno localmente puede crear sus propios ramas para experimentar cambios “locos” y/o “raros” sin necesidad de duplicar el checkout local, esto es posible ya que el checkout local tiene las mismas funcionalidades que el “repositorio central”.

Ahora volvamos a lo que me gusta de GIT que como no podía ser de otro manera son dos cosas. La primera es que no GIT no mantiene un historia lineal de cada archivo en el repositorio sino mantiene un historia de cambios hechos al repositorio, lo que permite que GIT sea capaz de detectar y mostrar como partes del código fue migrando de un archivo a otro, y creo que esta funcionalidad no existe en casi ningún otro dcvs. La segunda funcionalidad que me parece excelente es el comando stash, que basicamente lo que hace es guardar temporalmente todos los cambios, commiteados o no, en algún lugar para que podamos movernos a otra rama sin tener que copiar nuestros cambios o hacer multiples checkouts para trabajar simultaneamente en diferentes ramas de la misma aplicación.

Aprendiendo Lisp


2009
02.13

Ya que  por todos lados dicen que para ser un groso programador hay que saber Lisp con mi amigo Cucu nos pusimos a aprenderlo.

El primer reto fue implementar RLE (Run Lentgth Encoding), o sea dada una lista

rle '(1 1 1 2 2 3) = ((1 3) (2 2) 3)

A mi no gustó que Cucu haya definido el tipo de dato es distinto dependiendo de si hay o no repeticiones pero no iba a discutir un detalle tan nimio.
Y sin más acá les dejo mi solución:

(defun make-elem (c n)
  (cond ((eq 1 n) (list c))
    (t (list (list c n))))
  )

(defun acum (c n r)
  (cond ((null r) (make-elem c n))
    ((eq c (first r)) (acum c (+ 1 n) (rest r)))
    (t (append (make-elem c n) (rle r))))
  )

(defun rle (l)
  (cond ((null l) nil)
      (t (acum (first l) 1 (rest l))))
)

PD: Mi solución es más elegante que de Cucu, espero que se anime a postear la suya o al menos que pique en el amor propio para mejorarla!!