Mostrando las entradas con la etiqueta books. Mostrar todas las entradas
Mostrando las entradas con la etiqueta books. Mostrar todas las entradas

viernes, julio 20, 2007

Otro script con Ruby

Y heme aquí, otra vez dándole al scripting con Ruby.

Ahora la tarea encomendada fue convertir un archivo CSV a un simple archivo XML.

Esto es de aquí:

20117252110,11.103.2.14
020126252110,11.102.2.24
020201052151,172.16.47.14
020301022151,11.44.2.14
020401052151,11.43.2.14
...


hasta acá:

<ruteo>
<ruta>
<clave_presupuestal>20117252110</clave_presupuestal>
<direccion_ip>11.103.2.14</direccion_ip>
</ruta>
</ruteo>


Entonces ¿qué hice? Lo primero fue recurrir a un par de libros. La biblia de Ruby: Programming Ruby y Enterprise Integration with Ruby. Además de encontrar en línea la documentación de la biblioteca estándar en ruby-doc.org. Así encontré felizmente que como todo lenguaje que se precie de ser moderno, la biblioteca estándar viene con clases para manejar XML. Dado... ¡a tirar código!


# traemos el conjunto de clases para el manejo de XML
require 'rexml/document'

# vamos a crea rutas
class Ruta
# esto es increible, con este método se crean las propiedades de lectura/escritura
attr_accessor :direccion_ip, :clave_presupuestal

# el constructor
def initialize(clave_presupuestal, direccion_ip)
@clave_presupuestal = clave_presupuestal
@direccion_ip = direccion_ip
end

# el método que hace la chamba
def to_xml
ruta = REXML::Element.new('ruta')

# creamos los elementos y les asignamos valor
# las @variables tienen alcance únicamente en esta clase
ruta.add_element('clave_presupuestal').add_text(@clave_presupuestal)
ruta.add_element('direccion_ip').add_text(@direccion_ip)

# regresamos el elemento XML que acabamos de crear
ruta
end

# solo para probar
def to_s
@direccion_ip + " " + @clave_presupuestal
end
end

class Ruteador

def initialize
# creamos el documento y el nodo raíz
@doc = REXML::Document.new
@ruteo = REXML::Element.new("ruteo")
end

def lee_informacion(nombre_archivo)
f = File.open(nombre_archivo, "r+")

# leemos el archivo línea x línea y lo guardamos
# en el array @lista cool!
@lista = f.readlines()
f.close
end

# este método hace la chamba
def convierte
# el arreglo con los datos convertidos desde CSV
@convertido = Array.new

# iterators! un regalo del cielo
# y code blocks!
@lista.each do |line|
# recortamos cada línea y la separamos entre cada coma ','
clave_presupuestal, direccion_ip = line.chomp.split(',')

# esto es simplemente hermoso
# agregamos al arreglo @convertido un nuevo objeto Ruta
# pero chequen: no 'add' method, use '<<' instead
@convertido << Ruta.new(clave_presupuestal, direccion_ip)
end
end

# ahora, a escupirlo....
def escribe_xml(nombre_archivo)

# otra vez iterators & code blocks <- this rulz!
@convertido.each do |entry|
# ¿recuerdadn Ruta.to_xml?
@ruteo.add_element(entry.to_xml)
end

# agregamos el nuevo objeto al documento
@doc.add_element(@ruteo)

# y a ponerlo por escrito
f = File.open(nombre_archivo, 'w+')

# esto también es chulo de bonito, chingao!
@doc.write(f, 0)
f.close
end
end

# a poner todo a trabajar
ruteo = Ruteador.new

ruteo.lee_informacion("rutas.csv")
ruteo.convierte
ruteo.escribe_xml("demo")


Finito.

jueves, enero 04, 2007

And the winner is...

Curt Hibbs ha publicado en su blog, la referencia al índice TIOBE en la cual declaran como lenguaje de programación de 2006 a Ruby.

We are glad to announce that Ruby has become "Programming Language of the Year 2006". Ruby has the highest popularity increase in a year of all programming languages (+2.15%). Runner up this year is JavaScript with +1.31%. Both languages are boosted by their corresponding frameworks, Ruby On Rails and Ajax.
Voy terminando de leer Ruby on Rails: Up and Running y si bien el libro puede mejorar significativamente, lo que me sorprende completamente es Rails. Rails es un marco de desarrollo basado en Ruby, se conoce por casi increible capacidad de generar una aplicación "completa" en minutos. En lo particular me parece una perfecta implementación de una fábrica de software. Tendré que preparar un post más completo para sustentar el último dicho.

Todavía falta que lo vea en un sistema en producción, no conozco ninguno todavía y también explorar Rails al grado de ver que más puede generar aparte de aplicaciones web (¿servicios web? ¿integración?) y también, seguramente debe existir algo similar implementado con .NET o Mono (¿Monorail?).

Ruby es un lenguaje interesante. Todavía no lo entiendo del todo, como que no aplica el clásico ejemplo del "Hello World!" sin embargo tiene una simplicidad aparente que con Rails raya en lo ridículo. Pa'muestra un botón:

class Photo < ActiveRecord::Base
  has_many :slides
end

class Slide < ActiveRecord::Base
  belongs_to :photo
