5.13.2016

Mapas en BizTalk: Obteniendo solo el primer registro de una colección

Uno de los problemas mas comunes que enfrentamos cuando desarrollamos en BizTalk se da cuando recibimos una colección de elementos, pero solo requerimos el primer elemento de la colección. Existen varias formas de obtener ese elemento, pero la forma mas sencilla de llevarlo a cabo es utilizando un mapa. En este post vamos a ver como solucionar este problema utilizando mapas en BizTalk.

El problema

En una aplicación BizTalk recibimos una colección de registros desde una base de datos y debemos procesar el primero registro únicamente. El mensaje recibido se presenta en la siguiente figura:


La Solución


Vamos a obtener el primer registro utilizando un mapeo y lo vamos a manera a otra estructura. En este caso la estructura destino es la que se muestra en la siguiente imagen.

Como se ve en la figura anterior, el esquema de persona espera únicamente una persona y requiere el nombre concatenado; es decir, el nombre debe de quedar como "Nombre Apellido1 Apellido2".
Para lograr esto vamos a utiilzar un mapa con una combinación de functoids que nos van a permitir obtener convertido el primero nodo. El mapa se puede ver en la siguiente figura:


Como se puede ver en la figura anterior, estamos utilizando un mapa con 4 tipos de functoids. Vamos a detallar cada uno de los functoids a continuación.

(1) Iteración

El primer functoid que vamos a utilizar es la iteración. Este functoid nos da el indice actual del registro en una operación cíclica iniciando el contador en 1. 

Para nuestro ejemplo, necesitamos procesar el registro cuando el indice que nos devuelve el functoid es igual a 1. 

(2) Equal

El segundo functoid nos permite hacer una comparación entre dos parámetros y nos retorna "true" si la comparación es verdadera o "false" si la comparación es falsa.

En nuestro caso, cuando el functoid de iteración nos retorna uno, entonces la condición será  verdadera, con lo cual vamos a proceder a copiar el valor en el nuevo nodo.


(3) Value Mapping (Flattening)

Este functoid copia registros de una estructura repetitiva a una estructura destino plana. En nuestro caso estamos copiando de una lista de personas a una única persona, esta acción se ejecuta si el primer parámetro que recibe el functoid es verdadero. 









La configuración de este functoid se ve en la siguiente figura. Como se ve en la figura, inicialmente se recibe el resultado del functoid "equal", si este es verdadero, entonces el valor de la concatenación del mapeo (nombre + apellido1 + apellido2) se copiara en la estructura destino.



Resultado

El resultado al aplicar el mapa al archivo mostrado al final del articulo se puede ver en la siguiente figura.



1.17.2016

Conceptos iniciales de MongoDB

Siguiendo con los post acerca de mongoDB - base de datos que aprovecharmos luego para utilizarla con nodejs en VSCode - en este post vamos a ver conceptos básicos de esta base de datos.
Documento:  MongoDB se basa en documentos. Un documento en MongoDB es la unidad basica de datos, muy similar al concepto de una fila (registro) en una base de datos relacional. Un documento consiste en un conjunto de parejas de valores en formato JSON y se guardan en disco en formato el formato de serialización BSON (JSON binario)
La estructura de un documento en MongoDB luce similar al presentado a continuación:
{
 campo1: valor1,
 campo2: valor2,
 ....
 ....
 campoN: valorN
}
Cada documento en MongoDB tiene un campo _id el cual es el primer campo en el documento. Este campo es único a la colección a la que pertenece y puede contener cualquier tipo de dato BSON excepto un arreglo. Si el documento se crea sin un campo _id MongoDB automáticamente agrega este campo como el primer elemento del documento y le asigna un valor ObjectId a este campo. Cada documento tiene un límite de 16MB es tamaño para cada documento esto para prevenir el uso excesivo de memoria RAM o ancho de banda.
Colecciones: es como una tabla en una base de datos relacional, pero no tiene un esquema definido. En una colección pueden existir documentos que no tengan la misma estructura ni el mismo propósito, por ejemplo:
{
 Nombre: "Ana",
 Apellido: "Barquero",
 Direccion: "Santa Cruz de la Sierra"
}
{
 NombreArticulo: "Bocinas BOSE",
 PrecioUSD: 102.99
} 
{
 NumeroFactura: "ABC12",
 Cliente: "Ana"
} 
En el registro anterior existen tres tipos de documentos y dos de ellos estan relacionados Cliente: Nombre y Factura:Cliente.
Las colecciones son creadas automáticamente cuando se agregan los documentos o puede crearse de forma manual utilizando el comando db.createCollection().
Base de Datos: Una base de datos en MongoDB es un conjunto de colecciones. Las bases de datos en MongoDB se crean por petición; es decir, no existe un comando para crear una base de datos; las mismas se crean cuando se selecciona la base de datos o cuando se inserta un documento.









