Archivo de la categoría: Ruby

Geocodificación en Ruby con Geocoder

  

La geolocalización y la geocodificación hoy cumplen un papel fundamental en la composición de nuestras aplicaciones. Determinar el pais, la ciudad, el lenguaje, etc sin duda que agregar un gran valor a la hora de personalizar aplicaciones para nuestros visitantes.

Comencemos!

Para esta entrada utilizaré:
– Fedora 16
– Ruby 1.8.7
– Rubygems 1.8.11
– Geocoder 1.1.0
– json_pure 1.6.4

La versión de Ruby 1.8.7 y Rubygems 1.8.11 es la trae por defecto el repositorio de Fedora 16.

sudo yum install ruby rubygems

Ahora instalamos Geocoder y su dependencia json_pure

sudo gem install geocoder json_pure

Podemos forzar las versiones que desamos instalar de la siguiente forma

sudo gem install -v=1.1.0 geocoder

Ya está listo nuestro Ruby con sus gemas necesarias, Geocoder nos instala un script para realizar peticiones por terminal, este lo podemos utilizar de la siguiente forma

$ geocode "Quilicura, Santiago"

# Resultado:
# Latitude:         -33.3613271
# Longitude:        -70.7287415
# Full address:     Quilicura, Santiago Metropolitan Region, Chile
# City:             Quilicura
# State/province:   Santiago Metropolitan Region
# Postal code:      
# Country:          Chile
# Google map:       http://maps.google.com/maps?q=-33.3613271,-70.7287415

Ya funcionando podemos crear nuestros primero ejemplos, entonces creamos un archivo .rb

vim ej_geocoder1.rb

Con el siguiente contenido

# Importamos nuestras gemas, recuerden que en versiones de ruby 1.8 se debe importar siempre la gema 'rubygems'.
require 'rubygems'
require 'geocoder'

# Realizamos una busqueda, esto nos devolvera un lista de coincidencias y con [0] decimos que queremos la primera.
local = Geocoder.search("Quilicura, Santiago, Chile")[0]

# Imprimimos las coordenadas de la direccion buscada
puts local.coordinates

Ejecutamos

ruby ej_geocoder1.rb

Geocoder.search devuelve un objeto con lo siguientes atributos:
address
address_components
address_components_of_type(type)
city
coordinates
country
country_code
formatted_address
geometry
postal_code
state
state_code
types

Entonces siguiendo el ejemplo anterior podemos obtener el pais de nuestra busqueda de la siguiente forma

local.country

También con Geocoder podemos obtener la dirección de una ip o de unas coordenadas de la siguiente forma

vim ej_geocoder2.rb
# Importamos nuestras gemas necesarias
require 'rubygems'
require 'geocoder'

# Ingresamos la ip que queremos buscar y la primera coincidencia con el valor [0]
ip = Geocoder.search("200.113.190.187")[0]
puts ip.address
puts ip.coordinates

# Obtenemos la direccion a traves de unas coordenadas
ip = Geocoder.search("-33,-70")[0]
puts ip.address

Ejecutamos

ruby ej_geocoder2.rb

Geocoder se provee de buscadores como Google, Yahoo, Bing, GeocoderCa, etc para realizar sus busquedas. Esto podemo configurarlo en:

/usr/lib/ruby/gems/1.8/gems/geocoder-1.1.0/lib/geocoder/configuration.rb

en la propiedad [:lookup, :google] , recuerden que la url puede variar según las versiones instaladas.

Más información en la página oficial en RubyGeocoder

Gracias por su visita!

Guía básica utilización de JRuby

 

No es novedad la potencia y rendimiento que posee la máquina virtual de Java, pero tampoco lo es lo tedioso que resulta desarrollar sobre esta misma. Es así entonces como nace la mezcla perfecta de un luega dinamico como ruby y el gran rendimiento de jvm!

Entonces… qué necesitamos?
– JRuby
– Java SDK

