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

lunes, noviembre 19, 2007

Configuración de Rails y SQL Server

La naturaleza multiplataforma de Ruby On Rails nos demanda adecuarnos a todos los ambientes de ejecución disponibles aún y cuando estos no sigan la filosofía del software libre.

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.

jueves, mayo 24, 2007

La culpa no la tiene el servicio sino el que lo hace Web Service

Hace un par de días hubo una acalorada discusión en relación a un proceso de integración entre dos sistemas: el expediente clínico electónico (ECE) y el sistema que se encarga de administrar a los usuarios de los diversos servicios de centros deportivos y sociales.

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.

miércoles, mayo 09, 2007

Entre servicios te veas

En una prueba de integración entre una aplicación .NET y otra desarrollada en Java nos apareció este mensaje:

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.

viernes, abril 27, 2007

2° Congreso Universitario en TICs - UAEH

Pues el miércoles fue la fecha. Avanzaba el calendario y simplemente no veía llegar el 25. Y finalmente llegó.

Para llegar hubo que dar una vuelta harto curiosa. De la hermana república de Coacalco al paradero del metro de Indios Verdes, la terminal ADO y el autobús a la Bella Airosa. Un viaje tranquilo en el cual tuve el chance de leer un artículo de Juval Lowy sobre lo es al fin y al cabo el patrón Correlation Identifier implementado con WCF.

Finalmente llegué a la terminal de autobuses y ya me estaba esperando Heriberto García Islas, amigo del Tuzo y organizador del Congreso. Nos fuimos a la UAEH y me presentó con algunas autoridades de la uni, me instaló en su cubículo y esperando el inicio de las conferencias me dediqué a dar el rol por el campus.

Había un ambiente muy festivo, caminando me encontré con un concurso de canto y otro de vencidas :P. Había partidos deportivos y un bonche de chavos que iban y venían. Llegué hasta el Polideportivo y me quede contemplando un rato la vista.

El reloj marcó la hora y me regresé para asistir a la conferencia del Dr. Antonio Quiróz acerca de la formalización del modelo Watson-Creek del ADN. Es increíble la forma tan natural y sencilla de hablar de temas tan especializados y conseguir ese link con la audiencia tan jovén (excepto yo). Entre anécdotas personales y de la historia de la ciencia nos dió una introducción a la investigación del ADN y la participación de varios científicos mexicanos, incluido él mismo en análisis, planteamientos y respuestas. Realmente es un personaje.

Al terminar su ponencia, seguía mi turno en otra sala del campus y sin más me dirigí para prepararme. Conectar el proyector a la lap, arrancar, poner la presentación y después de la introducción sobre mi persona empezar. Agregué algunas láminas para esta ocasión y fui platicando sobre el tema Introducción al Proyecto Mono. Finalmente llegué al punto de los demos y los primeros que son los que realizo sobre Windows fluyeron sin complicación, pero al reiniciar la máquina para mostrar los demos en Linux ¿qué creen que pasó?

Sip. Una vez más. ¡torpe, torpe, torpe! No se proyecto nada de nada. No saben como odio eso. La próxima vez, que será en el FONASOL a finales de mayo, primero voy a probar si consigue proyectar desde Linux y voy armar una máquina virtual con Windows para hacer las demos y si no funciona con Linux en Windows voy a tener una máquina virtual con Linux. En fin. Esta vez no hubo muchas preguntas y de nuevo insisto en que si hay comentarios me los hagan llegar. Al final tuve el gusto de conocer a un par de chavos entusiastas del software libre: Darío Navarro Rosales y a David Hernández Pérez, quienes son miembros del GULEH y conocidos de Iver y Akin0, .

Después, Heriberto tuvo el detalle de invitar la comida, pero desgraciadamente su función de organizador le impidió acompañarnos y me senté a comer y platicar con Darío y David. Bueno, medio platicar ya que en ese rato se estaba instalando la Orquesta Sinfónica de UAEH para ofrecer algunas piezas. Terminamos un poco antes de iniciar el concierto y nos acomodamos para escucharlo. Piezas sencillas que encontré en mis recuerdos de cuando miraba las caricaturas en la tele los sábados por la mañana.

No hay nada como la música viva y este caso no fue la excepción. Realmente lo disfruté bastante, sobre todo cuando el director invitó a alguien del público que pasará a dirigir la orquesta y Heriberto saltó como resorte. Un momento muy divertido.

Bueno, fue un día excelente gracias a la gente de la UAEH, empezando por Heriberto por darnos la oportunidad de participar en el Congreso, por conocer al Dr. Quiroz, fue muy, muy emocionante y motivante y por ver chavos clavados con el software libre. Muchas gracias a todos.

Finito.

miércoles, abril 04, 2007