1.14.2016

Integrando un app en iOS con Azure Mobile Services

Uno de los componentes más útiles dentro de la plataforma PaaS de Azure son los servicios móviles. Estos servicios nos permiten llevar a cabo una gran cantidad de tareas de forma sencilla desde aplicativos móviles tales como conexiones vía Azure Service Bus con "backends" "on premises" o asociar el app para recibir "push notifications" en el app desde un backend "on premises" que soporte conexiones al bus de azure - es decir, escrita en C#, Java, nodejs o phyton. Pero que sucede cuando ya tenemos un app desarrollada en iOS y queremos modificarla para que use los servicios móviles de Azure. En este post vamos a ver los pasos necesarios para poder integrar un app desarrollada en iOS con un servicio móvil de Azure.

Crear el servicio móvil

El primer paso es crear el servicio móvil en Azure - algo que vamos a obviar en este post - utilizando una cuenta de Azure - ya sea de prueba o empresarial. Una vez creado el servicio móvil procedemos a ir al parte inicial de la configuración del servicio y llevamos a cabo los siguientes pasos:

  1. Seleccionamos la plataforma iOS para poder descargar el proyecto de prueba - aunque no es necesario yo lo descargo para siempre usar la última versión del sdk de Azure para iOS.
  2. Luego seleccionamos el lenguaje de la aplicación que deseamos crear y luego le damos descargar - en este caso vamos a seleccionar Objective-C. Insisto, no es necesario descargar el proyecto de prueba pero se facilitan muchos las cosas llevándolo a cabo.
En la siguiente figura pueden ver lo descrito anteriormente.




Ahora vamos al folder donde se descargo el aplicativo demo y procedemos a buscar el componente del servicio móvil de azure, una vez localizado lo arrastramos al proyecto que queremos integrar con el servicio móvil. En la siguiente figura se puede ver el detalle de esta acción.



Ahora bien, tenemos que agregar una referencia a los encabezados de las librería de en el proyecto para poder acceder sus clases, métodos, etc. Para lograr esto vamos a ir al archivo AppDelegate.h y ahí procedemos a agregar en el encabezado tal y como se ve en la figura (1). Igualmente vamos a crear una propiedad para tener acceso a una instancia del cliente de Azure el cual vamos a conectar con el servicio móvil para poder acceder métodos y tipos desde la instancia del componente - Figura (2)


Ahora vamos a proceder a agregar el código para conectarnos al servicio móvil. Como se ve en la siguiente figura, vamos a utilizar el método clietWithApplicationURLString de la clase MSClient y en ella vamos a indicar el URL del servicio móvil generado y la llave del servicio. Estos datos se pueden obtener de la página principal del servicio.

Luego de agregar el código de la conexión compilamos el proyecto y procedemos a programar contra los servicios y métodos que tenemos expuestos en el servicio móvil.

12.28.2015

Qué es Docker? - Introducción a los contenedores

Los contenedores representan el siguiente paso en el "deployment" de aplicaciones a nivel de infraestructura. En este post vamos a definir lo que es un contenedor, cuales son sus ventajas y en entradas posteriores vamos a ver como usarlo en Linux, Mac y Windows. Al final de esta serie, vamos a utilizar VSCode para desarrollar un aplicativo utilizando node.js y mongoDb.

Un poco de historia

Para entender los contenedores, debemos hacer un poco de historia acerca de como se ejecutaban las aplicaciones hace unos pocos años atrás. Es importante destacar que todo es acerca de "las aplicaciones", y en realidad el sistema operativo existe para facilitar la ejecución de las aplicaciones. 
Hasta hace poco tiempo atrás ocupábamos servidores físicos para ejecutar nuestras aplicaciones, y en la mayoría de los casos cuando teníamos que pedir un servidor debíamos esperar semanas e incluso meses para obtenerlo; aun mas, como el hardware era costoso de adquirir y almacenar, ejecutábamos varias aplicaciones en el mismo servidor violentando el principio de aislamiento de las aplicaciones.

