Author Archive

Vamos a darle un poco de zocotroco!!! A partir de las 20:00h más o menos :P

Flyer Watergroove

El diseño es de Magi, para los interesados maghino_@hotmail.com.

Llevo una semanita ya con la VCI-100 y la Audio8 y nada que ver con la Hercules que tenía de hace 5 años. Todo va mejor, más suave y rápido… pero bueno aún me queda mucho por hacer, aún así aquí os pincho la primera sesión que grabé este domingo de tontería en casa.

Tiene mogollón de gazapos y el estilo… voy haciendo lo que puedo :P

http://rapidshare.com/files/128059168/MiniPO_-_ExperimentalSunday_06-07-2008_.mp3.html

Ya soy yo crítico, los temas… me encantan (pedir el tracklist en un comentario y os lo pongo) al dj le falta… :)

Ya queda menos ;) El Spot lo veo un poquito mal ambientado en el entorno gallego, pero bueno lo mejor va a ser la fiesta!!!!!

Dejo el enlace del repositorio de paquetes de idioma y correctores ortográficos para Firefox3 desde el que podeís descargar el de Gallego entre todos los idiomas del mundo.

https://addons.mozilla.org/es-ES/firefox/browse/type:3

Instalación a golpe de click ;)

Los entendidos del Chiki Chiki

Gracias manu!

Hace unos días publiqué un post sobre el plugin acts_as_state_machine y desde aquella estuve buscando la manera de hacer las cosas un poquito más sencillas en el futuro. Uno de los objetivos que perseguimos en el proyecto que en el que estoy trabajando es dejar abierta la posibilidad de modificar o crear nuevas maquinas de estados entre los diferentes grupos que puedan surgir dentro de la empresa y que las incidencias circulen a modo de hot patato. Para ello vamos apoyarnos en que ruby deja las clases abiertas :) y así podemos meterle mano dura :P

Lo primero que tenemos que hacer es definir una serie de áreas o conjuntos de grupos para definir los estados:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Tracker << ActiveRecord::Base
  acts_as_state_machine :initial => Group.initial_for_loaded_area
 
  Group.all_groups.each() { |grp|
    state grp.state_name
  }
 
  Event.all.each() { |e|
    event e.name.to_sym do
      e.group_transitions.each() { |gt|
        transitions :from => gt.from, :to => gt.to
      }
   }
end

Ahora toca refinarlo un bastante, pero la idea básica es esa.
Saludos!!

BARCELONA!!!!!!!
Si señores el año que viene tenemos Euruko en España. Para ello se está creando una asociación de programadores en Ruby de la que formo parte.

Os dejo los enlaces oficiales:

Nos vemos en Barna!!!!

En la última semana tuve que trabajar con maquinas de estado y probe el plugin de acts_as_state_machine y la verdad es una maravilla. Este plugin nos permite definir una serie de estados para un objeto junto con las transicciones de los estados. Cada estado lleva asociados tres tipos de callbacks en tres momentos temporales:

1
2
3
:enter => Proc.new { |bar| foo } #antes de entrar al estado.
:after => Proc.new { |bar| foo } #después de entrar al estado.
:exit  => Proc.new { |bar| foo } #al salir del estado.

El uso del plugin es bastante sencillo. Empezamo con la instalación:

1
2
$ script/plugin install / 
http://elitists.textdriven.com/svn/plugins/acts_as_state_machine

Una vez instalado solo tenemos que definir el modelo de la siguiente manera (para no liarlo mucho solo pondré los elementos realcionados con el plugin):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Ticket << ActiveRecord::Base
  acts_as_state_machine :initial => :opened
 
  state :opened, :enter => Proc.new { #Validates something }
  state :asigned, :after => Proc.new { #Add to TODO }
  state :closed,  :exit   => Proc.new { #Audit ticket }
 
  event :asig do
    transitions :from => :opened, :to => :asigned
  end
 
  event :close do
    transitions :from => :opend, :to => :closed
    transitions :from => :asigned, :to => :closed
  end
end

Con esto nos creariamos una clase Ticket con tres estados, opened, asigned y closed. Los eventos son los encargados de desencadenan las transiciones entre los estados.

Una vez en el controlador podríamos hacer:

1
  @ticket.close!

y el estado de la incidencía pasa a cerrado.

En la base de datos el campo por defecto que Act_as_state_machine usa es el state que podeís modificarlos usando :column como opción. Ahora queda trastear. espero que os ayude en algo.

Saludos.

Referencias:
acts_as_state_machine en Agil Web Development

La gestión de la configuración es uno de los temas más importantes dentro del mundo del desarrollo de software. Por el año 1970 se comenzaron a usar los VCS (Version Control System) que mejoraron la ayuda a desarrolladores permitiendo tener un control sobre diferentes versiones del código en el que trabajaban. Por aquella época se usaban bastos mainframes para realizar esa tarea de forma CENTRALIZADA.

Años más tarde se lanzó CVS (Concurrent Version System) desarrollado por GNU que dió paso a Subversion (SVN) uno de los VCS más usados hoy en día.

Pero una nueva corriente de DVCS (Distributed Version Control System) está pegando con mucha fuerza desde el 2004. Hoy tenemos una oferta muy amplia de DVCS: Monotone, Darcs, Bazaar, Mercurial y GIT desarrollado por Linus Torvalds y que sin duda es mi preferido.

De GIT destacaría su rápided y facilidad a la hora de trabajar con Branches y solucionar problemas. El concepto de Branch difiere del de SVN. En SVN erán ramas estables y finales (esas que no se deben tocar :P ) mientras que GIT las trata como puntos de inflexión en las que se separa de la rama principal (master branch). Poniendo un ejemplo: Supongamos un escenario en el que estamos desarrollando una aplicación para crear una ToDo-LiST y queremos desarrollar dos nuevas funcionalidades independientes (FA y FB) y tenemos dos desarrolladores (D1 y D2).

D1 se crea una branch nueva llamada FA y comienza a trabajar en ella a su bola.

D2 continua su desarrollo en la rama principal.

Cuando D1 acabe puede empujarle (push) los cambios a la principal y fusionar todo de nuevo (merge).

Si alguien difiere de esto por favor que me corriga ;)

INSTALACIÓN EN UBUNTU

sudo aptitude install git gitk

CREACIÓN DE CERO DE UN REPO

cd ~/foo/bar

git init

git add .

CLONACIÓN DE UN REPO EXISTENTE

git clone URI

STATUS Y DIFFERENCIAS

git status

git diff

MANEJO DE BRANCHES

git branch foo #Crea la rama foo

git checkout foo #Cambia a la rama foo

PUBLICACIÓN Y ACTUALIZACIÓN

git commit -a -m “Mensaje” #Con -a no hace falta el git add

git fetch #Actualiza

ERRORES

git fsck #Comprueba si hay errores y limpia

Para añadir patrones o ficheros a la zona ignore solo hay que crear un fichero llamado .gitingore en el que podremos introducir los ficheros que no deseamos incluir en el repositorio.

./gitignore

*.log

db/schema.rb

*.session

Puede que halla metido la pata en algún punto, pero espero que os sirva de ayuda, para empezar. Para los maqueros la instalación se puede hacer con los Ports:

sudo port install git-core

Me gustaría que comentaseis vuestras experiencia con GIT u otro DVCS.

Ruby on Rails es increíble. Usarlo es como estar viendo una película de kung-fu, donde una docena de frameworks malvados se preparan para golpear al nuevo y pequeño recién llegado, para terminar al final derrotados en una gran variedad de imaginativas formas

-Nathan Torkington (O’Reilly)