MySQL Server Performance on Microsoft Azure, a lesson learned from a Linux Distribution

Microsoft Azure support infrastructure as a service, that is, support for creating your custom virtual machines with the operating system of your choice. So you can chose Linux as your operating system. Linux has a huge list of different distributions to choose from. In this post I want to show the different in performance found when you host a MySQL Server on different Linux distributions.

Supported and no supported Linux distributions

Inside the Azure portal you can create virtual machines from the gallery. Those images include Windows Server images and Linux. For Linux there are Ubuntu, Centos and OpenSuse. Microsoft support is limited to the Azure platform and services and a support case through support agreement is required to engage the Azure support team. Microsoft support will not offer assistance in the design, architecture, development, or deployment of applications or solutions on Azure. If Linux support is needed, customers should reach out to the vendors directly for support. For more info click here.

Also you can download to your Azure Storage images made by the community, by selecting Virtual Machines on left side, and on that panel, selecting “Images” tab and there clicking on ”Browse VM Depot”.

clip_image002

There you can select a wide range of Linux distribution with a lot flavors, that is. You can download an image with all necessary software to run WordPress, Alfresco, ect.

On the list there are a Debian GNU/Linux 7.0 wheezy that we are going to use on our demo too. That is because when want to show the different between a Microsoft’s supported Linux distribution and a community Linux distribution.

Mysqlslap

Mysqlslap is a command line tool that is included on the mysql-client package that helps database administrator to simulate work load on the server. This tool can simulate multiple concurrent users, multiple queries and can work with string and int types while simulating the work load.

This tool is great for a performance comparison because you can create work load on every machine and using the same tool.

A typical command line for this tool could it be like this.

mysqlslap --user=root -p --auto-generate-sql --concurrency=1 --number-of-queries=100 --number-char-cols=8 --number-int-cols=10 
--iterations=10

During this load test I’m going to change the currency value to simulate more users on the test, this will help to measure the performance on the Linux distributions.

All test are going to be executed on machines that doesn’t have swap partition, only have one disk for the system, the Virtual Machine Size is A3 (4 cores, 7GB of memory).

IOPS

All virtual machine have a limit on the number of IOPS (Input/Ouput Operation per Seconds) of 300 IOPS for basic virtual machines and 500 IOPS for Standard virtual machines.

To increase this number you can add more disk to your machine and set them as a RAID0 to enable striping. With this level there is no redundancy and no level of fault tolerance. The more disk you add to the virtual machine the more IPOS per second you can have.

Results

Concurrency

Debian 7.0

Ubuntu 14.10

CentOS 13

Debian 7.0

Ubuntu 14.10

CentOS13

1

1.991

1.9740

0.0470

2.24

2.179

0.069

10

0.442

0.3670

0.0240

0.393

0.461

0.049

100

0.098

0.0930

0.0250

0.145

0.138

0.051

500

9.778

9.5290

8.0280

14.249

13.353

12.546

clip_image004

Conclusion

The best Linux distribution for MySQL performance is CenOS, it has the best time executing all queries, and obviously the standard tier is the best option too.

All machines on this series of test doesn’t have a swap partition, so that mean that there is no noise on the hard drive, affecting performance.

Luis Guerrero.

Technical Evangelist Microsoft Azure

@guerrerotook

Cómo configurar un entorno de desarrollo PHP para trabajar con Microsoft Azure

Microsoft Azure tiene un excelente soporte de PHP en todos los productos que ofrece, Máquinas Virtuales, Sitios Web y Servicios en la nube. Además de soporte incluye también un SDK con el que se puede acceder a las características específicas de Azure directamente desde PHP. En este artículo se va mostrar la manera de configurar un entorno de trabajo para PHP utilizando el SDK de Azure. Esto es extensible para Windows, Linux y MacOSx.

Runtime de PHP / Servidor Web

Lo primero que se necesita para poder empezar a trabajar con PHP es el propio runtime de PHP instalado en un servidor web. En Internet hay muchísimos artículos de cómo instalar Apache+PHP así que está fuera del ámbito de este articulo contar eso, pero si se va a contar como se Instala en Windows.

Para instalar en Windows se puede utilizar Web Platform Installer directamente en IIS.

Una vez que se ha instalado PHP en el sistema, desde la línea de comandos se puede ejecutar el comando php.

Instalando el SDK de PHP para Microsoft Azure

El SDK de Azure para PHP se puede instalar de dos maneras utilizando Composer y Pear. Ambos son un gestor de paquetes para PHP, que permiten instalar el paquete y las dependencias de las que depende el mismo. Ambos son ficheros individuales que tienen la extensión phar, esa extensión define un paquete único de php que contiene a su vez más fichero, como una especie de fichero zip con todo lo necesario para ejecutar ese programa.

Composer se puede descargar desde http://getcomposer.org/composer.phar.

Pear se puede descargar desde http://pear.php.net/go-pear.phar.

Además en Windows se necesita tener la línea de comando de Git.

Instalando y configurando Pear

Antes de poder instalar el paquete de Microsoft Azure, se tiene que instalar e inicializar Pear correctamente en el sistema, para ello, lo recomendable es crear un directorio en la raíz llamada pear y ahí sea donde se instale Pear y todos los paquetes que se requieran. Se pueden hacer dos instalaciones una local y otra a nivel de sistema.

Para instalar Pear ejecutar este comando en la carpeta pear:

php go-pear.phar

Solo hay que seguir las preguntas en pantalla para instalar Pear. Una vez hecho recomienda, en el caso de Windows, ejecutar el comando PEAR_ENV.reg para que registre globalmente en el sistema. Además es recomendable agregar la ruta de la carpeta de pear a la variable PATH del sistema.

Instalando el SDK de PHP

En la página oficina de Microsoft Azure, http://azure.microsoft.com/en-us/documentation/articles/php-download-sdk se indica cómo se hace el proceso de instalación del SDK, se indica que hay que generar un fichero llamado composer.json en la raíz de la carpeta que contenga el proyecto en donde se desea usar el SDK de PHP.

El contenido del fichero, según la web anterior, debería de ser:

{
"require": {
"microsoft/windowsazure": "*"
},
"repositories": [
{
"type": "pear",
"url": "http://pear.php.net"
}
],
"minimum-stability": "dev"
}

Pero en este fichero hay un error que hace, que cuando Composer intente resolver las dependencias que se definen en el paquete de microsoft/windowsazure no puede resolverlo y falla el proceso de instalación, aunque se instalen desde Pear, cuando se intente hacer desde Composer fallará.


