January 25, 2012

Variable not found

Introducción a SignalR (I): Conceptos básicos

Uau!!Una aplicación que mezcla internet, asincronía, y múltiples usuarios colaborando e interactuando al mismo tiempo siempre es merecedora de un “¡uau!”. Seguro que, al igual que un servidor, en algún momento os habéis quedado maravillados con la interactividad que presentan algunos sistemas web modernos, como Facebook, Google Docs, o muchos otros, en las que estamos recibiendo actualizaciones, prácticamente en tiempo real, sin necesidad de recargar la página.

Por ejemplo, en Google Docs, si estamos editando un documento online y otro usuario accede al mismo, podemos ver sobre la marcha que ha entrado, e incluso las modificaciones que va realizando sobre el documento. O algo más cotidiano, en un simple chat vía web van apareciendo los mensajes tecleados por nuestros compañeros de sala como por arte de magia. Ambos sistemas utilizan el mismo tipo de solución: el envío asíncrono de datos entre servidor y clientes en tiempo real.

En esta serie de artículos veremos cómo podemos implementar sorprendentes funcionalidades de este tipo utilizando SignalR, un framework open source desarrollado por gente del equipo de ASP.NET, que nos facilitará bastante la tarea.

¿Cómo puede el servidor enviar eventos al cliente de forma asíncrona?

Crear este tipo de sistemas usando herramientas convencionales nos puede causar algunos dolores de cabeza, principalmente porque los protocolos que sustentan la web están basados en un modelo cliente-servidor síncrono: uno o varios clientes realizan una conexión hacia el servidor y le transmiten una acción a realizar, éste la procesa y les retorna la respuesta, cerrándose la conexión de forma inmediata.

PollingA priori, no hay forma de que el servidor sea el que notifique a los clientes los cambios de estado (por ejemplo, la llegada en un chat de un mensaje procedente de otro usuario), salvo que éstos utilicen un mecanismo de polling, es decir, que estén continuamente estableciendo conexiones con el servidor para ver si hay algún nuevo evento a tener en cuenta.

Aunque válido en determinados escenarios, hay otros en los que se trata de una solución demasiado costosa, sobre todo cuando hay que gestionar un alto número de clientes conectados.

El ideal sería utilizar una conexión persistente, siempre abierta, entre cliente y servidor, que permitiría el envío y recepción de mensajes y eventos de forma bidireccional entre ambos. De esta forma, si el servidor tiene algo que enviar a sus clientes, simplemente tendría que transmitirlo por el canal que mantendría abierto con cada uno de ellos.

Conexión persistenteSin embargo, hasta ahora esto sólo se podía conseguir usando sockets, lo cual, en entorno web, requería la existencia de algún tipo de elemento activo sobre la página (Silverlight, Flash, o applets Java, por ejemplo) capaz de establecer este tipo de comunicaciones.

Afortunadamente, la W3C parece dispuesta a cambiar esta situación al introducir de forma nativa los famosos WebSockets, cuya definición se encuentra todavía en borrador. Esta nueva API permitirá abrir conexiones directas desde el navegador usando Javascript, por lo que podría ayudarnos bastante una vez su implementación sea universal en los agentes de usuario. De momento no es así, aunque ya está disponible en algunos de ellos (podéis ver una demo simple aquí con Chrome).
Logo de HTML5
También existe otra iniciativa de la W3C que podría ayudar a enviar mensajes o eventos desde el servidor a los clientes suscritos, llamada Server-Sent Events. Como en el caso anterior, se encuentra en borrador, aunque ya algunos navegadores lo implementan (podéis ver una demo aquí con Chrome), por lo que todavía no podemos utilizarla de forma segura.

Por esta razón, existen hoy en día múltiples soluciones que permiten solventar las limitaciones del protocolo, como las englobadas bajo la denominación Server push o Comet, aprovechando los recursos existentes en los protocolos utilizados para crear, o al menos simular, este canal abierto continuo entre cliente y servidor utilizando polling, long polling, HTTP streaming, y otros artificios.

Long pollingPor ejemplo, el mecanismo long polling utiliza peticiones HTTP para crear una conexión “pseudopersistente”. El servidor, en lugar de procesar la petición y retornar la respuesta de forma inmediata, espera hasta que haya disponible algún evento o mensaje a enviar al cliente; en este momento, lo retorna como respuesta a la petición original y cierra la conexión. El cliente, por su parte, procesa esta respuesta y realiza inmediatamente después una nueva petición al servidor, que volverá a quedar abierta a la espera de mensajes, y así sucesivamente.

En definitiva, se trata de un mecanismo más limpio y eficiente que el polling, puesto que evita gran cantidad de peticiones absurdas que se producen cuando en el servidor no hay eventos pendientes de notificar. Además, dado que utiliza HTTP estándar, es válida para todo tipo de agentes de usuario, y bastante amigable para proxies, filtros, firewalls y otros inconvenientes que puede haber por el camino entre los dos extremos.

Y en este punto es donde entra en escena SignalR, un conjunto de componentes desarrollados por Damian Edwards y David Fowler, miembros del equipo de ASP.NET en Microsoft, que nos abstrae de los detalles subyacentes y nos ofrece la visión y ventajas de un entorno conectado en el que podemos comunicar cliente y servidor bidireccionalmente, de forma asíncrona, y con una sencillez pasmosa. SignalR nos hace ver como si cliente y servidor estuvieran conectados de forma continua y facilita el envío de mensajes asíncronos bidireccionales entre ambos extremos.

Por último, es importante decir que SignalR no es específico para ASP.NET MVC, ni para WebForms: podemos utilizarlo con cualquier tipo de proyecto web. De hecho, incluso se puede utilizar en otro tipo de proyectos usando un servidor self-hosted :-)

SignalR, conceptualmente

SignalR ofrece una visión a muy alto nivel de la comunicación entre el servidor y los múltiples clientes que se encuentren a él conectados. Y cuando digo “alto nivel”, creedme que estoy hablando de muchos metros de altura ;-)

Como desarrolladores, trabajaremos sobre una conexión virtualmente siempre abierta: en servidor podremos detectar cuándo se ha conectado un nuevo cliente, cuándo se ha desconectado, recibir mensajes de éstos, enviar mensajes a los clientes conectados…, en definitiva, todo lo que podemos necesitar para crear aplicaciones asíncronas multiusuario.

Sin embargo, en realidad estas conexiones persistentes no existen, o no tienen por qué existir. Se trata de una abstracción creada por SignalR, que el que se encargará del trabajo sucio que hay por debajo, manteniendo la conexión de los clientes con el servidor mediante distintos mecanismos denominados “transportes”, que son el conjunto de tecnologías utilizadas para mantener crear la conexión continua, o al menos la ilusión de su existencia.

Lo interesante de los protocolos de transporte es que pueden ser sustituidos de forma transparente sin afectar a nuestras aplicaciones, que trabajarán aisladas de estos detalles. Nuestros sistemas funcionarán exactamente igual sea cual sea el transporte utilizado, lo que permite que éste sea elegido en cada escenario en función de la disponibilidad de las tecnologías en ambos extremos.

Por ejemplo, el transporte Websockets es capaz de crear una conexión con el servidor y mantenerla abierta de forma continua, aunque requiere que esta tecnología esté disponible tanto en el cliente (en el caso de clientes web, es necesario que el navegador implemente Websockets) como en el servidor.

Long polling, el transporte utilizado por defecto en SignalRDebido a ello, y para asegurar la máxima compatibilidad con los clientes, actualmente se utiliza por defecto el transporte denominado Long polling, que ya hemos comentado anteriormente.

Observad que, a pesar de la relativa complejidad que supondría implementar algo así a mano, nosotros no tendremos que hacer nada: SignalR se encarga de llevar a cabo todas estas tareas para ofrecernos la sensación de estar siempre conectados.

Su componente cliente será el encargado de realizar las conexiones, mantenerse a la espera de noticias del servidor, reconectar cuando se reciban eventos o cuando por cualquier otra causa se haya perdido la conectividad, etc., ofreciéndonos una superficie de desarrollo muy simplificada.

