Instalar Git en Mac OS X Leopard

26 de Junio, 2008 — GitComentarios (1)

Mediante port la instalción resulta muy sencilla. Primero actualizamos port

sudo port selfupdate

y a continuación insalamos Git

sudo port install git-core

Una vez instalado podemos personalizarlo un poco

# Utilizar opendiff (FileMerge) para resolver los conflictos
git config --global merge.tool opendiff

# Ignorando archivos
git config --global core.excludesfile ~/.gitignore
touch "$HOME/.gitignore"
echo '.DS_Store' >> "$HOME/.gitignore"
echo '._*' >> "$HOME/.gitignore"
echo '.svn' >> "$HOME/.gitignore"
echo '.hg' >> "$HOME/.gitignore"

# Añadiendo alias
git config --global alias.st status
git config --global alias.ci commit
git config --global alias.co checkout
git config --global alias.br branch

# Un poco de color
git config --global color.ui auto

Saber si un objeto está incluido en un array

18 de Junio, 2008 — RubyComentarios (2)

A veces es necesario saber si un objeto está incluido en un array. Supongamos que tenemos el id de un usuario y queremos saber si está incluido en un array donde tenemos los id’s de los usuarios que viven en la ciudad de Barcelona. Ruby nos proporciona una manera fácil de realizar esto:

barceloneses = User.find(:all, :conditions => "city = 'Barcelona'")
user = User.find_by_name('Emili')
if barceloneses.include?(user.id)
....
end

El método include?(objeto) devuelve true o false en función de si el objeto se encuentra dentro del array.

Más información
www.ruby-doc.org/core/classes/Array.html

Crear usuario en Mysql y otorgarles permisos a través de la consola

12 de Junio, 2008 — MySQLComentarios (1)

Entrar en la consola de MySQL

mysql -u root -p

grant ALL on base_de_datos.* to usuario@localhost identified by ‘password’;

Más información

http://www.mysql-hispano.org/page.php?id=4&pag=5
http://www.webtaller.com/construccion/lenguajes/mysql/lecciones/gestion_usuarios_mysql.php

Recursos anidados (o no) en REST

25 de Mayo, 2008 — Ruby on RailsComentarios (0)

La filosofía REST permite relacionar los recursos entre ellos de manera que los podamos anidar para que únicamente tengan sentido en un contexto determinado. Supongamos que tenemos un blog multiusuario donde hay “users”, “posts” y “comments”. No tiene demasiado sentido acceder a un comentario directamente con una url del tipo /comments/34, ya que un comentario no tiene sentido sin un post, y lo mismo pasa con los posts. Lo ideal sería disponer de una url para acceder a los recursos con un formato como este:

/users/4/posts/34/comments/10

Lo que devolvería el comentario 10 que pertenece al post 34 que a su vez pertence al usuario 4. Una de las ventajas de anidar los recursos es que podemos hacer esto:

/users/30/posts

y nos devuelve todos los posts del usuario 30.

Como véis tiene mucho sentido anidar los recursos para relacionarlos entre ellos. Si queréis saber más sobre recursos anidados podéis consultar:

http://www.norellana.com/2007/07/28/recursos-anidados-en-rails/

http://www.jaimeiniesta.com/2007/12/22/tutorial-recursos-anidados-con-rest-y-rails-2/

Bien, el problema aparece cuando necesitamos tener un recurso que sea anidado en algunas ocasiones y que no lo sea en otras. Me explico. Supongamos una aplicación con empresas que publican ofertas de empleo. Las ofertas de empleo están anidadas a los usuarios ya que una oferta pertenece a una empresa. Así podremos acceder a las ofertas de la siguiente manera

/companies/34/jobs/889

¿Pero que pasa cuando queremos mostrar un listado de todas las ofertas? O lo que es lo mismo, hacer la petición

/jobs

Rails nos va a dar un error ya que necesita saber el id de la empresa para poder listar las ofertas de trabajo. Para poder crear un recurso anidado (o no) según nos convenga hay que hacer lo siguiente:

