CompartiMOSS 29

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 63

Nº29 septiembre 2016

REVISTA ESPECIALIZADA EN TECNOLOGÍAS MICROSOFT

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

CompartiMOSS es una pu-


blicación independiente de Manejo de Gateways con Power BI
11
distribución libre en forma Custom Extensibility Handlers para
electrónica. Las opiniones
aquí expresadas son de es- 15 el framework de provisioning del PnP
tricto orden personal, cada
autor es completamente
responsable de su propio
​ icrosoft Bot Framework para
M
automatizar conversaciones
20
contenido.

DIRECCIÓN GENERAL 25 SharePoint y Azure WebJobs​


• Gustavo Velez I​ntegra cualquier sistema en tu PowerApp
• Juan Carlos Gonzalez
• Fabian Imaz
con Microsoft Flow y Custom API: Agenda
de usuarios sobre MongoDB
33
• Alberto Diaz

DISEÑO Y DIAGRAMACIÓN 35 ​Entrevista Darwin Castro Marín


• Santiago Porras Rodríguez
X​ amarin Forms y SharePoint OnPre-
mises
38
A​ zure Task Scheduler Planifica tus
Contacte con 44 procesos en Azure
nosotros ​ ower BI: Conexión con SQL Server
P
y Oracle
47
revista@compartimoss.com
gustavo@gavd.net
jcgonzalezmartin1978@hotmail.com
fabian@siderys.com.uy
adiazcan@hotmail.com
50 ​Azure Infomation Protection

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.

El Equipo Editorial de CompartiMOSS

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

public interface ICustomerService


{
IList<Customer> GetCustomerWhitDebt();
}

• Esta interfaz la implementaremos de la siguiente forma

Imagen 2.- Patrón Repositorio.


public class CustomerService : ICustomerService
{
Este patrón en Enmarcha lo hacemos implementando la in- IRepository<Customer> repository;
terfaz IRepository, la cual tiene la siguiente definición.
public CustomerService(IRepository<Customer> repository)
{
this.repository = repository;
public interface IRepository<T> : IPageable }
{ public IList<Customer> GetCustomerWhitDebt()
T Get(int id); {
ICollection<T> GetAll(); var customerCollection = this.repository.GetAll();
ICollection<T> GetAll(int page); return customerCollection.Where(x => x.Saldo > 1000).
ICollection<T> Query(IQuery query, int page); ToList();
ICollection<T> Query(string query, int page); }
int Insert(T data); }
bool Save(int id, T data);
bool Delete(int id);
} NOTA: Por lo general cuando programamos una arquitectura de N-
Capas bien en una aplicación de escritorio, móvil o en un entorno
web utilizamos un contenedor de inyección de dependencias como
Para el acceso a listas utilizando SharePoint Server Object puede ser AutoFac. Estos contenedores de forma “mágica” son los
Model hemos implementado la clase SharePointReposi- encargados de resolver esta inyección de dependencias. Esto en Sha-
tory de tal forma que dado una clase de C# podamos “ma- rePoint no es posible de una forma sencilla y sin que el rendimiento
pearla” con una lista de SharePoint. de la Granja de SharePoint se vea afectado por lo que cada vez que
invoquemos a este método debemos de proporcionarle la definición
de esta interfaz.
Hacer Test no implica que necesariamente Una vez ya tenemos implementada la capa de negocio, lo
tengas que hacer TDD que queremos hacer es comprobar que esta capa funcio-
na según las especificaciones del cliente. Para hacer esta
tarea vamos a utilizar Moq. Es una librería que lo que nos
hace es implementarnos un Mock de una interfaz, en la
Ahora bien, ¿cómo hacemos Unit que configuraremos los valores que espera que devuelvan
Testing con Enmarcha? cada método de la interfaz. De esta forma obtenemos va-
rios beneficios:
Partimos de la base de que tenemos un WebPart que nos • Verificamos que nuestra clase funciona tal y como es-
muestran los clientes que tienen un saldo de más de 1.000 peramos.
€. Para ello en SharePoint lo que tendremos es una lista de • Desacoplamos las clases, de esta forma hacemos que
SharePoint llamada cliente. Y dentro de nuestra solución nuestros desarrollos cumplan los principios SOLID y
de Visual Studio tendremos lo siguiente: sean mucho más mantenibles.
• Una clase “Customer”(mapea la clase C# con la lista de • No dependemos de tener un SharePoint instalado para
SharePoint) con la siguiente definición comprobar que nuestro código funciona. Con lo cual

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]

Como utilizar Moq.NET