El lado servidor de SignalR, por otra parte, será el encargado de recibir la conexión y mantenerla en espera, almacenar los mensajes recibidos, realizar el seguimiento de clientes conectados, enviar mensajes a través de un bus interno, etc., y de la misma forma, ofreciéndonos un API bastante simple para implementar nuestros servicios.

Implementación de servicios con SignalR

SignalR nos ofrece dos fórmulas para trabajar sobre las conexiones que crea con el servidor:
  • usando “conexiones persistentes”, es la de más bajo nivel y proporciona mecanismos simples para registrar conexiones y desconexiones de clientes y comunicarse de forma bidireccional con ellos. De hecho, esta forma de crear servicios es bastante similar a como hacemos utilizando sockets.
  • usando “hubs”, que ofrece una abstracción aún mayor, permitiendo la comunicación entre cliente y servidor de forma casi mágica. Esta es la opción que convendrá utilizar en la mayoría de ocasiones, por la potencia que aporta y su gran comodidad de uso.
En cualquiera de los dos casos, y ya centrándonos en el entorno web más habitual, donde el servidor es una aplicación ASP.NET y los clientes van a ser las páginas o vistas en las que tendremos un motor de scripting, la implementación de servicios consistirá en:
  • en el servidor, crear el servicio (también llamado endpoint) con las funcionalidades que nos interese, utilizando las clases disponibles en el ensamblado SignalR.
  • en cliente, crear el consumidor del servicio utilizando las clases disponibles en la biblioteca de scripts jQuery.SignalR.js (o su correspondiente versión minimizada).
Cada una de las dos fórmulas citadas tiene sus particularidades, por lo que las estudiaremos mediante el desarrollo de ejemplos independientes en futuros posts de la serie.

Pero primero, veamos rápidamente cómo podemos incluir este componente en nuestros proyectos, aunque desde luego más sencillo no puede ser… ;-)

Instalación de SignalR

El sitio web oficial del producto (signalr.net), a día de hoy, es una simple redirección hacia Github, donde se encuentra la documentación y el código fuente del proyecto. Aunque podríamos descargarlo desde ahí, la opción más sencilla, como siempre, es utilizar Nuget:

PM> Install-Package signalr
Attempting to resolve dependency 'SignalR.Server (≥ 0.3.5)'.
Attempting to resolve dependency 'Microsoft.Web.Infrastructure (≥ 1.0.0.0)'.
Attempting to resolve dependency 'SignalR.Js (≥ 0.3.5)'.
Attempting to resolve dependency 'jQuery (≥ 1.6)'.
Successfully installed 'Microsoft.Web.Infrastructure 1.0.0.0'.
Successfully installed 'SignalR.Server 0.3.5'.
Successfully installed 'SignalR.Js 0.3.5'.
Successfully installed 'SignalR 0.3.5'.
Successfully added 'Microsoft.Web.Infrastructure 1.0.0.0' to SignalRDemo.
Successfully added 'SignalR.Server 0.3.5' to SignalRDemo.
Successfully added 'SignalR.Js 0.3.5' to SignalRDemo.
Successfully added 'SignalR 0.3.5' to SignalRDemo.

Esta instalación incluye, además de algún elemento infraestructural, dos componentes de SignalR:
  • SignalR.Server, que es la biblioteca de servidor principal para integrar en aplicaciones ASP.NET. 
  • SignalR.Js, la biblioteca Javascript necesaria para conectar desde cliente (páginas web) con el servidor.
Existen también otros clientes específicos para .NET, como SignalR.Client (cliente genérico), SignalR.Client.Silverlight (específico para SL), o SignalR.Client.WP7 (específico para Windows Phone 7), que podemos instalar de forma independiente.

Además, tanto en Nuget como en el sitio web del producto podéis encontrar otros paquetes interesantes a los que vale la pena echar un vistazo, como SignalR.Sample, un ejemplo completo de uso de este componente, SignalR.SelfHost, que permite activar el servidor sin usar ASP.NET, o SignalR.Websockets, un adaptador (o transporte, en argot SignalR) para usar Websockets para el mantenimiento de la conexión entre cliente y servidor.

Observaréis que en todos los casos se trata de versiones muy preliminares pero que podemos ir probando y disfrutando desde ya, porque funcionan bastante bien. Podéis comprobarlo accediendo a http://jabbr.net/, un chat implementado sobre SignalR donde podréis encontrar charlando hasta a los mismísimos padres de la criatura. :-)

En el próximo post veremos cómo implementar clientes y servicios SignalR utilizando conexiones persistentes, el enfoque de menor nivel ofrecido por este fantástico componente.

Publicado en: Variable not found.


by José M. Aguilar (noreply@blogger.com) at January 25, 2012 06:41 PM

Libro: Dependency injection in .NET

La inyección de dependencias es uno de esos conceptos rodeados de misterio que parecen reservados a gurús, arquitectos, y otros profesionales de gama alta, y aplicables exclusivamente en proyectos mastodóndicos.

Y nada más lejos de la realidad: DI se basa en principios relativamente simples, e incluso diría intuitivos, para lograr evitar el acoplamiento entre componentes, es aplicable en todo tipo y tamaño de aplicaciones, y por tanto todas ellas pueden beneficiarse de las ventajas que aporta, como la simplicidad, mantenibilidad, extensibilidad, o facilidad para la realización de pruebas unitarias.

Dependency Injection in .NET. Manning.Pero, sinceramente, jamás pensé que el tema que pudiera dar tanto de sí como para escribir un libro. Por eso me ha sorprendido la lectura, por cortesía de Auges, del libro “Dependency Injection in .NET”, escrito por por Mark Seemann y publicado por la editorial Manning, donde he podido comprobar que mis conocimientos sobre inyección de dependencias, aunque válidos, eran bastante superficiales.

El libro se estructura en cuatro grandes bloques a través de los cuales se realiza un completo recorrido guiado por los conceptos, utilización y herramientas para aplicar DI:
  • “Putting Dependency Injection on the map” contiene tres capítulos introductorios, útiles para poner en contexto el patrón y las ventajas que conlleva su uso y describir los conceptos fundamentales utilizados: dependencias, tipos, tiempo de vida, intercepción, contenedores, y muchos otros.
  • “DI catalog” es una completa relación de patrones de uso de la inyección de dependencias, antipatrones o malos usos que podemos hacer de la misma, y refactorizaciones que podemos utilizar para solucionar escenarios frecuentes.
  • “DIY DI” describe técnicas asociadas a la ID, como la composición de objetos, la gestión del ciclo de vida, y la intercepción de llamadas.
  • “DI containers” es un completo bloque donde se describe el uso de los principales contenedores disponibles para la plataforma .NET: Castle Windsor, StructureMap, Spring.NET, Autofac, Unity y MEF.
En definitiva, se trata una lectura recomendable para desarrolladores .NET, tanto para aquellos que no hayan tenido experiencia previa con la Inyección de Dependencias y anden buscando fórmulas para reducir el acoplamiento entre componentes, como para los que ya se han enfrentado a ella y desean conocer en mayor profundidad las bases que la sustentan.
Como puntos negativos, que está disponible exclusivamente en inglés, y que algunos capítulos se hacen algo densos y requieren varias pasadas para poder asimilar las ideas transmitidas.

Enlace: http://www.manning.com/seemann/

Publicado en: Variable not found.


by José M. Aguilar (noreply@blogger.com) at January 25, 2012 12:25 PM

January 24, 2012

Variable not found

SignalR (II): Conexiones persistentes

Hace poco estuvimos viendo por aquí conceptos básicos sobre SignalR, el componente que nos permite crear espectaculares aplicaciones en las que múltiples usuarios pueden estar colaborando de forma simultánea, asíncrona, y en tiempo real.

Entre otras cosas, comentábamos que SignalR  crea una capa de abstracciones sobre una conexión virtual permanente entre cliente y servidor, sobre la que podemos trabajar de diferentes formas:
  • mediante conexiones persistentes, la opción de menor nivel, que proporciona mecanismos de notificación de conexión y desconexión de clientes, así como para recibir y enviar mensajes asíncronos a clientes conectados, tanto de forma individual como colectiva.
  • mediante el uso de “hubs”, que ofrece una interfaz de desarrollo mucho más sencilla, con una integración entre cliente y servidor que parece pura magia, y que seguro será la opción más utilizada por su potencia y facilidad de uso.
