CompartiMOSS 29
CompartiMOSS 29
CompartiMOSS 29
Enr
ower BI:
P Nueva Ex-
ntrevista
E SharePoint
Conexión con periencia de
Darwin Castro y Azure
SQL Server y Usuario en
Marín WebJobs
Oracle Listas en SPO
1
Contenido
02 03
04
Editorial
nmarcha: Como facilita el Unit
E
Staff 07 Testing en SharePoint / Office 365
BLOGS
Nueva Experiencia de Usuario en
Listas en SPO
54
http://www.gavd.net
http://geeks.ms/blogs/jcgonzalez F lujos y eventos para Project
57
http://blog.siderys.com
http://geeks.ms/blogs/adiazmartin
Server con Nintex
REDES SOCIALES
Facebook: estión de datos no relacionales
G
htt p : / / w w w.fa c e b o o k . co m /g ro u p . en Microsoft Azure
php?gid=128911147140492
LinkedIn:
htt p : / / w w w. l i n ke d i n . co m /g ro u ps /
CompartiMOSS-3776291
Twitter:
@CompartiMOSScom
2
03 Editorial
Siguiendo con el proceso incesante de renovación e innovación que nos hemos impuesto desde el principio en Comparti-
MOSS, continuamos en este número integrando nuevas tecnologías de Microsoft en nuestro contenido. Como tal, damos la
bienvenida a Gastón Cruz que se está encargando de manejar la sección correspondiente a BI (y, por supuesto, de Power BI).
Estamos seguros que la revista continuará su ruta informativa con sus aportes y queremos animar a todos nuestros lectores
que quieran escribir artículos sobre BI a que tomen contacto con Gastón directamente, o por intermedio de la revista misma
(revista@compartimoss.com).
Azure toma cada vez más impulso, y lo vemos no solo en los resultados financieros que Microsoft presentó hace unas cuan-
tas semanas, sino también en CompartiMOSS. Cuando hace un año no publicábamos más de un artículo por número, ahora
prácticamente la mitad de la revista contiene información relacionada directa o indirectamente con Azure. La nube es la
gran apuesta del momento, no solo para Microsoft, sino para todos los que trabajamos profesionalmente con herramientas
informáticas. Solamente el futuro dirá como se van a seguir desarrollando la nube con Azure y Office 365, pero por el mo-
mento parece que es, sin ninguna duda, el camino a seguir.
Esperamos que la información de este número les parezca tan interesante como de costumbre, y que se diviertan leyendo
los artículos, tanto como los autores lo hicieron escribiéndolos, y nosotros publicándolos.
3
04 Enmarcha: Como facilita el Unit Testing
en SharePoint / Office 365
Conceptos Previos rrecto podemos dedicarnos a refactorizar nuestro código y
dejarlo como idealmente queremos.
Antes de empezar con el articulo vamos a definir algunos
conceptos de Unit Testing para dejar aclarado algunos pun-
tos.
• Stub-> Un trozo de código usado como sustituto de
alguna otra funcionalidad. Un stub puede simular el
comportamiento de código existente (tal como un pro-
cedimiento en una máquina remota) o ser el sustituto
temporal para un código aún no desarrollado.
• Mock -> Se usan para simular el comportamiento de
objetos complejos cuando es imposible o impractica-
ble usar al objeto real en la prueba. De paso resuelve el Imagen 1.- Conceptos de TDD.
problema del caso de objetos interdependientes, que
para probar el primero debe ser usado un objeto no Hagamos Testing con SharePoint
probado aún, lo que invalida la prueba: los objetos si-
mulados son muy simples de construir y devuelven un SharePoint como tal es una plataforma que ha ido evolucio-
resultado determinado y de implementación directa, nando con el tiempo, principalmente por su mayor impor-
independientemente de los complejos procesos o in- tancia dentro de grandes organizaciones. Esto ha provoca-
teracciones que el objeto real pueda tener. do que versión a versión el producto haya ido mejorando
más y más y de cara al desarrollador se ha ido haciendo
mejoras en cuanto al ciclo de vida de la solución. Estas me-
con Enmarcha podemos hacer Unit Testing joras han sido adoptadas por la gran mayoría de equipos
sobre SharePoint de una forma sencilla de desarrollo. Sin embargo, cuando se habla sobre temas
como Unit Testing estos desarrolladores siguen igual que
en sus inicios, es decir, no hay Test Unitarios en la mayoría
Los objetos simulados se usan en lugar de objetos reales de las ocasiones. Muchos de estos desarrolladores indican
que tengan algunas de estas características: que es imposible hacer Unit Test en SharePoint. Algunos
• Devuelven resultados no determinísticos (por ejemplo, de estos argumentos se basan en que el SDK de SharePoint
la hora o la temperatura). se compone de innumerables clases “selladas” y que por
• Su estado es difícil de crear o reproducir (por ejemplo, este motivo no se pueden hacer mocks. Esta afirmación no
errores de conexión). es más que una verdad a medias ya que existen productos
• Es lento (por ejemplo, el resultado de un cálculo inten- comerciales como TypeMock o JustMock que se encargan
sivo o una búsqueda en una BBDD). de generar los mocks (no comento los emuladores de Sha-
• El objeto todavía no existe o su comportamiento pue- rePoint porque podemos decir la propia Microsoft no los
de cambiar. ha evolucionado desde 2010). Si bien es cierto que para
• Debería incluir atributos o métodos exclusivamente alguien que empiece a hacer testing, SharePoint no es una
para el testeo. plataforma que lo facilite de una forma sencilla (se han de
tener claros cada uno de los conceptos y una forma de de-
Otro de los conceptos que muchos desarrolladores tienen
sarrollar clara).
en la cabeza es que juntan un concepto como Test Driven
Development (TDD) como hacer Test. Hacer Test no impli- Por estos motivos cuando empezamos a trabajar en Sha-
ca que necesariamente tengas que hacer TDD, TDD es una rePoint, uno de nuestros principales objetivos fue seguir
práctica que podemos decir que antes de empezar a tirar las buenas prácticas y consejos que se utilizan en todas las
una línea de código ya implementas los Test que vas a ha- plataformas .NET. No debemos de tratar SharePoint como
cer para que una vez vas implementando la funcionalidad una plataforma distinta y en la que todo vale. De este co-
vas comprobando si este es correcto o no. Y una vez es co- nocimiento como hablamos en el artículo del número 27
4
surgió ENMARCHA.
public class Customer
Entre sus múltiples utilidades Enmarcha tiene una Capa de {
[Enmarcha(AddPrefeix = false, Create = false, Type =
Acceso a las listas de SharePoint que facilita el aprendiza- TypeField.Text)]
je sobre la plataforma. Esta clase surgió de intentar en la public string ID { get; set; }
[Enmarcha(AddPrefeix = false, Create = false, Type =
medida de lo posible seguir una arquitectura N-Capas en TypeField.Text)]
nuestros desarrollos y tener una capa de acceso a datos public string CIF { get; set; }
[Enmarcha(AddPrefeix = false, Create = false, Type =
siguiendo el patrón Repositorio. Este patrón lo podemos TypeField.Text)]
definir como un repositorio que es un mediador entre el public string Title { get; set; }
[Enmarcha(AddPrefeix = false, Create = false, Type =
dominio de la aplicación y los datos que le dan persisten- TypeField.Text)]
cia. Con este planteamiento podemos pensar que el usua- public string Direccion { get; set; }
[Enmarcha(AddPrefeix = false, Create = false, Type =
rio de este repositorio no necesitaría conocer la tecnología TypeField.Number)]
utilizada para acceder a los datos, sino que le bastaría con public double Saldo { get; set; }
}
saber las operaciones que nos facilita este “mediador”, el
repositorio. • En la Capa de Servicio tendremos una interfaz ICusto-
merService con los siguientes métodos
5
además tenemos mucha más agilidad a la hora de de- siguiente Test.
sarrollar, ya que no tenemos que desplegar en Share-
Point. [TestMethod]
Lo que hace este código es un objeto “simulado” que cada Pero además de los equipos de Q&A, los desarrolladores
que en nuestro desarrollo se llame al método GetAll, de- debemos de cumplir con nuestra parte y hacer las pruebas
volverá el valor que hemos introducido. En este caso la pertinentes para tener un desarrollo de calidad. En Share-
variable customerCollection. En el caso de que tengamos Point, ya sea utilizando Enmarcha o no, es posible hacer
la necesidad de que en nuestros métodos tengan varios Test y sin hacer uso de herramientas comerciales por lo
parámetros se puede configurar que dado un parámetro que si no haces Test en SharePoint ya no tienes escusa.
devuelva unos datos y cuando se le pase otros parámetros
se comporte de otra forma. De esta forma podemos tes-
tear todas las opciones que tiene nuestra función y hacer ADRIÁN DIAZ CERVERA
nuestra clase más robusta y con menos fallos. Architect Software Lead at Encamina
MVP Office Server and Services
1.– Por último, implementaremos el test que com- http://blogs.encamina.com/desarrollandosobreshare-
pruebe el correcto funcionamiento. En este caso point
lo que vamos a verificar que el método “GetCusto- http://geeks.ms/blogs/adiazcervera
merWhitDeubt” devuelve los clientes que tienen un adiaz@encamina.com @AdrianDiaz81
saldo mayor de 1.000. Para ello implementaremos el
6
04 Configuración de Enterprise Gateway –
Refresco Automático
En el presente artículo se mostrarán los pasos a seguir para
la correcta configuración de Gateway en Power BI, y la ac-
tualización de información de data sources utilizando dicha
Gateway.
Instalación
Para realizar la instalación del Gateway realizar las si-
guientes acciones:
1.– Ingresar en el sitio de Power BI e ingresar en Imagen 3.- Asistente de instalación del gateway.
Download – Data Gateway
4.– En la siguiente pantalla se debe seleccionar el
tipo de Gateway a instalar, si será Enterprise o Perso-
nal. En este caso se seleccionará la opción Enterprise
para continuar.
7
5.– Luego comenzará la descarga del instalador de da por lo que se recomienda guardarla en lugar segu-
Gateway. ro). Una vez completados los datos, elegir la opción
6.– Una vez finalizada la descarga se presentará la si- de Configuración
guiente pantalla:
Imagen 7.- Proceso de instalación del Gateway. Imagen 10.- Fin de la configuración del Gateway.
8
2.– En la pantalla de administración de Gateways, se 3.– En la página se listarán los datasets definidos,
contará con un listado de gateways instalados y con- para los cuales se podrán configurar las siguientes
figurados. Para agregar un Data Source a un Gateway opciones:
se debe seleccionar el mismo y elegir la opción de • Gateway Connection
Add Data Source • Schedule Refresh
• Q&A and Cortana
• Featured Q&A Questions
Gateway Connection
En Gateway Connection podremos especificar a partir de
qué Gateway se actualizará el dataset. Podemos elegir en-
tre uno nuevo (Power BI – Personal) y uno existente (en
este ejemplo seleccionamos el creado anteriormente)
Imagen 15.- Acceso a la configuración de un Dataset. Figura 17.- Configuración del refresco.
9
Q&A and Cortana a determinado comportamiento dentro del reporte.
10
04 Custom Extensibility Handlers para el
framework de provisioning del PnP
Así como el diagrama de arquitectura del proceso de pro-
visioning, donde en el punto 5 de la imagen, podemos ver
que se ejecutan los diferentes ExtensibilityHandlers que se
hayan configurado en la plantilla:
Algunas de las novedades más destacadas son: Creando nuestro custom Extensibi-
• Soporte para configurar la Navegación, tanto Estructu- lity Handler
ral, como por Metadatos.
• Soporte para romper la herencia de roles en Sub sitios. En el ejemplo del artículo, vamos a crear un custom Ex-
• Soporte para User Custom Actions a nivel de listas. tensiblity Handler, que servirá para hace traza de las dife-
• Soporte para Terminos reusados y “deprecated”. rentes plantillas aplicadas a un sitio. Para ello, crearemos
• Eliminar Custom Action (hasta la fecha solo se podían primero una sencilla plantilla PnP en XML, que provisio-
añadir nuevas CustomActions). nará una lista personalizada, que servirá como “tabla” de
Log. Seguidamente, crearemos nuestro custom Extensibili-
La segunda cosa a recordar, sería, tanto el grafico con los
ty Provider, que en cada acción de provisioning, insertara
diferentes componentes del programa PnP:
un nuevo ítem en la lista de Log, incluyendo cierta infor-
mación de la plantilla. Finalmente, veremos cómo registrar
nuestro Extensibility Provider dentro de la propia plantilla
PnP, y ejecutaremos el provisioning para verlo en funcio-
namiento.
11
creamos una nueva clase, derivada de TokenDefinition
nos va a permitir ampliar la colección de Hasta el nodo Configuration, todo sigue el schema del PnP.
Tokens que posteriormente recibirá la ac- Dentro de dicho nodo, ya podemos añadir todo el XML que
necesitemos, la única condición es que en el nodo raíz, de-
ción de Provision finamos un NameSpace (xmlns), que será el que usaremos
desde código para cargar el XDocument. En el ejemplo, lo
hemos simplificado al máximo, y tan solo estamos usando
Para el ejemplo, vamos a crear un Token, que será reem- el Token previamente definido, para comprobar que todo
plazado por el valor de una PropertyBag del web. Para ello, funciona bien. Dicho valor, lo insertaremos en el ítem de
12
la lista Log. todos los tokens resueltos por el TokenParser, incluido los
tokens personalizados que hemos añadido en la imple-
Bug en el PnP-Sites-Core dll mentación del GetTokens.
Si ponéis un breakpoint en el método GetTokens, os daréis Una vez creado nuestro Handler, podemos aplicar una
cuenta que dicho método no se está ejecutando nunca. plantilla PnP, y ver el resultado. La template PnP utilizada
Por lo que he podido comprobar, se trata de un bug en es la siguiente:
la propia dll del PnP Core. Voy a intentar hacer una Pull
Request al proyecto de GitHub para corregir el error, y que
esté resuelto para la siguiente reléase de septiembre, pero
de no ser así, os pongo aquí como resolverlo, que obvia-
mente pasa por tocar el código de la .dll del PnP, así que, si
tenéis que hacerlo, no podréis usar el paquete de Nuget.
Quedando como:
En dicha template se provisiona una property bag con el
public IEnumerable<TokenDefinition> valor de la versión de la template que estamos aplicando.
ExecuteTokenProviderCallOut(ClientContext ctx,
ExtensibilityHandler provider, ProvisioningTemplate template) Además, se provisiona la lista de Log con un par de cam-
pos, y finalmente, se registra nuestro custom Handler.
También necesitaremos editar el fichero ObjectExtensibi-
lityHandlers.cs y modificar el método AddExtendedTokens Con el siguiente código podemos aplicar la plantilla des-
cambiando la línea 28 como: de el archivo XML y provisionarla a un sitio de SharePoint
online:
context.Web.ApplyProvisioningTemplate(template);
Como digo en el comentario, el parámetro de entrada con- Si ahora re-aplicamos la plantilla, pero cambiamos el va-
figurationData, contiene el XML personalizado que hemos lor a la property bag, tenemos un segundo elemento en la
definido en la plantilla PnP, y además, este string llega con lista, con el identificador que le hemos dado a la plantilla:
13
Framework del PnP, ya que cualquier necesidad especifica
que no cubra el framework, se podrá desarrollar con cus-
tom CSOM.
LUIS MAÑEZ
Nada más, ahora que ya sabemos cómo crear nuestros SharePoint / Cloud Solutions Architect en ClearPeople
propios Extensibility Handlers, y siendo que estos sirven LTD
tanto para extracción de la plantilla, como cuando se aplica @luismanez
a un sitio, ya no hay excusa para no utilizar el Provisioning http://geeks.ms/lmanez/
14
04 Microsoft Bot Framework para
automatizar conversaciones
En el pasado //build/ Microsoft presentó Microsoft Bot Fra- el controlador correspondiente, por defecto Messages-
mework, una nueva tecnología que ofrece grandes posibili- Controller, se encargará de procesar.
dades tanto para las empresas como para los desarrollado-
res ya que permitirá automatizar tareas como por ejemplo
atención al cliente siendo capaz de interactuar por canales
tan diversos como Skype, chat web, Slack, Telegram, etc.
15
Para empezar, tenemos que establecer los parámetros co- 2.– Seleccionamos Microsoft Azure App Service.
rrectos de comunicación con nuestro Bot de la siguiente
forma:
• Local Port: 9000.
• Emulator Url: http://localhost:9000/
• Bot Url: Bot Url: La dirección en la que se encuentra
publicado el Bot que, en caso de realizar una prueba
en local como la que estamos tratando, será http://
localhost:{PORT}/api/messages. Para conocer el puerto
en el que se está ejecutando, basta con mirar la direc-
ción resultante a la hora de ejecutar el proyecto desde
Visual Studio o, simplemente configurarlo en el pro-
yecto tal y como se ve en la siguiente imagen.
• Microsoft App Id: El id de la aplicación relacionada con
el Bot. Si lo estamos ejecutando en local y no estable-
cemos nada en nuestro archivo de configuración “web.
config”, debemos dejarlo vacío. Imagen 6.- Selección del destino de la publicación.
• Microsoft App Password: El password de acceso a la 3.– Si ya disponemos de una Web App creada, se-
aplicación relacionada con el Bot. Si lo estamos ejecu- leccionamos la cuenta, la suscripción, un grupo de
tando en local y no establecemos nada en nuestro ar- recursos y finalmente la Web App donde queremos
chivo de configuración “web.config”, debemos dejarlo publicar el Bot. En caso contrario, seleccionamos
vacío. nuevo.
Publicación del Bot 4.– En caso de que hayamos seleccionado crear una
Una vez hayamos desarrollado la funcionalidad de nuestro nueva Web App, tendremos que seleccionar una sus-
Bot y testeado que todo funciona correctamente, tendre- cripción, seleccionar o crear un grupo de recursos,
mos que publicarlo para que pueda ser consumido por los seleccionar o crear un plan de servicio y establecer
usuarios. un nombre para la Web App.
Imagen 5.- Menú contextual del proyecto. Imagen 8.- Creación de Web App.
16
5.– Una vez creada la Web App, tan sólo tendremos
que publicar.
Registrando el Bot
No será suficiente con publicarlo, sino que, además, habrá
que registrarlo en el propio servicio de Bots desde la url Imagen 10.- Formulario de registro del Bot.
https://dev.Botframework.com/Bots/new. En este formulario
debemos rellenar todos los campos para que nuestro Bot
sea accesible. como podremos observar, se corresponde
con WebApi lo que, a todas luces, es lógico
<appSettings>
<!-- update these with your BotId, Microsoft App Id and your
Microsoft App Password-->
<add key=”BotId” value=”[YourBotId]” />
<add key=”MicrosoftAppId” value=”[YourBotAppId]” />
<add key=”MicrosoftAppPassword”
value=”[YourBotAppPassword]” />
</appSettings>
17
Imagen 15.- Emulador conectado al bot de forma remota.
Imagen 12.- Detalles del Bot.
Por último, debemos volver a publicar la aplicación des- Integración con Skype
pués de haber modificado el archivo “web.config” con los
Por defecto, los Bots están preparados para integrarse con
valores anteriormente indicados.
Skype y como Web Chat, así que será muy sencillo comen-
Una vez publicado de nuevo el Bot con la actualización de zar a interactuar con ellos.
archivo “web.config”, podremos testear por fin la conexión
En primer lugar, debemos configurar el bot según las ca-
al Bot que, de ir todo correcto, nos mostrará un mensaje
racterísticas que queremos que tenga para interactuar con
de confirmación como en la imagen
Skype.
18
Una vez configurado el Bot, procederemos a añadirlo como De esta forma, si hemos desarrollado nuestro Bot para que
contacto en Skype y así poder interactuar con él. En el pa- responda a determinadas palabras clave, podremos hacer
nel de detalles del Bot, disponemos de un botón “Add to que mantenga una conversación guiada con los usuarios.
Skype” que nos llevará a la página de aceptación de permi-
sos como podemos ver en la imagen 19.
19
04 SharePoint y Azure – Azure WebJobs
fácil que la programación de Timer Jobs de SharePoint.
Introducción • En SharePoint Online no es posible crear Timer Jobs
Muchos de los servicios ofrecidos por Azure se pueden personalizados, por lo que Azure WebJobs constituyen
utilizar para ampliar y mejorar el funcionamiento de Sha- su reemplazo.
rePoint, tanto on-premises como en la nube. Uno de los Un WebJob no es más que un ejecutable del tipo cmd, bat,
servicios que ofrece Azure, parte de Azure Apps, es «Web exe (.NET), ps1, sh, php, py, js o jar. Para el control del tiem-
Apps», que es una solución de Plataforma como Servicio po de ejecución se utiliza la infraestructura de Scheduling
(PaaS) que proporciona toda la infraestructura física más de Azure.
el software de base para servir como host de programas
Web. Una de las alternativas de Web Apps es WebJobs,
que utiliza toda la infraestructura de Azure Apps para eje- el corazón de las herramientas de colabora-
cutar programas de forma automática basado en un es- ción y manejo de conocimiento
quema de tiempo.
20
na funcionalidad menos que los otros tiers. Studio 2013).
4.– Regrese a la ventana del Grupo de Recursos crea- 8.– Si Visual Studio no tiene instalado el Azure SDK,
do en el punto uno y utilice el botón de “Add”. Escriba es necesario descargarlo desde el sitio de Microsoft
“storage account” en la casilla de búsqueda y selec- (https://azure.microsoft.com/en-us/downloads/) e insta-
cione “Storage account – Web + Mobile” y “Create” larlo en Visual Studio.
en la ventana que aparece. Un Storage Account no es 9.– Seleccione en Visual Studio “New Project” y des-
estrictamente necesario para el funcionamiento de de la sección “Visual C#” – “Cloud” seleccione “Azure
un WebJob (no es indispensable), pero si se desean WebJob”. Asígnele un nombre al proyecto. Esta plan-
ven los logs creados por el WebJob, es necesario te- tilla crea una aplicación de consola con todas las re-
nerlo pues Azure escribe todas las salidas del Job en ferencias a dlls de Azure necesarias.
un Blob del Azure Storage. 10.– La forma más fácil para agregar todas las referen-
5.– Defina un nombre (todo en minúsculas y sin sig- cias necesarias para poder trabajar con SharePoint
nos) para el nombre del Storage, la suscripción, Gru- Online es utilizar NuGet. En Visual Studio seleccione
po de Recursos y Localización; utilice todos los otros “Tools => NuGet Package Manager => Manage Nu-
parámetros por defecto. Get Packages for Solution => Browse” y busque por
6.– Regrese de nuevo a la ventana del Grupo de Re- “app for sharepoint online web toolkit”. Seleccione
cursos, utilice el botón de “Add”, escriba “web app” “AppForSharePointOnlineWebToolkit” e instale el
en la casilla de búsqueda y seleccione “Web App” y NuGet. Si se está trabajando con SharePoint OnPre-
“Create”. Defina un nombre, seleccione la Suscrip- mises, se puede utilizar el NuGet “AppForSharePoint-
ción y el Grupo de Recursos y seleccione el Service WebToolkit”, que produce los mismos resultados.
Plan creado en el punto tres. Azure crea una instan- Cuando la instalación termina, el NuGet descarga
cia de “Application Insights” automáticamente por todos los dlls necesarios y crea los archivos “Share-
si es necesario monitorizar el funcionamiento de la PointContext.cs” y “TokenHelper.cs” en el proyecto.
aplicación web (si no es necesario el monitoreo, se 11.– En “Program.cs” elimine las líneas 17 (var host =
puede eliminar sin problemas). Al final, el Grupo de new JobHost();) y 19 (host.RunAndBlock();) del códi-
Recursos aparecerá con los recursos creados: go fuente creado por defecto pues no son necesarias
para este ejemplo.
12.– Los datos para poderse logear en SharePoint se
van a almacenar en el archivo de configuración del
proyecto por simplificar el ejemplo, aunque esta no
sea una buena práctica, y menos manteniendo la
clave en texto simple. Una mejor opción es utilizar
el Directorio Activo, si tanto Azure como SharePoint
utilizan el mismo servicio, o el token de autorización
de OAuth. Abra el archivo “App.config” y agregue las
siguientes líneas al final del archivo, entre las líneas
“</runtime>” y “</configuration>”:
</runtime>
<appSettings>
<add key=”CuentaSharePoint” value=”usuario@dominio.
onmicrosoft.com”/>
<add key=”ClaveSharePoint” value=”clave”/>
Imagen 1.- Detalle de los elementos creados. </appSettings>
</configuration>
21
La configuración de “AzureWebJobsStorage” se puede utili- enviar las credenciales al sistema. Una vez obtenido el
zar si es necesario usar un depósito de información adicio- acceso a SharePoint, se utiliza el contexto para crear un
nal de Azure. El “AzureWebJobsDashboard” se utiliza para objeto con la Biblioteca y se muestra en la consola el nú-
guardar los logs del WebJob, como se indicó anteriormente mero de documentos que contiene. Aunque el ejemplo es
muy básico en cuanto a funcionamiento de SharePoint,
los servicios ofrecidos por Azure se pueden muestra claramente cómo se puede hacer contacto con el
sistema y realizar alguna función en él.
utilizar para ampliar y mejorar el funciona-
15.– Es posible utilizar todas las funciones de debug-
miento de SharePoint ging de Visual Studio: utilice “F5” o “Debug Start
Debugging” para que el programa sea compilado e
14.– Agregue las siguientes directivas using en la cabe- iniciado localmente.
cera de “Program.cs”: 16.– Desde el Explorador de Soluciones de Visual Stu-
dio, seleccione el proyecto y desde su menú contex-
using Microsoft.SharePoint.Client;
using System.Security; tual seleccione “Publish as Azure WebJob”. La prime-
using System.Configuration; ra ventana que se abre automáticamente permite
configurar el momento en el que el Job iniciara su
Modifique el método “Main” para que contenga el si- funcionamiento:
guiente código fuente:
22
Las dos ventanas siguientes permiten ver los diferentes aparece correctamente en los logs. Cualquier información
parámetros de configuración. Acepte todos los valores por sobre errores atrapados o no atrapados también aparecerá
defecto y publique el Job. La ventana de “Output” de Visual en ellos.
Studio permite seguir el procedimiento de publicación, y si
ha ocurrido algún error, cual ha sido. 18.– Otra forma para ejecutar el Job es seleccionando
la App Web en el portal de Azure, seleccionar “Tools”
17.– Una vez publicado el WebJob sin que se hayan (en lugar de “Settings”) y utilizar la “Consola” de eje-
detectado problemas, es posible ejecutarlo desde el cución. El programa se encuentra en el directorio
portal de Azure (en el punto anterior se definió que “D:\home\site\wwwroot\app_data\jobs\triggered\
el Job va a ejecutar “On demand”). Desde el portal [NombrePrograma]” y se puede ejecutar directa-
de Azure seleccione la Web App que contiene el Job, mente desde la consola:
abra la ventana de “All settings” y en la sección de
“Web Jobs” haga clic sobre “WebJobs”. En la ventana
que abre se puede ver una lista con todos los WebJ-
obs contenidos en la Web App. Seleccione el WebJob
y utilice el botón de “Run”. Después de unos segun-
dos se puede ver el estado del Job:
{
“$schema”: “http://schemastore.org/schemas/json/web-
Imagen 6.- Historial de ejecuciones del WebJob. job-publish-settings.json”,
“webJobName”: “SharePointWebJob”,
Y si se hace clic sobre una de las instancias, se puede ver la “startTime”: null,
“endTime”: null,
información completa de ejecución: “jobRecurrenceFrequency”: null,
“interval”: null,
“runMode”: “OnDemand”
}
23
Conclusiones de SharePoint OnPremises como una alternativa a los Ti-
mer Jobs nativos, o con SharePoint Online para mimetizar
Dentro de las múltiples maneras de utilizar los servicios el funcionamiento de los Timer Jobs personalizados que no
de Azure para complementar el funcionamiento de Sha- son posibles de crear en SharePoint OnLine.
rePoint, Azure WebJobs permite mover operaciones que
requieren muchos recursos de CPU y/o memoria fuera de
la granja de SharePoint hacia procesos remotos en Máqui- GUSTAVO VELEZ
nas Virtuales, y ejecutar programas según un esquema de MVP Office Servers and Services
tiempo predefinido. gustavo@gavd.net
WebJobs se pueden utilizar en conjunto con instalaciones http://www.gavd.net
Productividad
Trainer
www.mvpcluster.es
24
Integra cualquier sistema en tu
PowerApp con Microsoft Flow y
04 Custom API: Agenda de usuarios sobre
MongoDB
Antes de adentrarnos en el mundo de Microsoft Flow y la rio, vamos a almacenar la actividad de Twitter relacionada
integración de APIs personalizadas sobre PowerApp, de- con nuestra agenda utilizando el hastag #AgendaPowe-
bemos entender que solo en casos muy concretos vamos rApps. La actividad de Twitter la vamos a capturar por me-
a necesitar utilizar estas herramientas. Es decir, tenemos dio de un Microsof Flow, y la integración entre la Agenda
que delimitar muy bien cuando utilizar conectores están- y la base de datos la vamos implementar con un webApi.
dar que ya nos aporta PowerApp, y cuando tender a desa- El api web lo podemos desplegar como un webSite o como
rrollar APIs personalizadas que requieren de un tiempo de un api App en Azure.
implementación.
25
AgendaController podría quedar algo de la siguiente for-
ma:
[HttpGet]
[Route(“GetAllContact”)]
public IEnumerable<BaseContact> GetAllUser(){}
[HttpGet]
[Route(“GetUserById”)]
public Contact GetUser(string id){} Imagen 4.- Utilizando Swagger.
Imagen 3.- Añadiendo Swagger al proyecto. Desde este momento ya podemos añadir como nuevo “Da-
taSource” nuestra API en la PowerApp, como veremos un
Una vez instalado el Swagger, y tras haber implementado poco más adelante.
correctamente el controlador, podemos publicar el api en
el webSite de Azure. Si accedemos a <url publicación api>/ Capa de Acceso a Datos, Modelos y MongoDB
swagger podremos ver la estructura de nuestra API, rea-
Una vez elegido MongoDB como motor de base de datos,
lizar testeo de los diferentes métodos expuestos y lo más
debemos estructurar bien la información para huir de los
importante para el registro obtener el fichero de defini-
métodos de diseño de base de datos que utilizábamos en
ción.
26
los modelos relacionales. Para conseguir esto, el primer
objetivo que debemos cumplir es evitar los cruces entre
nuestras entidades de datos, ya que en MongoDB este
hecho nos podría penalizar, ya que nuestros datos están
almacenados en documentos y no en tablas relacionadas.
Contact
deberán llevar un metadato adjunto al Como podemos ver en la imagen de la solución, se ha op-
tado por un patrón repositorio para el acceso a datos, y un
documento para poder hacer consultas modelo de N-capas para distribuir la aplicación.
contra la base de datos Lo importante del artículo no es la implementación de la
27
solución, pero es un ejemplo de cómo podía quedar en MongoDB.Driver.GridFS y MongoDB.Bson.
caso de querer abordarla.
28
Anotar una entrada en Twitter: Microsoft Flow
var filters = Builders<GridFSFileInfo>.Filter.Or(listaFiltros);
var files = bucket.Find(filters).ToList(); Para registrar en el modelo Contact los tweets de un usua-
if (files.Any())
{ rio vamos a diseñar un pequeño flujo de trabajo. Para ello
var datos = bucket.DownloadAsBytesByNameAsync(- desde el mismo portal de PowerApps que hemos visitado
files.FirstOrDefault()?.Filename).Result;
var valueJson = System.Text.Encoding.UTF8.GetString(- en el punto de registro del api seleccionamos “Flows” en el
datos); menú global izquierdo y después “Create a Flow”.
return JsonConvert.DeserializeObject<T>(valueJson);
}
else return null; Esto nos lleva al diseñador de flujos de Microsoft Flow, y
} que como vemos es muy intuitivo. Podemos utilizar una
catch
{ plantilla base, o en nuestro caso una en blanco.
throw;
} Se nos va a solicitar el evento que fuerza el arranque del
}
flujo, en nuestro caso vamos a utilizar el conector de Twit-
En un primer paso recuperamos la base de datos con el ter, y el evento “When a new tweet is posted”, configurán-
método GetDataBase, y con esta vamos a crear una instan- dolo como vemos en la imagen.
cia de GridFSBucket, que nos va a permitir aplicar los filtros
necesarios para realizar una consulta sobre la base de da-
tos.
el método “DowloadAsByteNameAync”, que nos devuelve Esta primera caja, va a esperar a que alguien en Twitter
el fichero en bytes desde la bbdd. escriba un nuevo mensaje con “#agendaUsuarios”, en caso
Una vez tenemos descargado el fichero ya podemos tra- de que esto suceda se iniciará una instancia del flujo.
bajar con el tal y como necesitemos, como podemos ver Una vez iniciado necesitamos añadir un nuevo paso para
en el código ejemplo nosotros necesitamos deserializarlo registrar el Tweet en nuestra base de datos. Para conse-
en un tipo anónimo que bien el caso puede ser BaseCon- guirlo vamos a aprovechar de que tenemos una API, y se-
tact o Contact en función de la petición que necesitemos leccionando en nuevo paso, buscamos el método “AddT-
devolver. weet” que tenemos expuesto como método POST en
Por ultimo nos quedaría por implementar un Upload de un nuestra API (muy importante que sea un método post o no
documento en MongoDB. Para ello necesitamos el siguien- va a parecer en este tipo de caja).
te código:
29
Añadimos la caja y la configuramos tal y como viene en la
siguiente imagen. Como podemos deducir, se exponen los
campos del modelo “Tweet” que si recordamos le pasába-
mos al método AddTweet de la apiAgenda.
ClearCollect(usuarios,ApiMongo.AgendaGetAllUser())
App Agenda: Consumir una Api
Esto nos permite almacenar la lista de usuarios en una
desde PowerApps colección propia de PowerApp, y en caso necesario poder
Una vez tenemos los procesos y la Api implementados po- trabajar con Filtros o Trasformaciones de datos. Además de
demos centrarnos en implementar la propia aplicación. este listado de usuarios se han implementado dos panta-
Para ello podemos crearla desde la aplicación PowerApps llas más como son AddContact y ViewContact.
de Windows 10, o desde hace poco desde la versión pre-
view del editor en versión web.
30
(VistaDetalle,ScreenTransition.Fade,{idUsuario:Id}). suario}).
La función Navigate, además de permitir hacer enlaces Si nos centramos en la página de “AddContact”, poco in-
entre las distintas vistas de la aplicación, permiten pasar teresante podemos deducir a nivel de implementación
en la petición parámetros, como puede ser el idUsuario. en PowerApps, es un formulario simple con un control de
Eso sí tenemos que recordar que en la carga de la página carga de imágenes, y múltiples TexBox, solo a destacar el
destino tenemos que capturar en el context de la página evento Guardar, que muestra de forma muy visual lo rápi-
el parámetro enviado, tal y como hacemos en la página de do que es hacer peticiones post desde PowerApp contra
detalle con la instrucción UpdateContext({currentId: idU- una custom Api.
Como podemos ver en la imagen, basta con mandarle al Lo que sí que es cierto, es que según avanzas con este pro-
método AgendaAddUser el modelo “Contact” que espera ducto ves que cada vez incluye más perfiles potenciales
recibir entre {}. Si analizamos la petición el propio editor que pueden centrarse en su uso y desarrollo, y lo más im-
de fórmulas te indica que parámetros requiere la petición portante se empieza a ver integrado en capa web, en listas
y basta con cruzarlos con los textBox de la pantalla. de Sharepoint Online….; tenemos PowerApps para rato, así
que empecemos a darles cariño.
Conclusiones
Bueno con este artículo hemos ido un paso más allá en SERGIO HERNANDEZ MANCEBO
nuestra serie de PowerApps. Posiblemente lo que hemos Team Leader en ENCAMINA
podido ver inquiete a los usuarios de negocio dado que he- shernandez@encamina.com
31
32
Entrevista
Darwin Castro
33 Marín
Mi nombre es Darwin Castro Marín, soy Ingeniero Micro-
soft y vivo en Tenerife – España.
Soy el tipo de profesionales que le encanta la interacción computing y sobre todo con la visión que tiene Microsoft
e integración de distintas tecnologías, desde que conocí en este gran ámbito de la tecnología.
Microsoft Office365 me ha fascinado el mundo del cloud
34
04 Xamarin Forms y Sharepoint On
Premise
Los desarrolladores de aplicaciones multiplataforma para Client. El truco es que estas clases hay que crearlas en un
móvil estamos de enhorabuena, tenemos una plataforma nuevo proyecto que vamos a añadir a nuestra solución de
como Xamarin y el Framework de Xamarin Forms que nos tipo Shared project, la explicación para tener que hacer
facilita el desarrollo para diferentes plataformas. Imagine- esto es doble:
mos que un cliente nos pide una aplicación para el móvil • por un lado, los proyectos de tipo Portable library no
en la que se muestren datos procesados de su SharePoint admiten operaciones Async (y queremos realizar las
On-Premises y que funcione en Android, en iOS y en Win- llamadas de forma Async), esto se puede solucionar
dows Phone. Ahora esto es una tarea bastante fácil y en añadiendo la librería BCL pero no es lo que queremos
este artículo vamos a ver un ejemplo de cómo acceder a ahora mismo.
datos de On-Premises desde una app Xamarin. • por otra parte, para acceder a SharePoint On-Premises
Lo primero es crear una nueva App de tipo Xamarin. vamos a utilizar credenciales de Windows, pero el tipo
Forms: de proyecto Portable library no admite la librería Sys-
tem.Net.Credentials y para solucionarlo deberíamos
utilizar extensores de código para cada tipo de proyec-
to (Android, IOS, etc).
#region Espacios de nombres
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
Imagen 1.- Creación de una App de Xamarin.Forms. using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
Elegimos el tipo PCL para portable class library aunque
como luego veremos vamos a incluir un proyecto de tipo #endregion
Shared Library. namespace shApp
{
/// <summary>
/// Cliente HTTP para SharePoint
/// </summary>
public class SPHttpClient : HttpClient
{
public SPHttpClient(Uri webUri, string user-
Name, string password) : base(new SPHttpClientHandler(webU-
ri, userName, password))
{
BaseAddress = webUri;
}
/// <summary>
/// Execute request method
/// </summary>
/// <param name=”requestUri”></param>
/// <param name=”method”></param>
/// <param name=”headers”></param>
Imagen 2.- Parámetros de configuración de la App. /// <param name=”payload”></param>
/// <returns></returns>
public async Task< JObject> ExecuteJson<T>(string reques-
Una vez creado el proyecto vamos a crear unas clases que tUri, HttpMethod method, IDictionary<string, string> head-
nos van a servir para realizar peticiones a los servicios REST ers, T payload)
{
de SharePoint haciendo uso de la clase System.Net.Http-
35
y el handler en el cual inyectamos las credenciales:
try
{
HttpResponseMessage response;
switch (method.Method) #region Espacios de nombres
{
case “POST”: // Operaciones Insert/Update/Delete using System;
var requestContent = new StringContent(JsonCon- using System.Net;
vert.SerializeObject(payload)); using System.Net.Http;
requestContent.Headers.ContentType = MediaType- using System.Security;
HeaderValue.Parse(“application/json;odata=verbose”); using System.Threading;
DefaultRequestHeaders.Add(“X-RequestDi- using System.Threading.Tasks;
gest”, GetDigest(this)); #endregion
if (headers != null)
{ namespace shApp
foreach (var header in headers) {
{
DefaultRequestHeaders.Add(header.Key, header. public class SPHttpClientHandler : HttpClientHandler
Value); {
} public SPHttpClientHandler(Uri url, string usu-
} ario, string password)
response = await PostAsync(requestUri, requestCon- {
tent); this.Credentials = new NetworkCredential(usuario, pass-
break; word);
case “GET”: }
response = await GetAsync(requestUri); }
break; }
default:
throw new NotSupportedException(string.Format(“-
Method {0} is not supported», method.Method));
} Con esas dos clases ya tenemos el acceso a SharePoint me-
response.EnsureSuccessStatusCode(); var con- diante servicios REST y credenciales Windows. Ahora nos
tenidoRespuesta = response.Content.ReadAsStringAsync(). queda crear una clase que se corresponda con nuestra lista
Result;
return String.IsNullOrEmpty(contenidoRespues- de SharePoint, en nuestro caso se trata de una lista llama-
ta) ? new JObject() : JObject.Parse(contenidoRespuesta); da List_Locations (lista de ubicaciones), esta lista solo tiene
}
catch (Exception ex) una propiedad Title y por tanto nuestra clase queda así…
{
return null;
} using System;
using System.Collections.Generic;
} using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using SQLite;
public async Task< JObject> ExecuteJson<T>(string reques-
tUri, HttpMethod method, T payload) namespace shApp
{ {
return await ExecuteJson(requestUri, method, null, pay- public class List_Locations
load); {
}
public List_Locations()
{
public async Task< JObject> ExecuteJson(string requestUri) }
{
return await ExecuteJson(requestUri, HttpMethod. public static async Task<List<LocationsItem>> getList()
Get, null, default(string)); {
} List<LocationsItem> lista = new List<LocationsItem>();
// Variable para gestionar los resultados JSON
JObject datos;
public string GetDigest(HttpClient client) try
{ {
if (Common.Token != “”) using (var cliente = new SPHttpClient(new Uri(Common.
return Common.Token; urlSharepoint), Common.MasterUser, Common.MasterPass-
word))
string retVal = null; {
// string cmd = “_api/contextinfo”; //cliente.Timeout = new TimeSpan(50);
var endpointUrl = string.Format(“{0}/_api/contextinfo”, Ba- var urlPeticion = string.Format(“{0}/_api/web/lists/get-
seAddress); bytitle(‘{1}’)/items”, Common.urlSharepoint, “List_Locations”);
HttpResponseMessage response = this.PostAsync(end- datos = await cliente.ExecuteJson(urlPeticion);
pointUrl, new StringContent(string.Empty)).Result;
if (response.IsSuccessStatusCode) if (datos != null)
{ {
string content = response.Content.ReadAsStringAsync(). foreach (var item in datos[“d”][“results”])
Result; {
JToken t = JToken.Parse(content); lista.Add(new LocationsItem
retVal = t[“d”][“GetContextWebInformation”][“FormDi- {
gestValue”].ToString(); ID = System.Convert.ToInt32(item[“ID”].To-
Common.Token = retVal; String()),
} Title = item[“Title”].ToString()
return retVal; });
} //Console.WriteLine(item[“Title”]);
} }
} }
}
36
y en el código de la página llamamos a nuestra clase
}
catch (Exception ex)
{ using System;
return null; // new JObject(ex.Message); using System.Collections.Generic;
}
return lista; using Xamarin.Forms;
} namespace shApp
} {
public partial class LocationsPage : ContentPage
public class LocationsItem {
{ public LocationsPage()
public LocationsItem() {
{ InitializeComponent();
} bindData();
}
[PrimaryKey, AutoIncrement]
public int databaseId { get; set; } public async void bindData()
public int ID { get; set; } {
public string Title { get; set; } List<LocationsItem> lista = new List<LocationsItem>();
} lista = await List_Locations.getList();
} if (lista != null)
locationsList.ItemsSource = lista;
}
Como veis es una clase muy simple con una función get- }
}
List() que llama a SharePoint y carga la lista; pues ya tene-
mos todo listo para integrarlo con Xamarin.Forms, vamos a
crear una página en Xaml:
para realizar peticiones a los servicios REST
de SharePoint haciendo uso de la clase Sys-
tem.Net.HttpClient
y el resultado es el siguiente:
Modificamos el XAML de la página para crear un listView Como veis nuestro código queda bastante claro y limpio.
(lo que queremos es sacar un listado de las ubicaciones de
nuestra lista)
Conclusiones
<?xml version=”1.0” encoding=»UTF-8»?> He intentado que el artículo fuese lo más simple posible
<ContentPage xmlns=»http://xamarin.com/schemas/2014/ y por tanto he obviado operaciones de inserción y modifi-
forms» xmlns:x=»http://schemas.microsoft.com/winfx/2009/
xaml» x:Class=»shApp.LocationsPage»> cación, si queréis saber cómo modificar o insertar nuevos
<ContentPage.Content> elementos en la lista tan sólo tenéis que echar un vista-
<StackLayout>
<ListView x:Name=»locationsList»> zo a este artículo https://blog.vgrem.com/2015/04/04/
<ListView.ItemTemplate> consume-sharepoint-online-rest-service-using-net/ , es el
<DataTemplate>
<ViewCell> artículo que he utilizado como base para mi código y en
<ViewCell.View> él hay ejemplos de diferentes operaciones sobre los items
<StackLayout Orientation=»Horizontal»>
<Label Text=»{Binding Title}» /> de una lista.
</StackLayout>
</ViewCell.View>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate> LUIS MOLINA MARTINEZ
</ListView> Software engineer
</StackLayout>
</ContentPage.Content> micuentadecasa@gmail.com
</ContentPage>
37
04 Azure Task Scheduler: Planifica tus
procesos en Azure
En el desarrollo de aplicaciones normalmente nos encon- un Job, que opciones tenemos para hacerlo y entraremos
tramos que debemos implementar tareas que deben eje- en detalle en como configurar cada opción disponible.
cutarse periódicamente y que están fuera del entorno de
nuestra aplicación. Estas tareas necesitan ser planificadas Para crear y configurar un Job y/o su Job Collection tene-
para su ejecución. En Windows utilizaríamos el Task Sche- mos tres opciones:
duler de Windows, y si tuviéramos muchas tareas utiliza- 1.– Portal de Azure.
ríamos Frameworks como Quartz1 que nos ayudan a plani- 2.– API REST
ficar todas las tareas desde un solo punto y no una a una. 3.– .NET SDK.
En entorno On-premise lo tenemos claro, pero si estoy en
Azure, ¿cómo lo hago? La respuesta es Azure Task Sche- Portal de Azure
duler.
Los pasos para realizar la configuración desde el Portal de
Terminología Azure son:
Antes de continuar es necesario conocer la terminología 1.– Iniciamos sesión en el portal de azure2.
que envuelve a Azure Task Scheduler: 2.– Seleccionamos +Nuevo y en el buscador pone-
mos scheduler y seleccionamos la primera opción.
• Job –> Define la configuración de cómo y cuándo debe
ejecutarse una tarea.
• Job Collection –> Colección de Jobs que permite com-
partir configuraciones y cuotas entre los Jobs.
• Job History –> Aquí encontraremos todos los detalles
de las ejecuciones de los Jobs.
38
Es obligatorio enviar la cabecera Content-type, donde
PARÁ� DESCRIPCIÓN
ARGUMENTO DESCRIPCIÓN METRO
subscriptionId El identificador de la subscripción request Los parámetros necesarios Obligatorio
donde quieres crear el Job. para la ejecución del Job.
resourceGroupNa- El nombre del resource group al Dependerá del tipo de ac-
me que quieres vincular al Job. ción a realizar. Más adelan-
te explicaremos con más
jobCollectionName El nombre de la Job Collection a la
detalle estos parámetros.
que pertenecerá el Job.
jobName El nombre del Job. retryPolicy Política de reintento. Opcional
api-version La versión de la API REST a la que Se debe especificar:
quieres realizar la petición.
retryType: Tipo de re-
Y en el body enviaremos la especificación del Job: intento: Fixed o None.
retryInterval: Intervalo
{
“properties”: { del reintento
“startTime”: “2016-08-09T00:0:00Z”,
“action”: { retryCount: Cuántas
“request”: {
“uri”: “http://yourURL.com”, veces de debe reinten-
“method”: “GET”, tar.
“headers”: {}
},
“type”: “http”, recurrence Planificación del Job. Opcional
“retryPolicy”:{“retryType”:”Fixed”, “retryInterval”:”PT1H”,
“retryCount”:5} state El estado del Job. Puede Obligatorio
},
“state”: “enabled”, ser Activado o Desactiva-
“recurrence”:
{
do.
“frequency”: “minute”,
“interval”: 30, Antes de crear el Job con la API REST, y a diferencia de ha-
“count”: 10
}, cerlo por el portal, debéis tener creada la Job Collection,
} podéis ver cómo hacerlo en: https://msdn.microsoft.com/en-
} us/library/mt629159.aspx
.NET SDK
nos encontramos que debemos implemen-
Por último, podemos crear el Job y su collection con C#.
tar tareas que deben ejecutarse periódica- Para ello primero se debe instalar el paquete Nuget Micro-
mente soft.Azure.Management.Scheduler.
Donde: var schedulerServiceClient = new SchedulerManagementCli-
ent(yourCredentials);
var result = schedulerServiceClient.JobCollections.CreateOrUp-
PARÁ� DESCRIPCIÓN date(“resourceMOSS”, “jobCollectionMOSS”, new JobCollec-
METRO tionDefinition()
{
Location =”West Europe”,
startTime Fecha supuesta de inicio. Opcional Name = “jobCollectionMOSS”,
Properties = new JobCollectionProperties()
Si no se informa se consi- {
Quota = new JobCollectionQuota()
derará que el Job se ejecu- {
tará en el mismo momento MaxJobCount = 3,
MaxJobOccurrence = 5,
de su creación.
MaxRecurrence = new JobMaxRecurrence()
action La acción del Job. Obligatorio {
Frequency = RecurrenceFrequency.Minute,
Interval = 1
type El tipo de la acción con Obligatorio }
la que se ejecutará: http, },
Sku = new Sku(SkuDefinition.Standard),
https, storage que, azure State = JobCollectionState.Enabled
service bus queue o azure }
39
Y después crear un Job a esta collection: • PUT
• DELETE
Una vez seleccionado el Http Verb a utilizar añadimos la
var schedulerClient = new SchedulerManagementCli-
ent(yourCredentials); URL a la que queremos llamar. Para los Verbs POST y PUT
var resultJob = schedulerClient.Jobs.CreateOrUpdate(“resourc- podemos añadir un body a la petición. Al seleccionarlo en
eMOSS”, “jobCollectionMOSS”, “JobMOSS”, new JobDefini-
tion() el menú nos aparecerá la opción body donde podremos
{ poner está información. También tenemos la opción de
Properties = new JobProperties()
{ añadir cabeceras (headers), por ejemplo:
Action = new JobAction()
{ Content-Type: text/plain.
Type = JobActionType.Http,
Request = new HttpRequest() Por último, tenemos una sección de propiedades opcio-
{ nales que incluye: autenticación, política de reintentos y
Headers = new System.Collections.Generic.Dictio-
nary<string,string>() acción ante el error.
{
• Autenticación: Si necesitamos que al realizar la llama-
}, da se envíe en la cabecera de la petición o en el body
Method = “GET”,
Uri = new Uri(“http://yourURL.com”) según el Http Verb elegido configuraremos esta opción
} que tiene cuatro opciones:
},
StartTime = DateTime.UtcNow, • None: No necesita autenticación.
Recurrence = new JobRecurrence()
{ • Basic: En esta opción realizaremos la autenticación
Frequency = RecurrenceFrequency.Minute, mediante usuario, por lo que debemos rellenar los
Interval = 1,
Count = 5 campos username y password.
}, • Client Certificate: Realizamos la autenticación me-
State = JobState.Enabled
} diante certificado. Debemos informar los campos
pfx y password.
});
• Active directory OAtuh: La autenticación se reali-
zará mediante OAuth contra Active Directory, para
En los ejemplos habréis visto muchos campos a configurar, ello deberemos informar todos los campos nece-
no os preocupéis que ahora entramos en detalle a explicar sarios para realizar ele OAuht sobre AD que son:
para cada tipo de acción las opciones que hay disponibles. Tenant, ClientId, Secret y Audience-
• Política de reintentos: Configuraremos que queremos
Ahora veremos más en detalle como configurar el Job en hacer en el caso que al realizar la petición haya un
base a la acción seleccionada y como planificarlo. Me ba- error. Tenemos tres opciones:
saré en cómo hacerlo en el portal de Azure, pero es extra-
• None: No realizaremos ningún reintento.
polable tanto a la API REST como al .NET SDK.
• Default: Por defecto se reintenta cada 30 segundos
y el número máximo de reintentos es 4. Estos valo-
Configuración del job en base a la res no se pueden modificar.
accion seleccionada • Custom: Definimos cuantas veces queremos rein-
tentar y cuál es el intervalo de reintento. En este
• Http Action: caso podemos reintentar cada x segundos, minu-
tos, horas o días.
40
• Acción en caso de error Acción que queremos reali- mensaje que queremos enviar para que nuestro proceso
zar en caso de error. La acción que se pueden realizar sepa si debe ejecutarse o no. Este mensaje es un string del
es lanzar algún otro tipo de Job que tengamos para XML serializado de la clase StorageQueueMessage, donde
indicar este error o realizar alguna acción correctora, nos viene información de ejecución (ExecutionTag y Clien-
por lo que de nuevo tendremos que definir qué tipo tRequestId), cuando se ha ejecutado (ExpectedExecution-
de acción a realizar queremos con su respectiva con- Time), información sobre el Job (SchedulerJobId y Sche-
figuración: dulerJobCollectionId), la región donde está alojada la Job
• Http. Collection (Region) y por último el mensaje de la queue
• Https. (Message).
• Storage queue.
• Azure Service Bus queue. <?xml version = “1.0” encoding=»utf-16»?>
<StorageQueueMessage xmlns:xsd=»http://www.w3.org/2001/
• Azure Service Bus topic. XMLSchema»
xmlns:xsi=»http://www.w3.org/2001/XMLSchema-in-
stance»>
Definiendo todas estas opciones ya tendríamos listo nues- <ExecutionTag>c3b67e748b93b0bac3718f1058e12907</Execu-
tro Job que llamaría a una URL concreta donde estaría tionTag>
<ClientRequestId>2fb66b67-e251-4c09-8d61-8627b8bf9bfd</
nuestro proceso a ejecutar. ClientRequestId>
<ExpectedExecutionTime>2014-01-13T22:32:30</ExpectedExe-
Https Action cutionTime>
<SchedulerJobId>JobMOSS</SchedulerJobId>
La configuración para Https es exactamente la misma que <SchedulerJobcollectionId>JobCollectionMOSS</Scheduler-
la anterior con la diferencia que la URL a la que debemos JobcollectionId>
<Region>West Europe</Region>
llamar es https. <Message>Message Job to execute</Message>
</StorageQueueMessage>
Storage queue
Por último, tiene propiedades opcionales que son:
• Política de reintentos.
• Acción en caso de error.
Una vez realizado todos estos pasos añadi- Figura 5.- Job con tipo de acción Service Bus queue.
remos el Message, que será el mensaje que Utilizaremos este tipo de acción cuando nuestro proceso
esté alojado en un WorkerRole o tengamos un proceso On-
se enviará en la queue
Premise y necesitemos más potencia que Azure Storage
queue por ejemplo. En https://azure.microsoft.com/en-
Para este tipo de acción debemos seleccionar el storage ac- us/documentation/articles/service-bus-azure-and-service-
count que queremos utilizar y acto seguido debemos selec- bus-queues-compared-contrasted/ explica qué caracterís-
cionar la queue que queremos usar. Después de esto para ticas tiene cada una y cuando utilizarlas.
que el Job pueda insertar un mensaje en la queue debemos
En este caso, primero necesitaremos tener creado un Azu-
tener una Shared acces key (SAS) que le dé permiso para
re Service Bus y una queue en este Service Bus. Una vez
escribir en ella. Si no la tenemos disponemos de un botón
creado podemos introducir Namespace el namespace de
que nos creará una por nosotros. Después insertaremos el
41
nuestro Service Bus y en Queue name el nombre de nues- Services Bus topic Action
tra queue.
42
• Minutes. ponibilidad dado que en el momento que se crea un Job
• Hours. en una región, automáticamente se crear una réplica en
• Days: Al seleccionar días nos da la opción la región más próxima, de forma que si se produce algún
de realizar una planificación avanzada error en la región solicitada automáticamente se ejecuta
donde podemos indicar a qué horas y mi- el Job replicado en la región más próxima garantizando la
nutos queremos que se lance el proceso. alta disponibilidad. Azure Task Scheduler aplica replicación
Por ejemplo: 10:30; 22:30. El proceso se geográfica para dar alta disponibilidad.
lanzará cada día a las 10:30 de la mañana y
a las 22:30 de la noche. Conclusiones
• Weeks: En esta opción también tenemos
la opción de planificación avanzada, ade- Azure Task Scheduler es una forma sencilla y rápida para
más de las opciones avanzadas de días nos planificar la ejecución de nuestras tareas y poderlas mo-
da la opción de seleccionar que día o días dificar. La opción de reintento en caso de error, de acción
de la semana queremos que se lance. Por correctora cuando esta suceda y de tener un historial deta-
ejemplo: lunes; viernes; 10:30; 22:30. El llado de las ejecuciones hace de este servicio de Azure uno
proceso se lanzará cada lunes y cada vier- de los más atractivos y útiles que hay.
nes a las 10:30 de la mañana y a las 22:30
de la noche. Referencias
• Months: Aquí también nos aparece la op- • http://www.quartz-scheduler.net/
ción de planificación avanzada. Esta op- • https://portal.azure.com/
ción es la que más juego nos da, ya que • https://msdn.microsoft.com/en-us/library/azure/
nos permite planificar tareas a nivel de dn528937.aspx
días del mes, a nivel del primer, segundo, • https://azure.microsoft.com/en-us/documentation/
tercer, cuarto o último día de la semana articles/scheduler-intro/
concreta, último día del mes…En definitiva • http://fabriccontroller.net/a-complete-overview-to-
un sinfín de posibilidades que cubren to- get-started-with-the-windows-azure-scheduler/
das nuestras expectativas.
43
04 Power BI: Conexión con SQL y Oracle
Power BI ofrece múltiples servicios de conexión a diversos tructuras derivados de estos orígenes.
orígenes de datos. En este artículo nos centraremos en la
conexión a bases de datos On Premises de SQL Server y Power BI Desktop
Oracle. Como es de público conocimiento contamos con
dos plataformas de desarrollo para Power BI (Power BI Por contraparte, Power BI Desktop, aplicación de escritorio
Desktop y Power BI Web), además del componente de re- de Power BI, permite la conexión con sources On Premises,
fresco de información (Gateway). en los cuales se destacan SQL Server y Oracle (existe una
variedad de orígenes a los cuales se puede generar cone-
Power BI Web xión de datos).
44
Una vez completados los datos de conexión debemos es-
pecificar las credenciales de ingreso a la base. Para ello
contamos con dos opciones, a través de la utilización de
Autenticación de Windows…
Conexión a Oracle
Imagen 5.- Parámetros de conexión a la BD de SQL Server.
Imagen 6.- Opciones avanzadas para realizar la conexión a la BD SQL Server. Una vez instalado el Java Client, debemos configurar la co-
45
nexión a la base de datos de Oracle, esto se logra modifi- Para realizar la conexión debemos ingresar la IP del servi-
cando el archivo TNSnames.ora (La ubicación del archivo dor seguido de /[ALIAS] especificado en el archivo TNSna-
dependerá de dónde instalamos el Java Client, dentro de mes.ora.
la carpeta del Client se encuentra bajo la ruta …\client_1\
Network\Admin). Dentro del archivo debemos especificar
la conexión a través de la inserción de las siguientes entra-
das
[ALIAS] =
(DESCRIPTION =
(ADDRESS =
(PROTOCOL = TCP)
(HOST = [HOST_NAME])
(PORT = [PORT]) Imagen 10.- Parámetro de conexión del servidor de Oracle.
)
(CONNECT_DATA = De forma análoga a SQL podremos especificar una consulta
(SERVER = DEDICATED)
(SERVICE_NAME = [SERVICE_NAME]) a la Base de datos en la sección Advanced options.
)
)
[ALIAS] = Nombre a utilizar en el Connection string del Data
Source
[HOST_NAME] = Nombre o IP del servidor que contiene la Base
de Datos
[PORT] = Puerto a utilizar
[SERVICE_NAME] = Nombre del Servicio del servidor de la Base
de Datos
Referencias
• [1] Para ingresar a Power BI Web dirigirse a https://
app.powerbi.com
• [2] En el momento sólo hay soporte para SQL Server
2012 y 2014, se está trabajando en la integración con
SQL 2016
• [3] Para descargar el Java Client, ingresar a:
• 32 bits: http://www.oracle.com/technetwork/topics/
dotnet/utilsoft-086879.html
• 64 bits: http://www.oracle.com/technetwork/databa-
se/windows/downloads/index-090165.html
BRUNO TORTEROLO
Software Developer en Arkano Software
Twitter: bruno_torterolo
46
47 Azure Information Protection
Siguiendo con el continuo crecimiento de servicios en
Azure y pensando en facilitar la adopción de la nube a las
empresas, Microsoft recién ha publicado un nuevo servicio
para ayudarnos a proteger la información corporativa que
podemos ver como una actualización de Azure Rights Ma-
nagement y que proviene de la adquisición de la empresa
Secure Islands, este servicio se llama Azure Information
Protection.
zar los documentos de nuestra organización Una vez creado el servicio, tendremos un conjunto de eti-
quetas por defecto con las que ya podemos empezar a cla-
sificar los documentos.
Con Azure IP trabajaremos a nivel de documento para pro-
tegerlo de forma similar a como lo podemos hacer con DLP
en Office 365, clasificando la información, etiquetando los
documentos, añadiendo la protección necesaria en cada
caso, monitorizando el acceso a la información y respon-
diendo ante posibles problemas de seguridad.
Azure IP permite configurar las etiquetas con la siguiente tendremos un conjunto de etiquetas por
información: defecto con las que ya podemos empezar a
• Plantilla de Azure RMS para esta etiqueta.
clasificar los documentos
• Condiciones automáticas para aplicar esta etiqueta.
• Marcas visuales para aplicar al documento.
Para cada una de las etiquetas, vamos a poder configurar
Para configurar estas etiquetas, primero tenemos que una descripción, un color identificativo y la plantilla de
crear el servicio en una suscripción de Azure. Azure RMS a aplicar.
47
Imagen 5.- Condiciones automáticas de aplicación de una etiqueta.
48
Conclusiones aplicables a las empresas.
49
50 Nueva Experiencia de Usuario en Listas
en SPO
Al igual que ha sucedido con las Bibliotecas de Documen- en la lista.
tos en SPO, Microsoft ha comenzado a liberar (para tenants • Una barra rápida de acciones que cuenta con las
de Office 365 en las que esté habilitado First Release) des- siguientes opciones por defecto:
de comienzos de agosto de 2016 la nueva experiencia de • “Nuevo”, para crear un nuevo elemento en la
usuario para Listas de SPO completamente alineada con la Lista.
experiencia ya disponible en Bibliotecas de Documentos. • “Edición rápida”, que facilita editar varios re-
Se trata de una nueva interfaz fluida y rápida que además gistros de forma directa en la Lista de la mis-
es responsive e incorpora integración en un solo clic con ma forma que modificamos contenidos en una
Microsoft Flow y Microsoft PowerApps. Adicionalmente, hoja Excel. Esta opción permite mantener la
las denominadas “Listas modernas” de SPO son más “mó- misma funcionalidad que ya conocíamos en la
viles” gracias a la aplicación móvil para SharePoint OnPre- experiencia clásica de Listas.
mises y Online disponible actualmente para iOS. • “Exportar a Excel”, que permite exportar a Ex-
cel el contenido de la Lista (Nota: Esta opción se
Un paseo por la nueva experiencia muestra sólo en Internet Explorer ya que a la fecha
actual se sigue basando en el correspondiente control
de usuario en Listas de SPO Active X).
• “Flujo”, que permite crear un Flujo de Micro-
Para realizar un recorrido por la nueva experiencia de soft Flow para la Lista. Al hacer clic en esta op-
usuario en Listas de SPO, crearemos en un sitio de SPO una ción se muestra un panel en el que podemos
Lista de tipo personalizada denominada “Bibliografía” que seleccionar plantillas de Flujo disponibles por
almacenará información relativa a libros sobre Office 365, defecto, o que hayamos creado, o bien crear
SharePoint y Azure: un Flujo desde cero.
• Desde el menú de Acciones del sitio o bien desde la • “PowerApps” que permite crear una aplica-
nueva página de Contenidos del sitio, añadimos una ción de PowerApps para visualizar información
aplicación de tipo “Lista personalizada” denominada de la Lista o bien interactuar con el contenido
“Bibliografía Recomendada” y navegamos a la misma. de la Lista para añadir. Esta acción muestra de
La primera vez que accedemos a una Lista que hace nuevo un panel para crear la PowerApp.
uso de la nueva experiencia, se muestra en un PopUp • “Avisarme” que permite crear alertas en la Lis-
un resumen de las novedades que nos encontraremos ta.
en la nueva experiencia: • Acceso a las vistas disponibles en la Lista, crear
nuevas vistas a partir de modificar la vista actual o
bien acceder a la administración de las vistas crea-
das para la Lista.
• En el nuevo aspecto de la Lista podremos encontrar las desde comienzos de agosto de 2016 la
siguientes novedades (Imagen 2): nueva experiencia de usuario para Listas de
• Una caja de búsqueda ubicada sobre el menú ver-
SPO completamente alineada
tical que facilita la búsqueda rápida de información
50
• Creamos un nuevo elemento en la Lista a través de la
opción “Nuevo”, lo que nos redirige al formulario clá-
sico de “Nuevo elemento” para su creación. De vuelta
al nuevo aspecto de la “Lista”, si seleccionamos el ele-
mento creado veremos que:
• Se muestra una barra de acciones específica para
el elemento que contiene las siguientes acciones:
• “Editar” que permite editar el elemento de lis-
ta a través del formulario clásico de edición de Imagen 4.- Como añadir nuevas columnas en la vista por defecto.
elemento.
• “Compartir” que permite compartir el ele- Por ejemplo, podemos añadir una columna de tipo
mento a través del correspondiente diálogo. elección para especificar la plataforma sobre la
En este diálogo también podremos obtener un que trata el libro. Una vez añadida, podemos rápi-
enlace al elemento y visualizar con quien se ha damente configurar el orden de columnas y, como
compartido. se indicaba antes, mostrar / ocultar otras colum-
• “Obtener un vínculo” que muestra el mismo nas. Para que los cambios se guarden en la vista,
diálogo que para “Compartir” pero con la op- tendremos que asegurarnos de que los mismos
ción de obtener un enlace al elemento. son guardados.
• “Eliminar” que permite borrar el elemento se-
leccionado.
• “Avisarme” para crear una alerta del elemento
seleccionado.
• Las mismas opciones de la barra de acciones del
elemento de Lista y las siguientes acciones adicio-
nales:
• “Copiar campo en el Portapapeles” que permi-
te copiar el campo “Título” en el portapapeles.
Imagen 5.- Panel de personalización de columnas de la Lista.
• “Más”, opción que a su vez da acceso a las si-
guientes opciones:
• “Flujo de trabajo” para agregar un Flujo podemos añadir una columna de tipo elec-
“legacy” al elemento de Lista.
ción para especificar la plataforma sobre la
• “Detalle de conformidad” que muestra
una ventana en la que se visualiza la fase que trata el libro
de retención en la que se encuentra el ele-
mento.
• El “Panel de propiedades” del elemento en el que Creación de Flujos y Aplicaciones
podremos editar los metadatos del Elemento de para Listas
lista y además visualizar el historial de actividad
reciente en el elemento, si se ha compartido y Junto con la nueva experiencia de usuario, una de las no-
con quien e información adicional como el Tipo de vedades más importantes que se incorporan en las Listas
Contenido del Elemento, cuándo se modificó y la de SPO es la integración con Microsoft Flow y PowerApps
ruta de acceso. (Nota: Tanto Flow como PowerApps se encuentran actualmente en
public preview):
51
• Para cada Lista, podemos acceder a la página de “Con-
figuración de la lista” y a continuación a la opción
“Configuración avanzada”. Como se aprecia en la Ima-
gen 10, podemos acceder a la administración de la
biblioteca de documentos a través de las opciones de
configuración globales del sitio.
el que se muestran las plantillas de Flujos disponi- En la página de “Configuración avanzada” locali-
bles por defecto en Microsoft Flow o bien permite zaremos una nueva sección que nos permite es-
crear un Flujo desde cero. tablecer el tipo de experiencia de Lista a utilizar:
“Experiencia predeterminada establecida por el
administrador”, “Experiencia nueva”, “Experiencia
clásica”. La primera de las opciones es controlada
por la configuración que se aplique de forma glo-
bal a nivel de tenant de SPO como se verá en el
siguiente punto.
Imagen 7.- Ejemplo de Flujo por defecto para una Lista en Microsoft Flow.
52
finalmente desplegada en SPO. En la misma faltan elemen-
tos en los que Microsoft está trabajando o bien simple- La integración con Flow permite automati-
mente no estarán disponibles como, por ejemplo:
zar tareas cuando se produce un suceso en
• En el momento de redacción de este artículo, no to-
dos los tipos de Listas disponibles en SPO soportan la una Lista
nueva experiencia. Como ejemplos, las Listas de tipo
Calendario y Tareas por el momento no disponen de
la misma. Conclusiones
• Para Listas existentes con un alto grado de personali-
La nueva experiencia de usuario en Listas para SPO supone
zación, no estará disponible la nueva experiencia. Por
un cambio radical no solo en cuanto a aspecto, sino tam-
ejemplo, no se soportan todos los tipos acciones per-
bién en cuanto a forma de trabajar colaborativamente con
sonalizadas que se hayan desarrollado como por ejem-
información contenida en las mismas. La clásica Ribbon a
plo las acciones personalizadas que inyecten bloques
la que estábamos acostumbrados desaparece y es reem-
de script.
plazada por un menú horizontal de acciones que facilita el
• Soporte “completo” en la barra de navegación superior
trabajo a nivel de Lista y de Elemento de Lista. A nivel de
para que los distintos niveles de la misma se muestren
Elemento de Lista, el nuevo panel de edición simplifica no
independientemente de que se haya activado o no la
solo la visualización sus metadatos sino también visualizar
característica de publicación en el Sitio.
su historial de actividad. Finalmente, la integración con
• Posibilidad de aplicar branding a las Listas, Microsoft
Microsoft Flow y PowerApps permite extender la funcio-
se ha comprometido a proporcionar mecanismos de
nalidad propia de las Listas con Procesos de Negocio y Apli-
proporcionar capacidad para personalizar las nuevas
caciones Personalizadas que faciliten no solo visualizar la
Listas, aunque por el momento se desconoce cómo se
información almacenada, sino modificarla.
podrán hacer dichas personalizaciones.
• Soporte de varios niveles de agrupamiento, incluido
de serie. En el momento en el que se dispone de co-
Referencias
lumnas de tipo elección o lookup en la biblioteca se • https://blogs.office.com/2016/07/25/modern-sharepoint-
dispone de la opción de agrupar por dichas columnas lists-are-here-including-integration-with-microsoft-flow-
a nivel de vista. and-powerapps/
53
04 Flujos y eventos para Project Server
con Nintex
Hace tiempo que tenía ganas de hablar sobre las posibilida- • Leer una propiedad de proyecto.
des que Nintex ofrece para Project Server. Y es que no solo • Leer un grupo de seguridad: no existente con flujos de
nos permite realizar flujos de Gestión de la Demanda de SPD.
manera sencilla, al igual que lo haríamos para SharePoint, • Indicar la etapa del proyecto.
sino que, además, permite lanzar flujos que respondan a • Indicar información de estado.
diversos eventos de Project Server: cuando se ha publica- • Actualizar propiedades del proyecto.
do un proyecto, cuando se ha creado un recurso. Hasta la • Actualizar una propiedad del proyecto.
aparición de Microsoft Flow, sólo Nintex permitía enlazar • Esperar a que se proteja el proyecto.
con estos eventos sin la necesidad de recurrir a desarrollos • Esperar a que se confirme el proyecto (en la gestión de
con Visual Studio. la cartera).
• Esperar a que se envíe el flujo (a la siguiente etapa)
Flujos de Gestión de la demanda
con Nintex
Al habilitar Nintex Workflows en una colección de sitios de
Project Server aparece una nueva opción en el apartado
de configuración. Desde la misma podremos tanto crear
un nuevo flujo de gestión de la demanda como asociar un
Imagen 2.- Ejemplos de acciones disponibles para Flujos de Nintex para Project Server.
flujo a un evento de Project:
Como se ha podido comprobar, la mayoría de acciones dis-
ponibles ya existen en un flujo creado con SharePoint De-
signer (SPD) a excepción de las tres no nativas (las cuales,
además, son muy interesantes.) Pero, además, el resto de
acciones de Nintex para SharePoint también están disponi-
bles, lo que nos permite ampliar la funcionalidad de nues-
tros flujos integrándola con otros que se ejecuten sobre los
sitios de proyecto, por ejemplo.
Imagen 1.- Opción para asociar/crear un flujo de Nintex para Project Server.
54
En la siguiente imagen podemos ver un ejemplo de flujo
Al habilitar Nintex Workflows en una colec- orientado a eventos con Nintex:
Imagen 5.- Ejemplos de acciones de flujos de Nintex para Project Server. Imagen 8.- Eventos disponibles para el objeto seleccionado.
55
Conclusiones
el uso de Nintex Workflow para Project Ser- Como se ha podido comprobar, el uso de Nintex Workflow
ver nos permite aumentar las posibilidades para Project Server nos permite aumentar las posibilidades
que nos ofrece out-of-the-box Microsoft para el desarrollo
que nos ofrece out-of-the-box Microsoft de flujos sobre este producto. No sólo nos facilita el dise-
ñador de flujos de Nintex la creación de los mismos si no
Finalmente, hay que indicar el flujo que se desea lanzar que, además, nos ofrece algunas acciones adicionales que
cuando se ejecute dicho evento: sólo están disponibles con esta herramienta. Y, lo que es
mejor, nos permite lanzar flujos capturando los eventos
que se producen en la herramienta pudiendo así acceder
a la información en tiempo de ejecución. De esta forma,
se pueden realizar cálculos tras un evento y solicitar una
aprobación o cambiar el valor de un campo basándonos
en los mismos. O transformar y guardar la información de
un proyecto o recurso tras su edición o publicación para la
realización de informes.
56
04 Gestión de datos no relacionales en
Microsoft Azure
Cuando una persona se adentra en el mundo de tecnolo- zan mecanismos internos de almacenamiento que no es-
gías de información se dará cuenta que, en los proyectos tructuran la información a manera de tabla. Su existencia
de software, por lo general siempre existen estos dos com- se debe a necesidades de mejor performance y tiempos de
ponentes: respuesta que muchas veces en las bases de datos relacio-
• El software. nales no se logran tan fácilmente.
• Medios de almacenamiento. Los servicios no relacionales que ofrece Microsoft Azure
El software puede estar escrito en cualquier lenguaje de son:
programación de nuestra preferencia como .Net o Java.
Los medios de almacenamiento pueden ser desde simples DocumentDB
archivos planos de texto hasta estructuras más complejas
como bases de datos, estos elementos se deben visualizar El servicio de DocumentDB ofrece un almacenamiento no
por separado no como una sola entidad. relacional en texto plano con formato JSON. Las estructu-
ras quedan categorizadas en contenedores llamados “Do-
El primer contacto que un desarrollador o administrador cumentos”.
de bases de datos puede tener con respecto a la gestión de
información, es con una “Base de datos relacional”.
Con la llegada de Microsoft Azure como plataforma del Estas son algunas de sus características:
cómputo en la nube, podemos encontrar una gran can- • JavaScript Core: El motor de ejecución de consultas de
tidad de servicios que se ofertan, entre muchos de ellos DocumentDB está basado en JavaScript completamen-
tenemos un grupo enfocado a la gestión de información. te. Objetos ya conocidos en SQL Server como procedi-
mientos almacenados, funciones o triggers también se
Microsoft Azure ofrece almacenamiento con SQL Server y encuentran en DocumentDB.
Oracle DB con máquinas virtuales, además de un servicio • Consultas con sintaxis SQL: DocumentDB soporta SQL
relacional en la nube llamado SQL Azure. tal cual como si trabajáramos desde SQL Server, por lo
Una de las muchas razones por las que la nube fue conce- que al momento de extraer o procesar información, el
bida es: para almacenar grandes cantidades de informa- ambiente nos será muy familiar.
ción. Información que difícilmente podría ser guardada y • Administración supervisada: Esto significa que pode-
procesada en servidores locales, esta información puede mos administrar roles y permisos para usuarios en par-
ser tanto relacional como no relacional. ticular.
• Estructura: Todas las entidades almacenadas en Docu-
mentDB mantienen el formato Json de manera nativa.
Las bases de datos relacionales son aque- • Escalabilidad: DocumentDB se encuentra en la nube
llas que utilizan mecanismos internos de de Microsoft Azure, por lo que almacenamiento y ren-
dimiento se regulan a través del tiempo de acuerdo
almacenamiento que no estructuran la
a las necesidades llegando al orden de petabytes sin
información a manera de tabla problemas.
• Tipo documental: Se utilizan elementos denominados
documentos, no tablas.
Las bases de datos no relacionales, son aquellas que utili-
57
El modelo de recursos por el cual funciona DocumentDB ser mayores a esta, pero dado que Redis se encuentra en
es el siguiente: la infraestructura de Microsoft Azure, esa limitación se
vuelve casi nula, los paquetes más básicos que podemos
encontrar al momento de escribir este post, rondan en los
53 GB.
Ahora que nos queda más claro que es Redis, podríamos
hacernos esta pregunta: ¿Por qué debería usar Redis a di-
ferencia de una base de datos relacional?
Imagen 2.- Modelo de recursos de DocumentDB. Aquí expongo algunas características de Redis:
• Data Base Account (Cuenta de base de datos) • Redis se maneja en memoria RAM, por lo que el tiem-
• Se refiere a la cuenta principal con lo que se administra po escritura y lectura de datos es superior que al ha-
la base de datos DocumentDB. cerlo en un disco duro físico o virtual.
• DataBase (Base de Datos) • Redis soporta replicación maestro-esclavo, por lo que
• Es el contenedor lógico de usuarios, segmentado por los datos de un maestro pueden ser replicados a uno
colecciones. o varios esclavos, y estos a su vez también pueden ac-
• Collection (Colección) tuar de maestros para otros esclavos.
• Contenedor de documentos JSON. • Los datos en Redis no siempre serán aleatorios, tam-
• Document (Documento) bién pueden ser persistentes (pasarlos a disco duro).
• Objetos CRUD (Create, Read, Update, Delete) por co- • Estos son algunos ejemplos de proyectos que podrían
lección. usar Redis de manera ideal:
• Attachments / Media (Archivos adjuntos) • Videojuegos.
• Almacenamiento binario con Blobs. • Proyectos que involucren mensajería instantánea.
• Store Procedures, Triggers and Functions (Procedi- • Software que constantemente invoque consultas tran-
mientos almacenados, desencadenadores y funciones) saccionales SQL.
• Lógica de la aplicación que se ejecuta en la base de • Aplicaciones de tiempo real.
datos, escrito completamente en JavaScript.
• Users (Usuarios)
• Nombre de espacio lógico para alcances de permisos.
• Permissions (Permisos)
• Control de acceso a recursos específicos por medio de
tokens de autorización.
Imagen 3.- Azure Redis.
58
Estos son los elementos que conforman una tabla: HDInsight
El servicio de HDInsight ofrece un almacenamiento no
relacional dedicado al tratamiento de información a gran
escala y no estructurada (que no tenga un tipo de dato de-
finido), mejor conocido hoy en día como Big Data. Detrás
de este servicio encontramos Hadoop.
tabla
VÍCTOR MORENO
MVP Microsoft Azure
@vmorenoz | http://blogs.itpro.es/eduardocloud
59
52 Nosotros
Alberto Diaz
Alberto Díaz es SharePoint Team Lead en Encamina,
liderando el desarrollo de software con tecnología
Microsoft. Para la comunidad, ha fundado TenerifeDev
(www.tenerifedev.com) con otros colaboradores, un grupo
de usuarios de .NET en Tenerife, y coordinador de SUGES
(Grupo de Usuarios de SharePoint de España, www.suges.
es) y colaborador con otras comunidades de usuarios.
Microsoft MVP de SharePoint Server desde el año 2011
y asiduo conferenciante en webcast y conferencias de
tecnología de habla hispana.
Fabián Imaz
Fabián Imaz, MVP de SharePoint Server trabaja en el mundo
del desarrollo de software desde hace más de 10 años,
teniendo la suerte de trabajar en distintas arquitecturas y
tecnologías Microsoft. Pertenece a la firma Siderys, http://
www.siderys.com empresa de desarrollo de Software
especializada en SharePoint 2007/2010/2013 y en desarrollo
de soluciones inteligentes. Desde los comienzos Fabián
ha trabajado en distintitas comunidades donde organiza
y promueve eventos locales para la difusión de tecnología
dentro de los miembros de las mismas. Es director de la
carrera SharePoint 2010 y SharePoint 2013 en Microsoft
Virtual Academy, http://www.mslatam.com/latam/technet/
mva2/ Home.aspx y cuenta con un sitio en CodePlex con
varios desarrollos http://siderys.codeplex.com.
60
Gustavo Velez
Gustavo Velez es Ingeniero Mecánico y Electrónico; trabaja
en el diseño e implementación de sistemas de IT basados
en tecnologías de Microsoft, especialmente SharePoint,
para Avanade (http://www. avanade.com), una compañía
multinacional de IT. Propietario del sitio especializado en
información sobre SharePoint en español http://www. gavd.net
y autor de seis libros sobre SharePoint y sus tecnologías.
Email: jcgonzalezmartin1978@hotmail.com
Blogs: http://geeks.ms/blogs/jcgonzalez &
http://jcgonzalezmartin.wordpress.com/
61
¿Desea colaborar con CompartiMOSS?
La subsistencia del magazine depende de los aportes en contenido de todos. Por ser una revista dedicada a información
sobre tecnologías de Microsoft en español, todo el contenido deberá ser directamente relacionado con Microsoft y escrito en
castellano. No hay limitaciones sobre el tipo de articulo o contenido, lo mismo que sobre el tipo de tecnología.
Si desea publicar algo, por favor, utilice uno de los siguientes formatos:
• Artículos de fondo: tratan sobre un tema en profundidad. Normalmente entre 2000 y 3000 palabras y alrededor de 4 o 5
figuras. El tema puede ser puramente técnico, tanto de programación como sobre infraestructura, o sobre implementación o
utilización.
• Artículos cortos: Artículos cortos: Máximo 1000 palabras y 1 o 2 figuras. Describen rápidamente una aplicación especial de
alguna tecnología de Microsoft, o explica algún punto poco conocido o tratado. Experiencias de aplicación en empresas o
instituciones puede ser un tipo de artículo ideal en esta categoría.
• Ideas, tips y trucos: Algunos cientos de palabras máximo. Experiencias sobre la utilización de tecnologías de Microsoft,
problemas encontrados y como solucionarlos, ideas y trucos de utilización, etc. Los formatos son para darle una idea sobre
cómo organizar su información, y son una manera para que los editores le den forma al magazine, pero no son obligatorios. Los
artículos deben ser enviados en formato Word (.doc o .docx) con el nombre del autor y del artículo.
Si desea escribir un artículo de fondo o corto, preferiblemente envíe una proposición antes de escribirlo, indicando el tema,
aproximada longitud y número de figuras. De esta manera evitaremos temas repetidos y permitirá planear el contenido de una
forma efectiva.
62
63