Apuntes Rails

Apuntes de Ruby on Rails, programación en GNU/Linux y Mac

Backup de Rails usando Rake

TAGS: None

Para simplificar los backups de nuestras aplicaciones podemos usar rake. Para hacernos con el es recomendable consultar el siguiente artículo Ruby on Rails Rake Tutorial

Los scripts propios los creamos en la carpeta lib/task

Vamos a crear un conjunto de acciones (task) dentro de la categoría (namespace) rbackup.

Queremos que este script nos haga un backup de la base de datos y de algunas carpetas de public (por ejemplo la carpera upload) y que nos copie todo comprimido en un archivo accesible desde la web.

Lo primero que hacemos es crear el archivo lib/task/rbackup.rake y definir la categoria:

  1. namespace :rbackup do
  2.  
  3. end

Bien, ahora vamos a definir las acciones que vamos a necesitar

  1. namespace :rbackup do
  2. desc "Crea los directorios tmp/backup y public/backup"
  3. task :crea_dir do
  4. end
  5.  
  6. desc "Copia de seguridad de la base de datos en la carpeta tmp/backup"
  7. task :base_datos => :crea_dir do
  8. end
  9.  
  10. desc "Crea una copia de seguridad de las carpetas indicadas"
  11. task :carpetas => :crea_dir do
  12. end
  13.  
  14. desc "Crea una copia de la BD y de las carpetas y las comprime en pubic/backup "
  15. task :all => [:base_datos, :carpetas]do
  16. end
  17. end

Ejecutando rake –task y nos da información de losa task disponibles
Para ejecutar estas acciones podemos poner rake rbackup:base_datos o rake rbackup:all

Vamos a crear los task….

Este nos creará los directorios si no existen

  1. task :crea_dir do
  2. unless File.exist?("#{RAILS_ROOT}/public/backup")
  3. puts "Creando directorio public/backup"
  4. sh "mkdir #{RAILS_ROOT}/public/backup/"
  5. end
  6. unless File.exist?("#{RAILS_ROOT}/tmp/backup")
  7. puts "Creando directorio tmp/backup"
  8. sh "mkdir #{RAILS_ROOT}/tmp/backup/"
  9. end
  10. end

Para hacer el backup de la base de datos extraemos los datos del archivo database.yml para poder usarlos con el comando mysqldump

Como usamos YAML es necesario poner al principio del archivo require ‘yaml’

  1. task :base_datos => :crea_dir do
  2. @conf = YAML::load(File.open("#{RAILS_ROOT}/config/database.yml"))
  3. @db = @conf[‘development’]
  4. # Hacemos una copia de la base de datos en el directorio temporal
  5. puts "******  Creando copia de seguridad de #{@db['database']}…  ******"
  6. sh "mysqldump –opt –user=#{@db['username']} –password=#{@db['password']} #{@db['database']} -h #{@db['host']} > tmp/backup/#{@db['database']}.sql"
  7. end

con => :crea_dir le indicamos que tiene que ejecutar antes el task crea_dir

Nota: si no ponemos -h #{@db['host']} puede salirnos el error mysqldump error 2002

Ahora comprimimos las carpetas usando tar.

  1. desc "Crea una copia de seguridad de las carpetas indicadas"
  2. task :carpetas => :crea_dir do
  3. @carpetas = %w(images uploads)
  4. for carpeta in @carpetas
  5. puts "****** Creando copia de #{carpeta}… ******"
  6. system("tar cvzf ‘#{RAILS_ROOT}/tmp/backup/#{carpeta}.tar.gz’ ‘#{RAILS_ROOT}/public/#{carpeta}’")
  7. #  unless  system(comando)
  8. #    flash[:error] = comando
  9. #  end
  10. end
  11. end

En la variable @carpetas ponemos las carpetas de pubic de las que queremos hacer el backup