En el routes.rb crear las rutas

map.resources :companies do |company|
   company.resources :jobs
end

map.resources :jobs

Cambiamos el método index del controlador

def index
   @jobs = target.find(:all)
end

y añadimos los siguientes métodos

protected
def target
   @user ? @user.jobs : Job
end

def get_user
    return if params[:user_id].blank?
    @user = User.find(params[:user_id])
    rescue ActiveRecord::RecordNotFound
    redirect_to jobs_url
  end

def get_job
    @job = Job.find(:all)
end

De esta manera si se accede a una oferta de empleo se ejecutará el método get_user que devolverá el id del usuario para poder acceder al recurso anidado, si se está accediendo directamente al listado de ofertas de empleo, get_user hará un return y se ejecutará el código de get_job, de manera que obtendremos el listado de ofertas de empleo.

De esta manera podemos disponer de un recurso anidado cuando lo necesitemos, pero también accesible directamente para realizar ciertas funciones.

Otro ejemplo es éste que propuso Xavier Noria en la lista de Rails:

Hay que tener presente que las URLs que dan acceso a un mismo recurso
pueden ser multiples, por ejemplo

/releases/my-app-1.1.tar.gz

/releases/latest.tar.gz

Las URLs con caminos que indican jerarquía pueden indicar nesting (pertenencia), scope, y en general lo que tenga sentido en la aplicacion.

Pero supongamos ahora que estás en una central de reservas de hoteles. Para hacer una reserva puede quedar bien una URLS así:

POST /chains/sol-melia/hotel/54/bookings

Eso daría una reserva. En una aplicación web podrías ir al show de esa reserva despues. Si estuvieramos en un web service devolveríamos un 201 Created con una cabecera Location a la dirección de ese recurso nuevo. Esa dirección puede perfectamente ya no reflejar la jerarquia (aunque podría hacerlo y se pueden ofrecer ambos accesos):

GET /bookings/789123

Por ejemplo, cancelar una reserva es más fácil que se ofrezca como

DELETE /bookings/789123

a no ser que el cliente deba añadir la jerarquía que es redundante y puede que le suponga un GET previo. La reserva ya sabe a quien pertenece.

En una API así, BookingsController ha de estar preparado para servir peticiones con scope y sin scope. Si las consultas y las cancelaciones solo son accesibles con URLs directas entonces show y destroy no han
de lidiar con el scope opcional. Si index se publica con y sin scope entonces la acción debe entender ambas llamadas.

Cómo cargar determinadas fixtures en la base de datos

22 de Mayo, 2008 — Ruby on RailsComentarios (0)

En algunos casos nos puede venir bien cargar el contenido de determinadas fixtures de la base de datos, por ejemplo si subimos una aplicación a producción y queremos cargar usuarios, categorías etc. Ponemos los datos en la fixture correspondiente y ejecutamos

rake db:fixtures:load FIXTURES=users,categories

Si no especificamos la variable RAILS_ENV lo cargará en la base de datos del entorno en el que nos encontramos, si no debe ser así podemos ejecutar

rake db:fixtures:load FIXTURES=users RAILS_ENV=production

¡Organizamos la Euruko 2009!

14 de Mayo, 2008 — Eventos, RubyComentarios (0)

Hoy se ha hecho oficial que el próximo año se celebrará la European Ruby Conference (Euruko) en Barcelona. Todo empezó cuando algunos de los asistentes españoles a la última edición (celebrada en Praga) comentaron la posibilidad de organizar el evento en la siguiente edición, y después de dos meses de conversaciones hemos presentado la candidatura para Barcelona y nos la han concedido.

Nos esperan unos cuantos meses de trabajo para dejar el pabellón alto y que todo vaya como una seda ese fin de semana, pero seguro que valdrá la pena.

Más información:
Euruko 2008 (Praga)
Euruko 2009 (Barcelona)
Lista de la Euruko 2009 (próximamente en inglés)
Spanish Ruby User Group

Seguridad en aplicaciones Rails