En este post estudiaremos la primera opción, conexiones persistentes. Los hubs los veremos en un artículo posterior de la serie, aunque si sois impacientes ya podéis ir leyendo el fantástico post del amigo Marc Rubiño sobre el tema, “Push con SignalR”.

Demo de conexiones persistentesBueno, pues vamos al tema: emplearemos esta vía para implementar una funcionalidad bastante simple, pero nada trivial utilizando las herramientas habituales de ASP.NET: mostrar en una página, en tiempo real, información sobre los usuarios que están llegando a ella, los que la abandonan y el número de usuarios que hay conectados justo en ese momento, en tiempo real.

Para ello haremos lo siguiente:
  1. En el lado servidor, implementaremos un servicio (endpoint) SignalR, que es el que procesará las conexiones y desconexiones de clientes, y enviará información actualizada por las conexiones abiertas.
  2. Registraremos este endpoint durante la inicialización de la aplicación, asociándole una URL de acceso a las funcionalidades del servicio.
  3. En el lado cliente implementaremos la conexión con el servicio, capturaremos la información que nos vaya enviando y la mostraremos en la página en forma de log.
El resultado lucirá tal y como se muestra en la captura de pantalla adjunta. Aunque si lo preferís, podéis verlo en vivo y en directo descargando y ejecutando el proyecto de demostración que encontraréis al final de este artículo.

Ya en el post anterior de la serie vimos cómo descargar e instalar SignalR en un proyecto, así que vamos a suponer que ese paso ya lo hemos realizado previamente.

1. Implementación del endpoint

El endpoint, o servicio SignalR, que vamos a implementar utilizando el enfoque de conexión persistente es simplemente una clase que hereda de SignalR.PersistentConnection, en la que podemos sobrescribir los métodos que necesitemos para implementar nuestras funcionalidades. En ella encontramos métodos como OnConnected(), OnDisconnect(), OnReceived(), y bastantes más, que nos permiten tomar el control cuando se producen determinados eventos de interés en la conexión:
    public class VisitorsService : PersistentConnection
    {
        protected override void  OnConnected(HttpContextBase context, string clientId) { ... }
        protected override void  OnDisconnect(string clientId) { ... }
        protected override void  OnReceived(string clientId, string data) { ... }
        // [...]
    }
Observad que el interfaz es bastante similar a la que encontramos al trabajar directamente con sockets: podemos introducir lógica cuando un nuevo cliente se conecte sobrescribiendo el método OnConnected(),  cuando se desconecte, haciendo lo propio con OnDisconnect(), o cuando el cliente envíe algún tipo de mensaje al servidor, que ejecutará la funcionalidad implementada en OnReceived().

De la misma forma, la clase base PersistentConnection ofrece mecanismos para enviar mensajes directos a un cliente, a grupos de ellos, o a todos los clientes conectados.

Volviendo al sistema que estamos desarrollando, básicamente para alcanzar nuestros objetivos necesitamos:
  • tomar el control en el momento en que se produce una nueva conexión (método OnConnected), momento en que enviaremos al resto de clientes un mensaje con información sobre el cliente conectado y el total de conexiones activas.
  • tomar el control en el momento en que se produce la desconexión de un cliente (método OnDisconnect()), para notificar al resto y actualizarles el número de clientes conectados.

1.1. Notificando a los clientes las nuevas conexiones

Cuando se realiza una nueva conexión al servicio, es decir, la llegada de un nuevo cliente, SignalR invocará al método OnConnected() del endpoint suministrándole el contexto de la petición HTTP actual, y un “ClientId”. El primero nos puede ser muy interesante para acceder a información de la petición (como el navegador, IP, cookies, información de autenticación, etc.), y el segundo es un identificador único generado por SignalR para realizar el seguimiento de la conexión.

Implementamos nuestro método y lo comentamos justo a continuación:
    protected override void OnConnected(HttpContextBase context, string clientId)
    {
        var clientDescription = getClientDescription(context);
        _clients.TryAdd(clientId, clientDescription);
 
        string text = clientDescription + " arrived.";
        var msg = new NotificationMessage(text, _clients.Count);
        Connection.Broadcast(msg);
    }
Lo primero que hacemos en la implementación del método es obtener una descripción textual del cliente (que puede ser el nombre del usuario autenticado, o su IP), utilizando el método getClientDescription(), que veremos más adelante. Esta descripción, asociada al ClientId, es almacenada en el diccionario estático _clients, lo que nos permitirá conocer en todo momento los clientes conectados.

Justo después componemos el mensaje y realizamos el envío a todos los usuarios conectados invocando el método Broadcast() de la propiedad de instancia Connection, que nos da acceso al canal virtual abierto entre clientes y servidor. El parámetro que recibe este método es de tipo object, y viajará serializado en formato JSON hasta cada uno de los clientes conectados; en este caso, hemos creado una clase llamada NotificationMessage que contiene toda la información que necesitamos suministrarles:
public class NotificationMessage
{
    public NotificationMessage(string message, int onlineUsers)
    {
        OnlineUsers = onlineUsers;
        Message = message;
    }
 
    public string Date
    {
        get { return System.DateTime.Now.ToLongTimeString(); }
    }
    public string Message { get; set; }
    public int OnlineUsers { get; set; }
}
Es conveniente tener en cuenta, sin embargo, que es posible enviar cualquier tipo de objeto: tipos propios (como en el ejemplo anterior), objetos anónimos, primitivos, o lo que se nos ocurra. Simplemente será serializado como JSON y llegará al cliente de forma directa (más adelante veremos cómo).

Los miembros auxiliares utilizados en el código anterior son los siguientes:
    private static ConcurrentDictionary<string, string> _clients =
        new ConcurrentDictionary<string, string>();
 
    private static string getClientDescription(HttpContextBase context)
    {
        var browser = context.Request.Browser.Browser + " " +
                        context.Request.Browser.Version;
        var name = context.Request.IsAuthenticated ?
                    "User " + context.User.Identity.Name :
                    "IP " + context.Request.UserHostAddress;
        return name + " (" + browser + ")";
    }
Observad que el diccionario donde almacenamos la información sobre las conexiones ha sido definido como ConcurrentDictionary para evitar problemas de concurrencia durante las actualizaciones, y es estático para que su información sea compartida entre todas las instancias del servicio.

1.2. Notificando a los clientes las desconexiones

Cuando SignalR detecta que un cliente se ha desconectado, invocará al método virtual OnDisconnect() del endpoint, lo cual nos permite introducir lógica de gestión del evento. En nuestro caso, simplemente necesitamos eliminar al cliente del diccionario donde los estamos almacenando,

De la misma forma, debemos controlar las desconexiones para notificar este hecho a los clientes aún conectados, para lo que sobrescribimos el método OnDisconnect():
    protected override void OnDisconnect(string clientId)
    {
        string text, clientDescription;
 
        if (_clients.TryRemove(clientId, out clientDescription))
            text = clientDescription + " is leaving.";
        else
            text = "Unknown user leaving.";
 
        var msg = new NotificationMessage(text, _clients.Count);
        Connection.Broadcast(msg);
    }
En este método recibimos el ClientId que SignalR asignó al cliente en el momento de iniciar la conexión; lo único que hacemos es buscarlo en el diccionario de clientes donde los estamos almacenando, eliminarlo, y enviar un mensaje broadcast al resto de usuarios indicando la desconexión que se ha producido.

Cuando implementéis funcionalidades en la desconexión, tened en cuenta que SignalR tarda unos segundos en darse cuenta de las desconexiones (recordad que con el transporte utilizado por defecto se trata de una conexión persistente virtual) por lo que puede aparecer un leve retraso en las notificaciones. Estos tiempos, en cualquier caso, pueden ser configurados (en el proyecto de demostración podéis ver cómo hacerlo).

[Actualización]: como bien indica Arturo en un comentario del post, para que las desconexiones sean notificadas correctamente es necesario utilizar IIS o IIS Express. Con Cassini (el servidor web integrado en VS) no funcionará bien este mecanismo.

1.3. Algunas observaciones adicionales

