View posts for » Category "aprender"

Convocatorio de Chile on Rails, bienvenidos gente con 0 experiencia pero con ganas.

Chile on Rails es la pequeña Comunidad de desarrolladores Rails en Chile, la idea es agrupar a quienes trabajamos en esta gratificante herramienta y compartamos. De Chile on Rails venimos conversando desde el 2006 y concretamos una reunión formal en Mayo de este año y no habíamos podido concretar algo más serio hasta ahora.

En realidad buscamos hacer una convocatoria para lo que pueda surgir, la idea inicial es organizar una miniconf con charlas, seguido de copas en algun pub de Santiago de Chile, si no reunimos a la gente suficiente… nos quedamos con las copas, además recibimos la visita de un interesante amigo de la comunidad Argentina on Rails y es una excelente forma de cerrar lazos en la región. Por qué si en Europa lo hacen nosotros no?

Los posibles temas serían.

Introduccion a Ruby on Rails, RSPEC, Despliegue, etc.

En los comentarios anotense y hacemos una lista para ver si sale algo interesante, si tienes un blog afin te pedimos difundir la convocatoria para ver si sale algo interesante.

Link | Más info en Chile on Rails

Comments (5)

Más conferencias: Ruby Hoedown

hoedownlogo.png

Soy consumidor impulsivo de videos en linea especialmente de los que se habla de emprendimiento y desarrollo de aplicaciones. Personalmente he participado en 2 conferencias sobre desarrollo y es mucho lo que se aprende, lamentablemente aún en Chile la comunidad no es lo suficientemente grande y activa como para organizar workshops o pequeñas conf (aunque claramente esto esta cambiando).

marcel-rubyhoedown.jpg

En Carolina del Norte el 10-11 de Agosto se realizo una mini conf: Ruby Howdown y Confreaks se dedico a documentar cada unas de las sesiones. Una de las mas interesantes, recomiendo verla entera… incluso la discusión entre Marcel y los oyentes con respecto a que hace el código bonito. Marcel propone 3 pilares fundamentales y más bien académicos, como el mismo sugiere.

  • Integridad
  • Claridad
  • Proporcionalidad

Y un comentario de un participante (me hace cara conocida, ya he visto un video de el, estoy seguro!, Chad Fowler?) al final, que simplemente dice que no debemos preocuparnos tanto sobre escribir código bonito y preocuparnos simplemente de apegarnos a esos 3 pilares y escribir código claro. Estos temas para desarrolladores son muy difíciles debido a que todos somos muy apasionados en lo que hacemos… pero la conclusión es simple: Escribamos código claro, integro y proporcional.. que mas podemos decir?, a ti te preocupa?

Link | Ruby Hoedown, Vía RubyInside

Comments (2)

Startpoint: La mejor forma de empezar a retocar Wordpress

Hace ya casi una semana lance Webprendedor un proyecto que tenia en mente hace ya casi 2 meses y en el cual siempre me detenía su diseño para ajustarlo con Wordpress el CMS que lo gestiona.

picture-3.png

Buscando por Internet una plantilla fácil de modificar para ajustarla al diseño que ya tenia XHTMELEADO, recordé que mi amigo y colega Jesús Carrera de Vigo en España había estado trabajando algunos meses atrás en esto mismo.

Totalmente recordado, gracias a Jesús y Startpoint… logre tener corriendo Webprendedor en menos de una noche. (aunque bastante larga).

Link | Startpoint, Tu primer paso a Wordpress

Comments (2)

Nunca trabajes gratis

Trabajo desde los 15 años especialmente en temas dedicados a la informática. Recuerdo una vez que hicimos un Anuario Multimedia en Flash para un 4to medio del Colegio Serena en la Serena, a los 17 empece a diseñar sitios web y desde los 19 que estoy en lo que hago actualmente que es el Desarollo de aplicaciones Web, primero en PHP y ahora en mi “querido” Ruby, y Ruby on Rails.

El problema es que cuando somos inexpertos derepente por nutrir nuestros portafolios aceptamos trabajos de amigos, organizaciones amigas, etc. Mi consejo es simple:

Nunca trabajes gratis, siempre pide algo a cambio.

Esto no quiere decir que seamos desgraciados con nuestros familiares y amigos pero si no quieres dañar las relaciones que tienes con estos, te aconsejo no tomes sus proyectos y si lo haces… algunos consejos.