Por ultimo hacemos un task que nos ejecute todas las acciones:

  1. task :all => [:base_datos, :carpetas]do
  2. puts "******  Comprimiendo y publicando….  ******"
  3. system("tar cvzf  ’#{RAILS_ROOT}/public/backup/#{@db['database']}#{Date.today}.tar.gz’ ‘#{RAILS_ROOT}/tmp/backup’")
  4. puts "******  #{@db['database']}#{Date.today}.tar.gz creado  ******"
  5. puts "******  Borrando datos de tmp/backup…  ******"
  6. system("rm -f #{RAILS_ROOT}/tmp/backup/*")
  7. end

Ya tenemos nuestro script rake terminado. Ahora podemos crear un controlador para tener acceso a los archivos generados y poder borrarlos una vez descargados.

Creamos un controlador rbackup_controller.rb y ponemos:

  1. class RbackupController < ApplicationController
  2.  
  3. def index
  4. @dir = Dir.new("#{RAILS_ROOT}/public/backup")
  5. @archivos = Array.new
  6. @dir.each do |x|
  7. if x[0] != 46
  8. @archivos =   @archivos + ["#{x}"]
  9. end
  10. end
  11.  
  12. end
  13.  
  14. def borrar
  15. comando = "rm -f #{RAILS_ROOT}/public/backup/#{params[:archivo]}"
  16. unless  system(comando)
  17. flash[:error] = comando
  18. end
  19. redirect_to :action => ‘index’
  20. end
  21. end

Ahora solo queda poner en la vista del controlador:

Listado de Archivos generados<br><br>

<% for archivo in @archivos %>

<%=link_to archivo, “backup/#{archivo}”%> - <%=number_to_human_size File.size(”#{RAILS_ROOT}/public/backup/#{archivo}”)%> - <%=link_to “borrar” , {:controller=>:rbackup,:action=>:borrar,:archivo=>archivo}, :confirm =>”Desea borrarlo?”%><br>

<% end %>
y tenemos un sistema de backups básico.

Rmagick en Ubuntu 8.04

TAGS: None

Pasos que he tenido que dar para instalar Rmagick en mi nueva Ubuntu 8.04

Siguiendo los pasos de este post me daba error al instalar la gema. La solución la he encontrado  aquí.

Resumiendo:

  1. apt-get install imagemagick
  2. apt-get install libmagick9-dev
  3. apt-get install ruby1.8-dev
  4. gem install rmagick

Scaffold con Rails 2.0

TAGS: None

He leído aquí un artículo muy ilustrativo de la nueva forma de trabajar con scaffold en Rails 2.0. El resumen es el siguiente:

  • Installed Rails
    #gem install rails –include-dependencies
  • Created an aplication with the rails command
    $rails exchange
  • Created the databases for the application with the rake command
    $ rake db:create:all
  • Used the script/generate command to create the scaffolding for the application
    $ ruby script/generate scaffold Movie title:string description:text one_sheet_url:string
  • Created the database table using the generated migration file
    $ rake db:migrate
  • Started the webserver with the script/server command
    $ ruby script/server
  • Pointed our web browser to the application and started entering and editing data
    http://localhost:3000/movies


Limpiando copia local de Subversion con Rsync

TAGS: None

Si tienes una copia de un repositorio Subversion y quieres limpiar los directorios .svn es tan facil como:

rsync -rC original copia_limpia

Creando Diagramas de nuestros proyectos

TAGS: None

Bien, un paso mas en la gestión de proyectos con Rails es la creación de diagramas antes y durante el proyecto. Lo ideal es crear un modelo UML (cosa que por desgracia casi nunca hago) antes de empezar a picar código. Para ello he encontrado algunas herramientas (para Mac)que nos pueden ayudar.

TaskSketch: Utilidad muy sencilla e intuitiva. Aunque no es muy potente es muy útil para hacer diagramas que especifiquen las distintas tareas que realizará la aplicación y los diagramas de flujo.