Loading composer repositories with package information
Initializing PEAR repository http://pear.php.net
Installing dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.
Problem 1
- microsoft/windowsazure v0.4.0 requires pear-pear/http_request2 * -> no
mat
ching package found.
- microsoft/windowsazure dev-master requires pear-pear/http_request2 * ->
no
matching package found.
- microsoft/windowsazure dev-dev requires pear-pear/http_request2 * -> no
ma
tching package found.
- Installation request for microsoft/windowsazure * -> satisfiable by
micros
oft/windowsazure[dev-dev, dev-master, v0.4.0].
Potential causes:
- A typo in the package name
- The package is not available in a stable-enough version according to your
min
imum-stability setting
see
<https://groups.google.com/d/topic/composer-dev/_g3ASeIFlrc/discussion> f
or more details.
Read <http://getcomposer.org/doc/articles/troubleshooting.md> for
further common
problems.

Para solucionar este problema hay que utilizar un fichero composer.json que contenga las dependencias del paquete de microsoft/windowsazure tal como este:

{
"require": {
"microsoft/windowsazure": "dev-dev",
"pear-pear.php.net/http_request2": "*",
"pear-pear.php.net/mail_mime": "*",
"pear-pear.php.net/mail_mimedecode": "*"
},
"repositories": [
{
"type": "pear",
"url": "http://pear.php.net"
}
]
}

A partir de ese fichero y teniendo en la misma carpeta el fichero de composer.phar se puede ejecutar este comando:

php composer.phar install

Y ahora ya si empezará a resolver todas las dependencias.

Loading composer repositories with package information
Initializing PEAR repository http://pear.php.net
Installing dependencies (including require-dev)
- Installing pear-pear.php.net/mail_mime (1.8.8)
Downloading: 100%
- Installing pear-pear.php.net/mail_mimedecode (1.5.5)
Downloading: 100%
- Installing pear-pear.php.net/net_url2 (2.0.5)
Downloading: 100%
- Installing pear-pear.php.net/xml_util (1.2.1)
Downloading: 100%
- Installing pear-pear.php.net/console_getopt (1.3.1)
Downloading: 100%
- Installing pear-pear.php.net/structures_graph (1.0.4)
Downloading: 100%
- Installing pear-pear.php.net/archive_tar (1.3.11)
Downloading: 100%
- Installing pear-pear.php.net/pear (1.9.4)
Downloading: 100%
- Installing pear-pear.php.net/http_request2 (2.2.1)
Downloading: 100%
- Installing microsoft/windowsazure (dev-dev f9a0ba6)
Cloning f9a0ba6612cbcb73fe237948eec7b5974f99e52e
Writing lock file
Generating autoload files

De esta manera se ha generado un sistema de archivos que contiene todo lo necesario para empezar a trabajar con PHP y el SDK de Microsoft Azure.

clip_image001

Cómo usar el SDK de PHP desde una aplicación web

Para empezar a consumir los servicios de Microsoft Azure desde PHP hay que escribir al menos unas líneas de PHP. En PHP cuando se requiere una librería externa lo que se hace es referenciar el código fuente de esa Liberia utilizando una función de PHP llamada require_once.

Si la librería se ha instalado con Pear o Git:

require_once "WindowsAzure/WindowsAzure.php";

Si la libreria se ha instalado con Composer:

require_once "vendor/autoload.php";

A partir de aquí se pueden empezar a referenciar clases del SDK para tareas en concreto como inserter un elemento en la tabla de Storage.

Luis Guerrero.

Technical Evangelist Microsoft Azure.

@guerrerotook

Envío de correos utilizando SendGrid desde Node.js

SendGrid es un servicio que se ofrece en el portal de Microsoft Azure que permite el envío de correos electrónicos desde diferentes API’s. Lo primero de todo es que hay que dar de alta una cuenta de SendGrid desde el portal de Azure para luego poder consumir ese servicio.

Cómo crear una cuenta de SendGrid

Desde el portal de Microsoft Azure hay que pulsar en el botón de nuevo servicio, navegar hasta la tienda y una vez allí seleccionar el servicio de SendGrid.

clip_image002

Se pueden elegir entre muchos tipos de suscripción, que van desde una versión gratuita, que te permite enviar 25000 emails al mes, hasta una cuenta Premier que te permite enviar 2.500.000 emails al mes.

clip_image004

Una vez que se ha finalizado el proceso de compra del servicio en el portal de Azure aparece SendGrid como una aplicación que podemos utilizar. Como todo servicio SendGrid tiene unas credenciales que se van a necesitar para hacer el envío de correos desde Node.js.

clip_image005

Utilizando el módulo de sendgrid en Node.js

Como se ha visto en artículos anteriores, Node.js utiliza módulos que ofrecen funcionalidad para el desarrollador. En este caso no iba a ser diferente y existe un módulo llamado sendgrid que se puede utilizar para hacer el envío de correos. El código fuente del módulo está disponible en GitHub.

El paquete se puede instalar con npm o en el caso de tener una aplicación de Node.js incluirlo como dependencia en el fichero package.json. A partir de ahí se puede referenciar el módulo en código:

var SendGrid = require('sendgrid')

Cómo crear un correo

Antes de poder enviar un correo electrónico hay que crearlo y configurar todas las propiedades necesarias. Este es el código que se necesita para configurarlo.

var mail = new SendGrid.Email({
to: 'john@contoso.com',
from: 'anna@contoso.com',
subject: 'test mail',
text: 'This is a sample email message.'
});

También se puede utilizar una propiedad llamad html para establecer código HTML en el cuerpo del email. E

Esta operación simplemente genera el objeto Email que será utilizado para poder enviar el correo.

Estás son todas las propiedades que puede tener un correo:

var params = {
smtpapi: new sengrid.SmtpapiHeaders(),
to: [],
toname: [],
from: '',
fromname: '',
subject: '',
text: '',
html: '',
bcc: [],
replyto: '',
date: new Date(),
files: [
{
filename: '', // required only if file.content is used.
contentType: '', // optional
cid: '', // optional, used to specify cid for inline content
path: '', //
url: '', // == One of these three options is required
content: ('' | Buffer) //
}
],
file_data: {},
headers: {}
};

Cómo enviar un correo electrónico

El siguiente paso es enviar el correo utilizando las credenciales que se obtuvieron del paso anterior, en el que se creaba la cuenta de SendGrid.

