martes, 14 de octubre de 2014

¿Cómo aprovechar la virtualización en testing?

 

La virtualización es un conjunto de recursos tecnológicos que permiten simular desde datos o componentes de sistemas hasta entornos completos de trabajo (máquinas virtuales, servidores, sistemas operativos, etc.), que facilitan y, en ocasiones críticas, permiten la ejecución de pruebas aún cuando no existen los recursos físicos disponibles o cuando los desarrollos están incompletos. Esto ocurre, por ejemplo, con los drivers o stubs.

Particularmente, la virtualización de servicios es la capacidad de simular los componentes de servicio de modo que permita validar el comportamiento y el rendimiento de cada uno de los componentes y la forma en que interactúan como parte de una aplicación compuesta. La virtualización de servicios ayuda a no tener que esperar a que todos los componentes estén disponibles y se despliegan para comenzar las pruebas de extremo a extremo. Es posible virtualizar aplicaciones y sistemas que no están disponibles para probar el rendimiento de aplicaciones y el comportamiento en el ciclo de desarrollo tales como aplicaciones SOA y BPM.

Dado lo anterior, el tener elementos que permitan diseñar y ejecutar las pruebas en etapas tempranas del proyecto, no sólo reduce los costos de dicho proyecto, sino que constituye un mejor aprovechamiento de los recursos humanos en el área de testing. Es decir, que el ahorro no sólo es en el hardware sino que también en la aplicación del proceso de pruebas en etapas tempranas, por lo cual consideramos que las principales ventajas de tener entornos de virtualización son:

 

  • Aprovechamiento físico de los servidores: permite que varios entornos, aplicaciones, sistemas e incluso servidores que antes eran físicos convivan en un solo hardware.
  • Mantenimiento operativo: proporciona espacios para la instalación de herramientas de pruebas comunes, darle mantenimiento a estas herramientas y en caso de requerirlo,  eliminarlas para cubrir así las necesidades del usuario.
  • Optimización de recursos: permite que las estaciones de trabajo amplíen su vida útil ya que pueden instalarse versiones más recientes o versiones de prueba de sistemas operativos actuales, aprovechando al máximo las características del hardware (memoria, puerto, procesador, etc.).
  • Sencillas copias de seguridad: las máquinas virtuales se pueden salvar muy fácilmente, porque a fin de cuentas, no son más que una carpeta en un ordenador; en caso de desastre se puede recuperar la información con rapidez y en caso necesario incorporarse a otro lugar físico.

Algunos software de virtualización son: VMware, vSphere, Microsoft Hyper-V, Citrix XenServer, Rational Test Virtualization Server y Rational Test Workbench.

 

¡Gracias por su contribución Sandra Lilia Martínez Ramos y Christian Fabila Domínguez!

jueves, 9 de octubre de 2014

Trabajando con Múltiples Instancias de jQuery

 

clip_image002Algunos tipos de Aplicaciones Web modernas, como las que están desarrolladas en SharePoint, ofrecen características modulares, en donde cada componente de la misma debe poder funcionar de forma autónoma y a la vez integrada al resto; con lo cual si utilizamos jQuery como parte de nuestra arquitectura, debemos considerar el escenario de tener o prever múltiples instancias de dicha biblioteca en una misma Página Web para evitar errores.

jQuery, junto a jQueryUI, son dos de las bibliotecas más utilizadas en los desarrollos de Aplicaciones Web modernas, sin lugar a dudas, debido a los múltiples beneficios que ofrecen, entre ellos: la posibilidad de desarrollar mejores aplicaciones, con un menor esfuerzo, más usables, con una mejor respuesta de cara al usuario, permitiendo integrar miles de plugins y bibliotecas desarrolladas por terceros, resolviendo la compatibilidad Cross-Browser, entre otros.

Para explicar cómo trabajar con múltiples instancias de jQuery, vamos a tomar como ejemplo el desarrollo de un Sitio SharePoint, con varias WebParts que deben poder funcionar tanto en nuestro sitio, como en otros sitios de la compañía; es decir, deben poder funcionar independientemente de la página y del resto de las WebParts.

Trabajar con Múltiples Instancias de jQuery

El primer caso a mostrar es cómo trabajar con dos o más instancias de jQuery, de forma de evitar sobrescribir las instancias previas de esta biblioteca que hayan sido cargadas por la Página Web u otra WebPart que se haya cargado en la misma página.

Esto es deseable cuando queremos que nuestra WebPart funcione independientemente de la versión de jQuery que se haya incluido en la página (por ejemplo, si necesitamos una versión más reciente de la que se provee por defecto).

Para ello, lo que vamos a hacer es incluir en la misma WebPart nuestra propia referencia a la versión de jQuery que deseamos utilizar, y vamos a inicializarla utilizando el operador $.noConflict(true), tal como se muestra a continuación:

<!-- Cargar jQuery 1.9.1 -->

<script type="text/javascript" src="Scripts/jQuery/jquery-1.9.1.js"></script>

<script type="text/javascript">

var $_191 = $.noConflict(true);

</script>

<!-- Usando la Versión 1.9.1 de jQuery -->

