Rorra's blog Senior Developer

enero 30, 2012

Updating sitemap_generator to upload your files to s3 with aws-s3 and aws-sdk

Filed under: Ruby — admin @ 4:35 AM

Recently I had to do a job where I was suppose to either find a gem that was able to generate sitemaps in rails 3 and upload it to S3, or update the current behavior of the gem sitemap_generator (which is a great gem), so I ended updated the behavior of the gem.

The gem already supports uploads to S3, but the problem is that it ask you to install carrierwave, and if you are already using paperclip, aws-s3 and aws-sdk, that’s a problem, so what I did was to enhance the rake tasks of the gem in order to add behavior for the S3 upload and notification to the different search engines as well.

You can check my code in this here: https://gist.github.com/1693860

Something important is to add this line of code to your file config/sitemap.rb

<pre name=”code” class=”ruby”>
SitemapGenerator::Sitemap.public_path = File.join(Rails.root, “public”, “system”, “sitemaps”).to_s
</pre>

And here’s the code

<pre name=”code”>
require ‘aws’

class Rake::Task
  def replace &block
    @actions.clear
    prerequisites.clear
    enhance &block
  end
end
namespace ‘sitemap’ do
  desc ‘Upload the sitemap files to S3 (using your configuration in config/s3.yml)’
  task :upload_to_s3 => :environment do
    if File.exist?(File.join(Rails.root, “config”, “s3.yml”))
      # Load credentials
      s3_options = YAML.load_file(File.join(Rails.root, “config”, “s3.yml”))[Rails.env].symbolize_keys
      bucket_name = s3_options[:bucket]
      s3_options.delete(:bucket)
      # Establish S3 connection
      AWS.config(s3_options)
      Dir.entries(File.join(Rails.root, “public”, “system”, “sitemaps”)).each do |file_name|
        next if ['.', '..'].include? file_name
        path = “sitemaps/#{file_name}”
        file = File.join(Rails.root, “public”, “system”, “sitemaps”, file_name)
        begin
          s3 = AWS::S3.new
          bucket = s3.buckets.create(bucket_name)
          object = bucket.objects[path]
          object.write(:file => file)
        rescue Exception => e
          raise
        end
        puts “Saved #{file_name} to S3″
      end
    end
  end
end
Rake::Task["sitemap:create"].enhance do
  Rake::Task["sitemap:upload_to_s3"].invoke
end
Rake::Task[:'sitemap:refresh'].replace do
  if File.exist?(File.join(Rails.root, “config”, “s3.yml”))
    s3_options = YAML.load_file(File.join(Rails.root, “config”, “s3.yml”))[Rails.env].symbolize_keys
    bucket_name = s3_options[:bucket]
    SitemapGenerator::Sitemap.ping_search_engines(:sitemap_index_url => “https://#{bucket_name}.s3.amazonaws.com/sitemaps/sitemap_index.xml.gz”)
  else
    SitemapGenerator::Sitemap.ping_search_engines
  end
end
</pre>

mayo 9, 2011

Tickets de ruby on rails migrados de lighthouse a github

Filed under: Ruby — admin @ 2:22 AM


Hasta hace unos días, los tickets creados para ruby on rails debían reportarse en lighthouse <https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/overview>.





Pero ahora, los tickets fueron migrados a github y si querés reportar nuevos tickets, deberías de hacerlo en github <https://github.com/rails/rails/issues>.


septiembre 21, 2010

Ruby on Rails 2.3.x video tutorial

Filed under: Ruby — admin @ 11:02 AM

En la reunión que se hizo de pcmasmas.com, fui el encargado de dar una introducción avanzada a rails 3.2.x con haml, sass, authlogic, friendly_id y activescaffold.

Prepare unos cuantos videos para dar esta charla y así introducir a unos cuantos desarrolladores al desarrollo de aplicaciones web con ruby on rails.

Pueden encontrar esos videos en los siguientes links:

Video 1 of 10: Creando la aplicación con rails
Video 2 of 10: Configurando rails con github
Video 3 of 10: Creando el layout con haml and sass
Video 4 of 10: Implementando autentificación con authlogic
Video 5 of 10: Creando los modelos categorías y productos
Video 6 of 10: Creando el administrador con activescaffold
Video 7 of 10: Navegando categorías y productos, parte 1 de 2
Video 8 of 10: Navegando categorías y productos, parte 2 de 2
Video 9 of 10: Mejorando la navegación con friendly_id
Video 10 of 10: Retocando el administrador con activescaffold, implementando friendly_id en el administrador.

agosto 30, 2010

Rails 3 released, bundler 1.0 released!!!!

Filed under: Ruby — admin @ 10:44 AM

Rails 3.0 ha estado bajo desarrollo por dos años, así que es con un inmenso placer que podemos declarar que finalmente esta aquí. Hemos traído el trabajo recopilado de más de 1600 contribuidores para hacer todo mejor, más rápido, limpio y más hermoso.

David Heinemeier Hansson

En este momento, si ejecutan gem install rails, van a ver que instala la versión 3 :) Por que? Porque es estable! (O debería de serlo (A)).