1. El trato debe ser el mismo que le darías a un cliente normal.

Cuando el trato es diferente y trabajas con un amigo. El tiempo que estarás sobre el proyecto será demasiado y empezaras a desperdiciar tu tiempo por no haber fijado plazos y términos claros, aunque el trabajo sea gratis, no quiere decir que sea menos serio.


2. Busca incentivos que te motiven

Es importante recordar que como Seres Humanos nos movemos por incentivos y es en esto que se basa nuestra motivación, sin motivación el trabajo no es bueno y sin un buen trabajo no logramos esa sensación de bien hecho. No quiero decir que busques el incentivo económico $$$, pero tiene que haber algo que te motive. Estas haciendo un sitio para una fundación de caridad en la que crees y confias? … o Obtienes un servicio a cambio de los tuyos (Ej. Servicios legales por trabajar con un abogado)?.. mientras te encuentras motivado, no tendrás problemas, pero tienes que encontrar tu incentivo.

3. No mezcles las cosas, no es personal

Trabajando es cuando quizás ves a la verdadera persona, puede ser muy positivo o muy negativo. El problema es cuando se discuten temas del proyectos y crees que es personal rompiendo lazos de amistad con la otra parte pasas a otro lado. Recuerda que al trabajar se esta discutiendo entre profesionales y no entre amigos. Cuidado.

4. Aprende a manejar tu carácter

No todos piensan como tú y no todas tu ideas son tan fácil de entender como lo crees, conceptualiza y llega con prototipos para representar de mejor manera tus ideas. Esto es super importante, porque cualquier paso en falso puede significar romper relaciones no solo comerciales sino personales y esto es peligroso para tus futuras referencias.

5. Soldado que arranca sirve para otra guerra

No me gusta mucho este dicho pero puede ser aplicado perfectamente en algunos casos como este y yo entiendo como saber cuando las cosas no dan para mas y retirarse, en cualquier relación: amorosa, comercial o social no seguir este consejo solo terminará destruyendo todo lo que quede entre las partes.

Tú tienes algún consejo?

Comments (4)

Recursos anidados en Rails

Los recursos anidados son una de las cosas que mas me gustan de trabajar con REST en Rails y es básicamente la forma de generar rutas mas amistosas de una manera mucho mas rapida asociando los modelos, usando esta forma se crea un lazo inseparable entre el padre y sus hijos.

El efecto lo puedes lograr tu mismo iterando sobre el contenido de los modelos, modificando las rutas, pero el problema es que pierdes el acceso REST a los controladores o al menos se te haga muy muy enredado.

Recuerda, Rails es acerca de convenciones, cuando las sigues te convertirás en uno de los miles de programadores felices, si no… mejor no uses Rails (Obviamente, en ocasiones romper las convenciones ayuda, solo no lo hagas cuando no sea necesario).

Pero como lo implemento


map.resources :branches, :path_prefix => '/admin' do |branches|
branches.resources : orders
end

2do, tienes que agregar las asociaciones

En app/model/branch.rb

has_many : orders # Ojo con las convenciones, has_many :plural

En app/model/order.rb

belongs_to : banch # Ojo con las convenciones, belongs_to :singular (lógico!, se lee!)

3ero. Tenemos que retocar los controladores, para que sepa donde buscar a los hijos.
En este caso app/controllers/orders.rb

class OrdersController < ApplicationController
before_filter : load_branch

# GET /orders
# GET /orders.xml
def index
@orders = @branch.orders.find(:all).reverse

respond_to do |format|
format.html # index.rhtml
format.xml { render : xml => @orders.to_xml }
end
end

# GET /orders/1
# GET /orders/1.xml
def show
@order = @branch.orders.find(params[:id])
@lines = @branch.types

respond_to do |format|
format.html # show.rhtml
format.xml { render : xml => @order.to_xml }
end
end

# GET /orders/new
def new
@order = Order.new
end

# GET /orders/1;edit
def edit
@order = @branch.orders.find(params[:id])
end

# POST /orders
# POST /orders.xml
def create
@order = Order.new(params[:order])

respond_to do |format|
if @order.save
flash[: notice] = ‘Order was successfully created.’
format.html { redirect_to order_url(@branch,@order) }
format.xml { head : created, :location => order_url(@branch,@order) }
else
format.html { render : action => “new” }
format.xml { render : xml => @order.errors.to_xml }
end
end
end

