lunes, 20 de febrero de 2017

Una web más inteligente



Comunicación asincrónica
  • Piensen un segundo en dos personas que están una al lado de la otra, hablando el mismo idioma, y respondiéndose a medida que la otra pregunta, en tiempo real. Por otro lado, imagínense hace cientos de años, a una persona enviando una carta a otra que vive a cientos o miles de kilómetros de distancia.
  • En el primero de los casos, como ambas personas están en simultáneo entablando conversación, se mantienen en un mismo tiempo embarcadas en la misma tarea de comunicación. Mientras que en el segundo de los casos, la primer persona escribe la carta, la envía, y continúa con su vida. La segunda persona, tiempo después, recibirá la correspondencia e interrumpirá sus tareas en algún momento para responder y continuar con la comunicación.
  • El segundo de los casos, es lo que se denomina comunicación asincrónica, en la cual las dos partes se comunican de manera diferida en el tiempo, es decir, cuando no están conectadas al mismo tiempo. Esto es lo que ocurre con el correo electrónico o con los foros, donde alguien deja una comunicación y luego algún otro usuario contesta al mensaje.
  • En la computación, la comunicación asincrónica o no bloqueante es una forma de procesamiento que permite seguir ejecutando programas antes de que la transmisión y recepción de las respuestas hayan terminado.
  • El envío de información entre dos subsistemas es mucho mas lento que el procesamiento de datos dentro de un mismo sistema. Por ello, si nosotros nos quedamos esperando a que una comunicación se finalice antes de continuar con el resto de nuestro programa, probablemente estemos dejando muchos recursos de la computadora sin uso. Por eso es que usamos la comunicación asincrónica, donde solo quedan bloqueados los procesos que requieren de que se complete la comunicación, mientras que el resto del procesamiento sigue su curso.
Mejorando interfaces asicrónicamente
  • Una de las cosas mas interesantes que podemos hacer cuando programamos de manera asincrónica, es ir partiendo nuestras interfaces en pequeñas partes que, gracias al tipo de programación que estamos aprendiendo, pueden ir actualizándose sin necesidad de recargar toda la página.
  • Por ejemplo, si ustedes entran en Outlook.coma chequear sus correos electrónicos, y seleccionan alguno de los correos de la columna izquierda, verán que no se recarga toda la página para mostrarles el contenido del mismo. Años atrás, cuando las tecnologías que usaremos no estaban desarrolladas, constantemente las interfaces se refrescaban completamente, haciendo que nosotros nos cansemos porque también la velocidad de conexión a internet era mas baja. Hoy día, no solo las velocidades son mas altas sino que también lo que se refresca (y por ende la información que se descarga) son solo partes parciales de la pantalla, haciendo nuestra experiencia mas amigable.
AJAX (o AJAJ)
  • En la actualidad, las aplicaciones Web pueden enviar datos a, y recuperar datos de, un servidor de forma asincrónica (en segundo plano) sin interferir con la visualización y el comportamiento de la página existente. Los datos pueden ser recuperados mediante un tipo de dato que se llama XMLHttpRequesty que iremos viendo. A pesar del nombre, no se requiere el uso de XML, que es un lenguaje utilizado principalmente para la transmisión de información, sino que JSONse utiliza a menudo en lugar (otro tipo de lenguaje para comunicación), y no siempre las comunicaciones son 100% asincrónicas.
  • Para realizar este tipo de comunicaciones en la web, que actualice partes de las interfaces se suele utilizar Ajax(o AJAJen el caso de utilizar JSON), que no es una sola tecnología, sino un grupo de tecnologías. HTML y CSS pueden usarse en combinación para armar las interfaces y darle diseño. El DOM(que es la información que corresponde a como está armada la interfaz HTML) se accede con JavaScript para modificarla dinámicamente, y permitir al usuario interactuar con la información presentada. JavaScript y el objeto XMLHttpRequestproporcionan un método para el intercambio de datos de forma asíncrona entre el navegador y el servidor para evitar cargas de una página completa.