var sender = new SendGrid.SendGrid('user','key');

De esta manera se crea el objeto sender que permite enviar correos, se pueden utilizar dos API una SMTP que se conecta directamente con el servidor de correo y otra WebAPI que permite hacer el envío del correo a través de una API HTTP. Esto es así porque en determinados escenario el puerto de envío de correos para SMTP puede estar cerrado, así que utilizar WebAPI es una buena alternativa para saltarse la protección de los Firewalls.

SMTP

sender.smtp(mail, function(success, err){
if(success) console.log('Email sent');
else console.log(err);
});

Web API

sender.send(mail, function(success, err){
if(success) console.log('Email sent');
else console.log(err);
});

Adjuntos

Otro aspecto importante de los correos son los ficheros adjuntos al email, esto es útil si, por ejemplo, se están generado documentos pdf (facturas) o imágenes como parte del negocio de la aplicación y se quieren enviar por correo.

sender.send({
to: 'john@contoso.com',
from: 'anna@contoso.com',
subject: 'test mail',
text: 'This is a sample email message.',
files: {
'file1.txt': __dirname + '/file1.txt',
'image.jpg': __dirname + '/image.jpg'
}
});

Los ficheros son leídos con fs.readFile con lo que tienen que estar en el disco duro local de la máquina que ejecuta el código. Si, por ejemplo, los ficheros están guardados en Azure Storage Blobs, primero se tiene que acceder al fichero, copiarlo en local y luego especificar esa ruta local.

Luis Guerrero

Technical Evangelist Microsoft Azure

@guerrerotook

Cómo trabajar con Service Bus desde Node.js

Service Bus es una infraestructura de mensajería que permite a las aplicaciones intercambiar mensajes entre ellas de una manera desacoplada soportando escalabilidad. Service Bus está operado por completo por Microsoft y tiene un SLA mensual de 99.9%

Servicios dentro de Service Bus

Dentro de Service Bus existen diferentes tipos de servicios que se pueden consumir:

Topics / Subcriptions

Este servicio permite crear y consumir un sistema de mensajería basada en un modelo de publicador consumidor. De esta manera las aplicaciones distribuidas o distintos componentes, no se comunican de manera directa, sino que utilizan un topic que actúa de intermediario.

clip_image001

Relay Service

El servicio de Service Bus Realy Service permite construir aplicaciones hibridas que se ejecutan en Windows Azure y entornos on-premises locales. Este servicio permite exponer servicios de Windows Communication Services (WCF) que están dentro del firewall corporativo para que sean consumidos desde la nube pública.

clip_image002

Service Bus Queues

Este servicio soporta un sistema basado en brokers que permite la comunicación basado en mensajes. De esta manera las aplicaciones no se comunican de manera directa si no que se comunican a través del intercambio de mensajes.

clip_image003

Como consumir Service Bus desde Node.js

En el ejemplo de código se puede descargar desde GitHub se había estado trabajando con el SDK de Windows Azure para Node.js. Así que se va a continuar con esta misma demo haciendo que el código sea capaz de enviar mensajes a una cola de Service Bus.

Cómo un servicio de Service Bus desde el portal

Para poder conectarse al servicio primero hay que crear un servicio de Service Bus en el portal de Windows Azure, para ello hay que iniciar sesión en el portal y navegar hasta la sección de Service Bus.

Una vez allí hay que pulsar en crear un nuevo servicio. Lo único que solicita el formulario es el nombre del bus y por supuesto el datacenter donde va a estar alojado el servicio.

clip_image004

A partir de aquí se pueden obtener la configuración de conexión del servicio.

clip_image006

Una vez pulsado ese botón se abre un cuadro de dialogo donde se puede obtener el nombre de usuario y la llave predeterminada.

clip_image008

Service Bus en Node.js

Como se ha comentado en post anteriores existe un cliente para poder consumir servicios de Windows Azure, en este caso para poder conectarse a Service Bus hay que crear el cliente pertinente que se puede hacer de esta manera:

var azure = require('azure');
var serviceBusService = azure.createServiceBusService();

De esta manera al crear el cliente de Service Bus así el SDK de Node.js ira a buscar las variables de configuración para conectarse a Windows Azure de dos variables de entorno que están definidas en process.env, que son: AZURE_SERVICEBUS_NAMESPACE y AZURE_SERVICEBUS_ACCESS_KEY

Enviando mensajes a la cola de Service Bus

Para poder enviar mensajes lo primero que hay que hacer es asegurarse de que la cola existe, para eso el cliente de Service Bus tiene una operación llamada createQueueIfNotExits. Esta llamada acepta un objeto que contiene la configuración a la hora de crear la cola, que se puede consultar su documentación online, que permite configurar el tamaño de la cola y la caducidad de los mensajes:

var azure = require('azure');
var serviceBusService = azure.createServiceBusService();
var queueName = 'chat';
var queueOptions = {
MaxSizeInMegabytes : '5120',
DefaultMessageTimeToLive : 'PT10M'
};

serviceBusService.createQueueIfNotExists(queueName, queueOptions, function(error){
//
});

Con esta operación se crear la cola si no existe una vez hecho eso se puede llamar al método sendQueueMessage con el mensaje que se quiere enviar:

var message = {
body : 'Test message',
customProperties : {
testproperty : 'TestValue'}
};
serviceBusService.sendQueueMessage(queueName, message, function(error) {
if (!error) {
renderPayload['mensageSent'] = true;
res.send(renderPayload);
}
});

En el caso de la demo de este artículo se ha creado un servicio que acepta por parámetro un mensaje y es justamente, ese mensaje, el que se envía en la cola. Se ha creado otro servicio que justamente lo que hace es leer el mensaje de la cola por AJAX y mostrarlo en la UI para ver como el mensaje va y viene a través de la infraestructura de Service Bus.

Recibiendo mensajes desde Service Bus

Para recibir un mensaje desde Service Bus lo único que hay que hacer es llamar al método receiveQueueMessage pasando como parámetro el nombre de la cola de donde se quiere leer el mensaje. Como parámetro opcional se puede pasar un objeto que puede contener dos propiedades isPeekLock, que permite definir que solamente se quiere obtener el mensaje sin borrarlos de la cola y timeoutInternalInS que define el timeout a la hora de leer de la cola en segundos.