public void GetCustomerWithDebt()
{
var customerService = new CustomerService(repository);
var data = customerService.GetCustomerWhitDebt();
1.– Creamos un Proyecto de Test utilizando la planti- Assert.IsTrue(data.Where(x => x.Saldo > 1000).Any());
lla de Visual Studio (Proyectos-> Visual C# Test-> Unit }
Test Project).
2.– Ahora ejecutamos el Test y si todo ha ido bien ve-
remos la siguiente pantalla:

Imagen 3.- Proyecto Unit Test Project.

Imagen 4.- Resultado de la ejecución del Test.


2.– Instalamos el paquete Nuget Moq.
3.– En el proyecto de Test nos creamos un método
Inicializador. Dentro de este inicializador lo que va- Conclusión
mos a hacer es crearnos el Mock de nuestra Interfaz
Hacer Unit Testing en SharePoint es posible y es muy nece-
IRepository haciendo uso de Moq. Para ello se que-
sario por muchos motivos:
daría un código como el siguiente:
• Garantizar que se cumplen los requisitos a nivel de ne-
gocio.
IRepository<Customer> repository;
[TestInitialize] • Mantenibilidad de la aplicación.
public void Init() • Facilitar la evolución y el posterior mantenimiento de
{
var moqRepository = new Moq. la aplicación.
Mock<IRepository<Customer>>();
var customerCollection = new List<Customer> Hacer Test no es solo es hacerlo a nivel de código, sino que
{ también es necesario hacerlos a nivel de la interfaz. Por
new Customer { CIF=”AAAA”, Saldo=2000,
Direccion=”Calle ...”, Title=”COMPARTIMOSS” } este motivo, cada vez son más importantes los equipos de
}; Q&A. Son los encargados de probar de arriba abajo la apli-
moqRepository.Setup(moq => moq.GetAll()).
Returns(customerCollection); cación y de dotarle de una calidad a nuestros desarrollos
repository = moqRepository.Object; haciendo posible que la aplicación llegue sin errores/bugs
}
al cliente.

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.

Un tema a tener presente es la finalidad del Gateway que


proporciona una transferencia de datos rápida y segura en-
tre los datos locales, y servicios. Se puede utilizar un único
Gateway con diferentes servicios al mismo tiempo.

Recordar que se debe contar con una cuenta configurada


de Power BI PRO y con la posibilidad de loguearse en plata-
forma Power BI Web.

en este artículo se mostrarán los pasos a


seguir para la correcta configuración de Imagen 2.- Página de descarga del Gateway.

Gateway en Power BI 3.– Al ejecutar el programa se ejecutará un wizard de


instalación del Gateway On-Premises. En la primera
Se recomienda instalar el Gateway en un servidor/máqui- ventana se generarán recomendaciones de equipo
na que cuente con las siguientes características (servicio): necesario para llevar adelante la instalación del Ga-
teway, así como también una explicación de funcio-
• El equipo debe permanecer encendido o tener ciclos
namiento y objetivos del mismo.
cortos de apagado (que no coincidan con las actualiza-
ciones programadas).
• Se recomienda que la conexión a internet sea a través
de una red física y no a través de redes inalámbricas.

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.

Imagen 1.- Descarga de Data Gateway.

2.– Una vez seleccionada dicha opción, se abrirá una


pestaña con la opción para descargar el ejecutable
de Gateway Imagen 4.- Configuración del tipo de puerta de enlace.

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 5.- Aviso antes de instalar el Gateway.

7.– En la siguiente ventana, deberemos especificar


donde se instalará el Gateway y si se aceptan tér-
minos de uso y privacidad. Una vez seleccionado el
path de destino y aceptado los términos y condición
se selección la opción de Instalar.

Imagen 9.- Opciones de configuración del Gateway.

1. Al completar la configuración, se mostrará el si-


guiente cuadro de confirmación. En esta etapa se
finaliza la instalación y configuración del Gateway.

Imagen 6.- Ubicación de instalación del Gateway.

8.– La instalación puede demorar varios minutos. Se


reflejará un control de avance en la siguiente pan-
talla:

Imagen 7.- Proceso de instalación del Gateway. Imagen 10.- Fin de la configuración del Gateway.

9.– El siguiente paso será la configuración del Ga-


teway, y para ello nos solicitará que iniciemos sesión Agregando orígenes de datos al
(se debe contar con una cuenta de Power BI PRO).
Si contamos con los datos necesarios para iniciar se-
Gateway
sión, seleccionar la opción Iniciar Sesión. Una vez configurado el Gateway, se debe asociar los oríge-
nes de datos al mismo. Para asociar los orígenes de datos
se debe realizar el siguiente procedimiento:

1.– Ingresar al Sitio de Power BI, y dirigirse en el bor-


de superior derecho a la opción Manage Gateways.

Imagen 8.- Instalación correcta del Gateway.

10.– Una vez iniciada la sesión, debemos proporcionar


el nombre al Gateway y una clave de recuperación
Imagen 11.- Acceso a las opciones de administración del Gateway.
asociada al mismo (esta clave no puede ser cambia-

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 12.- Configuración de una puerta de enlace.

3.– En la página de configuración de data source, se


debe proporcionar el nombre de data source, y el
origen de datos (una vez seleccionada el origen, se
habilitarán otros campos a completar dependiendo
el origen elegido).

Imagen 16.- Configuración de un Dataset.

Imagen 13.- Configuración de un origen de datos.

podemos establecer un máximo de 8 actua-


Configuración de Datasets
lizaciones diarias de los dataset
Al contar con una cuenta de Power BI PRO y un Gateway
configurado, podemos establecer un máximo de 8 actuali-
zaciones diarias de los dataset. Para programar dichas ac- Schedule Refresh
tualizaciones, se debe realizar el siguiente procedimiento: En este caso se especificará la configuración de periodici-
1.– Ingresar en sitio de Power BI, y dirigirse a la op- dad de actualización de los datos del dataset respecto a
ción Settings – Settings los orígenes del Gateway establecido. Podremos especifi-
car actualización diaria o semanal. Tomar en cuenta que
se pueden establecer hasta 8 procesos de actualización
diaria.

Imagen 14.- Acceso a la configuración de datasets.

2.– Dentro de la página de Settings, dirigirse a la pes-


taña Datasets

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.

En la sección Q&A and Cortana se puede especificar si per-


mitiremos consultas en lenguaje natural, a través de la uti-
lización de Cortana.

Imagen 19.- Featured Q&A Questions.

Imagen 18.- Q & A and Cortana. GASTON GRUZ


Business Intelligence Technical Manager en Arkano
Featured Q&A Questions Software
MCSE: SharePoint
En esta sección podemos especificar un conjunto de pre- MCSA: Office 365
guntas que el usuario puede realizar, de forma de acceder

Cree potentes formularios fácilmente,


SIN necesidad de conocimientos
técnicos

Ensaye los Formularios


de KWizCom Forms

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:

Continuando la serie de artículos hablando del framework


de Provisioning del PnP, veremos cómo crear nuestros pro-
pios ExtensibilityHandlers, con los que podremos añadir
nuestras propias acciones, tanto al exportar un sitio como
plantilla, como al provisionar una plantilla a un nuevo sitio.

Antes de empezar, es necesario recordar un par de cosas


con respecto al programa PnP. Primero, sabed que recien-
temente se ha liberado la reléase de agosto, que incluye
numerosas mejoras en la parte de Provisioning, y que va
acompañada de un nuevo Schema XML. Tenéis todos los
Imagen 2.- Proceso de provisioning.
detalles en el enlace https://dev.office.com/blogs/PnP-
August-2016-Release Como último apunte antes de entrar en el código, cabe
destacar que los Extensibility Handlers se pueden ejecutar
tanto en el proceso de Provisioning, como en el de Export,
recientemente se ha liberado la release de (inicialmente, los Extensibilbity Handlers se llamaban Pro-
agosto, que incluye numerosas mejoras en visioning Extensiblity Providers, y solo se ejecutaban en el
proceso de provisioning, por lo que no era posible ejecutar
la parte de Provisioning custom code a la hora de exportar un site como 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.

Para crear nuestro Extensibility Handler, basta con crear


una nueva biblioteca de clases, y que nuestra clase, imple-
mente la interfaz IProvisioningExtensibilityHandler defini-
da dentro del PnP Core. Tras hacer esto e implementar la
Imagen 1.- Componentes del programa PnP. interfaz, tendremos el código de la siguiente imagen:

11
creamos una nueva clase, derivada de TokenDefinition

En el constructor de la clase, simplemente llamamos a su


clase base, especificando el patrón de definición del Token:
“{{webpropertybag:{0}}}”. Esto define como se utilizará el
token desde el XML de la plantilla. En este caso, si quere-
mos usar el valor de una PopertyBag con Key “PnPTempla-
teVersion”, desde el XML haremos algo como: “{webprope
rtybag:PnPTemplateVersion}”

Finalmente, sobrescribimos el método GetReplaceValue()


El primer método Extract, se ejecutará cuando se haga donde se hace el remplazo del token por el verdadero va-
el Export de un sitio existente a plantilla PnP. En nuestro lor. En dicho código, hacemos uso de una Extension del
ejemplo, nos vamos a centrar en la acción de provisioning, propio PnP, que nos facilita el trabajo para obtener una
y no vamos a hacer nada en el momento de exportar el si- PropertyBag.
tio, así que simplemente, devolveremos la misma plantilla
que recibe el método: Una vez definido el token, es momento de volver al Exten-
sibility Handler, y utilizarlo:

El método GetTokens nos va a permitir ampliar la colec-


ción de Tokens que posteriormente recibirá la acción de
Provision. El framework de Provisioning del PnP, hace uso
de una clase TokenParser, que nos permite utilizar tokens El último paso es rellenar el método Provision, donde in-
en la definición de la plantilla. Dichos tokens son resueltos sertaremos el nuevo ítem en la lista de Log
en tiempo de ejecución, y sustituidos por el valor real, de- Pero antes de eso, vamos a ver como registrar nuestro
pendiendo del contexto. Por ejemplo, podemos hacer uso custom Handler en la plantilla PnP. Para ello, usaremos el
del token ~sitecollectiontermstoreid que será remplazado nodo Provider, disponible dentro del schema del PnP, y lo
por el ID del TermStore de la tenant, y que es muy útil para apuntamos a nuestra nueva clase custom Handler:
cuando queremos provisionar Site columns de metadatos
administrados. El Framework dispone de muchos tokens, y
seguramente cubra todo lo que necesitamos, pero si no es
así, podemos utilizar este método para ampliar el listado
de Tokens.

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.

Si ponéis un breakpoint en el método


GetTokens, os daréis cuenta que dicho mé-
todo no se está ejecutando nunca

Para resolverlo, primero hay que editar el archivo Extensi-


blityManager.cs, y cambiar la cabecera del método Execu-
teTokenProviderCallOut

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:

foreach (var handler in template.ExtensibilityHandlers. AuthenticationManager authManager = new


Union(applyingInformation.ExtensibilityHandlers)) AuthenticationManager();
var context = authManager.
GetSharePointOnlineAuthenticatedContextTenant(
Con ambos cambios resolveremos el bug, y nuestro Exten- “https://tenant.sharepoint.com/sites/demo”,
“UserName”,
sibility Provider funcionara tal y como esperamos. “Passw0rd”);

Volviendo al método de Provision de nuestro custom XMLFileSystemTemplateProvider provider = new


XMLFileSystemTemplateProvider(“C:\\TemplateFolder”, “”);
Handler, tendremos el siguiente código para crear un nue-
vo ítem en la lista de Log. var template = provider.GetTemplate(“CompartiMOSS.PnP.
HandlersDemo.xml”);

context.Web.ApplyProvisioningTemplate(template);

Una vez aplicada la plantilla, podemos ver nuestra lista de


Log, con un elemento con la versión de la plantilla.

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.

Construyendo nuestro primer Bot


Dado que aún es una tecnología que está naciendo, los
primeros pasos para construir nuestro Bot son algo engo-
rrosos y manuales contrariamente a lo que nos tiene acos-
tumbrados Microsoft, así que vamos a ver de forma muy
esquemática cómo comenzar.
Imagen 2.- Estructura del proyecto de aplicación Bot.
1.– Instalar VS 2015 (vale la versión Community).
2.– Instalar la plantilla de Bots que podemos encon- Como se puede observar en la imagen 2, disponemos tam-
trar aquí. bién de una página por defecto, default.htm, que será la
3.– Descomprimir el contenido del archivo .zip que página donde deberemos definir los términos de uso ade-
nos descargamos en la carpeta “%USERPROFILE%\ más de indicarnos información para el registro de nuestro
Documents\Visual Studio 2015\Templates\Project- Bot para que pueda ser usado.
Templates\Visual C#\”
4.– Abrir Visual Studio.
5.– Crear un proyecto usando la plantilla “Aplicación
Bot”.

Imagen 3.- Página de inicio de la aplicación Bot.

Testeando el Bot localmente


Para poder testear el Bot, disponemos de un emulador, Bot
Framework Emulator, que podremos descargarnos desde
https://aka.ms/bf-bc-emulator que nos permitirá comunicar-
nos con nuestro Bot de diversas formas como, por ejemplo,
simular una conversación entre múltiples usuarios, testear
diferentes tipos de comunicación, cambiar el lenguaje de
Imagen 1.- Plantilla de proyecto para aplicación Bot.
comunicación, etc.

Estructura del proyecto


El proyecto, como podremos observar, se corresponde con en el pasado //build/ Microsoft presentó
WebApi lo que, a todas luces, es lógico dado que un Bot Microsoft Bot Framework, una nueva tecno-
no será más que un servicio que se comunicará con los
usuarios, respondiendo ante determinadas acciones que logía que ofrece grandes posibilidades

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.

Imagen 4.- Bot Framework Emulator.

Por defecto, la plantilla de aplicación Bot viene configurada


para respondernos con una cuenta del número de caracte-
res que hemos escrito como mensaje, además, en el panel
derecho podemos visualizar el mensaje JSON que comuni-
ca el Bot.
Imagen 7.- Selección de Web App.

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.

Tal y como ya habíamos comentado, el Bot no es más que


una aplicación WebApi y, por lo tanto, se publicará como
Azure Web App.

1.– Seleccionamos publicar desde el menú contex-


tual del proyecto.

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.

Imagen 9.- Publicación de la aplicación.

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

Es importante tener en cuenta que para publicarlo nece-


sitamos crear un Microsoft App Id y su password corres-
pondiente mediante el Botón “Create Microsoft App Id
and Password” que estará directamente relacionado con
el nombre de nuestro Bot, establecido en el primer campo
del formulario. Una vez seleccionemos el Botón, nos apa-
recerá otro formulario donde podremos generar la contra-
seña.

Imagen 11.- Creación de Id y password de la aplicación.

No debemos perder estos datos ya que habrá que introdu-


cirlos en el archivo “web.config” para poder comunicarnos
con el Bot.

<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>

Una vez completado el formulario de registro, podremos


ver nuestro Bot en la pestaña “My Bots” o en la url https://
dev.Botframework.com/Bots.

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.

Imagen 13.- Test de conexión con el Bot.

Testeando el Bot en remoto


También es posible testear de forma remota un Bot publi-
cado, pero para ello tendremos que usar otra herramienta
Imagen 16.- Configurar el Bot para funcionar con Skype.
que nos permita comunicar el emulador con nuestro Bot.
Microsoft recomienda el uso de ngrok, una herramienta En el formulario debemos activar aquellas características
de línea de comandos que nos permite exponer servidores que nos interesen y para las que hayamos preparado el
locales, ya que es muy sencillo de usar. Los pasos a seguir Bot.
para poder testear el Bot son los siguientes:

1.– Descarga de ngrok: Podemos descargar ngrok


desde su sitio web https://ngrok.com/.
2.– Exponer el emulador por medio de ngrok ejecu-
tando un simple comando:
ngrok http -host-header=rewrite 9000

3.– Establecer el valor de “Emulator Url” del Bot Fra-


mework Emulator con la url https que nos indica
ngrok.

Imagen 14.- Url con la que ngrok expone el emulador.

4.– Volver a configurar el emulador con los paráme-


tros correspondientes para Bot Url, Microsoft App Id
y Microsoft App Password. Imagen 17.- Configuración del Bot.

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.

Imagen 18.- Añadir Bot a Skype.

Imagen 21.- Conversación con el Bot a través de Skype.

Finalmente, podremos embeber una conexión a nuestro


Bot gracias a la opción “Get bot embed codes” que nos
aportará el código necesario para integrarlo en un sitio
web y que así los usuarios puedan conectarse de forma
sencilla.

Imagen 22.- Código para embeber el Bot.

Imagen 19.- Aceptación de permisos. Conclusiones


Microsoft ha puesto en nuestras manos la posibilidad de
automatizar conversaciones con los usuarios de una for-
ma realmente sencilla y que, de esta forma, ciertas tareas
como por ejemplo la atención al cliente puedan dar un sal-
to de calidad.

Referencias y más información


• Documentación oficial: https://docs.botframework.
com/en-us/skype/getting-started/
• Documentación ngrok: https://ngrok.com/docs
• Skype bots: https://developer.microsoft.com/en-us/
skype/bots
Imagen 20.- Bot añadido correctamente.
SANTIAGO PORRAS RODRÍGUEZ
Mobile & Cloud Experience Lead at Encamina
por defecto, los Bots están preparados para MVP Windows Platform Development
integrarse con Skype MVP Visual Studio Technologies
http://blogs.encamina.com/en-tu-casa-o-en-la-mia/
Una vez hemos añadido nuestro Bot a Skype, podremos http://geeks.ms/santypr  
interactuar con él como si de otra conversación se tratara. @saintwukong

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.

Como funciona Azure WebJobs Creación y configuración de un


Probablemente el servicio más importante de Azure para WebJob en Azure
desarrollo de nuevas aplicaciones es Azure Apps, que cons- WebJobs se crean y configuran de la misma forma que
ta a su vez de cuatro servicios: Web Apps, Mobile Apps, Web Apps en Azure. También todas sus posibilidades de
API Apps y Logic Apps. Por medio de Web Apps se pueden tipo de infraestructura a utilizar, escalabilidad, etc., son
crear aplicaciones Web (ASP.NET, JavaScript, PHP, etc.) y exactamente las mismas. Aunque toda la configuración se
hostearlas en Azure. Azure ofrece toda la infraestructura puede realizar desde Visual Studio, es recomendable ha-
de Máquinas Virtuales, perfectamente configuradas y con cerla antes de comenzar a programar y directamente des-
todas las posibilidades de extensibilidad, mantenimiento y de el Portal de Azure pues se tiene mucho mejor control
escalabilidad, de tal forma que lo único que es necesario sobre los parámetros a utilizar. La creación que se indica a
es configurar el servicio y subir el código de la aplicación. continuación también se puede automatizar por medio de
Web Apps permite crear dos tipos de aplicaciones: las PowerShell o utilizando un Template de Azure.
aplicaciones que funcionan con una interface de usuario y 1.– Desde el Portal de administración de Azure (http://
realizan algún tipo de trabajo tal como las que se utilizan portal.azure.com) seleccione “Resource groups” =>
en sitios de Internet, y WebJobs, aplicaciones que no dis- “Add”. Defina un nombre para el Grupo de Recursos,
ponen de una interface de usuario y se ejecutan automá- la suscripción a utilizar y la localización deseada.
ticamente basado en un esquema de tiempo (cada minu- 2.– Una Web App necesita tener un “App Service
to, cada hora, un determinado día, continuamente, etc.). Plan”, que define las características y capacidades
En SharePoint, los WebJobs se pueden comparar a cómo que todas las Web Apps en el Grupo de Recursos van
funcionan los Timer Jobs de SharePoint: realizan trabajos a compartir. Seleccione el Grupo de Recursos creado
temporalizados de forma completamente automática y sin en el punto anterior, utilice el botón de “Add” y en
intervención de los usuarios. la casilla de búsqueda escriba “app service plan” y
Azure WebJobs se pueden utilizar en conjunción con Sha- seleccione “App Service Plan” en la lista resultados.
rePoint en dos escenarios típicos: Utilice el botón de “Create” en la nueva ventana.
3.– En la ventana de creación del Service Plan indique
• En SharePoint OnPremises para mover procesos que un nombre, la suscripción a utilizar y el Grupo de Re-
utilizan considerables cargas de recursos de los servi- cursos (si no ha sido seleccionado automáticamen-
dores de la granja (CPU y RAM) hacia servidores ex- te). La localización del Servicio y el tipo de Máquina
ternos en Azure, que se pueden escalar de forma muy Virtual a utilizar también se pueden elegir o utilizar
sencilla. También hay que hacer notar que la progra- los predefinidos. Note que hay un “tier” que es gra-
mación de Azure WebJobs es considerablemente más tis, el “F1”, aunque ofrece la menor capacidad y algu-

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>

Ejemplo de utilización de Azure


13.– En el mismo archivo “App.config”, configure la ca-
WebJobs con SharePoint dena de conexión de la propiedad “AzureWebJobs-
Dashboard” que se encuentra al principio del código.
El siguiente ejemplo simplemente lee el número de docu-
El parámetro “connectionString” es de la forma:
mentos en una Biblioteca de SharePoint. Aunque extre-
madamente sencillo en cuanto a funcionalidad, la idea del
connectionString=”DefaultEndpointsProtocol=https;Account-
ejemplo es mostrar cómo crear y publicar un Azure Web- Name=sharepointwebjobsa;AccountKey=s/JLuH/0tUYkM0zm-
Job y cuáles son las posibilidades de debugging y loging, 6b3vPK0Ro6A/rWTWXrsnHUTzKrERZkChXcDuDFEgb9GYh-
59dR”
no crear nueva funcionalidad. En el ejemplo se utiliza Sha-
rePoint Online, pero el código se puede utilizar sin ningún
En donde “AccountName” es el nombre de la instancia de
problema con una granja de SharePoint OnPremises, cam-
Azure Storage creado en el punto 4 y 5. “AccountKey” se
biando solamente el URL del servidor.
puede encontrar en el portal de Azure, seleccionando el
7.– Inicie Visual Studio (versión 2015 con Update 3 Storage creado y yendo a “All settings” => “Access keys”
en el ejemplo, pero también se puede utilizar Visual => “key1”.

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:

static void Main()


{
string mySharePointSiteUrl = “https://dominio.sharepoint.
com/sites/test01”;
string mySharePointBiblioteca = “Libreria Uno”;
string myCuenta = ConfigurationManager.AppSettings[“Cuen-
taSharePoint”];
string myClave = ConfigurationManager.AppSettings[“Clave-
SharePoint”];

using (ClientContext myContext = new ClientContex-


t(mySharePointSiteUrl))
{
SecureString myClaveSegura = new SecureString(); Imagen 2.- Ventana inicial para publicar el WebJob.
foreach (char unChar in myClave)
{
myClaveSegura.AppendChar(unChar); Hay múltiples formas para configurar esta función: conti-
} nuamente, manualmente, cada determinado tiempo recu-
myContext.AuthenticationMode = ClientAuthentication- rrentemente o en una fecha determinada. Por el momento
Mode.Default; seleccione “Run on demand” en la sección “WebJob run
myContext.Credentials = new SharePointOnlineCreden-
tials(myCuenta, myClaveSegura); mode” y utilice el botón de “OK”.
try La siguiente ventana permite seleccionar el servicio en
{
List myLista = myContext.Web.Lists.GetByTitle(myShare- Azure. Haga clic sobre “Microsoft Azure App Service”:
PointBiblioteca);
myContext.Load(myLista);
myContext.ExecuteQuery();

if (myLista != null && myLista.ItemCount > 0)


{
Console.WriteLine(myLista.Title.ToString() + “ tiene “ +
myLista.ItemCount + “ documentos”);
}
else
{ Imagen 3.- Selección del servicio de Azure.
Console.WriteLine(“No hay documentos”);
} Y en la siguiente ventana seleccione la cuenta a utilizar
}
catch (Exception ex) (probablemente tiene que entrar de nuevo sus credencia-
{ les), lo mismo que la suscripción, Grupo de Recursos, etc.,
Console.WriteLine(“Error: “ + ex.ToString());
} y seleccione la Web App que va a contener el WebJob:
}
}

Al inicio de la rutina se definen cuatro variables que con-


tienen el URL del sitio con la Biblioteca de SharePoint a
examinar, el nombre de la Biblioteca misma y los valores
de la cuenta para acceder a SharePoint. Luego se crea el
contexto de SharePoint utilizando su Modelo de Objetos
de Cliente y se ensambla la cadena segura a utilizar para Imagen 4.- Selección de la WebApp dónde publicar.

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:

Imagen 5.- Ejecución del WebJob.

Utilizando el botón de “Logs”, el navegador abre una nueva


pestaña mostrando información sobre las veces que el Job
a ejecutado:

Imagen 8.- Ejecución del WebJob desde la Consola de Azure.

19.– La forma de temporizar el Job se definió en el mo-


mento de publicarlo en Azure (punto 16). Cuando se
define el momento de ejecución, Visual Studio crea
un archivo llamado “webjob-publish-settings.json”
en el directorio “Properties” que contiene la confi-
guración:

{
“$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”
}

Si se desea cambiar la configuración, elimine este archivo


y publique el Job de nuevo, lo que obliga a Visual Studio a
mostrar de nuevo la ventana de definición del tiempo de
ejecución y crear un nuevo archivo. No es posible cambiar
la forma o el tiempo de ejecución desde el portal de Azure.

Imagen 7.- Detalle de la ejecución del WebJob.


los servicios de Azure para complementar
Note que la salida por consola que se programó en el có-
digo (línea 41) el funcionamiento de SharePoint, Azure
WebJobs permite mover operaciones que
Console.WriteLine(myLista.Title.ToString() + “ tiene “ + myLista.
ItemCount + “ documentos”);
requieren muchos recursos

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

Expertos en Plataformas y Tecnologías Cloud & OnPremises

Productividad

Colaboración & Comunicación

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.

A lo largo de este artículo veremos cómo integrar una We-


WebApi gestión de contactos en la
bApi en nuestras PowerApps como una conexión más den- Agenda: AgendaController
tro de nuestro catálogo de conexiones, y además veremos
cómo integrar flujos de trabajos de Microsoft Flow con Vamos a implementar una webApi sencilla para desplegar-
nuestras aplicaciones. la en nuestro entorno de Azure. Para ello desde el Visual
Studio creamos una nueva solución y añadimos un proyec-
Dado que siempre es más intuitivo trabajar sobre un ejem- to del tipo Web Application / Web Api.
plo, en los siguientes puntos vamos a desarrollar una app
sencilla en PowerApp que consiste en una Agenda de usua-
rios que contenga la información de contacto, y la actividad
en Twitter de cada usuario de la agenda. La particularidad
de la aplicación es que todos los datos van a estar alojados
en una base de datos de MongoDB.

Agenda de Contactos: PowerApps


y MongoDB
Vamos a implementar una aplicación en PowerApp desde
una plantilla en blanco (revisar artículos anteriores si sur-
gen dudas), dejando un poco el diseño a elección propia.
La idea de implementar esta APP es poder tener una agen-
da de contactos en el móvil, diseñar un listado de usuarios,
un alta de contactos, una actualización de contactos y una
vista de detalle. Imagen 2.- Creación web api desde Visual Studio.

Lo vamos a hospedar en Azure por lo que podemos apro-


vechar a dejar configurado el despliegue antes de conti-
nuar. En cuanto a la autenticación no es relevante para este
ejemplo, pero aclarar que PowerApps soporta autentica-
ción con OAuth contra Azure AD.

Una vez creada la solución y la WebApi vamos a crear los


métodos necesarios para gestionar la Agenda.

Lo primero es crear un nuevo controlador en la Api que lla-


maremos AgendaController, y yo recomiendo borrar todos
los controladores que no vayamos a utilizar y que la planti-
Imagen 1.- Arquitectura de la solución. lla base de Visual Studio nos ha generado.
Además de almacenar los datos de contactos de un usua-

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.

[HttpPost] Para ello accedemos a <url api>/swagger/docs/v1, y des-


[Route(“AddUser”)]
public bool AddUser([FromBody]Contact contact){} cargamos el fichero .json que contiene toda la definición
de la API que acabamos de desplegar. Este fichero no hace
[HttpPost]
[Route(“DeleteUser”)] falta modificarlo ya que Swagger ha extraído todas las con-
public bool DeleteUser(string id){} figuraciones y métodos que hemos ido definiendo desde el
[HttpPost] Visual Studio.
[Route(“AddTweet”)]
public bool AddTweet(Tweet tweet){} Una vez descargado el fichero vamos a acceder a https://
powerapps.microsoft.com/es-es/ con nuestra sesión de
Vamos a tener dos métodos GET para obtener el listado de usuario y seleccionamos “conexiones” y nueva conexión.
usuarios y el detalle de un usuario por Id, y tres métodos
POST para implementar el Añadir, Borrado y Añadir nuevo En la siguiente pantalla veremos que tenemos las cone-
Tweet. Más adelante veremos que contienen los modelos xiones estándar, y un apartado para conexiones “Custom”.
BaseContact, Contact y Tweet y una posible implementa- Seleccionamos New Custom Api para registrar el API que
ción de la solución. hemos implementado.

debemos entender que solo en casos muy


concretos vamos a necesitar utilizar estas
Imagen 5.- Registro de una API en PowerApps.
herramientas
En este punto se nos solicitará el archivo de definición que
Supongamos que ya tenemos implementada la WebApi tal nos ha generado Swagger, y algún dato de personalización
y como necesitamos, y queremos proceder a registrar la como el nombre o una imagen personalizada. Una vez re-
API en nuestra PowerApp. Decir que el primer punto que gistrada la API, (veremos que es un paso casi instantáneo),
debemos cubrir es tener instalado Swagger en nuestra debemos registrarla como nueva conexión, para que nues-
Api. Este framework para API’s, nos va a permitir extraer la tras PowerApps puedan consumirlas.
definición de nuestra WebApi e integrarla en PowerApps. Si vemos la imagen anterior, es tan fácil como seleccionar
Para ello desde el visual studio necesitamos instalar el pa- “+”, y seleccionar “Add Connection”.
quete Nuget Swashbuckle, tal cual se aprecia en la siguien-
te figura.

Imagen 6.- Añadir conexión a las App en PowerApps.

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.

Por tanto, para este ejemplo se ha desarrollado un modelo


de documento que almacena el listado de todos los usua-
rios y la mínima información necesaria, y otro modelo de
documento que almacena la información extendida del
contacto y las entradas de Twitter que realice.

Podemos decir entonces que el documento Index (listado


de contactos) va a ser único y se va a cruzar con nuestro Imagen 7.- Modelo base de datos en Mongo DB.
modelo BaseContact, y el documento “Contacto” va estar
replicado una vez por cada contacto y se va a mapear con Estructura de la solución
el modelo de clase Contact.
Para consumir la base de datos en MongoDB vamos a im-
Toda la información va ir serializada en formato JSON, plementar una clase repositorio que nos permita insertar,
para simplificar los mapper, y por seguir un estándar. actualizar y obtener los ficheros JSON que necesitamos, así
como mapearlos en los modelos de clases que hemos defi-
Modelos nido con anterioridad.
BaseContact 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
modelo de N-capas para distribuir la aplicación.
public class BaseContact
{
public string Id { get; set; } Lo importante del artículo no es la implementación de la
public string Name { get; set; } solución, pero es un ejemplo de cómo podía quedar en
public string UserName { get; set; }
public string Image { get; set; } caso de querer abordarla.
}

Contact

Public class Contact : BaseContact


{
public string Adress { get; set; }
public string Phone { get; set; }
public string Date { get; set; }
public List<Tweet> TweetMessage { get; set; }
}

El modelo contact contiene una lista de Tweet, que no es


más que la información recogida desde Twitter como pue-
de ser el nombre, usuario, fecha…..; un poco lo que nece-
sitemos almacenar.

Los documentos que vaya almacenando el api en el Mon-


goDB, deberán llevar un metadato adjunto al documento Imagen 8.- Estructura de la solución.
para poder hacer consultas contra la base de datos. En este
caso vamos a utilizar el campo “Id” de BaseContact, que Para consumir la base de datos en MongoDB vamos a im-
va a llevar la cuenta de Twitter asociada al contacto, y que plementar una clase repositorio que nos permita insertar,
sabemos a ciencia cierta que es única en el sistema. actualizar y obtener los ficheros JSON que necesitamos, así
como mapearlos en los modelos de clases que hemos defi-
nido con anterioridad.

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.

No voy a profundizar en la capa de negocio, en mi caso


he implementado una clase AngendaBL, que se encarga de
orquestar las llamadas a la capa de acceso a datos y recibir
las llamadas desde la API. Esta capa se puede implementar
a medida de la solución que queramos dar, en mi caso po-
demos ver un ejemplo de cómo queda el método “AddIn-
dexContact”.

public bool AddIndexContact(Contact contact)


{
var users = GetContacts()?.ToList(); Imagen 9.- Paquetes necesarios para implementar MongoRepository
MongoRepository<BaseContact> mongoRepository = new
MongoRepository<BaseContact>();
users = users ?? new List<BaseContact>(); Con el paquete MongoDB.Bson controlamos todo el apar-
var existUsers = users.Where(c => c.Id == contact.Id).Fir- tado de conexiones y consultas, y por el contrario con el
stOrDefault();
if (existUsers != null) paquete MongoDB.Driver.GridFS controlamos el tráfico de
{ ficheros.
users.Remove(existUsers);
DeleteContact(existUsers.Id);
DeleteContact(“index”); Lo primero que necesitamos para hacer una consulta o un
} uplodad de un documento en MongoDB desde código es
users.Add(contact.GetMinContact());
var document = JsonConvert.SerializeObject(users); instanciar una conexión contra el servidor de base de da-
var id = mongoRepository.UploadFileFromBytes(System. tos.
Text.Encoding.UTF8.GetBytes(document), “index”);
return !string.IsNullOrEmpty(id);
} Una buena forma es implementar en el constructor de la
clase repositorio la conexión a “MongoClient”, y así tenerlo
Este método se encarga de “verificar” si el contacto ya disponible desde el primer momento.
existe en la colección de MongoDB, y si es así descarga el
documento, borra de la lista el usuario para actualizarlo de public MongoRepository()
{
nuevo, borra el documento index y lo sube de nuevo actua- ServerMongoDb = ConfigurationManager.AppSet-
lizado. Esto es porque MongoDB no aporta un update di- tings[“urlMongoDb”];
this.Database = ConfigurationManager.AppSettings[“da-
recto, por lo que debemos descargar el documento, incre- tabaseMongoDB”];
mentarlo y borrar la copia anterior antes de subirla, para no this.Collection = ConfigurationManager.AppSettings[“col-
lectionMongoDB”];
tener varios documentos con el mismo metadato asociado. this.CollectionInternalName = this.Collection + “.files”;
Con este método actualizamos el documento Index.json Client = new MongoClient(this.ServerMongoDb);
}
Sería un proceso similar actualizar el documento contact.
json
No debemos preocuparnos de cerrar la conexión, porque
MongoRepository: controla tu en este caso MongoClient no es disposable.

MongoDB Como apreciamos en el código necesitaremos la url al ser-


vidor, una base de datos en Mongo, y el nombre de la co-
Igual que la clase negocio no resulta interesante para este lección donde haremos las operaciones (aunque Mongo
artículo, si merece la pena detenernos un poco más en la aporta una colección files por defecto si no se lo indica-
clase repositorio de MongoDB, y ver que paquetes nece- mos).
sitamos para manejar una base de datos no relacional de
este tipo. Para realizar una consulta contra MongoDB podemos fijar-
nos en el método GetDocument(string id), que vamos a im-
plementar para obtener documentos desde el MongoDB.

necesitamos añadir un nuevo paso para public dynamic GetDocument(string codDocumento)


{
registrar el Tweet en nuestra base de try
{
var database = Client.GetDatabase(Database);
datos var bucket = new GridFSBucket(database);
var listaFiltros = new List<FilterDefinition<GridFSFileIn-
fo>>();
var filtro = Builders<GridFSFileInfo>.Filter.Eq(fi => fi.Meta-
data[“codDocumento”], codDocumento);
Para implementar MongoRepository hemos hecho uso listaFiltros.Add(Builders<GridFSFileInfo>.Filter.And(fil-
principalmente de los paquetes NuGet tro));

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.

En este caso solo tenemos un campo metadato asociado


al documento que es el “codDocumento”, y que como diji-
mos antes será la cuenta de Twitter del usuario. Si obtene-
mos algún tipo de file relacionado al codDocumento con-
sultado, basta con hacer una descarga del documento con Imagen 10.- Iniciando un Microsoft Flow.

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:

public string UploadFileFromBytes(byte[] content, string cod-


Documento)
{
try
{
ObjectId result;
var database = Client.GetDatabase(Database); Imagen 11. Conectando un Microsoft Flow a una custom API.
var bucket = new GridFSBucket(database);
var options = new GridFSUploadOptions
{ Como vemos podemos conectar un Flow directamente a
Metadata = new BsonDocument un método de la API, sin necesidad de realizar ninguna pe-
{
{“codDocumento”, codDocumento}, tición compleja o configuración intermedia.
}
};
result = bucket.UploadFromBytes($”loadFile{codDocu-
mento}”, content, options);
return result.ToString();
}
catch
{
throw;
}
}

Como vemos es muy sencillo, basta con asociar el meta-


dato correcto al fichero que recibimos en el parámetro
content en byte[] y realizar un UploadFromBytes.
Imagen 12. Petición POST contra una custom API.

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.

Mapeamos estos campos del modelo con valores de Twit-


ter de tal forma que la API reciba todos los parámetros
necesarios para rellenar el modelo en base de datos. Por
ultimo le damos un nombre al Flow, y lo guardamos para
que pueda empezar a usarse.

Si escribimos un Tweet, podemos hacer un seguimiento de


la ejecución de este trabajo desde el propio portal de flow,
seleccionando en el apartado “info” que tenemos junto al
flujo seleccionado.
Imagen 15.- Listado de contactos.

Esta pantalla se ha implementado con una galería persona-


lizada que mapea un listado del modelo “BasicContact”, de
la forma que en el evento “OnVisible” de esta pantalla, se
Figura 13.- Seguimiento de un Flow. ha aprovisionado una colección de datos llamada Usuario.

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.

Como he adelantado al principio del artículo no me voy a


detener mucho en la “implementación” de la app, ya que
en artículos anteriores hemos hablado mucho de este pun-
to, decir que solo se han utilizado controles básicos como
Galerías personalizadas, Botones, eventos de Navegación y
alguna colección de datos que repasaremos en este punto.

Lo primero que debemos hacer es añadir como DataSou-


rce la api que hemos implementado durante el ejemplo.
Para ello desde la barra superior en el apartado content,
seleccionamos DataSource y buscamos la apiAgenda se-
leccionando “Add data Source”.
Imagen 16. Pantalla detalle contacto y entradas.

En el caso de la vista de detalle, en el evento de carga se


crean dos colecciones de la forma:
• ClearCollect(usuarios,ApiMongo.
AgendaGetUser(currentId));
• ClearCollect(entradas,ApiMongo.
AgendaGetUser(currentId).TweetMessage)

Si vemos en la imagen los datos personales y la imagen se


corresponden con la colección usuarios, y por otro lado la
lista de entradas (Tweets) se corresponde con la colección
Imagen 14.- Añadir un API como DataSource. entrada.
Como adelantamos al inicio la primera pantalla de la APP Solo falta por deducir que el parámetro “currentId”, se
es el listado de usuarios. envía desde la lista de usuarios de la forma Navigate

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.

mos tratado conocimientos complejos, y motive a los de-


sarrolladores a lanzarse a usar esta tecnología ya que este
modelo de trabajo con PowerApps es mucho más flexible y
libre que trabajar solo con fórmulas y conectores estándar.

Pero como casi siempre en la vida no todo es blanco o ne-


gro, y en este caso lo único complejo es “decidir” cuando
optar más por un modelo basado en conectores estándar,
formulas y controles básicos, o por otro lado optar más por
implementar una API personalizada e impactar en horas de
desarrollo un proyecto.

En nuestro caso es evidente, a día de hoy no podemos tra-


bajar con MongoDB si no es con el segundo modelo, pero
también hay otros factores como puede ser el rendimiento
de una PowerApps a grandes volúmenes de información,
o la complejidad de las consultas, que nos pueden hacer
movernos a implementar una Api y aligerar así nuestros
Figura 17.- Pantalla añadir contacto. DataSource.

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 Microsoft Certified Professional desde el año 2001.

Me especializo en Sistemas Operativos e infraestructura de


redes basadas en dominios, además cuento con un fuerte
background en soluciones de colaboración y mensajería
como Microsoft Exchange.

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

¿Por qué y cómo empezaste en el dades tecnológicas hoy en día?


mundo de la tecnología? Actualmente soy socio y director de una de las compañías
más grandes en servicios tecnológicos de Tenerife. Dentro
Desde antes de comenzar oficialmente en la informáti-
de mis actividades actuales están: la dirección y visión de
ca me he sentido motivado por los sistemas operativos
la compañía en las diferentes áreas del mercado, llevando
en general, empecé a trabajar con Microsoft MS-DOS y
a nuestros clientes a servicios basados en cloud compu-
Windows 3.0.
ting, básicamente nuestra oferta se basa en Microsoft
Considero esa época excepcional para la evolución de la
Azure & Microsoft Office365.
tecnología, al mismo y a nivel de servidores tuve la gran
Además de ello dirijo el departamento de diseño y desa-
oportunidad de trabajar con OS/2 Warp 3.0, en ese mo-
rrollo de nuestra compañía, esto me ha dado la oportuni-
mento enlazar sistemas basados en MS-DOS y OS/2 Warp
dad de conocer plataformas basadas en Unix como Linux,
era la demanda clásica del mercado.
FreeBSD y Mac OSX.
Profundicé mis conocimientos en Windows con la salida
de Microsoft Windows 95, me especialicé en ejecutarlo ¿Cuáles son tus principales activi-
en equipos de bajos recursos de hardware lo que me dio
la oportunidad de conocer el sistema operativo a fondo.
dades NO tecnológicas hoy en día?
Una vez liberado Microsoft Windows NT 4.0 Server Intento pasar el mayor tiempo disponible con mi familia.
abandoné toda la parte de cliente y me dediqué 100% a
Servidores. ¿Cuáles son tus hobbies?
Con la llegada de Microsoft Windows 2000 Server y Cuando tengo la oportunidad, viajar; pero la otra pasión
Active Directory empecé a trabajar en ambientes más más grande es la astronomía, además me considero
complejos gracias al apoyo de Microsoft al incorporarme afortunado de vivir en unos de los cielos más limpios del
en el programa de estudiantes excepcionales de tecnolo- mundo.
gía “Fuerza de Apoyo Microsoft” (FAM Program). Desde
allí me he dedicado a la infraestructura de sistemas a ¿Cuál es tu visión de futuro en la
nivel empresarial. tecnología de acá a los próximos
¿Cuáles son tus principales activi-
33
años? etc., triunfarán como plataformas de procesamientos
de datos, datos que llegaran a los usuarios con móviles,
Para esta pregunta cualquiera podría responder casi de tabletas, ordenadores, pero al final son datos, datos que
manera automática: el cloud computing, obviamente lo seguirán favoreciendo el Power BI.
es, la mejor apuesta que han hecho los fabricantes es el Los coches, los aviones y los drones se integrarán más y
software como servicio, además de limpiar de alguna ma- mejor con nuestros dispositivos, en mi entender particular
nera la piratería nos ha ayudado a disfrutar de software la informática tradicional de cliente/servidor ha muerto,
que nunca alcanzaríamos con el modelo de comercializa- hoy en día los usuarios no esperan el próximo Windows
ción anterior. para ver cómo será el nuevo icono de la papelera de re-
ciclaje, nos da igual lo que se ejecute por dentro, quere-
Pero mi visión de la tecnología en los próximos años es mos conexiones veloces, respuestas automáticas, acceso a
muy distinta a lo que tenemos en este momento ya que nuestra información.
muy a mi pesar los sistemas operativos están perdiendo
importancia dentro del ámbito del consumo de los usua-
rios e inclusive se empieza a notar en las empresas. La
DARWIN CASTRO MARÍN
adopción de tecnologías basadas en web seguirá favore-
Office Servers and Services MVP
ciendo la movilidad y la posibilidad de dispositivos de bajo
darwin.castro@ancadia.com
recursos y consumo.
@solomicrosoft
Soluciones como Microsoft Azure, Amazon Web Services,
http://www.solomicrosoft.com

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).

Como digo la forma simple de solucionar esto es crear un


proyecto de tipo Shared code y añadir estas dos clases:

#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:

Imagen 3.- Añadiendo un nuevo formulario a la App.


Imagen 4.- Aplicación resultante

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.

¿Qué nos ofrece azure task sche-


duler?
1.– Planificar la ejecución de tareas según sea desea- Imagen 1.- Creación scheduler en el portal.
do: periódicamente, una sola vez o durante un inter-
valo de tiempo. 3.– Los campos a rellenar son:
2.– Planificar tareas tanto que estén alojadas en Azu- • Nombre del Job.
re como fuera de Azure. • Seleccionar la subscripción.
3.– Configuración de reintento en el caso de que no • Seleccionar o crear la Job Collection a la que que-
se haya podido ejecutar la tarea. remos asociar el Job.
4.– Historial de ejecuciones donde se nos informa del • Configuramos el Job: Tipo de acción, autentica-
estado del Job, detalles de la ejecución, número de ción, política de reintentos y acción a realizar fren-
reintentos, periodicidad y hora de inicio y fin de la te al error.
ejecución. • Programamos el Job.
5.– Realizar acciones correctoras al suceder un error
y finalizar los reintentos.
6.– Cinco formas de ejecución: Http, Https, Sotrage
Api rest
Queues, Azure Service Bus Queues y Azure Service Es necesario realizar una llamada a la URL con PUT como
Bus Topics. HTTP Verb:
7.– Alta disponibilidad. https://management.azure.com/subscriptions/{subscriptio-
Azure task scheduler en detalle nId}/resourceGroups/{resourceGroupName}/providers/Mi-
crosoft.Scheduler/jobCollections/{jobCollectionName}/jobs/
{jobName}?api-version=2016-01-01
Ahora vamos a entrar en detalle de cómo podemos crear

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.

Una vez instalado podemos crear la Job Collection:

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                 }

services bus.              });

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.

Imagen 2.- Job con tipo de acción Http.

Utilizaremos este tipo de acción cuando nuestro proceso


puedas ser ejecutado a través de URL, como por ejemplo si
tenemos un Azure WebJob. Debemos seleccionar que tipo
de Http Verb utilizaremos, las opciones son:
• GET
• POST Imagen 3.- Política de reintentos.

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.

Ambas opciones se configuran de la misma forma que está


explicada en Http Action.

Services Bus queue Action

Imagen 4.- Job con tipo de acción Storage queue.

Utilizaremos este tipo de acción cuando nuestro proceso


esté alojado en un WorkerRole por ejemplo. Para poder
utilizar este tipo de acción primero debemos tener crea-
do un Azure Storage account y tener creada una queue en
este storage account.

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.

Después debemos introducir la configuración de la autenti-


cación para ello deberemos introducir dos campos:
• SAS key name: Nombre del Shared Acces Key que pre-
viamente habremos creado en nuestro Azure Service
Bus.
• SAS Key: Ser la Shared Acces Key generada.

Una vez definida la autenticación configuraremos que tipo


de transporte queremos, las opciones son:
• Net Messaging
• AMQP

El siguiente paso es definir las propiedades de Brokered


message, donde debemos definir:
• Content type: el content type del mensaje. Imagen 6.- Job con tipo de acción Service Bus topic
• Correlation Id: Identificador de correlación que nos
servirá para filtrar los mensajes en el proceso, de for- La configuración es igual que la opción de Service Bus
ma que procese de golpe todos los mensajes de una queue, excepto que en vez de poner el nombre de la queue
mismo Correlation Id. pondremos el path del topic que utilizaremos.
• Force persistence: Indica si el mensaje se debe guardar
¿Cuándo debemos utilizar un topic? A diferencia de Azure
en base de datos o en memoria. Disponemos de tres
Service Bus queue donde el mensaje solo es procesado por
opciones:
un subscriptor, en la opción topic el mensaje será procesa-
• True: Se guarda en base de datos. do por todos los subscriptores a este topic. Entonces está
• False: Mantenemos en memoria. opción la debemos usar cuando tengamos varios procesos,
• None: No aplica persistencia ninguna. ya sea en WorkerRole o en On-Premise que queremos que
se ejecuten todos al recibir un mensaje concreto.
• Label: Etiqueta de la aplicación.
• Message id: Identificador del mensaje que servirá para
detectar mensajes duplicados. Planificación del job
• Reply To: Define donde debe responder la aplicación Una vez introducido el nombre del Job, seleccionar la subs-
en caso de aplicar la comunicación dúplex. cripción al que queremos vincularlo, vincular el Job a un
• Reply to sesión Id: El identificador de la sesión que el Job Collection y selección el tipo de acción a realizar, solo
receptor debe marcar en el mensaje de respuesta para nos queda planificar el Job.
que el remitente pueda relacionarlo con una sesión
concreta. Azure Task Scheduler nos ofrece dos opciones de planifi-
• Session Id: Identificador de la sesión. cación:
• Tme to live: Tiempo de vida que tendrá el mensaje en • Once: Definimos el día, hora y UTC offset que quere-
la queue. Tiene dos opciones: mos que se ejecute. Solo se ejecutará una vez, la que
• None: No se define TTL. hayamos definido.
• Set: Se define el TTL en x segundos, minutos, horas • Recurring: Seleccionaremos esta opción cuando que-
o días. ramos ejecutar de forma periódica nuestro Job, para
ello es necesario definir los siguientes campos:
Acto seguido podemos añadir propiedades definidas por • Start: Fecha y hora de inicio.
nosotros al mensaje. • UTC ofsset: UTC en el que deseamos que se eje-
Una vez realizado todos estos pasos añadiremos el Messa- cute.
ge, que será el mensaje que se enviará en la queue. • End: Tennos tres opciones:
• End by: Seleccionamos fecha, hora y UTC de
Por último, tiene propiedades opcionales que son: finalización.
• Política de reintentos • Never: Se ejecutará infinitamente.
• Acción en caso de error • Ocurrences: Cuantas veces queremos que se
ejecute: 1,2,3…
• Recur every: Cuantas veces queremos que se
Ambas opciones se configuran de la misma forma que está
ejecute, aquí tenemos cinco opciones:
explicada en Http Action.

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.

Destacar que siempre que deseemos podemos lanzar el ROBERT BERMEJO


Job de forma manual y que sigue las especificaciones ISO- Arquitecto .Net
8601 también en las fechas. bermejoblasco@live.com
@robertbemejo
Alta disponibilidad www.robertbermejo.com

Para finalizar, Azure Task Scheduler proporciona alta dis-

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).

