Librerías para Mostrar de Graficas para aplicaciones Web

Hay diferentes librerías que se basan dos tags de HTML:

  • Svg: se insertan tags de XML en el tag que generan el gráfico. Permite una mayor interacción y escala automáticamente.
  • Canvas: se ejecutan javascripts sobre el dom del tag para generar el gráfico. Ofrece mejor rendimiento en gráficos complejos.

chartjsChart.js

Esta librería Canvas de código abierto que su principal ventaja es su fácil uso. Es bastante reciente por lo que aun no incorpora muchos tipos de gráficos y las múltiples configuraciones que presentan otras librerías (múltiples ejes, visualización de información en el interior de los gráficos…).

Google Charts

Esta librería Svg es muy completa; incluye más de 25 tipos de gráficos con múltiples configuraciones. El principal problema es que la librería debe ser cargada desde los servidores de Google y además se envían datos a Google para la generación de los gráficos que pueden ser incluso accedidos por terceros. Aunque esta permitido usarla en entornos empresariales; puede ser que el nivel de confidencialidad y privacidad de los datos nos imposibilite su uso.

highchartsHighcharts

Esta librería Svg es la más completa entre las analizadas permitiendo incluso combinar diferentes tipos de gráficos en uno solo. Añade ademas una funcionalidad interesante que es la posibilidad de poder guardar el gráfico en formato PDF, JPG, PNG o SVG. Su uso sólo es gratuito para fines no comerciales.

d3D3.js

Esta librería Svg de código abierto que permite realizar múltiples gráficos. Esta librería es la que usa PowerBI. Es una librería esta más orientada a realizar gráficos más que a usar diferentes tipos de gráficos; por lo que permite realizar los tipos de gráficos más espectaculares. Pero su uso es muy complejo y requiere de una gran curva de aprendizaje. Hay múltiples plugins con tipos de gráficos que basan esta librería que permiten su uso de una manera más adecuada. Algunos ejemplos de plugins:

  • Tipo de gráfico de series temporales: Metricsgraphics.js.
  • Varios tipos de gráficos orientados a gráficas en tiempo real: Epoch.
  • Varios tipos de gráficos para usar directamente en Angular: Angular-nvD3
  • Tipo de gráfico de pie: d3pie. En la actualidad no esta claro su futuro; pero posee un asistente que nos genera automáticamente el código.

Además podemos crear plugins gráficos para usarlos en PowerBI basados en la librería.

Publicado en Desarrollo, javascript, web | Etiquetado | Deja un comentario

Ejecución de scripts de PowerShell en Azure Automation y Backup de SQL Azure

Que es Azure Automation?

azureautomationAzure Automation es un servicio que permite realizar procesos contra recursos de Azure. Esto nos permite automatizar tareas que realizamos con frecuencia. Las tareas que queremos automatizar en Azure Automation se llaman RunBooks. Las tareas se realizan mediante comandos de PowerShell.
El RunBook puede ser principalmente de dos tipos:

  • PowerShell: Directamente el script de PowerShell.
  • Graphical: Editor gráfico que permite ir construyendo el script PowerShell.

Pasos para crear nuestra tarea en Azure Automation

  • Crear Automation Account

    Crear Automation Account

    1.- Crear el Azure Automation.
  • 2.- Crear el RunBook.
  • 3.- Editar y añadir nuestro script de PowerShell. Podemos probarlo en el Test Pane
  • 4.- Publicar el RunBook.
  • 5.- Una vez publicado; podemos programarlo para ejecutarlo periódicamente Schedule o ejecutarlo a demanda mediante un Webhook. Un Webhook es una url a la cual realizamos un post y permite lanzar la ejecución del RunBook.
    Crear RunBook

    Crear RunBook

Ejecución de Scripts de PowerShell en entorno de Azure Automation

En el nuevo portal de Azure se utiliza un nuevo modelo de API AzureRM para trabajar con los recursos de Azure. Este API es bastante parecida al anterior aunque suelen cambiar los parámetros de las funciones. Para logarse y poder utilizar los comandos de PowerShell; a continuación se muestran los nuevos comandos que lo posibilitan.

$Conn = Get-AutomationConnection -Name AzureRunAsConnection
Add-AzureRMAccount -ServicePrincipal -Tenant $Conn.TenantID -ApplicationId $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint
Select-AzureRmSubscription -SubscriptionId $SubscriptionId

Se actualizado el script que realiza un backup de SQL Azure, con la nueva API 🙂