end

Con este par de declaraciones se ha realizado una relación uno-a-muchos. Así nomás. Y funciona ¡eh!. Tienes una consola que carga tu modelo de dominio, o sea tus clases, y puedes ir probando al vuelo tus objetos.

Hasta miedo tengo de voltear a .NET y Mono. Ahora los veo de manera distinta.

Finito.

lunes, diciembre 18, 2006

Mudanzas y encuentros

A veces me desespera ser tan desesperado. Siempre busco la ruta del mínimo esfuerzo aún y cuando sea más esfuerzo hacer el cambio. El último cambio fue de distro.

Por enésima vez cambié la distro que tenía instalada en mi laptop. Ahora fue de Ubuntu a Fedora. ¿La razón? Tener acceso más fácil a las últimas versiones de Mono. Sin embargo después de unos meses de trabajar con Ubuntu el cambio no fue tan fácil como pensé de inicio.

Ya tenía a la mano el DVD para instalar Fedora en su versión 5, sin embargo, por ganas de desperdiciar ancho de banda descargué la imagen para FC6 solo para ver en la página de descargas de Mono que solamente soportan hasta la versión 5. Pus bueno, agarré mi DVD y ¡órales! a instalar. La siguiente actividad fue la consabida actualización de los paquetes instalados, cosa que en mi caso significaban cerca de 600 MB de descarga.... ¡qué onda w!

Pus aún y así colgué mi noble yegua a la pichurrienta red de la ofi para ver con asombrosa impaciencia el goteo de bits de la red. Y pasó un día, dos, tres, cuatro y me cargó la tiznada. Mi transparente paciencia se pegó un tiro y al querer buscar el modo de acelerar descargas, me encontré un plugin para yum que segúnesto es para seleccionar los mirrors más rápidos. Si pero no. Como fuí descargando por grupos ya que me fue imposible dejarla más de 4-6 hrs conectada, iba seleccionando que si por letra, por tamaño, por paquete, por hora, por lo que fuera tratando de desmenuzar el mazacote de descargas que tenía en las manos.

Entre todo ese malabar de paquetes, sitios, versiones y conexiones se batieron los datos de los repositorios. Varios curiosos mensajes aparecieron al momento de hacer el famosísimo "yum update" para que al final resultara que ningún mirror podía validarse contra las firmas que tenía registradas. Aplique la mentada formula de "yum clean all; yum makecache" y conseguí hacerlo funcionar un par de veces más pero fue todo. De ahí se me ocurrió quitar el maravilloso-plugin-acelera-mirrors y mejoro un tantito la cosa pero con un par de descargas llegó al mismo final.

'Tons que agarró y que instalo de nuevo FC5 (que ganas de perder el tiempo ¿no?) y ahora no me hice del maravillosos-plugin-acelera-mirrors para las actualizaciones. Y pasaron uno, dos, tres, cuatro días y yo sin terminar. Siempre los mismos mirrors, siempre la misma lentitud, siempre un buen de tiempo perdido. 'uta madre. :@

Y además, no me encontraba del todo cómodo. FF 1.5, Evolution 2.6, usuario root para instalar (aprendí a configurar sudo pero por ahí algo me late que también influyo en la revoltura de repositorios). No, no, no.

De vuelta a Ubuntu. Lo primero que noté (bueno, ya lo había notado antes pero no le di importancia) es el hecho de que existe un repositorio Ubuntu para México (http.//mx.archive.ubuntu.com) que si bien no sé si se encuentra físicamente aquí en México, al menos atiende las peticiones de volada. Y además como Ubuntu viene con las versiones más recientes de sw, me siento más a gusto. Y menos tiempo perdido. La única desventaja es la lentitud respecto a las actualizaciones de Mono ¿qué tan difícil es hacer paquetes para Ubuntu? :S

La otra cosa interesante de la semana pasada son libros. Un bonche de libros. Gustavo decidió que era tiempo de comprar libros y pus le encargue mi lista (que no son muchos) y ya llegaron.

En mi breve selección se encuentran Software Factories por Greenfield et alias, Microsoft Windows Comunication Foundation: Hands on! por McMurty et alias, Practical Software Factories with .NET por Lenz y Enterprise Integration with Ruby por Schmidt, éstos último en versión electrónica, amén de otro bonche de libros que encargó Gus.

Entre los otros libros, encontré Ruby on Rails: Up and running por Tate, el cual de una manera sencilla te va introduciendo al mentadísimo mundo de Rails: metaprogramming, scaffolding, ActiveRecord, etc. Mucho de lo que he visto de inicio me hace un deja vù con las software factories. No tengo muy definida la idea, voy a tener que amarrar más conceptos.

En la parte de Ruby, me encontré con algundos feeds y lo más sorprendente con un incipiente grupo de usuarios Ruby en la Cd. de México. El breve perfil del organizador lo presenta como un ingeniero de soporte Rational de IBM ¿? El grupo lo viene anunciando en dos lugares Google Groups y Yahoo! Groups así que si les interesa apúntense.

Por último, mañana se realiza la última reunión de la Comunidad .NET de la Cd. de México en el lugar acostumbrado (WTC, piso 35, Intersoftware).

Finito.