Cuando se hace una lectura de Service Bus el mensaje se borra automáticamente, esto es así para garantizar el orden FIFO de la cola. La variable de timeout se especifica también porque el sistema no se espera hasta que haya mensajes en la cola, así que si no hay mensajes es una manera de no esperar infinitamente.

serviceBusService.receiveQueueMessage(queueName, { isPeekLock: true }, function(error, lockedMessage){
if(!error){
// Message received and locked
serviceBusService.deleteMessage(lockedMessage, function (deleteError){
if(!deleteError){
// Message deleted
}
});
}
});

Así una vez que se ha leido el mensaje de la cola y se ha procesado el siguiente paso es borrar ese mensaje de la cola para que no esté disponible de nuevo.

En la demo del articulo lo que se está haciendo es leer los mensajes y devolverlos en una respuesta de tipo JSON para mostrarla en la interfaz de usuario de la página de ejemplo.

Demo

La demo cosiste en dos controladores que leen y escriben mensajes en Service Bus y que son utilizados por una tercera vista que se encarga de enviar un mensaje y leerlo.

Para ello se ha generado un HTML que permite enviar mensajes a la cola y los va leyendo de manera automática cada 10 segundos.

clip_image009

Una vez que se ha enviado un mensaje el gestor se encarga de leer los mensajes:

clip_image011

La demo se puede ver en esta url http://dpespainnodejsdemo.azurewebsites.net/queueDemo

El código fuente se puede descargar desde aquí https://github.com/LuisGuerreroDpe/Windows-Azure-Demos/tree/Node.js/Node

Diferencia entre las colas de Windows Azure Storage y Windows Azure Service Bus Queues

Caracteristica

Windows Azure Queues

Service Bus Queues

Garantía de orden

No

Sí, FIFO (a través del uso de las sesiones de los mensajes)

Garantía de entrega

Al menos uno

Al menos uno

A lo máximo uno

Soporte de transacciones

No

Sí (a través del uso del sistema local de transacciones)

Comportamiento a la hora de recibir mensajes

No bloqueante (se completa de manera inmediata si no se encuentra un mensaje)

Bloqueante con y sin timeout

No bloqueante (sólo disponible a través de la API de .NET)

Modo de recibir los mensajes

Peek & LEase

Peek & Lock

Receive & Delete

Modo de acceso exclusivo

Basado en cesiones de mensajes

Basado en bloqueos

Duración del bloqueo o de la cesión

30 segundos (predeterminado)

7 días (máximo)

60 segundos (predeterminado)

Se puede renovar el bloqueo usando la API RenewLock

Granularidad del bloqueo o de la cesión

A nivel de mensaje (cada mensaje tiene un valor diferente de timeout)

A nivel de cola (cada cola tiene su valor de bloqueo que se puede renovar usando la API RenewLock)

Soporte para recibir mensajes en grupos

Si (esto se hace a través de especificar el número de mensajes que se desean obtener, máximo 32)

Si

Soporte para enviar mensajes en grupos

No

Si (a través del uso de transacciones o de envío de mensajes en grupo con el cliente)

Para más información sobre las diferencias entre Windows Azure Storage Queue o Service Bus Queues se puede consultar la documentación online.

Luis Guerrero.

Tecnhical Evangelist Windows Azure

@guerrerotook

Cómo conectarse a una base de datos SQL Server desde Node.js

Con el paquete de Microsoft de SQL Server para Node.js, las aplicaciones de servidor pueden conectarse a un servidor de SQL Azure directamente. Esto permite que podamos utilizar toda la potencia de un motor de base de datos relacionar durante el desarrollo de aplicaciones web basadas en Node.js

Configurando el entorno de trabajo

El driver de SQL Server para Node.js utiliza el SQL Server Native Client que permite a todas las aplicaciones utilizar las características de SQL Server. Aunque en Windows Azure este cliente está disponible para todos los tipos de hosting, puede que en durante el desarrollo local sea necesario instalar este paquete.

Este se puede descargar desde aquí: http://www.microsoft.com/en-us/download/details.aspx?id=29065

Creando una base de datos SQL Server

Antes de poder empezar hay que crear una base de datos desde cero, para ello, desde el portal de Windows Azure, hay que pulsar en +New y luego ir a Data Services, una vez allí seleccionar SQL Database

clip_image002

El siguiente paso es rellenar el tipo de servidor, Web o Business y el tamaño de la base de datos.

clip_image004

Una vez seleccionado se procede a introducir las credenciales del servidor de base de datos que alojará la base de datos.

clip_image006

A partir de ese instante ya está creada la base de datos y se puede proceder a utilizarla desde Node.js

Instalando el paquete de node-sqlserver

En el anterior artículo Trabajando con Windows Azure Storage desde Node.js se especificaba un fichero llamado package.json que contenía la configuración de la aplicación de Node.js y además definía las dependencias de la misma. Ahora al usar node-sqlserver hay que añadirlo como dependencia para que el sistema pueda descargar el paquete durante el proceso de npm install que se ejecuta cuando se hace el despliegue a Windows Azure.

{
{
"name": "DpeSpainNodeJS",
"version": "0.1.0",
"private": false,
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "3.4.8",
"jade": "*",
"azure": "*",
"node-sqlserver": "*"
}
}

Para poder continuar con la instalación del paquete de node-sqlserver se necesitan los siguientes prerrequisitos previos:

  • Node-gyp, que se puede instalar a través de npm install –g node-gyp
  • Python 2.7.x para node-gyp. Es importante que sea esta versión porque si no, no se podrá compilar el paquete.
  • Visual C++ 2010
  • SQL Server Native Client

Una vez que se han resuelto estos prerrequisitos el siguiente paso es ejecutar el comando de npm install que resuelve todas las dependencias de esta aplicación.

Ejecutando una consulta contra SQL Server

Una vez que ya se tiene el módulo de SQL Server para Node.js ya se pueden ejecutar consultas con respecto la base de datos. Para empezar a trabajar el primer paso es tener la cadena de conexión al servidor de base de datos donde está alojada la base de datos.

Las cadenas de conexión de SQL Server tienen este aspecto:

Driver={SQL Server Native Client 
10.0};Server=tcp:{dbservername}.database.windows.net,1433;Database={database};Uid={username};Pwd={password};Encrypt=yes;Connection
Timeout=30;"

Y esa cadena de conexión hay que proporcionarla cada vez que se hace una consulta al driver.

var sql = require('node-sqlserver');

var conn_str = "Driver={SQL Server Native Client 10.0};Server=tcp:{dbservername}.database.windows.net,1433;Database={database};Uid={username};Pwd={password};Encrypt=yes;Connection
Timeout=30;"
;

