miércoles, 25 de septiembre de 2013

Data Contract Serializer y maxOccurs="unbounded"

Hace unos días tuve un problema al actualizar un "Service Reference" a partir de un wsdl contra el que ya estábamos trabajando en producción pero necesitábamos ampliar algunas funcionalidades. El problema surgió al actualizar desde Visual Studio el proxy. En un principio no devolvió ningún error ni warning pero dejó de compilar el proyecto y empezó a fallar por todos lados... a priori el wsdl sólo se había modificado para añadir un nuevo método.

El error de compilación surge porque en el proxy (generado automáticamente) todas los objetos List<> han pasado a convertirse en array[], además se han añadido unos atributos

Specified

de tipo bool por cada propiedad pública que si no se les da valor true los datos no llegaban a servidor...

Tirando del hilo, veo que las clases se han generado a partir de XmlSerializer cuando hasta ahora estaba usando

Data Contract Serializer

que es serializador por defecto si usamos Service Reference de Visual Studio... Comparando directamente las diferencias entre los archivos del

wsdl

-

xsd

vimos que se había añadido una lista de string con el atributo

maxOccurs=unbounded

y que este atributo no es compatible con

Data Contract Serializer

tal y como estaba especificado en el fichero.

Soluciones:
  • La más sencilla y de estar por casa es eliminar el atributo manualmente del xsd, con esto ya funcionaría y podríamos salir del apuro.
  • La otra es ajustar el

    xsd

    como se explica a continuación para que

    Data Contract Serializer

    no de problemas

Fragmento xsd que da problemas con

Data Contract Serializer

:
<xs:complexType name="Response">
  <xs:sequence>
    <xs:element name="error" type="xs:boolean" />
    <xs:element name="errorMessage" nillable="true" type="xs:string" />
    <xs:element minOccurs="0" maxOccurs="unbounded" name="info" type="xs:string" />
  </xs:sequence>
</xs:complexType>
Fragmento xsd correcto:
<xs:complexType name="Response">
   <xs:sequence>
      <xs:element name="error" type="xs:boolean" />
      <xs:element name="errorMessage" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="mensajes" nillable="true" type="tns:ArrayOfInfo" />
    </xs:sequence>
</xs:complexType>

<xs:complexType name="ArrayOfInfo">
   <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="info" nillable="true" type="xs:string" />
   </xs:sequence>
</xs:complexType>
Una vez optamos por una de estas 2 soluciones al actualizar servicio desde Visual Studio ya usa

Data Contract Serializer

de modo que nos hemos evitado tener que hacer refactoring de código y podemos seguir usando List<> que siempre es más cómodo que un array[].

Hasta aquí el artículo, espero que a alguien le sea útil. Recordar que podéis seguir

areaTIC

en las principales redes sociales, animaros a participar!

martes, 17 de septiembre de 2013

Turnapi: Documentar APIs en la nube

Llevo desde hace un tiempo trabajando en un proyecto entre varias empresas en el que una desarrolla una API con ciertas funcionalidades y otras consumen esta API desde sus aplicaciones. El caso es que, lógicamente, surgió la necesidad de documentar la API y tener esta documentación actualizada y accesible a todos los participantes... se pensó en Google Docs y otras soluciones similares pero finalmente optamos por Turnapi, os hago un breve resumen.

¿Qué es turnapi? Es una herramienta que nos permite de forma fácil e intuitiva documentar las APIs que desarrollemos. Dispone de control de versiones, es fácilmente configurable, podemos organizar la información, restringir el acceso a los usuarios que queramos, realizar búsquedas de forma global sobre toda la documentación... entre otras funcionalidades. La herramienta dispone de una versión gratuita 100% operativa aunque también dispone de versiones de pago que ofrece opciones como uso de nuestro dominio, SSL,... a través de este enlace podéis acceder a la lista de planes y precios de turnapi.