Parche para un parche

Ya había dejado pasar bastante tiempo para postear de nuevo, pero hoy me sucedió lo que nunca me había pasado antes: ser víctima de las actualizaciones de Microsoft.

El lunes o la semana pasada actualice religiosamente mi PC de la ofi con el servicio de Microsoft Update que me enjaretó un par de actualizaciones de segurida'.

Pus el chiste es que la instalé, pero como he estado en curso (zzzZZZzzzzZZZ) no había encendido hasta hoy y me apareció el infame error del panel de control de Realtek.

Como por pura casualidad, al leer mis feeds me encontré con uno que se refería a este problema supe de inmediato que hacer de lo contrario ya estaría reinstalando el software de la tarjeta de audio.

En fin, un caso más del parche sobre parche.

En otro orden de ideas, voy a estar de vacaciones a partir de mañana (técnicamente desde el siguiente lunes) asi que si había retrasado mis posts, yo creo que me aventaré una semana más sin postear. Pero, pueden seguir las ideas del Tuzo en Integración a la Mexicana, que está harto interesante. ¡Caliente!

¡Felices Pascuas!

Finito.

lunes, febrero 19, 2007

CONSOL 2007: Fin

El viernes pasado tocó a Gustavo exponer sobre integración de software con SL. Estuvo trabajando muy duro con la presentación y con los ejemplos durante los dias anteriores y finalmente llegó el momento.

Me tocó asistirlo en la presentación, con las láminas y con los ejemplos que se usaron. Hubo un momento que me trabé, tuve un lapsus brutus de varios segundos, Gus saltó al teclado y conseguimos continuar con la exposición :P

Al final, me queda resumir lo que ha sido este CONSOL.

Poquito. Me hubiera gustado estar al menos un día completo.
Emocionante.
Desorganizado :( El viernes tuvimos que esperar cerca de 40 mins por el expositor anterior inició más tarde de lo planeado. Algunos voluntarios tenían enormes dudas de como reaccionar a estos imprevistos. Costo algo de trabajo llegar a algunos auditorios y... ya. Nada más.

Finito.

lunes, diciembre 04, 2006

Una API para comunicar a todos

Windows Communication Foundation (WCF) es una interesante plataforma de integración. Consolida varias de las tecnologías disponibles en Windows de MOM (Message Oriented Middleware) en una sola API.

En el proyecto Mono existe el subproyecto Olive cuyo objetivo es conseguir una implementación de las API's de WinFX/.NET3 entre las que se incluyen WCF. Sin embargo considerando la no dependencia de plataforma inherente a Mono, se ha dejado fuera el soporte a MSMQ. La razón es obvia: no existe fuera de Windows.

Sin embargo, el soporte de colas (queueing) es uno de los factores que consiguen soportar grandes volumenes de transacciones en ambientes empresariales. En lo particular creo que MSMQ ha sido desgraciadamente desaprovechado y prácticamente ignorado por varios arquitectos. Con WCF, se presenta de nuevo como una herramienta más a nuestro alcance y creo que también debe formar parte de Olive pero ¿cómo resolver la ausencia de MSMQ en otras plataformas?

De inicio pienso en ActiveMQ. Un proyecto Apache que también ha sido utilizado en algunos proyectos ESB Open Source. Una ventaja que recientemente ví es que funciona (al menos en la doc) en Windows y en Unixes. Igual y se puede pensar en IBM WSMQ que tiene el mismo soporte multiplataforma. La idea es entonces, construir una implementación abstracta de queueing para WCF y construir implementaciones especificas para diferentes productos. Y después integrar esto en Mono de manera que se complete el alcance de Olive.

Existe un pequeño inconveniente. Estoy en el proceso de aprender WCF :D. Esto implica que paso mucho tiempo en Windows para estar consultando la documentación en línea. Si bien también está disponible en MSDN, estoy limitado por la disponibilidad de una conexión a internet. El punto final es que voy a trabajar más tiempo en Windows y de ahí se deriva otro pequeño reto, la facilidad de compilar Mono en Windows.

La documentación que existe hace referencia a cygwin como "plataforma" para construir Mono en Windows. En el sitio de Paul Johnson existe una detallada guía para preparar el ambiente ya que requiere una combinación muy específica de versiones de las herramientas de construcción que realmente no he conseguido armar.

Pero bueno, los puntos a conseguir son los siguientes:

- Aprender WCF, particularmente los puntos de soporte a queueing.
- Aprender ActiveMQ y su binding con .NET
- Descubrir o crear el API para una integración genérica de WCF con productos de queueing.
- Llevar este código a Mono.
- Aprender a configurar un ambiente para compilar Mono en Windows.

Voy a abrir otro backpackit para darle seguimiento a este asunto.

Finito.