Desplegar una base de datos en Microsoft Azure SQL Database desde SQL Server Managament Studio

Hace tiempo atrás, cuando la plataforma Microsoft Azure todavía no era lo suficiente madura, la forma más conocida para migrar bases de datos en SQL Server a Azure SQL Database era a través de la herramienta SQL Azure Migration Wizard, conocida ahora como SQL Database Migration Wizard.

Lo cierto es que si estamos trabajando con SQL Server Management Studio 2012+ tenemos una tarea que nos facilita esta acción, simplemente haciendo clic con el botón derecho sobre la base de datos > Tasks > Deploy Database to SQL Azure:

Deploy database to SQL Azure

Gracias a esta acción, podemos conectarnos a nuestro servidor en la nube, elegir el tamaño y el nombre de la nueva base de datos y lanzar el despliegue:

Deployment Settings Azure SQL Database

Una vez finalizado nos mostrará un resumen de cada una de las acciones realizadas y el resultado:

Deploy Database Operation Complete Azure SQL Database

Siempre que queramos migrar una base de datos a SQL Azure se recomienda revisar Azure SQL Database Guidelines and Limitations.

Espero que sea de utilidad.

Feliz fin de semana!

Desplegar aplicaciones web en Java en Microsoft Azure Web sites

Desde hace tiempo, el servicio Microsoft Azure Web sites nos permite de una forma rápida desplegar aplicaciones web en otros lenguajes que no sean .NET, como PHP, Python y Java. Lo cierto es que la configuración no puede ser más sencilla que un botón para cada uno de los casos:

Azure Web sites languages

Como normalmente no desarrollo en Java, estuve revisando cuál era la forma más elegante de desplegar un sitio web desde Eclipse a Microsoft Azure Web sites, ya que el plugin que tenemos a día de hoy disponible está más orientado a Cloud Services. A través de la opción Export -> WAR file conseguimos un WAR de toda nuestra aplicación con tan sólo un clic:

Eclipse Export WAR file

A día de hoy para Java puedes elegir entre los servidores Tomcat o Jetty para alojar tu aplicación en el servicio de Web sites. Por ello, he seleccionado el primero de ellos durante la exportación para que la aplicación esté optimizada para esa versión en concreto:

WAR Export

El último paso tras crear un web site en la plataforma (New -> Web site -> Quick Create) es habilitar Java y elegir en este caso el servidor Tomcat:

Web site configuration Tomcat

Para subir el archivo WAR generado anteriormente, basta con conectarse al sitio web a través de FTP (utilizando la configuración mostrada en el apartado Quick Glance del DASHBOARD) y ubicarlo en /site/wwwroot/webapps para su despliegue.

Espero que sea de utilidad.

¡Saludos!

Indexar videos con Azure Media Indexer y generar subtítulos de manera automática

La semana pasada se anunció la primera versión del procesador Azure Media Indexer, el cual nos va a permitir analizar nuestro contenido media, con el objetivo de poder realizar búsquedas y obtener el timestamp del momento en el cual se utilizaron las palabras claves que estamos buscando. Otra utilidad que podemos encontrar es la capacidad de generar subtítulos de forma automática. La forma de trabajar con este nuevo procesador es exactamente la misma que cuando realizamos transcodificaciones con Windows Azure Media Encoder:

using Microsoft.WindowsAzure.MediaServices.Client;
using System;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace Indexer
{
    class Program
    {
        static void Main(string[] args)
        {
            //0. Constants
            const string AssetName = "brain-mp4-Source";
            const string AccountName = "[YOUR_ACCOUNT_NAME]";
            const string AccountKey = "[YOUR_KEY_NAME]";

            //1. Install Nuget packages
            //1.1 Nuget: Install-Package windowsazure.mediaservices

            //2. Get AMS context
            var context = new CloudMediaContext(AccountName, AccountKey);

            //.3 Get the asset to index

            var asset = context.Assets.Where(a => a.Name == AssetName).FirstOrDefault();

            //3. Get Indexer Processor
            var processor = context.MediaProcessors.GetLatestMediaProcessorByName("Azure Media Indexer");

            //4. Create a job
            var job = context.Jobs.Create("Indexing job for " + AssetName);

            //5. Get the configuration
            var configuration = File.ReadAllText("IndexerConfigurationTask.xml");

            //6. Create a task
            var task = job.Tasks.AddNew("Indexing task",
                processor,
                configuration,
                TaskOptions.None);

            task.InputAssets.Add(asset);

            task.OutputAssets.AddNew(string.Format("{0} Indexed", asset.Name), AssetCreationOptions.None);

            job.Submit();

            // Check job execution and wait for job to finish. 
            Task progressJobTask = job.GetExecutionProgressTask(CancellationToken.None);
            progressJobTask.Wait();

            Console.WriteLine("Job finished. Final state: {0}", job.State);
            Console.ReadLine();
        }
    }
}

Para este tipo de tarea, utilizamos el siguiente tipo de configuración en formato XML, donde utilizamos metadata con el fin de mejorar la interpretación de las palabras pronunciadas. En este caso, he utilizado un vídeo bastante famoso de Ted Talks de Helen Fisher.

<?xml version="1.0" encoding="utf-8"?>
<configuration version="2.0">
  <input>
    <metadata key="title" value="Helen Fisher: The brain in love " />
    <metadata key="description" value="Why do we crave love so much, even to the point that we would die for it? To learn more about our very real, very physical need for romantic love, Helen Fisher and her research team took MRIs of people in love and people who had just been dumped." />
  </input>
  <settings>
  </settings>
</configuration>

Una vez que el proceso termina, podemos ver que se han generado los siguientes archivos:

indexer result

  • JobResult.txt: Se trata del log de la tarea.
  • brain.mp4.aib: Audio indexing blob file utilizado por SQL Server utilizando el Add-on Indexer SQL
  • brain.mp4.kw.xml: XML con las palabras claves encontradas durante el proceso.
  • brain.mp4.smi: Archivo para Microsoft Synchronized Accessible Media Interchange (SAMI), usados por Windows Media Player.
  • brain.mp4.ttml: Timed Text Markup Language

En este post, para comprobar el resultado, he descargado el archivo con extensión ttml y he utilizado la etiqueta video de HTML 5 para ver los subtítulos generados.

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <video controls autoplay>
        <source type="video/mp4" src="https://gismedia.blob.core.windows.net/asset-9e046f86-169b-4184-bab0-ab8973cea239/brain.mp4?sv=2012-02-12&sr=c&si=ccbce462-05aa-45e0-9ff9-5a11ad11257c&sig=1kRY5epwh0HiielC%2F5em8bixUQm3CtyRi7v%2BBgN2qf8%3D&st=2014-09-16T07%3A12%3A19Z&se=2016-09-15T07%3A12%3A19Z">
        <track src="brain.mp4.ttml" label="English captions" kind="subtitles" srclang="en-us" default>
    </video>
</body>
</html>

Para poder comprobar el resultado es necesario utilizar un navegador que haya implementado TTML. En este caso, utilizamos Internet Explorer 11:

Azure Media Indexer TTML

Por ahora sólo reconoce inglés.

Happy indexing!