domingo, septiembre 16, 2007

He decidido quererte

Por tu hermosa sonrisa, tus piernas largas y tu piel morena.

Me encanta el tiempo que pasó contigo. Caminar juntos por la calle. Escucharte hablar de tus cosas y contarte las mías.

Cada suspiro que nace en mi pecho, ahora lleno de amor, tiene tu nombre. Y mi amor dura tanto como ese suspiro, y el que sigue, y el que sigue, y el que sigue... y si dejo de suspirar, entra al relevo un latido, y el que sigue, y el que sigue, y el que sigue....

Te quiero por que querer es libre
Te quiero por que querer es gratis
Te quiero por que no hay una razón para no hacerlo.
Te quiero por que soy feliz haciéndolo.

Solo sería más feliz si el sentimiento fuera recíproco.

Te quiero Karacas.

Finito.

miércoles, septiembre 05, 2007

De las tardes

Hace ya algunas semanas
que me llevan las mañanas
descifrarte en tu mirada y en tu voz
que nunca he sabido cuanto me has contado y cuanto no
cuanto solamente lo imagino yo
.

Cuanto tiene de ser cierto el paso a tus parques abiertos
y a las frescas sombras de tu pabellón
luego todo lo respondería esa tarde que me des
aun que solamente sea por una vez.

Entre amores y distancias
de entre sueños sin sustancias
y entre todo lo que no ha llegado a ser.

Si me dieras una tarde para conversar mejor
desdibujando las ropas con que vistes tu rumor
podría mirarme en tus ojos si te asomas hasta a mi
si te dieras una tarde, una tarde por aquí.

Si te tuviera una tarde
para abrevarme en la voz murmurante de tus fuentes
una tarde para dos, una tarde para siempre
por las tardes que no estás, por las tardes que no han sido
y por las que ya no te vas.

Una tarde solamente de tu vida
tan solo un instante de tu juventud
unas horas de tus horas y salidas
al quizás de un mutuo encuentro
que logremos ver adentro uno del otro
un quizás que tu volvieras realidad.

Una tarde que me dieras
cualquier tarde de este mes
para tardarme intentando
llevarte una y otra vez
aplicando con mis labios
en tus labios de canción
la balada del encuentro
del verano con la flor.

Quien te tuviera una tarde
para andarte, recorrer
las veredas, los atajos
en los campos de tu piel
recorriendo amante, valles, lomas
cauces de agua y flor
conquistando tus llanuras
toda una puesta de sol

Solo dame algún tarde
y yo me vuelvo una canción en tus labios.

Procurando y sorprendiendo
por todo el atardecer
tu sonrisa más bonita
si te dejas conocer.

Fernando Delgadillo

Nuevo anuncio de colaboración entre Novell y Microsoft

Miguel de Icaza anunció en su blog que se ha formalizado un acuerdo de desarrollo entre Novell y Microsoft para desarrollar versiones de código abierto de Silverlight que en el mundo Mono se conoce como MoonLight :P

De hecho, desde mucho antes se había iniciado la implementación de esta tecnología y en un memorable hack-a-ton el equipo Mono consiguió hacer realidad la idea.

Antes de que empiecen las críticas y malas ondas, es una realidad que Microsoft esta reconociendo que el trabajo en el proyecto Mono le está abriendo más puertas y ampliando los horizontes de muchos usuarios de las tecnologias .NET, obviamente este acuerdo busca conseguir más usuarios considerando el poco apoyo que Adobe brinda para Flash en plataformas de código abierto.

Solo como dato curioso, la imagen que usa Miguel en su post para indicar colaboración es la misma del header de La Cofradia.

Finito.

Nuevo número de Revista SL

Después de mucho trabajo por parte de un grupo de entusiastas promotores sale a la luz el número ocho de la Revista SL - Software Libre Hecho Revista, una publicación electrónica bimestral (bueno, casi) para difundir y promover el software libre.

Conocí la revista el año pasado y durante el FONASOL tuve el gusto de conocer a Zodman (aka Andrés Vargas) y a k001 (aka Ivan Zenteno) con quienes platique largo y tendido. Posteriormente me llegó la invitación para participar en el proyecto y en esta ocasión me di a la tarea de encontrar y corregir (o más bien: desmejorar) los artículos a publicar.