El componente Power BI Web, tal como lo dice su nombre


es un componente accesible desde cualquier browser [1].
Este componente está orientado a la generación de Das-
hboards y reportes a través de la utilización de Servicios
pre-establecidos a distintos orígenes de datos.

Imagen 1.- Power BI Web.

Dentro de estos orígenes se destacan los servicios para


GitHub, Google Analytics, Azure, etc.
Imagen 3.- Conexiones de datos.

Debido a estas características, se detallará a continuación


la interconexión de datos a través de Power BI Desktop.

Power BI ofrece múltiples servicios de cone-


xión a diversos orígenes de datos

Imagen 2.- Orígenes de datos en Power BI. Conexión a SQL


Al estar orientado a los servicios, este componente no La conexión a una base de datos On Premises de SQL Ser-
ofrece soporte para la conexión a orígenes On Premises, ver [2], consiste en tres simples pasos. El primero es elegir
aunque si permite (una vez creado los reportes en Power el origen de datos, el cual podemos establecer a través de
BI Desktop) realizar modificaciones sobre los reportes y es- la opción Get Data-> SQL Server Database.

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…

Imagen 7.- Parámetros de conexión a la BD.

… o a través de autenticación directa sobre la base de da-


Imagen 4.- Selección del origen de tipo SQL Server Database.
tos.
En el segundo paso debemos especificar la IP o HostName
del servidor de la Base de Datos y el nombre de la misma.
También se deberá especificar si la importación de datos
se realizará de forma Directa (DirectQuery), es decir, live
streaming de datos o se creará una importación de los da-
tos (Import) al momento de creación y cada vez que se re-
fresque el reporte.