Donde empiezo?

Deberías de empezar revisando “rails 3 screencasts” que podes encontrar en el sitio de rails. Es una gran introducción para ver que cosas nuevas trae rails 3. Y como siempre, se puede encontrar una buena cantidad de material en railscasts acerca de rails 3, como migrar a rails 3, etc.

Podes encontrar también todas las cosas nuevas que trae rails 3 en el sitio oficial, pero para resumir las mas importantes, en rails 3 vas a encontrar:

  1. Nuevo query engine para Active Record
  2. Nuevo ruteo para el Action Controller
  3. Nueva api para mails (Action Mailer)
  4. Manejo de dependencias con Bundler
  5. Protección XSS por defecto
  6. Encoding soportado por ruby 1.9
  7. Active Model: Validaciones, callbacks, etc. para todos los modelos, así se pueden usar otros ORM de manera muy fácil y transparente
  8. API oficial para plugins (railties)
  9. Reescritura del core de rails
  10. Agnosticismo con jQuery, rSpec y Data Mapper
  11. Documentación

julio 30, 2010

Rails 3, mysql y UTF-8

Filed under: Ruby — admin @ 3:01 PM


Empezaron a trabajar con rails 3? Se dieron cuenta que las bases de datos con encoding UTF-8 no funcionan tan bien como esperan? Esto es porque la gema “mysql” trabaja con ASCII-8BIT encoding, pero ruby 1.9 y rails 3 trabajan con UTF-8, así que cuando crean un modelo se graba en la base de datos, pero cuando recuperan esos modelos de la base de datos, no muestra la información que uds. originalmente grabaron.
Cual es la solución? Bueno, hay 3, la más recomendada, usar la gema “mysql2″, para esto, editen el archivo Gemfile para incluirla:

gem "mysql2"

Y luego editen databases.yml y cambien el adaptador a mysql2

development:
  adapter: mysql2
  database: fun_development
  user: root
  password:
  encoding: utf8

Otra solución, es simplemente en vez de usar la gema “mysql” usen la gema “ruby-mysql”, pero es muy lenta porque es una gema 100% ruby.

gem "ruby-mysql"

La última solución, es un monkey patch para seguir utilizando la gema mysql, pero también es lenta, así que de nuevo, recomiendo usar la gema mysql 2.

require 'mysql'

class Mysql::Result
  def encode(value, encoding = "utf-8")
    String === value ? value.force_encoding(encoding) : value
  end

  def each_utf8(&block)
    each_orig do |row|
      yield row.map {|col| encode(col) }
    end
  end
  alias each_orig each
  alias each each_utf8

  def each_hash_utf8(&block)
    each_hash_orig do |row|
      row.each {|k, v| row[k] = encode(v) }
      yield(row)
    end
  end
  alias each_hash_orig each_hash
  alias each_hash each_hash_utf8
end

julio 29, 2010

Contribuir al fuente de rails es algo más fácil de lo que piensan

Filed under: Ruby — admin @ 1:59 PM




Mi primera contribución a rails ya esta hecha :)


Si leen mis posts anteriores, van a encontrar como instalar y trabajar con rails edge, ahora voy a explicar como configurar un buen environment de rails para vivir en rails edge y ayudar a la comunidad de rails revisando los problemas en lighthouseapp.com verificando si realmente son bugs o no, creando fixes para los bugs, o porque no, creando una nuevo feature para el framework.


Suponiendo que ya instalaron la ultima versión de rails (en este momento rails 3 rc), necesitan obtener el código fuente actualizado de rails desde github, y hacer que su proyecto de rails con el que van a trabajar use esa versión, así pueden modificarla para crear fixes, testear bugs, etc.

git checkout http://github.com/rails/rails.git



Creamos la aplicación para hacer test/development

rails new my_app