Pues bien, invito a todos a leerla, comentarla, distribuirla y sobre todo a participar.

Finito.

lunes, septiembre 03, 2007

201

El post anterior fue el número 200 en este blog. ¡Wow! Cien posts más desde septiembre del año pasado.

Casi un año y como ha cambiado mi vida no así mis ganas de seguir compartiendo mis ideas tecnológicas en este espacio. Para mis telarañas existenciales estoy por abrir un espacio adicional que en breve estaré anunciando por este canal.

Gracias a todos los lectores, ocasionales y regulares por llegar a este espacio. Espero que en algún momento un post les haya sido de utilidad. Con eso me doy por servido y contar con su visita de vuelta es un enorme placer.

Finito.

Bitácoras, Trazas, Logs, Logging

Una consabida forma de ver que sucede con tus programas es "pintar" los valores de tus variables. Esta rústica forma de depurar también tiene otra acepción: loggear :S

¿Quién dijo que poner System.out.println (javeros) o Console.WriteLine (.net) por cada línea es manejar una bitácora? No lo sé, pero en los ambientes java (que es lo que tengo más cercano) tenemos mega-archivos log de cientos de megabytes generados con poderosos System.out.println statements. Logging is cool!

Pero, eso no es logging. En casi cada aplicación "grande" o "empresarial" (lo que sea que significa esto) se incluye algún mecanismo de bitácoras. Agregar sentencias de rastreo es un mecanismo de "bajo nivel" para depurar código. Puede ser que sea la única opción por no existir un depurador para la plataforma o por que ya se trata de un ambiente multitarea/multihilos.

En el caso de una aplicación ejecutándose en un ambiente de producción, tampoco se puede hacer uso de herramientas de desarrollo o depuración. Casos así requieren que se le otorgue a los administradores u operadores herramientas que les permitan monitorear el comportamiento de los sistemas.

Para hablar de logging se requiere cumplir una serie de requisitos. Uno de ellos son los "contextos", entidades que contienen la información precisa de la ejecución de la aplicación. También se requiere distinguir diferentes niveles de severidad, desde el error fatal hasta mensajes de depuración; estas características deben poder configurarse fuera del código de la aplicación, es decir, en los programas incluimos todas las llamadas de rastreo que consideremos pero dependiendo de la configuración se van ir grabando las seleccionadas.

También tiene sus desventajas. El registro de entradas en archivos o bases de datos consume tiempo de procesador, llamadas a dispositivos que finalmente se ve como un cierto grado de lentitud en la aplicación. Si se registran demasiadas entradas, el log se torna ilegible. Si se filtran demasiados niveles de severidad, puede ser que se pierdan elementos que podrían auxiliar a resolver problemas.