Imagen 7.- Conexión con usuario de BD.

Al completar los datos de ingreso, si los mismos son co-


rrectos, tendremos una pre-visualización de los datos de la
base y sus estructuras.

Conexión a Oracle
Imagen 5.- Parámetros de conexión a la BD de SQL Server.

De forma opcional, podemos realizar una consulta a la


base de forma de traer la información necesaria de una Para realizar la conexión con una base de datos Oracle es
manera ordenada y ya procesada. Esto lo podremos reali- necesario realizar ciertos pasos previos, debido a que se
zar utilizando la opción Advanced options y especificando necesitan configuraciones específicas para poder estable-
la consulta en el cuadro de texto. cer la conexión.

Como primer paso debemos descargar e instalar el Java


Client[2], para ello debemos determinar que versión de
Power BI tenemos instalada, si de 64 o 32 bits. Esto lo po-
demos obtener ingresando en Power BI Desktop, y dentro
de la opción File -> Help -> About

Imagen 8.- Versión de Power BI instalada.

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

Para realizar la conexión con una base de


datos Oracle es necesario realizar ciertos
pasos previos

Al finalizar la configuración, estaremos en condiciones de


realizar la conexión a la base de datos desde Power BI Des-
ktop. Para ello debemos dirigirnos a Get Data-> Oracle Da-
Imagen 11.- Opciones avanzadas de conexión a Oracle.
tabase

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

