MSDN Blogs
  • WarNov Developer Evangelist

    Lightswitch: Evitar que el doble clic abra ventana de edición en la vista Lista/Detalle

    En Lightswitch podemos crear pantallas de lista/detalle para poder ver o editar fácilmente numerosos registros.

    Estas pantallas tienen una funcionalidad interesante y es que si damos doble clic a un elemento en la lista:

    clip_image002

    un popup editable se abre con dicho elemento listo para editar:

    clip_image004

    En ocasiones deseamos impedir este comportamiento; sobre todo cuando no es necesario tener un formulario de edición dedicado que además por defecto trae todos los campos de la tabla: situación que podemos considerar no conveniente.

    Sin embargo, es difícil encontrar una opción que diga por ejemplo: Impedir pop up al hacer doble clic sobre un ítem.

    La cuestión, es que para evitar este comportamiento lo que hay que hacer es eliminar la capacidad de edición del elemento seleccionado de la lista.

    Esto se logra en modo de edición de la pantalla, entrando al command bar de la lista y de allí quitando el comando editar:

    clip_image005

    Una vez lo quitamos, observaremos que el doble clic sobre una entrada no produce ningún efecto en la interfaz.

  • WarNov Developer Evangelist

    Devices and Services. Un relato a partir del Nokia X.

    El consumidor final en general no compra sistemas operativos. Compra aparatos. Obviamente estos aparatos para funcionar bien requieren de un buen OS. Pero en un mundo de dispositivos que tienen que ser cada vez más baratos, la existencia de un excelente conjunto de servicios se hace indispensable. Y como tú, desarrollador; debes saber, los servicios que triunfan son aquellos agnósticos de los clientes que los usarán; (obviamente porque podrán alcanzar a un mayor número de dispositivos) ergo, son agnósticos del OS sobre el que correrán.

    En últimas, todo esto reviste de protagonismo a los SERVICIOS sobre el OS, en especial cuando hablamos de dispositivos móviles que al final vienen siendo los que masivamente terminarán vendiéndose dada su naturaleza multipropósito y portabilidad. Otros aparatos como los PCs serán herramientas para profesionales o usuarios avanzados, que en realidad necesitemos de todas las prestaciones de éstas maravillosas máquinas. Pero aún en éstas, los SERVICIOS son fundamentales para ofrecer más funcionalidad a los usuarios.

    Situaciones como las descritas y otras similares han llevado a la transformación de Microsoft en una compañía precisamente dedicada a los Dispositivos y Servicios. Los OS siguen existiendo y evolucionando por supuesto, pero ya como una realidad sentada. El enfoque ahora se eleva a una abstracción mayor que se ajusta a la realidad y futuro de nuestra industria.

    Existen hechos en la industria innegables para los jugadores de este cambiante partido. Por ejemplo, a través de la historia reciente, las computadoras MAC, siempre se han distinguido por su exclusividad y poca apertura a integrarse con sus competidores. Sin embargo, no dudaron en habilitar sus máquinas para que pudieran ejecutar al OS de escritorio con mayor share en el mercado global: Windows

    clip_image002

    Esta característica sin duda alguna ha representado más compras de este tipo de aparatos.

    Por otro lado, Google por ejemplo tiene su propio ChromeOS y quiere vender muchos aparatos con este OS. Pero no por eso retiró el browser Chrome de Windows. Si lo hiciese, perdería todo el share que tiene en nuestra plataforma.

    Ahora bien… si tu fueras uno de los fabricantes de teléfonos móviles más importantes del mundo que además ha entrado en alianza con uno de los gigantes de los servicios de software a nivel mundial y observas que existe una gran población que no está cubierta con tus dispositivos actuales (hablo de los mercados emergentes) y ves que además existe una forma económica de llegarles (con teléfonos de menos de 100 euros), no aprovecharías la oportunidad para abrir una nueva raza de dispositivos para poder tener una tajada más grande del mercado?

    Con esto, además de ganar por la venta de los dispositivos como tal, también ganarás porque más usuarios estarán usando tus servicios. Usuarios que hoy no tienen que ver NADA con tu tecnología, de un modo u otro estarían entrando a tu mundo.

    Y esto no significa que lo que ya tenías hecho vaya a ser abandonado. Tu producto original es tan bueno que la adopción es excelente… de hecho, abrir la plataforma significará que tarde o temprano vas a tener usuarios provenientes de la alternativa económica que quieran tener la experiencia Premium que brinda por ejemplo Windows Phone en los aparatos Lumia. El X es un puente para llegar a los Lumia.

    Así que se van a seguir requiriendo desarrolladores y empresas que satisfagan la necesidad de tu producto premium, mientras con tus productos de entrada lo que haces es atraer nuevos clientes que empiezan a usar tus servicios de manera masiva. De hecho en mercados claves como Japón, Canadá o USA (entre otros), los X no estarán disponibles.

    Viste… servicios, dispositivos… servicios, dispositivos…

    El mismo Elop en el MWC muy escuetamente dio a conocer que todos los servicios de Google que venían out of the box con Android iban a ser reemplazados por los servicios Microsoft. Así es como por defecto vendrá OneDrive, Skype, Outlook.com y sí Bing Search!

    clip_image004

    De hecho las apps que usaban antes los servicios de Google, si quisieran estar en los teléfonos Nokia, deberán ser modificadas para reemplazar los servicios por los de Microsoft J

    Conocen la historia del caballo de Troya?

    Todo esto me parece una jugada maestra a la que no se llega sino después de pensar numerosas alternativas y de tener en cuenta muchos factores… algo como una gran jugada de ajedrez.

    El servicio de pagos con tarjetas de crédito de Google, también tendrá que ser reemplazado por los servicios de pago que ahora ofrece Nokia en conjunto con los carriers, dada la estrecha relación que tiene el otrora número uno del mundo en ventas de celulares. Esto no me trae más que pensamientos positivos ya que en los mercados emergentes la adopción de tarjetas de crédito es muy baja y una plena integración con los operadores permitirá que los desarrolladores de apps las puedan monetizar más fácilmente.

    Y hablando como app developer, podría conjeturar varios temas. Por ejemplo que la capacidad de Visual Studio para generar binarios con otras plataformas como target, tal vez ahora se enriquezca con más propósito; máxime cuando Xamarin ha dado esos gigantescos pasos al respecto… no lo sé… qué tal que esos features ya vengan out of the box en versiones express… cosas de ese estilo pueden comenzar a pasar. Como sea, son ventajas para nosotros .neteros, que escribiendo nuestro adorado C#, vamos a poder compilar para todo el mundo…

    Y desde el punto de vista de backend developer, pues aún más expectativas! No solo Microsoft sino por ejemplo el mismísimo Nokia ahora tiene la posibilidad de influenciar más con sus servicios de nube como Nokia Here. De la misma manera nosotros .neteros también tendremos la posibilidad de que nuestros backend que ya son compatibles con el resto del mundo gracias a nuestras arquitecturas (como Azure Mobile Services), ahora sean más usados y tengan mayor alcance. Como bien saben, los servicios se pagan periódicamente y entre más usuarios tengamos en el front end sin importar el tipo de aparato, más ingresos mensuales vamos a tener a través de estos servicios. Por eso es bueno tener un dispositivo amigo que implemente otros OS que tengan gran share en el mercado.

    All in all… si dejamos la pasión [guts] a un lado, y vemos con cabeza fría lo que sucede, tendremos más oportunidades para sacar provecho.

  • WarNov Developer Evangelist

    Cómo tener prioridad en los Windows Phone Updates: Developers

    También eres de los que le han dado tap ochocientas cincuenta y cuatro veces al comando “Check for Updates” de tu Windows Phone a ver si el amber ya está listo para ti?

    En ese caso, te tengo la solución:

        
    Desde Microsoft, ya hemos habilitado el plan Windows Phone Preview for Developers, que habíamos anunciado hace unos meses.

    Así que para participar, solo es necesario que cumplas una de estas tres condiciones:

    Si cumples con cualquiera de estas características, BOOM, ya te puedes bajar el Amber y el Update 3 de Windows Phone.

    Solo tienes que bajarte esta app a tu teléfono desbloqueado:

    http://warnov.com/@WPhoneUpdate3

    Luego de que la bajes, aceptas todos los términos y licencias y luego buscas updates en tu teléfono:

    wp_ss_20131015_0001wp_ss_20131015_0002wp_ss_20131015_0003wp_ss_20131015_0004wp_ss_20131015_0005

  • WarNov Developer Evangelist

    Crónica de una supervivencia anunciada

     

    El día que lo iban a botar, el WarLumia 920 se guardó en el bolsillo de la chaqueta se su dueño, con tan mala suerte, que no fue cerrada la cremallera del bolsillo y además el dueño estaría corriendo karts en una pista profesional:

    Así que al bajarse de la primera sesión de vueltas, @WarNov notó que su celular ya no estaba y de inmediato supo que en algún lugar de la agreste pista yacía su celular esperando bien a ser rescatado o acaso a ser aplastado por las pequeñas veloces ruedas de algún otro kart.

    Afortunadamente @caycedo acompañaba a @WarNov en ese fin de semana de carreras y traía embebido también su Lumia 920, plan de datos activo al igual que el desafortunado WarLumia 920.

    -Entremos a http://windowsphone.com y usemos la utilidad de localizar tu teléfono:

    clip_image002

    Dijo @caycedo

    El WarLumia 920 hacía lo posible para no quedarse perdido y emitía su ubicación permanentemente con la esperanza de ser rescatado. WarNov solo esperaba a que no lloviera mientras terminaba la tanda de carreras para poder salir a la pista en compañía de caycedo al rescate.

    No llovió.

    La pista se desocupó y los dos geeks corredores salieron en búsqueda del luchador gadget. Cada uno tomó un lado de la pista y la empezaron a recorrer minuciosamente observando cada borde, como quien busca un Smartphone en una pista de carreras: una situación bastante común y cotidiana.

    Caycedo activó la funcionalidad de hacer sonar el teléfono desde la web, a través del browser de su Lumia. Y el feedback que daba el sitio era alentador al confirmar que el timbre del teléfono había sido activado correctamente. Sin embargo, aún no se oía nada… no se veía nada.

    Pasaron un cuarto de pista, media pista, tres cuartos de pista, y nada.

    Ya desesperanzados, entraron al último cuarto de pista… cabizbajos y desanimados…

    Pero de pronto, a lo lejos un fuerte timbre comenzó a oírse… caycedo arrancó a correr hacia la fuente de aquel glorioso sonido… warnov de nuevo con el alma en el cuerpo le siguió…

    Ahí está! Ahí está!

    Y sí! Era el WarLumia 920… todo su exterior mostrando las heridas de guerra sufridas…. Pero adentro, completamente operacional:

     

    WP_000898WP_000899WP_000902WP_000903

    Estaba al final de la recta más rápida de la pista, en donde seguramente cayó a unos no despreciables 70 kilometros por hora… sobre el asfalto; expuesto justo donde pasan los autos a casi 80.

    Afortunadamente @WarNov le había comprado un case protector (poco delicado y de diseño más bien tosco), que protegió perfectamente la estructura del teléfono.

    El protector, las excelentes características del aparato y los servicios ofrecidos por el portal, todo eso siempre garantizó que el WarLumia 920 sobreviviría a una catástrofe como ésta. Y por este motivo, y muchos otros, @warnov, @caycedo y miles más han elegido Windows Phone. Realmente una alternativa súper valiosa en el mundo de Smart Phones.

  • WarNov Developer Evangelist

    C++: Ansi? Unicode? main, wmain, _tmain

    Conozco usuarios “avanzados” de C++ que programan sin entender muy bien este tema. Pero en cuando más se presenta, es cuando hasta ahora estás comenzando a aprender C++. Y lo que he visto es que en ningún lado hay una introducción adecuada a este tema, motivo por el cual me vi determinado a escribir este post.

    Encoding

    En la computación básicamente todos son números; aún los caracteres. A cada carácter le corresponde un número determinado. Esta equivalencia es lo que conocemos como encoding. Hay muchos tipos de encoding. Estos encoding al principio no tenían en cuenta lenguajes donde habían muchos más caracteres que por ejemplo aquellos del inglés. Tampoco tenían en cuenta la necesidad de representar caracteres técnicos como la @ o muñequitos como los emojis. Además, diversos encodings, tenían diversas asignaciones de números para un mismo carácter. Así que la comunicación era complicada entre sistemas con distinto encoding.

    En los encoding que tendieron a ser estándar podemos contar al encoding ANSI. Es por esto, que C y C++ pueden trabajar con éste para representar caracteres. Pero en ANSI, se usa solo un byte para estas representaciones. O sea 8 bits. Con lo que se pueden representar solo 2^8 caracteres distintos = 256. Un conjunto muy limitado para un mundo tan diverso.

    Entonces el W3C propuso un encoding con más alcance, usando 2 bytes, logrando con esto cumplir su premisa de proveer un único número para cada carácter, sin importar la plataforma, el programa, o el idioma. Este encoding es llamado Unicode y hoy en día es adoptado por líderes de la industria como Microsoft, HP, IBM, Oracle, SAP, Sun, Apple y muchos otros. Además es requerido por estándares modernos como XML, ECMAScript (JavaScript), LDAP, CORBA 3.0, WML, etc.

    Uno diría entonces que el Unicode es lo único que se debería estar usando, pero hay que seguir dando compatibilidad hacia atrás sobre sistemas que no son compatibles con Unicode.

    Es así como C++ en Windows ofrece la posibilidad de crear programas orientados a caracteres Ansi, Unicode o Multibyte. En el encoding multibyte, algunos caracteres son de un byte y otros de varios bytes. Este acercamiento es muy usado en los lenguajes orientales como el japonés y el chino. En este artículo solo trataremos Unicode y Ansi.

    Funciones

    Entonces para diferenciar las funciones orientadas a uno o a otro, se han de usar nombres distintos.

    En especial para la función principal de C++ que es el main, se tiene el nombre wmain, cuando queremos específicamente tratar con Unicode. Si solo usaremos Ansi, entonces con main bastará.

    Pero puede ocurrir que estemos desarrollando un programa que vaya a tener varios destinos: Unicode o Ansi.

    En ese caso tendríamos que escribir dos versiones distintas del mismo no? A menos de que tengamos una manera de tener nombres comodín que se adapten a las condiciones requeridas.

    Para el main, este comodín es _tmain. Ya con esto, no tenemos que estar modificando todo nuestro código, sino solamente especificar el tipo de encoding en las propiedades del proyecto:

    image

    En Not Set, se usará Ansi por defecto.

    main, no es la única función que debe trabajar distinto cuando maneja Ansi o Unicode. De hecho todas las funciones que manejar char, tienen sus diferentes versiones. Y hay muchos comodines para esas funciones al igual que _tmain.

    Por ejemplo funciones como sprintf() o fopen() en Ansi tienen versiones swprintf() o _wfopen() para Unicode y las versiones comodín _stprintf y _tfopen

    En general se puede consultar la documentación para hallar los nombres adecuados dependiendo del resultado deseado.

    Tipos de Datos

    Los tipos de datos también tienen nombre especial. Por ejemplo el char para Ansi es char, pero para Unicode (2 bytes) es wchar_t. Mientras el comodín es TCHAR.

    Esto es importante, porque si llamamos una función Ansi, debemos pasarle tipos de datos de un byte; así mismo con Unicode. De lo contrario, en ocasiones se pueden obtener resultados inesperados sin que necesariamente se produzcan excepciones, o al menos errores o advertencias en tiempo de compilación.

    Literales

    Otro punto MUY importante, es el manejo de literales de acuerdo al encoding.

    Por ejemplo, si pasas a una función el valor “miparametro” como parámetro, esto es interpretado como que estás pasando un char *. O sea un arreglo de caracteres de un solo byte: Ansi. El problema es si lo pasas a la versión Unicode de una función, en cuyo caso vas a tener resultados no deseados. Por ejemplo, no es correcto llamar:

    wcscmp(palabraBase,"mipalabra");

    Dado que wcscmp espera 2 argumentos de tipo wchar_t. Suponiendo que la variable palabraBase es de tipo correcto, lo que sí se puede asegurar es que “mipalabra”es incorrecto porque llega como char *. Para especificar que el trato sea con Unicode, usamos el prefijo “L”:

    wcscmp(palabraBase, L"mipalabra");

    Obviamente las funciones comodín también tienen su prefijo comodín: “_T”, aunque éste último actúa más como un operador: _T(”mipalabra”) será interpretada como Ansi o Unicode dependiendo del tipo de encoding que se haya especificado.

    Finalmente para ilustrar lo anterior, les dejo las tres versiones de un sencillo programa que compara un parámetro pasado a la consola, con un literal definido dentro del código:

    Versión Ansi:

    #include <iostream>
    #include <string.h>
    
    
    using namespace std;
    
    int main(int argc, char*argv [])
    {
        if (_stricmp(argv[1], "palabraBase")==0)
            cout << "Palabras Iguales" << endl;
    }

     

    Versión Genérica:

    #include <iostream>
    #include <string.h>
    #include <tchar.h>
    
    using namespace std;
    
    int _tmain(int argc, TCHAR * argv [])
    {
        //Válido si el proyecto se ajusta a Ansi 
        //Not Set en el Character Set del Proyecto    
        if (_tcsicmp(argv[1], "palabraBase") == 0)
            cout << "Palabras Iguales (T - Ansi): " << endl;
    
        //Válido SIEMPRE
        //Pero para un funcionamiento más genérico,
        //algo como esto sería más adecuado:
        if (_tcsicmp(argv[1], _T("palabraBase")) == 0)
            cout << "Palabras Iguales (T): " << endl;
    
        //Válido si el proyecto se ajusta a Unicode
        //Unicode en el Character Set del Proyecto
        if (_tcsicmp(argv[1], L"palabraBase") == 0)
            cout << "Palabras Iguales (T - Unicode): " << endl;
    }
    Nótese la inclusión de <tchar.h> para poder tener acceso a las macros genéricas requeridas.

    Adicionalmente los bloques de ejemplo 1 y 3 son mutuamente excluyentes y dependiendo del charset definido solo una es correcta.

    Versión Unicode:

    #include <iostream>
    #include <string.h>
    
    
    using namespace std;
    
    int wmain(int argc, wchar_t*argv [])
    {
        if (_wcsicmp(argv[1], L"palabraBase") == 0)
            cout << "Palabras Iguales (w)" << endl;
    }
  • WarNov Developer Evangelist

    WinRT: Live Tiles con Background Tasks

    Los live tiles como todos sabemos, nos permiten ver contenido de una app de WinRT sin necesidad de abrir dicha app.

    Hay varias formas de obtener contenido para los live tiles de tu app.

    Una de ellas es a través de Background Tasks.

    En este video, te mostraré cómo lograr lo anterior en menos de 20 minutos.

    image

     

    Veremos cómo tenemos que crear un proyecto aparte de tipo WinRT Component para exponer la funcionalidad de nuestra tarea en background, que en este caso no es más que usar la clase SyndicationClient para descargar el RSS en este caso de mi blog: http://warnov.com/@BlogRSS

    Este RSS traerá los últimos títulos de los posts de mi blog y los expondrá como contenido para el live tile de una app que para este ejemplo, es una app vacía.

    Un tema importante es declarar un objeto deferral para que Windows no termine nuestra tarea en segundo plano cuando ésta se encuentre ejecutando operaciones asíncronas. Muchas de las fallas que he visto en los updates de los tiles con Background Tasks, obedecen a la falta de declaración de este objeto.

    Luego, basta con referenciar el assembly de nuestra tarea dentro de la app en la que deseamos los live tiles. Ajustamos el manifest declarando que usaremos una Background Task, y especificamos las imágenes para los tiles.

    Se registra la tarea en el inicio de la app y listos para el debugging.

    El debugging de tiles es especial porque éstos corren en un assembly distinto al de la app. Por lo que es necesario usar Location Debugging. Esto lo vemos de manera más precisa en el video.

    Enjoy!



  • WarNov Developer Evangelist

    Cómo hacer que tu app sea promovida en el Windows Phone Store

    El Windows Phone Store tiene un equipo encargado específicamente de seleccionar apps que se promueven todos los días en los stores de Windows Phone de cada país.

    Por ejemplo el día de hoy mi app: “Split my Bill” fue destacada en el store de Colombia y con esto claramente estaré notando un aumento sustancial en las descargas de mi app, pues esta aparece en el home del store cuando a éste entran los usuarios desde su Windows Phone.

    split

    Descárgala con tu Windows Phone.

    Split My BillQRCode

    Cómo logré que esto sucediera?

    El equipo que les mencioné básicamente revisa tres aspectos: Funcionalidad, Utilidad y Enjoynment.

    Funcionalidad:

    Hay algo más frustrante que una app que no haga lo que dice? Yo personal y despiadadamente he desintalado apps solo con el primer error que muestran.

    El equipo en este caso lo que evalúa es que tu app tenga un alto performance y estabilidad. Que se ejecute velozmente y responda bien a las interacciones con el usuario.

    Las apps deberían ser intuitivas y fáciles de manejar y navegar sin instrucciones. Los manuales son cosas del pasado. Quizá algunos tutoriales bien pequeños dentro de la app estén bien sin embargo. Pero estos deberían ser muy simples y no emplear más que un par de minutos de atención del usuario.

    En este apartado también se revisa la conceptualización y descripción que hayas usado para tu publicación en el store.

    clip_image002

    Esta descripción debería enganchar a tus usuarios y darles detalles de lo que la app (o su último update) es capaz de hacer. Aunque suene obvio, esmérense en escribir párrafos gramaticalmente correctos, claros y precisos de acuerdo con la realidad de la app. Y obviamente incluir screenshots de la app ayuda a los usuarios a tomar una decisión de descarga bien informada.

    clip_image003

    Utilidad:

    Acá se evalúa la calidad de experiencia móvil que brinda la app. Para tener una buena calificación en este aspecto tienen un conjunto de características muy útiles que habilitan al usuario a crear y compartir contenido nuevo. No solo a consumirlo. Otras veces permiten hacer tareas cotidianas de una manera más sencilla, haciéndole la vida más fácil al usuario, así sea resolviendo pequeños problemas. Si la naturaleza de tu app provoca que los usuarios la usen repetida y consistentemente de manera que se convierten en parte de la vida diaria de éstos, entonces ten seguro que tendrás una gran calificación en esta área. Las apps que toman ventajas de los features especiales de los aparatos también son muy apreciadas ya que proveen una experiencia única optimizada para tomar ventaja de las características del dispositivo (GPS, NFC, sensores, cámara, etc).

    La originalidad e innovación de la app también son evaluadas sobretodo en comparación con otras apps del Windows Store.

    Cosas tan sencillas como en mi app el hecho de no ser otra app más para dividir la cuenta en partes iguales, sino que es una app que permite saber exactamente cuánto consumió cada quien, es un claro ejemplo de este punto.

    clip_image005

    Tu app es diferente? lo hace mejor que otras? Piensa esto muy bien antes de emprender un nuevo proyecto y tendrás parte de la promoción ya ganada.

    Finalmente se observa que la app provea una fuerte impacto visual incorporando elementos visuales de alta calidad.

    Enjoyment:

    No encontré una palabra en español en corto tiempo que me permitiera traducir esta. Agradezco si en los comentarios agregan ideas al respecto.

    En esta área se evalúa la capacidad de la app para hacer que el usuario sonría, se alegre de usarla o diga “WoW” o quizá: “uy juemichica, que machera!”

    Estas apps deben hacer un uso muy concienzudo de características como Tiles, Lenses, Speech integration, Wallet, In-App purchase o Pin-to-Start. De maneras que acerque al usuario a los amigos, la familia, contenido o resolución de problemas de su vida diaria. Que el dispositivo en realidad sea como un control remoto de muchos aspectos de la vida del usuario. La aplicación de los principios de diseño es super importante en esta evaluación, de manera que se chequea la tipografía, iconografía, tiles, panoramas y los conceptos de movimiento que hacen que las apps aparezcan de manera bella y elegante.

    Aquí también se favorece a las apps que generen sinergia entre varios productos. Que se integren por ejemplo con Windows y Xbox para comunicar tofo o parte de la experiencia de un dispositivo a otro, es un gran plus.

  • WarNov Developer Evangelist

    Plugins para Construct 2 con JavaScript y Visual Studio

    Construct 2 es un editor de juegos basado en HTML5 que a través del drag and drop sobre un canvas y muchos objetos de ayuda, permite crear juegos que se pueden exportar a una variedad de plataformas que incluye Windows 8, Windows Phone, iOS y Android entre muchas otras.

    image

    Aunque su enfoque básico permite crear juegos sin escribir código, en ocasiones es útil poder personalizar el ambiente con código propio. En estos casos JavaScript juega un papel importante.

    Pero dado que Construct 2 carece de un editor de código potente para estos casos, aquí en este video les muestro como Visual Studio se convierte en una herramienta poderosa para hacer este tipo de desarrollos.

    Ingredientes:

    1. Visual Studio de 2008 al 2013
    2. node.js instalado en tu Windows
    3. NuGet Package Manager instalado en tu Visual Studio
    4. Construct 2
    5. JavaScript SDK for Construct2

    Resultado:

    1. El código fuente que he creado para este ejemplo

    Luego de asegurarnos de tener todo lo necesario, lo único que hay que hacer es seguir este tutorial en donde observamos cómo podemos extender la funcionalida de Construct con JavaScript personalizado escrito y depurado en Visual Studio, a través de llamados a NodeJS desde la consola de NuGet Package Manager. Todo esto, explicado en este video: Enjoy!

  • WarNov Developer Evangelist

    Utilidad de relaciones 1:1 para optimizar descarga de imágenes desde DBs

    Entre las cosas que supe que existían pero nunca para qué, puedo contar las tablas relacionadas 1:1.

    Cuando me imaginaba un ejemplo de una implementación de este estilo, me imaginaba la tabla producto. Entre los atributos podemos contar precio, ciudades de distribución y medidas.

    El precio es una columna, las ciudades de distribución harían parte de una relación de varios a varios que partiría con una tabla de unión. Las medidas, pueden ser todas columnas de la tabla: peso, altura, volumen, etc., dado que las medidas son particulares a un producto dado. Así que por esto no las sacaría:

    image

    Pero si quisiera hacer una relación 1:1, podría crear una tabla de medidas y entonces hacer que cada producto tuviera una relación unívoca con un registro de medidas.

    Como ven, no tiene mucho sentido... no obtendría mayor velocidad de consulta y tampoco estaría ahorrando almacenamiento (de hecho estaría generando un poco más de overhead sobre el tamaño de la DB). Noten además cómo representa SQL Server Management Studio las relaciones 1 a 1, con la llave en ambos extremos de la flecha:

    image

    Dejemos esa historia hasta ahí por ahora.

    Acto seguido, déjenme contarles acerca de un serio inconveniente que estuve teniendo con LightSwitch y el desarrollo de un emprendimiento.

    Ya con el sistema en producción, comencé a observar cómo la carga de uno de los formularios de datos se hacía eterna, y eso que solo se consultaba un conjunto de datos muy pequeño (no más de 1000 registros). Fue abrumador.

    Luego de mucho revisar, observé que la demora se producía cuando traía unos datos de tipo T, por decir algo, que eran requeridos para llenar un combo.

    Lo que hace LightSwitch es llenar el combo con la columna de resumen de la tabla T. Así que en mi caso, luego de varios minutos si no había excepción por timeout, llenaba el combo con los contenidos de la columna de resumen (un resumen por cada registro retornado)

    Precisamente el hecho de tener esa columna de resumen fue el que me hizo olvidar que la tabla tenía otras columnas adicionales.

    Y lo peor, que una de esas columnas adicionales era usada para almacenar imágenes.

    Entonces todo comenzó a esclarecerse.

    LightSwitch usa el EntityFramework para agilizar su labor de RAD que agiliza mucho el desarrollo de aplicaciones basadas en formularios de datos.

    Como la idea de un RAD es hacer todo lo más genérico posible para poder agilizar el desarrollo, en LightSwitch solo se pueden hacer consultas a nivel de entidades completas.

    I mean, no se puede pedir por ejemplo una consulta que traiga solo tres campos de una tabla o que traiga extractos de varias tablas. Todo se debe resolver por las relaciones que hayas creado en el modelo. El filtro que se haga, siempre retorna n elementos de una entidad dada, donde cada uno de esos n elementos baja con TODA LA INFO asociada al mismo.

    El problema descrito aquí no solo aplicaría para LightSwitch, sino para cualquier otro RAD, dado que solo manejando entidades completas, se puede ejercer un control automatizado sobre todas las operaciones que se hagan en el entorno.

    Esto en general anda perfecto sin mucho esfuerzo; pero que pasa si tu tabla T tiene 4 columnas de tipo varbinary para almacenar imágenes asociadas con tamaños de varias megas cada uno?

    Qué pasa si el resultado de una consulta muy sencilla arroja por ejemplo 30 resultados?

    Nefasto! Estaremos descargando cientos de megabytes al cliente y sin darnos cuenta, porque lo que vemos en la pantalla al final por ejemplo en mi caso, solo es el campo de resumen de la tabla.

    De hecho en esta instancia, aún no necesitaba las imágenes. Solo necesitaba dos columnas: la del resumen para identificar el registro requerido y el Id para poder operar en adelante.

    Así que después de mucho analizarlo, adivinen cuál fue la solución:

    Hahaha, sí. La dichosa tabla adicional (en este caso de imágenes) y la relación 1:1. Llamaremos U a esa tabla.

    El hecho de tener las tablas separadas en este caso sí implica una gran ventaja dado que cuando el RAD descargue el resultado de mi filtro, no se traerá todos los MB de imágenes correspondientes a cada uno de esos registros!

    Entonces la solución es hacer el filtro inicial solo sobre la tabla T y de allí escoger el registro especial al que quiero consultarle sus imágenes asociadas.

    Con una relación 1:1 esto funciona perfectamente, ya que en ambas tablas los PK son los mismos. Así que cuando de la tabla T escojo el id 7 por ejemplo, luego haría un filtro sobre la tabla U where U.id=7 y ahí sí me bajaría solo las 10MB del registro requerido. Algo completamente apropiado, sin mencionar que además es más fácil soportar el tiempo de espera para obtener la info de un registro particular que cuando esperamos minutos para traer un listado que después vamos a tener que filtrar nuevamente!

    CONCLUSION:

    All in All, las dichosas 1:1 resultan muy útiles cuando a una entidad dada tenemos asociada información que no se requiere frecuentemente pero que sí puede ser muy pesada para estar bajando del server con cada consulta, cuando no se pueden hacer filtros con altos grados de personalización como sucede en todo RAD que trabaje con datos a nivel de entidades.

    Si conocen más usos prácticos de este caso, siéntanse libres de comentar abajo!

    Nota: En LightSwitch no se soportan las relaciones 1:1, pero sí las 1:0..1, que en términos prácticos cumplen exactamente la misma función.

  • WarNov Developer Evangelist

    Por qué prefiero HTML5 para WinRT Apps?

    Un ensayo orientado a #Developers y #Designers, acerca de la situación actual de la industria de las #apps y su relación con WinRT

    Antes que nada, déjenme decirles que soy un profundo fan de C#.

    clip_image002

    Llevo 11 años trabajando con ese lenguaje de programación y luego de haber pasado por APL, JAVA, C, C++, PHP, JavaScript, Modula 3, Ruby, Basic, Visual Basic y TypeScript, puedo decir que es el mejor lenguaje a mi modo de ver, en su relación costo beneficio.

    Pero así como también me gustan los Fórmula 1, no por eso los llevaría al campo para hacer 4x4.

    Como la mayoría de sus contemporáneos, C# nació en un mundo donde el backend y las aplicaciones nativas estaban en el top of mind de la mayoría de los developers, y cuando los motores de interpretación de código dinámico eran supremamente lentos y estaban relegados a ser usados en escenarios básicos que no requerían mucha capacidad de cómputo.

    Pero la computación obviamente ha evolucionado y así ha de pasar con las herramientas usadas para desarrollar el nuevo software.

    No quiero decir que C# no haya evolucionado. Todo lo contrario. Ha evolucionado tanto que ya tiene sus propias características dinámicas ampliamente usadas en escenarios como MVC en los ViewBag. Ha evolucionado tanto que la asincronía se maneja con un nivel de abstracción que uno casi ni se da cuenta que existe con elementos como async y await. Ha evolucionado tanto que se puede valer de un compilador expuesto como servicio para hacer todas las locuras y genialidades que se nos ocurran con Roslyn.

    Sin embargo un elemento bastante disruptivo ingresó a la industria de nosotros los developers que nos hicimos desarrollando WinForms y asp.net WebSites.

    Y ese elemento, no es otro más que las apps.

    Su relevancia comenzó con el Web 2.0, ajax, mashups y estás cosas de principio de siglo que nos trajeron excelentes aplicaciones web que con mero JavaScript nos daban una gran experiencia de usuario en escenarios de entretenimiento, información y herramientas para consumidores finales en un ambiente relativamente multiplataforma, hasta donde los browsers lo permitían.

    Estas tendencias se hicieron evidentes también en las plataformas propietarias. Más específicamente hablando, en los smartphones. Pero al ser estos propiedad de las corporaciones, cada una quiso liderar el mercado con su propio acercamiento nativo. Llámese Objective C, Java o C#, dependiendo del fabricante.

    Así que en un mundo ya centrado en el consumidor, estas producciones han comenzado a mover millones de dólares y a influenciar cada actividad relacionada con el desarrollo de software. Desde sistemas operativos, pasando por herramientas de desarrollo, mercados de aplicaciones y hasta el cloud computing que ya tiene ramas completamente orientadas a las apps.

    Y por apps, me refiero a conjuntos de código relativamente pequeños que corren en un dispositivo sin requerir grandes capacidades de cómputo y que se pueden conectar a servicios a través de internet.

    Por qué relativamente pequeños?

    Porque para que el negocio funcione, tenemos dos limitantes:

    1. Que corra en todos los browsers, sin plugins o

    2. Que corra en un dispositivo móvil sin agotar la batería

    En ambos casos llegamos a la conclusión que el alcance de la plataforma debe estar muy bien limitado, tanto para que podamos tener un mínimo común denominador en los browsers o para que no requiramos procesadores muy complejos que consuman muchos recursos.

    Tenemos dos vertientes entonces:

    La de los que saben hacer apps nativas y la de los que saben hacer apps con JavaScript.

    clip_image004

    En el mundo de las apps nativas estamos nosotros los desarrolladores de la última década. En mi caso particular, los desarrolladores de C#. Y C# está muy bien plantado con los SDKs y APIs que ofrece para el mundo de las apps tanto de Windows Phone como de Windows 8. Es muy completo y tiene el poderoso respaldo de Visual Studio para lograr hacerlas.

    Sin embargo el tema que tenemos: reducir el alcance de esos SDKs y APIs para que se ajusten al mundo de las apps, ha provocado que el modelo de desarrollo ya no sea aquel al que están acostumbrados los desarrolladores tradicionales que se espantan porque ya no encuentran las apis a las que estaban acostumbrados en temas tan evidentes como el manejo de archivos entre otros.

    Por si fuera poco el mundo de las apps tiene una exigencia de diseño sin precedentes y una app que no guste desde el primer momento de usada, está condenada a su desinstalación inmediata. Ya no nos podemos dar el lujo de hacer apps como queramos, porque nuestros usuarios ya no son los típicos empleados que están obligados a usarlas. Las apps de verdad deben GANARSE el amor de sus usuarios y esto no solo se logra con buena programación, sino con buenos diseños y UX.

    La evolución de los paradigmas de desarrollo de aplicaciones entonces ha sido dirigida a facilitar la tarea de crear interfaces de usuario de la más alta calidad gracias al trabajo de los diseñadores.

    Esto básicamente requiere de un principio que he denomidado la paradoja DevDes:

    1. Que los elementos de presentación estén completamente separados de la lógica

    2. Que los elementos de presentación estén completamente integrados a la lógica

    Por qué es esta paradoja?

    Es sencillo, necesitamos que los diseñadores puedan trabajar sus diseños con sus propias herramientas sin necesidad de saber nada de desarrollo. O sea, que puedan trabajar separados de la lógica de la aplicación.

    Pero cuando ya hayan acabado, necesitamos que lo que hayan hecho esté completamente integrado a la lógica de la aplicación para que no haya sufrimientos tratando de importar piezas hechas en Illustrator a un Visual Studio. De lo contrario, puede que lo que se desarrolle en realidad, quede muy distinto a lo que se había diseñado.

    Además en el proceso de mejora continua, debe ser muy transparente y eficiente la comunicación y el trabajo interdisciplinario.

    Entonces ahí fue cuando en Microsoft apareció WPF y el famoso XAML. Un lenguaje basado en XML que permite declarar interfaces gráficas a través de lenguaje de marcado, de tal manera que una herramienta amigable con diseñadores puede generar este texto, que luego es leído sin problema por una herramienta para desarrolladores, cumpliéndose entonces los dos puntos que declaré anteriormente.

    Estas herramientas no son otras que Blend y Visual Studio.

    Pero trabajar este tipo de interfaces eficientemente no es sencillo con las costumbres tradicionales de mezclar la lógica con la presentación en los event handlers del click de un botón al mejor estilo amateur cuando se aprenden a hacer aplicaciones ASP.NET o WinForms.

    El afán por ordenar el caos, nos llevó a los más osados a trabajar con el modelo MVP.

    Pero el nuevo esquema de XAML, requería algo mucho más sofisticado y es lo que efectivamente conocemos como MVVM.

    clip_image006

    MVVM: El monstruo que aterra a los developers tradicionales cuando ven una app que lo implementa. El que los aleja de la productividad mientras lo aprenden. Un modelo que exige un reset en la manera de pensar y programar las interfaces de usuario. Un monstruo que muchas veces frustra a los no iniciados.

    He visto a decenas de desarrolladores perderse en ese mundo de modelos, vistas, vista modelos, comandos, binding, IObservable collections, INotifyPropertyChanged y dependency properties entre otros.

    Y esto es, no porque sea una cosa supremamente compleja, sino porque es algo muy distinto a lo que se trató de tener anteriormente en .net: Obtener un modelo uniforme de programación. La verdad sea dicha, es utópico esto dada la inmensa variedad de escenarios de desarrollo de software que tenemos hoy en día.

    Entonces, estamos perdidos los desarrolladores .net tradicionales en el mundo de las apps?

    No, si nuestro deseo u obligación es hacer apps, como lo mencioné, el código y las herramientas provistas por C# y Visual Stuio/Blend son excelentes para lograrlo, pero debemos estar dispuestos a hacer el reset y tener mente abierta sobre todo para comenzar aprendiendo MVVM, antes de aventurarse al mundo de las apps.

    Esto no es que aclare precisamente por qué prefiero HTML5 para las apps.

    Antes de aclararlo, quiero contarles cómo veo la situación de la otra vertiente. La de los que saben hacer apps con JavaScript.

    Como mencioné anteriormente, Web 2.0 evidenció lo que nosotros desarrolladores de software deberíamos ofrecer a los usuarios para poder masificar y triunfar con nuestros productos.

    Esto alentó a los fabricantes de software a mejorar la velocidad de interpretación de JavaScript de sus motores, tal como sucedió con el Chakra de Microsoft o el V8 de Google. De tal manera que hoy en día con puro JavaScript interpretado se pueden lograr experiencias de usuario que poco se pueden diferenciar de una app nativa. Y con la ventaja de que si a cada plataforma nativa le ponemos su propio intérprete de un JavaScript estándar, pues tendremos aplicaciones cross platform de un desempeño óptimo.

    A través de todos estos años, estas mejoras y enfoques en JavaScript han propiciado que muchos desarrolladores hayan aprendido esta tecnología que muy cierto es, por lo general es una cosa extraña para los desarrolladores .net.

    Y entonces podemos hacer una comparación: Cuántos programadores web hay, vs. cuántos programadores de apps nativas hay. Obviamente la balanza se inclina hacia los desarrolladores web, dado que han existido desde hace mucho tiempo. Ergo, existen muchos más que saben JavaScript, que aquellos que saben lenguajes nativos.

    Tanto así que la industria se ha preocupado por crear "traductores" en los cuales el desarrollador escribe código JavaScript y el traductor (por ejemplo PhoneGap) lo que hace es arrojar al otro lado código nativo bien sea para Windows Phone, iOS o Android. Esto por un lado le abre la puerta a un gran número de desarrolladores que no conocen las plataformas nativas y por otro minimiza la cantidad de código escrito cuando se deben hacer versiones de la app para las diversas plataformas.

    clip_image008

    Sin embargo, esto abre otra puerta a problemas que tienen que ver con que esas apps no pueden acceder a todo el poder nativo de cada uno de esos dispositivos, porque el conjunto de instrucciones soportadas por el traductor también debe obedecer a un mínimo común denominador para lograr ser multiplataforma, sin mencionar que la velocidad de ejecución se puede ver afectada de acuerdo a la calidad de la optimización del código que ejecuta el traductor.

    Como ejemplo, puedo mencionar que una app para Windows Phone y iPhone creada con Phone Gap a pesar de requerir solo un esfuerzo, no explotará ciertas características únicas de cada plataforma y puede que no corra tan rápido como si esas apps fueran creadas con dos esfuerzos (uno para cada plataforma). Pero para esto Microsoft descubrió una solución llamada WinJS de la cual les hablaré un poco más adelante.

    Independientemente de esto, entonces comenzamos a observar un efecto bola de nieve, en el cual entre más desarrolladores JavaScript hay, más tecnologías se ponen a su disposición. Ejemplos:

    1. NodeJS, para poder escribir backend en JavaScript haciendo especial énfasis en una altísima escalabilidad lograda en un esquema de no bloqueos en el server.

    2. TypeScript: un superlenguaje de JavaScript creado para poder formalizar y administrar proyectos JavaScript de mediano a gran tamaño, como si fuese todo un lenguaje orientado a objetos que al compilar se convierte en JavaScript estándar listo para ser usado en la aplicación que queramos. Es tan conveniente que dentro de Microsoft se usa por ejemplo en CodePlex y en Bing y ya muchos proyectos open source grandes lo están usando. De hecho Adobe anunció que lo usará como lenguaje principal para su Adobe Digital Publishing Suite, usada por cerca de 70% de los publishers del mundo y la cual se pondrá disponible para apps de Windows según lo anunciaron en el #bldwin de 2013.


    clip_image010


    3. LightSwitch, el RAD de Microsoft para crear aplicaciones de línea de negocio basadas en formularios de captura y consulta de datos, ahora en su última versión ofrece la posibilidad de programarse también con JavaScript para poder ejecutar sus pantallas en browsers sin necesidad de plugins (originalmente LightSwitch requería de Silverlight, lo que lo ponía fuera de alcance por ejemplo de los móviles).

    4. Napa: Un entorno de desarrollo de apps para Office 365 y SharePoint en el que a través del mismísimo browser podemos escribir el código de las apps que estaremos usando. Y cuál es este código? Correcto: JavaScript.

    Todo esto para mencionarles la Joya de la Corona de las implementaciones de JavaScript:

    5. WinJS: La proyección de lenguaje para JavaScript que nos permite desarrollar apps para WinRT.

    clip_image012

    Y el título de Joya de la Corona es muy bien ganado, porque esta es la primera implementación en el mundo que permite acceder de manera nativa e ilimitada a los recursos de la máquina en la que se ejecuta. Así que todo el hardware y funciones especiales del sistema operativo están abiertos para ser llamados desde código JavaScript. (La historia se remonta a IE9, en donde se permitió al objeto Canvas del browser poder dibujar animaciones usando la aceleración de hardware nativa de la máquina en la que estaba corriendo, gracias al esquema integrado que tiene el browser con Windows, produciendo animaciones de hasta 60fps)

    Esto es una gran ventaja frente al acercamiento tradicional de JavaScript en otros browsers, pues estos corren en un sandbox limitado que no da acceso a funciones críticas del sistema como dispositivos de almacenamiento, tarjeta de video o en Windows 8 por ejemplo, el acceso a los charms que traen los contratos de búsqueda o de share entre otros.

    De hecho, esta gran práctica está comenzando a ser imitada por ejemplo por Firefox que ha centrado todo su nuevo OS en HTML5, de manera que el JavaScript usado también estará accediendo nativamente los recursos de los dispositivos sobre los cuales se estén ejecutando.

    Pero volviendo al tema específico de Windows 8, si sumamos lo dicho hasta ahora al hecho de que el motor de interpretación Chakra es tan veloz, tenemos que programar una app WinRT en JavaScript no tendrá mayores diferencias en velocidad de ejecución que hacerla en C#, VB o incluso C++.

    Está claro que igual el JavaScript tiene que ser interpretado y eso tarda más que el marshaling y las operaciones de boxing y unboxing de C#. Y que esto a su vez tarda más que si la app estuviera hecha en C++ crudo. Pero esas diferencias no son notorias para un usuario en el 95% de las veces; y esto en términos prácticos permite decir que el performance es el mismo, excepto en apps supremamente especiales que requieren muchos cálculos para funcionar correctamente.

    Un ejemplo claro de la eficiencia de apps JavaScript en WinRT es el juego Cut the Rope (más de 100M de descargas a hoy), que primero fue nativo en iOS (15K líneas de código) y luego fue portado a JavaScript para poder ser ejecutado en IE9 y de allí pasó sin muchas modificaciones a WinRT.

    clip_image014

    La experiencia del juego es excelente sin importar el dispositivo: iPhone, IE, WinRT y hoy en día otros browsers como Chrome y Firefox también la ejecutan bien.

    De hecho el código de esta app en JavaScript ocupó de nuevo solo 15K líneas de código, dado que el Canvas que manejamos con JavaScript tiene muchos comportamientos predefinidos como el pixel shader que en OpenGL (la tecnología de rendering detrás de la versión nativa) no existe y toca programar con montones de código.

       Microsoft ejecutó una excelente estrategia cuando salió al mercado con su paradigma de apps para WinRT, dado que permitió a desarrolladores tradicionales seguir con su lenguaje y en cierto modo el estilo de programación acostumbrado con C# y XAML. La excelencia en la ejecución se nota porque estos desarrolladores nunca se vieron afectados ni puestos a un lado.

    Pero esto no elimina el hecho de que Microsoft también notó el inmenso auge y practicidad que trae HTML5.

    Lo dije: HTML5

    Antes de seguir hablando déjenme mencionarle las dos connotaciones de HTML5:    

    1. La purista: El sucesor de HTML4, que incluye nuevos tags como video, canvas, audio, section article, header y nav.

    2. La popular y más usada: La 1 + JavaScript moderno y CSS3.

    clip_image016

    Entonces por eso el título del post: HTML5 para APPS. El HTML5 para apps implica que la interfaz de usuario la manejamos con tags HTML más estilos, y la lógica con JavaScript. De hecho también es recomendable en las apps HTML5 usar paradigmas como MVVM (totalmente disponible para JavaScript) que permitan una clara separación entre la lógica y presentación.

    Ahora sí continuando, les contaba que Microsoft notando la relevancia y el futuro de HTML5 (connotación 2 de ahora en adelante), lo convirtió en un ciudadano de primera clase en el mundo WinRT.

    Tan de primera clase es, que muchas de las características especiales de las apps WinRT se desarrollan más fácil con JavaScript. De hecho, hay un par de cosas que no es posible hacer out of the box con VB o C# mientras que con JavaScript sí, tal como manejar el StorageDataSource: Un objeto usado en un mecanismo para mostrar imágenes en el flipview (un control contenedor cuyos elementos se pueden desplazar mediante gestos touch) sin que existan problemas de memoria cuando usamos una gran cantidad de elementos. Por ende para evitar degradación de la experiencia de usuario en C# hay que acudir a mucho código extra que en JavaScript ya viene manejado con el objeto en mención.

    Adicionalmente, Blend ha sido repotenciado para no solo manejar XAML, sino también HTML. Y las bondades y facilidad de uso ofrecida agilizan enormemente el proceso de diseño de las interfaces de usuario. De hecho, la primera versión de la nueva saga de Blend solo incluía HTML para diseño.

    Y así sucede con otros elementos únicos de HTML5 como el canvas, que para manejar gráficas ofrece muchas ventajas predefinidas, ahorrando cantidades de código.

    Esto sin mencionar que el código que escriba sobre HTML5 va a servirme si después quiero hacer la versión web de la app o si quiero hacer la versión sobre otros dispositivos. En este caso será más fácil usar un traductor para lograrlo por ejemplo, con los inconvenientes que ya les había mencionado. Pero así como Microsoft con WinRT y Firefox acuñaron HTML5 como plataforma nativa, podría suceder que otros fabricantes como Android, iOS y por qué no, el mismo Windows Phone 8 lo hagan. En este caso, podríamos tener una gran base de código reutilizable que además va a funcionar con una velocidad y alcance muy cercano al de las apps nativas.

    Si estamos conscientes de que la compatibilidad 100% no está tan cercana, entonces al menos el hecho de poder compartir una gran cantidad del código no se ve tan utópico. De hecho Microsoft (por ejemplo con la adición -ms-grid hecha al atributo display de CSS3) y Firefox (con especificaciones para manejar un calendario HTML5) han hecho propuestas al W3C para que elementos propietarios usados para aprovechar características específicas de la plataforma o para mejorar las interfaces de usuario pasen al estándar y de esta manera luego la portabilidad entre plataformas sea más posible.

    Así que ya se podrán ir dando cuenta del porqué del título.

    Otro ejemplo que puedo referenciar aquí, es uno que se gestó apenas hace unos días también gracias al gran evento #bldwin 2013 (Build Windows):

    shining

    Efectivamente, se trata de Netflix. Uno de los principales implementadores de Silverlight en el mundo.

    Sucede que el estándar de HTML5 aún no dicta cuál es el mecanismo para ofrecer medios audiovisuales con DRM: un tema supremamente importante si eres una empresa legal que hace streaming de películas. Silverlight siempre ha sido líder en la implementación de DRM y para Netflix, esta era la única opción sencilla de estar fácilmente en Windows y MACs a través de cualquier browser que soportara el plugin: IE, Chrome, Firefox y en cierta medida Opera. En Linux algo se logró con Moonlight del equipo mono.

    Pero llegaron los dispositivos y con ellos cada fabricante fue muy celoso de dar soporte a plugins. Por ejemplo iPhone jamás ha soportado Flash. Y así sucedería con Silverlight. Entonces el tema del plugin no ayuda mucho a la presencia a través de todos los dispositivos. Silverlight es muy útil para desarrollar aplicaciones altamente amigables con el usuario en ambientes controlados donde la instalación de un plugin no tiene problema (Aplicaciones LOB en una intranet por ejemplo) Pero para el consumer masivo, definitivamente la historia de la industria nos llevó a otro lado.

    Viendo esto, Microsoft ha estado trabajando en una propuesta de manejo de DRM dentro de HTML5 a través de IE11. Y esto se puede ver hoy en vivo, si tiene el preview de Windows 8.1 que incluye la versión 11 del browser. Así que Netflix, ha encontrado por fin una luz que alentaría la posibilidad de tener un solo desarrollo HTML5 que corra al menos en todos los browsers y sea “ fácil” volverlo nativo para los dispositivos móviles, si es que hace falta en aparatos que digan soportar el estándar.

    Por ahora, la implementación que Netflix hace sobre IE11 no es estándar, pero funciona bastante bien. Aún requiere algo de trabajo para ofrecer opciones avanzadas como por ejemplo escoger idioma y subtítulos, así como opciones para compartir con el social media desde la reproducción como tal (cosas que sí tiene el cliente Silverlight).

    Microsoft trabaja muy de cerca con el W3C y obviamente propondrá su implementación de DRM para convertirla en un estándar que todos los browser implementen. En otros browser como Chrome y Firefox, por ahora la experiencia Netflix sigue siendo a través de Silverlight.

    Lo más interesante de todo esto, es que este IE11 que soporta DRM a través de HTML5, tiene el MISMO CORE de interpretación de HTML5 y de ejecución de JavaScript que viene con Windows 8.1. Así que al menos en lo que tiene que ver con Windows, para Netflix se hace realidad el sueño de programar una app que corra igual en el browser o en la plataforma nativa!

    Y mejor aún, las innovaciones que trae IE11, ergo las apps HTML5 de Win8.1 no paran allí. Otra ejemplar inclusión es el soporte a WebGL! La famosa api de JavaScript que permite acceder directamente a la tarjeta de video para renderizar gráficos en 2D y 3D sin necesidad de plugins. Propuesta originalmente por la fundación Mozilla, hoy es ampliamente soportada por ese Firefox, Chrome e IE11. Otros como Safari y Opera dicen soportarla, pero la tienen deshabilitada por defecto. Si quieres ver si tu browser la soporta, has click en la imagen.

    image

    Entonces, todos esos excelentes desarrollos gráficos existentes en la Web hoy en día basados en WebGL están disponibles para ser renderizados nativamente en las apps HTML5 de Win8.1 directamente y con mínimos esfuerzos!!!

    Pero… Wait a Minute… entonces, todo esto no va a estar disponibles para las apps XAML en WinRT?

    Nada más alejado de la realidad. A partir de Windows 8.1, el WebView control de XAML ha sido optimizado enormemente y va a permitir por ejemplo que su contenido sea asignado localmente: tú le pasas el HTML/HTML5 que quieras al control y este lo renderiza usando los motores de IE y de las apps HTML5 de Windows 8. O sea, que todas las funciones van a estar completamente disponibles.

    Vean; en síntesis, son estos puntos:

    1. C# es mi lenguaje de backend predilecto y difícilmente habrá uno mejor.

    2. El modelo de apps supone un nuevo paradigma que se ajusta mucho a implementaciones del tipo MVVM que no son usuales por ejemplo cuando trabajamos en backend.

    3. JavaScript y en general HTML5 está adquiriendo un alcance global y es recomendable aprenderlo si como developer consideras que alguna vez estarás desarrollando algo de front end en tus aplicaciones.

    4. El enfoque favorable que se le ha dado a HTML5 en WinRT, hace que algunas tareas se desarrollen más fácil y rápido con esta tecnología. Se hace más natural el desarrollo de apps que con XAML.

    5. Hacer un desarrollo en HTML5 aumenta la probabilidad de que tenga un paso muy sencillo hacia otras plataformas.

    Dado lo anterior, no cambio a mi C# para backend por nada. Pero si tuviera que cambiar de paradigma de desarrollo y aprender uno nuevo para hacer apps, por qué no mejor aprovechar y aprender también un nuevo lenguaje de programación más apropiado para estas implementaciones que además me abrirá las puertas a otros mundos como Front End en Web, NodeJS, LightSwitch, Napa y muchos más?

    Además me resulta gratificante no tener que ver mermado todo el poder de .net al que estoy acostumbrado, porque las implementaciones de apps así lo exigen.

    Así mi mente se sentirá más cómoda sabiendo que si estoy en backend se puede configurar en modo C#, pero si estoy haciendo una app o una interfaz web, entonces se pasa al modo JavaScript con MVVM y todo incluido.

    Es por eso que prefiero HTML5 para WINRT apps.

  • WarNov Developer Evangelist

    Visual Studio 2013 y Apps Windows 8.0 y 8.1

    Los dos últimos fueron días muy interesantes y de instalar muchos updates y conocer muchas novedades.

    En este thread de Facebook pueden encontrar el paso a paso de las novedades declaradas en el Keynote 1 del Build 2013, dedicado especialmente al lanzamiento del preview de Windows 8.1. Y en este el Keynote 2.

    Este lanzamiento estuvo acompañado de otros como el de los preview de Visual Studio 2013 y el Framework .net 4.5.1.

    Interesantemente, me vi tentado a descargar el preview de VS2013 primero.

    Cuando lo tuve listo, lo instalé sobre una de mis máquinas con Windows 8.0.

    Aquí me llevé una sorpresa, al ver que no aparecían templates para desarrollar Windows Store Apps!

    image

    Entonces esperé a que bajara la ISO del instalador del preview de Windows 8.1 y cuando estuvo lista la instalé en otra máquina actualizando desde Windows 8 a Windows 8.1 sin mayores problemas.

    Obviamente después de instalarla instalé allí de nuevo el preview de VS2013 y tal como lo supuse, allí si obtuve los templates de Windows Store Apps.

    Con todo el deseo de formalizar el conocimiento que había adquirido experimentalmente, consulté con el gran Soma Somasegar (Vicepresidente de la División de Desarrolladores en Microsoft), quien muy amablemente me confirmó lo siguiente:

    Apps de Win 8.0:
    - Se pueden CREAR solo desde VS2012 sobre WIN8.0/WIN8.1
    - Se pueden EDITAR/COMPILAR desde VS2012/VS2013 sobre WIN8.0/WIN8.1

    Apps de Win 8.1
    - Se pueden CREAR/EDITAR/COMPILAR Solo desde VS2013 sobre WIN8.1

    Esto explica perfectamente por qué los templates para nuevas apps solo aparecen con VS2013 en WIN8.1.

    Personalmente lo entiendo como una forma de estimular que en adelante enfoquemos las apps a WIN8.1 por defecto, a menos que sea un caso supremamente exótico que requiera que vayan para WIN8.0, en cuyo caso deberemos recurrir a VS2012.

    Tengamos en cuenta que el upgrade a WIN8.1 será gratuito y automático. Así que es raro querer hacer una nueva app para WIN8.0. Además que TODAS las apps de WIN8.0 se ejecutan correctamente en WIN8.1 sin necesidad de ningún update.

    appsok 

    Que hay de Windows 7?

    Amablemente me comentó @jramirezdev que intentó instalar el preview de VS2013 en Win7 y no pudo, ya que el instalador le pide IE10. Así que para poderlo instalar en Win7 es menester instalar IE10, que claramente indica que VS2013 solo puede ser instalado en Win7 o posteriores.  

     

  • WarNov Developer Evangelist

    LightSwitch: Replicando Cambios de Base Datos a Windows Azure - ERROR: Incorrect syntax near 'MULTI_USER'

    Este vago, vaguísimo error, que se presenta cuando desplegamos una solución de LightSwitch a la nube, es totalmente aterrador y deja inusable nuestra solución.

    image

    Después de experimentar bastante, detecté que sucede cuando hago cambios a la estructura física de la base de datos en desarrollo, sobre objetos ya existentes en el despliegue anterior. Por ejemplo eliminar una columna de una tabla, quitar una relación, cambiar nombres de columnas, etc. Etc.

    En general, cuando se habla de eliminación o actualización de elementos físicos de la DB de LightSwitch en Azure (que obviamente es una SQL Azure), puede ocurrir que el asistente de despliegue no logre hacer esas modificaciones a la DB, y termine arrojando ese abstracto error con el que arranqué el post.

    Es por esto que cuando estemos haciendo desarrollo de mejora continua sobre nuestra solución de LightSwitch, es necesario estar muy pero muy pendiente de cuándo hacemos este tipo de cambios sobre la solución. Recomiendo anotarlos muy detalladamente. Pues si el despliegue falla con el error que les he mencionado, tendremos que usar esa lista para reproducir exactamente los cambios físicos de la DB en producción.

    No habrá otra alternativa que ejecutar estos cambios manualmente y realizarlos con tanto cuidado, que reflejen exactamente lo que se cambió en desarrollo muy probablemente de manera visual a través de los Wizards y Designers de LightSwitch.

    Esto no ocurre siempre. Si por ejemplo los cambios incluyeron la adición de una nueva tabla o una nueva relación, en general esto no presenta problemas. La adición es manejada con más efectividad. Sin embargo siempre es bueno llevar un log de los cambios físicos de la base de datos, por si algún cambio no es realizado correctamente en producción, poder ir a ejecutarlo manualmente.

    Una vez ejecutamos esos cambios y dejamos la DB en el estado esperado, el deployment funcionará correctamente y podremos volver a respirar tranquilos.

  • WarNov Developer Evangelist

    LightSwitch: Aprovechando TFS Online para su uso

    Por su estructura de RAD, LightSwitch puede presentar ciertos comportamientos que no predeciríamos fácilmente de acuerdo a lo que conocemos de .NET.

    image

    Por ejemplo existen archivos de modelos y diseño que se ven afectados por los cambios que se hagan en cualquier formulario que se presente al usuario.

    Por ende un entorno de desarrollo compartido aún no es soportado, dado que un developer modificando un formulario de inmediato causaría un conflicto con otro desarrollando otro formulario totalmente distinto, cosa que no debería pasar.

    Sin embargo, para un solo desarrollador el control de código fuente sigue siendo muy útil para volver a versiones anteriores o desarrollar desde máquinas distintas.

    En este caso es útil tener en cuenta los siguientes hechos del funcionamiento especial de LightSwitch:

    1. La base de datos de desarrollo no se almacena en el Source Control. Pero es muy fácil copiarla y pegarla de un equipo a otro. No es sino copiar y pegar la carpeta Data con la base de datos que se pretende usar en desarrollo.

    2. Asegúrese de excluir la carpeta de paquetes del código fuente, si ha usado Nuget en algún momento. (Esto le evitará estar cargando elementos innecesarios al TFS)

    3. Es probable que cuando haga Get Latest Version en un equipo, este no arranque correctamente la app. Es necesario entonces que se traiga todo el contenido de la carpeta del equipo donde se originó el desarrollo y éste sea copiado y pegado en la misma ruta del equipo de destino. Lo único es que no se sobreescriba ningún archivo solo se copien los archivos que están en la carpeta original y no en la de destino. Esto es, porque el Check In original no incluye atuomáticamente algunos archivos requeridos para correr bien la solución en el equipo de destino.

    Una vez solucionado esto, ya se puede trabajar con confianza en las diversas máquinas que uses.

  • WarNov Developer Evangelist

    XBOX ONE: Verdades de la revolución digital del gaming

    Esta es la mejor época para los geeks.

    La velocidad con la que encontramos novedades en el mercado no tiene igual en la historia.

    Tristemente, muchos usuarios y lo peor, bloggers y personas con acceso a la amplificación que provee el social media, no saben acoger estos avances. Y por el contrario aprovechan la información que se produce con las novedades tecnológicas para conseguir un pequeño beneficio inmediato propio, como lo puede ser tener un poco más de hits en sus stats.

    Por ejemplo, he visto a fans de XBOX decir que la PS4 es una caja de zapatos.

    Como si la Xbox One no fuese súper cuadrada al punto de que los fans de PS4 dicen que parece un Betamax.

    xboxplay

    Sin embargo lo que noto y me alegra para mi gusto, es que estos nuevos diseños dejaron atrás ese infantilismo que representa una consola de videojuegos con apariencia de nave espacial.

    Algunos queremos tener un living room, sala de tv, estudio o como ud lo llame que se vea sobrio y donde los aparatos que acompañen al 52" no sean intrusivos... en dos palabras: no traquetos...

    Creo que son dos diseños muy elegantes y ambos me gustan.

    Y en el caso de Xbox, el diseño es absolutamente intencional. Xbox One es una plataforma para usuarios vanguardistas que desean tener una experiencia totalmente integrada con todo su centro de entretenimiento. A tal punto que actúa como receiver, para poder controlar la televisión por cable o la música desde la grandiosa interfaz ofrecida por Kinect, que se opera por voz. Es por esto que una apariencia de este estilo es mucho más conveniente, pues combina mucho mejor en el ambiente y no se ve como un aparato raro que por accidente dejó el niño por ahí botado.

    Obvio que poder acceder a todas estas ventajas implica que la plataforma haga cosas que para muchos usuarios no son propias de una consola; de hechos para algunos es hasta pecado! Por ejemplo, estar frecuentemente conectada a internet.

    Si la consola no está conectada frecuentemente, entonces no podríamos correr juegos de carreras contra los avatares de nuestros amigos. Tampoco podríamos lograr que las últimas estadísticas de Messi se vieran reflejadas en nuestro juego de FIFA para reflejar el estado real del jugador... de hecho cosas tan sencillas como ver una película en Netflix, requiere que la consola tenga acceso a Internet. Desde que tengo mi XBOX 360, siempre la he mantenido conectada a internet y no se me ha caído ningún brazo y tampoco me siento pecador.

    Ud usuario que me lee en este momento: en serio no tiene internet permanente en el lugar donde reside? No está ahora conectado desde un equipo que tiene internet permanente?

    Obviamente, existen por ejemplo los tripulantes de submarinos atómicos que cuando están en su trabajo no tienen Internet frecuentemente, ni nunca, de hecho. En estos casos y otros no tan extremos, la experiencia de XBOX One no se va a poder tener. Para eso está la Xbox 360 a la que le hemos hecho hasta un rediseño para que los que quieran o tengan que quedarse en el estilo de juegos de hoy en día, lo puedan hacer sin problemas. Pero esto no nos puede detener en el avance. No nos puede detener el ánimo de ofrecer mayor funcionalidad y servicio.

    Es como si cuando se ideó el CD como medio de distribución de música, este proyecto se hubiese detenido porque la gente tenía equipos de sonido solo con casetera.

    casette

     

    De hecho, el mismo surgimiento de los CDs desplazó la vieja tecnología de cintas y comenzaron a aparecer aparatos que se hicieron cada vez mejores y baratos.

    Si nos hubiéramos atenido a los casettes, los lapiceros allegro seguirían siendo populares por su capacidad de "rebobinar" manualmente dichos casettes, para ahorrar la batería del reproductor portable.

    Por el contrario, si llegamos al punto en el que los juegos se distribuyan de manera digital masivamente; al igual que ha pasado con servicios como Netflix, Hulu, iTunes, etc, tendremos aún más motivo para que la sociedad implemente en mayor medida el acceso permanente a internet, hasta el punto de poderlo encontrar tan fácil como un tomacorriente. Sin mencionar que al integrar nuestros juego con el mundo online, tendremos una experiencia memorable no obtenida hasta ahora.

    Cómo hemos comenzado el proceso de digitalización total de los juegos?

    Funciona de la siguiente manera:

    1. Compras un disco (veremos como poco a poco compras menos discos y en vez de esto, haces una compra online y te bajas el contenido)

    2. Llegas a tu consola y activas ese disco a través de tu Microsoft Account.

    Esta activación de da un token de propiedad digital.

    3. Juegas

    Preguntas?

    Si:

    1. Pueden jugar otros usuarios en la misma consola ese mismo juego aún con una Microsoft Account distinta?

    R. Sí. Todos los usuarios que jueguen el juego en la consola en que se activó podrán jugar el juego.

    2. Puedo prestar mi juego a un amigo para que él juegue?

    R. SI!!! Y esto es lo que los blogs sensacionalistas no cuentan y lo que los fans mal informados no conocen!

    Los juegos se pueden prestar hasta a 10 amigos que están en una lista editable.

    Si una persona en esa lista ha estado por más de 30 días, en ese caso califica como un amigo al que se le puede prestar el juego.

    Entonces ese amigo recibe el disco, lo pone en su consola la consola valida que el juego es tuyo, mira tu lista de amigos y lo valida y le permite jugar.

    Como ven, es una medida que nos permite compartir nuestra propiedad, sin incurrir en la piratería que amenaza a la industria.

    Pero más allá de esto, lo que nos permitirá este sistema a futuro, será prestar nuestros juegos sin necesidad ni siquiera de un disco, porque no hará falta verificar la propiedad con el disco, pues tu cuenta Microsoft tendrá asociados los juegos que has comprado y descargado. Entonces un amigo podrá ver tu lista y solicitar el préstamo del juego. Tú lo autorizas y entonces el amigo se baja el juego en su casa y juega. Así de sencillo.

    La elaboración un poco avanzada de este mecanismo de préstamo para los bloggers que no se informan bien antes de escribir o que sencillamente tergiversan toda la información para su propio beneficios se convierte en un simple titular amarillista como este: "Xbox One no te permite jugar juegos prestados".

    3. Puedo vender mi juego usado y comprarme otro usado?

    R. SI!!! Hemos declarado oficialmente que existirán mecanismos en los que el token de propiedad digital que obtenemos cuando se activa por primera vez el juego, se va a poder comerciar. Si bien no hemos publicado cuáles serán esos mecanismos, lo que sí está claro es que Microsoft en ningún momento cobrará fees cuando se hagan esas transacciones.

    Y también quedó claro que los publishers tienen la potestad de decidir si permiten este tipo de transacciones o no. OJO, que esto mismo pasa con el PS4 que a pesar de promulgar en la rueda de prensa del E3 que no iban a impedir la reventa de títulos, luego en un espacio más reducido declararon que igual el Publisher era quien al final tenía la decisión.

    Nuevamente, el sistema de token, es el que permitirá transferir propiedad digital. Como el camino es hacia eliminar los caros, poco ecológicos e inseguros discos, cómo vas a hacer para vender uno si no tienes algo que represente tu propiedad? Pues bien, para eso van a estar los tokens.

    Este sistema parece que nubló también la mente de todos esos amarillistas que sencillamente escribieron: "Xbox One no permitirá la reventa de títulos

    Kinect 2 y Precio

    He recibido quejas de otros personajes disgustados porque la Kinect 2 siempre debe estar encendida y escuchando. Esto es falso. El usuario la puede configurar para que siempre esté totalmente apagada. De nuevo el asunto es que para poder disfrutar de todo su poder, lo mejor es tener el sistema de escucha siempre encendido. Francamente no veo como más lograr que podamos encender todo el sistema con la voz, si la Kinect que es la que escucha, está totalmente apagada.

    Pero esto no quiere decir que no se pueda jugar sin Kinect. Si el juego no está basado en Kinect en su core, por ejemplo un Forza, no es obligatorio usarla, no problem!

    Hoy en día tengo la Kinect con la Xbox 360 y siempre que llego al living siento que disruptivo el que tenga que encender la Xbox con las manos o con un control, para después todo operarlo con la voz. I mean, si llevo una bandeja con palomitas y una bebida, el tema de encender la consola ya me obliga a incomodarme, viendo que luego de esto ya podría hacer todo sin usar las manos. Entonces, obviamente, necesitamos que el sistema de escucha esté encendido permanentemente.

    Dice la queja: Pero es que Microsoft va a escuchar todas las barbaridades que digo e invadirá mi privacidad enviándome spam en los correos de acuerdo a las palabras que nos oiga... y entonces yo digo... Reeeeeeeeally? Are you serious?

    Si hay una compañía que se preocupa por proteger la privacidad de los usuarios, esa es Microsoft y lo digo por experiencia propia:

    O sea, de quererlo hacer, pondríamos una política de uso para que pudiéramos husmear los correos de los cientos de millones de usuarios de Outlook que tenemos hoy en día de manera que pudiéramos hacer ese asunto del spam. No way!

    Además en los términos de uso, se hace claro que Microsoft no grabará ni subirá a Internet las conversaciones que capte la Kinect.

    La gente se deja enceguecer tanto, que prefiere pensar: Microsoft me va a hacer espionaje de todo lo que diga... son malos, sigamos con lo de siempre.

    En vez de quitarse la venda y visualizar un escenario como este:

    Llegas, te sientas en el sofá y comenzar a hablar:

    Xbox On

    Netflix

    Fringe

    y ver la serie...

    Luego:

    Xbox

    MTV

    Y luego al ver que son puros realities,

    XBOX

    Forza

    Y observar el resultado de las carreras que tu Avatar de Inteligencia Artificial que aprendió a jugar como tú, corrió contra tus amigos mientras tú estabas trabajando o en la U.

    Luego dices:

    Xbox

    Poker Stars

    Y juegas una partida de póker contra tus amigos y los engañas con tu póker face a través del reconocimiento de los gestos que puede hacer la Kinect, sin mencionar que además puede hasta medir tu ritmo cardíaco...

    Con todo esto, no entiendo cómo se quejan porque vale 100 dólares más que una PS4, viendo que la Kinect 2 viene incluida out of the box.

    USD$500 es un precio menor al de algunos smart phone libres... así que: c'mon... estás obteniendo mucho más por el precio que estás pagando!!!

    Para mí definitivamente este es el futuro de los video juegos y estoy orgulloso de que Microsoft haya sido el primero en tomar este bold step, aún arriesgándose a generar todo el buzz negativo que se ha generado por la misma naturaleza de la web y el social media de hoy en día, que permite que cualquiera que diga algo ligeramente sensacionalista sea amplificado, aun cuando sus mensajes no hayan sido documentados debidamente.

    Es por esto que fui de los primeros en hacer la pre orden de esta revolucionaria consola, que de seguro me traerá muchas más comodidad y una experiencia de usuario totalmente integrada en lo que quiero sea mi sistema de entretenimiento casero:

    preorder 

  • WarNov Developer Evangelist

    Exportando SQL Data desde Visual Studio

    No me digan que ustedes no han tenido la necesidad de pasar datos con los que han hecho pruebas de una Base de Datos a otra.

    Generalmente para lograr esta tarea uno se metía al SSMS y exportaba los datos a un archivo y luego se importaba ese a la DB requerida. Otras alternativas más elaboradas incluían hast Integration Services.

    Visual Studio es la casa del desarrollador, y por ende ofrece muchas comodidades. En este caso, vemos como solo con un click es posible extraer los datos de una tabla de SQL a un script con los Inserts ya listos para pasarlos a otra tabla.

    En este cortísimo Video Snippet les muestro como lograr esta tarea en la versión 2012:

  • WarNov Developer Evangelist

    WebMatrix: Personalizando el Editor de Código

    Este video que te toma menos de 3 minutos te enseña cómo poder personalizar el editor de código de tu WebMatrix.

    WebMatrix no ofrece de manera nativa un mecanismo para hacer estas personalizaciones, pero si ofrece un rico esquema de extensibilidad que ha permitido por ejemplo la existencia de la extensión ColorThemeManager que gracias a la integración con el sitio http://www.studiostyle.es permite descargar temas exportados desde Visual Studio y subidos a studiostyles para importarlos en WebMatrix como tal.

    Para lograrlo, basta con crear un tema en Visual Studio a través del menú Tools->Options->Fonts and colors.

    image

    Luego lo exportamos a través de Tools Import and Export Settings

    image

     

    Acto seguido lo subimos a http://www.studiostyle.es y ya estará listo para descargar en WebMatrix siempre y cuando tengamos la extensión mencionada.

    No es necesario crear un tema en Visual Studio. Se puede bajar cualquiera ya hecho de los cientos que hay en http://www.studiostyle.es, tal como lo vemos en el video:

  • WarNov Developer Evangelist

    App Review: Splashtop2 for Windows Phone 8

    De manera gratuita hasta el 31 de agosto, podrás descargar para tu Windows Phone 8 la app Splashtop2.

    Desde hace tiempo estaba esperando una app de manejo remoto (Remote Desktop Connection) de Windows como esta! Me permite acceder a mis PCc directamente desde el phone. Puedo ver y editar archivos, hacer streaming de películas HD, jugar y más! La transmisión de video se hace con velocidades de hasta 30 cuadros por Segundo!!!

    wp_ss_20130523_0001

    Screenshot de mi Visual Studio 2012 operándose desde mi Windows Phone 8.

     

    Basta con que instales la app en tu phone y la aplicación Splashtop Streamer en tu PC:

    PC:

    Splashtop.com

    Phone:

    Splastop2 App

    image 

  • WarNov Developer Evangelist

    XBOX ONE

    Una nueva visión para el futuro se hace hoy realidad con la presentación de Xbox One de Microsoft Corp., el sistema de juego y entretenimiento todo en uno diseñado y pensado para hoy y la nueva generación. En una exhibición en las oficinas centrales de Microsoft en Redmond, Washington, la compañía demostró cómo Xbox One te coloca en el centro de todos tus juegos, programas de TV, películas, música, programas deportivos y Skype.

    “Xbox One está diseñado para ofrecer una nueva generación de exitosos videojuegos, televisión y entretenimiento en un poderoso dispositivo todo en uno”, comentó Don Mattrick, Presidente de Interactive Entertainment Business de Microsoft. “Nuestra exclusiva y moderna arquitectura brinda simplicidad a la sala y por primera vez en la historia la capacidad de cambiar de manera instantánea entre tus juegos y tu entretenimiento”.

     

     

    Xbox One

    Con Xbox One, los juegos superan los límites de lo real y la televisión obedece tus comandos. Di "Encender Xbox" para iniciar tu pantalla de inicio personalizada de Xbox One, descubre cuáles son los programas populares en la TV o ve los últimos logros de juegos de tus amigos, todo esto utilizando la interfaz más natural: tu voz. Mientras más interactúes con Xbox One, te conocerá mejor y aprenderá cuáles son tus gustos. Algunas de las revolucionarias características de Xbox One que te colocan en el centro del entretenimiento en la sala de tu casa incluyen:

    TV en Xbox One. Navega y ve programas de televisión en vivo desde la conexión de tu decodificador de cable, o set satelital a través de tu Xbox One. Microsoft está comprometido con hacer llegar la señal de TV en vivo a través de diversas soluciones a todos los mercados donde estará disponible Xbox One.

    Home Screen. Enciende tu sistema de entretenimiento pronunciando dos poderosas palabras, "Encender Xbox" y un tablero de inicio con diseño personalizado te dará la bienvenida presentándote tus juegos, programas de TV y entretenimiento favoritos.

    Snap View Podrás hacer dos cosas al mismo tiempo en la pantalla de tu casa. Utiliza Snap para participar en una batalla con varios jugadores, mientras ves tu película favorita; conversa con amigos por Skype al mismo tiempo que ves programas de TV en vivo, o sigue al equipo de tus sueños en TV mientras ves un gran juego y mucho más.

    Skype para Xbox One: Especialmente diseñado para Xbox One, conversa con amigos en tu televisor en impresionante alta definición, o por primera vez en la historia, mantén una llamada grupal de Skype en tu televisión.

    Trends Mantente al tanto de lo más visto en TV descubriendo el entretenimiento que es más popular entre tus amigos, y ve aquello que marca tendencias dentro de la comunidad Xbox.

    ONE Guide: Encuentra fácilmente tu entretenimiento favorito, buscando por red, nombre u horario todo a través del sonido de tu voz y presentado en una guía de programas personalizada.

    Para crear el sistema Xbox más avanzado que jamás se haya diseñado para juegos, TV y entretenimiento, Microsoft creó un sistema operativo de vanguardia y lo fusionó con una plataforma de entretenimiento igualmente sorprendente, de modo que no tengas que cambiar las conexiones para ver la TV o jugar un videojuego. Un procesador x86 de ocho núcleos y más de cinco billones de transistores ayudan a que el retraso y los tiempos de carga sean algo del pasado para que puedas, de manera instantánea, pasar del juego al entretenimiento a la velocidad de la luz o ejecutar un grupo de aplicaciones al mismo tiempo sin que haya ninguna pérdida en el desempeño.

    Títulos y Material exclusivo de Xbox One

    Jugar con Xbox One sumerge a los jugadores en mundos cinemáticos que parecen reales, con personajes que se ven más humanos que nunca. Exitosos títulos presentados para Xbox One incluyen los siguientes:

     

    Forza Motorsport 5 de Turn 10 Studios es la última edición de la franquicia de juegos de carreras mejor calificada de los últimos 10 años.3 Diseñado desde cero para sacar provecho de  Xbox One y del infinito poder de la nube, ningún otro juego entrega mejor la sensación de estar al volante. “Forza Motorsport 5” establece un nuevo estándar para los juegos de carreras y estará disponible de manera exclusiva para el lanzamiento de Xbox One.

    Call of Duty: Ghosts es la siguiente generación de “Call of Duty” y un avance extraordinario para la franquicia. El juego brinda un nuevo mundo, personajes e historias totalmente nuevos, diseñados a partir de un nuevo motor de última generación. Las avanzadas técnicas construidas para soportar las increíbles mejoras en la mecánica del juego hacen de esta la experiencia “Call of Duty” más envolvente y jamás vista. Activision y Microsoft anunciaron también la renovación de su estrecha colaboración que verá el regreso de “Call of Duty® Championship”, presentado por Xbox, como contenido descargable totalmente nuevo que hará su debut exclusivo en la plataforma Xbox.

    “FIFA 14”, “Madden NFL 25”, “NBA Live 14” y “EA SPORTS UFC” de EA SPORTS cambiarán la manera en que los consumidores experimentan y juegan los videojuegos de deportes. Impulsados por el nuevo motor de EA SPORTS, estos nuevos juegos ofrecerán enormes innovaciones en cuanto a inteligencia humana, movimientos reales del jugador y mundos vivos. Además de su compromiso con Xbox One, EA SPORTS anunció su promesa de contenido exclusivo que se anunciará en los próximos meses.

     

    “Quantum Break” de Remedy Entertainment es una revolucionaria experiencia de entretenimiento de los creadores de “Max Payne” y “Alan Wake” que difumina la línea entre los juegos y la TV al integrar elementos dramáticos y mecánica de juego a una experiencia uniforme y excepcionalmente envolvente. La manera en que se juegue el afecta al programa, y dicho programa informará cómo se debe jugar el juego.

    Además de la increíble gama de juegos que estarán disponibles para Xbox One, Microsoft presentó asociaciones para desarrollo de contenidos exclusivos con algunos de los principales nombres en TV, deportes y entretenimiento.

    La serie para televisión “Halo”. El galardonado productor y director Steven Spielberg será el productor ejecutivo de una serie para televisión de “Halo”, que tendrá contenido interactivo exclusivo para Xbox One, creado en conjunto con 343 Industries y Xbox Entertainment Studios.

    National Football League (NFL) Una asociación histórica de varios años ofrecerá lo último en  experiencia interactiva televisiva de la NFL para Xbox One y aprovechará los dispositivos y servicios de Microsoft para evolucionar tanto dentro como fuera de la cancha. La NFL en Xbox redefinirá la experiencia de transmisión a través de las innovaciones en torno a Skype, Xbox SmartGlass y los accesorios tecnológicos que el jugador puede usar; agregará una solución de fútbol virtual totalmente nueva para la pantalla más grande de la casa; y creará un destino NFL personalizado disponible únicamente en Xbox One.

    Xbox Live (Nueva Generación)

    Xbox One está diseñado para potenciar una nueva generación de Xbox Live que sea más poderosa, personal e inteligente. Desencadenar el poder virtual de Xbox Live hace que todo sea más conveniente y accesible, desde permitir la instalación de juegos por segmentos para que la mecánica de juego pueda empezar más rápido, hasta descargar actualizaciones en segundo plano. Guarda y almacena tu perfil personalizado, tus juegos y entretenimiento para poder acceder a ellos en cualquier momento, desde cualquier consola Xbox One.4 Además, las membresias Xbox Live Gold de  Xbox 360 se transferirá sin problemas a Xbox One.5 Xbox Live te permite sumergirte en tus juegos favoritos con características totalmente nuevas.

    Smart Match. El nuevo sistema de coincidencias Smart Match prácticamente elimina el periodo de espera al calcular los tiempos y encontrar personas con quienes te gustaría jugar mientras disfrutas de otras actividades; la reputación es fundamental y ayuda a encontrar las mejores coincidencias.

    Living Games Mundos dinámicos y vivos que evolucionan y mejoran mientras más juegues, e inteligencia artificial avanzada que puede aprender a jugar como tú, de modo que tus amigos puedan jugar contra tu sombra.

    Logros expandidos. Un nuevo y expandido sistema de logros captura tus momentos épicos en video, continúa aumentando los logros de un juego al paso del tiempo y te recompensa en forma novedosa, transfiriendo tu puntaje de jugador desde tu Xbox 360.

    Xbox SmartGlass Xbox SmartGlass es una parte nativa de Xbox One, plataforma desarrollada desde el inicio con la capacidad de proporcionar contenido directamente en tu dispositivo; y ahora es posible conectarse a más dispositivos al mismo tiempo para las opciones de entretenimiento multijugador.

    look and feel

    El nuevo hardware de Xbox One es elegante y moderno y complementa cualquier tipo de decoración. La forma de la consola tiene una relación de aspecto 16:9 y emplea una orientación horizontal optimizada para su unidad de disco Blu-ray de alta velocidad. Está moldeada en un color negro líquido e incluye un característico borde biselado.

    El completamente rediseñado sensor Kinect de 1080p es más preciso, más receptivo e intuitivo. Su incomparable tecnología de visión, movimiento y voz le permite sumergirse en los juegos y el entretenimiento como nunca antes al expandir extraordinariamente su campo de visión y fidelidad. Funciona en casi cualquier condición de iluminación, reconoce el control de movimiento preciso desde una ligera rotación de la muñeca, y distingue tu voz incluso en una habitación ruidosa mediante un avanzado aislamiento del ruido.

    El control Xbox, líder en su clase, se actualizó con más de 40 innovaciones técnicas y de diseño. El mando direccional actualizado, la palanca de pulgar y el ajuste ergonómico generan una experiencia envolvente para todos los jugadores exclusiva de Xbox y se ha aumentado de manera radical la precisión y el control con nuevos gatillos de pulso con vibración.6 El control inalámbrico de Xbox One está diseñado para funcionar junto con el nuevo Kinect, permitiendo que ambos elementos se vinculen automáticamente para crear una perfecta sincronización del jugador.

    Xbox One se lanzará en los distintos mercados del mundo más adelante este año a nivel mundial. Visita el nuevo blog de Xbox Wire en http://news.xbox.com para conocer con mayor profundidad las características del nuevo sistema e incluso acceder a fotografías y videos del evento de presentación y el contenido de Xbox nuevo y con actualización continua. Más detalles de Xbox One y juegos estarán disponibles en la feria Electronic Entertainment Expo del mes de junio.

  • WarNov Developer Evangelist

    NodeJS: Shared State Concurrency y WebMatrix

    Este post tiene como objetivo tratar dos temas en paralelo.
    En primera medida, quiero mostrar cómo con WebMatrix 3.0, podemos crear sitios wen 3 plataformas distintas:
    1. PHP
    2. ASP.NET (Razor)
    3. NodeJS
      

    De esta manera, estaremos creando la misma aplicación web usando las tres plataformas y todo esto solo en 15 minutos.

    El segundo tema que quiero tratar en paralelo es una particularidad en NodeJS que es muy importante tener en cuenta a la hora de manejar el estado de una aplicación Web, pues el comportamiento es bien distinto a lo esperado en ambientes como PHP o .NET.

    Gran parte de la discusión acerca de Node.js está centrada en sus capacidades para atender mucha, pero mucha concurrencia.

    En términos simples, Node es un framework que ofrece a los desarrolladores una manera poderosa para diseñar aplicaciones de networking que se van a ejecutar realmente bien en comparación con otras soluciones del mainstream, SIEMPRE Y CUANDO, los desarrolladores comprendan los tradeoffs o las trampillas que pueden existir detrás de lo que hace que Node se comporte tan bien.

    Y cuando hablamos de esto, básicamente estamos hablando de Shared State Concurrency o Concurrencia de Estado Compartido. A qué me refiero con esto?

    Básicamente a que en NodeJS no hay una separación de sesiones en cada llamado al server, porque en Node, todo corre en un solo hilo, a diferencia de PHP o .NET. Por esto, es muy importante ser supremamente cuidadosos con la forma en que Javascript accede a las variables de la aplicación, pues cualquier modificación afectará al resto de los llamados.

    Esto, obviamente no quiere decir que manejos de información por sesión no se puedan lograr. Solo que se ejecutan de una manera distinta a como estamos acostumbrados.

    Para ejemplificar esta situación, he creado estas tres páginas web dinámicas que hacen lomismo: Inicializan un arreglo de strings, lo muestran en la página y luego lo eliminan. En ASP.NET y PHP, se espera que cada vez que un usuario ingrese, el arreglo se reinicie, mostrando siempre elementos. Pero en NodeJs esto no ocurre dado que Node corre sobre un solo hilo. Entonces cuando el arreglo se elimina y un nuevo usuario hace una petición al sitio, éste va a encontrar el arreglo vacío, pues el estado se comparte con todos los requests.

    Veamos el código para cada caso y luego un video con la demostración:

    PHP

    <?php 
    $metallicaAlbums=array( '...And justice for all', 'Ride the Lightning' );
    ?>

    <html>
    <
    body>
    <?php
    echo '<b>'.join($metallicaAlbums,'<br>').'</b>';
    $metallicaAlbums=array();
    echo '<br>'; echo '<b>'.join($metallicaAlbums,'<br>').'</b>';
    ?>
    <br> All Done.
    </body>
    </
    html

    .NET (Razor)

    @{ 
    var metallicaAlbums=new string[]{"...And Justice For All", "Ride the Lightning"};
    }

    <!DOCTYPE html>
    <
    html lang="en">
    <
    head>
    <
    meta charset="utf-8" />
    <
    title></title>
    </
    head>
    <
    body>
    My fav Metallica's Albums are:<br>
    <
    b>@Html.Raw(string.Join("<br>",metallicaAlbums))</b>
    @{metallicaAlbums=new string[2];}
    <br>
    My fav Metallica's Albums are:<br>
    <
    b>@Html.Raw(string.Join("<br>",metallicaAlbums))</b>
    </
    body>
    </
    html>

    Node JS

    nodematrix

    var http = require('http');
    var metallicaAlbums=[ '...And justice for all', 'Ride the Lightning' ];

    http.createServer(function (req, res)
    {
    var html = '<b>' + metallicaAlbums.join('<br>') + '</b>';
    if (metallicaAlbums.length < 1) html +=
    'Oooops, they are gone!!! :( </b>';
    metallicaAlbums = [];

    res.writeHead(200, { 'Content-Type': 'text/html' });
    res.end("These are my favourite Metallica Albums:<br>" + html); })
    .listen(process.env.PORT || 8080);

    Demo en Video

  • WarNov Developer Evangelist

    Windows Azure Websites: Dominios Personalizados

    En general los sitios de Azure Websites vienen con nombres del estilo: http://warnov.azurewebsites.net.

    Afortunadamente Windows Azure ofrece una metodología muy sencilla para asignar un nombre de dominio personalizado para que tu sitio tenga por ejemplo el nombre: http://warnov.com.

    Básicamente lo que tenemos que hacer:

    1. Verificar que nuestro Azure WebSite esté en Shared o Reserved (los free no pueden tener dominio propio)

      image
    2. Configurar en el proveedor de dominio los nombre tipo A.
      1. Uno para el @ y otro para el *
        1. Ambos van con la ip que ofrece Windows Azure:
          image

          image
    3. Configurar en el proveedor de dominio los CNAMEs:

       

      Los detalles de esta operación los podemos ver en este video de solo 6 minutos, usando como ejemplo a GoDaddy

      Las instrucciones mostradas en este video, podrían aplicarse fácilmente a la configuración en cualquier otro proveedor de dominios:

    4. WarNov Developer Evangelist

      Windows 8: Su primer semestre

      Lanzado hace 6 meses y 10 días, Windows 8 en su primer mes vendió 40M de licencias y hoy celebramos más de 100M de licencias vendidas en el mundo. Resultados muy halagadores para un sistema tan revolucionario, dado que esta cifra es del mismo orden que la obtenida por Windows 7 en sus primeros 6 meses, siendo declarado en ese entonces el sistema operativo más veloz en venderse (y funcionar) hasta ese momento.

           

       
      Otras cifras que hemos alcanzado en estos 6 meses:  

      • 739 updates
        • Incluyendo IE10 que ahora reproduce Flash por defecto.
      • +60000 apps (más de las que tuvo iOS en todo su primer año)  
      • +500 updates para las apps desarrolladas por Microsoft como tal
      • +250M de downloads de apps
        • 90% del catálogo se descarga cada mes
      • +2400 dispositivos compatibles con Windows 8
      • +537M de visitas al store
      • Las apps pagas con trials, se venden 6 veces más que las pagas sin trials
      • 35294 actualizaciones a apps de terceros.
        • 30% de las apps en el store han sido actualizadas
      • Apps con más de un millón de downloads:
        • Twitter
        • Netflix
        • eBay
        • Amazon

         
        Todo esto sumado a un bello ecosistema en el que por ejemplo ajustamos 400 millones de personas usando el nuevo Outlook.com y 250 millones de personas con Skydrive.
         
        Obviamente, esto está enmarcado en los 700 millones de personas que tienen una Microsoft Account con la cual pueden acceder a todos estos servicios, aún desde otros dispositivos.
         
        Brillante el futuro que le espera a la plataforma y a todos nosotros desarrolladores que le estamos apostando.

      • WarNov Developer Evangelist

        Windows 8: Una poderosa herramienta de Marketing

        Este artículo está acompañado de Video, Presentación de Slides y Podcast. Encuentralos al final del mismo.

        Marketing Tool

        Una de las facetas que menos se aprecia cuando se contempla la posibilidad de crear Apps, es que pueden servir perfectamente como un canal adicional de marketing para marcas ya establecidas.

        En este post quiero mostrarles los fundamentos de esta afirmación primero teóricamente y luego desde una perspectiva práctica.

        En general, las marcas siempre tienen necesidades de mercadeo. Citaré algunas que vienen al caso:

        • Incrementar la frecuencia de contacto con el consumidor
        • Alcanzar nuevos consumidores
        • Mostrar innovación y una imagen fresca

        Estas pocas necesidades ya le abren el camino a un mundo de soluciones y alternativas. Obviamente aquí abordaremos la perspectiva tecnológica.

        Slide2

         

        Incrementar la frecuencia de contacto con el consumidor

        Con los medios tradicionales, tenemos que esperar a que salga el boletín, revista o folleto. Enviar montones de correo que luego es tachado como SPAM, ejecutar costosas llamadas desde un call center o esperar a que el comercial salga (esto sin mencionar que algunos de estos contactos son unidireccionales).

        Con las apps por el contrario es muy distinto, aún desde el comienzo cuando el usuario la descarga desde el Windows Store. Por qué? Pues porque el mero hecho de descargarla ya es un acto voluntario del usuario. El usuario la quiere descargar porque está a la moda tener apps. Porque es fancy; el usuario ve cool tener una app de la marca, porque espera poder explorar su tienda sin salir de casa, en el elevador, en el transporte, etc., y de esta manera poder comprar sin tener que perder tiempo. El usuario espera que esa app le traiga promociones y oportunidades por demanda y en un medio controlado que no le invade su privacidad ni otras actividades. Información de la marca útil que verá sólo cuando él lo desee, y no como basura que llega por debajo de la puerta, o correos no deseados que ralentizan la lectura del email.

        Alcanzar nuevos consumidores

        Hoy estuve donde un cliente y me decía que la mayor cantidad de sus clientes estaban en el rango de 40 a 42 años, aun cuando los productos que venden aplican para gente desde los 15 años. Por qué ocurre esto?

        Una marca tradicional, está acostumbrada al marketing tradicional (el folleto, catálogo y demás que se meten por debajo de la puerta). Pero llegan marcas innovadoras. Y a veces ni siquiera marcas, sino sencillos distribuidores. Distribuidores que al no poseer una maquinaria tan grande como la de una marca tradicional, buscan en la tecnología la forma de hacer más con menos. Y entonces hacen tiendas virtuales, anuncios con ads y sí: también hacen apps. Y cuando recurren a todos estos medios, empiezan a tocar a los nuevos consumidores. Consumidores para los cuales no existe el papel. Para los cuales no existe la franja prime time, porque todo lo que ven es por streaming. Consumidores que representan una gran cantidad de leads que no se están generando, sencillamente porque se salen de la zona de acción del marketing tradicional.

        Mostrar innovación y una imagen fresca

        Crees que innovar es tener un sistema de fidelidad basado en puntos? Imagino que no; sobre todo en la parte en que te piden la cédula cuando vas a pagar o la tarjeta esa que no hace sino llenarte espacio en tu billetera. El teléfono o la Tablet, son en últimas controles remotos de todo lo que hacemos a diario. Y por ende también se convierten en extensiones de nuestra billetera. Por qué no tener esos puntos en una app entonces? Así cuando compre a través de la app gano puntos. O si tengo un dispositivo con NFC, cuando pase por la caja paso el dispositivo y de inmediato recibo mis puntos asignados. A mí me parecería formidable que pudiera redimir mis puntos online y me llevaran de inmediato el premio a casa. O que si estoy en la tienda y voy a pagar, activo mi app y le digo que me genere un código para pagar con 5000 puntos. Entonces se me genera el código y cuando lo active pagando, los puntos son descontados de mi saldo. Vean que no es rocket science, pero como consumidor, obtengo una imagen de alta innovación. Una imagen que en realidad me hará fan de una marca. Yo no me hago fan de una marca porque me envían un twitt diciendo que me haga fan. Me hago fan cuando veo que me ahorran tiempo. Que son efectivos. Que se esmeran!

        No serían fan ustedes de un restaurante de hamburguesas al que le pueden ir pidiendo su almuerzo cuando salen de la ofi y sacan su celu y abren la app, especifican qué quieren y lo pagan? Cuando llegan al restaurante, la espera por el pedido se habrá reducido al menos los diez minutos de caminata y lo mejor de todo, se ahorrarán un montón de tiempo en la fila. Eso sí que me haría fan de esa marca.

        No se trata solo de una app

        Si bien hemos visto que las apps pueden brindar la solución a las tres necesidades que he planteado, no es soplar y hacer botellas…

        El mundo de las apps es de ¨one shot, one opportunity¨. Si no atrapas al usuario una vez se abre la app por primera vez, pocas posibilidades existen de que ese usuario vuelva a la app.

        El éxito de una app no se mide por el número de descargas. Se mide por el tiempo que pasan esos usuarios en la app. Se mide por los reviews que se hacen de la app y por las recomendaciones a los amigos.

        Para lograr que una app mantenga mucho tiempo a un usuario dentro de ella; que genere buenos reviews y que se convierta en viral, es necesario ser consciente de que los estándares de calidad han de ser mayores aún que los de las aplicaciones organizacionales internas. Pero sobretodo, el diseño ha de ser impecable.

        Y cuando hablo de diseño no me refiero solo a la forma de la app, sino al cómo desempeña su función. Cuál es la experiencia que le da al usuario. Qué tan ergonómica es. Tienes que hacer más de tres taps para llegar a alguna función? Olvídalo. Eso no es usabilidad. Los colores no permiten ver bien el texto? La función principal de la app no es lo primero que se ve? Una vista está saturada de funciones que hacen difícil cuál escoger? Todas estas cosas son las causantes de la ruina de una app.

        Es por esto que el papel de los diseñadores se vuelve tan relevante dentro de la creación de las apps. Y es por esto que es muy importante que la plataforma de desarrollo ofrezca una plena integración entre los mundos del diseño y el desarrollo, de manera tal que los desarrolladores puedan trabajar sobre copias vivas de lo que están haciendo los diseñadores y afortunadamente, en esto Microsoft se ubica en la vanguardia a través de herramientas como Blend + Visual Studio.

        Una app completamente atractiva para los usuarios y que además se comporte bien haciendo correctamente lo que debe hacer, logrará tener una gran cantidad de descargas, pero sobretodo una gran masa de usuarios satisfechos listos a ser tocados por las campañas de marketing, mientras recomiendan la app a otros nuevos usuarios con una inversión mucho menor a la de los medios tradicionales de mercadeo. Como si fuera poco, todo esto permitirá que la marca en cuestión, se convierta en un referente en la industria, en cuanto a integración con la tecnología se trata. Y esto será incuestionable, pues la audiencia misma será la encargada de ratificarlo.

        Las ventajas con Microsoft

        Ofrecer una plataforma para el desarrollo de apps desde Microsoft, por supuesto que no fue un tema tomado a la ligera. Concienzudos estudios acerca de usabilidad y filosofía de la app fueron llevados a cabo para poder ofrecer un conjunto de pilares que permitieran construir apps ajustadas a las premisas que describimos anteriormente:

        Slide3

        1. Fast and Fluid

        El fast no es porque la app se ejecute rápido. El ejecutarse rápido es una característica tan obvia, que ya está dada por hecha (y efectivamente así es hoy en día). Fast hace referencia a poder hacer lo que deseamos con nuestra app de una manera rápida y sin complicaciones. Practicidad y ergonomía. Pensar en hacer algo en vez de pensar en una herramienta para hacer algo. Decir: Voy a avisarle a mi madre que la visitaré, en vez de decir: abriré Facebook para mandarle un mensaje a mi mamá acerca de mi visita. Una plataforma que exalta el contenido sobre el marco. En la que los menús no son necesarios, porque todas las funcionalidades saltan a la vista sin saturar al usuario. Una plataforma optimizada para el touch, pero que no olvida la alta productividad obtenida con un mouse y teclado. Fast es poder hacer todo esto con nuestras apps, y de eso sí que sabe Windows 8. Fluid sencillamente es la característica que permite que a pesar de que todo sea tan “fast” las tareas se puedan ejecutar sin complicaciones sino de manera natural y amigable. Fluid en otras palabras, marca el final de los wizards, tutoriales y menús de ayuda. Tus usuarios adorarán olvidarse del F1.

        2. Enriched Content

        Las apps en Windows 8 son todo acerca del contenido. Nos olvidamos de los marcos. El usuario queda inmerso en el mensaje que queremos transmitirle a través de nuestra app sin distracciones. Esta es una característica poderosa para ofrecer la información que necesitamos. El marketing que queremos. Este contenido puede incluir de manera muy sencilla no solo texto, sino también videos, enlaces, fotografías, audio y cualquier elemento interactivo.

        3. Integrated Devices

        Las apps de Windows 8 solo son la punta del iceberg que atrás está totalmente respaldado por una historia con décadas de vasta experiencia transversal en el desarrollo de tecnologías de la información que siempre nos ha caracterizado. Es así como a través de Windows Azure, Skydrive, Office Web Apps, Sharepoint y Office 365 entre otros, es posible permitir que datos generados en un dispositivo móvil vayan a un repositorio central y puedan ser descargados por otros dispositivos en cualquier parte del mundo. Pero lo mejor, es que todas estas tecnologías están disponibles también para los departamentos de IT de la marca, que pueden entonces ejercer Business Intelligence acerca de los datos emitidos desde las apps, y sobre estos verificar retornos de inversión en Mercadeo y también futuros planes en este sentido.

        4. Highly Interactive

        El marketing moderno exige poder transmitirles mensajes a los usuarios de maneras innovadoras que no los hagan alejarse del medio en bien comiencen a recibirlos.

        Windows 8 se posiciona perfectamente como una plataforma sobre la cual se pueden construir estas experiencias, al soportar fácilmente interacciones a través de sensores de movimiento, GPS, NFC, etc, así como un rico Lenguaje Touch que permiten a los usuarios modificar la forma en la que acceden a la información presentada y en la que dan respuesta cuando las app así lo requieren.

        5. Social

        Indiscutiblemente aquel medio que le permita a un individuo establecer contacto de manera rápida y sencilla con los de su especie, generará en la mayoría de interacciones un apego hacia ese medio.

        Las redes sociales son prueba fehaciente de ello y Windows 8 desde su concepción ha sido creado pensando en la situación actual de dichas redes. Es así que el funcionamiento de la plataforma al igual que en Windows Phone, gira alrededor de las personas. Por ende, desde cualquier app, es muy fácil comunicarse con los amigos para transferir información relevante a esa app. Obviamente esto genera efecto viral acerca del marketing que generamos en nuestra app, sin mencionar que allí también podemos aprovechar el hecho de que los usuarios puedan recomendar la app como tal para que más personas la tengan en sus dispositivos.

        6. Monetization

        Un gran diferenciador ofrecido en la plataforma de apps de Windows, reside en este tema.

        Microsoft ofrece sus sistemas de cobro para que los usuarios afiliados al store puedan ejecutar compras desde dentro de las apps a través de ellos, quitándole a las marcas la necesidad de crear estos sistemas. Obviamente, esto tiene un costo de mantenimiento y es del 30% de todas las transacciones.

        Este modelo se replica en todos los stores de aplicaciones en la industria.

        Aunque esto es una gran ayuda para los start ups, es muy frecuente que cuando la marca ya está establecida, ésta ya posea mecanismos de recaudo electrónico efectivos. Y si es así, no se justifica tener que pagar por una plataforma. Es por esto que Microsoft otorga total libertad para que la marca use los mecanismos de cobro que desee. Cosa que no pasa por ejemplo en el Apple Store, donde es OBLIGATORIO usar su plataforma de monetización.

        De la misma manera, se ofrecen mecanismos de publicidad propietarios, pero la marca es libre de escoger aquel con el que ya esté acostumbrada a trabajar.

         

        Video

        A continuación les dejo el video de este post, en el que encuentran el contenido aquí descrito

        PPTx

        Esta es la presentación usada en este post:

        SlideShare

         

        Podcast

        Finalmente, aquí está la version Podcast de este artículo

         

         

      • WarNov Developer Evangelist

        Domando los idiomas en Windows 8

        Windows 8 está altamente enfocado en la movilidad. Y una parte de la movilidad es poder manejar diversos dispositivos sin problemas.

        Con los diversos dispositivos puede ocurrir que éstos se encuentren configurados para diversos idiomas.

        Algo que ustedes ya deben haber sufrido, es llegar a una máquina y encontrar que el teclado no tiene la “ñ” o que la arroba no sale ni golpeándole.

        Otra frustración es que el OS está en español y ustedes como yo, están ya tan acostumbrados a que esté en inglés que les parece horroroso verlo así y quisieran verlo en inglés, pero la máquina no es de ustedes, por ejemplo.

        La buena noticia es que Windows 8 tiene todo esto en cuenta y por si fuera poco, ofrece opciones de corrección de ortografía para apps y el browser, basado en el idioma que escogemos, al mejor estilo de Windows Phone. I mean: si ud. escogió español, Windows 8 subraya errores ortográficos del español y autocompleta en español. Lo mismo pasa cuando tenemos por ejemplo el idioma inglés.

        Entonces,

         

        Cómo operamos?

        Lo primero es definir el idioma en el que queremos el OS. Por ejemplo, en mi casa a una PC compartida yo le instalé Windows 8 en inglés, pero luego la abuela se quejaba de que no entendía ni papa. Así que me baje el Language Pack  en español y se lo instalé:

        1. Abrir el charm de Search y escribir Language. Luego escoger Settings y dar tap o click en Add a Language y aparecerá:

        image

        Al agregar el lenguaje de inmediato se habilitan las opciones de autocorrección y demás. Pero aún la interfaz del sistema sigue estando en el idioma original. Para cambiarla totalmente hacemos click en Options y allí escogemos descargar e instalar el Language Pack

        image

        Luego comienza la descarga:

        image

         

        Después de instalado, podemos volver a las opciones y escoger el lenguaje como lenguaje principal:

        image

        Este es un cambio que requiere un re-login para surtir efecto.

        Puede que las apps se sigan mostrando en el lenguaje anterior. Para evitar esto, ponemos el lenguaje recién instalado con más alta prioridad en la ventana anterior, usando Move Up:

        image

         

         

        Y listo, con esto ya solucionamos el problema del idioma del sistema operativo per se.

        Pasemos ahora al asunto de

        Configuración de Teclados

        Entre otras máquinas, tengo un PC (el que se comparte con la abuela y las visitas) con teclado con ñ y tíldes.

        Mi PC personal, tiene un teclado que está en Inglés. El teclado de mi laptop tiene un teclado también con ñ y tíldes, perso ciertas teclas no están en la misma posición que las del PC anterior.

        Por qué sucede esto?

        Esto sucede básicamente porque los teclados además de venir en un idioma dado (los que traen ñ obviamente es porque vienen en español), también vienen en una distribución de teclado especial.

        Después de averiguar un poco, encontré que el PC compartido viene con un teclado en español y distribución Española:

        image

        Mientras que el teclado de mi laptop principal viene con distribución latinoamericana:

        image

        Como se aprecia, las teclas en conflicto son las que los developers usamos más al escribir código. Es un pain completo tenerlas perdidas. Así que mi consejo es que siempre miren que layout tienen y configuren su máquina para que use este layout.

        Pero entonces viene la llorada:

        Ay, pero es que me da pereza estar ajustando eso a toda hora!

        Pues la noticia es que solo se debe configurar una vez! Y además con Windows 8, los settings viajan con nuestra cuenta de login en el sistema (Microsoft Account). Así que a medida de que en mis máquinas fui encontrando configuraciones distintas de teclado, las fui ajustando y luego cuando regresaba a esas máquinas, ya estaban listas para ser usadas.

        Pero vamos por partes. Primero aprendamos cómo configurar estas distribuciones de teclado, y luego veremos como recuperarlas, dependiendo de la máquina en la que estemos:

        Configuración de Layouts de Teclado

        Recuerdan la ventana de selección de lenguaje en la que habíamos quedado?

        Volvamos a ella y observemos:

        image

        Hay una sección de métodos de entrada o Input Methods según el idioma en que te encuentres. Allí es donde añades todos los layout de los que te hablé antes. Como ves, para el idioma español, he agregado tres layouts, de acuerdo a las configuraciones que tienen los teclados físicos de mis máquinas. Está la de Latinoamérica, la de España y la de Estados Unidos. Posteriormente les explico para qué es esta última.

        Las dos primeras ustedes saben que son para hacer coincidir la configuración con mis PCs.

        Pero,

        Cómo agregar nuevos Layouts?

        Fácil ahí ustedes ven el link a: Agregue un método de entrada; no es sino que lo sigan y llegaran a esto:

        image

        Allí es donde ustedes seleccionan la nueva distribución que quieren y para ver si realmente coincide con su teclado físico, pueden darle vista previa (de allí saqué los screenshots que les mostré anteriormente).

        Una vez agregan una distribución, esta queda memorizada en sus Roaming Settings de Windows 8. Por eso si usan el mismo login en otra máquina conectada a internet, estos settings bajarán para que los puedan seleccionar así:

        Cómo seleccionar layouts previamente ajustados

        Súper fácil. Solo presionan la tecla Windows + SpaceBar y aparece un índice como este en la parte inferior derecha de la pantalla:

        image

        Dejan la tecla Windows presionada y por cada vez que presionen el SpaceBar, se moverán en la lista. Observen mis cuatro configuraciones. Una, para escribir en Inglés con teclados en inglés, y tres para escribir en español. Una por cada layout incluyendo un layout del teclado United States-International.

        Así que de acuerdo a la máquina en la que estén echando código, ustedes seleccionan la combinación adecuada.

         

        Hay una forma decente de poner tíldes y eñes en teclados que no las tienen?

        He visto gente memorizarse donde quedan esas teclas, pero van a otras máquinas y no les sirve. Otros se memorizan el código ascii; pero… han intentado sacar un código ascii en una Tablet por ejemplo? Eso es un pain in the ass…

        Por mera coincidencia descubrí una configuración que me permite hacer un truco muy cool para no tener que usar esos medios tan artificiales y poco efectivos. La idea es que pongan como idioma Español, pero con layout United States-International. Por eso es que ustedes lo ven en mis configuraciones.

        De esta manera, cuando llego a una máquina con teclado en inlgés, para poner la eñe sigo los pasos en rojo y para poner las tíldes lo pasos en azul:

         

        image

        En la gráfica no se muestra la realidad total de lo s teclados en inglés, ya que donde aparece el 1 rojo,  siempre aparece el símbolo ~,  de manera que no se nos va a olvidar que así se hace la eñe.

        Cuando se presiona el primer carácter, nada sucede. No aparece nada en la pantalla. Pero cuando se presiona la n o la vocal, ya aparece todo en conjunto.

        Hay un efecto colateral sin embargo y es con las comillas y dobles comillas, pues uno esperaría que al presionarlas de inmediato aparecieran, pero como se quedan esperando para hacer una vocal con tílde o con diéresis (esto es cuando hay doble comilla), entonces hay que pulsar la tecla espacio, para que aprezcan. Pero no es complicado  y vale la pena acostumbrarse.

        Y entonces para qué mantener una configuración con teclado en inglés y layout EEUU-Internacional?

        Sucede que a veces nos las damos de bilingües y queremos escribir texto en inglés. Pero como les mencioné, de acuerdo al Lenguaje que esté escogido, Windows 8 intentará ayudarnos a hacer correcciones idiomáticas automáticamente. Así que si escribimos en inglés cuando el idioma seleccionado es español, entonces todo nos aparecerá subrayado como un error. Por eso es bueno tener también configurado el idioma inglés y cualquier otro en el que escribamos frecuentemente, como el Esperanto, por ejemplo.

        Obviamente, en inglés no hay tildes y eñes, así que nunca he tenido que agregarle más layouts que el United States – Internacional.

        Conclusión

        Recuerden entonces que hay tres tipos de configuraciones de idioma en Windows 8.

        1. El idioma en el que se muestra el sistema operativo como tal.

        2. El idioma en el que nosotros queremos escribir

        3. La configuración regional que queremos darle al teclado, para que se ajuste a la distribución física del teclado que estamos usando en un momento dado.

        Estas configuraciones se pueden mezclar como deseemos y requiramos y además una vez establecidas las combinaciones requeridas, estas viajan con nosotros y nuestra Microsoft Account.

      • WarNov Developer Evangelist

        LINQ: Consultando tablas cruzadas en Visual Studio LightSwitch

         

        LightSwitch es un RAD para hacer aplicaciones basadas en datos bien sea usando Silverlight, o HTML5. En cuestión de minutos podemos tener una aplicación de ese estilo desplegada y funcionando.

        Cuando ya estamos desarrollando una app de cierta complejidad sin embargo, tarde o temprano llegamos a la necesidad de consultar data que se encuentra distribuida en varias tablas en un ambiente relacional.

        Aunque LightSwitch provee un wizard de consultas básicas, éstas últimas requieren la escritura de código.

        El código usado para escribir consultas complejas el LightSwitch no es más que LINQ.

        En mi primer intento de hacer una consulta cruzada con LINQ dentro de LightSwitch sin embargo, a pesar de escribir instrucciones completamente válidas de acuerdo a la definición de LINQ, siempre obtenía un error emitido por LightSwitch, que además dado el mensaje presentado, no da muchas luces de qué es lo que está sucediendo:

        Unable to create a constant value of type ‘LightSwitchApplication.MiTabla’. Only primitive types or enumeration types are supported in this context.

        Pasé mucho tiempo experimentando qué podría ser hasta que descubrí que el error sucede cuando en el where de la instrucción LINQ ponemos dos tablas de la DB directamente. Entonces una solución que se me ocurrió y que mi buen amigo @jramirezdev me ayudó a implementar fue descargar primero unos datos, enumerarlos en una lista y luego con joins lograr el resultado. Sin embargo, dado que esto requiere dos llamados distintos a la DB y además resulta en una consulta LINQ difícil de leer, seguí “escarbando” y encontré una gran ayuda en el operador any  de LINQ, que me permite seleccionar los datos que quiero sin tener que citar varias tablas dentro de LINQ, sino más bien explorando las propiedades de navegación del modelo de objetos.

        En este artículo, he invitado precisamente a @jramirezdev, a quien agradezco el haber escrito el proceso de problema y solución en detalle; algo muy valioso para desarrolladores que estén teniendo este mismo problema:

        ...

        Es muy común que en nuestras aplicaciones tengamos un origen de datos relacional y sobre este debamos realizar consultas en varias tablas para obtener la información que necesitamos. En LightSwitch las consultas simples se puede realizar con el diseñador integrado, pero si este no es el caso debemos recurrir a crear una consulta desde ceros, esto es, usar EntityFramework + LINQ.

        Cuando utilizamos Entity Framework en LightSwitch nos encontraremos con algunas limitaciones, es por esto que debemos ser cuidadosos pues aunque la consulta LINQ compile no significa que al ejecutarla vayamos a obtener los resultados esperados.

        Para entender esto veremos un caso específico donde realizaremos una consulta de tablas cruzadas con LINQ.

        Aplicación: Crearemos una aplicación que permitirá registrar Usuarios, Tiendas y Facturas. Para esto debemos tener en cuenta que una factura será específica de un Usuario y una Tienda, esto significa que debe existir una relación entre Usuario y Tienda para finalmente registrar las facturas de ese usuario en esa tienda.

        Modelo Relacional:

        Problema: Se necesita generar un listado de todas las facturas que existan en las tiendas donde está registrado el usuario "Jorge Ramirez".

        Para resolver este problema comenzaremos por crear una solución de LS, que se vera de la siguiente manera:

        Aquí podemos observar que debajo de la tabla "Facturas" encontramos una consulta llamada "GetFacturasPorTiendasAsociadasAlCliente", es en ese archivo que escribiremos nuestra consulta LINQ.

        Escribiré mi primer consulta de la siguiente manera.

                partial void 
        GetFacturasPorTiendasAsociadasAlCliente_PreprocessQuery
        (
        ref IQueryable<Factura> query) { //Consulta 1 var tiendas = from UsuarioTienda ut in UsuarioTiendas where ut.Usuario.Nombre == "Jorge Ramirez" select ut; var facturas = from Factura factura in query from UsuarioTienda ut in tiendas where factura.UsuarioTiendas.Tienda.Id ==
        ut.Tienda.Id select factura; query = facturas; }
        Semánticamente esta consulta es correcta, pero cuando la ejecutamos obtenemos el siguiente error:

        Resultado Consulta 1: Error.

        Este error aunque pareciera claro, no lo es, pues fácilmente nos confunde el pensar ¿Dónde creamos un Obj del tipo "UsuarioTienda"? Pues bueno, aquí es importante conocer el concepto de que son Propiedades de Navegación de EntityFramework.

        Leyendo este error vemos que existe una limitación para acceder a las tablas relacionadas/cruzadas a través de las propiedades de navegación, lo cual nos indica que debemos considera una solución más del lado semántico de TSQL donde hacemos los JOINS de forma explícita.

               partial void 
        GetFacturasPorTiendasAsociadasAlCliente_PreprocessQuery
        (
        ref IQueryable<Factura> query) { //Consulta 2 var facturas = (from UsuarioTienda utienda in UsuarioTiendas join Usuario usuario in Usuarios on
        utienda.Usuario.Id equals usuario.Id join Tienda tienda in Tiendas on
        utienda.Tienda.Id equals tienda.Id join Factura factura in query on tienda.Id
        equals factura.UsuarioTiendas.Tienda.Id where usuario.Nombre == "Jorge Ramirez" select factura).AsQueryable(); query = facturas; }

        Resultado Consulta 2: Exito.

        De esta forma EntityFramework ha logrado resolver las relaciones y entregarnos la data que necesitamos.

        También podemos considerar otra posibilidad jugando con las propiedades de navegación y una expresión Lambda para que nuestra consulta sea más corta.

                partial void 
        GetFacturasPorTiendasAsociadasAlCliente_PreprocessQuery
        (
        ref IQueryable<Factura> query) { //Consulta 3 var facturas = from Factura factura in query where factura.UsuarioTiendas
        .Tienda.UsuarioTiendas.
        Any(c => c.Usuario.Nombre == "Jorge Ramirez") select factura; query = facturas; }

        Resultado Consulta 3: Exito.

        PROFILING

        Finalmente como un proceso educativo, realizaremos uso de un perfilador (profiler) para ver como se comportan nuestras dos consultas exitosas.

        Consulta 2: Reporte

        Consula 2: Entity SQL Generado

        SELECT TOP (45) [Project1].[Id]     
        AS [Id], [Project1].[RowVersion]
        AS [RowVersion], [Project1].[Producto]
        AS [Producto], [Project1].[Valor]
        AS [Valor], [Project1].[UsuarioTienda_Factura]
        AS [UsuarioTienda_Factura], [Project1].[C1]
        AS [C1], [Project1].[C2]
        AS [C2], [Project1].[Id1]
        AS [Id1], [Project1].[RowVersion1]
        AS [RowVersion1], [Project1].[Tienda_UsuarioTienda]
        AS [Tienda_UsuarioTienda], [Project1].[UsuarioTienda_Usuario]
        AS [UsuarioTienda_Usuario] FROM (SELECT [Project1].[Id]
        AS [Id], [Project1].[RowVersion]
        AS [RowVersion], [Project1].[Producto]
        AS [Producto], [Project1].[Valor]
        AS [Valor], [Project1].[UsuarioTienda_Factura]
        AS [UsuarioTienda_Factura], [Project1].[Id1]
        AS [Id1], [Project1].[RowVersion1]
        AS [RowVersion1], [Project1].[Tienda_UsuarioTienda]
        AS [Tienda_UsuarioTienda], [Project1].[UsuarioTienda_Usuario]
        AS [UsuarioTienda_Usuario], [Project1].[C1]
        AS [C1], [Project1].[C2]
        AS [C2], row_number() OVER (ORDER BY [Project1].[Id] ASC)
        AS [row_number] FROM (SELECT [Extent1].[Id]
        AS [Id], [Extent1].[RowVersion]
        AS [RowVersion], [Extent1].[Producto]
        AS [Producto], [Extent1].[Valor]
        AS [Valor], [Extent1].[UsuarioTienda_Factura]
        AS [UsuarioTienda_Factura], [Extent2].[Id]
        AS [Id1], [Extent2].[RowVersion]
        AS [RowVersion1], [Extent2].[Tienda_UsuarioTienda]
        AS [Tienda_UsuarioTienda], [Extent2].[UsuarioTienda_Usuario]
        AS [UsuarioTienda_Usuario], N'UsuarioTiendas'
        AS [C1], N'UsuarioTiendas'
        AS [C2] FROM [dbo].[Facturas] AS [Extent1] INNER JOIN [dbo].[UsuarioTiendas]
        AS [Extent2] ON [Extent1].[UsuarioTienda_Factura] =
        [Extent2].[Id]) AS [Project1]) AS [Project1] WHERE [Project1].[row_number] > 0 ORDER BY [Project1].[Id] ASC

        Consulta 3: Reporte

        Consulta 3: Entity SQL Generado

        SELECT TOP (45) [Project2].[Id]
        AS [Id], [Project2].[RowVersion]
        AS [RowVersion], [Project2].[Producto]
        AS [Producto], [Project2].[Valor]
        AS [Valor], [Project2].[UsuarioTienda_Factura]
        AS [UsuarioTienda_Factura], [Project2].[C1]
        AS [C1], [Project2].[C2]
        AS [C2], [Project2].[Id1]
        AS [Id1], [Project2].[RowVersion1]
        AS [RowVersion1], [Project2].[Tienda_UsuarioTienda]
        AS [Tienda_UsuarioTienda], [Project2].[UsuarioTienda_Usuario]
        AS [UsuarioTienda_Usuario] FROM (SELECT [Project2].[Id]
        AS [Id], [Project2].[RowVersion]
        AS [RowVersion], [Project2].[Producto]
        AS [Producto], [Project2].[Valor]
        AS [Valor], [Project2].[UsuarioTienda_Factura]
        AS [UsuarioTienda_Factura], [Project2].[Id1]
        AS [Id1], [Project2].[RowVersion1]
        AS [RowVersion1], [Project2].[Tienda_UsuarioTienda]
        AS [Tienda_UsuarioTienda], [Project2].[UsuarioTienda_Usuario]
        AS [UsuarioTienda_Usuario], [Project2].[C1]
        AS [C1], [Project2].[C2]
        AS [C2], row_number() OVER
        (ORDER BY [Project2].[Id] ASC) AS [row_number] FROM (SELECT [Extent1].[Id]
        AS [Id], [Extent1].[RowVersion]
        AS [RowVersion], [Extent1].[Producto]
        AS [Producto], [Extent1].[Valor]
        AS [Valor], [Extent1].[UsuarioTienda_Factura]
        AS [UsuarioTienda_Factura], [Extent2].[Id]
        AS [Id1], [Extent2].[RowVersion]
        AS [RowVersion1], [Extent2].[Tienda_UsuarioTienda]
        AS [Tienda_UsuarioTienda], [Extent2].[UsuarioTienda_Usuario]
        AS [UsuarioTienda_Usuario], N'UsuarioTiendas'
        |
        AS [C1], N'UsuarioTiendas'
        AS [C2] FROM [dbo].[Facturas] AS [Extent1] INNER JOIN [dbo].[UsuarioTiendas]
        AS [Extent2] ON [Extent1].[UsuarioTienda_Factura] = [Extent2].[Id] WHERE EXISTS (SELECT 1 AS [C1] FROM [dbo].[UsuarioTiendas] AS [Extent3] INNER JOIN [dbo].[UsuarioTiendas] AS [Extent4] ON [Extent3].[Tienda_UsuarioTienda] =
        [Extent4].[Tienda_UsuarioTienda] INNER JOIN [dbo].[Usuarios] AS [Extent5] ON [Extent4].[UsuarioTienda_Usuario] =
        [Extent5].[Id] WHERE ([Extent1].[UsuarioTienda_Factura] =
        [Extent3].[Id]) AND (N'Jorge Ramirez' = [Extent5].[Nombre])))
        AS [Project2]) AS [Project2] WHERE [Project2].[row_number] > 0 ORDER BY [Project2].[Id] ASC

        Nota: El perfilador usado fue Entity Framework Profiler, podemos aprender como usarlo Aquí.

        Con esto hemos finalizado el proceso de creación y análisis de consultas LINQ to Entities en LightSwitch.

        Muchas Gracias.


        Jorge Ramírez (@JramirezDev): Es Tecnólogo de Sistemas y estudiante de Ingeniería de Sistemas, con 4 años de experiencia en desarrollo de BackEnd y FrontEnd usando .NET Framework; especialista en LINQ y WCF.  Encuentren la versión original de este post y mucho contenido adicional muy interesante en su blog.




      • WarNov Developer Evangelist

        Flash: Verdades en Windows 8

        A partir de hoy, Flash es soportado en Windows 8 nuevamente.

        Qué?

        Alguna vez dejó de ser soportado?

        Antes de responder esta pregunta, déjenme contarles acerca de los sabores de Internet Explorer 10 en Windows 8.

        Básicamente son 4 sabores:

        2 sabores para Windows 8 sobre arquitecturas x86 y x64 (llamémoslas tradicionales) y otros 2 sabores para WindowsRT. Entonces, en las arquitecturas tradicionales los sabores de IE que tenemos son IE de escritorio y el IE de interfaz moderna o inmersiva.

        Lo mismo pasa en WindowsRT. Recuerden que en WindowsRT también hay un desktop, solo que ese desktop no soporta la instalación de nuevas aplicaciones. Las apps a instalarse solo pueden ser aquellas de la interfaz moderna o Windows Store. Entonces en este caso también tenemos 2 versiones de Internet Explorer. Una de desktop y otra de interfaz moderna.

        Cuando se lanzó Windows 8 el soporte a Flash se limitó de la siguiente manera:

        1. WindowsRT sólo permitía visualizar ciertos sitios web incluidos en una lista blanca, con Flash en ambos sabores del browser.
        2. Windows 8 sólo permitía visualizar ciertos sitios web incluidos en una lista blanca, con Flash en la interfaz inmersiva o moderna.
        3. Windows 8 tenía soporte full para visualizar todos los sitios web con Flash.

        flashpluswin8

         

        Por qué la limitante?

        Pensemos por un momento en la filosofía de Apps: Proveer un mercado de aplicaciones confiables del que solo se pueden bajar apps seguras que no vayan a hacerle ningún daño al usuario. Incluyendo ausencia de virus, spyware, troyanos y demás. Para poder lograr esto, las apps deben correr en un entorno seguro o sandbox que llaman. Del que no pueden salirse para ir a atacar o controlar otras apps. Además de esto, la filosofía de apps también incluye desarrollo amigable con la batería.

        Entonces lo que sucede con Flash es que algunos sitios no respetaban ese sandbox y representaban huecos de seguridad para el sistema. Así que uno piensa: para que un entorno tan protegido como el sandbox si los atacantes pueden entrar a través de flash?

        Además otros sitios con sus apps de flash exigían un esfuerzo enorme a los procesadores central y gráfico, lo que obviamente gastaba la batería en muy corto tiempo. Esto también derivaría en una pobre experiencia de usuario.

        En conclusión la limitante se impuso para proteger la experiencia de usuario. No con el ánimo de excluir a un jugador importante de la industria sin el cual por ejemplo, mucho del contenido con DRM que está en la web no podría ser presentado (recordemos que HTML5 aún no define un estándar para manejar esta tecnología. Es algo que por el momento debe definir cada códec, de manera que la tarea se hace complicada a la hora de manejarlo.)

        Lista blanca?

        Sí, no todos los sitios que usan flash tenían esos problemas de seguridad y performance. Así que en el pasado uno podía pedirle a Microsoft que evaluara su sitio y permitiese a Flash ejecutar el contenido.

        Cuál es entonces el soporte que se brinda hoy en día

        Básicamente se cambió de tener una lista blanca a una lista negra. Ahora por defecto todos los sitios con flash pueden visualizarse en cualquiera de los 4 sabores de browser descritos anteriormente, a menos de que el sitio esté plenamente identificado como inseguro o de pobre performance y por ende se haya agregado a una lista negra.

        TODOS los sitios con Flash que se pueden ver hoy en día en el IE desktop sobre Windows 8 (x86 y x64), se podrán seguir viendo sin ningún problema.

        Cómo se logró esto?

        Gracias a un trabajo conjunto entre Microsoft y Adobe, se logró adicionar a Windows 8 y Windows RT una nueva versión de Adobe Flash totalmente optimizada para el uso Inmersivo o de interfaz moderna. Esta versión es mucho más generosa con la batería, con el performance y con la seguridad del sistema y demuestra totalmente el compromiso que Microsoft tiene con los usuarios de ofrecerles la mejor experiencia, independientemente de que esto implique incluir productos de otros fabricantes.

        A partir de cuándo lo puedo tener?

        Como es tradicional ya con Windows 8, todos los martes podemos tenemos actualizaciones. En la de hoy, martes 12 de marzo, estaremos incluyendo esta actualización entre otras muy importantes. Por ejemplo estaremos actualizando el firmware de la Surface para corregir algunos problemas menores.

         

        image 

      Page 1 of 13 (317 items) 12345»