# PUT /orders/1
# PUT /orders/1.xml
def update
@order = @branch.orders.find(params[:id])

respond_to do |format|
if @order.update_attributes(params[:order])
flash[:notice] = ‘Order was successfully updated.’
format.html { redirect_to order_url(@branch,@order) }
format.xml { head : ok }
else
format.html { render :action => “edit” }
format.xml { render : xml => @order.errors.to_xml }
end
end
end

# DELETE /orders/1
# DELETE /orders/1.xml
def destroy
@order = @branch.orders.find(params[:id])
@order.destroy

respond_to do |format|
format.html { redirect_to orders_url }
format.xml { head : ok }
end
end

# Notar como obtengo al papa de las ordenes
def load_branch
@branch = Branch.find params[:branch_id]
end
end

Notar en el código de arriba, como llamo a el padre (before_filter) de en este caso las ordenes, y como genero sus rutas (order_url(@branch,@order))

Lo que automáticamente te genera por ejemplo, las siguientes rutas:

/branches (Lista de sucursales)
/branches/1 (Muestra sucursal 1)
/branches/1;edit (Editas sucursal 1)
/branches/1/orders (Lista de ordenes para la sucursal 1)
/branches/1/orders/1;edit (Editas la orden 1 de la sucursal 1)

ups, pero estoy ocupando path_prefix asi que en realidad quedaría:

(Esta opción es completamente opcional y no recomendada (Es preferible tener una sola interfaz para todo, al menos algunos lo creen así… yo no mucho, aunque creo depende del tipo de proyecto.)

/admin/branches (Lista de sucursales)
/admin/branches/1 (Muestra sucursal 1)
/admin/branches/1;edit (Editas sucursal 1)
/admin/branches/1/orders (Lista de ordenes para la sucursal 1)
/admin/branches/1/orders/1;edit (Editas la orden 1 de la sucursal 1)

Se puede jugar un poco mas….

Aunque lo dejo a tu discreción


map.resources :branches, :path_prefix => '/admin' do |branches|
branches.resources : orders do |orders|
orders.resources :line_items
end
end

Nota: Para este ejemplo ocupe scaffold_resource para generar todo el código, si ustedes también lo hacen podrán verlo funcionando de inmediato.

Nota 2: Lamento lo difícil que es leer código en mi blog, lo tengo como uno de los principales puntos del porque quiero re diseñar mi sitio, pero igualmente espero ayudarlos (ojo: Hay muchos dos puntos ( : ) que separo para no generar emoticons, recuerden es :variable)

Comments (3)

Amazon S3: Como implementarlo con Rails? Parte I

railsas3.png
Sistema de archivos del CMS que me encuentro desarrollando

Implementaremos una aplicación en Rails apegado al modelo REST que nos permitirá subir archivos a un Bucket en Amazon S3. Usando algunos plugins también serás capaz de crear thumbnails de tus archivos si estos son imágenes. Debes estar dispuesto a ensuciarte las manos (Digo, como nos gusta a nosotros, que a jardinear ni a palos).

Requisitos

  • Un Computador
  • Tener instalado Rails y sus amigos
  • Crearte una cuenta en AmazonWS y activar S3 (Necesitas Tarjeta de crédito en dolares, buuu si sé, pero no hay otra opción)
  • Desde el Panel de control tomar tu Access_key_id y tu Secret_access_key
  • Al rededor de xx minutos

Creamos la aplicación

En este caso nuestra aplicación se llamará s3 y la base de datos, no olvides modificar el archivo /config/database.yml y poner los valores que correspondan, como no vamos a testear (mi próximo must do TDD, esta primero en la lista)


rails as3

Creamos nuestra base de datos


mysql -u root -p
>> create database s3_dev;
>> exit;

Creamos nuestra primera migración

Vamos a ocupar scaffold_resource, que vendrá a cambiar definitivamente a scaffold en la versión 2.0 de Rails, lo que nos permitirá tener una flamante estructura REST en nuestro controladores (Nuestros 7 famosos métodos) e inmediatamente creamos nuestro modelo.


ruby script/generate scaffold_resource Archive name:string created_at:datetime updated_at:datetime content_type:string filename:string thumbnail:string size:integer width:integer height:integer parent_id:string

Lo que nos genera automáticamente todo lo necesario para tener desde ya nuestra aplicación corriendo y con el plus de ya tener generado nuestra migración del modelo necesario para nuestros archivos.


create_table "archives", :force => true do |t|
t.column "name", :string
t.column "created_at", :datetime
t.column "updated_at", :datetime
t.column "content_type", :string
t.column "filename", :string
t.column "thumbnail", :string
t.column "size", :integer
t.column "width", :integer
t.column "height", :integer
t.column "parent_id", :integer
end

Para terminar solo tenemos que migrar

rake db:migrate

Quiere probar como vas? arranca el servidor y apunta tu navegador a http://localhost:3000/archives

ruby script/server

Si no fuera porque estamos implementando S3, ya puedes decir que has creado tu primera aplicación en Rails (Claro, si nunca lo habias hecho. Para los viejotes ahora viene lo bueno).

Haciendo la magia

En el próximo articulo, instalaremos las gemas y los plugin necesarios para que todo quede funcionando.

Comments (7)

La pesadilla de la Terminal: bash command not found

Tuve que formatear el Mac por motivos X, y al volver a instalar todo mi arsenal. Decidí esta vez hacerlo a través de Darwin/MacPorts lo que te permite fácilmente instalar paquetes completes al mas puro estilo de linux (apt-get).

El problema era que después de instalar los Ports, comencé a tener problemas en la Terminal abriendo archivos con Textmate y con el comando SVN que ya estaba instalado. No tener el comando mate es tolerable, puedes ocupar nano, pero no tener soporte SVN a través de la consola es fatal, no puedes hacer despliegues con capistrano, bajarte repositorios con algun cliente como el SVN X y entenderán que para un desarrollador Rails es fatal.

No podía encontrar la solución (Quizás solución simple para un linuxero/maquero experimentado, pero recuerden que tengo un pasado oscuro) y después de pegar un par de gritos al cielo, varios minutos y mucho googleo. Encontré la solución y aquí esta, espero a alguien le ayude si se encuentran en este problema.

  • Abre la terminal
  • Dentro de tu usuario, escribe touch .profile [enter]
  • Luego editalo con, nano .profile
  • Finalmente agrega en el bash profile al final de todo: export PATH=$PATH:/usr/local/bin

Cierra la terminal y vuelve a abrir la consola: Tu pesadilla debería haber terminado

Comments (0)

REST: Un mundo de recursos

Entender REST y aplicarlo en tus proyectos en un principio resulta un poco complicado, pero lo necesario es solo empezar a practicar.

REST como termino significa Transferencia de estado representacional (Representational State Transfer) y fue acuñado por primera vez en una tesis del doctor Roy Fielding y se ha echo popular entre los desarrolladores de Rails debido a las constantes ganas del Core del framework por llevar las buenas practicas a toda la comunidad (Especialmente desde DHH).

REST en pocas palabras se apoya de los recursos existentes en el protocolo HTTP, que hasta el día de hoy poco estábamos ocupando, básicamente solo ocupábamos el GET y el POST, pero nos olvidábamos del PUT y DELETE. (Ahora recuerden la filosofía CRUD)

REST

Algunas de las cosas que vienen de la mano con REST en Rails

  • Ahora con REST la URL son mas limpias, ya no presentan acciones si no que sus recursos.
  • Mejora el trabajo con rutas anidades
  • El uso del respond_to en nuetras acciones (El que facilita el llamado de diferentes recursos).
  • Un nuevo sistema de rutas generado por resources en router.rb y un manejo mucho mejor.
  • Nueva librería ActiveResource

Lo anterior es lo importante y es de lo que todo lo que les conte en un post anterior tiene que ver, quedarse con la Filosofía CRUD y solo eso, no tienes nada. Recuerda que es solo una forma de trabajar y que tienes que aplicar lo de arriba para crear Aplicaciones que realmente hagan cosas nuevas.

Las URLS

Si recuerdan el antiguo modo de trabajar

URLS

Ahora las URLS son las mismas, para distintas acciones pero se diferencian por el método por el cual es enviada a través de HTTP. Y eso es toda la magia, por otro lado apoyado de RESPOND_TO podemos evitar la utilización de otros métodos, que finalmente se podrían haber evitado.

Para quienes están con la idea en la cabeza (De pasarse a Rails), recuerden todo lo que hablamos aqui, tener claro estos conceptos, trabajar con ellos es vital porque muy pronto Rails estará pasando a la version 2.0 del Framework y vendrá con nuevas convenciones y tratarán que cada vez seas mas DRY en tus trabajos, si te pierdes será complicado que te subas… Que esperas?

The DEMO!
Atentos! Para mostrarles estos en la practica lo haré con un screencast, me consigo los programas necesarios y lo publico. Será mas facil y hablare de Rutas, como empezar rápidamente a trabajar con REST y un pequeño ejemplo de trabajar con rutas anidadas.

Recursos
Presentación de DHH en la conferencia Rails 2006, World of resources.
Tutorial REST traducido por Juan Lupión

Algo que discutir?

Comments (2)

GoDaddy: Ahorra con PROMO CODES

godaddy.jpg

A menudo compro dominios para mi o para clientes, ayer compre 3 dominios y hice lo que a menudo hago, cada vez que compro algo en Internet. No siempre resulta, pero te toma 3 minutos revisar google y averiguar promo codes para tus productos, en este caso dominios.

En este caso solo puse GoDaddy Promo Codes en Google y me aparecieron muchísimos promo codes, entre ellos

  • OYH3 - $2 off / $6.95 any .COM (renewals too… just used it)
  • OYH2 - $5 off a $30 purchase
  • OYH1 - 10% off whatever

Como compre 3 dominios use el primero y me ahorra US$6, mmm una película, un café en starbucks, un viaje a viña en auto (70km/h) , etc. En pequeñas cosas buscando se pueden ahorrar unos pesos.


¿Tu tienes algún ahorro hormiga?

Comments (0)

La filosofia CRUD

Antes de comenzar este articulo solo contarles que asi es Rails, es un framework que necesita que quienes quieran aprenderlo, esten preparados para aprender mucho (Bueno claro, como cualquier otro framework o lenguaje), pero este siempre (o mas bien su comunidad) te va a llevar por las buenas practicas.

CRUD

Y en el séptimo día finalmente descansamos

La importancia de entender CRUD y REST es porque en la versión 2.0 de Ruby on Rails, una de sus mejoras es que REST se convertirá en parte del core y todas sus convenciones serán parte del framework. Es por esto que debemos entenderlo, aplicarlo, probarlo y empezar a disfrutar de esta forma de desarrollo. Para los desarrolladores de software expertos, académicos, entre otros, este tipo de practicas pueden ser detalles, pero para quienes no tenemos una formación rigida en desarrollo de software (Años de estudios universitarios), debemos ir comprendiendo por nosotros.

CRUD es un termino bastante desconocido especialmente para quienes no les es tan familiar trabajar con bases de datos para (nosotros) los simples mortales es un estándar para:


Crear (CREATE)
Leer (READ)
Actualizar (UPDATE)
Eliminar (DELETE)

Si de dan cuenta son básicamente las 4 operaciones que se hacen en una base de datos, todo lo demás son mezclas de las anteriores. CRUD es una forma de pensar, es una arquitectura “mental” que te permite ocupar tu mente para cosas que agreguen valor a tus creaciones y no pensar nuevamente lo que ya ha sido pensado. Esa es la base de Rails y parte de la primicia que todo desarrollo, tiene solo un 20% de creación propia y el resto todo ya lo ha echo alguien, para que hacerlo, si alguien ya lo hizo?

CRUD libera tu menta para esto, y en RAILS tiene 7 metodos que TIENES que recordarlos y utilizarlos, porque en REST no existen otros. A continuación, te mostrare lo que serán tus verbos de ahora en adelante, todo lo que hagas deberás conjugarlo con esto.


def list (Muestra todos los itemes de un modelo)
def show (Muestra un item en especifico)
def new (Muestra un formulario para crear un nuevo registro)
def create (Crea el nuevo registro)
def edit (Formulario para editar un registro)
def update (Actualiza el nuevo registro)
def destroy (Elimina un registro)

Si se dan cuenta aparecen 3 nuevos métodos (show, new y edit) que no actúan directamente con la base de datos pero son los responsables de mostrar el html necesario para mostrar itemes específicos, crear nuevo registro o editarlo. De aqui en adelante tendrás que vivir con estos métodos, hacerlo parte de tu lenguaje y hacerte amigos de ellos.

Finalmente tienes que hacerlos coincidir con tus controladores y modelos, dejarlos lo mas limpios y para esto considerar siempre que todas las acciones de un método deben estar en el mismo nivel de abstracción, que quiero decir con esto: Que mantengas tus controladores limpios y si necesitar hacer acciones contra la base de datos, hacelos en el modelo y no en el controlador.

Comments (0)