Editamos el archivo Gemfile de my_app (my_app/Gemfile) para usar el código fuente de rails con el que van a trabajar, pasando a “rails gem” el parámetro :path donde esta el código de rails instalado

gem 'rails', :path => File.expand_path('../../rails',  __FILE__)



Y con eso terminamos, ahora pueden seguir esta guía para ver como trabajar con git y así poder crear posts válidos de los patches en los que trabajen.patches.

julio 27, 2010

Rails 3.0 RC Liberado!!!!

Filed under: Ruby — admin @ 12:00 PM

Finalmente, rails 3.0 RC fue liberado, lo cuál es una excelente noticia porque rails 3.0 trae un monton de updates muy copados, y va a ser más divertido que antes desarrollar en rails 3.0. Me pregunto la cantidad de trabajo que vamos a tener ahora migrando las aplicaciones de rails 2.3.x a rails 3.x.
Rails 3.0 RC fue liberado justo 21 horas después de que bundler 1.0.0.RC.1 fue liberado, realmente una coincidencia como dicen en el blog de rails? Mmmhhh.. Lo loco fue que hasta ayer a la noche, por unos cambios de último momento, bundler 1.0.0.beta.10 me tiraba errores, y ahora por arte de magia ya no tengo errores :)
Como empezar a jugar con rails 3.0.RC? Muy sencillo, primero, instalamos rvm, después de eso, vamos a instalar ruby 1.9.2 RC 2

rvm install 1.9.2

Ahora vamos a empezar a utilizar ruby 1.9.2

rvm 1.9.2

Seguimos con la instalación de bundler, y no vamos a utilizar sudo en ningún momento, porque estamos usando rvm

gem install bundler -v 1.0.0.rc.1

Ahora vamos a instalar rails rc 1

gem install rails --pre

Ya podemos empezar a jugar con rails 3.0

rails app my_app_name
cd my_app_name
bundle install

Finalmente, en lugar de congelar nuestra aplicación con rails 3.0.RC 1, vamos a trabajar con la ultima versión de rails que esta siendo desarrollada (porque vamos a encontrar bugs en la release candidate), editamos el archivo Gemfile y hacemos estas modificaciones:

#gem 'rails', '3.0.0.rc'

# Bundle edge Rails instead:
gem 'rails', :git => 'git://github.com/rails/rails.git'

Actualizamos la aplicación con la última versión de rails

bundle install

Y terminamos :)
Pueden reportar todos los bugs que encuentren en https://rails.lighthouseapp.com/projects/8994-ruby-on-rails, y también revisar los bugs que ya estan reportados, reproducirlos y confirmar si realmente es un bug o no, y no se olviden, al mismo tiempo están testeando bundler 1.0.0.RC.1, así que si encuentran problemas con bundler, pueden reportarlos en http://github.com/carlhuda/bundler/issues.
Esta es su oportunidad para devolverle a la comunidad de rails algo de lo que la comunidad les da a ustedes todos los días!!!.

julio 24, 2010

Instalando RubyDebug con ruby 1.9.2 y rails 3 para RubyMine

Filed under: Ruby — admin @ 5:26 PM


Si están tratando de instalar ruby-debug para debugear sus aplicaciones en rails (o por ahí ruby-debug-ide para RubyMine) y están teniendo problemas, porque tienen instalado en el sistema ruby 1.8.7, y están usando rvm para poder testear rails edge con ruby 1.9.2

Lo primero a notar es que todos los sources que instalaron con rvm estan en $rvm_path/src, así que en caso de que estén usando ruby 1.9.2 rc2 como estoy haciendo yo en este momento, la instalación es muy sencilla.

gem install ruby-debug-ide19 -- --with-ruby-include=$rvm_path/src/ruby-1.9.2-rc2/

Pero si están usando ruby 1.9.1 o cualquier otra versión, pueden fácilmente hacer un ls $rvm_path/src para encontrar la ubicación exacta para compilar ruby-debug-ide19 para su instalación de rvm.

Ahora pueden agregar la gem al archivo Gemfile si están planeando debugear desde la consola

gem 'ruby-debug19', :require => 'ruby-debug', :group => :development

Y luego correr

rails s --debug

O si están usando rubymine, el debug va a empezar, aunque todavía no esta soportado al 100% para ruby 1.9.x, con un poco de suerte lo arreglan antes de liberar la versión 2.3.5, porque creo que nadie quiere usar rails 3 sin ruby 1.9.2 o superior, o al menos, yo no quiero :P

