Anotaciones de diversos temas relacionados con código abierto, metodologías de desarrollo y programación con Ruby on Rails
lunes, diciembre 31, 2007
Terminando el 2007
Fue un año particular, no fue un año más. Lo único constante fue el cambio.
Ahora vamos a lo que sigue. El 2008 se presenta en un rato y debemos recibirlo con toda la esperanza en las manos y en el corazón.
Ahora tengo que agradecer a todos los lectores de este blog y desear que se enfrenten exitosamente a todos los retos que se presenten el próximo año.
A mis amigos y seres queridos, el anhelo de seguir contando con su cariño y aprecio por éste y muchos años más, de igual manera mi afecto y amistad incondicional para ustedes.
Por este año, es todo en este blog.
Finito.
lunes, diciembre 24, 2007
Instalando Ruby on Rails en Mac OS X
$ sudo port install ruby
$ sudo port install rb-rubygems
$ sudo gem update --system
$ sudo gem install sqlite3-ruby
$ sudo gem install rails --include-dependencies
$ sudo gem install rails --version "= 1.2.6" --include-dependencies
viernes, diciembre 21, 2007
A mis amigos
Este año ha sido un cúmulo de cambios en muchos aspectos: en mí, en mi vida, mis relaciones, mi trabajo. Todo esto ha hecho que me repliegue de una manera que a varios les ha parecido incluso agresiva. No hay tal agresión. Simplemente decidí hacer estos cambios de esta manera.
El último gran cambio, el trabajo, se presentó como un reto: cumplir con el compromiso en la segunda semana de diciembre. El compromiso en si mismo fue un reto y la transición laboral fue adicional. Incluso el cambio de herramientas se convirtió en un duelo de voluntades, la ignorancia e inexperiencia contra mi deseo de ganar. Fue difícil. Tampoco fue un drama pero tuve, al igual que las decisiones anteriores, que enfrentarme contra muchos de mis defectos. No pude vencer más que los necesariamente indispensables.
Gran parte de la fortaleza surgió del amor a mis hijos y a mí mismo. Otra parte de la necesidad que tengo de compartir, pero primero tengo que construir algo que compartir. Y hasta el último, mi propio orgullo.
Quiero construir un algo que pueda compartir y eso es lo que busco de aquí en adelante. Y para tenerlo he de trabajar mucho y de manera inteligente. Habrá un momento en que me detenga y estire las manos para ofrecer ese algo y entre todas las personas del mundo se los ofreceré a ustedes mis amigos.
No los he olvidado, no los quiero dejar atrás. Simplemente quiero tener algo que compartir.
Felices fiestas a todos.
Finito.
sábado, diciembre 08, 2007
Rails 2.0: El NexGen del desarrollo web
Para actualizar tu sistema recuerda que lo único que se requiere es ejecutar la siguiente instrucción desde una ventana de línea de comando:
C:\> gem update rails -y
Esta instrucción descargará e instalará todos los componentes necesarios. Un punto importante para tener en cuenta es que pueden existir diferentes versiones de gem instaladas al mismo tiempo, por ejemplo en mi equipo al ejecutar
C:\> gem list --local
presenta todos las gem's instaladas con el número de versión, para el caso de Rails aparece
rails (2.0.1, 1.2.6, 1.2.5)
Web-application framework with template engine, control-flow layer,
and ORM.
Cada vez que se genera un nuevo proyecto Rails, en el archivo config/environment.rb se puede encontrar la versión específica de Rails y cambiarla.
Ahora, a probar las nuevas características de esta versión.
Finito.
Revista SL 9
Finito.
domingo, diciembre 02, 2007
Instalando Rails + sqlite3 en Windows XP
Pues bien, este equipo con todo y sus limitaciones alguna vez me sirvió para trabajar y ahora se me ocurrió actualizarlo al ambiente de desarrollo que utilizo. Pero para tal efecto se me ocurrió utilizar sqlite3 en lugar de cualquier otro RDBMS. Los pasos fueron los siguientes:
- Descargar e instalar Ruby.
- Descargar, extraer e instalar RubyGems.
C:\ruby-gem-0.95> ruby setup.rb
- Actualizar las gem's instaladas.
C:\> gem update
- Descargar sqlite3, extraerlo en un directorio y agregar ese directorio al PATH.
- Instalar la gem sqlite3-ruby
C:\> gem install sqlite3-ruby
- Instalar Rails
C:\> gem install rails --include-dependencies
- Presto!
C:\> rails --database=sqlite3 demo
miércoles, noviembre 28, 2007
Primer Twitteo
Me costó un buen de trabajo encontrarlo pero aquí está:
Ahora, le envió este meme a: @xhindi, @arturogarrido, @sonny_taz, @atzimba y @ebarrera y obviamente a todo aquel que quiera tomarlo.
Finito.
martes, noviembre 27, 2007
El Changuito cumple diez años
lunes, noviembre 19, 2007
Configuración de Rails y SQL Server
Un ambiente que se va a presentar muy comunmente es Windows y SQL Server.
Entonces he aquí la receta sencilla y probada para soportar SQL Server dentro de Rails.
Primero, habrá que descargarse la gem ruby-dbi desde http://rubyforge.org/projects/ruby-dbi . ruby-dbi es un mecanismo de acceso a datos inspirado en Perl::DBI. En la gem viene incluido el soporte a varias bases de datos y durante el proceso de instalación se selecciona cuales se van a soportar.
La descarga es un archivo .tar el cual se expande en un directorio desde el cual ejecutamos las siguientes instrucciones:
# primero configuramos el ambiente para usar ActiveX Data Objects (depende de win32ole)
c:\>ruby setup.rb config --with=dbi,dbd_ado
# la llamada de siempre
c:\>ruby setup.rb setup
# finalmente la instalación
c:\>ruby setup.rb install
Con esto ya tenemos la capacidad de acceder a SQL Server desde Ruby. Ahora falta configurar SQL Server para que permita conexiones mediante usuario/contraseña. Para esto configuramos el modo de autenticación "mixed" dentro de las propiedades de seguridad del servidor.
A continuación se crean el login de SQL Server y la base de datos asociando el login como dbo de la base recién creada y se crea el proyecto rails como de costumbre.
c:\>rails proyecto
Después se actualizan los datos del archivo config/database.yml
development:
adapter: sqlserver
database: database_development
username: user
password: password
host: .\SQLEXPRESS
Esta configuración funciona con las versiones 2000 y 2005 de SQL Server. La diferencia que he encontrado es el manejo de valores nulos en columnas de tipo integer. En SQL Server 2005 sustituye los valores nulos con ceros mientras que en la versión 2000 funciona correctamente.
Finito.
MVC significa "Más-Visto-que-Conocido"
Una vez más Microsoft llega tarde y para evitar poner su cara de perdedor monta la fanfarria para compartir su última gran innovación.
MVC, el patrón, es una de las cosas más antiguas en la ingeniería de software. Fue desarrollado circa 1980 en los (realmente innovadores) laboratorios Xerox buscando una manera de separar los diferentes "concerns" al momento de construir una aplicación. Hasta ahí lo dejaron entonces.
Posteriormente, Sun Microsystems al lanzar su parafernalia conocida como J2EE buscó algo en que apoyarse para facilitar el desarrollo de aplicaciones web (el infame modelo 2), cosa que encontró en MVC dejando atrás incluso tecnologías que ellos mismos habían desarrollado.
Fue tan buena la aceptación del uso de este concepto que en el mundo del código libre aparecieron varias implementaciones del patrón MVC más puristas o independientes a Sun. Así encontramos Struts, Spring, Tapestry, WebWork y muchos otros más que por diversas cuestiones pasaron a la posteridad.
Al ser un patrón de diseño, no depende de un lenguaje o artefacto específico, sino que representa una solución genérica para aplicarse en las más diversas situaciones.
El corazón de MVC es la división de una aplicación delimitando específicamente sus responsabilidades, así tenemos:
- Modelo - Se encarga de la representación específica de la información perteneciente al dominio del problema. En una implementación específica se responsabiliza del acceso y recuperación de datos.
- Controlador - Es el cerebro maestro. El que se las sabe todas, todas. Los procesos de la aplicación se encuentran concentrados en un conjunto de controladores que son el corazón y el cerebro de la aplicación.
- Vista - La parte coqueta. La parte visual. La interface de usuario que se encarga únicamente de presentar la información que le entrega el controlador. Nunca se entera (al menos no al detalle) de la existencia de los modelos.
El beneficio final de usar este patrón es la simplificación en la distribución de responsabilidades, al aislar las acciones que corresponden a cada clase participante del sistema. En pocas palabras en una excelente idea.
Es por eso que desde hace más de veinte años que alguien tuvo la ocurrencia de inventarlo (no sé realmente si valga la expresión "inventar") se utiliza obligadamente en la construcción de aplicaciones web, excepto claro, en aquellos casos en los que la premisa es No-inventado-aquí.
Hace cerca de ocho años cuando Microsoft lanzó al mercado la tecnología .NET presentó su alternativa para el desarrollo web: los formularios Web. Una idea interesante, complicada de aprender de inicio que trajo a las herramientas de Microsoft algo del dinamismo indispensable para seguir en la contienda.
Aunque algunas personas han cuestionado la cuota de mercado que ha ganado .NET, un excelente indicador son las comunidades de software libre que se basan en los componentes de .NET para arrancar, construir y compartir alternativas a los productos propietarios de Microsoft. Esta corriente hasta hace un par de años no tenía un nombre aunque si varios protagonistas. Actualmente se le conoce como ALT.NET.
Dentro de estos esfuerzos de código libre se incluyó la implementación del patrón MVC para el desarrollo de aplicaciones web, en contraposición a la línea "oficial" de Redmond que se basó principalmente en otro patrón conocido como Front Page Controller (Pa'más detalles léanse "Enterprise Solution Patterns" del equipo de Patterns & Practices). Simplemente MVC no les pareció lo suficientemente bueno, no les llenó el ojo.
Siete años después y con una estela de productos open source muertos, Microsoft anuncia que la gran solución para el desarrollo web es MVC.
Microsoft llegas tarde. Como siempre.
Finito.
sábado, noviembre 17, 2007
Desarrollo multiplataforma
Actualmente estoy desarrollando una aplicación web con Rails. Lo curioso del caso son los ambientes que manejo: desarrollo, pruebas locales y servidor de prueba.
El equipo de desarrollo como imaginarán es mi laptop, el ambiente de pruebas locales es mi laptop con otro sistema operativo y el servidor de prueba está más cercano a lo que será el ambiente de producción. En la tabla a continuación muestro los detalles
Ambiente | Características | OS | DB Server | Ruby/Rails versions |
---|---|---|---|---|
Desarrollo | MacBook Core 2 Duo/2GB RAM | Mac OS X 10.4 (Tiger) | sqlite3 | 1.8.6/1.2.5 |
Pruebas Locales | MacBook Core 2 Duo/2GB RAM | Microsoft Windows XP Professional SP2 | SQL Server 2005 Express | 1.8.6/1.2.5 |
Servidor Pruebas | HP Xeon 2.0 GHZ x 4 | Windows 2000 Advanced Server | SQL Server 2000 Enterprise Edition | 1.8.6/1.2.5 |
El soporte a SQL Server en Windows es algo laborioso de configurar (prometo detallarlo en otro post) y algo que llama mucho la atención es el diferente comportamiento de SQL Server entre sus dos versiones, 2000 y 2005. En SQL Server 2005, todos los campos enteros aún y cuando se defina el valor por defecto como null siempre aparecen con un valor '0'. En SQL Server 2000, si dices null aparace null. Tal cual.
Fuera de eso y de las obvias configuraciones el código de la aplicación es el mismo.
Por cuestiones desconocidas para mí (y creo que para el admin del servidor también) el desempeño del servidor es terriblemente malo. En los logs de Rails se registra un cálculo aproximado de peticiones que se pueden atender según el equipo en el que estamos ejecutando. En mi laptop este número varia entre 13 y 15 peticiones por segundo. En el servidor de prueba hay valores tan bajos como 4 peticiones por segundo. Espero que el ambiente de producción esté mejor operado.
Finito.
jueves, noviembre 15, 2007
El Camino del Código
Reencontrarme con el desarrollo ha sido estupendo, las problemas que por momentos parecen no tener sentido, se resuelven de manera transparente y relajada como el correr del agua en un riachuelo. No hay que poner demasiado esfuerzo, como caballo desbocado sino más bien permanecer quieto y alerta para en el momento justo tirar una sola línea de código como trazo de pincel... ni más, ni menos.
También cuando vas escribiendo código y piensas: "si éste método existiera de este otro modo..." y el método ya existe o cuando integras por primera vez un nuevo concepto y empiezas a complicar todo cuando la respuesta es tan simple.
No es que Rails sea mejor que X o Y. Es simplemente nadar con la corriente en lugar de nadar contra la corriente.
Finito.
sábado, noviembre 03, 2007
Todos los Santos
La plancha dividida y enorme del Zócalo de la Cd. de México alberga una exposición sobre el Día de Muertos auspiciada por el Gobierno del Distrito Federal y dentro del programa de actividades se anunció la presentación del Maestro Aute, cosa que me hizo replantear completamente mi agenda del día en cuestión y que gracias al interne' y sus ondas me permitió además conocer (en persona) a una chica líndisima y reencontrar a un nuevo amigo.
La cita fue, obviamente, en alguna salida de la estación "Zócalo" y después una caminata para encontrar el, a mí gusto, pequeño escenario de la presentación. Entre comentarios y plática de "hay que hacer tiempo", revisamos un programa y nos dimos cuenta que también estaría presente Oscar Chávez. Wow! Dos grandes por el mismo boleto.
Boleto que empezó costando escuchar, o más bien, aguantar los berridos de Lupita Infante. Que mal plan que se cuelgue del apellido de su 'apá pa'cer los desfiguros que vimos. Montaron una escena de la clásica peli "Los Tres Huastecos" y algo que me cayó mucho de variedad fue ver que muchos, sino todos, nos sabemos las canciones y los diálogos. Estoy seguro de que otra forma de demostrar la nacionalidad mexicana es preguntar canciones y diálogos de películas de Pedro Infante. Neta.
La presentanción de Lupita Infante llegó a su fin no sin antes apabullarla en su última canción con gritos de "Aute! Aute!" y se inició una pausa para el setup del sonido para la presentación del Maestro.
Desde que lo oí por mero accidente en pasado mes de mayo en Coatzacoalcos, simplemente quedé enmarañado, enredado en la letra de sus canciones que han pasado a ser parte esencial de mis mecanismos para vivir, recrear, recordar muchas de mis emociones y mis recuerdos. Frases que sin ser mías me permiten expresar de una manera precisa lo que siento y que me cuesta trabajo decir de una manera inteligible. Y la catarsis postergada que sabía que había de reventar en medio de un colectivo, el cuál al integrarte regala momentos de anonimato que permite que te explayes sin que nadie te cuestione en lo más mínimo.
Al igual que en Coatza, el concierto giró principalmente sobre su último disco e hizo la introducción para casi todas las canciones con su característico humor. Así, en medio de la cubierta éterea y el calor humano, estuvimos coreando y cantando aquellas canciones que nos gustan, nos mueven o mayormente nos duelen...
Aunque todo ya es nada
no sé por que te escondes y huyes de mi encuentro
por saber de tu vida
no creo que vulnere ningún mandamiento
Aquella fue la primera vez
tus labios parecían de papel
y a la salida en la puerta
nos pidió un triste inspector nuestros carnés
Luego volví a la Academia
para no faltar a clase de francés,
tu me esperaste hora y media
en esta misma mesa, yo me retrasé.
O momentos más amenos
Por más que nos pille el estúpido de tu marido,
Quiero bailar un "slow" with you tonight.
Y aunque enamorarme de tí me lo tengas prohibido
quiero bailar un "Slow" with you tonight, my love.
Lo que sucede es que me he enamorado,
como el perfecto estúpido que soy,
de la mujer que tienes a tu lado...
encájame el directo que te doy.
El final de su presentación lo marca despidiendo a sus músicos y montandose él , el escenario, su voz y nada más...
De alguna manera tendré que olvidarte
por mucho que quiera no es fácil, ya sabes
me faltan las fuerzas
ha sido muy tarde
y nada más.. y nada más
apenas nada más
Después, entró al escenario un trío de ruquitos (con todo respeto) y anunciaron al gran Oscar Chávez. Al ir escuchando las notas que brotaron de los instrumentos de los músicos, quedó grabado en mi su nombre: Los Morales. Ruquitos pero K's. Son terriblmente buenos y ahora entiendo por que son sus acompañantes oficiales.
Boleros, huastecas, norteña y canciones clásicas que nos hicieron cantar, el Zócalo se encendió con canciones como "La Mariana", "La marijuana", "Flores Negras", "Sin un amor", "Hasta siempre comandante", "Por tí" y mi particular favorita: "Macondo".
Los cien años de Macondo suenan, suenan en el aire
Y los años de Gabriel trompetan, trompeteando anuncian
Y encadenado Macondo sueña con José Arcadio
Y aunque la vida pasa siendo remolino de recuerdos
Las tristezas de Aureliano, son cuatro
Las bellezas de Remedios, violines
Las pasiones de Amaranta, guitarra
Y el embrujo de Melquiades, es oboe
Úrsula cien años, soledad Macondo
Úrsula cien años, soledad Macondo
Eres epopeya de un pueblo olvidado
Forjado en cien años de amor y de historia
Me imagino y vuelvo a vivir
En mi memoria quemada al sol
Mariposas amarillas Mauricio Babilonia
Mariposas amarillas que vuelan liberadas
Lo único malo fue la resaca al día siguiente, tanta emoción causa cierto tipo de embriaguez cuando no hay ese alguien especial para compartirla.
Finito.
viernes, octubre 26, 2007
Rompiendo el silencio (Trabajo)
Hasta ahorita me he definido como un "hombre de equipo", esto es, mis amigos son en primer lugar las personas con los que trabajo todos los días. Así, cuando cambio de equipo de trabajo, cambio de amigos. Cambio hábitos de comida, de trabajo y me esfuerzo por no cambiar de trato pero como algunos reclaman, no siempre lo consigo. Una cosa curiosa es mi nuevo equipo: Yo. Actualmente en el proyecto que trabajo soy el único recurso de tiempo completo por parte de mi empresa, así que el equipo soy Yo. Ja.
Dentro de la empresa, veo muchas áreas de oportunidad: metodología, capacitación, proyectos. Ahora necesito conseguir tiempo y concentrarme en mis tiempos "muertos" a ir armando los bloques que traigo en la cabeza.
Me voy re-encontrando con herramientas y tecnologías. Una de las cosas que quiero hacer es buscar espacios para Rails, sin embargo, éste mi primer proyecto está amarrado a .NET al cual le estoy tomando sabor de nuevo. Fueron casi tres años sin tirar código para una UI y ahora al re-aprender ASP.NET influenciado por la visión Rails le encuentro un sabor distinto. Ahora me veo usando componentes que hace un par de años (o meses) veía como objetos de pecaminosa pereza pero desde un enfoque pragmático tienen su valor (y razón) de ser.
Cuando desarrollamos con Rails hacemos usos de una cantidad inmensa de clases y componentes de los cuales aprovechamos toda la funcionalidad sin preocuparnos del detalle de la implementación. De repente nos encontramos usando ActiveRecord a diestra y siniestra confiando ciegamente en que la implementación del patrón de diseño cumple con todos los cánones habidos y por haber. No hay duda ni cuestionamiento, ActiveRecord es un componente que nos permite ser más productivos ¿para qué entrar al detalle de su funcionamiento? Funciona y listo.
En mi regreso a ASP.NET estuve a punto de retomar la complejidad de implementar patrones, armar bosques de clases y aplicar todos los principios de arquitectura existentes; la realidad es que los tiempos comprometidos me están obligando a encontrar alternativas que nos permitan avanzar más rápido y tener elementos visibles, tangibles, que hagan sentido al usuario final del sistema. Se generó en mi un gran conflicto. Siempre peleé por "hacer las cosas bien, más que rápido" y ahora tengo que "hacer las cosas rápido más que bien". Al final, encontré un punto medio. La experiencia con Rails me enseño que no tengo que recrear la complejidad (usar las clases existentes de ActiveRecord en lugar de construir de cero mi implementación del patrón de diseño) sino a usar lo ya existente y confiar en que en su momento lo puedo mejorar (esto último es más "agile oriented").
Tome los componentes ASP.NET que más me latieron y conseguí avanzar un buen tramo en la construcción del sistema sin caer en un "arrastra-controles" ni re-construyendo todo por ser víctima del síndrome "No-Inventado-Aquí". Estoy cierto que de ser estrictamente necesario más adelante puedo cambiar esos componentes así que se redujo parte de mi conflicto interno.
Esta situación también me dejo entrever otra cosa: de manera natural seguimos ciclos (o espirales dirían los dialécticos). En las artes marciales se inicia con el aprendizaje portando un cinturón blanco, signo de ignorancia, conforme se avanza el cinturón se va tornando oscuro hasta llegar al negro representando la "maestría" alcanzada. Al paso del tiempo el cinturón negro se desgasta mostrando la fibras blancas originales. Simple, complejo, simple.
En el contexto del desarrollo nos adentramos con "asistentes" y construimos aplicaciones arrastrando componentes en nuestro ambiente de desarrollo. Luego vamos conociendo nuevas tecnologías que aumentan los beneficios de nuestras aplicaciones a expensas de la erudición necesaria para su uso. Patrones, técnicas, innovación amarrada a la complejidad pero esto tiene que ser así ¿cierto? Entre más fácil para el usuario, más complicado para nosotros.
En ese momento aparece Rails y entiendo el porqué de la migración. Nos olvidamos de las complicaciones. Sabemos que los componentes de Rails son implementación de patrones y conceptos que veneramos y con eso nos basta. No los ponemos en tela de juicio ni criticamos, simplemente los usamos.
Así me paso con ASP.NET, ya no cuestiono ni critico los componentes que ofrece. Aqui y ahora me hace sentido. Sé que de requerirse puedo incluir toda la complejidad que se requiera pero de momento solo necesito una cosa: que funcione y lo estoy consiguiendo.
Finito.
domingo, septiembre 16, 2007
He decidido quererte
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
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.
Nuevo anuncio de colaboración entre Novell y Microsoft
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
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
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
¿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
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
Finito.
viernes, agosto 24, 2007
La verda' no se puede ocultar
Me encanta la última escena.
Finito.
Rails vs. .NET
Finito.
jueves, agosto 23, 2007
La construcción de los Helpers
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
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
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
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.
jueves, julio 26, 2007
¡Ahora si se va a acabar el mundo!
¡!
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
Féliz cumpleaños Jorge Alberto.
Finito.
lunes, julio 23, 2007
IronRuby para todos
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!
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
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
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, julio 19, 2007
La dieta del ChilliCoder
He decidido revelar el secreto de la Dieta del ChilliCoder.
Hasta con imágenes.
Finito.
miércoles, julio 18, 2007
Otra aplicación web
Ahora resulta que podemos hacer diagramas tipo Visio o Dia en nuestro navegador. ¡Excelente! Ultimamente me había inclinado por aplicaciones de escritorio y consideraba las aplicaciones web para puro entreteniento o cosas superficiales, pero al irme haciendo cliente de las aplicaciones y servicios Google me voy despegando del escritorio.
Manejo proyectos con Google Code. Comparto documentos con Google Docs. Manejo mis listas de acciones con Google Notebook. Leo mis feeds con Google Reader. Mi correo electrónico es GMail. Y ahora hago mapas mentales con bubbl.us y diagramas con Gliffy.
¿Cuál es la ventaja? En primer lugar la ubicación transparente. No más memorias flash o discos duros externos. En casi cualquier computadora puedo trabajar. A cualquier hora.
¿Desventajas? Depender de una conexión a internet. O sufrir si es una conexión lenta. El riesgo siempre latente de no tener la ultimisisisisima versión en la mano y obvio, de que alguien más o algo más se la pase parseando o scanneando todos mis pensamientos vertidos.
Hasta ahora han sido más ventajas pero no deja de sorprenderme. Bien dice Thomas Friedman en su libro "La tierra es plana": internet es una de las aplanadoras.
Finito.
martes, julio 10, 2007
bubbl.us - free web application for brainstorming online
Ya había encontrado en un post noticias sobre sitios web que ofrecen el servicio de mapas mentales. No los había tomado mucho en cuenta hasta que empecé a usar con más frecuencia Google Docs y su capacidad de compartir documentos. Sin embargo Google Docs solo soporta documentos tradicionales: hoja de cálculo y texto :(
En una rápida búsqueda en San Google encontré Mindomo, que era el sitio acerca del que leí y encontré también este otro bubbl.us. Hice el trámite para registrarme en los dos y simple y sencillamente bubbl.us me encantó. Muy a la Library Thing lo único que tienes que hacer es dar tu correo, nombre de usuario y contraseña y voilà! ¡Estás inscrito y listo para usar el servicio! Y es así, en cuanto di Submit apareció el canvas y empecé a dibujar mi mapa mental.
Mindomo por otra parte, te envía un correo de confirmación y en lo que escribo este post sigue cargando su "canvas".
Obvia cual fue mi decisión ¿cierto?
Finito.
miércoles, julio 04, 2007
Scripteando con Ruby
Seguramente en las herramientas de todos los días (shell) lo hubiera conseguido en algunos minutos. Habrá quien lo resuelva en unas cuantas líneas de Perl, tal vez Python o whatever.
Sin embargo tuve la linda ocurrencia de hacerlo con Ruby. ¡¿Ruby?! ¿No solamente es para hacer aplicaciones web y frameworks? Pues no, creo que no.
Por alguna referencia encontré Everyday scripting with Ruby. No he comprado el libro pero el título me motivó para hacer esta prueba. ¿Puede ser Ruby un lenguaje que compita contra Perl? Muchos de los scripts de administración se construyen religiosamente con Perl o en mi caso mayormente con shell. Pero quisé probar Ruby en algo que no fuera el hype de Rails.
Realmente el problema es sencillito. Pero la experiencia es harto interesante. De inicio conseguir ayuda.
ri
es terriblemente práctico. Respuestas concisas, precisas y macizas. Luego la experiencia iterativa e interactiva. Vas ejecutando, encontrando errores y corrigiendo (al menos a este nivel de experiencia) lo cual es altamente ¿didáctico?. Aparece un error y corres a ri
para confirmar si lo que quisiste hacer se puede. Te das cuenta del error, corriges y va de nuez.Si bien existen pruebas unitarias, es un punto que lo veo más asociado a desarrollo de aplicaciones. En este momento no veo que tanta utilidad pudieran tener para los scripts de administración.
Fue padre. Si, lo acepto. Me tardé más tiempo de lo que requiere la tarea pero valió la pena. Voy a buscar la manera de hacerlo más seguido. De hecho, voy a solicitar que instalen Ruby en los Solaris. A ver si no se me paniquean. :D
Finito.
jueves, junio 28, 2007
Comunidad .NET Edición Junio
Arrancó Raúl Guerrero con una introducción a Windows Communication Foundation, uno de los nuevos API's de .NET 3.0. El concepto detrás de WCF es realmente interesante. La unificación de tecnologías de integración bajo una misma API es para mi apreciación un mega-hit. Como es costumbre de Raúl llevó la presentación con una buena porción de código.
A continuación estuvo Juan José Karam que entró al detalle con .NET Remoting. Es obvio que lo suyo, lo suyo, lo suyo... quién sabe que sea, pero .NET Remoting lo maneja rete-chido.
El siguiente en la lista era Octavio Télis pero cambió su presentación por un agradable rato de intercambio de comentarios sobre tecnologías Microsoft, estrategias y se enriqueció con la participación de Arturo Garrido.
Finalmente nos retiramos de las instalaciones de InterSoftware pero en la salida del WTC nos aventamos otra "platicada/debrayada" sobre los más variados temas, principalmente el rol del arquitecto, project leader, project manager y lo comparamos de una manera extremadamente "light" contra la realidad. Karam estaba harto inspirado, de hecho alguien sugirió grabar un podcast comunitario sobre el tema. Sería estupendo.
Esta ha sido hasta la fecha la mejor reunión. Vamos por más.
Finito.
martes, junio 26, 2007
PartnerApi Library: Por fin ve la luz
El objetivo que se me presentó en mi mente fue crear una biblioteca que simplificara el uso de esta PartnerApi y pues después de mmuuuucho tiempo aquí está.
Acabo de publicar el código, licenciado bajo LGPL, para que todo mundo lo revise, lo use y ojalá y contribuya a este proyecto.
Cualquier comentario, sugerencia o pregunta son bienvenidas.
Finito.
jueves, junio 21, 2007
Solsticio de Verano
El 21 de junio es tu cumpleaños. El Solsticio de Verano.
Sigo enamorado del recuerdo, de tiempos añejos, tardes tibias en medio del pasto reseco y yermo.
Quedaste impresa en mi persona. Sin tí no sería el mismo. Aún y cuando tomamos caminos distintos no he conseguido dejar de extrañarte en mis momentos de soledad, confusión, esperanza y desesperanza. Te convertiste en una tabla de salvación de la que me sujeté más de una vez en medio de una madrugada de soledad e incertidumbre.
Jamás me atreví a buscarte. Siempre he tenido miedo de enfrentar el presente contra todos mis sueños inconclusos. Siempre he deseado que seas féliz, féliz, féliz. Que construyas y vivas tus sueños. Que las dificultades las dejes atrás. Que vivas cada día con la satisfacción de vivir incluso las cosas cotidianas.
Féliz cumpleaños Ara.
Finito.
Próximas mudanzas
De hecho hoy empecé con la PC de la ofi. Digo, echando a perder se aprende. Es una máquina con arquitectura AMD64/EMT64, bastante interesante el caso. El ejercicio anterior de instalar Gentoo lo hice en una máquina virtual y solo llegué a conseguir un mugroso prompt. En esta ocasión tengo que llegar más lejos. No puede faltar en mi escritorio (de inicio un escritorio gráfico) reproductores de video y audio, un navegador que soporte flash y applets java, editores de audio (ya casi, ya casi sale el primer podcast), herramientas de captura de video (ya casi, ya casi sale el primer screencast), herramientas de desarrollo y demás chunches que se me ocurran.
Como estuve colgado de la pichurrienta red para descargar el stage3 (115MB) y la lap se quedó en casa, empecé a navegar con una PowerMac G4 que me emprestaron dizque pa'compilar Mono :O. Lenta la máquina por que no es de las más recientes. El Safari: insoportable. Simplemente no me pude conectar a leer mi correo en GMail (santo sr google). Tiene Netscape pero fue peor. En uno de esos arrebatos de histeria, me acordé del CD que estaba en el cajón, domidito. Ubuntu 6.06 LTS para Mac. :O
El primer pex fue conseguir insertar el CD en el drive. Control + Opción + O + F para abrir una sesión de Open Firmware :S. Reiniciar, presionar C para que arranque del CD y zzz ZZZ zzz ... esperar. Después de un ratín un escritorio hecho y derecho. FF 1.5. No problemas. GMail rulz.
Me encantó la experiencia de no mismatch impedance al usar Ubuntu en la Mac. Simple. Fácil. Lento :P. Pero me sigue el sabor en la boca de lo maravilloso que es usar "lo mismo" en otra máquina completamente distinta: PowerPC, Mac, etc, etc, etc.
Regresando al Gentoo, lo único que me ha detenido de instalarlo en mi lap es el soporte no nativo de WiFi. "shiale, este w no lee ni el sensacional de luchas" pensarán algunos gurús de Gentoo. Sip, me quedé muy acostumbrado al modo usuario de Ubuntu ¿Y?. Pa'que vean que si leo, me estoy aventando el Handbook. Algo he de aprender. Una vez lista la PC de la ofi, le caigo a mi lap.
Otra cosa que estuve repensando es la planeación de las particiones. En algún sitio encontré la recomendación de crear una partición separada para /home. En este momento me alegró de haber hecho caso. Voy a instalar una distro distinta y no voy a perder nada de mis archivos. También se me vino a la mente el caso de los servidores Solaris que tenemos y en los cuales se llega a saturar / poniendo en riesgo la estabilidad de los equipos. En una instalación de servidor seguramente se tiene que planear con más detalle la distribución de directorios, particiones y a lo mejor hasta de discos: que si /usr en el más rápido, que si /var en donde haya más espacio, que si /home donde sea...
Pues, sigo con mudanzas. Proyectos por desarrollar y sueños por perseguir.
Finito.
domingo, junio 10, 2007
Otras formas de innovación
¿Cuántas veces se ha utilizado Google Earth para buscar monumentos, la casa de tu novia o una dirección? Peor aún ¿cuántas veces no se ha usado para buscar gente desnuda tomando el sol en el patio de su casa?. Puede ser divertido pero definitivamente es un desperdicio de tecnología.
Pues bien, Scott publicó un post sobre como utilizar Google Earth o Virtual Earth para visualizar un nuevo fraccionamiento.
Lo interesante de esto es que son herramientas que están al alcance de cualquier persona. No necesitas ser un mega-dooper-super experto en AutoCAD o cosa similar (claro, el resultado tampoco es igual), simplemente con unas pocas herramientas en tu PC casera consigues el resultado.
Eso también es innovación. Los mexicanos nos preciamos mucho de ser ocurrentes, tal vez alguien acá de este lado de la frontera tuvo la misma ocurrencia. Pero al no compartir ese conocimiento cualquier otro que sí lo hace se convierte en innovador por ese simple hecho.
Estamos muy acostumbrados a construir nichos y compartir un poquito de conocimiento con otros para convertirlos en nuestros aliados. Armamos batallas de escritorio para tirar los nichos de otros. Negociamos con el conocimiento como con cualquier baratija.
Entonces ¡compártamos nuestro conocimiento! Una de las bellezas del software libre es ese ambiente de compartir, de buscar a quién ofrecerle (sin ningún interés por detrás) lo último que construimos, de pedir opinión a otros para mejorar, de mirar en el trabajo del vecino para buscar una segunda opinión sobre lo que estamos haciendo.
Busquemos compartir en lugar de aislar. Tratar el conocimiento, simple o formalizado, con el valor que se merece. Tratemos a los demás como compañeros de creación.
Finito.
viernes, junio 08, 2007
Pruebas tontas...
The Everything Test
There are many different types of tests on the internet today. Personality tests, purity tests, stereotype tests, political tests. But now, there is one test to rule them all.Traditionally, online tests would ask certain questions about your musical tastes or clothing for a stereotype, your experiences for a purity test, or deep questions for a personality test.We're turning that upside down - all the questions affect all the results, and we've got some innovative results too! Enjoy :-)
|
|
|
Politics Your political views would best be described as Socialist, whom you agree with around 50% of the time. | Socioeconomic Your attitude toward life best associates you with . You make more than 78% of those who have taken this test, and 19% less than the U.S. average. |
If your life was a movie, it would be rated PG-13. By the way, your hottness rank is 40%, hotter than 5% of other test takers. |
TAKE THE TEST
brought to you by thatsurveysite
La parte en la que no estoy de acuerdo es la que dice: more concerned about others than concerned about self, me considero totalmente egoísta.
De cualquier manera, los resultados son ... ¿curiosos?
Finito.
martes, junio 05, 2007
FONASOL: Pendiente
Definitivamente es una historia para contar por episodios. No se desconecten.
Finito.
viernes, mayo 25, 2007
Último Ruby on Rails vs. PHP
Cada vez que alguien conoce Rails se entusiasma de manera increíble. Es que Rails realmente es increíble. Te deja con una sensación de productividad como si te hubieras metido no sé que cosa. Desarrollas rápido, no importan los cambios, el 90% de las veces los consigues cambiando archivos de configuración, te concentras en otorgar valor en el marco del negocio y no en el de la tecnología.
Sin embargo, casos como Twitter demuestran que no todo es miel sobre hojuelas. Menciono Twitter por que es el caso más conocido y que además uso regularmente :D. Además de la serie de posts del mismo DHH y el equipo Twitter, las extensiones a estos posts (tipo programa de notas faranduleras) en las que ponen a DHH como un ególatra energúmeno sabelotodo que lo único que hace es regañar a los desarrolladores de Twitter.
Sea cual fuere la razón Rails en Twitter fue y es rebasado. Y si miran el modelo, es terriblemente simple. ¿Significa esto que Rails no vale la pena? ¿Qué no tiene el solicitado status de nivel empresarial? Para mí significa que igual que con cualquier tecnología, la solución está de nuestro lado: desarrolladores, arquitectos, hw-junkies y demás. No hubo, no hay ni habrá tecnología que llegué a sustituir al 100% las capacidades humanas. Cuando menos no durante lo que yo viva.
Entonces, no importa que Twitter falle. Agarren Rails y cójanle cariño. Vayan probando hasta donde pueden estirar la liga de la suerte. Estirenla tan fuerte que se rompa y entonces aflojen un poquito. Esa será la medida correcta (¡Gracias Jeff!).
Después de este choro viene la diversión.
Finito.
jueves, mayo 24, 2007
La culpa no la tiene el servicio sino el que lo hace Web Service
Resulta que los web services que expone ECE se definen en el correspondiente WSDL de la sigte manera:
<s:element name="CargaReferencia">
<s:complextype>
<s:sequence>
<s:element minoccurs="0" maxoccurs="1" name="docHL7Referencia">
<s:complextype mixed="true">
<s:sequence>
<s:any/>
</s:sequence>
</s:complextype>
</s:element>
</s:sequence>
</s:complextype>
</s:element>
Y del otro lado se tiene
<s:element name="procesaOci">
<s:complexType>
<s:sequence>
<s:any/>
</s:sequence>
</s:complexType>
</s:element>
Es decir. Técnicamente reciben cualquier cosa (<s:any/>).
Hace un poco más de un año, se realizó una junta para evaluar una propuesta de arquitectura para los servicios del ECE. Lo curioso es que pasado el tiempo siguen en las mismas.
¿pa'qué definir un contrato? Le pasamos cualquier cosa. ¿pa'qué validar contra un esquema? La validación la hacemos con un flujo o mejor aún: tirando código (que se factura por hora). No tiene ningún caso desacoplar, incluso cuando existen appliances para validar esquemas.
El chiste del outsourcing es quemar horas reinventando el hilo negro, divagando en arquitecturas y pelearse entre sí.
En fin, la culpa no la tiene el servicio.
Finito.
lunes, mayo 21, 2007
Oye Karacas
cuando sientas tu voz sollozar
cuenta conmigo.
(de una canción de Carlos Puebla)
usted sabe
que puede contar conmigo,
no hasta dos ni hasta diez
sino contar conmigo.
Si algunas veces
advierte
que la miro a los ojos,
y una veta de amor
reconoce en los míos,
no alerte sus fusiles
ni piense que deliro;
a pesar de la veta,
o tal vez porque existe,
usted puede contar
conmigo.
Si otras veces
me encuentra
huraño sin motivo,
no piense que es flojera
igual puede contar conmigo.
Pero hagamos un trato:
yo quisiera contar con usted,
es tan lindo
saber que usted existe,
uno se siente vivo;
y cuando digo esto
quiero decir contar
aunque sea hasta dos,
aunque sea hasta cinco.
No ya para que acuda
presurosa en mi auxilio,
sino para saber
a ciencia cierta
que usted sabe que puede
contar conmigo.
¿Aceptas el trato?
domingo, mayo 20, 2007
Ruby on Rails vs. PHP
Finito.
viernes, mayo 18, 2007
Scott Hanselman's Computer Zen - Twittering my Diabetes
Lo empecé a leer por el aspecto de tecnología y después por sus experiencias como padre. Hubo un momento en que leí sobre su condición de diabético Tipo I. Entonces me quedé extremadamente sorprendido. Muchas personas en su condición han destruido su vida, tengo un familiar cercano que así lo hizo. Sin embargo Scott es un lider en muchos aspectos y es un modelo de padre y esposo a seguir.
Me motiva leerlo y ver la lucha en la que se ha embarcado contra la diabetes. En esta ocasión aprovecha el fenomeno twitter para compartir sus experiencias como diabético. Lo estaremos siguiendo.
Finito.
martes, mayo 15, 2007
Ruby vs. PHP: Sigue la mata dando
Finito.
Habemus Mono
Entre las novedades más notables encontramos:
- Más de 1,000 métodos agregados y/o actualizados
- Soporte completo de ASP.NET 2.0 (bueno... casi... los Web Parts siguen pendientes pero ¿a quién le importa?)
- Mejoras en el desempeño de ASP.NET
- Inicios de la implementación de C# 3.0
- Mono en Solaris/AMD64
- Y varios items más
Finito.
lunes, mayo 14, 2007
Ruby vs. Java Parte II
Finito.
De nuevo con lo mismo: Patentes
El primer punto que me viene a la cabeza es la posición de desventaja que está empezando a mostrar Microsoft. A mi parecer, no es más que el resultado de no encontrar maneras de contrarestar la pérdida de posición que está sufriendo. Anteriormente comenté que los movimientos que está haciendo para entrar en otros mercados, más que una diversificación, demuestran que ya no es posible sustentar el modelo que los vino a hacer millonarios: el software propietario. Finalmente son una empresa y siendo pública tienen que otorgar dividendos. Ya no tienen mucho de donde sacarlos.
La siguiente idea es la válidez de las patentes. ¿Realmente sigue siendo válido este modelo? Cuando vemos que grandes y pequeñas empresas hacen valer su propiedad sobre las ideas, por más abstracta, sencilla y simple me pregunto: ¿Dónde va terminar esto? ¿Ya nadie va ser capaz de idear algo sin violar una patente? Existen casos donde podrá cuestionarse menos el modelo, la industria farmacéutica por ejemplo. Si no tienen el aliciente de explotar durante varios años una patente ¿qué los motivaría a inventar nuevos medicamentos? Pero en la industria del software ¿Por qué es válido patentar el algoritmo que hace que una sección de la pantalla parpadeé? ¿No es algo de total y simple sentido común?. La idea de un conjunto de componentes para generar páginas web ¿no es demasiado abstracta o genérica como para reclamarla como propia? No desconozco el derecho de la autoría, reclamo cancelar el derecho de la exclusividad.
Definitivamente urge una revisión profunda y real de este modelo.
Finito.
miércoles, mayo 09, 2007
Entre servicios te veas
Exito: 0
Código Error: 100
Desc. Error: mx.gob.imss.sigoi.quejaVerbal.exception.ValidaCampoException:
El campo Calidad de la persona que se comunica es requerido.
El campo Nombre de la persona que se comunica es requerido.
El campo Apellido paterno de la persona que se comunica es requerido.
El campo Lada de teléfono particular de la persona que se comunica tiene que ser numérico.
El campo Lada de teléfono particular de la persona que se comunica tiene una longitud no valida, menor a 2 Caracteres
El campo Teléfono particular de la persona que se comunica tiene que ser numérico.
El campo Teléfono particular de la persona que se comunica tiene una longitud no valida, menor a 8 Caracteres
El campo Teléfono celular de la persona que se comunica tiene que ser numérico.
El campo Teléfono celular de la persona que se comunica tiene una longitud no valida, menor a 12 Caracteres
El campo Correo electrónico de la persona que se comunica no tiene un formato adecuado
Se tiene que incluir al menos un medio de contacto valido de la persona que se
comunica: Lada y número de teléfono particular, número de teléfono celular, correo electrónico, o dirección completa
Es necesario capturar el NSS de la persona que se comunica
Es necesario capturar el NSS de la persona que solicita el servicio
El campo Calidad de la persona que solicita el servicio es requerido.
El campo Teléfono celular del usuario que solicita el servicio tiene que ser numérico.
El campo Teléfono celular del usuario que solicita el servicio tiene una longitud no valida, menor a 12 Caracteres
El campo Entidad federativa del usuario que solicita el servicio tiene que ser numérico.
El campo Entidad federativa del usuario que solicita el servicio no es un valor válido de catálogo
El campo Clasificación de la solicitud del planteamiento tiene que ser numérico.
El campo Clasificación de la solicitud del planteamiento no es un valor válido de catálogo
El campo Tema del planteamiento tiene que ser numérico.
El campo Tema del planteamiento no es un valor válido de catálogo
El campo Subtema del planteamiento tiene que ser numérico.
El campo Subtema del planteamiento no es un valor válido de catálogo
El campo Delegación de Adscripción del planteamiento no es un valor válido de catálogo
El campo Unidad Medica de Adscripción del planteamiento tiene que ser numérico.
El campo Unidad Medica de Adscripción del planteamiento no es un valor válido de catálogo
El campo Delegación o UMAE involucrada en la gestión o queja del planteamiento tiene que ser numérico.
El campo Delegación o UMAE involucrada en la gestión o queja del planteamiento no es un valor válido de catálogo
El campo Subdeleación y/o Unidad involucrada en la gestión o queja del planteamiento tiene que ser numérico.
El campo Subdeleación y/o Unidad involucrada en la gestión o queja del planteamiento no es un valor válido de catálogo
¿Qué tiene de malo? (aparte de algunas faltas de ortografía) Son dos servicios que están intercambiando mensajes entre sí. No tienen interacción con el usuario, así que este tipo de mensajes, descriptivos y detallados, son completamente desaprovechados en este contexto.
Entonces ¿cuál es el modo correcto de devolver errores en este caso? No sé cual sea el modo correcto. Lo que a mi me gusta es el estilo de AppExchange Web Service API.
AppExchange (anteriormente conocida como Salesforce) es una empresa que ofrece software as a service (SaaS), en particular un CRM que compite directamente contra los grandes: Siebel, SAP y otros. Les ha ganado una gran tajada del mercado y sigue abriendo áreas de oportunidad. La API que comento la ofrecen mediante servicios web y tiene la funcionalidad de agregar, actualizar, borrar y buscar items de su mega repositorio de datos.
Así, en esas operaciones obviamente se envían y devuelven resultados en un contexto de integración de servicios. ¿Cómo le hacen? Va la referencia del API:
SaveResult[] = sfdc.create(sObject[] sObjects);
Tenemos la llamada create que recibe un arreglo de sObjects (tipo nativo de AppExchange) y como resultado devuelve un arreglo de objetos SaveResult. Ahora veamos SaveResult:
private Error[] errorsField;
private string idField;
private bool successField;
Nos devuelve un objeto con el identificador único (idField), una bandera de éxito o fracaso (successField) y un arreglo de objetos Error, igualmente veamos:
private string[] fieldsField;
private string messageField;
private StatusCode statusCodeField;
En fieldsField tenemos el o los nombres de los campos que provocaron el error; messageField es el texto descriptivo del error y finalmente statusCodeField que es el código que identifica el error dentro de un catálogo disponible en el WSDL del servicio.
Si bien tenemos un texto descriptivo, tenemos otras referencias (statusCodeField, successField) que nos permiten atender el problema y darle solución dentro de un contexto de integración.
A mi parecer es la falta de comprensión de los escenarios en los que se trabaja lo que provoca este tipo de diseños. Ya se requiere cambiar el modelo y empezar a modelar servicios. En algún momento habrá un servicio que se encargue de interactuar con el usuario y habrá que darle la suficiente información para que resuelva los problemas que lleguen a aparecer.
Por eso, entre servicios te veas, comportate como un servicio.
Finito.