Syntax Highlighter

sábado, 9 de septiembre de 2017

DNN Redis Caching Provider 3.0

Hi again! Following up with the DNN module updates, I have done some modifications on the DNN Redis Caching provider so it can be configured now through the DNN Persona bar.

The summary of changes of this release is:

  • Changed the minimum required DNN version to 9.0.1
  • Refreshed nuget packages including the latest version of StackExchange.Redis 1.2.6
  • Added configuration UI in the Persona Bar. Now the provider is not automatically enabled during installation, you need to use the new UI.
  • The Redis client automatically reconnects after a Redis connection failure


If you have any interesting idea to add on the settings area, please let me know. I have thought on implementing a redis-cli command line interface, but I believe that would be better to wait for DNN 9.2 and implement that as a “DNN Prompt” command (see

Hope this helps.

Un saludo and happy coding!

Building an Evoq Liquid Content chatbot with Azure Bot Service

dnnrecipes2A few months back we spent some days working in an internal hackathon at DNN Corp. called DNN Developer Days that allowed to explore the power of Evoq Liquid Content APIs. The result was an awesome set of project examples giving a glimpse of what you can do when integrating the APIs to publish and reuse the content through different channels, such as Amazon Echo, Azure Bot Service or a smart TV, including AI and machine learning capabilities such as tagging your site images automatically. You can explore all of them at website, I hope you find them interesting.

I personally worked on an Azure Bot Service chatbot, exposing the contents of a recipes website through different channels like Skype, Facebook Messenger, Telegram or Teams. You can quickly play with the example at 

IMG_0365 IMG_0366 IMG_0367

All the documentation and source code for each project is available on a GitHub repository at 

Chatbot as a Channel: Integrating Liquid Content with Azure Bot Service

Integrating Artificial Intelligence (AI) into your site or application is easier than you think. Companies like Google, Microsoft and Amazon are making big bets on AI and machine learning. All three companies provide freely available toolkits and services that developers can use to integrate AI into our applications.

The recipes bot integrates with messaging apps like Skype, Telegram or Facebook Messenger. As a Skype user, for example, you can provide the bot with a list of ingredients. The bot connects to Liquid Content to retrieve recipes that contain those ingredients, then provides an answer to the Skype user.

This is just the beginning. I plan to connect more third-party services to the recipe bot, such as LUIS, Cortana, Vision API and Apple Pay.

Bookmark this page and check back here to get updates. I’ll update the page each time there’s news to share. You can also follow me on Twitter @davidjrh and I will mention the new additions there.

Building the Recipes Bot

In this tutorial, I show you how I built the recipe bot. The bot uses the Azure Bot Service, the intelligent, serverless bot service that scales on demand. With this service, you will be able to publish your bot through multiple channels without managing or patching any server. It can connect to additional messaging apps without writing or adding new code. The service is free, and you will only pay for the resources you consume.

ArchitectureGetting Started


To follow the tutorial, you will need:

  • An active Azure subscription. You will need to login as owner of the subscription to host the bot service. You can sign up for a free subscription here.
  • An Evoq Content or Engage site with Evoq Liquid Content enabled

Also, to debug your C# bot locally using breakpoints in Visual Studio you will need:

For more information about how to setup the debugging environment, visit Debug with the emulator and Debug an Azure Bot Service C# bot on the bot framework documentation.

Content Index

  1. Setting up the recipes
  2. Creating the basic bot
  3. Setup continuous integration
  4. Debugging the bot on your local environment
  5. Customizing the basic bot
  6. Test your recipes bot
  7. Adding a webchat in your site
  8. Known issues

Hope this helps.

Un saludo and happy coding!

sábado, 12 de agosto de 2017

DNN Application Insights v3.0

Hi all. After a while working with React/Redux and the new DNN PersonaBar model introduced on DNN Platform 9.0, I have started to update all my modules to avoid the use of the disappeared Host menu on DNN.

The first module updated has been the DNN Application Insights now available for download on GitHub. This includes:

  • Previous package updates to support version 2.4.0 of Application Insights, including enhanced live metrics streaming (committed by Mitchel Sellers)
  • New UI on the persona bar to setup the module settings
  • Requiring DNN Platform 9.0.1 or later


If you have any interesting idea to add on the settings area, please let me know. I have been checking all the configuration settings that can be done through the Application Insights configuration system and I will start adding them for the next release.

Updates for the Redis Caching Provider and Azure AD provider are the next ones.

martes, 1 de agosto de 2017

Providing a GUID function in Azure Resource Manager templates with Azure Functions

arm-functionsSome time back while preparing the Global Azure Bootcamp Science Lab, I face the lack of some functions that are not available when authoring Azure Resource Manager templates. When creating some type of resources such as Batch jobs or RBAC related resources, you need to pass a GUID (Universally unique identifier) but there is no function to create them inside the template, so you need to pass them as template parameters making the result awful.

There is already a Feedback item describing the issue (please vote on and there are other similar issues when you need to use more sophisticated functions such as date related values.

When trying to provide a workaround, I finally found that could be solved with nested templates, so I started by building a simple ARM Guid template that could be referenced on your primary one. You can check that repo here

But when testing the GAB lab with millions of guids, found that from time to time that template was generating duplicated guids, so finally ended by implementing the lab ARM Guid templates by using a WebAPI. You can check the how the guid template was being used at (check lines 100 and 398), and the template API implementation available at

Building a GUID function for ARM templates with Azure Functions

Revisiting this today, I thought that could be more cost effective of having that dynamically generated template by using an Azure Function. Here is the step by step so you can deploy your own, and increase your ARM functions arsenal with the same approach.

Remember that the basic idea is to reference this function in your deployment, that will generate a GUID for later usage on your template.

  1. Create an Azure Function App through the Azure Portal.
  2. Add a function triggered by a HTTP request in C#
  3. Copy and paste the following code in the function body

using System.Net;
using System.Net.Http.Headers;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
     log.Info("C# HTTP trigger function processed a request.");

    // parse query parameter
     string numberOfGuids = req.GetQueryNameValuePairs()
         .FirstOrDefault(q => string.Compare(q.Key, "numberOfGuids", true) == 0)
     if (string.IsNullOrEmpty(numberOfGuids)) {
         numberOfGuids = "1";

    // validate the input
     int guids;
     if (!int.TryParse(numberOfGuids, out guids)) {
         return req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a valid number on the query parameter 'numberOfGuids'");
     if (guids <= 0 || guids > 1000) {
         return req.CreateResponse(HttpStatusCode.BadRequest, $"Invalid number of guids {guids}. Must be a number between 1 and 1000");

     // prepare the template
     var template = @"{
   ""$schema"": """",
   ""contentVersion"": """", ""parameters"": {}, ""variables"": {}, ""resources"": [],
   ""outputs"": {[OUTPUTS]}
     var outputs = await Task.Run<List<string>>(() =>
         var o = new List<string>();
         for (var i = 0; i < guids; i++)
             o.Add(@"""guid" + i + @""": { ""type"": ""string"", ""value"": """ + Guid.NewGuid() + @""" }");
         return o;
     var result = template.Replace("[OUTPUTS]", string.Join(",", outputs.ToArray()));

// return the response
return new HttpResponseMessage() {
     Content = new System.Net.Http.StringContent(



Testing the function

Once you have saved the function, you can test it by doing a webrequest. In my case, when I call the URL I get this answer:

NewGuidWebYou can pass the number of guids to generate as parameter.

Consuming the GUID template by using a nested template

As I documented on the initial GitHub repo, you can just follow these examples to consume then in different ways:

Example 1. Getting a GUID and using it later

  "$schema": "",
  "contentVersion": "",
  "parameters": {},
  "variables": {},
  "resources": [ 
        "apiVersion": "2015-01-01", 
        "name": "MyGuid", 
        "type": "Microsoft.Resources/deployments", 
        "properties": { 
          "mode": "incremental", 
          "templateLink": {
            "uri": "",
            "contentVersion": ""
  "outputs": {
    "result": {
      "type": "string",
      "value": "[reference('MyGuid').outputs.guid0.value]"

Example 2. Getting 2 guids and using them later

  "$schema": "",
  "contentVersion": "",
  "parameters": {},
  "variables": {},
  "resources": [ 
        "apiVersion": "2015-01-01", 
        "name": "MyGuids", 
        "type": "Microsoft.Resources/deployments", 
        "properties": { 
          "mode": "incremental", 
          "templateLink": {
            "contentVersion": ""
  "outputs": {
    "result0": {
      "type": "string",
      "value": "[reference('MyGuids').outputs.guid0.value]"
    "result1": {
      "type": "string",
      "value": "[reference('MyGuids').outputs.guid1.value]"

If you still have any doubt on how to consume the outputs, check the GAB Science Lab template on line 398

Hope this helps! Un saludo y happy coding!

martes, 25 de julio de 2017

[Video] Introducción a Application Insights

Se me había pasado de publicar en el blog el vídeo sobre Application Insights que edité el pasado mes de Mayo, pero mejor tarde que nunca Smile

Application Insights es un servicio de Application Performance Management (APM) extensible para desarrolladores web en varias plataformas, que sirve para supervisar aplicaciones web en directo. Se pueden detectar automáticamente anomalías de rendimiento además de proveer de herramientas de análisis que ayudan a diagnosticar incidencias comprendiendo lo que los usuarios están haciendo con la aplicación. En esta sesión veremos una introducción rápida al servicio viendo cómo se implementa y configura el servicio, tanto para aplicaciones web nuevas partiendo desde cero, como sitios web basados en CMS.

sábado, 8 de abril de 2017

Global Azure Bootcamp 2017

2017-logo-800x540Y ya estamos otro año más metidos en el jaleo del mayor evento global sobre Microsoft Azure realizado por y para la comunidad técnica. Como cada año, más de 200 ciudades alrededor del globo reunirán el día 22 de abril a más de 10.000 personas unidas con un solo objetivo: aprender sobre la plataforma cloud de Microsoft mientras pasamos un día inolvidable.

Este evento cada año va a más. Desde que comenzamos a realizarlo en España los números no han parado de crecer. Si bien el año pasado en Madrid pasamos de 400 asistentes (tuvimos que parar por problemas de aforo), este año llenamos el cupo tras tres días de apertura del registro. Lo mejor, que más ciudades se han animado y en esta edición tenemos hasta 4 ciudades españolas con el mismo objetivo. Os dejo los enlaces:

Aunque esta edición será inolvidable. El año pasado lo prometimos, y aquí lo tenemos.

Lab Científico “Made in Spain”


Foto: Daniel López –

Como cada año, la mejor parte de este evento es la parte del lab científico. Todos los participantes, con el apoyo de los organizadores de cada sede, donan recursos de computación para colaborar en un proyecto de investigación científica en pro de la humanidad. En años anteriores, se han colaborado en proyectos como la investigación de la diabetes o la búsqueda de la cura del cáncer de mama. Este año el evento global girará en torno a la ejecución colaborativa de un algoritmo desarrollado por un astrofísico español que permitirá estudiar con más precisión la formación estelar de las galaxias.

iac-logo-300x300Desarrollado por el investigador del Instituto de Astrofísica de Canarias (IAC), Sebastián Hidalgo, en el Global Azure Bootcamp se ejecutará “The secret life of Galaxies: Unveiling the true nature of their star formation” (La vida secreta de las galaxias: desvelando la naturaleza de su formación estelar)**, el primer algoritmo español que se utiliza en este evento. Los participantes del evento se conectarán a la plataforma Microsoft Azure desde todas las sedes repartidas a lo largo del planeta para aportar su talento y conocimientos de forma desinteresada al proyecto científico. Con él, se pretende ahondar en los efectos que dificultan la interpretación de las observaciones astronómicas sobre el conocimiento actual de la formación estelar en las galaxias. De esta manera, se espera saber mucho más sobre los procesos de formación de estos sistemas y el impacto que sobre ellos tuvieron determinados fenómenos cosmológicos.

El objetivo del algoritmo desarrollado en el IAC y que va a ser probado en el Science Lab es precisamente limitar el impacto de todos estos efectos para poder comparar la predicción de los modelos con las observaciones de forma más directa. Es un proceso que requiere de un número muy elevado de pruebas y que sólo puede ser realizado en un entorno de computación distribuida”, explica Sebastián Hidalgo. Al término del evento, se recopilarán los datos conseguidos con el algoritmo para extraer la información y proceder a su tratamiento.

Más información en:

Arquitectura del lab científico en Azure

Y aquí no solo queda la cosa. Durante estos últimos tres meses he tenido el placer, junto con Adonai Suárez (@adonaisg), Martin Abbot y el mismo Sebastián, la oportunidad de diseñar y adaptar el algoritmo de Sebastián para hacer posible su ejecución en un evento como el Global Azure Bootcamp.


Figura 1. Arquitectura del Global Azure Bootcamp 2017 Science Lab

Tal y como se ha realizado anteriormente, la idea parte de que cada asistente pueda desplegar su propia instancia del lab para colaborar en la investigación ejecutando el algoritmo aportando recursos propios, a la vez que aprende a usar la tecnología usada en la implementación del mismo.

En la figura 1 podemos ver rápidamente las partes de las que constará el Science Lab. Cada asistente desplegará de forma automatizada a través de plantillas de Azure Resource Manager los recursos siguientes:

  • Cuenta de Azure Automation: contendrá, además de algunos módulos específicos para la implementación del lab, un runbook que será el encargado de “alimentar” el algoritmo con ficheros a procesar. Estos ficheros son servidos por un API implementada para el evento y distribuida globalmente, y que será la encargada de controlar el estado de procesamiento de cada fichero y recibir los resultados;
  • Cuenta de Azure Batch: que contendrá el pool de máquinas que se encargarán de la ejecución del algoritmo, desarrollado en Python3. Una característica interesante es que la implementación se ha realizado con nodos Ubuntu. Ya veremos cuántos pingüinos desplegamos el 22 de Abril.

Después de realizar cada prueba, se envían los resultados a los servidores centrales, que serán los encargados de procesar y almacenar la prueba resultante así como notificar mediante EventHubs a otro site donde podrán observarse el estado global de procesamiento, rankings, etc. 

Ahora mismo estamos probando que todo vaya bien, realizando pruebas de carga, etc. Como datos interesantes:

  • Hemos hecho una estimación de cores que se desplegarían según la experiencia de años anteriores (entre 25K y 30K cores)
  • Se han preparado más de 17 millones de ficheros de entrada, más que suficientes para cubrir la capacidad de cómputo a desplegar
  • Cada fichero contiene unas 80 ejecuciones del algoritmo, lo que resultaría en 1280 millones de ejecuciones
  • Si tuviéramos un solo ordenador con un core, para procesar estos ficheros tardaría 235 años en finalizar la operación. La idea es hacerlo en un sólo día.


De derecha a izquierda, Adonai Suárez, Sebastián Hidalgo y yo mismo, un día en el Instituto Astrofísico de Canarias mientras trabajábamos en el lab científico


La agenda de Madrid estará compuesta por 3 tracks en paralelo con unas sesiones muy variadas y con mucho nivel. La selección fue muy difícil entre todas las propuestas, tanto que finalmente estamos preparando un cuarto track virtual para que las sesiones que no cupieron en la agenda sí lo hagan estrenándose en Channel 9 el mismo día del evento.

Cómo no, durante la apertura del evento tendremos al mismísimo Sebastián Hidalgo para que nos explique en vivo y en directo su algoritmo, algo que nos dejará a todos fuera de órbita Smile. Durante la mañana también estaré personalmente junto a Adonai Suarez y Sebastián en la sesión que muestra cómo se ha realizado la implementación sobre Azure del Global Azure Bootcamp en la sesión “Descubriendo la Historia del Universo con Microsoft Azure”, en la que podréis realizar preguntas adicionales sobre la arquitectura del lab.


Calentando motores…

Así que prácticamente a dos semanas del gran evento, no me queda más que deciros que disfrutéis de la semana de descanso, porque el 22 de Abril ponemos Warp 9 rumbo a las profundidades del Universo. Atentos a las sorpresas…


Un saludo, ¡y Happy Coding!

sábado, 18 de marzo de 2017

Visual Studio 2017 Launch Event con TenerifeDev


El próximo 23 de abril de 2017 a las 17:30 en el Salón de Grados de la ESIT tenemos un nuevo encuentro con TenerifeDev, dentro de los eventos globales que se están realizando sobre las novedades de Visual Studio 2017. Si quieres conocerlas, no te pierdas este evento en el que hablaremos de ellas y las podremos probar.


• Novedades en Visual Studio 2017

• Desarrollo con Xamarin en VS 2017

• Data Tools

• Debugging, Unit Testing, Live Code Analysis, Intellisense

• Continuos Delivery and Deployment

Contaremos con:

• Santiago Porras, MVP Windows Platform (@saintwukong)

• Eickhel Mendoza, MCSA Cloud Platform (@eickhel)

• César Abreu, MVP Azure (@cesabreu)

• David Rodríguez, MVP Azure (@davidjrh)

Más información y registro en

miércoles, 18 de enero de 2017

Microsoft Tour, Workshop de Xamarin, Azure Functions y Machine Learning el 30 de Enero

El próximo 30 de enero, dentro de la gira de Microsoft por las universidades de España, vamos a tener el placer de tener varias sesiones relacionadas con bots, Azure, Machine Learning y Xamarin de mano de los cracks del departamento de DX (Developer Experience) de Microsoft.

Para que los tengas todos a mano:

  • 10:00 – 14:00 Microsoft Tour en la Universidad de la Laguna
    ¿Eres un estudiante técnico? ¿Apasionado de la tecnología? ¿Emprendedor nato?
    Microsoft Academic Tour llega a la Universidad de la Laguna gracias al Club .NET para enseñarte las últimas novedades en herramientas cross-platform, que tienes a tu alcance y que están usando la gran parte de empresas y startups.
    ¿Dónde? Salón de Grados de la ESIT
  • 16:00 – 18:00 Workshop Xamarin is coming en ULL
    El día 30 de enero, en el Aula 2.3 de la Escuela Superior de Ingeniería y Tecnología de la Universidad de la Laguna, podrás aprender a crear tu propia aplicación para Windows, Android e iOS en una tarde. Yo que tú, no me lo pensaba dos veces :) ¿Te imaginas poder crear un Whatsapp 2.0? ¿Y un Pokemon Go 2.0? Es más fácil de lo que te imaginas, y te queremos a enseñar cómo.
    ¿Dónde? Aula 2.3 Escuela Superior de Ingeniería y Tecnología
  • 18:00 – 19:30 Azure Functions y Machine Learning con TenerifeDev y Microsoft
    Estamos de suerte. Aprovechando que vienen los compis de Microsoft durante estos días en su gira por España, tendremos una sesión especial en TenerifeDev en el que hablaremos de dos temas de actualidad: Azure Functions y Machine Learning.
    ¿Dónde? CIFP César Manrique

¡Chacho, que te lo pierdes!

Related Posts Plugin for WordPress, Blogger...