Para fedora, redhat, centos:

sudo yum install jruby

Ubuntu y deribados:

sudo apt-get install jruby

Si estamos cometiendo el pecado de no utilizar una máquina con Unix lo descargamos de aquí.

Y también descargamos la última versión de java SDK. Recomendamos Java 7.

sudo yum install java-sdk

o

sudo apt-get install java-sdk

Si no poseemos un repositorio de java lo descargamos directamente del sitio de Oracle aquí.

Ahora ya estamos listos para comenzar.

Primero creamos un archivo para extraer datos (para hacer la cosa un poquito más interensate)

echo "Hola Mundo !!" >> datos.txt

Creamos nuestro archivo ruby

vim primerJRuby.rb

Y pegamos lo siguiente

require 'java'
module JavaIO
   include_package "java.io"
end
frame = javax.swing.JFrame.new("Mi primer JFrame en JRuby")
frame.size = java.awt.Dimension.new(400,200)
label = javax.swing.JLabel.new((File.open('datos.txt', 'r')).readline)
frame.getContentPane.add(label,java.awt.BorderLayout::CENTER)
frame.setDefaultCloseOperation(javax.swing.JFrame::EXIT_ON_CLOSE)
frame.setVisible(true)

Explicación…

Importamos java

require 'java'

Importamos la libreria java.io para aceptar entradas IO

module JavaIO
include_package "java.io"
end

Creamos nuestro frame (ventana)

frame = javax.swing.JFrame.new("Mi primer JFrame en JRuby")

Le asignamos tamaño a nuestra ventana

frame.size = java.awt.Dimension.new(400,200)

Leemos un archivo y lo desplegamos a través de un label

label = javax.swing.JLabel.new((File.open('datos.txt', 'r')).readline)

Meto el label dentro del JFrame

frame.getContentPane.add(label,java.awt.BorderLayout::CENTER)

Le asigno la funcionalidad de cerrar al JFrame

frame.setDefaultCloseOperation(javax.swing.JFrame::EXIT_ON_CLOSE)

Hacemos visible nuestro JFrame

frame.setVisible(true)

y ejecutamos.

jruby primerJRuby.rb

Espero les haya servido.
Saludos!

Ruby on Rails + Cassandra DB en Linux Ubuntu

Estimandos, continuando con las guías entretenidas: Seguimos con el simpático lenguaje de desarrollo Ruby y su framework Rails. Y para hacerlo más entretenido aún implementaremos la base de datos no relacional (noSQL) Cassandra, dicha base de datos fué creada por facebook, pero al poco tiempo pasó a las manos de Apache Fundation en la cual se desarrolló y desarrolla hasta convertirse en lo que es hoy. En esta guía básica utilizaremos la versión 0.8.4 de Cassandra. Comencemos!.

Para los propósitos de esta guía, necesitamos:

– Linux Ubuntu.

– Conección a internet

– y llevar lo ñoñez en la sangre!

 

Ruby on Rails

Primero instalamos Ruby, aplicando la magia de ubuntu…

sudo apt-get install ruby

Seguimos con su framework Rails (necesitamos el cargador de gemas de Ruby y el interprete irb):

sudo apt-get install irb
sudo apt-get install rubygems
sudo gem install rails -–include-dependencies

Y para no perder la linea, creemos de inmediato un proyecto:

rails new primerProyecto

Nos generará una larga lista de de directorios y archivos.

Los que nos interesan como referencia básica son:

cd primerProyecto
app/controllers
app/views
script/rails
 

Entonces creamos nuestro controlador

ruby script/rails generate controller Home index

El cual también generará un par de archivos, donde:

script/rails : es el script escrito en ruby que realizará el procedimiento de generación los archivos.

generate : es la acción a realizar.

controller : es el tipo de archivos que queremos generar.

Home : es el nombre del controlador que se generará.

index : es el método que vamos a crear dentro del controlador, si quisiéramos generar más, basta con ir escribiéndolos separados con un espacio.

 