Como ya es costumbre, el mundo java ha pasado por esto antes y gracias a la colaboración de muchas personas se construyó un framework para este tipo de necesidades. Ha sido tal el éxito de esta iniciativa que se desarrollaron componentes similares para otras plataformas y lenguajes (C++/PHP/Ruby) e incluso se incluye en algunos productos comerciales, BEA WebLogic Server por ejemplo (aunque ninguno de los programadores que conozco lo usan, siguen con sus pinchis println's) y obvio, también se construyo para .NET.

En este caso, log4net respeta todos los principios de su ancestro log4j y tenemos archivos de configuración, contextos, jerarquía de loggers e implementaciones de "appenders" que nos permiten tener diferentes destinos para nuestros logs. Ahora si, "logs".

El primer ejercicio de muestra del uso de log4net lo pueden encontrar en mi repositorio de ideas Google Code. Mediante subversion pueden obtener una copia de trabajo y trastear un rato con él.

Finito.

viernes, agosto 31, 2007

3108 - Día del Blog

El año pasado me uní a la celebración internacional del día del blog, y finalmente la fecha nos ha alcanzado de nuevo.

Parte de la celebración es referir cinco blogs que leo frecuentemente.

Los nominados son:

Tecnológicos

Gente
Finito.

jueves, agosto 30, 2007

Casi por sorpresa

Sin mayor preámbulo, apareció en la página de descargas la versión 1.2.5 de Mono. Se encuentra disponible para casi todas las plataformas (de hecho, creo que la única que falta es Solaris).

Finito.

viernes, agosto 24, 2007

La verda' no se puede ocultar

Hace rato posteé sobre el video de Rails vs. .NET, me pareció bueno pero lo que viene a continuación es simplemente..... ¡¡¡GENIAL!!!

Me encanta la última escena.




Finito.

Rails vs. .NET

Estos weyes de Rails Envy 'tan K's. Pa'que no se sientan desamparados los pehacheperos también le dedican uno de sus video parodias a .NET. Enjoy it!



Finito.

jueves, agosto 23, 2007

La construcción de los Helpers

Derivado del desarrollo de Operación PyME y un poco de sentido común aparece la tarea de construir un framework para construir más rápidamente y fácilmente la aplicación.

Se ha vuelto un concepto casi obligado el utilizar un framework de objetos de negocio pero ¿qué entendemos por esto? Un conjunto de clases que permiten modelar los objetos de un dominio y nos permitan olvidarnos de las tareas mundanas. La idea de fondo es utilizar la mayor parte de nuestra energía solucionando problemas de negocio y la menos posible en los problemas de tecnología.

Así han aparecido en el medio infinidad de frameworks con este objetivo, en todos los lenguajes y en todas las plataformas. Hasta parece que ya se ha llegado a un punto de saturación para estos proyectos. Sin embargo siguen apareciendo.

No existe el framework perfecto, como tampoco el lenguaje perfecto ni la plataforma perfecta. Y siguiendo nuestro inevitable anhelo de perfección vamos creando más proyectos tratando de solventar los errores que encontramos en otros.

No existe una metodología perfecta para construir un framework, generalmente la construcción es influenciada por el tema de moda: aspectos, programación orientada a objetos, inyección de dependencias, objetos auto-suficientes. Algunas empresas han publicado documentos para describir como han concebido y construido los frameworks que ofrecen. Entre estas últimas aparece notoriamente Microsoft.

Después de lanzar al mercado la tecnología .NET, Microsoft ha batallado duramente para posicionarla como una tecnología empresarial (cualquiera que sea su significado). Parte de esos esfuerzos ha sido el desarrollo de bibliotecas de componentes que faciliten el desarrollo de aplicaciones. El esfuerzo inicial dio como resultados los elementos que se conocieron como Application Blocks.

Estos eran conjuntos de clases con un objetivo delimitado. Lo más interesante fue que las construyeron a partir de un análisis que compartieron en forma de guías. En estos documentos exponen los elementos que se consideraron durante el diseño describiendo detalladamente los escenarios y la manera de aplicar la tecnología .NET para construir estas bibliotecas.

Estas bibliotecas fueron rápidamente adoptadas por la comunidad de desarrolladores quienes además fueron enriqueciendo con sus experiencias propias la funcionalidad de las clases incluidas e incluso se combinaron en un nuevo producto que se conoce como Enterprise Library. Sin embargo, tras la aparición del proyecto Mono, que permite la ejecución de programas desarrollados con .NET en plataformas no Windows, se incluyó en la licencia una cláusula que impide la ejecución de los Application Blocks en sistemas operativos distintos a los construidos por Microsoft.

Así que ahora, a pesar de ser elementos tan útiles, los Application Blocks no pueden ser utilizados en Linux o Mac OSX. Existen en el mundo del código abierto cada vez más proyectos basados en .NET y algunos de ellos pudieran resolver los mismos escenarios que se presentan en el diseño de las bibliotecas de Microsoft el ejemplo de inicio es log4net, una biblioteca de clases para registrar entradas en diferentes destinos que forma parte del proyecto Logging Services de la Fundación Apache.

Y también existen otros proyectos que ofrecen alternativas para los otros Application Blocks existentes sin embargo la principal ventaja de la oferta de Microsoft es la unificación que han conseguido y que en los proyectos de software libre se encuentran dispersos e inmersos en otros proyectos y una implementación sencilla, directa y única simplemente no existe.

Así que esta iniciativa (si, una más) es la de tener en un solo conjunto esta funcionalidad partiendo en primer lugar de proyectos ya existentes, como log4net, mostrando como es que se cumplen los escenarios descritos en la documentación de Microsoft y construyendo los elementos necesarios retomando código o creando nuevo para satisfacer las necesidades planteadas por las guías de referencia.

Y si no fuera suficiente... habrá más sobre el tema.

Finito.

miércoles, agosto 22, 2007

Uno de muchas

En este post tengo que agregar varias, varias notas.

Para la gente con la que tengo contacto más directo, principalmente por twitter esto ya no es noticia: ahora soy el flamante propietario de una Apple Macbook :P ¡Lo hice!

Ha sido una experiencia bastante rica, un ambiente agradable, un desempeño excelente y un ambiente familiar, después de todo en el fondo se trata de una variante de *nix. El único problema ha sido AirPort. Nomás no puedo configurarlo con los pinchis modems 2wire. Sucks.

Lo primero fue configurar un ambiente de desarrollo para lo cual me apoyé en los MacPorts, sin ahondar en detalles es un tipo de emerge: get code, compile, install. Easy, easy. Aún así me costó trabajo generar un ambiente para compilar Mono, cosa que conseguí hasta hoy.

Otra cosa agradable fue que resolvieron un bug que levanté en Mono, más detalles en mi blog hermano PartnerApi.

En la parte de las malas nuevas, mi ponencia fue rechazada en el EnLi ¡buaaa! ni modos :( (Sí quería ir).

Otra mala noticia es que pasó menos tiempo en línea gracias a los errores de Hellmex. Me suspendieron el servicio de banda ancha y teléfono por el desmadre que traen con el contrato desde que cambiamos de domicilio. Nomás pa'que le midan: el recibo con el nuevo número sigue llegando al domicilio anterior :S

Y pus bueno, sigo en el underground con Operación PyME. Ahora se me ha clavado la loca idea de desarrollar (bueno, seguir desarrollando) un framework que usé hace un par de años derivado de CSLA.NET y además una serie de Helpers muy similares a los famosos ApplicationBlocks; ya estaré posteando más detalles.

Finito.

martes, agosto 14, 2007

Misterio sin resolver

Entre mis feeds de hoy me encontré este post que refiere a este otro. ¿Cuál es la gracia? Se trata del código fuente de la página principal de Facebook (según su dicho).

Independientemente de esta situación, me parece el clásico ejemplo PHP: ininteligible, aburrido y extremadamente "verbal".

Mi punto de vista sobre un lenguaje siempre nace la capacidad de 1) representar un modelo de dominio y 2) el esfuerzo para representar éste. A lo largo de ya algunos años he conocido y trabajado con dos modelos para construir software, con n lenguajes y en n plataformas. En cualquier caso he ido saltando de lenguaje conforme apareció otro que me representara una ventaja sobre el actual tomando como referencia los numerales anteriores.