$ResourceGroupName = "jobs"     #Nombre del Resource Group
$serverName = "sqlserver"  #Nombre del Servidor de Sql
$databaseOriginal = "db"   #Nombre de la base de datos a realizar el backup
$databaseCopy = "dbCopy" #Nombre de la base de datos temporal usada para realizar el backup
$storageUrl = "https://{storageaccountname}.blob.core.windows.net/{containername}/"   #Url del storage donde poner el backup
$storageKey = "sadfsdafsdaf"  #Secret Key del Storage
$SubscriptionId = "dadd4a7b-2345-31dd-ba34-abc1774513c3"   #Identificador de la subscripcion
$databaseLogin = "login"  #Login del usuario del SQL
$databasePassword="passowrd"  #Contraseña del usuario de SQL

Write-Output -inputobject "Backuping Database..."

Write-Output -inputobject "Authenticating..." 
$Conn = Get-AutomationConnection -Name AzureRunAsConnection
Add-AzureRMAccount -ServicePrincipal -Tenant $Conn.TenantID -ApplicationId $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint
Select-AzureRmSubscription -SubscriptionId $SubscriptionId
Write-Output -inputobject "Authenticated"

Write-Output -inputobject "CopyDatabase..." 
New-AzureRmSqlDatabaseCopy -ResourceGroupName $ResourceGroupName -ServerName $serverName -DatabaseName $databaseOriginal -CopyDatabaseName $databaseCopy
do
{
    sleep -Seconds 10
    $status = Get-AzureRmSqlDatabase -ResourceGroupName $ResourceGroupName -ServerName $serverName -DatabaseName $databaseCopy
    $exist = $status.Status
}
while ($exist -ne 'Online')
Write-Output -inputobject "Copy Database Completed"

$now=Get-Date -format 'yyyyMMdd_HHmmss'
$storageBlobName = "BackupOf" + $databaseOriginal + $now + ".bacpac"
$storageUrl = $storageUrl + $storageBlobName
    
                   
$databaseSecurePassword =  ConvertTo-SecureString -String $databasePassword -asPlainText -Force                   
$exportRequest = New-AzureRmSqlDatabaseExport -ResourceGroupName $ResourceGroupName -ServerName $serverName -DatabaseName $databaseCopy -AdministratorLogin $databaseLogin -AdministratorLoginPassword $databaseSecurePassword -StorageKey $storageKey -StorageUri $storageUrl -StorageKeyType "StorageAccessKey"   
Write-Output -inputobject "Exporting to Bacpac..."
do
{
    sleep -Seconds 10
    $statusExport = Get-AzureRmSqlDatabaseImportExportStatus -OperationStatusLink $exportRequest.OperationStatusLink
    $status = $statusExport.Status
}
while ($status -ne 'Succeeded')
Write-Output -inputobject "Export to Bacpac Completed" 
Write-Output -inputobject "Delete CopyDatabase..."
Remove-AzureRmSqlDatabase -ResourceGroupName $ResourceGroupName -ServerName $serverName -DatabaseName $databaseCopy -Force
Write-Output -inputobject "Backup de Database Completed"
 
Write-Output "The backup is on this url:"
Write-Output "https://"$StorageAccountName".blob.core.windows.net/"$storageContainerName"/"$storageBlobName".bacpac"

Problema de Versión

Al ejecutar puede ser que os encontréis un error de comando no reconocido error. Este error es debido a que no tenemos disponible la ultima versión de AzureRM.

New-AzureRmSqlDatabaseExport : The term 'New-AzureRmSqlDatabaseExport' is not recognized as the name of a cmdlet, 
function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the 
path is correct and try again.

Se describen los pasos para actualizar a la ultima versión de PowerShell:

  • 1.- Añadir el modulo ModulesInAutomationToLatestVersion que contiene el comando PowerShell que permite migrar a la ultima versión de la API AzureRM y importarlo en nuestro Azure Automation.
    Búsqueda del Modulo ModulesInAutomationToLatestVersion

    Búsqueda del Modulo ModulesInAutomationToLatestVersion


    Importar Modulo ModulesInAutomationToLatestVersion

    Importar Modulo ModulesInAutomationToLatestVersion

  • 2.- La importación nos ha creado un nuevo RunBook con el nombre Update-ModulesInAutomationToLatestVersion. Nos vamos al Test Pane del RunBook (tras editar y salvar ;-)). Aquí introducimos los parámetros que se nos solicitan:
    • RESOURCEGROUPNAME: El grupo que tiene nuestro Azure Automation.
    • AUTOMATIONACCOUNTNAME: Nombre de la cuenta de Azure Automation.
    • NEWMODULENAME: Nombre del Modulo que queremos subir a la ultima versión.

    OJO: Rellanar todos los parámetros, ya que sino afectaríamos a todos los Azure Automation.

    Upgrating modules

    Upgrating modules