9 de Mayo, 2008 — Ruby on Rails, SeguridadComentarios (1)

Os dejó algunos enlaces interesantes sobre seguridad en aplicaciones Ruby on Rails

www.rorsecurity.info/ruby-on-rails-security-cheatsheet/

www.rorsecurity.info/

wiki.rubyonrails.org/rails/pages/SecurityConcerns

Recortar imágenes con RMagick y attachment_fu

10 de Abril, 2008 — Ruby on RailsComentarios (1)

Attachment_fu no está preparado para realizar crop de imágenes, así que tendremos que hacerle una pequeña modificación para disponer de esta funcionalidad. Editamos el archivo rmagick_processor.rb, ubicado en el directorio processors, dentro de los archivos del plugin, y cambiamos el siguiente método:

# Performs the actual resizing operation for a thumbnail
def resize_image(img, size)
size = size.first if size.is_a?(Array) && size.length == 1 && !size.first.is_a?(Fixnum)
if size.is_a?(Fixnum) || (size.is_a?(Array) && size.first.is_a?(Fixnum))
size = [size, size] if size.is_a?(Fixnum)
img.crop_resized!(*size)
else
img.change_geometry(size.to_s) { |cols, rows, image| image.crop_resized!(cols, rows) }
end
self.temp_path = write_to_temp_file(img.to_blob)
end

Ahora cuando configuremos los atributos de la imágen en el modelo correspodiente, podemos hacer esto:

has_attachment :content_type => :image,
:storage => :file_system,
:max_size => 500.kilobytes,
:resize_to => '400>',
:thumbnails => { :cropped => ‘50×50!’ }

Formateo de fechas en Ruby on Rails

18 de Marzo, 2008 — Ruby on RailsComentarios (2)

18-3-2008: Actualizado para Rails 2

Una manera fácil de dar el formato que más nos guste a las fechas es hacerlo una a una utilizando strftime:

<%= post.created_at.strftime("%d-%m-%Y") %>

Eso esta muy bien para formatear un par de fechas, pero para toda una aplicación hay que encontrar un método de hacerlo automáticamente. Para eso creamos un archivo en el directorio config/initializers/ que formaterá las fechas de nuestra aplicación, le podemos poner el nombre que más nos guste, yo siempre utilizo date_format.rb y añadimos:

ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS[:default]='%d-%m-%Y %H:%m'

Con esto convertiremos todas las fechas que aparezcan en las vistas al formato “03-11-2008 22:34″

Si necesitamos varios formatos de fecha podemos hacerlo de la siguiente manera:

ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!(
:default => >%d.%m.%Y',
:my_format_1 => '%d/%m/%Y - %H:%M',
:my_format_2 => '%l:%M %p, %B %d, %Y',
:my_format_3 => '%d/%m/%Y')

:default es la manera por defecto como se mostrarán las fechas. Las variables my_format_x indican diferentes maneras que utilizaremos para formatear las fechas. Una vez hecho esto, cuando queramos escribir una fecha, lo haremos de la siguiente manera: supongamos un modelo u objeto llamado “Evento”, que en la tabla tiene un campo que se llama “fecha” de tipo DATE, para ver la fecha correctamente escribiremos:

<%=h Evento.fecha.to_s(:my_format_3) %>

Si el campo es DATETIME podemos utilizar el formato 1

<%=h Evento.fecha.to_s(:my_format_1) %>

Si no especificamos nada, utilizará el formato definido en :default

Así­ de fácil!

Añadir servicios a init.d en Debian/Ubuntu

10 de Marzo, 2008 — LinuxComentarios (1)

Esta es una de esas cosas que no se me graban en la memoria, así que lo anoto aquí y a lo mejor le puede servir a alguien.

Cuando queremos añadir algun servicio a init.d para que se inicie cuando arranque la máquina y lo tengamos disponible como demonio, únicamente tenemos que colocar el script de inicio en el directorio /etc/init.d, darle permisos de ejecución y ejecutar:

sudo update-rc.d nombre_del_script defaults

Entradas siguientes »
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License. | Emili Parreño