RailRoad: Es un script Ruby que analiza nuestra aplicación Rails y crea un diagrama de clases. La verdad que es bastante sorprendente los diagramas que puede llegar a crear.

Para instalarlo solo tenemos que hacer: gem install railroad

Ahora ejecutamos este comando en la carpeta de nuestro proyecto: railroad -a -i -o modelos_completo.dot -M

Omnigraffle: La utilidad de creación de diagramas mas potente que he encontrado. Puedes importar los archivos DOT generados por RailRoad, el problema, no es gratuito.

Por ultimo comentar que con VbVisualizer tambien se pueden generar diagramas de la base de datos.

Espero poner mas adelante un post de mis experiencias con estas herramientas, UML y Rails

Relacionar tablas en las Migrations ( Foreign Key Migrations )

TAGS: None

Cuando creamos las tablas desde las migrations y queremos relacionar una tabla con otra mediante una clave esterna, tenemos que crear “a mano” esas llaves.

Gracias al plugin Foreign Key Migration de RedHill esto nos lo hace de forma automática la ejecutar db:migration. Teneis la documentación del plugin aquí.

Solo tenemos que instalar el plugin

ruby script/plugin install http://www.redhillonrails.org/svn/branches/stable-1.2/vendor/plugins/foreign_key_migrations

Y también el RedHill on Rails Core

ruby script/plugin install http://www.redhillonrails.org/svn/branches/stable-1.2/vendor/plugins/redhillonrails_core
Nota: Si falla comprueba que todas las tablas a las que haces referencia en las definiciones de la migración han sido creadas anteriormente.

A la hora de ver si todo ha funcionado correctamente podemos usar la aplicación DbVisualizer que nos crea unos bonitos gráficos con las tablas relacionadas.

Actualización: 

Si no quieres instalar un plugin puedes seguir los pasos de este post en el que explica como crear un Helper para las migrations. Creo que es mas sencillo y práctico de esta manera. :P

Mi nuevo Mac (Configurando para trabajar)

TAGS: None

Ahora voy a ir poniendo algunas de las cosas que estoy haciendo para poder programar con mi Mac.

FINK

Lo primero es instalar FINK. Es algo parecido al apt de Debian. Nos bajamos un paquete y lo instalamos.

A partir de ahora desde un terminal pondremos hacer lo siguiente:

fink list svn o fink install svn-client

Para actualizar los paquetes ponemos :

fink selfupdate

Fink nos ayudará a instalar programas mas adelante.

TEXTMATE

El próximo paso es instalar un editor de textos potente.

TEXTMATE es el mejor editor que podemos instalar. (Recursos: Textmate en castellano, mini manual).

MYSQL

Ahora nos ponemos con la base de datos MySQL. Instalamos Mysql usando fink.

fink install mysql

Otra opción es descargarnos el paquete de MySQL desde su web (incluye un plugin para las preferencias del sistema) y las utilidades de administración.

Unos buenos administradores para la base de datos totalmente gratuitos son: DbVisualizer y CocoaMySQL
Ruby on Rails

Ya solo nos falta poder trabajar con Rails. Si queremos empezar de forma rápida (que es el caso) podemos descargarnos Locomotive, el entorno Rails con solo instalar una aplicación. Para usar RMagick disponemos de un bundle que se copia en la carpeta correspondiente.

Otra opción es instalar las rubygems y descargar rails poniedo:

gem install rails --include-dependencies

APACHE + PHP
Si queremos usar apache con php lo instalaremos usando fink. :P fink install apacher2

después configuramos el archivo /etc/httpd/httpd.conf como nos indican aquí.
Para iniciar apache basta con poner en el terminal -> apachectl star

Ya tenemos apache con php ahora a bajarse phpmyadmin

Por defecto el directorio de apache es /Library/WebServer/Documents

Mi nuevo Mac (Aplicaciones básicas)

TAGS: None