Imagen 9.- Selección del origen Oracle Database.

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.

tenemos un servicio nuevo en Azure que


nos permite clasificar, proteger y monitori- Imagen 1.- Descripción del servicio de Azure IP.

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.

La protección, la monitorización y las respuestas son fun-


cionalidades que ofrecía y ofrece Azure Rights Manage-
ment, mientras que la clasificación y etiquetado son carac-
terísticas nuevas que se agregan a este servicio.

Azure IP permite proteger el documento en origen, por


parte del usuario o por mecanismos de clasificación auto-
mática, lo que permite mantener en todo momento el con-
trol de la clasificación del documento por parte del usua-
rio, mientras que DLP aplica las políticas de protección en
el momento del transporte, envío de un email o guardado
del documento en una biblioteca de SharePoint, sin control
por parte del usuario. La conjunción de estas dos técnicas Imagen 2.- Configuración de Azure IP por defecto.
permitirá mejorar la seguridad de la información en nues-
tra organización.

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.

Para usar el cliente de Azure IP, tenemos que instalar un


complemento que se encuentra en la página de descar-
ga https://www.microsoft.com/en-us/download/details.
aspx?id=53018.

Imagen 3.- Propiedades de una etiqueta.


Con este complemento instalado, un usuario podrá clasi-
ficar la información de sus documentos en Office etique-
tando los mismos con la clasificación necesaria o editando
aquellos documentos que se hayan autoclasificado por al-
un usuario podrá clasificar la información guna regla establecida en el servicio en Azure.
de sus documentos en Office