La virtualización

Este desperdicio de recursos y problemas que se generan por ejecutar varias aplicaciones en un mismo servidor se corrigió con la llegada de las máquinas virtuales. La creación de varias máquinas en un solo hardware nos dio la posibilidad de optimizar el uso de los servidores que se adquirían permitiéndonos asilar las aplicaciones unas de las otras tal y como se ve en la siguiente figura.



Sin embargo, no todo fue positivo con el tema de la virtualización ya que las máquinas virtuales empezaron a aparecer de forma descontrolada. Además, el modelo de máquinas virtuales es un modelo que apunta más hacia el sistema operativo que hacia el aplicativo en sí, ya que para cada máquina virtual se requiere tener instalado un sistema operativo que en el caso de Windows requiere licencia, requiere recursos de hardware para ejecutar este sistema operativo tales como memoria, disco y CPU aunque en realidad su verdadero uso sea muy limitado - a nivel de sistema operativo. En resumen digamos que el impuesto a pagar por el uso de máquinas virtuales es bastante alto y cuando los impuestos son altos, los ciudadanos se mudan.

Los contenedores

Pero el escenario de las máquinas virtuales no podía seguir así y aparecieron los contenedores. Un contenedor es un ambiente de ejecución de aplicaciones, los cuales son mucho más livianos que una máquina virtual, porque no requieren crear toda la máquina virtual para crear un ambiente aislado de ejecución, sino que solamente se crea un contenedor similar a una máquina virtual, que se comporta como una máquina aislada pero que comparte sus recursos tales como CPU y memoria del servidor con los demás contenedores. La siguiente figura nos muestra mejor como funciona un contenedor.


Como se ve en la figura anterior, los contenedores comparten el mismo sistema operativo y los mismo recursos del sistema operativo pero se ejecutan de manera aislada. Cada contenedor tiene sus propio sistema de archivos, pool de procesos, etc; sin embargo, comparten el sistema operativo, la memoria donde se ejecutan los contenedores, etc.
En un escenario hipotético de comparación de consumo de recursos entre una máquina virtual y un contenedor supongamos que cada OS que se utiliza en la máquina virtual ocupa para ejecutar el sistema operativo 10 gigas de disco duro,  4 Gigas de RAM y 5% del CPU; si queremos 10 máquinas virtuales ocuparíamos 100 Gigas de disco duro 40 Gigas de RAM y 50% del CPU lo que sería muy considerable, mientras que con el contenedor todos esos recursos no se requerirían.
En el siguiente post vamos a trabajar con Docker, el software que ha cambiado la forma en que ejecutamos nuestras aplicaciones.


12.24.2015

Iniciando con mongoDB en Ubuntu - VSCode

Iniciando con una serie de posts acerca del uso de VSCode en linux y Mac, decidí utilizar MongoDb como repositorio para hacer los demos que tengo planeados. En este post vamos a ver algunos comandos basicos para verificar que mongo este funcionando correctamente en ubuntu (en post posteriores lo veremos en mac). El primero paso es instalar mongodb el cual se puede ver en la siguiente figura.


Para verificar que mongodb esta bien instalado procedemos a verificar la versión de mongodb que se esta ejecutando con el siguiente comando:



Como se ve en la figura anterior, tengo instalada la versión 4.2.9.
Si se desea ver el estado del proceso de mongodb procedemos a ejecutar el siguiente comando:
Este comando nos indica si el proceso de mongodb se esta ejecutando y nos indica cual es el processid del mismo.
Por último, si se desea saber sobre cuales puertos esta esuchando mongodb, podemos proceder con el siguiente comando:

Como podemos ver en la figura anterior esta esuchando en el 27017 y en el 28017




9.13.2015

Obtener los servicios detenidos usando PowerShell

Desarrollando un aplicativo móvil que interactúa remotamente con algunas máquinas ejecutando Windows, me vi en la necesidad de buscar un comando PowerShell para obtener los servicios de las máquinas Windows que se encuentran detenidas. En este post vamos a ver como llevar a cabo esta tarea en PowerShell y como exportarlo a un archivo CSV.