Publicado en Azure, Sql Azure | 2 comentarios

Glosario de Directorio Activo Azure II

En esta entrada vamos a explicar los pasos para dar permisos delegados en una aplicación para acceder a apis que interactuan con una suscripción. Por ejemplo para acceder Azure Resource RateCard API o Azure Resource Usage API .

  • 1.- Crear la aplicación en la Directorio Activo de Azure.
    1-newapplication
  • 2.- Indicamos en la aplicación requiere de los permisos delegados para acceder a la Api.
    newpermisionwindowsazureservicemanagementapi1
    newpermisionwindowsazureservicemanagementapi2
  • 3.- Creamos la clave de acceso a la aplicación.
    newkey
  • 4.- Ahora nos posicionamos en la suscripción que va a ser usada para que la api interactua. Dentro de la subscripción vamos a configurar los derechos de acceso.
    accesrightstosubscription
  • 5.- Concedemos el derecho necesario, en nuestro caso de lectura
    accesrightstosubscription2
  • 6.- Buscamos la aplicación que hemos dado de alta en el directorio activo (buscarla por Guid, por nombre no va muy bien :-().
    accesrightstosubscription3
Publicado en Azure, Seguridad | Deja un comentario

Glosario de Azure Web App

En esta entrada se describen operativas relacionadas con Web Apps.

1.- Deployment Slot

En un nivel de servicio Standard o Premium , se permite crear entornos de desarrollo a nuestra Web App. Esto nos posibilita:

  • Testear la aplicación.
  • Permite subir a esteo entorno y realizar el swap o cambio a producción sin perdida de servicio (se automatiza con Auto Swap).

Los pasos son:

  • 1.- Crear el Slotaddslot
  • 2.- Copiar la configuración de otro entorno, así no tenemos que volver a configurar el nuevo entorno.

Cuando se realiza el swap o cambio hay configuraciones que se mueven de un entorno:

  • General settings como el framework version, 32/64-bit, Web sockets
  • App settings (Se puede bloquear para que no se mueva con el check Slot setting en el App Settings)
  • Connection strings (Se puede bloquear para que no se mueva con el check Slot setting en el App Settings)
  • Handler mappings
  • Monitoring and diagnostic settings
  • WebJobs content

Hay otra configuraciones que no se mueven:

  • Publishing endpoints
  • Custom Domain Names
  • SSL certificates and bindings
  • Scale settings
  • WebJobs schedulers

2.- Configurar SSL

  • 1- Dar de alta el dominio. Para ello debemos apuntar al CNAME del dominio de nuestra Web Appaltadominio
  • 2.- Dar de alta el Binding (como haríamos en el IIS). Subimos el certificado y lo bindeamos con el hostname del dominio.binding

Enlaces de Interes Web App

Publicado en Azure, web | Deja un comentario

Azure Search II: Indexers

En la anterior entrada se comento el Azure Search. En esta entrada se profundizará en el Indexer.

Indexer

El Indexer es un servicio que realiza crawl de datos con el objetivo de incorporar documentos en un indice. La creación de este servicio se puede realizar en el portal de Azure, mediante desarrollo con la librería NET SDK o mediante llamadas REST API.

Primeros Pasos

  • 1.- Seleccionar los datos de origen a importar. Estos pueden estar contenidos en:
    • Azure SQL (He probado conectarme a un SQL Azure en otra subscripción pero no he podido 😦 )
    • SQL Server en una maquina virtual
    • Azure DocumentDB
    • Azure Blob storage
    • Azure Table storage

    Azure Search Importar de un origen de datos en SQL Azure

    Azure Search Importar de un origen de datos en SQL Azure


    NOTA: Solo se puede importar una item (tabla). Si queremos importar varias tablas deberíamos crear una vista e importar esta. 😉
  • 2.- Crear el indice a partir de los datos de origen
    Azure Search Importar crear Indice

    Azure Search Importar crear Indice

  • 3.- Definir el periodo en el que se ejecuta el crawl
    azuresearchimportdataschedule
Publicado en Azure, Indices Cache | Deja un comentario

Azure Search

Azure Search

Servicio disponible en Azureazuresearchlarge que permite indexar para información para su posterior búsqueda; como Lucene.
Es escalable tanto a nivel de Servicio (SKU) y nivel de Replicas (número de servicios de Acceso a datos que permite mayor numero de consultas por segundo) o Particiones (número de servicios de indexación e ingesta de datos que permite añadir mayor contenido).

Primeros Pasos

  • 1.- Crear un servicio en Azure Search en el portal de Azure.
    Creación de Servicio Azure Search

    Creación de Servicio Azure Search

  • 2.- Crear los indices que permitirán el acceso a los documentos. Un indice se compone de campos que poseen:

    Se puede crear los indices en el portal de Azure, mediante desarrollo con la librería NET SDK o mediante llamadas REST API.

    Creación de Indice en Azure Search

    Creación de Indice en Azure Search

  • 3.- Subir los documentos al indice. Existen dos opciones:
    • Push: Mediante la librería NET SDK o REST API. Permite tiempo real.
    • Indexer: Configurando un proceso de Crawl a un: Blob storage, DocumentDB, Azure SQL database y SQL Server on Azure VMs. El indice se puede actualizar cada 5 minutos.
  • 4.- Realizar la búsqueda en el indice. Hay diferentes tipos de búsquedas que se pueden combinar para obtener resultados:
    • Search: busca un termino en múltiples campos. Se usa Simple query o Lucene query.
    • Filter: busca coincidencias en un campo. Se usa OData filter language.
    • Suggestions: nos provee de sugerencias para auto-completar términos en las búsquedas.

    Estos resultados pueden ser:

    • ordenados por relevancia (scoring) en función del peso de los campos, fecha del documento valor en campos numéricos, distancia en geospacial o tags.
    • Definir un Scoring en un indice

      Definir un Scoring en un indice

    • ordenados por termino (sorting).
    • paginados (paging).
    • con términos resaltados (hightlighting).
    • con categorías que nos permiten agrupar (facets).
    • número total de resultados.

    Se puede realizar mediante llamadas REST API o mediante desarrollo con la librería NET SDK.

    Multidioma

    El proceso Analyzer divide el texto en múltiples palabras o tokens. Esto proceso se mejora al personalizar el motor; ya permite analizar la relevancia de los tokens (por ejemplo elimina preposiciones de ese idioma) o permite realizar búsquedas con raíces de palabra (por ejemplo caminando, caminar, camina,..). Existen dos motores por idioma; el de Lucene y el Microsoft (este segundo incorpora reglas léxicas más avanzadas 😉 ).

Publicado en Azure, Indices Cache | 1 Comentario

Tareas en segundo plano y Azure WebJob

Existen diferentes maneras de ejecutar procesos que permiten hacer tareas en segundo plano:

En esta entrada vamos a centrarnos en el WebJob.

Pasos para crear un Azure WebJob

  • 1.- Botón derecho sobre el proyecto Web Application creado con el ASP NET 4.5.2 template (En el ASP NET 5 template no aparece la opción 😦 ) y crear el WebJob.
    newazurewebjobproject
    Diferentes modos para lanzar la ejecución del proceso:

    • Run Continuously: Proceso que va capturando items para procesar de una cola.
    • Run on Demand: Proceso que se dispara manualmente desde la consola de Azure.
    • Scheduled: Porceso que se dispara segun programación horaria.
  • 2.- Crear un Storage Account. En este storage se almacenaran el histórico de ejecuciones y el log del proceso.
  • 3.- Modificar el app.config del proyecto WebJob; con las cadenas de conexión al storage.
    <connectionStrings>
        <add name="AzureWebJobsDashboard" connectionString="DefaultEndpointsProtocol=https;AccountName=name;AccountKey=key"/>
        <add name="AzureWebJobsStorage" connectionString="DefaultEndpointsProtocol=https;AccountName=name;AccountKey=key"/>
     </connectionStrings>
    
  • 4.- Poner el Application Settings del portal de Azure la connection string con el nombre AzureWebJobsStorage apuntando al storage (añadiendo en el web.config de la Web Application no me funciona ¿?). logsazurewebjobEsto habilita la posibilidad de ver la información desde un panel Web.
  • alwaysonwebjob5.- Para que los WebJobs se ejecuten la Web Application debe configurarse a Always On en el Application Settings del portal de Azure. Esto evita que los jobs se aborten al pararse la Web Application.
  • publishwebjob6.- Podemos publicar la Web Application y nos publicara también el WebJob o podemos publicar tambien tan solo el WebJob.

Numero de WebJobs Disponible

Puede ser que al ir añadiendo WebJobs nos encontremos con el siguiente error: An error occurred while creating the WebJob schedule: Response status code does not indicate success: 409 (Conflict). .Por defecto, el número de WebJobs esta limitado a 5, pero se puede incrementar incrementado escalando el servicio 😉
limitewebjobs

Publicado en Azure | Etiquetado | Deja un comentario