Además de la marca visual y las condiciones de etiquetado


automático.

Imagen 6.- Panel de clasificación de un documento.

Por último, desde el portal de RMS vamos a poder hacer el


seguimiento y monitorización de los documentos, además
de poder revocar el acceso de los documentos si encontra-
mos algún problema de seguridad.

Imagen 4.- Continuación de las propiedades de una etiqueta.

Para las condiciones podemos usar reglas estándares, por


ejemplo, tarjeta de crédito, o reglas personalizadas basa-
das en ocurrencias de texto o expresiones regulares. Imagen 7.- Panel de monitorización de un documento compartido.

48
Conclusiones aplicables a las empresas.

Azure IP es más que un servicio nuevo de la nube de Micro-


soft ya que complementa o actualiza las funcionalidades ALBERTO DIAZ MARTIN
del actual Azure RMS buscando mejorar la experiencia de MVP Office Servers & Services
los usuarios a la hora de clasificar la información y comple- adiazcan@hotmail.com
mentando las funcionalidades de DLP de Office 365, todo @adiazcan
esto para ayudar a evitar fugas de información en las or- http://blogs.encamina.com/negocios-sharepoint/
ganizaciones o a cumplir las políticas o leyes de los países http://geeks.ms/blogs/adiazmartin

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.