El comando básico

El CmdLet para obtener los servicios de Windows se sumamente sencilla (como casi todo en PowerShell ). Ejecutando el comando get-service vamos a obtener la lista completa de servicios del sistema operativo, tal y como se ve en la siguiente pantalla.

image

Obtener los servicios que están detenidos

Ahora, para obtener los servicios que están detenidos, modificamos los parámetros del CmdLet de la siguiente forma:

image

En este caso utilizamos el filtro where-object el cual me permite filtrar los objetos que se pasan antes del “pipe” con el criterio a la derecha del filtro.

Exportar los resultados a un archivo CSV

Ahora bien, si queremos persistir la respuesta del comando escrito anteriormente debemos modificar el comando para que exporte los resultados a un archivo CSV – tal y como lo definimos a la hora de iniciar el post. El comando modificado se puede ver en la siguiente figura.

image

En este caso, utilizamos el el comando Export-CSV y le indicamos donde queremos el resultado. El archivo con el resultado de la ejecución del comando resulta un poco difícil de leer tal y como se ve en la siguiente figura.

image

Para hacerlo más legible, vamos a seleccionar las columnas que nos interesan del resultado para lo cual ejecutamos el mismo comando pero con las columnas deseadas como parámetro del comando, utilizando el CmdLet Select-Object.

image

El resultado lo podemos ver en la siguiente figura.

image

Etiquetas de Technorati: ,

9.04.2015

Criterios de aceptación en una historia de usuario – Seguridad y validaciones

Cuando se escriben historias de usuario se deben de incluir los criterios de aceptación de estas historias de usuario. En estos criterios de aceptación debe de ir una descripción detallada de lo que se espera que hagan las características esperadas en la historia de usuario.  Sin embargo; es muy común que en estos criterios de aceptación olvidemos agregar lo relacionado con seguridad y con validaciones (conceptos totalmente diferentes). Aunque no todas las historias de usuario van a tener necesariamente consideraciones de seguridad o validación, se debe considerar el tema cada vez que se están escribiendo para que el desarrollador las tome en cuenta a la hora de implementar la historia. La siguiente es una lista de categorías que se pueden tomar en cuenta a la hora de escribir las historias de usuario.

Criptografía

Es importante definir si alguna característica de las que se va a implementar en la historia de usuario debe de llevar encriptación. En este tema es importante no ponerse a inventar la rueda y utilizar algoritmos probados que ya existen y que cumplen con todas las medidas de seguridad requeridas por la empresa que usará el software. Igual de importante es utilizar librerías de empresas reconocidas para no poner en riesgo el ítem a desarrollador. También es importante definir cuales características deben de estar encriptadas y cuales no, porque como todo en el mundo de la informática tiene su penalidad, y a mayor seguridad menor desempeño – hay que encriptar, transportar y desencriptar para poder hacer  que la transacción trabaje correctamente.

Validación de ingreso de datos

Es importante verificar si los datos que ingresan – por pantalla, a través de un servicio, etc. – estén correctos ya que esto atenta no solo contra la estabilidad del sistema sino también contra la seguridad del mismo ( a través de ataques de SQL Injection o en sitios web usando cross site scripting ). Debemos establecer que datos se deben validar en la historia de usuario.

Autenticación y Autorización

La funcionalidad a desarrollar debe de tener de forma explícita si requiere de autenticación y/o autorización; y si requiere autorización cuales grupos funcionales deberían tener acceso a la característica. Esto evita que los desarrolladores desarrollen servicios, componentes, y componentes de UI totalmente abiertos esperando que alguna otra persona los asegure, poniendo en riesgo la seguridad del ítem a desarrollar y por ende, el sistema completo.

Etiquetas de Technorati: ,,

8.13.2015

No puedo ejecutar scripts de PowerShell

Escribiendo un post acerca de como acceder el Visual Studio Online me topé con este error en Windows 10.

No se puede ejecutar el script “ps1” porque la ejecución de scripts está deshabilitada en este sistema.

Buscando un poco me di cuenta que por política la ejecución de comandos está permitida pero la ejecución de scripts no. Para validar el estado en que se encuentra nuestro sistema, vamos a la consola de PowerShell y ejecutamos el siguiente comando:

image