sql.query(conn_str, "SELECT * FROM TestTable", function (err, results) {
if (err) {
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.write("Got error :-( " + err);
res.end("");
return;
}
res.writeHead(200, { 'Content-Type': 'text/plain' });
for (var i = 0; i < results.length; i++) {
res.write("ID: " + results[i].ID + " Column1: " + results[i].Column1 + "
Column2: "
+ results[i].Column2);
}

res.end("; Done.");
});

Además de eso el objeto que devuelve el método query tiene varios eventos que permiten ser notificados en base a los diferentes tipos de eventos que el sistema proporcional.

A continuación una lista de esos eventos.

var stmt = sql.query(conn_str, "SELECT * FROM TestTable");
stmt.on('meta', function (meta) { console.log("We've received the metadata"); });
stmt.on('row', function (idx) { console.log("We've started receiving a row"); });
stmt.on('column', function (idx, data, more) { console.log(idx + ":" + data);});
stmt.on('done', function () { console.log("All done!"); });
stmt.on('error', function (err) { console.log("We had an error: " + err); });

Consideraciones a la hora de publicar en Windows Azure

Windows Azure no instala dinámicamente el paquete de node-sqlserver en tiempo de ejecución, por lo que se tiene que tener cuidado de incluir el binario en la carpeta.

El fichero binario se llamada sqlserver.node y sql.js y se puede descargar desde la web de Microsoft

Luis Guerrero.

Technical Evangelist Windows Azure.

@guerrerotook

Trabajando con Windows Azure Storage desde Node.js

Introducción

Node.js es una tecnología de servidor que permite desarrollar aplicaciones web basadas en JavaScript. Este lenguaje ha sido tradicionalmente un lenguaje que se ejecutaba dentro del contexto de un navegador, pero cuando Google liberó el motor de JavaScript V8 de Google Chrome fue el nacimiento de Node.js.

Node.js es una tecnología que permite ejecutar código de JavaScript fuera del contexto de navegador, existen muchos módulos que se pueden conectar a una aplicación de Node.js para poder extender la funcionalidad inicial. Algunos de estos módulos permiten ejecutar un servidor web HTTP, conectarse a una base de datos, enviar correos o por supuesto, utilizar todas las características que Windows Azure ofrece al desarrollador de Node.js.

Windows Azure Node.js SDK

Windows Azure ofrece un SDK completo para desarrollar aplicaciones en Node.js que puede instalado a través del gestor de paquetes de Node (npm) con el comando npm install azure.

Una vez que se tienen instalado el SDK se pueden desarrollar aplicaciones en Node.js que se pueden ejecutar en Windows Azure Web Sites o como un Cloud Service (Servicio en la Nube).

La demo que se mostrará en este artículo como las que se mostrarán en sucesivos artículos será una web con las diferentes características de Windows Azure a mostrar. Para no empezar de cero con el desarrollo de todos los componentes de la Web, se van a utilizar una serie de módulos de Node.js para hacer el trabajo más sencillo. También se va utilizar un entorno integrado de desarrollo para facilitar el desarrollo.

¿Cómo empezar a desarrollar Node.js en Ubuntu 13.10?

Lo primero que se tiene que hacer es instalar Node.js y Eclipse Kepler. Para ver el proceso de instalación de Node.js en Ubuntu se puede consultar este artículo “Como instalar la línea de comandos de Windows Azure en Ubuntu 13.10”.