Abrimos nuestro controlador:

(Yo utilizo “vim” como editor de consola, utilicen el que deseen)

vim app/controllers/home_controller.rb

Nos encontramos con una estructura así:

class HomeController < ApplicationController
        def index
        end
end

Tengo 2 formas de comentar codigo, una es con un # ante de la linea y para comentar parrafos debo hacerlo con

#Esta es mi forma de comentar
#de una sola linea

=begin
Aquí va mi texto comentado
en forma de párrafo
en varias lineas
=end

Creamos una función index, que por defecto es la primera función que se ejecuta entrar al controlador:

Ojo con las comillas, porque si copian y pegan pueden tener problemas, recomiendo escribirlas manualmente.

class HomeController < ApplicationController
    # Controlador que se ejecuta por default
    def index
        # render:text escribe un texto en pantalla sin la necesidad de crear una vista (views) explicitamente
        render:text => “Hola Mundo!”
    end
end

Ahora si quiere utilizar el controlador más la vista, lo hacemos de la siguiente forma

class HomeController < ApplicationController
    # Controlador que se ejecuta por default
    def index
        @nombre => “Mi nombre es Pablo Araya<br />”
        @ubicacion => “Santiago, Chile”
    end
end

Abrimos nuestra vista

vim app/views/home/index.html.erb

Deberíamos verla así

<h1>Home#index</h1>
<p>Find me in app/views/home/index.html.erb</p>

y lo dejamos así:

 <h1>Home#index</h1>
<p>Find me in app/views/home/index.html.erb</p> 
<%= "Mi nombre es "+nombre+" y vivo en "+ubicacion %>

el codigo ruby va entre estas etiquetas

<%
# Aqui nuestro codigo
%>

si queremos imprimer algo en el navegador agregamos el signo =

<%= variable %>

 

Ahora es el turno de Cassandra

Bajamos la última versión de Cassandra: http://cassandra.apache.org/#download o en consola:

wget http://apache.freeby.pctools.cl//cassandra/0.8.4/apache-cassandra-0.8.4-bin.tar.gz

Lo descomprimimos, lo renombramos a cassandra y lo movemos al directorio /opt:

tar xzvf apache-cassandra-0.8.4-bin.tar.gz
mv apache-cassandra-0.8.4-bin cassandra
sudo mv cassandra /opt/

Creamos los directorios que la aplicación necesita:

sudo mkdir -p /var/lib/cassandra/{commitlog,data,callouts,staging}
sudo mkdir /var/log/cassandra
sudo chmod -R 777 /var/lib/cassandra/

Creamos el fichero /var/log/cassandra/system.log y le damos permisos de escritura:

touch /var/log/cassandra/system.log
sudo chmod 777 /var/log/cassandra/system.log

Necesitamos crear nuestra estructura de base de datos, ya que Cassandra es un motor no relacional, su estructura parece grandes columnas o arreglos bidimensionales.

Ahora ya podemos levantar Cassandra, de forma default o definiendo parametros.

/opt/cassandra/bin/cassandra -f &
/opt/cassandra/bin/cassandra-cli -host localhost -port 9160

Lo entretenido de esta guía es hacer que estos dos sistemas interactuen, asi que nos vamos a nuestro controlador:

vim app/controllers/home_controller.rb

Y lo dejamos de la siguiente forma:

# Traigo mi gema cassandra para realizar la conexion
require 'cassandra'
class HomeController < ApplicationController
    # Controlador que se ejecuta por default
    def index
        =begin
        Creo mi nueva conexion con Cassandra.new('Espacio de trabajo','ip servidor')
        Si tengo ruby y cassandra en el mismo servidor, puedo omitir la ip
        =end
        store = Cassandra.new('Keyspace1')
        @nombre => “Mi nombre es Pablo Araya<br />”
        @ubicacion => “Santiago, Chile”
    end
end

Continua..