Al principio de comenzar a jugar con conexiones persistentes de SignalR, una de las cosas que pueden llamar la atención es que si en la implementación del método OnConnected() enviamos un broadcast a todos los usuarios conectados,  el usuario actual (el que ha provocado la llamada a OnConnected) no recibirá el mensaje; o en otras palabras, el broadcast llegará a todos los clientes excepto al que acaba de realizar la conexión.

Desconozco si se trata de un comportamiento por diseño, si es algo que se modificará en posteriores revisiones de SignalR (recordemos que en estos momentos es todavía una versión preliminar), o si simplemente se trata de un nombre para el método poco afortunado, pues en mi opinión da a entender que la conexión ya ha sido realizada y, por tanto, el broadcast debería llegarle también.

Pero en cualquier caso, en la implementación del proyecto de pruebas que podéis descargar al final de este post veréis cómo lo he solucionado incluyendo una llamada explícita (“ping”) desde el cliente al servidor para forzar el envío de un mensaje de actualización justo después de completarse la conexión. Conceptualmente, lo que se hace es:
  • desde el cliente, una vez se ha realizado la conexión, realizar un envío de datos al servidor, algo similar a un “ping”,
  • en el método OnReceived() del servidor, capturar el mensaje enviado desde el cliente y responderle de forma directa con la información que nos interese hacerle llegar, que podría ser un mensaje de bienvenida y, como en otras ocasiones, el número de usuarios conectados: 
        protected override void OnReceived(string clientId, string data)
        {
            var msg = new NotificationMessage("Hi!", _clients.Count);
            Send(clientId, msg);
        }
Más adelante, cuando tratemos la parte cliente del servicio, veremos cómo está implementado el envío desde el cliente de este “ping”.

2. Registro de ruta

Una vez tenemos el servicio implementado, debemos registrar en el sistema de routing de ASP.NET una URL a través de la cual será posible acceder al mismo. El lugar idóneo para hacerlo, como siempre que se trata de cargar la tabla de rutas, es en el global.asax, para que se ejecute durante la inicialización de la aplicación.

Por ejemplo, en una aplicación ASP.NET MVC podría ser algo así:
    public static void RegisterSignalrConnections(RouteCollection routes)
    {
        routes.MapConnection<VisitorsService>("Visitors", "VisitorsService/{*operation}");
    }
 
    protected void Application_Start()
    {
        RegisterSignalrConnections(RouteTable.Routes);
        [...]
    }
Observad que lo único que estamos haciendo es añadir a la tabla de rutas una entrada en la que asociamos el servicio, en este caso nuestra clase VisitorsService, a la dirección “VisitorsService/{*operation}”, que será la URL de acceso al mismo.

El primer parámetro que enviamos al método MapConnection() es simplemente el nombre de la entrada en la tabla de rutas, no tiene demasiada importancia.

3. Implementación del cliente web

La implementación de clientes web para las conexiones persistentes desarrolladas con SignalR es bastante simple, y comienza incluyendo en la página o vista una referencia hacia la biblioteca cliente de este componente:
<script src="@Url.Content("~/Scripts/jquery.signalR.js")" type="text/javascript"></script>
Como siempre, esta inclusión puede realizarse a nivel de página, o bien en la Master o Layout si queremos aplicarlo a todas las vistas del sistema.
Nota: si queremos dar soporte a clientes antiguos que no soportan deserialización JSON de forma nativa (por ejemplo, IE7), será necesario descargar desde Nuget la biblioteca de scripts json2.js y referenciarla en la página antes de la carga de SignalR.js. En caso contrario, se lanzará una excepción con el error:

“SignalR: No JSON parser found. Please ensure json2.js is referenced before the SignalR.js file if you need to support clients without native JSON parsing support, e.g. IE<8” 
Centrándonos en nuestra aplicación, el marcado HTML será tan simple como el que se muestra a continuación, lo único que hacemos es dejar un “hueco” en el que introduciremos los mensajes que se vayan recibiendo del servidor:
<h2>Log</h2>
<div id="log"></div>
A continuación, necesitamos implementar el código de script que realice las siguientes tareas:
  • iniciar la conexión con el endpoint,
  • tras ello, enviar un “ping” para recibir el mensaje de bienvenida (recordad lo que os comentaba previamente de que el broadcast no se recibe por el cliente que inicia la conexión),
  • mostrar en el log la información recibida del servidor.
Y el código de script tampoco puede ser más sencillo:
<script type="text/javascript">
    $(function () {
        var conn = $.connection("VisitorsService");
        conn.received(function (data) {
            var text = data.Date + " - " + data.Message + " " +
                data.OnlineUsers + " users online.";
            
            $('#log').prepend("<div>" + text + "</div>");
        });
 
        conn.start(function () {
            conn.send("ping");
        });
    });
</script>
Lo comentamos muy rápidamente:
  • en la variable conn obtenemos una referencia hacia el endpoint, identificado por el nombre de la conexión persistente, en este caso, VisitorsService.
  • sobre ella, definimos la función received(), que será invocada cuando el servidor envíe información. El parámetro que recibe la función anónima es la información enviada desde el servidor, que, recordaréis, en este caso se trataba en objetos de tipo NotificationMessage. Dado que la serialización y deserialización se realizan de forma automática, podemos acceder directamente a sus miembros, como podéis ver en el código para montar el mensaje e introducirlo en el log.
  • por último, iniciamos la conexión invocando al método start() de la conexión. Observad que este método admite un callback que será llamado cuando la conexión se haya establecido, momento que aprovechamos para enviar el “ping” al servidor que nos permitirá recibir el mensaje de bienvenida.
Y ¡esto es todo!

Si tenéis un ratillo, no dejéis de descargar el proyecto de prueba y jugar un rato con él. Y sobre todo, observad las pocas líneas de código que hemos tenido que emplear para resolver esta funcionalidad y comparadlo con lo que supondría implementarla de forma artesana, con las técnicas tradicionales.
Descargar proyecto de prueba.

En el próximo post de la serie veremos cómo utilizar los Hubs de SignalR, un planteamiento con una abstracción aún mayor sobre la conexión y una integración entre cliente y servidor simplemente espectacular.

Publicado en Variable not found.


by José M. Aguilar (noreply@blogger.com) at January 24, 2012 06:35 PM

Maestros del Web (Editorial)

Open Street Maps: buscando alternativas a Google Maps

¿Quieres saber como llegar a X lugar? ¿Ubicar en donde estás? ¿Estás desarrollando un proyecto que requiere utilizar mapas? Seguramente recurres a la herramienta salvadora: Google Maps. Este servicio fue creado por Lars y Jens Rasmussen y es ofrecido por Google desde el año 2006. En la guia mapas te ayudamos a dar los primeros pasos con la API, crear marcadores y trabajar con geolocalización.

La API de Google Maps ha sufrido cambios en lo que se refiere a la utilización libre y gratuita de la plataforma: a partir de 20.000 teselas los desarrolladores tienen que comenzar a pagar pero hay alternativas viables para utilizar y desarrollar mapas, hoy queremos hablar de OpenStreetMap.

Contactamos a referentes del proyecto en diferentes países de latinoamérica, ellos nos comentaron sobre OSM como alternativa, las características de la comunidad y nos hablaron de los cambios en la API de Google Maps.

OpenStreetMap: Mapas por y para todos

Julio Costa, es chileno, trabaja como asesor de eLearning en el ministerio de defensa de su país, es fundador de ZambelliKnowledge y miembro fundador de OpenStreetMap Chile. En un artículo que escribió sobre OpenStreetMap en Latinoamérica nos comentaba en qué consiste el proyecto:

OpenStreetMap (OSM) es un proyecto global destinado a generar y proveer datos geográficos libres a todos quienes lo requieran. Una de las razones para iniciar el proyecto fue que los datos geográficos que normalmente consideramos libres, no lo son realmente. En muchos casos se trata de la dicotomía Gratis/Libre.

Para ser parte del proyecto uno tiene que querer “mapear” y tener conocimientos informáticos mínimos ya que según Julio “incluso el editor más fácil tiene una curva de aprendizaje bastante empinada”. Nos comenta también que “debe tener cierta ética para no romper los mapas de otros usuarios, nos hemos topado con usuarios que crean ciudades fantasmas”.

El verdadero desafío es que se difunda el proyecto, para que a la gente le interese mapear.

El objetivo de OSM es claro, Julio nos dice que es:

Generar cartografía y ponerla a disposición de todo el mundo.

Ventajas de OSM frente a Google Maps

En lo que coinciden todos es que la gran ventaja de OSM se resume en una palabra: Libertad. Como dice Hernán Ramirez (Venezuela): “En OSM los mapas son libres de verdad”. Es libre para uso comercial o personal y los datos geográficos se pueden descargar en formato digital (a diferencia de Google Maps) y pueden ser utilizados en cualquier formato SIG, receptor GPS, o servidor de geodatos. Además el mapa es “fácilmente editable y personalizable” nos cuenta Gustavo Jarrín (Ecuador).

Ante los cambios de Google Maps, es un buen momento para conocer OSM

Sebastián Dulmont (@sd), utiliza muchos mapas para su sitio Streeteasy.com, un buscador web de bienes raíces. En una entrevista nos comentó que utilizaban Google Maps y que estaban muy contentos con el servicio pero al modificarse los precios y ser más estrictos con el pago, tuvieron que pensar en otra alternativa.

Ante la perspectiva de tener que pagar 100.000$ si seguían con el servicio de Google Maps, Sebastián y su equipo buscaron otras alternativas “cartográficas” opensource, entre las cuales encontraron a OSM. Una de las ventajas principales fue la posibilidad de modificar algo si estaba mal y mayor control de la información.

“Lo importante no es que una plataforma sea gratis, lo importante es que sea libre.”

Las comunidades de OSM en latinoamérica, ven una alternativa viable no solo por ser gratis sino porque la información “te pertenece”. Nos dice Julio Costa que la api de Google Maps tiene muchas opciones y a nivel de grandes empresas y multinacionales quizás sea bueno pero la api de OSM “lo que hace es intermediar entre los seguidores y la base de datos”.

Dar herramientas para crear los datos, almacenarlos y ponerlos a disposición de todo el mundo.

Norman Avila, autor de capítulos para la guía Mapas, nos dice que “OSM nació como plataforma abierta y permanece abierta, es la alternativa más consistente y más confiable”. Según los datos actualizados que nos brindó Julio en la entrevista, OSM ya llegó a los 500.00 usuarios registrados que es la gente que efectivamente puede editar los mapas, ya que “no hay ediciones anónimas como en Wikipedia”.

Para todos los que alguna vez hemos utilizado o hemos desarrollado mapas para nuestros sitios, sin duda que Google Maps nos ha sido de gran ayuda. Sin embargo el ecosistema ha cambiado y hay que pensar en alternativas para hacer más rentables nuestros sitios y apoyar en cierta manera el movimiento opensource que cada vez está tomando más fuerza.


Gissela Peralta Gissela Peralta para Maestros del Web.
Agrega tu comentario | Enlace permanente al artículo


Síguenos en: @maestros | Fan page

by Gissela Peralta at January 24, 2012 06:20 PM

January 23, 2012

Maestros del Web (Editorial)

5 plugins para mejorar tu productividad en tu navegador

La lectura y las búsquedas de diversos temas en la web son actividades que realizo a diario pero en algunas ocasiones se convierten en distracciones. Esta semana instalé plugins en mis navegadores, revisé sus características, los personalicé a mi gusto y finalmente encontré algunas interesantes opciones para mejorar mi productividad y no dejar pasar por alto contenido interesante.

1. Instapaper

Fue lanzado en enero de 2008 por su desarrollador Marco Arment, es una buena herramienta para alcanzar la productividad. Instapaper almacena tus distracciones, si encuentras un artículo interesante pero estás en horario de trabajo lo guardas y cuando estés en tu tiempo libre revisas tu lista y encontrarás todo el contenido que almacenaste en el transcurso del día.

instapaper-logoEl registro es con tu correo electrónico y contraseña. El uso de Instapaper se extiende a varias plataformas: Extensión para Google Chrome, aplicación para iPad, iPod Touch y iPhone disponible en AppStore. También facilita tu lectura a través de readers, descarga tus artículos en formato .ePub, .AZW o envía el contenido directamente a tu Kindle.

Esta aplicación obtuvo el primer lugar en la categoría de aplicación para iPad y un segundo lugar para iPhone en los 2010 Best App Ever Awards.

2. Evernote Clearly

Es una herramienta que convierte el contenido de un sitio web en un texto fácil de leer, elimina la publicidad y distracciones alrededor del artículo que te interesa. Además tiene características con opción de personalizar y almacenar en Evernote para continuar tus lecturas en tu tiempo libre. Disponible en Chrome Store.

<object height="315" width="560"><param name="movie" value="http://www.youtube.com/v/hgVPobaTyr0?version=3&amp;hl=es_MX"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed allowfullscreen="true" allowscriptaccess="always" height="385" src="http://www.youtube.com/v/hgVPobaTyr0?version=3&amp;hl=es_MX" type="application/x-shockwave-flash" width="600"></embed></object>

3. Herramientas Wikipedia

wikipedia-companion

  • Lookup Companion for Wikipedia
    Es un plugin para el navegador Google Chrome. Te facilita la búsqueda de palabras e información. Entre sus opciones puedes personalizar la búsqueda en varios idiomas y tiene un botón para visualizar el contenido directamente en la página de Wikipedia.
  • Wikipedia Toolbar
    Para el navegador de Firefox está disponible la barra de herramientas de Wikipedia, te facilita búsquedas, el acceso a la página principal y la navegación dentro del sitio si tienes cuenta de acceso.

4. iReader

iReader permite visualizar un artículo en un texto personalizado y deshabilitar imágenes en el post. Te facilita la impresión del artículo, compartir en Facebook, Twitter y por correo electrónico.

<object height="385" width="600"><param name="movie" value="http://www.youtube.com/v/vK3--Q_kEe0?version=3&amp;hl=es_MX"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed allowfullscreen="true" allowscriptaccess="always" height="385" src="http://www.youtube.com/v/vK3--Q_kEe0?version=3&amp;hl=es_MX" type="application/x-shockwave-flash" width="600"></embed></object>

5. Evernote Plugin

El plugin para Google Chrome te permite capturar un artículo, almacenarlo, facilita la impresión, el compartirlo en redes sociales y te da la opción de editar el artículo que almacenaste. Evernote es una buena herramienta para la organización y sincronización de actividades en diversos dispositivos móviles, no olvides revisar sus diversas características.

<object height="385" width="600"><param name="movie" value="http://www.youtube.com/v/OlOLXWvaIy0?version=3&amp;hl=es_MX"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed allowfullscreen="true" allowscriptaccess="always" height="385" src="http://www.youtube.com/v/OlOLXWvaIy0?version=3&amp;hl=es_MX" type="application/x-shockwave-flash" width="600"></embed></object>

Estás herramientas me han funcionado muy bien, pero la búsqueda no termina, estaré al tanto de nuevas opciones para instalar, utilizar y compartir.


Eugenia Tobar Eugenia Tobar para Maestros del Web.
Agrega tu comentario | Enlace permanente al artículo


Síguenos en: @maestros | Fan page

by Eugenia Tobar at January 23, 2012 07:00 PM

January 22, 2012

Anieto2k

TwitterWeek – 2012-01-22

En mi twitter he publicado estos enlaces que creo os pueden interesar.

Artículos relacionados

aNieto2k

by aNieto2k at January 22, 2012 10:15 AM

January 20, 2012

Javier Perez

¿Eres inteligente? Relación entre el cociente intelectual y comportamientos e ideas del ser humano

Tendencia al suicidio = Menos inteligente

Un estudio realizado por investigadores de varias universidades del mundo, sobre informes médicos de 24 años referentes a más de un millón de hombres, relaciona el cociente intelectual con la falta de tendencia al suicidio. Es decir, que las personas con más tendencias suicidas suelen tener menor cociente intelectual, sin capacidad para enfrentarse a los problemas o eventos traumáticos.

Conservador y religioso = Menos inteligente

Los más inteligentes suelen tender a probar cosas nuevas. 14.000 adolescentes norteamericanos evaluados en 2001 y 2002 dan como resultado esta relación entre ser conservador y la falta de inteligencia.

Usar Internet Explorer = Menos inteligente

Un estudio muy controvertido y cuya veracidad o autoridad está en entredicho, relaciona el uso del navegador de Microsoft, Internet Explorer, y la falta de cociente intelectual.