En concreto, con PHP no se obtiene ventaja de uno u otro aspecto. Y cuando volteo y me encuentro con RoR, simplemente se afirma mi punto de vista y aumenta mi duda ¿cómo es que PHP llegó a tener la difusión que goza actualmente?

Finito.

lunes, agosto 13, 2007

Y viceversa

Tengo miedo de verte
necesidad de verte
esperanza de verte
desazones de verte.
Tengo ganas de hallarte
preocupación de hallarte
certidumbre de hallarte
pobres dudas de hallarte.
Tengo urgencia de oírte
alegría de oírte
buena suerte de oírte
y temores de oírte.
o sea,
resumiendo
estoy jodido
y radiante
quizá más lo primero
que lo segundo
y también
viceversa.
Mario Benedetti

jueves, julio 26, 2007

¡Ahora si se va a acabar el mundo!

En el feed de Port 25, encuentro el anuncio de nueva Comunidad Open Source en Microsoft.

¡!

Sip, leyeron bien. Open Source y Microsoft sin ningún vs. de por medio.

Resulta que los chicos y chicas de Redmond, después de casi un año de Port 25, de participar en la mayoría de las grandes conferencias de Open Source, de ayudar a morir a un proyecto (NDoc vs. Sandcastle), de litigar en contra de un ¿ex-?-MVP por publicar un proyecto Open Source que "infringe" una licencia, de anunciar que Linux viola patentes de Microsoft, de..... ¡ash! ya me cansé....