enero 10, 2010

Integrando radiant 0.9, globalize y GeoIP

Filed under: Ruby — admin @ 6:28 AM


Después de bajar y usar radiant 0.9 con globalize, me di cuenta que además quería que los usuarios sean dirigidos por default al sitio del lenguaje correspondiente, checkeando el IP para saber desde adonde estaban navegando. Y obvio, necesitaba GeoIP.
Instale GeoIP y después me quedaba hacer algunas modificaciones al plugin globalize para lograr mi acometido.
Primero edite config/environment.rb y agregue la linea para cargar GeoIP con la aplicación

config.gem 'geoip'

Luego, modifique el archivo vendor/extensions/globalize2/lib/globalize2/application_controller_extensions.rb

module Globalize2
  module ApplicationControllerExtensions
    def self.included(base)
      base.send(:include, InstanceMethods)
      base.class_eval do
        before_filter :set_locale
      end
    end

    module InstanceMethods
      def set_locale
        @locale = params[:locale] || session[:locale] || cookies[:locale] ||
                Globalize2Extension.ip_lookup(request.remote_ip) 

        session[:locale] = @locale
        cookies[:locale] = @locale
        I18n.locale = @locale
      end

      def reset_locale
        unless I18n.locale == Globalize2Extension.default_language
          locale = Globalize2Extension.default_language
          session[:locale] = locale
          I18n.locale = locale
          flash.now[:notice] = "The locale has been changed to default."
        end
      end
    end
  end
end



Como pueden ver en el código, también checkeo si el usuario selecciono algún lenguaje alguna vez en la cookie, y cuando el usuario selecciona (u obtiene un lenguaje por su geo localización), seteo la cookie, así la próxima vez que vuelva al sitio, va a ver el sitio con el último lenguaje seleccionado.
Finalmente, modifique el archivo vendor/extensions/globalize2/globalize2_extension.rb y agregue el siguiente método, donde obtengo el código del país del usuario, y después seteo el locale correspondiente a mi sitio en base a su IP, o el lenguaje por defecto.

  def ip_lookup(ip)
    g = GeoIP.new( File.join(File.dirname(__FILE__), '..', '..', 'gems', 'geoip-0.8.6', 'GeoIP.dat'))
    r = g.country(ip)
    country_code = r[3]
    case country_code
      when 'DE'
        'de'
      when 'GB'
        'uk'
      when 'AU'
        'au'
      when 'FR'
        'fr'
      when ' US'
        'us'
      else
        'us'
    end
  end

Y finalmente, tenemos que decirle a Radiant que cargue la librería GeoIP, así que en el mismo archivo agregamos

  extension_config do |config|
    config.gem 'geoip', :source => 'http://github.com'
  end



So that’s all, now you have GeoIP working with globalize and Radiant 0.9 :)

enero 9, 2010

Radiant y Globalize: Redirigiendo al usuario a su sitio con su lenguaje

Filed under: Ruby — admin @ 6:30 AM


Después de instalar Radiant 0.9 y Globalize, tenía que redirigir al usuario a su sitio con su lenguaje.
Si el usuario tenía asignado el locale en, al momento de visitar http://mysite.com, debería de ser redirigido a http://mysite.com/en
Todo este lío porque tenía un flash que funcionaba con archivos xml, entonces arme una estructura de ficheros y necesitaba que el usuario este parado en ese lugar, y no en la homepage, para que el flash funcione correctamente.
Estas son las modificaciones que hice al archivo vendor/extensions/globalize2/lib/globalize2/site_controller_extensions.rb, espero que les sirva

module Globalize2
  module SiteControllerExtensions
    def self.included(base)
      base.class_eval do
        alias_method_chain :find_page, :globalize

        alias_method :o riginal_show_page, :show_page
        alias_method :show_page, :check_homepage_redir

      end
    end

    def check_homepage_redir
      url = params[:url]
      if Array === url
        url = url.join('/')
      else
        url = url.to_s
      end

      if url == '/'
        locale = params[:locale] || cookies[:locale] || session[:locale] || Globalize2Extension.ip_lookup(request.remote_ip)
        redirect_to CGI.unescape('/' + locale + '/') and return
      end

      original_show_page
    end

    def find_page_with_globalize(url)
      globalized_url = '/' + I18n.locale + '/' + url
      find_page_without_globalize(globalized_url)
    end
  end
end
Older Posts »

Powered by WordPress