<script type="text/javascript">

$_191('#selector').function();

</script>

De esta forma, vamos a poder utilizar la instancia $_191 en vez de la instancia $, que en nuestro ejemplo se corresponde con esta versión específica de jQuery. Si deseáramos poder acceder a la instancia cargada por defecto, siempre podremos usar el operador $.

Además, como puede apreciarse, al no sobrescribir la instancia por defecto, el resto de la página seguirá funcionando como si la nueva instancia jamás se hubiera cargado, ya que trabajará de forma aislada. Para terminar de comprender esto último, veamos el siguiente ejemplo:

<!-- Cargar jQuery 1.8.3 [Por Defecto de la Página] -->

<script type="text/javascript" src="Scripts/jQuery/jquery-1.8.3.js"></script>

<!-- Cargar jQuery 1.9.1 -->

<script type="text/javascript" src="Scripts/jQuery/jquery-1.9.1.js"></script>

<script type="text/javascript">

var $_191 = $.noConflict(true);

</script>

<!-- Usando la Versión 1.8.3 de jQuery [Por Defecto de la Página] -->

<script type="text/javascript">

$('#selector').function();

</script>

<!-- Usando la Versión 1.9.1 de jQuery -->

<script type="text/javascript">

$_191('#selector').function();

</script>

Trabajar con una Única Instancia de jQuery

Por otro lado, puede suceder que con tener una única instancia de jQuery sea suficiente, con lo cual se nos plantea la necesidad de validar si ya ha sido previamente cargada o no.

Una buena práctica para lograr tener una mejor performance en nuestra Aplicación Web es no volver a cargar componentes que ya han sido cargados previamente, es decir, si ya existe una instancia de jQuery, no deberemos volver a cargar el .js correspondiente. Si bien los Browsers modernos detectan estos casos y no ejecutan el Request, igualmente consumimos recursos que podrían aprovecharse para otra cosa.

Además, en el caso de ejemplo, si volvemos a cargar la biblioteca jQuery, podríamos sobrescribir la versión específica que cargó la página, pudiendo generar errores en el resto de los scripts de la misma o de los componentes que cargue la página.

Para cargar la biblioteca jQuery sólo si ésta no ha sido cargada previamente, deberemos utilizar la siguiente condición:

<script type="text/javascript">

if (!window.jQuery) {

document.write('<script type="text/javascript" src="Scripts/jQuery/jquery-1.8.3.min.js"></' + 'script>');

}

</script>

Como podemos apreciar, se verifica mediante un if que no exista la instancia por defecto de jQuery, en cuyo caso generamos un tag <script> que permita referenciar el .js en cuestión. Si ya existiera la instancia, el tag no se generaría, y por lo tanto el Browser no intentaría cargar nuevamente la biblioteca.

De esta forma, podemos cubrir los dos escenarios posibles, cargar una instancia propia de jQuery, o reutilizar una cargada previamente. Cuándo utilizar un esquema o el otro, dependerá de las necesidades de cada proyecto y puntualmente de cada funcionalidad que debamos implementar.

Ing. Ariel Martín Bensussán

.Net Practice Manager

 

¡Gracias por tu contribución Ariel Bensussán!

martes, 7 de octubre de 2014

Particiones en SSAS

 

1 - Introducción

1.1 - Objetivos

El objetivo de este Knowledge Package es explicar el uso de particiones y agregaciones (Aggregations) en SQL Server Analysis Services (SSAS).

1.2 - Alcance

Los ejemplos están basados en SSAS 2012 pero los conceptos aplican a otras versiones de Analysis Services como por ejemplo 2005, 2008 R1 y 2008 R2.

2 - Particiones

Las particiones son usadas a la hora de dividir un measure group (tabla de datos) en partes más chicas, estos datos son divididos de forma lógica y solo a nivel del SSAS. El código usado para crear una partición es SQL. Un select basado en todos los campos del measure group (tabla de datos), pero aplicando filtros (rangos) para dividir la tabla en las particiones.

2.1 - Ventajas de usar particiones

Una de las ventajas de usar particiones es que a la hora de procesar el cubo, no hace falta procesar el measure group completo, sino que se pueden seleccionar particiones, de esta forma, se reducen los tiempos de proceso y la carga sobre el servidor de SSAS. Por ejemplo, en una carga diaria de datos, solo haría falta procesar siempre la última partición que la que se estaría actualizando diariamente, y una vez por semana es recomendable hacer un full process del cubo.
Siempre que se agrega un measure group al cubo, se crea por default una partición basada en ese measure group (tabla completa). El motor de SSAS ejecuta queries que poseen menor cantidad de datos a lo que seria ejecutar una query contra el measure group completo. No es lo mismo para el motor ejecutar un query que agrupa datos de 10 años, a tener 10 queries que agrupan datos de un año en particular.

2.2 - Recomendaciones