En su FAQ reconocen al movimiento Open Source como una metodología de desarrollo. Mantienen su postura frente a la propiedad intelectual, patentes, copyright, trademark como partes importantes del ciclo de innovación de la industria de las TI's. Muestran a sus partners que trabajan con proyectos Open Source (incluyendo Novell).

Entonces, ¿cuál es el punto? ¿son o no son? Realmente no han cambiado de fondo. ¿será solo un escenario rosa? ¿será que sienten la presión de casos donde se ha dejado atrás toda la infraestructura Microsoft? ¿será que el mundo se va a acabar?

El de ellos, más tarde que temprano, pero sin duda.

Finito.

miércoles, julio 25, 2007

Ayer todavía te cargaba en mis brazos

Y hoy casi me miras a los ojos.

Féliz cumpleaños Jorge Alberto.

Finito.

lunes, julio 23, 2007

IronRuby para todos

John Lam, ha hecho publica la primera liberación de IronRuby.


Soporta la integración con las bibliotecas estándar de .NET, para usarlas se debe incluir lo siguiente:
require 'mscorlib'
require 'System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

Tomar nota en que se está especificando el nombre calificado del assembly.

También se pueden usar clases aún sin haberlas incluido, como sigue:

Window = System::Windows::Forms::Window
Han hecho comparaciones contra Ruby 1.8.6 y reportan al menos un desempeño equiparable en relación a las bibliotecas, en las llamadas a métodos dicen ser más rápidos. Sin embargo, parece ser que hay algunos problemas de desempeño cuando se levantan excepciones.

Considero este anuncio importante desde el momento en que mostraron Silverlight lo acompañaron de un demo de IronRuby. Hace unos meses, Scott Hanselman comentaba acerca del distanciamiento de Microsoft y los Alpha Geeks. No sé si esta liberación es bluffing para recuperar Alpha Geeks o realmente Microsoft tiene interés en Ruby.

Finito.

domingo, julio 22, 2007

¡Qué se acabe la envidia!

Después del ejercicio de hace unos momentos, me quedé nawebe@ando un rato más (¡qué raro!) y encontré un algo harto interesante: apt-build.

Creo que no soy el único que le da cosquillas eso de ajustar como un guante tus aplicaciones, así que inventaron ese instalador. Si no les ha caído el veinte o si no leyeron el post anterior, éste comando sirve para descargar el paquete de código fuente, compilarlo e instalarlo en tu sistema.

Bueno, es domingo de web@ y de "father in the works" así que solo dejo los siguientes links pa'que se entretengan un rato.

http://julien.danjou.info/article-apt-build.html
http://cronopios.net/Traducciones/apt-build.es.html
http://www.esdebian.org/article.php?story=20050104002515330
http://mundogeek.net/archivos/2007/05/12/apt-build-optimizando-los-paquetes-para-nuestra-maquina/
http://gentoo-wiki.com/Safe_Cflags
http://www.ubuntu-es.org/index.php?q=node/1265

Finito.

Compilando paquetes en Ubuntu

Una de las cosas que más me interesa de Gentoo, es la adaptabilidad al host. Esto es, al compilar cada paquete en el host, este queda lo más afinado posible. Pero.... sigo teniendo en mi laptop Ubuntu.

Algo que me irritaba de pequeña pero constante manera era ver en la terminal el siguiente mensaje:

$ ruby -v
ruby [i486-linux]

Así que para probar esto de la compilada de paquetes de código fuente, mi primera víctima fue Ruby.

¿Cómo hacerle?

De inicio hice un directorio para guardar ahí todo lo relacionado:

~/src/ruby

a continuación descargué los paquetes de código fuente. Si bien aparecen decenas de paquetes lib*-ruby, realmente solo me fuí por el núcleo.

apt-get source ruby1.8 irb1.8 rdoc1.8

luego, en el directorio donde se encuentra el código, iniciar la venerable secuencia de configurar..

configure --prefix={your prefix} --enable-pthread --enable-install-doc --enable-shared

... construir ...
make

...y probar

make check

et voilà, c'est fini!

sudo make install

ahora al probar de nuevo

$ ruby -v
ruby 1.8.5 (2006-08-25) [i686-linux]

¡Correcto! Ahora ¿qué sigue? ¿será la próxima víctima el kernel?

Finito.

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.