Como se ve en la imagen anterior, tenemos la política de ejecución restringida. Para cambiar esto, simplemente ejecutamos el siguiente comando y cuando nos pregunte por la ejecución del cambio digitamos S.

image

Con esto ya podemos ejecutar el script de PowerShell. Para verificar que si tenemos permisos ejecutamos el comando Get-ExecutionPolicy y nos aseguramos que el resultado sea Unrestricted.

image

Etiquetas de Technorati: ,

1.12.2015

Universal Apps y Windows 10 Preview


Probando el preview de Windows 10 - 9879 me encontré un error de compilación tanto en Visual Studio 2014 Update 4 como en Visual Studio 2015 a la hora de compilar el aplicativo. El error era el siguiente:
Error inesperado en la tarea "GenerateResource".
System.IO.FileLoadException: Could not load file or assembly 'file:///C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Microsoft.Build.Tasks.v12.0\v4.0_12.0.0.0__b03f5f7f11d50a3a\Microsoft.Build.Tasks.v12.0.dll' or one of its dependencies. Operation is not supported. (Exception from HRESULT: 0x80131515)
File name: 'file:///C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Microsoft.Build.Tasks.v12.0\v4.0_12.0.0.0__b03f5f7f11d50a3a\Microsoft.Build.Tasks.v12.0.dll' --->
System.NotSupportedException: An attempt was made to load an assembly from a network location which would have caused the assembly to be sandboxed in previous versions
of the .NET Framework. This release of the .NET Framework does not enable CAS policy by default, so this load may be dangerous. If this load is not intended to sandbox
the assembly, please enable the loadFromRemoteSources switch. See http://go.microsoft.com/fwlink/?LinkId=155569 for more information.

 

Buscando en internet me di encontré que este es un error del Preview del Sistema operativo y por lo tanto no tiene nada que ver con el aplicativo desarrollado. Existe un arreglo preliminar a través del cual se puede hacer que la aplicación compile; este consiste en agregar una directiva en el app.config del aplicativo y hacerlo compilar después de esto. La instrucción es la siguiente:

</dependentAssembly>

    <loadFromRemoteSources
enabled="true" />

</assemblyBinding>


La razón no es muy clara puesto que ninguno de los assemblies se están cargando de forma remota, por lo que las razones no son muy intuitivas que digamos. Después de agregar la directiva, el proyecto se puede compilar correctamente.


12.07.2014

El desarrollador o el usuario

En muchas situaciones me preguntan cual framework es el mejor para x tarea, o cual framework utilizo yo para desarrollar una aplicación. Algunas veces son mas puntuales y preguntan cosas como utilizas el Entity Framework? Usas Sencha para las apps o Apache Cordova? Estas preguntas van acompañadas siempre con el “en que te basas para escoger un framework” donde quizás la pregunta es mas orientada al tipo de preguntas que un arquitecto de software tiene que hacerse y ayudar a responder a los equipos de desarrollo con los cuales trabaja.

Personalmente utilizo algunos frameworks para desarrollar aplicaciones tales como Dapper de stackoverflow; sin embargo, normalmente trato de utilizar la tecnología recomendada por el vendedor para desarrollar aplicaciones en su plataforma. Aquí es cuando los desarrolladores “levantan” la mano y dicen pero porque o usas x o y framework si al final te ayuda a terminar tus aplicaciones de forma más rápida? La respuesta es sencilla: Yo hago aplicaciones para usuarios y no para desarrolladores y no puedo sacrificar al usuario final para beneficiar al desarrollador.

Enfoque desde el punto de vista de un arquitecto: Es bueno terminar en tiempo y en forma los proyectos en los cuales trabajamos, pero no debo entregar aplicaciones con menos capacidades al usuario final por el simple hecho de utilizar un framework que permite que los desarrolladores escriban menos código; es decir, la aplicación debe tener el máximo desempeño que puede dar en la plataforma seleccionada en temas tales como velocidad de ejecución, interacción con repositorio de datos, consumo de energía – para dispositivos móviles, consumo de datos – para dispositivos móviles, manejo de transacciones, manejo de errores, manejo de esquemas de auditoria, seguridad e interacción con el usuario final. Este tema es relevante tanto para aplicaciones locales (on premises), aplicaciones móviles y aplicaciones que corren en la nube.

Etiquetas de Technorati: ,