Ya tengo por fin el mac en casa. Voy a poner una lista de aplicaciones que te ayudarán a trabajar con tu Mac.
LibreríasX11 -> Son necesarias para algunas aplicaciones. Las puedes instalar desde el DVD de instalación del sistema

Firefox -> Lo primero, un buen navegador para bajarme le resto de cosillas

Adium -> Cliente de mensajería

ITerm -> Terminal muy potente para Mac (Esencial para programar)

QuickSilver -> Lanzador de aplicaciones y buscador de TODO en el mac (Esencial)

Growl -> Notificador de eventos en el Mac

Onyx -> Optimizador el sistema

Stuffit Expander -> Compresor / Descompresor

VLC -> Visor de video

Gimp -> Programa de retoque fotográfico (Necesario tener las X11 instaladas)

OpenOffice.org -> Suite ofimática (Necesario tener las X11 instaladas)

También son muy útiles los siguientes Widgets:

DoBedo -> Para gestionar la lista de tareas pendientes (ToDo) de iCal

IStatPro -> Monitor del sistema

Amazon Album Art -> Para ponerle las carátulas a tus discos en iTunes.

Album Art -> Otra alternativa al widget anterior

A parte os pongo algunas web interesantes sobre mac:

Applesfera, faq-maq, Top 10 app, coolosxapp, sof. libre para mac,

Nokia 6288 iSync 2.4 MacOs X 10.4.9

TAGS: None

Al parecer el modelo de Nokia 6288 no está soportado por la versión 2.4 de iSync, algo extraño ya que el modelo 6280 si está soportado y es prácticamente igual. Buscando por los foros de la web de Nokia encontré esta entrada que paso a resumir.

Consiste en duplicar la configuración del Nokia 6280 del iSync cambiándole solo el nombre por Nokia 6288. Es muy muy sencillo.

Solo tenemos que editar el siguiente archivo:

:/Applications/iSync.app/Contents/PlugIns/ApplePhoneConduit.syncdevice/Contents/PlugIns/PhoneModelsSync.phoneplugin/Contents/Resources/ MetaClasses.plist

Por último duplicamos la imagen NOK6280.tiff y le ponemos el nombre NOK6288.tiff o bien os bajáis la siguiente imagen

Insertar datos en la BD usando las migrations de Rails

TAGS: None

A veces cuando creamos una tabla a través de las migrations de Rails es necesario meterle algunas filas por defecto. Este es un ejemplo de como hacerlo.

Creamos una migración usando

./script/generate migration datos_personas

Esto nos creará un archivo en db/migrate que es el que tenemos que modificar. Por ejemplo

008_datos_personas.rb

class DatosPersonas < ActiveRecord::Migration
def self.up
end

def self.down
end
end

Para poder insertar los campos en la tabla personas debemos definir el modelo que controla la tabla dentro de la migracion

class DatosPersonas < ActiveRecord::Migration

class Personas < ActiveRecord::Base
end

def self.up

create_table :personas do |tabla|

tabla.column :nombre, :string
tabla.column :apellidos, :string
tabla.column :edad, :integer

end

Personas.new( :nombre => “Pedro”, :apellidos => “Marin”, :edad=29).save

end

def self.down

drop_table :personas

end
end

Es así de fácil. Los datos que podemos usar son:

:integer
:float
:datetime
:date
:timestamp
:time
:text
:string
:binary
:boolean

Y las acciones que podemos ejecutar:
create_table(name, options)
drop_table(name)
rename_table(old_name, new_name)
add_column(table_name, column_name, type, options)
rename_column(table_name, column_name, new_column_name)
change_column(table_name, column_name, type, options)
remove_column(table_name, column_name)
add_index(table_name, column_name, index_type)
remove_index(table_name, column_name)

© 2009 Apuntes Rails. All Rights Reserved.

This blog is powered by Wordpress and the Magatheme Wordpress Theme by Mid MO SEO.