Consumir drogas = Más inteligente

El estudio sobre esta relación comenzó en 1970, del Estudio Británico de Cohorte, realizando un seguimiento a miles de niños (5-16 años) durante décadas hasta que cumplieron los 30 años.  Este estudio venía a demostrar también que los más inteligentes son más propensos a probar y experimentar cosas nuevas.

Hermano mayor = Más inteligente

Este estudio revelaría que los hermanos mayores son estadística y significativamente más inteligentes que sus hermanos pequeños (análisis de 241.310 hombres de 18-19 años). Se concluye además que por ese motivo los hermanos pequeños suelen ser más simpáticos, porque tratan de competir con su hermano mayor por otras vías.

Te gusta música clásica = Más inteligente

Un estudiante de doctorado del Instituto de Tecnología de California ideó un sistema para calcular una estadística que relacionara los gustos musicales con el nivel intelectual, en base a los datos de Facebook de estudiantes de diferentes universidades americanas, contrastándolos con sus notas académicas. El resultado fue que los que decían que Beethoven era su músico preferido eran los más inteligentes, y los menos inteligentes los que les gustaba el RAP o el reguetón.

Hombre fiel y ateo = Más inteligente

Este estudio también hace incapié en la falta de fé religiosa, además de en la fidelidad en la pareja, como síntoma de más inteligencia, estadísticamente hablando.

Cerebro en desarrollo = ???

Y si aún no ha terminado la edad de desarrollo cerebral (hasta los 18-20 años), ten en cuenta que tu cociente intelectual aún puede variar, y no necesariamente a más inteligente…

by Javier Pérez at January 20, 2012 10:19 PM

Maestros del Web (Editorial)

Es viernes: Ataca el problema de frente y transforma tu rutina

Cuando trabajamos como freelance por lo regular instalamos nuestra primera oficina en casa, esto va acompañado de una serie de nuevos hábitos que vamos incorporando a nuestra rutina. En ocasiones esas dinámicas que surgen son de lo más cómodas y libres que nos cuesta tomar ritmo de trabajo, hacernos de una rutina y trabajar productivamente. Hoy reflexionaremos en esas costumbres que son un problema y no permiten que mejoremos.

Work at home

¿Cual es tu rutina al despertar? piensa por un momento en las actividades que realizas en las primeras 4 horas del día ¿son productivas? o simplemente matas el tiempo con actividades poco significativas que no aportan mucho a tu trabajo como freelance. Estas preguntas no son para que me cuentes la verdad, son para que juntos a través de este texto ataquemos el problema de frente y transformes tu rutina, sólo intenta ser sincero contigo mismo y modifica para mejorar.

¿Cómo atacar el problema?

Esto es como los vicios, lo primero que debemos hacer es aceptar que tenemos un problema. Te pondré un ejemplo propio, yo tenía el problema de levantarme, hacer desayuno y encender la televisión mientras comía, eso hacía que me tomara no media hora para desayunar sino que podía tomarme hasta 2 horas levantarme del sillón y arrancar el día. La forma en que ataqué el problema fue desayunar en el comedor y centrar mi atención en comer adecuadamente, luego pensar en cuál sería mi siguiente acción para ir directo a ella sin distracciones.

  • Evalúa tus actividades: Piensa por un momento en las actividades de tu día, realiza una lista de todas aquellas dinámicas que no contribuyen en tu productividad y procura identificarlas de manera consciente cuando las estés realizando. Esto te ayudará a realizar el siguiente punto.
  • Cambia un hábito por otro: Los hábitos son actividades que realizamos sin pensar, tenemos muy buenos hábitos y también otros que no ayudan a lo que deseamos hacer. Para crear un nuevo hábito es importante practicar y repetirlo de tal forma que se vuelva parte de nosotros.
  • Utiliza nuevas técnicas de productividad: Si no conoces ninguna técnica de productividad, puedes buscar opciones como la Técnica Pomodoro de la que hablé en otra ocasión y también puedes comprar o descargar un libro que te enseñe nuevas dinámicas para ser efectivo.
  • Enfrenta el problema: Resulta sencillo engañarnos a nosotros mismos, en especial cuando somos los reyes de las excusas, y justificamos nuestras carencias o fuerza de voluntad para cambiar. Si como individuos no estamos educador para enfrentar los problemas, esto se traslada a las dinámicas de trabajo, nos especializamos en las excusas y solemos mentirnos o mentir a nuestros clientes. El fracaso no siempre es malo, aprendemos mucho de los errores, pero debemos educarnos en aprender a enfrentarlo y solucionarlo de tal forma que tengamos paz mental.
  • Busca ayuda: Sí, si no puedes sólo con el problema, entonces puedes buscar ayuda. Puedes contarle a una persona de confianza o ir con un profesional para que te ayude a cambiar. No es nuestra culpa ser como somos, muchos factores de contexto, educación o familia han influenciado en nuestra forma positiva y negativa de ser. Pero, eso no quiere decir que nos justifiquemos y culpemos a otros, porque es nuestra responsabilidad como individuos modificar todo aquello que no nos agrada, de eso sí eres totalmente responsable.
  • Intentalo de nuevo: Estos cambios no suelen salir al primer intento, por eso debemos repetirlo varias veces hasta volverlo parte de nuestros hábitos. No te molestes si las cosas no son tan sencillas, recuerda que así como resulta difícil educar a un ser humano, así de difícil será sustituir las enseñanzas por otras.

Recuerda que crear nuevos hábitos no es una tarea sencilla, cambiar nuestra dinámicas es como desaprender muchas acciones que nos han enseñado o simplemente hemos adoptado. Lo importante es reconocer que hay actividades que suelen sabotearnos, queremos ser exitosos y lograr nuestros sueños, pero poco hemos reflexionado en el proceso ¿por qué no lo logro? ¿qué estoy haciendo realmente para cumplir mis metas? creo que todos pasamos por los malos hábitos de trabajar desde casa, pero conozco a muchas personas que logran superarlos y ser un ejemplo de que con esfuerzo, dedicación y constancia todo es posible. Feliz fin de semana. Enjoy!


Stephanie Falla Aroche Stephanie Falla Aroche para Maestros del Web.
Agrega tu comentario | Enlace permanente al artículo


Síguenos en: @maestros | Fan page

by Stephanie Falla Aroche at January 20, 2012 03:14 PM

January 19, 2012

Maestros del Web (Editorial)

Apple le apuesta a los materiales educativos

La educación es una de las cosas que más le preocupaba a Steve Jobs, probablemente es uno de los ítems que dejó en alguna To-do-list secreta de Apple antes de partir, o eso podríamos suponer según un párrafo de su biografía (resaltado por mi).

apple-lanzamiento

El caso es que dentro de unas horas Apple realizará un evento para anunciar algo relacionado con la educación. Como es usual aún nadie sabe de qué se trata exactamente, pero sería bueno compartir algunas ideas antes de que se sepa.

(Si quieres leer la actualización con lo que Apple presentó en el evento, la encontrarás al final del artículo)

¿Dónde va a innovar y por qué importa?

La educación es uno de los sectores más afectados por la rápida evolución de la tecnología. Por eso es interesante que Apple, con los grandes empujones que ha dado para favorecer esa evolución en los últimos años, se decida a enfrentar el tema de lleno con alguna propuesta específica.

Aquí expondré algunos puntos que quizá ayuden a entender cómo funcionan los detonantes que las empresas de tecnología activan para acelerar la evolución de la educación tradicional y por qué puede ser importante un lanzamiento o propuesta relacionada con este tema.

El gran reto de la educación: aplicar tecnología

Año tras año los Estados y las organizaciones supranacionales plantean metas de desarrollo orientadas a disminuír la desigualdad social, concentrando esfuerzos en estrategias para la educación y aplicación de tecnologías de información para el aprendizaje.

Sin embargo en el caso de muchos países no hay una inversión de recursos suficiente para garantizar el cubrimiento y el acceso a la tecnología para todos los habitantes. Ese es el problema que plantea la llamada brecha digital, término que José Luis Orihuela redondeó como ‘brecha cultural’ en una entrevista con @120segundos, que se irá ampliando mientras las prácticas relacionadas con la educación no se transformen a partir de las nuevas tecnologías.