Imagen 2.- Nuevo aspecto de Listas de SPO.

Imagen 1.- PopUp con el resumen de funcionalidades de la nueva experiencia de 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):

• La integración con Flow permite automatizar tareas


cuando se produce un suceso en una Lista (por ejem-
plo, se crea un elemento en la Lista) como puede ser
crear información en otra Lista de otro sitio de SPO
o en un sistema diferente como Microsoft Dynamics
CRM Online, Salesforce o Project Online. Aunque en el
momento de redacción de este artículo, Flow permite
crear Flujos únicamente de tipo secuencial y no dispo-
ne de todas las posibilidades que SharePoint Designer
Imagen 3.- Barra de acciones y panel de detalle para un elemento.
2013 (SPD 2013) provee para crear Flujos de Trabajo
en Listas y Sitios de SPO, a futuro irá mejorando y per-
• Una vez que hemos creado una Lista, podemos exten- mitiendo crear Flujos de Trabajo más complejos y que
derla rápidamente desde la vista por defecto añadien- permitan dar respuesta a la necesidad de modelar pro-
do nuevas columnas o bien cambiando la configura- cesos de negocio en Listas y Bibliotecas de Documen-
ción de las columnas a mostrar o no en la vista: tos de SPO.

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.

Imagen 6.- Integración de Microsoft Flow en Listas de SPO.

Cuando se hace clic en la opción “Flujo” de la ba-


rra de acciones de una Lista, se abre un panel en Imagen 9.- Acceso a la configuración de la lista.

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.

• La integración con PowerApps permite crear rápida-


mente aplicaciones de negocio listas para ser utiliza- Imagen 10.- Opciones de configuración de “Experiencia de lista” en “Configuración
avanzada”.
das en cualquier dispositivo sin necesidad de escribir
código. Al igual que sucede con Microsoft Flow, Powe- • A nivel de tenant de SPO, se puede configurar de for-
rApps permite conectar los datos de la Lista con datos ma global la experiencia de usuario tanto para Listas,
de otras fuentes de datos ya sean OnPremises o cloud como para Bibliotecas de Documentos, la página de
como Exchange, Dynamics CRM, Salesforece, Google, Contenidos del sitio y la Papelera de reciclaje. Las op-
etc. ciones de configuración globales están disponibles en
la página de “configuración” disponible en la adminis-
tración del tenant de SPO:

Imagen 11.- Configuración de la nueva experiencia de Lista y Bibliotecas de Documen-


tos a nivel de tenant de SPO.

• Finalmente, la nueva experiencia puede ser habilitada/