A continuación os comentaré los primeros pasos a dar en Turnapi y cómo llevar a cabo algunos aspectos de configuración:

  • Lo primero que debemos hacer es registrarnos, podemos hacerlo desde la home de la web de Turnapi indicando nombre, mail, contraseña y dominio (se creará un subdominio del tipo dominioespecficado.turnapi.com, por ejemplo, test.turnapi.com).


  • Una vez registrados en Turnapi accedemos a la página principal de la documentación de la API. Podemos configurar logo y menú de la cabecera, configurar el tree de la izquierda añadiendo nuevas entradas o modificar el contenido de la página que se nos visualiza (con título References). En la parte inferior de la pantalla hay disponible otro menú que nos permite cambiar el modo de visualización, seleccionar temas, acceso a la gestión de usuarios,...


  • Tal como comentaba en el apartado anterior,si en el menú inferior pulsamos sobre la opción 'Themes' podremos escoger el estilo para la documentación de nuestra API.


  • Si pulsamos sobre la opción 'Configure header' podremos cambiar el logo de la documentación de nuestra API, modificar los títulos de los menús existentes y añadir/elminar menús (de la barra superior horizontal).


  • En el cuadro de texto central escribiremos el contenido de la página pudiendo usar texto normal, tags html, listas, negrita, cursiva, imágenes,... y también añadir métodos (prefijo '#') y parámetros (prefijo '@param').


    La visualización de la página anterior sería la siguiente; en la parte inferior de la documentación nos saldrán links para exportarla a HTML, PDF o imprimir:


  • Pulsando sobre 'Configure tree' añadiremos nodos en el menú de la izquierda; dentro del mismo podemos crear submenús lo que nos permitirá organizar mejor la documentación de nuestra API.


  • En cualquier momento podemos grabar o grabar y publicar nuestra documentación. En cuanto grabemos se actualizarán las revisiones correspondientes (guardadas o guardas y publicadas y pulsando sobre 'history' veremos el historial de cambios.


  • Pulsando en la opción 'Settings' del menú inferior podremos indicar nombre y copyright para nuestro proyecto de documentación y lo que es más importante, hacer este proyecto privado; si lo marcamos supondrá que sólo podrá acceder a la documentación de la API aquellos usuarios que invitemos. MUY IMPORTANTE, por defecto los proyectos no son privados así que si no marcamos esta característica nuestra documentación será accesible a cualquier usuario de internet.


  • Si vamos a la opción 'Users' del menú inferior veremos la lista de usuarios del proyecto (aquellos que tienen acceso a la documentación si el proyecto es privado).


  • Podemos añadir usuarios pulsando el botón 'Invite Person' o eliminarlos pulsando sobre el link 'Remove' (y yo me pregunto, ¿por qué no habrán hecho 2 botones o 2 links?. Al invitar a una persona nos pide su mail y a este le llega el link de acceso y su contraseña (autogenerada), el login es su correo.


  • ... y cómo las características anteriores podría mostraros varias más. Podéis acceder al blog de la herramienta para ver otras características o acceder al libro de ruta para ver las últimas mejoras implementadas.

Hasta aquí el artículo de hoy, ¿qué os ha parecido? Si no os convence Turnapi como herramienta para generar la documentación de nuestras APIs existen otras herramientas similares como Apiary, Dojo... Recordad que dentro de areaTIC podéis encontrar otros artículos interesantes, no dudéis en consultar nuestro archivo, también podéis seguirnos por RSS o las principales redes sociales (twitter, facebook, linkedin...).


miércoles, 11 de septiembre de 2013

SQL Server: Hint NOLOCK

En el artículo de hoy explicaremos el hint NOLOCK. Si recordáis el artículo SQL Server: Hint Maxdop os comentaba que existen tres tipos de hints, Join Hints, Query Hints y Table Hints; bien, el hint NOLOCK es del tipo Table (también conocidos como Lock Hints) por lo que se aplica en consultas de tipo SELECT, INSERT (sólo cuando contiene una cláusula SELECT), DELETE, UPDATE y MERGE, invalidando el comportamiento predeterminado del optimizador de consultas mientras dura la instrucción DML (Data Manipulation Language) especificando un tipo de bloqueo, uno o más índices,... Estos hints se especifican en la cláusula FROM de la instrucción mediante la cláusula WITH y sólo afectan a la tabla o vista a la que se hace referencia en esa cláusula. Podemos encontrar más información al respecto en el siguiente enlace del MSDN: Table Hints.

El hint NOLOCK es equivalente al READUNCOMITTED y básicamente lo que permite son 'dirty reads' (aunque también podrían producirse lecturas no repetibles y lecturas fantasma), lo podemos ver fácilmente con un ejemplo en el que utilizaremos la base de datos AdventureWorks:

  1. Abrimos una nueva consulta en SSMS y ejecutamos una sentencia SELECT:
    -- Buscamos todos los empleados solteros
    SELECT EmployeeID, LoginID, Title, MaritalStatus 
    FROM HumanResources.Employee 
    WHERE MaritalStatus = 'S'
    
    Obtenemos el siguiente resultado (podemos ver que el empleado con ID 2, Kevin, está soltero):


  2. Abrimos otra nueva consulta en SSMS y ejecutamos una sentencia UPDATE dentro de una transacción:
    -- Actualizamos el estado civil del empleado con ID 2
    BEGIN TRANSACTION
    UPDATE HumanResources.Employee
    SET MaritalStatus = 'M'
    WHERE EmployeeID = 2
    -- No finalizamos la transacción, podrá acabar con COMMIT o ROLLBACK
    
  3. Volvemos a lanzar la consulta del punto 1, ahora la consulta queda pendiente de ejecución ya que hay una transacción sobre los datos a los que se refiere.


    Esto es así porque el nivel de aislamiento (ISOLATION LEVEL) establecido es 'READ COMMITTED' (las instrucciones no pueden leer datos que hayan sido modificados pero no confirmados por otras transacciones); es el valor por defecto en SQL Server.

  4. Detenemos la consulta en ejecución del apartado anterior y modificamos la sentencia SELECT del punto 1 añadiendo el hint NOLOCK:
    -- Buscamos todos los empleados solteros
    SELECT EmployeeID, LoginID, Title, MaritalStatus 
    FROM HumanResources.Employee WITH (NOLOCK)
    WHERE MaritalStatus = 'S'
    
    Obtenemos el siguiente resultado (podemos ver que el empleado con ID 2, Kevin, no aparece, a pesar de no haber confirmado la transacción):


  5. Si ahora hiciéramos ROLLBACK en la sentencia UPDATE del paso 2 los resultados de la sentencia SELECT del paso 4 serían erróneos, tendríamos una 'lectura sucia' (dirty read) originada por el uso del hint NOLOCK.

Visto el uso del hint NOLOCK en el ejemplo anterior deberíamos tener en cuenta algunas consideraciones:
  • Lo primero que nos preguntaremos es, si el hint NOLOCK puede producir 'dirty reads', ¿para qué sirve? Como ya he comentado en algún otro artículo se debe ir con especial cuidado en el uso de hints, sea cual sea, ya que alteran la normal ejecución del optimizador de consultas y puede producir resultados no deseados. En el caso del hint NOLOCK y tomando de partida el ejemplo anterior se me ocurren 2 casos en los que puede sernos útil:

    • Supongamos que tenemos un nº de empleados mayor que 300, obtenemos los datos sobre el estado civil de los empleados (solteros, casados,...) y se muestra un gráfico de tipo pastel con los porcentajes de cada tipo. El estado civil no es algo que cambie frecuentemente, podemos lanzar la consulta SELECT con el hint NOLOCK y aunque los datos no sean 100% exactos el gráfico apenas se verá afectado.

    • Necesitamos un listado donde figure ID de empleado, nombre y estado civil; lanzando la consulta con el hint NOLOCK obtendremos el listado ignorando los posibles bloqueos de la tabla. Id, nombre del empleado y estado civil son datos que no deberían variar con frecuencia y algún dato no del todo correcto quizás no suponga un problema en este caso.

    Normalmente para la construcción de gráficos y extracción de listados es donde puede tener sentido (pero no siempre) el uso del hint NOLOCK. Se debe ir con especial cuidado en NO utilizar el hint NOLOCK en una sentencia SELECT si luego con los datos obtenidos se realizan INSERTs / UPDATEs / DELETEs ya que podemos estar generando datos corruptos.

  • En uno de los puntos anteriores comentaba que la consulta quedaba en ejecución porque el nivel de aislamiento era 'READ COMMITTED'; si queremos saber el nivel de aislamiento de la conexión que estamos usando debemos ejecutar la consulta:
    -- Obtención nivel de aislamiento
    DBCC useroptions
    
    Obtendremos el siguiente resultado (podemos ver que el nivel de aislamiento es 'READ COMMITED'):


  • El uso del hint NOLOCK sólo está permitido en las sentencias de tipo SELECT. Si lo añadimos a sentencias de tipo INSERT, DELETE o UPDATE obtendremos el error correspondiente, veamos un ejemplo:
    -- Actualizamos estado civil del empleado usando el hint NOLOCK
    UPDATE HumanResources.Employee WITH (NOLOCK)
    SET MaritalStatus = 'M'
    WHERE EmployeeID = 2
    
    Al ejecutar la consulta anterior obtendremos el siguiente mensaje de error:
    Mens. 1018, Nivel 15, Estado 1, Línea 1
    Sintaxis incorrecta cerca de 'NOLOCK'. Si se va a usar como parte de una sugerencia de tabla, es necesario escribir una palabra clave WITH y paréntesis. Vea los Libros en pantalla de SQL Server para conocer la sintaxis correcta.
    

  • Cuando usamos el hint NOLOCK en una sentencia SELECT se produce sobre la tabla en cuestión un bloqueo en modo Sch-S (bloqueo de estabilidad del esquema); por tanto, si dentro de una transacción se modifica la estructura de la tabla y lanzamos una sentencia SELECT con el hint NOLOCK sin que haya finalizado la transacción la consulta SELECT se quedará en espera. Veamos un ejemplo:
    -- Modificamos estructura de la tabla
    BEGIN TRANSACTION
    ALTER TABLE HumanResources.Employee 
    ADD Columna_Test VARCHAR(20) NULL ;
    -- La transacción podrá acabar con COMMIT o ROLLBACK
    
    -- En otra consulta lanzamos el SELECT, quedará en ejecución 
    -- hasta que finalice la transacción de la consulta anterior
    SELECT EmployeeID, LoginID, Title, MaritalStatus 
    FROM HumanResources.Employee WITH (NOLOCK)
    WHERE MaritalStatus = 'S'
    

  • Tampoco deberíamos confundir el hint NOLOCK con los hints READPAST o NOWAIT. Probablemente en un próximo artículo explique estos dos últimos y las diferencias entre los tres.

  • Si queremos aplicar el hint NOLOCK a una consulta con varias tablas o a varias consultas SELECT consecutivas deberíamos hacerlo de la siguiente manera, modificando el nivel de aislamiento:
    -- Cambiamos nivel de aislamiento para permitir lecturas
    -- no confirmadas
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    
    SELECT *
    FROM Table1
    INNER JOIN Table2 ON Table1.c1 = Table2.c2
    
    SELECT *
    FROM Table3
    
    -- Restauramos el nivel de aislamiento anterior
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED
    

Hasta aquí el artículo de hoy, recordad que dentro de areaTIC podéis encontrar otros artículos interesantes, no dudéis en consultar nuestro archivo, también podéis seguirnos por RSS o las principales redes sociales (twitter, facebook, linkedin...).


LECTURAS RELACIONADAS RECOMENDADAS POR AREATIC.NET

martes, 3 de septiembre de 2013

BI: Herramientas comerciales

Tras el artículo BI: Herramientas open source publicado el pasado mes de agosto llega el momento de realizar un breve análisis de las herramientas comerciales de BI más populares (al menos en mi entorno). Como siempre cuando realizamos análisis de herramientas, del tipo que sea, es conveniente consultar si existe lo que dice el cuadrante mágico de Gartner al respecto, en él podréis ver las fortalezas y debilidades de cada una de las herramientas analizadas.

  • Sobre Qliqview no comentaré mucho ya que el pasado mes de abril dediqué un artículo completo a la herramienta tras asistir a un workshop organizado por Qlitech Ibérica. Podéis acceder a través de este enlace al dicho artículo sobre Qlikview.


  • De IBM Cognos podríamos decir que es el líder del mercado. Nos ofrece utilidades para creación de procesos ETL, cuadros de mando, informes, espacio de trabajo unificado y herramientas de colaboración entre usuarios, uso en dispositivos móviles, integración con aplicaciones,... Existen tres versiones disponibles de IBM Cognos, Insight, Express y Enterprise, en el siguiente enlace podéis ver una comparativa entre ellas. También es posible acceder, previo registro podéis acceder a un video demostrativo de IBM Cognos. La familia de software Cognos dispone también de otras herramientas que completan y añaden funcionalidad al BI:

    • Cognos TM1: planificación, elaboración de presupuestos, informes, análisis y modelado bajo demanda.

    • Cognos FSR: elaboración de informes automatizada y marcado XBRL para reducir el riesgo y mejorar la eficiencia.

    • Cognos Controller: consolidación financiera completa, fiable y auditable.


  • MicroStrategy es otra herramienta de BI que además de las típicas funcionalidades de ETL, cuadros de mando, informes, uso en dispositivos móviles... destaca por su facilidad de uso y características sociales (facilidad para compartir datos con nuestros amigos y serguidores). Podéis acceder a una demo online previo registro con la particularidad que es posible cargar nuestros propios datos a partir de un excel, csv,... y también está disponible en modalidad SaaS. A través de este enlace podéis acceder a información detallada sobre MicroStrategy.


  • Si os habéis fijado con detalle en el cuadrante mágico de Gartner donde se analizan herramientas de BI habréis observado que aparece Microsoft... ¿dispone de una herramienta de BI? Como tal no pero ofrece las funcionalidades de BI mediante tres herramientas:

    • Microsoft Office, especialmente a través de Excel y disponible en modalidad SaaS mediante Office 365.

    • SQL Server, que ofrece almacenamiento de datos, ETL (mediante SSIS), análisis de datos (mediante SSAS), informes (mediante SSRS)... podríamos dedicar un artículo entero al BI en SQL Server. Por supuesto también está disponible en modalidad SaaS a través de Windows Azure (SQL Azure).

    • Sharepoint, ofreciendo todo lo relacionado con gestión documental y las características sociales tras al incorporación de Yammer a la plataforma.


  • Tableau Software es otra herramienta de BI con las típicas funcionalidades de ETL, análisis, cuadros de mando, informes, adaptada al uso en dispositivos móviles... previo registro podemos acceder una demo online; en el mismo sitio y sin necesidad de registrarnos podemos bajar una versión de escritorio o servidor de evaluación. Además, también dispone de la posibilidad de suscribirse a documentos (que se reciben por email y se puede trabajar sobre ellos) y capacidades sociales obteniendo y vinculando datos de facebook, twitter,... Disponible en modalidad SaaS el precio está en torno a los 500$ usuario/año; podemos acceder a través de este enlace a la lista completa de precios.


  • Si trabajamos en entornos Oracle o SAP por supuesto hay que tener en cuenta sus herramientas de BI, Oracle Enterprise Performance Management and Business Intelligence y SAP BUSINESS INTELLIGENCE; en los respectivos enlaces podéis encontrar más información, da para escribir varios artículos.

    También podría mencionar otras como Alteryx, SAS, Panorama Software,... quizás haga un segundo artículo entrando algo más en detalle de algunas de estas herramientas.

  • Y para finalizar, no olvidemos tampoco aquellas herramientas open source de BI que comentábamos en el artículo anterior y que disponen de una versión comercial: Pentaho, Jedox y Jaspersoft.

Hasta aquí el artículo de hoy, ¿utilizáis alguna herramienta comercial de BI que no haya mencionado o disponéis de información adicional sobre alguna de las comentadas? No dudéis en compartirlo con nuestros lectores a través de los comentarios, seguro que lo agradecerán... Recordad también que dentro de areaTIC podéis encontrar otros artículos interesantes, no dudéis en consultar nuestro archivo, también podéis seguirnos por RSS o las principales redes sociales (twitter, facebook, linkedin...).