En una sociedad que ya funciona a partir de la información es necesario que el sector de la educación se comprometa a fomentar en las nuevas generaciones el uso y aplicación de las nuevas tecnologías. Así que la presente década será un gran momento de inversión en tecnología para la educación, de eso no cabe duda.

El papel de las empresas y las marcas

Muchas empresas de tecnología han estado interesadas en estimular a propósito con sus innovaciones los avances para una sociedad que hace uso constante del equipo tecnológico. Esto claramente beneficia su negocio, quizá ese sea el objetivo principal. Pero también es cierto que ayuda a cerrar progresivamente las brechas culturales y acelerar el alcance, en algunos frentes, de las metas de desarrollo.

Los aportes en educación son uno de los objetivos más importantes de estas empresas cuando se proponen ayudar a estimular el crecimiento. Además de las situaciones “tradicionales” en las que la tecnología llega y transforma el sector educativo -inversión en equipo y material por parte de las instituciones oficiales o privadas mediante licitaciones o búsqueda de proveedores- identificamos otras formas de incursión de las empresas de tecnología:

Inversión en educación mediante proyectos

En colaboración con gobiernos, agencias intergubernamentales, ONG y otras empresas, se dan muchas inversiones y programas de apoyo tecnológico para la educación, sobretodo en países que no tienen los recursos para estimular su propio crecimiento en este campo.

one-laptop-per-child

Un gran ejemplo de esto es Potencial Ilimitado de Microsoft. Esta empresa se ha comprometido en la última década a aportar soluciones tecnológicas para la educación. Este es un programa gigante que incluye versiones especializadas de software, programas de capacitación para profesores y líderes de las comunidades, donación de equipos, etc. Puedes encontrar un párrafo descriptivo del programa resaltado sobre un buen artículo que explica lo que están haciendo en Latinoamérica.

Desarrollo de herramientas educativas

Durante los últimos cinco años varios modelos computadores portátiles de bajo costo se lanzaron como buenas herramientas para la educación en países en desarrollo.

    xo-olpc
  • El caso más famoso es el del XO de One Laptop Per Child (OLPC). Un computador portátil diseñado específicamente para cumplir con funciones educativas y ser usado por niños en países de bajos recursos.

    Producido en conjunto por AMD, eBay, Google, Marvell, News Corporation, Nortel, Red Hat y Quanta, entre otros, el proyecto OLPC ha logrado vender al menor precio 2.5 millones de XO laptops en el mundo desde 2006.

  • El Classmate PC fue la apuesta de Intel en 2007 para competir en el mercado de computadores de bajo costo para países en desarrollo y que se acercaba más al desempeño de un PC normal por menor precio orientado a maestros y estudiantes, sin el diseño y funcionalidades educativas para niños propios del XO de OLPC.
  • El Asus Eee PC marcó ese mismo año la llegada de una nueva categoría: los netbooks. Estos computadores no fueron diseñados ni publicitados para la educación, sin embargo resaltaron rápidamente en el mercado como una alternativa económica y práctica para entornos de aprendizaje. Pronto llegarían a ocupar el 20% del mercado total de computadores.
  • También en 2007 Amazon lanzó el Kindle y en 2010 Apple presentó el iPad, con lo que se aseguraría el comienzo de la era de las tabletas. Aunque son más bien aparatos de consumo y no tanto de producción, las características intuitivas y amigables de la interfaz y el potencial que tienen ambos como plataformas atractivas y prácticas de lectura los presenta como herramientas ideales para los estudiantes.

Y ambas marcas, Apple con el iPad y Amazon con el Kindle, se han encargado de publicitar lo revolucionario de estos dos gadgets para el sector educativo. Sin embargo, hay que preguntarse si estos dispositivos pueden llegar a los lugares donde más se necesita la tecnología aplicada a la educación para el desarrollo. Porque, en ese caso, podríamos decir que es más efectiva la iniciativa de OLPC.

Justamente hace unos días, OLPC volvió a hacer noticia presentando en el CES 2012 la XO 3.0, una tablet con el mismo diseño funcional para entornos educativos y que funciona especialmente en lugares con poca o nula disponibilidad de energía eléctrica (tiene un panel solar además del cargador-generador de energía de los anteriores computadores).

La educación se adapta a la mejor herramienta

Tal y como sucedió con la Encarta frente a la Wikipedia, la aparición de nuevos recursos digitales termina forzando el cambio en industrias que llevan décadas trabajando de la misma forma.

Desde la aparición de esta herramienta educativa de Microsoft, que se terminó del todo a finales del año pasado, un objetivo claro es vender servicios complementarios a la educación a través de contenido multimedia. Por eso no sorprende que cada vez más se estén tratando de incorporar y promover “funciones educativas” en los diferentes dispositivos y que éstos mismos se terminen transformando y convirtiéndose efectivamente en los mejores aliados para el aprendizaje, además de venderse como tales.

Ese es el caso, por ejemplo, del iPad: una gran movida de innovación por parte de Apple que genera poco a poco un cambio cultural, pues no se trata sólamente del gadget que simplifica los procesos de aprendizaje con la conectividad y su interfaz amigable. Se trata también de la evolución que permite gracias a la transformación de los recursos que puede contener.

El cambio progresivo e inevitable del mundo editorial

La apuesta más grande de los últimos tiempos frente al consumo editorial en el mundo surgió con las tabletas. En el caso de la educación los libros digitales confirman que podemos estar en medio de un gran salto hacia la digitalización del conocimiento.

Luego de haber hecho algo parecido (y ganado la batalla en gran parte) con la industria musical, no sería raro que Apple quisiera lanzar la primera puntada para transformar la industria editorial comenzando por los pesados libros de texto que, según la biografía de Steve Jobs, le lastiman innecesariamente la espalda a millones de estudiantes alrededor del mundo.

Estos son algunos de los puntos que podríamos identificar como ventajas potenciales de la creación de libros de texto escolares para plataformas digitales:

  • La producción editorial con los gastos de impresión, mercadeo, distribución, etc. hacen que los libros sean ridículamente caros en ocasiones. El dolor de cabeza de los padres casi siempre es tener que costear una gran cantidad de libros que en ocasiones no se utilizan al máximo. Por el contrario, la inversión en una tableta se tiene que hacer sólo una vez y el precio de los libros de texto digitales sería muchísimo menor al de las versiones impresas. Esto puede ser una inversión aún inalcanzable en muchos lugares del mundo, pero también puede ser un gran ahorro en otros.
  • No se trata únicamente de trasladar el texto plano y la apariencia física de un libro a una versión digital. Todas las opciones de interactividad que ofrecen los dispositivos pueden ser aprovechadas para transformar los libros de texto digitales en nuevos modelos de presentación para la información.
  • Otra ventaja recalcada hasta el cansancio por las compañías fabricantes es que una tableta es todo lo que un estudiante necesita para realizar sus tareas, gracias a las diferentes aplicaciones para cada cosa que necesite hacer: escribir, leer, investigar, producir contenido, etc.).

Con esos puntos quizá podamos apreciar de forma más amplia el impacto que podría tener el anuncio educativo de Apple.

Queda la cuestión de cómo funcionaría esta transformación de la educación a partir de la tecnología en Latinoamérica, donde todavía es un asunto prioritario el cierre de la brecha digital y no hay suficientes recursos o inversión para garantizar el cubrimiento y la accesibilidad.

Si el iPad comenzara efectivamente a transformar las editoriales educativas, ¿Creen que el cambio llegaría pronto a beneficiar a Latinoamérica?

PD. El artículo “Evaluando el impacto del iPad en la educación un año después” de Sam Glicksman (en inglés) es un excelente estudio que les recomiendo.

Actualización: lo que pasó en el evento

El esperado anuncio educativo de Apple trajo, efectivamente, algunas sorpresas que parece implicarán a largo plazo una transformación en las editoriales educativas. Al menos esa es la idea que dejaron clara: quieren “reinventar los textos educativos”.