El DOM
  • Fui muy rápido? El DOM es un convención estándar que me permite representar e interactuar con elementos del HTML, XML u otros lenguajes. El DOM me permite que si en un HTML tengo un título con el tagH1, podré eventualmente, accederlo mientras estoy ejecutando mi sistema, y modificarlo como necesite. De esa manera, cuando en mi interfaz recibo una interacción del usuario, mediante AJAX o AJAJ, envío información al servidor, y continúo mostrando mi interfaz inalterada. Cuando recibo la respuesta a mi comunicación, accedo al DOM y le pido que modifique la parte del HTML que necesito alterar. Por ejemplo, en el caso de nuestro correo, le pido al servidor que me envíe información correspondiente al mail que seleccioné en la columna de la izquierda y mi interfaz se mantiene inalterada hasta que me devuelven el contenido del correo y actualizo solamente la sección de la derecha donde se muestran los correos.
Ejemplo básico

<!DOCTYPE html>
<html><head>
<script>
functionshowHint(str)
varxmlhttp;
if(str.length==0)
{
document.getElementById("txtHint").innerHTML="";
return;
}
xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function()
{
if(xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","gethint.asp?q="+str,true);
xmlhttp.send();
}
</script></head>
<body>
<h3>Comience a tipearun nombre</h3>
<formaction=""> Nombre: <input type="text" id="txt1" onkeyup="showHint(this.value)" /></form>
<p>Sugerencia: <spanid="txtHint"></span></p>
</body></html>
  • Cada vez que el usuario presiona una tecla, entonces, se llamará a la función de JavascriptshowHint, incluyendo el valor tipeado, para que la misma lo envíe a la página gethint.asp, de manera de obtener una sugerencia de nombre en caso de que lo tenga. Siempre que la longitud de la cadena que se encuentra en el campo de ingreso de texto txt1 sea mayor a 0, se enviará la información para su evaluación.
  • El contenido del archivo gethint.asp es el siguiente:
getHint.asp

<%response.expires=-1
dim
a(30)a(1)="Ana"
a(2)="Bernarda"
a(3)="Clara"
a(4)="Diana"
a(5)="Eva"
a(6)="Fiona"
a(7)="Gabriela"
a(8)="Helena"
a(9)="Ingrid"
a(10)="Johana"
a(11)="Karen"
a(12)="Lisa"
a(13)="Nina"
a(14)="Oriana"
a(15)="Paula"
a(16)="Amanda"
a(17)="Raquel"
a(18)="Cinthia"
a(19)="Doris"
a(20)="Inti"
a(21)="Elisa"
a(22)="Dora"
a(23)="Solange"
a(24)="Yanina"
a(25)="Violeta"
a(26)="Sabrina"
a(27)="Elizabeth"
a(28)="Hilda"
a(29)="Marta"
a(30)="Eugenia"

'recibir el parámetro que me enviaron desde el HTMLq=ucase(request.querystring("q"))
'buscar las sugerencias siempre que la longitud de q>0

if len(q)>0 then 
hint=""
for i=1 to 30 
if q=ucase(mid(a(i),1,len(q))) then
if hint="" then
hint=a(i)
else
hint=hint & " , " & a(i)
end if
end if
next
end if
Retornar "sin sugerencia" si no se encuentran coincidencias'o retornar el valor encontrado
if hint="" then
response.write("sin sugerencias")
else
response.write(hint)
end if
%>

AJAX con archivo remoto
  • En el ejemplo anterior, simplemente hicimos un llamado asincrónico a un archivo ASP que nos devolvió un dato a mostrar. En vez de ello, podríamos requerirle a una aplicación remota un archivo en formato XML o JSON con una variedad de datos y luego interpretarlos y mostrarlos en nuestro programa. Eso es por ejemplo lo que hacen las aplicaciones de nuestras computadoras que nos muestran el clima. Se conectan a páginas como accuweather.comy nos traen archivos XML o JSON. Simplemente reemplazamos la función showHinten nuestro HTML original por otra que podamos llamar y que se ocupe de traer la información. Por ejemplo:

  • Esta función recibirá como parámetro la dirección de donde debe ir a buscar el archivo XML, y luego recorrerá el archivo XML y armará una tabla en nuestra interfaz gráfica con toda la información recuperada.
XML
  • Hemos estado mostrando como mediante AJAX (que significa AsynchronousJavascriptand XML) podemos actualizar partes de mi interfaz de usuario, sin necesidad de bloquear los otros procesos. Esto lo hicimos mediante XML, aunque mencionamos que también existe un lenguaje para la comunicación llamado JSON. Pero qué son estos dos lenguajes que mencionamos?
  • XML, al igual que HTML, es un lenguaje de marcas que define un conjunto de reglas para la codificación de documentos en un formato que es a la vez legible y legible por máquina. Los objetivos del diseño de XML hacen hincapié en la simplicidad, generalidad, y la facilidad de uso a través de Internet.
  • Un archivo XML posee un ecabezadode la siguiente forma
<?xmlversion="1.0" encoding="UTF-8"?>
  • Y luego, se compone de una estructura que permite anidaciones, donde siempre tenemos un tago marca de apertura y uno de cierre de la siguiente forma:
<persona>
<nombre>John</nombre>
<apellido>Doe</apellido>
<documento>23456789</documento>
<auto>
<marca>Ford</marca>
<modelo>Escort</modelo>
<fabricado>2006</fabricado>
</auto>
</persona>
  • XML es tan sencillo como lo que acabamos de ver, y en las comunicaciones entre subsistemas, se documenta cual será el formato del archivo, y en nuestra aplicación simplemente tendremos que contemplar que la información que intentemos leer sea la que el otro sistema nos esté proveyendo.
JSON
  • JSON por otro lado, que significa JavascriptObjectNotation, también es un estándar abierto que permite transmitir pares de datos que contienen el nombre del atributo y el valor que corresponde.
  • Para transmitir a través de un archivo .jsonlos datos correspondientes a una persona, escribiríamos algo del siguiente tipo:
{
"nombre": "John",
"apellido": "Doe",
"edad": 25,
"altura_cm": 167.64,
"direccion": {
"calle": "21 2nd Street",
"ciudad": "New York",
"estado": "NY",
"codigoPostal": "10021-3100"
},
"telefono": [
{ "tipo": "casa", "numero": "212 555-1234" },
{ "tipo": "fax", "numero": "646 555-4567" }
]
}
  • Y luego, para leer el dato, simplemente usaremos funciones provistas por librerías de Javascriptdel tipo:
varp = JSON.parse(contact);

AJAJ
  • El siguiente código de JavaScript es sólo un ejemplo de un cliente que utiliza XMLHttpRequestpara solicitar datos en formato JSON desde un servidor. (La programación del lado del servidor la omitimos, pero asumimos que debe ser configurado para solicitudes de servicio a la urlque contiene una cadena con formato JSON.)
varmy_JSON_object;
varhttp_request= new XMLHttpRequest();
http_request.open("GET", url, true);
http_request.onreadystatechange= function() {
vardone = 4, ok = 200;
if(http_request.readyState=== done && http_request.status=== ok) {
my_JSON_object= JSON.parse('''http_request.responseText''');
}
};
http_request.send(null);
  • El objeto XMLHTTPRequestes simplemente un tipo de datos que permite hacer pedidos a un servidor vía internet (y recibir las respuestas) de objetos de comunicación que pueden ser XML, JSON, HTML, archivos de texto u otras variedades.
Procesos batch
  • El procesamiento batches la ejecución de una serie de programas ("trabajos") en una computadora sin intervención manual.
  • Los trabajos se establecerán de tal modo que se pueden ejecutar hasta el final sin interacción humana. Todos los parámetros de entrada están predefinidos por los scripts o programas que desarrollamos, información que les enviamos al comienzo de ejecución, archivos o el propio lenguaje de control de trabajos.
  • De esa manera, podríamos tener un programa en el servidor calculando constantemente cual será el clima de la próxima semana, escuchando en un puerto del servidor por pedidos por parte de las computadoras de los usuarios que necesitan la información y enviándola mediante XML o JSON para que sea consumida correctamente. Estos procesos no se encuentran controlados directamente por ningún usuario mediante una interfaz de usuario, sino que una vez que se ponen en ejecución, simplemente harán su trabajo hasta que lo terminen o sean interrumpidos.
  • Existen distintas formas de realizar un proceso batch. Algunos consisten en simplemente generar un programa y luego decirle al sistema operativo que el mismo es una tarea que debe ejecutar cada cierto tiempo, o en determinados momentos.
  • Otra forma es hacerlo mediante nuestro programa, como parte del mismo, ejecutándose mientras nosotros continuamos con otras tareas. Para ello, los pasos en ASP.NET son como sigue:
    • Añadir un elemento a la HttpRuntime.Cachecon un vencimiento fijo, al comienzo de nuestro código.
    • Cuando expire la caché, hacer el trabajo, como WebRequesto lo que sea.
    • Volver a añadir el elemento a la caché con un vencimiento fijo.
Proceso batch-ejemplo


  • Este código corre cada 60 segundos, ejecutando nuestras tareas. Sin embargo quizás no sea la mejor de las opciones debido a la utilización poco óptima de los recursos, en particular de la memoria caché (una de las memorias de la computadora).
  • Existen diversas soluciones que exceden al alcance del presente curso, pero que recomendamos su investigación.
  • http://msdn.microsoft.com/en-us/magazine/cc163854.aspx

Espero haber ayudado en algo. Hasta la próxima oportunidad!











  

No hay comentarios:

Publicar un comentario

       

Etiquetas

Accediendo a datos con ADO .NET (31) Acceso a la red (30) Algoritmo (34) Algoritmos en JAVA (2) Ampliación de clases (2) APRENDA A PROGRAMAR COMO SI ESTUVIERA EN PRIMERO - Autores : IKER AGUINAGA (3) APRENDA A PROGRAMAR COMO SI ESTUVIERA EN PRIMERO - Autores : IKER AGUINAGA (10) Aprendiendo a desarrollar en Windows 8 (5) Aprendiendo UML en 24 Horas (Autor : Joseph Schmuller ) (30) Arquitectura (29) Arquitectura del Computador (3) Arquitectura del Computador - Historia de la informática (1) Asignación de direcciones IP (23) Aspectos fundamentales de bases de datos (5) Auditoría de la dirección (2) Auditoría de Sistemas (3) Auditoría Informática - Un enfoque práctico - Mario G . Piattini y Emilio del Peso (7) Avanzado (23) Base de Datos (67) Básico (23) Bios (29) Business Productivity Online Suite - BPOS (3) Capa de Red (22) Capa de Transporte (16) Capítulo 1 - Documentos HTML5 (6) Capítulo 10. API Web Storage (2) Capítulo 11. API IndexedDB (4) Capítulo 12. API File (1) Capítulo 2. Estilos CSS y modelos de caja (7) Capítulo 3. Propiedades CSS3 (4) Capítulo 4. Javascript (6) Capítulo 5. Video y audio (6) Capítulo 6. Formularios y API Forms (8) Capítulo 7. API Canvas (5) Capítulo 8. API Drag and Drop (2) Capítulo 9. API Geolocation (2) CCNA1 v5.0 (239) CCNA1 v6.0 (23) CCNA2 v5.0 (26) CCNA3 v5.0 (25) CCNA4 v5.0 (23) CD-ROM (3) Chapter 1 How does Xamarin.Forms fit in? (7) Chapter 2 Anatomy of an app (5) Cisco (341) Cloud Computing (3) CNNA v5.0 Routing & Switching (260) CNNA v6.0 Routing & Switching (2) Codigo (2) Computadora (32) Configuración (29) Configuración de un sistema operativo de red (21) Control (29) Creación de tipos de datos y tablas (3) Creación y Administración de bases de datos (3) Creando la Interface de la Aplicación Windows (50) Creating Mobile Apps with Xamarin.Forms (13) Cuenta (29) Curso (32) Curso Aprendiendo a Programar (25) Datos (3) Desarrollando en Windows 8 - AVANZADO (2) Desarrollando en Windows 8 - BÁSICO (3) Desarrollando en Windows 8 - INTERMEDIO (2) Desarrollo (2) Desarrollo .Net (21) Desarrollo avanzado de Windows Store Apps usando C# (1) Desarrollo basado en conceptos de Ingeniería de Software para Visual Studio (2) DESARROLLO DE APLICACIONES WINDOWS CON MICROSOFT .NET (37) DESARROLLO DE APLICACIONES WINDOWS CON MICROSOFT .NET (Autor: Luis Dueñas Huaroto) (29) Desarrollo en Microsoft Visual Studio (44) Desarrollo en Microsoft Visual Studio - AVANZADO (15) Desarrollo en Microsoft Visual Studio - BÁSICO (14) Desarrollo en Microsoft Visual Studio - INTERMEDIO (18) Desarrollo en Windows Phone 8 (13) Diagnostico (4) Diagrama (3) Diagramas de actividades (2) Diagramas de colaboraciones (2) Diagramas de secuencias (2) Digital (2) Diplomado (2) Disco (29) Disco Duro (4) Diseño de aplicaciones de Windows 8 en HTML 5 (7) Dispositivos Electrónicos (11) Doctorado (2) Ejemplos de algoritmos (27) El camino hacia el CSS3 (3) El diseño web flexible (6) El elemento de diseño Canvas (3) El enfoque de los sistemas (3) El flujo de un programa (2) El gran libro de HTML5 - CSS3 y Javascript - Autor: Juan Diego Gauchat (55) El principio de organicidad (7) Electrónica (2) Elementos de un sistema (5) Empresas (2) Entrada y salida (4) Entropía y neguentropía (7) Estrategia (2) Estructura de un programa Java (12) Estructuras de almacenamiento (10) Estructuras de control (6) Estructuras de las tablas en SQL Server (2) Estructuras fundamentales de los datos (2) Ethernet (21) Evolución y Familias de los Microprocesadores (15) Exámen (23) Exploración de la red (23) Extensión de clases (4) Facebook (4) Familia Intel (15) Forefront (8) Función (3) Funciones de una red (12) Funciones de una red informática (1) Fundamentos de C# para absolutos principiantes (17) Fundamentos de programación en Java (50) Generaciones de la computadora (5) Gestión (3) Gestión de riesgos - Auditoría de Sistemas (1) GONZALO MARTÍNEZ (1) Grupos Facebook (1) Harvard (29) Historia de las computadoras (11) HTML5 y CSS3 - Autor: Christophe Aubry (99) HTML5 y CSS3 aplicadal texto (7) HTML5 y CSS3 para los formularios (15) Imágenes (2) Implementación de Windows 7 (11) Información (31) Informática (29) Ingeniería (4) Instalar (29) Inteligencia (2) Inteligencia de Negocios con SQL Server (3) Intermedio (23) Internet (29) Internet Explorer 9 (3) Introducción a ASP.NET 5 (8) Introducción a Java (7) Introducción a jQuery (8) Introducción a la Auditoría de Sistemas (2) Introducción a la teoría general de sistemas (Oscar Johansen Bertoglio) (39) Introducción a Networking (2) Introducción a Window Forms (5) Introducción al acceso a datos con ADO .NET (9) Investigación de Operaciones (12) Java (52) Jump Start de consultas en las bases de datos de Microsoft SQL Server 2012 (8) La definición de un Sistema (6) La evolución del HTML y del CSS (3) La nueva sintaxis HTML5 (12) LA QUINTA DISCIPLINA en la práctica (Autor : Peter Senge) (28) Las animaciones en CSS3 (5) Las transformaciones CSS3 (11) Las transiciones con CSS3 (8) Licenciamiento Microsoft (3) Local Area Network (LAN) - Red de Area Local (2) Lógico (2) Los elementos de la estructura en html5 (9) Los elementos multimedia: audio y vídeo (2) Los estilos de caja en CSS3 (13) Los nuevos selectores de CSS3 (6) Maestría (2) Mantenimiento de Mouse y Teclado (2) Manual de Microsoft SQL Server - Full Transact SQL (68) Manual de soporte técnico para escuelas sobre windows 7 (42) Marco Teorico de Investigación de Operaciones (6) Medios de Almacenamiento (11) Medios de Networking (2) Mejorando la Interface de las Aplicaciones Windows (26) Memoria Tipos y Clases (5) Método (2) Metodología (1) Microsoft (324) Microsoft Lync 2010 (7) Microsoft Silverlight 4.0 (2) Microsoft Virtual Academy (356) Modelo (2) Modelo OSI y TCP-IP (2) Modelos con poco grado de dificultad de Programación Lineal - Investigación de Operaciones (13) Modelos con razonable grado de dificultad de Programación Lineal - Investigación de Operaciones (10) Modelos de desafio de Programación Lineal - Investigación de Operaciones (5) Modelos difíciles de Programación Lineal - Investigación de Operaciones (5) Modelos Fáciles de Programación Lineal - Investigación de Operaciones (13) Modelos lineales con solver (3) Modulo (23) Movimiento (2) Mozilla (29) MS SQL Server (77) MS Virtualization para Profesionales VMware - Gestión (3) MS Virtualization para Profesionales VMware- Plataforma (4) MVA (263) Negocio (2) Nivel Avanzado Desarrollo .Net (6) Nivel Básico Desarrollo .Net (11) Nivel Intermedio Desarrollo .Net (8) Normas técnicas peruanas y su evolución - Auditoría de Sistemas (1) Nube Privada - Avanzado (6) Nube Privada - Básico (6) Nube Privada - Intermedio (6) Office 365 (3) Optimización de Escritorio (10) Optimización de Escritorio - Avanzado (4) Optimización de Escritorio - Básico (3) Optimización de Escritorio - Intermedio (3) ORACLE 10g - ADMINISTRACIÓN Y ANÁLISIS (3) Oracle 10g y el Grid Computing (3) Organización aleatoria y secuencial (1) Partes principales de la Mainboard (12) Perceptron (2) Perfil (2) Periféricos de Entrada / Salida (15) Pesi (2) PHP y MySQL - Manual de aprendizaje para crear un sitio web - Autor : Olivier ROLLET (79) Plan (2) Plataforma (29) PMBOK (24) PMBOK - Guía de los fundamentos para la dirección de proyectos (24) PMBOK - INFLUENCIA DE LA ORGANIZACIÓN Y CICLO DE VIDA DEL PROYECTO (6) PMBOK - Introducción (11) PMBOK - PROCESOS DE LA DIRECCIÓN DE PROYECTOS (5) Prevención - Herramientas e Instrumentos de Medida (9) Principios básicos de enrutamiento y switching (213) Proceso (2) Proceso de auditoría de sistemas informáticos (2) Programación en Android - Auor : Salvador Gómez Oliver (46) Programación paso a paso de C# - Autor : Nacho Cabanes (16) Protocolos y comunicaciones de red (17) Proyecto (2) Qué es un sistema (4) Red de Área Local Inalámbrica (WLAN) (4) Redes (30) Redes inalámbricas - WIRELESS - Conocimiento general (15) Redes neuronales (2) Redes y Comunicaciones (45) Reparación de Fuentes - UPS - Estabilizadores (10) Reparación de Impresoras (9) Reparación de Monitores (16) Router (29) Seguridad en la Nube (3) Seminario (23) Server (24) Sharepoint 2010 - Nivel Básico (6) Sharepoint 2010 - Niveles Avanzados (18) Sharepoint 2010 - Niveles Avanzados - Básico (8) Sharepoint 2010 - Niveles Avanzados - Intermedio (9) Sinergia y recursividad (4) Sistema (33) Sistema de Cableado Estructurado (9) Software (30) SOLUCIÓN GRÁFICA DE MODELOS DE PROGRAMACIÓN LINEALES - INVOPE (8) Soporte a Infraestructura (3) SQL (38) SQL Azure - Introducción (3) Subsistemas de control (4) Tablas (4) Tarjeta Principal del Sistema (10) Tarjetas de Interfaces (7) Tecnología (31) Tecnologías LAN (1) TEORÍA GENERAL DE SISTEMAS (1) Tic (2) Tipo (2) TML5 y CSS3 - Autor: Christophe Aubry (12) Trabajando con el Formulario (7) Un diseño HTML5/CSS3: dConstruct 2011 (3) Un diseño HTML5/CSS3: FlipThru (2) Un diseño HTML5/CSS3: The Cat Template (2) Usando Controles Windows Forms (12) Usando Herramientas de Datos de Visual Studio (6) Ventas (2) Virtualización Hyper - V Nivel Básico (5) Virtualización Hyper - V Nivel Intermedio (5) What’s New in Windows 8.1 Security (4) Window (29) Windows 7 Segunda Fase - AVANZADO (4) Windows 7 Segunda Fase - BÁSICO (6) Windows 7 Segunda Fase - INTERMEDIO (4) Windows 8 - Vista Previa (4) Windows 8.1 To Go (2) Windows Azure (3) Windows Phone 7 (2) Windows Server 2008 R2 (3) Windows Server 2012 - Gestión y Automatización (3) Windows Server 2012 R2 Essentials (7) Windows Server 2012: Almacenamiento (5) Windows Server 2012: Identidad y Acceso (4) Windows Server 2012: Revisión Técnica (7) Xamarin (1)

Páginas vistas en total según Google