Una vez instalado Eclipse se puede desarrollar con Node.js utilizando la característica de proyecto de JavaScript o se puede instalar una extensión de Eclipse llamada Nodeclipse. Para instalar esta extensión se puede hacer a través de esta url (http://dl.bintray.com/nodeclipse/nodeclipse/0.11/). A partir de aquí ya se pueden crear proyectos en Eclipse de tipo Node.js y que tengan un launcher predeterminado.

clip_image002clip_image004

Creando una aplicación web con node.js

Node.js directamente tiene soporte para desarrollar aplicaciones web directamente, a través del paquete de HTTP, pero para empezar a crear una aplicación web se recomienda utilizar alguna librería.

En el ejemplo de este artículo se ha utilizado express (http://expressjs.com/) que es un framework que permite empezar a desarrollar en Node.js utilizando el patrón MVC y rutas. Además este framework a su vez utiliza otro llamado jade que es un sistema de plantillas html.

Para empezar a utilizar express lo primero de todo hay que generar una app de ejemplo ejecutando este comando:

   1: express –css stylus myapp

Una vez hecho eso, para iniciar el servidor de node se ejecuta:

node app.js

Configurando la aplicación de express

Como parte del ejemplo se van a generar dos rutas una llamada blobs que lo que permite es explorar todos los contenedores de una de Windows Azure y la otra ruta es tables donde se muestra información sobre las tablas que hay en Windows Azure Storage.

Windows Azure Storage utiliza un nombre de la cuenta y una llave de acceso que permite acceder al servicio. Esta información tiene que ser provista en todo momento cada vez que se genera un cliente para conectarte a cualquier servicio. En vez de estar cada vez que se genera el cliente, poniendo como parámetro estos dos valores, se pueden establecer esos dos valores como parte de los valores de entorno del proceso que ejecuta node.js

Para establecer esas dos variables hay que ponerles un nombre concreto:

process.env['AZURE_STORAGE_ACCOUNT'] = 'myazureaccount';
process.env['AZURE_STORAGE_ACCESS_KEY'] =
wiqoueoiqwueoiuqweoi2098130928109283oio==';

A partir de este punto en cualquier fichero JavaScript del servidor se puede requerir como dependencia azure y se puede empezar a crear los clientes.

Blobls

En el ejemplo de este post primero se listan los contenedores de la cuenta. Cuando se hace click en uno de los contenedores se listan los blobs y se hace click en uno de esos blobs el fichero se descarga en el navegador del usuario.

Para conseguir esto se utilizan los parámetros querystrings de la url para saber en cada momento que operación se está haciendo.

clip_image006

Trabajando con el SDK de Windows Azure Storage

Como bien es sabido JavaScript utiliza funciones para realizar los callbacks de las llamadas que se realizan de manera asíncrona, así que el SDK de Azure para Node.js no es diferente. Casi todas las operaciones que expone el cliente de blobs requieren funciones en la llamada para devolver el resultado de la operación.

Para crear uno de estos clientes hay que hacer lo siguiente:

var azure = require('azure');
var blobService = azure.createBlobService();

En la primera línea se está obteniendo la referencia al paquete de azure, una vez conseguido, el siguiente paso es llamar al método createBlobService que genera el cliente de blobs.

Listado de contenedores

Para hacer el listado de los contenedores hay que llamar al método listContainer que acepta dos parámetros options y callback.

· options es un objeto que contiene información sobre cómo hacer la petición con propiedades como: prefix, maxresults, marker, include, timeoutIntervalsInMs

· callback es la función que se ejecutará cuando la operación de listado de los contenedores se complete satisfactoriamente.

La función de callback acepta dos parámetros, uno llamado error y el otro containers. A partir de ese punto el segundo parámetro containers es un array con la lista de los contenedores que hay en la raíz del servicio. Cada uno de esos objetos a su vez contiene información sobre cada uno de los contenedores.

En el ejemplo de la app se listan todos los contenedores por su nombre con lo que se genera un array con los nombres para después pasar ese listado a la vista y que lo dibuje.

blobService.listContainers(function(error, containers) {
if (!error) {
var value = '';
for ( var index in containers) {
for ( var item in containers[index]) {
if (typeof (item) != 'function') {
value += (item.toString());
value += ' ';
value += (containers[index][item]);
value += '<br/>';
}
}
}

res.render('blobs', {
value : value,
containers : containers,
type : 'containers'
});
}
});

Es en esa llamada res.render donde se pasa un objeto con las diferentes propiedades que luego la vista utilizará.

Jade

La vista utiliza Jade para definir las plantillas y esta a su vez se puede programar, este es el código de la plantilla de los listados de los contenedores.

extends layout
block content
h1 Blobs Demo
h2 Container list
if(type === 'containers')
ul
each item in containers
li
a(href="/blobs?containerName=#{item.name}") #{item.name}

Es importante el indentado de los elementos porque eso define la jerarquía dentro del HTML. Como se puede apreciar se itera por la lista de los contenedores y se generar enlaces de tipo “a” para que el usuario pueda navegar por la app.

clip_image007

Obtener el contenido de un blob

La última operación que se va a cubrir en este artículo es obtener el contenido de un fichero y devolverlo en la respuesta de HTTP. Para ello se utiliza la operación getBlobToStream que requiere como parámetro el nombre del contenedor, el nombre del blob y una referencia al objeto response de la petición de HTTP de Node.js

blobService.getBlobToStream(container, blobName, res, function(error){
if(!error){
res.writeHead(200);
res.end();
}
else
{
console.log('error');
console.log(error);
res.end();
}
});

Recapitulando

Desde Node.js se puede acceder a toda la funcionalidad que expone Windows Azure Storage para trabajar en aplicaciones en la nube. La API permite integrar Azure dentro del desarrollo normal de una aplicación web.

A partir de aquí se puede consultar la documentación y ejemplos disponibles de Windows Azure para Node.js. La documentación del SDK de Node.js.

Publicar el proyecto en Windows Azure

Para publicar el proyecto de ejemplo no es necesario hacer nada en especial, se puede hacer push al repositorio de Git, se pueden copiar los ficheros desde FTP, ect.

El propio servidor tiene instalado Node.js y hará durante el proceso de instalación un npm install para resolver las dependencias.

La única cosa que hay que tener en cuenta es que el fichero inicial tiene que llamarse server.js y no app.js así que hay que renombrar ese fichero.

La demo completa se puede explorar desde esta url alojada en Windows Azure.

http://dpespainnodejsdemo.azurewebsites.net/

El código de ejemplo se puede explorar y descargar desde aquí.

https://github.com/LuisGuerreroDpe/Windows-Azure-Demos/tree/Node.js/Node

Luis Guerrero.

Technical Evangelist Windows Azure

@guerrerotook

Material de mi charla del TechDay Tour de Madrid

Aquí están la presentación utilizada en el TechDay Tour para mi charla de Windows Azure. Es una introducción de los servicios que ofrece Windows Azure.

clip_image002

Una de las demos de esta charla, fue como subir un blog basado en Ghost con git, desde la consola. Sobre esa demo hay un artículo publicado en el blog de MSDN España: http://blogs.msdn.com/b/esmsdn/archive/2014/02/14/c-243-mo-montar-un-blog-basado-en-ghost-en-windows-azure-web-sites.aspx

Luis Guerrero.

Technical Evangelist Windows Azure

@guerrerotook

Cómo montar un blog basado en Ghost en Windows Azure Web Sites

Windows Azure Web Sites, en adelante WAWS, permite a los usuarios de Windows Azure alojar sitios web en segundos. Con una subscripción de Azure puedes tener hasta 10 sitios web gratuitos, con cuotas diarias de CPU, ancho de banda y espacio. Es un servicio estupendo si quieres montar un blog personal muy sencillo.

En ese sentido Ghost es una plataforma de blogging basada en Node.js que utiliza Markdown para el contenido de los post. WAWS permite ejecutar aplicaciones web basadas en ASP.NET, Node.js, Python y PHP, así que es la mejor opción para poder alojar nuestro blog.

Para hacer más interesante el proceso se va utiliza la universal CLI de Azure que está basado en Node.js también.

Los requisitos para poder empezar a crear el sitio web y poder bajarte las dependencias son:

· Node.js para el CLI y NPM (Node Package Manager): http://nodejs.org/

· Windows Azure Universal CLI: npm install azure-cli –g

· Git para subir nuestro Código al sitio web: http://git-scm.com/downloads

Una vez que se tienen los requisitos instalados, se puede empezar a trabajar.

Windows Azure Universal CLI

El primer paso es registrar nuestra subscripción de Windows Azure con la CLI, para hacer eso, se abre una ventana de comandos de Windows y se escribe el siguiente comando:

azure account download

Lo que fuerza a bajarse del portal el fichero .publishsetting que contiene todos los datos necesarios para poder conectarse al portal de Windows Azure y poder realizar operaciones. Una vez descargado el fichero se tiene que importar para poder tenerlo como activo en la plataforma. Este proceso se realiza ejecutando el siguiente comando:

azure account import {path to .publishsettings file}

A partir de este momento se puede ejecutar este comando para listar las subscripciones activas:

azure account list

Creando el sitio web desde la línea de comando

Una vez que se tiene activa la línea de comando, se puede realizar opciones sobre la cuenta. Ahora es el momento de crear el sitio web. En este caso, además, se quiere que la web se comporte como un repositorio remoto para poder hace push desde git.

Una cosa a tener en cuenta con este proceso, es que, cuando se ejecuta el comando, el propio proceso de generar el sitio web en Windows Azure, crea en local un repositorio git y además agrega la url remota del repositorio como un origen remoto, así que antes de poder ejecutar este comando, sería ideal bajarse el código de Ghost en una carpeta donde ya este el código fuente.

Descargando Ghost

Para descargar Ghost, se puede hacer de dos maneras, bajarte el código fuente sin los módulos de los que depende, o generar el código. En este caso vamos a ir por la opción más sencilla que simplemente es bajarse el código y resolver las dependencias. Para ello, hay que ir a https://ghost.org/download/ y pulsar el botón de descarga.

clip_image002[4]

El fichero zip se puede descomprimir en c:\ghost y ahí mismo inicializar el repositorio git.

clip_image004[4]

Creando el sitio web

Ahora que ya se dispone del código fuente de Ghost, es el momento de crear el sitio web, desde la línea de comando.

clip_image006[4]

Como se puede apreciar en la captura de pantalla, además de crear el sitio web, el comando ha ejecutado localmente git init y git remote add.

Configurando Ghost para Windows Azure Web Sites

Ahora se va a proceder a configurar Ghost de manera correcta, resolver las dependencias, añadir todos los ficheros al repositorio y establecer la configuración correcta.

WAWS requiere que el fichero .js inicial para ejecutarse se llame server.js así que hay que hacer una copia del fichero index.js.

Para terminar de configurar Ghost hay que abrir un fichero llamado config.example.js donde existe un objeto de JavaScript que contiene la configuración del sitio web para los diferentes modos. En este ejemplo se tiene que configurar production, porque después en la configuración del sitio web se agregará esa variable de entorno.

Hay que cambiar la url del sitio web por la nuestra (myghostblog01.azurewebsites.net) además de cambiar el puerto por el cual se escucharán las peticiones web. De manera predeterminada es el puerto 80, pero hay un mecanismo por el cual se puede preguntar al runtime cuál es el puerto (process.env.PORT).

Hay que tener en cuenta que cuando se haga el push en el servidor y se despliegue la app el fichero config.example.js pasará a ser config.js y si se desean hacer más modificaciones se tendrán que hacer en el fichero config.js.

Establecer el entorno de Node.js a producción

Para cambiar el entorno se tiene que crear una variable de configuración del sitio web. Como siempre se puede hacer a través del portal o escribiendo el siguiente comando:

azure site config add NODE_ENV=production

clip_image008

Subir el blog a través de GIT

El último paso para publicar el blog, es añadir los ficheros locales al repositorio de Git, hacer commit local y luego hacer push al servidor remoto, en el cual se ejecutará el proceso de publicación de Ghost.

En el portal de Windows Azure para el sitio web, existe una pestaña llamad deployments, que contiene información sobre los despliegues que se han realizado en la web. Como todavía no se han realizado ninguno, aparece información de cómo hacer un commit al servidor.

clip_image010

Para hacer el commit local hay que ejecutar estos comandos de Git:

git add .

git commit –m “Initial Checkin”

git push azure master

Cuando se ejecute este último commando, la consola de git solicitará al usuario las credenciales de deployment para el repositorio. Si no se ha creado una contraseña se puede crear desde el panel de administración del sitio web.

clip_image011

Una vez que se ha ejecutado el comando de push en el servidor la consola aparece el resultado indicándonos que ha sido correcto.

clip_image013

El portal de Windows Azure ahora ha cambiado y se puede ver cuál es el deployment activo.

clip_image015

El último paso de todo el proceso sería navegar hasta la el blog de Ghost y comprobar que funciona correctamente.

clip_image017

Conclusiones

Windows Azure Web Sites es la plataforma para publicar sitios webs más flexible que existe ahora mismo en el mercado. Permite utiliza tanto Git, como TFS para conectar un repositorio de código y poder cerrar el ciclo de integración continua y entrega continuada que existe en los equipos para entregar funcionalidad.

Este artículo simplemente se ha centrado en una plataforma de bloggin como es Ghost, pero si el usuario quisiera desarrollar algún módulo para Ghost, tendría en WAWS la plataforma perfecta para testear, desplegar y desarrollar online con Visual Studio Online “Monaco”.

Luis Guerrero.

Technical Evangelist Windows Azure

@guerrerotook

Pruebas de rendimiento Web para Windows Azure

Una de las preguntas más recurrentes que suele tener los clientes a la hora de trabajar en Windows Azure suele ser, ¿cuál será el rendimiento de mi sitio web en Azure?

La respuesta a esta pregunta no es sencilla o universal. Depende de muchos factores, del tamaño de la máquina utilizado en el servicio en la nube, de la tecnología, cuantas consultas se hagan a la base de datos, ect. El número de factores que pueden determinar ese número final es amplísimo, así que no se puede dar una respuesta para todos los casos.

Entonces ¿cuál es la mejor aproximación para dar respuesta a esa pregunta?

Medir. Medir. Medir.

Pero antes de medir el tiempo que tarda el sitio web en responder, cabe mencionar algunos artículos creados por otros desarrolladores sobre cómo aumentar el rendimiento de las aplicaciones web.

Coding Horror – Performance is a Feature

Scott Hanselman – Penny Pinching in the Cloud: Enabling New Relic Performance Monitoring on Windows Azure Websites

Medir

La mejor manera para saber si una aplicación web es lenta o rápida es medir el tiempo que tarda una respuesta. Esto permite tener una media real de como el sitio web funciona, pero eso no es suficiente. Se necesita además, simular cierta carga, varios usuarios, con varios patrones de uso de la web. Y no solo hacer una sola petición, sino una navegación completa del usuario comprobando cookies, parámetros de la url, inicios de sesión, ect.

Una vez que se ha establecido un escenario base, uno puede empezar a realizar optimizaciones en su código para ver cómo se mejora ese tiempo. Es importante realizar estas mediciones en el rendimiento una vez que se ha realizado el sitio web, o por lo menos cuando está a punto de cerrarse el proyecto. No tiene ningún sentido empezar a hacer optimizaciones tempranas, ya que son un anti patrón muy claro.

Premature-Optimization and Performance Anxiety

Performance anti patterns

Visto todo lo anterior, lo ideal sería disponer de algún software que nos permite grabar la navegación de un usuario y que después sea capaz de volver a simular todos los pasos que ese usuario ha hecho. Justamente estamos hablando de los Web Performance Load Test de Visual Studio Ultimate.

Web Performance and Load Test

Visual Studio en su versión Ultimate, incluye un tipo de proyecto dentro de la categoría de Test llamado Web Performance and Load Test, que permite grabar sesiones web.

clip_image002

Cuando se ha creado el proyecto, hay un fichero con extensión de tipo .webtest donde aparecerán todas las peticiones HTTP que se han grabado para esa sesión. Cada fichero representa una colección de peticiones HTTP que pueden ser una historia de usuario, una navegación sobre una característica a medir, o simplemente una invocación a una API Rest.

clip_image004

Se puede hacer una grabación con Internet Explorer donde se registran todos los pasos que el usuario ha hecho en el sitio web.

clip_image005

clip_image006

Una vez que ha terminado de hacer la grabación aparecerán en Visual Studio la lista de Urls a testear.

También se puede utilizar un origen de datos para obtener las urls y así hacerlos parte un test de integración.

Por supuesto se pueden agregar a mano las peticiones, las condiciones para dar como válida una petición y todo lo relacionado con el ciclo de vida de una petición.

clip_image008

Una vez que se ha confeccionado la lista de las Urls que forman parte del test, se puede pasar a hacer la prueba de rendimiento o se puede personalizar las peticiones. Hay un botón en la barra del test que permite generar el código en C# asociado de las peticiones para poder modificarlo a petición del usuario, de esta manera se puede automatizar mucho más el proceso.

clip_image010

Prueba de carga

El siguiente paso es generar y configurar una prueba de carga para la prueba web recién creada. Dentro del proyecto de Test hay que pulsar en añadir nuevo elemento y seleccionar prueba de carga (Load Test).

clip_image012

En el cual inmediatamente creará un asistente en el que se pueden configurar las diferentes opciones para la prueba de carga.

clip_image014

1. Darle un nombre al escenario

clip_image016

2. Ahora se seleccionan el patrón de carga, como se desean simular los usuarios de la prueba. Se puede elegir un valor constante de usuarios y otro incremental en el que se pueden configurar todas las opciones de incremento.

clip_image018

3. En la siguiente pantalla se puede elegir la manera en la que se mezclan los diferentes escenarios de prueba (que son las pruebas web que se han definido antes).

clip_image020

4. En esta pantalla es donde se agregan los diferentes test que se van a formar parte de las pruebas y que tanto porciento representan.

clip_image022

5. Ahora se pueden seleccionar las velocidades de red para calcular el tiempo de descarga.

clip_image024

6. Mezcla de navegadores

clip_image026

7. Ahora se pueden seleccionar las máquinas de las que se quieren obtener los contadores de rendimiento, en el caso que se está tratando ahora (Windows Azure) tendríamos que abrir los puertos de WMI para poder acceder a esa información, pero si se está haciendo una prueba en local con otra máquina se puede poner el nombre de la máquina y qué contadores de rendimiento se quieren monitorizar.

clip_image028

8. La última opción define cuánto tiempo durará la prueba.

clip_image030

Por supuesto todas estas opciones pueden ser modificadas posteriormente en cualquier momento. Una vez finalizado el asistente, en Visual Studio aparece esta pestaña que contiene las propiedades del proyecto de carga

clip_image032

Recopilando datos

La prueba de carga consiste en recopilar datos de muchos contadores, no solo de las máquinas en las que se ejecuta la web, sino de los agentes que ejecutan las pruebas de cargas. Eso hace que una de las opciones a la hora de guardar las muestras de la prueba sea una base de datos SQL Server. Desde la opción de administrar el controlador de la prueba, se puede acceder al almacén donde se guardarán los datos.

clip_image033

Desde aquí se puede configurar en qué instancia de SQL Server se guardaran los datos de muestra. La base de datos tiene que tener un esquema predeterminado para que funcione correctamente. En el directorio de instalación de Visual Studio hay un fichero llamado (C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE) loadtestresultsrepository.sql que contiene el script necesario para generar la base de datos desde cero.

Ejecutando la prueba

Una vez que se ha configurado todas las opciones de la prueba de carga, se puede proceder a ejecutar la prueba. Visual Studio ofrece un panel de control para ver toda la información sobre la prueba, los contadores y los resultados de manera provisional. Toda la información que se recopila se guarda en la base de datos antes configurada y se puede volver a abrir para consultar los datos.

Panel de información

Cuando se ha acabado la prueba y se vuelve a abrir el resultado, primero aparece un resumen de todo lo ejecutado.

image

Donde se puede visualizar información relativa a cuando se ha ejecutado la prueba, los principales valores del resultado; carga de usuarios, media de tiempo de respuesta de la web, número de peticiones por segundo, ect.

Además de esta información, se puede visualizar individualmente por cada una de las web que forman parte de la prueba, la información del número de peticiones y de tiempo medio de respuesta.

Al final de todo aparece el detalle del controlador y de los agentes que han realizado la prueba.

Graficas

Otra pestaña muy importante para entender los resultados de la prueba de carga es la de gráficas. En esta pestaña se puede visualizar, a lo largo del tiempo, los valores que se deseen. De manera predeterminada Visual Studio ofrece un cuadrante de cuatro gráficas, donde se pueden añadir métricas sobre las diferentes opciones de la prueba de carga.

image

Conclusión

Con las pruebas de carga Web de Visual Studio se pueden hacer mediciones del tiempo medio de respuesta de los sitios web, numero de excepciones, número de peticiones por segundo antes de dar un error de ocupado, ect.

De esta manera se puede hacer una prueba de carga directamente apuntando a Windows Azure, para ver cuantas peticiones son capaces de responder los servidores antes de dar errores 500. Es importante hacer estas pruebas con el número de servidores que se utilizará en producción para intentar que el entorno de pruebas de carga sea lo más similar al entorno final.

Luis Guerrero.

@guerrerotook

[Evento] using cpp::std 2013

El pasado día 26 de noviembre se celebró en la Universidad Carlos III un evento dedicado al desarrollo de C++. Tuve la oportunidad de participar como ponente hablando del desarrollo paralelo con la Microsoft Parallel Pattern Library (PPL).

Dejo aquí la presentación y las demos que hice en C++.

clip_image002

 

Y el código de las demos de PPL en C++.

Luis Guerrero

Windows Azure Technical Evangelist

@guerrerotook