deshabilitada también de forma global a nivel de te-
Imagen 8.- Diseñador Web de PowerApps. nant de SPO haciendo uso de PowerShell tal y como
se detalla en el siguiente artículo de soporte: https://
Opciones de Administración de la support.office.com/en-us/article/Switch-the-default-expe-
rience-for-lists-or-document-libraries-from-new-or-classic-
nueva experiencia de usuario en 66dac24b-4177-4775-bf50-3d267318caa9
Listas de SPO
Lo que falta (o parece que falta) en la nueva experiencia de
Al igual que sucede con la nueva experiencia de usuario en
usuario de Listas
Bibliotecas de Documentos en SPO, en la página de Con-
tenidos del Sitio y en la Papelera de Reciclaje, disponemos Al igual que sucede con las Bibliotecas de Documentos, la
de distintas posibilidades para habilitar o no la nueva expe- nueva experiencia de usuario de Listas desplegada por Mi-
riencia de usuario de Listas: crosoft en tenants con First Release configurado se trata
de una versión preliminar de la experiencia que tendremos

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/

JUAN CARLOS GONZÁLEZ MARTÍN


Office Servers and Services MVP
Cloud & Productivity Advisor en MVP CLUSTER
jcgonzalezmartin1978@hotmail.com
@jcgm1978 | https://jcgonzalezmartin.wordpress.com/

Imagen 12.- Ejemplo de agrupación en una Lista de SPO.

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.

Este podría ser un ejemplo sencillo de flujo de Gestión de


la Demanda con Nintex:

Imagen 1.- Opción para asociar/crear un flujo de Nintex para Project Server.

En el caso de un flujo de gestión de la demanda, las accio-


nes que tenemos disponibles son las siguientes:
• Cambiar un tipo de proyecto: no nativo con flujos de
SPD.
• Comparar una propiedad de un proyecto.
• Publicar un proyecto.
• Hacer una consulta a Project Server: no nativo con flu-
jos de SPD. Se utiliza la PSI. Imagen 3.- Ejemplo de flujo de gestión de la demanda con Nintex Workflow.

54
En la siguiente imagen podemos ver un ejemplo de flujo
Al habilitar Nintex Workflows en una colec- orientado a eventos con Nintex:

ción de sitios de Project Server aparece una


nueva opción en el apartado de configura-
ción

En este caso, se leen las propiedades del proyecto “Spon-


sor” y “Nombre de la propuesta” y se genera una tarea
para el Sponsor en la que debe decidir si aprueba o no el
presupuesto del proyecto. En caso negativo se rechaza el
proyecto y finaliza el flujo y, en caso afirmativo, se lee la
propiedad “Presupuesto estimado” y se copia en la propie-
dad “Presupuesto Aprobado”, continuando el flujo.

Flujos de Gestión asociados a


eventos con Nintex
Imagen 6.- Ejemplo de flujo orientado a eventos.

Una vez hemos terminado nuestro flujo todavía nos falta


Como hemos comentado con anterioridad, hasta Micro- asociarle un evento de Project Server que lo dispare. Para
soft Flow sólo Nintex ofrecía la posibilidad de sobre escribir crear una nueva asociación, lo primero que hay que indicar
los eventos de Project Server sin necesidad de desarrollos es el tipo de evento que dispara la ejecución del flujo. Para
con Visual Studio. Esto lo hace especialmente potente ya ello, se debe seleccionar el objeto de Project Server sobre
que nos permite modificar u obtener datos de Project Ser- el que se desea ejecutar el workflow (Proyecto, Recurso,
ver en respuesta a diferentes sucesos que suceden en el Calendario…):
sistema.

En este caso, en la “Ribbon” aparecen las siguientes op-


ciones, apareciendo los flujos y los eventos a los que se
asocian bien diferenciados:

Imagen 4.- Eventos para flujos de Nintex para Project Server.

En ambos casos podemos hacer básicamente las mismas


operaciones CRUD: crear, modificar y borrar tanto las ac-
Imagen 7.- Formulario de asociación de flujo de Nintex.
ciones como los flujos. Lo primero que habría que hacer
es crear un flujo para poder asociarlo a un evento. En este Una vez seleccionado el objeto, se despliegan los diferen-
caso, las acciones propias de Nintex para Project Server tes tipos de eventos correspondientes al mismo:
quedan bastante reducidas:
• Hacer una consulta a Project Server.
• Obtener información del evento: por ejemplo, si el
evento es el de publicación, el GUID del proyecto que
se publica.
• Actualizar propiedades del proyecto.

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.

Imagen 9.- Selección del flujo a lanzar. JOSE RAFAEL GARCÍA


josex1975@gmail.com
https://projectservernotes.com/
@jrgarcia1975

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”.

Las bases de datos relacionales son aquellas que almace-


nan información y la mantienen en estructuras cuadradas
tipo tabla. Las empresas que se mantienen líderes en este
ramo son:

Comerciales (SQL Server de Microsoft, Oracle DB de Ora-


Imagen 1.- DocumentDB.
cle) y Open Source (MySQL, PostgreSQL).

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?

Y bueno, la primera respuesta que podría ofrecer es: No


debemos de usar Redis a menos que lo necesites, eso de-
pende de la naturaleza de tu proyecto.

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.

El software puede estar escrito en cualquier Table Storage


lenguaje de programación
El servicio de Table Storage ofrece un almacenamiento no
relacional similar a una tabla de bases de datos relaciona-
les. Sin embargo, los registros de estas tablas no tienen
Azure Redis que tener el mismo número de columnas y tampoco nece-
El servicio de Redis ofrece un almacenamiento no relacio- sitan de campos clave para hacer relaciones. Una sola tabla
nal en memoria RAM, toda la información se va acumulan- de tipo Table Storage dependiendo la arquitectura que se
do en memoria volátil y no en disco duro. Las maneras en le dé, puede almacenar una o varias bases de datos simul-
que Redis almacena información son las siguientes: táneamente.
• Strings Table Storage no es una base de datos relacional, pero es
• Lists una alternativa al modelo de datos relacionales existente,
• Hashes estas son algunas de sus características:
• Redis Sets • Las tablas son independientes.
• Sorted Sets • No existen llaves foráneas o joins.
• Bitmaps • No existen índices personalizados.
• Hyperloglogs • Una consulta de datos, se puede extender a más de
• Geospatial Indexes un servidor, no limitándose a uno como normalmente
Una de las principales limitaciones de Redis (en sí mismo) existe en un modelo relacional.
es la memoria, ya que las estructuras de datos no pueden

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.

Hadoop es un framework que permite el procesamiento


de grandes volúmenes de datos a través de clusters. Su di-
seño permite empezar desde pocos hasta cientos de no-
Imagen 4.- Elementos que conforman una tabla. dos. Hadoop es un sistema distribuido con arquitectura
Maestro/Esclavo (Master/Slave), usando para almacenar
• Entidades: Puedes verlas como renglones o registros
información en su formato (HDFS) y algoritmos de tipo Ma-
en una tabla.
pReduce. Clic aquí para conocer más de HDInsight: http://
• Propiedades: Puedes verlas como las columnas de un
bit.ly/2aQ0TZ2
registro en una tabla. Siempre deben existir tres pro-
piedades clave:
• PartitionKey: Tipo string, no mayor a 1 KB, comprende
una ó varias entidades en una tabla.
• RowKey: Tipo string, no mayor a 1 KB, identifica de
manera única una entidad dentro de la partición de la Imagen 4.- HDInsight.
tabla.
• TimeStamp: Mantiene la hora en la que una entidad
fue insertada o actualizada en la tabla.
Conclusiones
• Particiones: Es una colección de entidades en una ta- Como te podrás dar cuenta, los medios de almacenamien-
bla que tienen el mismo PartitionKey. to son muy diversos. Dependiendo de las necesidades y
objetivos de nuestros proyectos deberemos elegir la mejor
alternativa.
El servicio de Table Storage ofrece un al- Espero que este artículo te sea de utilidad y aprovecho
macenamiento no relacional similar a una para invitarte a seguirme por social media.

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.

Sitio Web: http://blogs.encamina.com/negocios-


sharepoint/
Email: adiazcan@hotmail.com
Blogs: http://geeks.ms/blogs/adiazmartin
Twitter: @adiazcan

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.

Sitio Web: http://www.siderysbsn.com


Email: fabiani@siderys.com.uy
Blogs: http://blog.siderys.com
Twitter: @fabianimaz

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.

Sitio Web: http://www.gavd.net


Email: gustavo@gavd.net
Blogs: http://geeks.ms/blogs/gvelez/

Juan Carlos González


Martín
Ingeniero de Telecomunicaciones por la Universidad de Valladolid
y Diplomado en Ciencias Empresariales por la Universidad Oberta
de Catalunya (UOC). Cuenta con más de 12 años de experiencia
en tecnologías y plataformas de Microsoft diversas (SQL Server,
Visual Studio, .NET Framework, etc.), aunque su trabajo diario gira
en torno a las plataformas SharePoint & Office 365. Juan Carlos
es MVP de Office Servers & Services y co-fundador del Grupo de
Usuarios de SharePoint de España (SUGES, www.suges.es), del
Grupo de Usuarios de Cloud Computing de España (CLOUDES)
y de la Comunidad de Office 365. Hasta la fecha, ha publicado 9
libros sobre SharePoint & Office 365, así como varios artículos en
castellano y en inglés sobre ambas plataformas.

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.

Envíe sus proposiciones, artículos, ideas y comentarios a la siguiente dirección:


revista@compartimoss.com adiazcan@hotmail.com
fabiani@siderys.com.uy jcgonzalezmartin1978@hotmail.com
gustavo@gavd.net

62
63

También podría gustarte