Asegurarse que al aplicar los filtros no se esté repitiendo datos en 2 particiones diferentes. En otras palabras, asegurarse que los rangos de filtrado, no se superpongan ni hagan que se pierdan datos. Ya que cuando se trabaja con "<","<=",">",">=" y fechas es muy factible que se repitan 2 fechas en diferentes particiones.
No siempre es recomendable crear particiones, si las tablas son chicas, en estos casos no haría falta crear particiones. Cuando la tabla supera las 3 millones de filas, en esos casos empieza a ser recomendable el uso de particiones. El tamaño recomendado es 20 millones de tuplas por partición, o máximo 250 MB(SSAS 2012).

2.3 - Modos de almacenamiento:

Son las formas en que las particiones guardan los datos. Tener en cuenta que cada particion puede tener su propio modo de almacenamiento.

2.3.1 - MOLAP (Multi dimensional Online Analytical Processing)

Es el más usado, apunta al la performance del cubo(tiempo de respuesta bajo).Los datos y agregaciones son guardados por el motor de SSAS. Los cambios de datos en las tablas van a ser reflejados en el cubo, una vez que este sea procesado o la partición procesada.

2.3.2 - ROLAP (Relational Online Analytical Processing)

A diferencia de MOLAP, el ROLAP no hace una copia de los datos al SSAS, sino guarda los datos en vistas indexadas, pero en el motor de base de datos. El tiempo de consultas y proceso es más lento, pero la gran ventaja es que permite ver los datos de las tablas en tiempo real.

2.3.3 - HOLAP (Hybrid Online Analytical Processing)

El HOLAP toma características del MOLAP y ROLAP. Una parte de los datos es almacenado en el motor de SSAS, los más recientes, para que sean accedidos de forma mas rápida, mientras que los restantes datos trabajan igual que ROLAP. Si se producen cambios en las tablas, la partición debe ser re-procesada.

2.4 - Ejemplo de particiones

Un breve ejemplo de cómo se podrían crear particiones usando diferentes filtros de tiempos (en este caso se usan rangos de meses), mostrando que los filtros pueden ser variables.

Tabla

Rango de años

Particiones

Tabla 1
(Measure Group)

2011

Particion A: Enero 2011 - Junio 2011

Particion B: Julio 2011 - Diciembre 2011

2012

Partición A: Enero 2012 - Junio 2012

Partición B: Julio 2012 - Diciembre 2012

Tabla 2
(Measure Group)

2013

Particion A: Enero 2013 - Marzo 2013

Partición B: Abril 2013 - Junio 2013

Partición C: Julio 2013 - Septiembre 2013

Partición D: Octubre 2013 - Diciembre 2013

3 - Agregaciones (Aggregations)

Las agregaciones se generan para mejorar los tiempos de respuesta de las consultas al cubo. Son parte de las particiones, ya que cada a cada partición tiene sus propias agregaciones.
Las agregaciones son datos pre-calculados y almacenados para distintos niveles del cubo. Una forma de verlas seria como usando un Group By en una consulta de SQL. Las agregaciones son calculadas al momento de procesar el cubo, por lo tanto a mayor número de agregaciones mayor va a ser el tiempo de proceso. Tener en cuenta que las agregaciones aumentan el tamaño en disco usado por el cubo.

3.1 - Diseño de Agregaciones

Aplica a los atributos con los que está relacionado esa partición.

Full

La agregación va a incluir el atributo seleccionado de la dimensión

None

Ninguna agregación va a incluir ese atributo

Unrestricted

El motor de SSAS va a decidir si el atributo va a ser incluido o no

Default

Cada atributo es evaluado por su granularidad, determinada en la dimensión.
Los atributos usados en jerarquías creadas por el usuario son tratados como "Unrestricted"
Los atributos que forman parte de una relación Many-to-Many, son tratados como None
El resto de los atributos es tratado como None

3.2 - Aggregation Options

A la hora de setear las agregaciones, existen 4 opciones:

Estimated Storage reaches

Crear cierto número de agregaciones hasta que alcanza un tamaño (MB)
estimado por el usuario, esto es almacenado en disco

Performance Gain Reaches

Estimar el % de ganancia que se quiere obtener a al usar agregaciones,
ese % aplica a la hora de usar esa measure, debe ser estipulado por el usuario.
Tener en cuenta que este porcentaje es estimativo

I click Stop

El motor crea agregaciones hasta que el usuario le diga lo pare

Do not desing Aggregations

No se diseñan agregaciones

4 - Ejemplo

Este ejemplo está basado en la Adventure Works 2012 que proporciona Microsoft de forma gratuita.

1) Ir a la solapa de "Partitions" y clickear en "New Partition"

clip_image002

2) Seleccionar la tabla sobre la que se quieren crear particiones.

clip_image003

3) Especificar el query para dividir las particiones

clip_image004

4) Determinar el nombre de la partición

clip_image006

5) Diseño de agregaciones:

clip_image007

6) El motor cuenta el número de filas que tiene esa partición

clip_image009

7) Opciones de agregaciones.

clip_image010

4 - Enlaces

AdventureWorksDW Database: Link

AdventureWorks SSAS: Link (seleccionar "AdventureWorks Multidimensional Models SQL Server 2012")

SQL Server 2008 Analysis Services Performance Guide: Link

 

¡Gracias por tu contribución Andrés Bernardo!