Tres aplicaciones fueron las que presentaron como primer paso para lograr el objetivo soñado de Jobs, todas muy relacionadas con el iPad:

  1. iBooks 2. Una actualización del lector de libros electrónicos que ahora tendrá más énfasis en la interactividad del contenido, justo lo que se necesita para estimular el uso del iPad en el sector educativo. Una desventaja: cada libro que se baje desde esta aplicación puede pesar entre 800 MB y 2.7 GB, así que tendremos que esperar que el hipotético iPad 3 llegue con una capacidad en disco suficiente para los estudiantes más aplicados.
  2. iBooks Author. Una aplicación exclusiva para el OS X Lion (supuestamente, pero parece que funciona bien en Snow Leopard) que permite diseñar libros fácilmente y subirlos gratis a la App Store (en principio, luego si Apple lo aprueba podrán tener un precio de hasta US$14.99). Una herramienta para comenzar la creación de material educativo especialmente diseñado para los dispositivos de Apple en su faceta de útiles escolares.
  3. iTunes U. El que antes era sólo un servicio para Mac y PC que ofrecía cursos en línea de distintas universidades listos para ser descargados ahora es una aplicación para iPhone e iPad que es realmente un aula virtual con servicios completos para la interacción directa entre profesores y alumnos e incluso la realización de clases o charlas via ‘streaming’. El uso extensivo de esta aplicación por parte de los profesores podría de verdad ir perfilando al iPad como la herramienta que todo estudiante necesita.

Además, algunas cifras que se resaltaron durante el evento: hay alrededor de 20,000 aplicaciones educativas disponibles para los diferentes dispositivos de Apple y un total de 1.5 millones de iPads dedicados exclusivamente a la educación en el mundo.


Daniela Jaramillo Daniela Jaramillo para Maestros del Web.
Agrega tu comentario | Enlace permanente al artículo


Síguenos en: @maestros | Fan page

by Daniela Jaramillo at January 19, 2012 04:32 PM

January 16, 2012

Davilac

Bing bate a Yahoo! en cuota buscadores

Por primera vez, el buscador de Microsoft, Bing, logra superar en cuota a Yahoo! en EEUU. Así, el buscador de Microsoft cerró diciembre con una cuota del 15,1% contra el 14,5% de Yahoo!, que perdió en un mes un 0,6%.

Se trata ésta de una situación especial, dado que una Yahoo! en decadencia acordó en verano de 2010 cerrar su buscador y usar los resultados de Bing.

by Davilac at January 16, 2012 09:29 AM

Variable not found

Enlaces interesantes 68

Enlaces interesantesEstos son los enlaces publicados en Variable not found en Facebook y Twitter del 9 al 15 de enero de 2012. Espero que os resulten interesantes. :-)

.Net

Asp.net

Azure / Cloud

Data access

Html/Css/Javascript

Visual Studio/Complementos

Otros

Y no olvidéis que podéis seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.

Publicado en Variable not found


by José M. Aguilar (noreply@blogger.com) at January 16, 2012 08:28 AM

January 15, 2012

Otro blog más

Los tuitlinks de la semana (29)

El recopilatorio semanal de los mejores enlaces aparecidos a lo largo de los últimos 7 días en mi cuenta de Twitter, @chechar

Los de propiedad intelectual

Thinking about learning. And SOPA and PIPA and stuff like that http://j.mp/yPOpdi

en el spectrum del ieee: Spain’s SOPA Law: How It Works And Why It Won’t http://j.mp/ykJCG2

RT @stephenfry Wise words on the criminal stupidity of movie/music moguls & their self-harming greed & tech ignorance. shml.me/x/2Mm (via @elvis717)

Los de cacharritos

La semana pasada hubo CES en Las Vegas. Y pasa lo que pasa…

déjate de ultrabooks. QUIERO un Samsung Series 9… http://j.mp/yOKAMi

…o, en su defecto, un HP Envy 14… http://j.mp/ylqLB7

llegan los wearable computers. nerdy a más no poder. pero tienen su aquel :-P (dragonball z, anyone?) http://j.mp/Ah4zPH

no quedaría mal, uno de estos, en la mesa del despacho… http://j.mp/za0qIK

jetbook tiene un ebook de 9,7″, 1600×1200, color y con stylus. ¡quiero! http://j.mp/zMHl7s

Lenovo saca competencia para el Transformer Prime de Asus http://j.mp/zoT3I7

OLPC XO 3.0 tablet preview: impressions, video, and pictures (The Verge) http://j.mp/A271mF

Los matemáticos

También se celebró una convención matemática grande en Estados Unidos…

When Art And Math Collide – Science News http://www.sciencenews.org/view/generic/id/40017/title/Math_Trek__When_art_and_math_collide via @sciencenewsorg #JMM2012

matemáticas y… pasta (de la que se come) :-D http://j.mp/xSZ2Ue

A Unique Expression Of Love For Math, en la NPR. 5 minutos para ver que los matemáticos no son *tan* raros http://j.mp/xg7NGm

Los de diseño y desarrollo web

Why is there Flash in the HTML5 version of Cut the Rope? [pista: siempre es el audio...] http://j.mp/zXUFRo

Ya tocaba… Google introducing UI and style guidelines for Ice Cream Sandwich http://j.mp/wSfSWd

:D RT @claudio: Esta está buena Trollem Ipsum: http://bit.ly/xZyqTW

The New Web Typography (via @pumpkin). puntos extra por el dominio en el que vive http://j.mp/xpgB2Q

RT @brucel “Choosing device sizes to support for your responsive designs” by @mattwilcox mattwilcox.net/archive/entry/id/1075 hear hear

un entorno chulo para hacer pequeñas pruebas HTML+CSS: http://dabblet.com/

Y los audiovisuales para cerrar

RT @WFMU A Festival of Human Tower Building in Tarragona Spain: Vid by Mike Randolph: http://is.gd/3d7mlv

RT @_rser una llibreria de nit: ho sabia! :) http://bit.ly/zmF6dz

500 grandes riffs de guitarra, una hora (y lo de las portadas lo tendréis que ver :-P). Radio Soulwax! http://j.mp/wxHpBB

Click here to view the embedded video.

by csr at January 15, 2012 05:04 PM

Anieto2k

TwitterWeek – 2012-01-15

En mi twitter he publicado estos enlaces que creo os pueden interesar.

Artículos relacionados

aNieto2k

by aNieto2k at January 15, 2012 10:15 AM

January 10, 2012

Davilac

Evolución funcionalidades de Facebook

Interesante infografía que muestra la evolución de las funcionalidades de Facebook a lo largo de su corta historia:

Vía davidarias.es

by Laura García at January 10, 2012 08:15 AM

January 08, 2012

Otro blog más

Los tuitlinks de la semana (28)

Segundo resumen semanal del año de los mejores enlaces aparecidos en @chechar

Los de la ley Sinde-Wert

en españa ya hemos llegado tarde (gracias, @jiwert) RT @guardiantech: Don’t let war on piracy break the internet http://bit.ly/xGsFAx

Somos noticias en Engadget :( Sinde Law brings SOPA-like restrictions to Spain http://j.mp/waX7CZ

Los de cacharritos

30 Years of Commodore 64 http://j.mp/wDiOy2

¿cuánto tendrá de vaporware la nueva tableta OLPC? sobre el papel mola… http://j.mp/y4Iigz

El matemático

toma curso de geometría fractal de la universidad de yale. mola… http://classes.yale.edu/fractals/

Los de diseño y desarrollo web

Web Browser Grand Prix VIII. Spoiler: sobre Windows gana Firefox :-) http://j.mp/yMBeWR

El último Spolsky es, como de costumbre, un ‘must read’ http://j.mp/xO8Cxj

(Más de desarrollo de software en general que de desarrollo web, pero imprescindible de cualquier forma.)

What CSS Properties Are Supported When You Drop IE6 Support http://j.mp/ylbCol

CamanJS, manipulación de imágenes con Canvas y JavaScript http://j.mp/s20nhH

Y los visuales para cerrar

un spot anticonsumo de alcohol con vídeo (ligeramente) interactivo. buen concepto… http://j.mp/z53bdt

no os perdáis los ’42 videoclips que tendrías que haber visto en 2011′ http://j.mp/A0PoYw

marchando una de timelapse astronómico… http://j.mp/tRYpMV

marchando una de timelapse ‘made in Hong Kong’ http://j.mp/AD5o5M

Click here to view the embedded video.

by csr at January 08, 2012 04:31 PM