MSDN Blogs
  • 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 

      • WarNov Developer Evangelist

        WebAPI, Azure y Apps: Una implementación

        Esta presentación la he usado en varios eventos últimamente, como el TechDay de Cali, Medellín y algunas charlas online. Nos muestra unos temas que ya he tratado en varios de mis posts anteriormente, relacionados con Windows Azure Mobile Services, Windows Azure Storage, Web Api y Apps.

        Aquí quise integrar todos esos posts en un ejemplo de la vida real, al que le damos solución de una manera bastante sencilla:

        Cómo compartir archivos desde un dispositivo móvil a otros, a través de una Plataforma propia.

        Toda la teoría relativa a esta demostración la puedes encontrar aquí.

        Veamos pues la presentación en video:

      • WarNov Developer Evangelist

        Noding w/ @WarNov. Episodio 2: JavaScript para Orientados a Objetos

        Luego de la gran acogida del episodio de lanzamiento del curso de NodeJS que publiqué hace unos días, me permito presentarles en esta ocasión el segundo capítulo de la serie. Saliendo un poco más tarde de lo planeado debido a que lo que inicialmente concebí como un pequeño tutorial de  JavaScript, terminó siendo un curso completo de 1 hora.

        Esto me exigió repasar nuevamente toda la teoría (Una semana de lectura) y luego condensar todo esto en la menor cantidad de tiempo en video que pude durante un proceso de edición de 8 horas.

        Finalmente, aquí está el resultado:

        image

        Un recorrido súper rápido por JavaScript. Como ustedes sabrán del primer capítulo, es el lenguaje protagonista en NodeJS. Así que en este episodio encontrarán los aspectos fundamentales del lenguaje ha tener en cuenta.

        El episodio está enfocado a desarrolladores orientados a objetos en lenguajes tradicionales (De allí el título del mismo). De manera que si eres experto en C#, C++ o VB pero no has estado en contacto muy profundo con JavaScript, este curso será excelente no solo para que comiences luego con Node.JS sino también con Apps para Windows 8 en JavaScript + HTML5, HTML5 en el browser, JQuery, LIGHTSWITCH basado en HTML5 y hasta Napa: el conjunto de tools para hacer apps basadas en Office. Así pues, es un episodio que te abrirá las puertas a muchas otras tecnologías.

        Este es el segundo episodio de Noding w/ @WarNov. El curso rápido de Node.js que te permitirá de manera rápida y fácil aprender de qué se trata Node.js y cómo utilizarlo.

        Este episodio es un recorrido rápido por JavaScript para developers Orientados a Objetos (aquellos con experiencia en lenguajes como C++, C# o VB), que aunque han tenido contacto con JavaScript no tienen los conocimientos avanzados de ese lenguaje para poder incursionar en Node.js. Ya vimos en el episodio anterior que JavaScript es central en Node.js. Por esto es necesario tener conocimientos sólidos del lenguaje antes de arrancar con Node.js.

        Adicionalmente, en este video muestro como integrar Visual Studio con Node.js a través de la consola de comandos de NuGet Package Manager.

        Si ya eres experto en JavaScript y deseas pasar de inmediato a NodeJS, puedes hacer skip de este episodio y continuar con el siguiente.

        Sin más preámbulos, aquí los dejo con Noding w/ @WarNov. Episodio 2: JavaScript para Orientados a Objetos.

      • WarNov Developer Evangelist

        Office 365 for Developers!

         

        Office 365 msdn

         

        Así es para subscriptores Ultimate y Premium de MSDN
        Por un año!

        Todas las herramientas y recursos requeridos para comenzar a construir y probar apps de Office 365:

        • Un sitio en SharePoint Online personalizado para crear y personalizar apps
        • Acceso a las herramientas de Desarrollo Napa para crear y probar apps
        • Un Microsoft Seller Dashboard para exponer apps gratis y pagas para vender en el Office Store.

        Por ahora no hay disponibilidad para suscripciones adquiridas a través de programas especiales como Bizspark.

        La suscripción igual se puede comprar aquí.


        Más información acerca de cómo construir Office y SharePoint apps, próximamente en este blog.

      • WarNov Developer Evangelist

        Publiqué mi app para Windows Phone 8, pero me sigue bajando solo la de Windows Phone 7

        Como saben, ya está al alcance de todos la posibilidad de subir la versión de Windows Phone 8 de nuestras apps. Sin embargo, comencé a notar con la gente que trabajo, que cuando en el store de Windows Phone residen las dos versiones tanto para WP7 como para WP8, cuando un usuario con WP8 trata de bajar la app, le sigue bajando la misma de WP7, a pesar de que la de WP8 está también presente.

        Uno diría que se debería detectar el modelo del aparato y bajarse la adecuada.

        Desafortunadamente esto no está sucediendo, así que mientras se corrige, aquí les dejo mi solución recomendada:

        Solo basta con aumentar la versión de la app, en la versión de WP8.

        Por ejemplo, si su versión de app de WP7 es la 1.7.x, asegúrense de que en WP8 será 1.8.x

        De esta manera, sus usuarios de WP8 bajarán la versión adecuada.

        Para hacer este cambio, solo basta entrar al manifiesto de la app y hacer la respectiva modificación:

        Primero abrimos el AppManifest.xml que está dentro de la carpera properties del proyecto:

        image

        y luego  cambiamos la versión dentro del archivo:

         

        image

        Espero que con esto puedan solucionar el inconveniente, o mejor aún, puedan evitar que suceda.

      • WarNov Developer Evangelist

        Metadatos de Azure vs. Caracteres Especiales

        @lvbernal, quien hace parte de nuestro grupo de MCS, me preguntó acerca de un problema que estaba teniendo en su desarrollo con Windows Azure, al tratar de usar caracteres especiales en los metadatos de los blobs que requería subir a Windows Azure. Le di la guía que lo llevó a la solución y él muy amablemente nos estructuró la solución en este post que he puesto como invitado para su deleite.

        image

        Nos dice Leonardo:

        Estoy desarrollando una aplicación que guarda documentos en Windows Azure y quiero compartir dos decisiones de diseño:

        • No utilizo tablas que relacionen usuarios y documentos, sino que creo un contenedor para cada usuario. Eso me da mayor flexibilidad al momento de hacer transacciones o al eliminar los usuarios (tarea muy frecuente en fase de desarrollo).
        • Los datos asociados al documento como fechas, descripción, etc. los almaceno en los metadatos del blob.

        Hay un problema con la última decisión: no se pueden almacenar caracteres especiales en los metadatos. Para solucionarlo, seguí la recomendación de WarNov y utilicé un codificador HTML:

        blob.Metadata["Description"] = HttpUtility.HtmlEncode(model.Description);
        Description = HttpUtility.HtmlDecode(blob.Metadata["Description"]);


        Los nombres de los archivos tampoco pueden contener espacios porque hay navegadores que no los aceptan en las cabeceras de tipo Content-Disposition, necesarias para descargarlos. Yo los reemplazo por "_":

        blob.Metadata["FileName"] = HttpUtility.HtmlEncode(file.FileName.Replace(" ", "_"));
        Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.HtmlDecode(blob.Metadata["FileName"]));

         

        Leonardo Vargas Bernal: Es Ingeniero Telemático de la Universidad Icesi, hace parte del Grupo de Investigación en Informática y Telecomunicaciones i2T, en las áreas de Aplicaciones y servicios móviles, Comunicaciones inalámbricas y Computación ubicua. Microsoft Community Specialist y MSP de 2007 a 2009, ha trabajado con tecnologías como Windows 8, Windows Azure y ASP.NET MVC. Emprendedor y amante de los retos de ingeniería. Encuentren su blog aquí.

      • WarNov Developer Evangelist

        iOS Native Development: Con Visual Studio en Windows gracias a Xamarin

        Por primera vez en la historia, gracias al brillante trabajo de Xamarin, hoy podemos escribir aplicaciones nativas de iOS en Visual Studio y Windows usando C#! Todo lo bueno que se nos ofrece en el IDE más poderoso del mundo (Resharper, TFS, addons, y demás) ahora incluye además soporte para iOS!


        Xamarin iOS for Visual Studio nos permite escribir, depurar y probar aplicaciones iOS desde máquinas Windows, siempre y cuando se cuente con al menos una Mac conectada en red que provea los servicios de build y despliegue.

        Las ventajas que ofrece este acercamiento es que podemos crear una sola solución para desarrollar cross platform apps, mientras se usan herramientas poderosas solo disponibles en VS, como TFS o Resharper, usando la experiencia familiar que nosotros developers Windows ya tenemos dentro de nuestra casa VS.

        De hecho, si lo único que tienen son MACs, pero igual quieren las ventajas de tener el IDE más poderoso del mundo para hacer desarrollos sobre iOS, la solución de Xamarin permite correrlo sobre un Windows en Parallels.

        Por qué se requiere un MAC?
        Las apps iOS no pueden ser creadas sin el compilador de Apple, y no puedes ser desplegadas sin los certificados de Apple y sus herramientas de firmado de código, que obviamente no están disponibles a terceros.

        Lo bueno, es que una vez se configura, Xamarin hace toda la conexión sin que uno se de cuenta como developer.

        Así que los requerimientos serían:
        Windows 7 u 8.
        VS2010 o VS2012.
        Plugin de Xamarin para VS

        Y en la MAC:
        OS X Lion o Mountain Lion
        Xamarin iOS SDK
        El Xcode IDE y el iOS SDK

        De acuerdo a la gente de Xamarin, la arquitectura de esta solución es:

         
        image


        Un detalle importante sin embargo, es que el emulador de iOS no corre en Windows, así que en este paso hay que ir a la MAC para ver la ejecución. Sin embargo el resto de ventajas, valen la pena.

        Este producto se puede adquirir desde USD$1000= 

      • WarNov Developer Evangelist

        NodeJS Crash Course: El curso rápido y sencillo para aprender Node.JS

        image

        Queremos sitios web realmente veloces. Sitios web que puedan atender a miles de usuarios concurrentes sin presentar fallas de escalabilidad en sus servicios.

        Necesitamos un nuevo acercamiento que nos permita a nosotros como developers poder desarrollar este tipo de sitios Web y, efectivamente, NodeJS cumple esta tarea a cabalidad.

        Este es el primer episodio del curso Noding With WarNov, en el que aprenderás a manejar Node.js para crear sitios web de última generación que funcionan a grandes velocidades y soportando grandes cargas. Node.js básicamente es una compilación de paquetes. Por un lado incluye el engine V8 JavaScript de Google. Por el otro la capa de abstracción provista por libUV y finalmente una librería core de Node.js escrita principalmente en JavaScript.

        Creado en 2009 por Ryan Dahl, hoy es altamente usado en aplicaciones web que requieren alta velocidad y manejo de tráfico optimizado. Es mantenido por Joyent, aunque sigue siendo open source. La principal característica que lo distingue de otros acercamientos similares, es que no necesita de un browser para correr, pues se ejecuta del lado del server. Además implementa un API de I/O creada específicamente para no generar bloqueos, lo que es bastión en la velocidad de respuesta del server.

        Adicionalmente Node.js incluye también un ambiente REPL (Read, Evaluate, Print, Loop) que permite el testing interactivo de instrucciones Node.js.

        En este video, veremos cómo todos los elementos mostrados anteriormente se integran para producir sitios web, de una manera básica.

        En siguientes capítulos iremos avanzando sobre el estudio de esta tecnología.

         

        Bien. A manera de documentación, aquí les dejo el código que usé para hacer nuestro primer servidor Web basado en Node.js:

        var http = require('http');
        var serv = http.createServer(
            function (req, res) {
                res.writeHead(200, { 'Content-Type': 'text/html' });
                res.end('<marquee>Noding with @WarNov</marquee>');
        
                var d = new Date();
                var hours = d.getHours();
                var minutes = d.getMinutes();
                var seconds = d.getSeconds();
        
                var time = hours + ":" + minutes + ":" + seconds;
                console.log('Somedoby just node with @WarNov at ' +
                    time);
            });
        serv.listen(3000);
      • WarNov Developer Evangelist

        El negocio de las Apps. De dónde viene y para donde va

        Este video fue grabado en Noviembre de 2012 y contiene mi charla acerca del negocio de las apps en el marco del evento realizado por el Ministerio de las Tecnologías de Información y Comunicación en Colombia, llamado Colombia 3.0.

        Observamos aquí un recorrido por la historia de la industria de las aplicaciones y cómo han llegado a convertirse hoy en apps. Así como en los principios fundamentales para establecer un negocio alrededor de este tema:

        image

      • WarNov Developer Evangelist

        SharePoint 2010 MySite en Windows 8

        Presentación

        Hoy, en mi post invitado del mes, les presento a Andrés Ortiz. Lo he invitado porque desarrolló una interesante manera de generar clientes WindowsRT para aplicaciones de SharePoint. En este interesante artículo, nos cuenta su experiencia su experiencia:

        Contenido

        Desde hace ya unos meses que Windows 8 viene cobrando mucha fuerza en diferentes campos: usuarios finales (portátiles, tablets, teléfonos), desarrolladores, diseñadores y más. Esto ha sido definitivamente un cambio de paradigma total de Microsoft de cara a su ya famoso sistema operativo, que básicamente no había tenido una evolución trascendental hasta que apareció Windows 7. Pero con Windows 8, se cambió definitivamente de página.

        Por esta razón, hemos decido explorar lo que ofrece Windows 8 en el campo de los desarrolladores, específicamente para los que desarrollamos sobre la plataforma SharePoint, y definitivamente ha sido una experiencia muy gratificante. Nuestro resultado actual y el motivo de esta entrada, es una aplicación que corre en Windows 8, despliega Tiles en vivo con ítems de una lista de noticias (Thumbnail + Título de la noticia), y cuando se ingresa a la aplicación, se conecta a MySite de una granja de SharePoint y despliega la información de las personas que tengan su sitio personal creado. A continuación vamos a comentar los aspectos más importantes del desarrollo de esta aplicación.

        Capa de Servicios: Cuando comenzamos a implementar la solución, lo primero que se nos vino a la mente es cómo íbamos a conectar la aplicación Windows 8 con la información almacenada en el servidor SharePoint. Como ya sabemos, SharePoint ofrece servicios Web, a través de los cuales se puede consumir la información almacenada en sus listas, y también la información de los perfiles, lo cual es necesario para obtener información de MySite. Por tal razón lo primero que debíamos implementar era la capa de servicios, a través de un proyecto .NET de tipo Windows Communication Foundation. En este sentido, tendríamos toda nuestra lógica de negocio, y temas de consumo de datos bien separados y aislados en un proyecto WCF totalmente dedicado a esa parte.
        La Interfaz del servicio WCF es similar a la siguiente y resume los métodos utilizados que se deberán implementar para consumir la información:

        [ServiceContract]
        public interface IService1
        {
            [OperationContract]
            List<TGNews> GetNewsTile();
            [OperationContract]
            List<TGUsers> GetUserInfo();
            [OperationContract]
            TGUsers GetUserInfoDetails(string loginName);
            [OperationContract]
            CompositeType GetDataUsingDataContract(CompositeType composite);
        }  
        

        Los servicios Web que estamos consumiendo en nuestra solución cuando se implementan los métodos descritos en la interfaz, son los siguientes: El consumo de la información de la lista de Noticias se realiza a través del consumo del servicio REST que ofrece SharePoint 2010, similar al siguiente ejemplo:
        public List<TGNews> GetNewsTile()  
        {        
           TGNews item = null;  
           List<TGNews> items = new List<TGNews>();  
           try  
           {  
                HomeDataContext dataContext = new HomeDataContext(new Uri("http:
                //server/_vti_bin/listdata.svc"));  
                dataContext.Credentials = new System.Net.NetworkCredential("user"
                , "password", "dominio");  
                var news = from temp in dataContext.Noticias  
                              select temp;  
                foreach (NoticiasItem temp in news)  
                {  
                     item = new TGNews();  
                     item.Title = temp.Título;  
                     item.Thumbnail = temp.Thumbnail;  
                     if (!string.IsNullOrEmpty(item.Thumbnail))  
                     {  
                          GetImageNews("http://server" + item.Thumbnail, 
                          item.Title);  
                          item.Thumbnail = "ms-appx:///Assets/" + item.Title +
                          ".png";  
                     }  
                     items.Add(item);  
                }       
           }  
           catch (Exception ex)  
           {  
                //Log de la excepción  
                throw;  
           }  
           return items;  
        }
        El método anterior muestra claramente que se obtiene una referencia al servicio REST, luego a través de LINQ se consulta la información de la lista específica llamada Noticias y finalmente se itera por los resultados obtenidos, dando como resultado el listado genérico de tipo TGNews. Esta clase TGNews es la clase entidad encargada de transportar los datos entre las capas, específicamente título y thumbnail de la noticia. Posteriormente esa es la información que sirve de fuente para el Tile en la aplicación Windows 8.
        Seguidamente el método encargado de consumir la información de los perfiles es similar a lo siguiente.
        public List<TGUsers> GetUserInfo()  
        {  
           UserGroup userGroup = new UserGroup();  
           userGroup.Credentials = new System.Net.NetworkCredential("user",
           "password", "dominio");  
           XmlNode allUsers = userGroup.GetAllUserCollectionFromWeb();  
           XNode xNode = XDocument.Parse(allUsers.OuterXml);  
           return (from root in xNode.Document.Elements()  
            from users in root.Elements()  
            from user in users.Elements()  
            let loginName = (string)user.Attribute("LoginName")  
            let userInfo = GetUserInfoDetails(loginName)  
            //Filter out admin accounts.  
            //Strangely enough I couldn’t find a consistent  
            //correlating property.  
            where loginName != "SHAREPOINT\\system" &&  
              loginName != "NT AUTHORITY\\LOCAL SERVICE" &&  
              loginName != "NT AUTHORITY\\SERVICIO LOCAL" &&  
              loginName != "NT AUTHORITY\\usuarios autentificados"  
            select new TGUsers()  
            {  
              Title = userInfo.Title,  
              Image = userInfo.Image,  
              Id = loginName,  
              Phonenumber = userInfo.Phonenumber,  
              Manager = userInfo.Manager,  
              Cellphone = userInfo.Cellphone,  
              Birthay = userInfo.Birthay,  
              Department = userInfo.Department,  
              HireDate = userInfo.HireDate,  
              JobTitle = userInfo.JobTitle,  
              Localitationoffice = userInfo.Localitationoffice,  
              Titulo = userInfo.Titulo,  
              Workemail = userInfo.Workemail  
            }).ToList();  
         }  
        
         public TGUsers GetUserInfoDetails(string loginName)  
         {  
            TGUsers userInfo = new TGUsers();  
            if (loginName != "SHAREPOINT\\system" && loginName != 
             "NT AUTHORITY\\LOCAL SERVICE")  
            {  
              //Set the default picture URL. Silverlight can't use the
              //default GIF  
              //provided by SharePoint.  
              userInfo.Image = "ms-appx:///Assets/usuario.jpg";  
              try  
              {  
                UserProfileService userProfileService = 
                 new UserProfileService();  
                userProfileService.Credentials =
                 new System.Net.NetworkCredential("user", "password", "dominio");  
                PropertyData[] data = userProfileService.
                 GetUserProfileByName(loginName);  
                string pictureUrl = GetPropertyData(data, "PictureURL");  
                if (!string.IsNullOrEmpty(pictureUrl))  
                {   
                  GetImage(pictureUrl, loginName.Split('\\')[1]);  
                  userInfo.Image = "ms-appx:///Assets/"+ 
                 loginName.Split('\\')[1] + ".png";  
                }  
                userInfo.Title = GetPropertyData(data, "FirstName") + 
                 " " + GetPropertyData(data, "LastName");  
                if (string.IsNullOrWhiteSpace(userInfo.Title))  
                {  
                  userInfo.Title = GetPropertyData(data, "AccountName");  
                }  
                  userInfo.Phonenumber = GetPropertyData(data, "WorkPhone");  
                  userInfo.Cellphone = GetPropertyData(data, "CellPhone");  
                  userInfo.Manager = GetPropertyData(data, "Manager");  
                  userInfo.Department = GetPropertyData(data, "Department");  
                  userInfo.Birthay = GetPropertyData(data, "SPS-Birthday");  
                  userInfo.HireDate = GetPropertyData(data, "SPS-HireDate");  
                  userInfo.JobTitle = GetPropertyData(data, "SPS-JobTitle");  
                  userInfo.Localitationoffice = 
                 GetPropertyData(data, "SPS-Location");  
                  userInfo.Titulo = GetPropertyData(data, "Title");  
                  userInfo.Workemail = GetPropertyData(data, "WorkEmail");  
              }  
              catch (System.Web.Services.Protocols.SoapException ex)  
              {  
                if (!ex.Message.Contains("A user with the account name"))  
                {  
                  //throw;  
                }  
              }  
              catch (Exception ex)  
              {  
                   throw;  
              }  
            }  
            return userInfo;  
          }      

        Los métodos anteriores se encargan principalmente de obtener diferentes propiedades del perfil de un usuario específico, a través de su Login,  y retornar esa información como una lista genérica de tipo TGUser. De ese modo la primera pantalla de la aplicación Windows 8 se encarga de listar a todas las personas, y luego podremos navegar al detalle de la información de cada uno de esos contactos. Vale la pena destacar del método anterior y también del método que trae la información de la noticia, la manera de manipular las imágenes. Aunque para el caso del Tile se pueden consumir imágenes a través de una URL, en este caso específico, dichas imágenes se encuentran en una biblioteca de SharePoint. Al momento de querer consumirlas a través de su URL obteníamos un error de permisos y no fue posible. Por tal razón la solución fue, descargarlas primero a la carpeta Assets de la aplicación Windows 8, y desde ahí, si darle la ruta a la aplicación para que las cargue. Esa fue la solución que le dimos a esa parte para poder que las imágenes se desplegaran, tanto las fotos de las noticias, como las fotos del perfil de cada usuario.
        Hasta este punto ya teníamos listas genéricas, con información de la lista de Noticias y de los Perfiles. Era el momento de sentarnos a escribir la capa Cliente, donde básicamente lo que se hace, es en Visual Studio 2012 crear un proyecto de tipo Windows 8.
        Con el proyecto de Windows 8 creado, lo primero era referenciar el proyecto WCF a través de una referencia de servicio. Con esto tendríamos acceso a los métodos expuestos por el servicio.

        Tile en Vivo: Los tiles son una de las características interesantes de Windows 8, y quizá lo que le da vida a la interfaz del usuario final. Es muy llamativo ingresar al escritorio del Sistema Operativo en la interfaz estilo “Metro” y ver toda esa información en vivo, por cada una de las aplicaciones instaladas: lectores RSS, correo, mensajería, juegos, entre otros. En nuestro caso la idea era desplegar el thumbnail y título de las Noticias almacenadas en una lista de SharePoint, y dicha información ya estaba lista en el método respectivo ofrecido por el servicio WCF. El tile luce similar a la siguiente imagen enmarcada en rojo, cuando la aplicación es desplegada en Windows 8:

        Tile

        El código encargado de obtener la información de las noticias y la creación del tile es el siguiente:

        public void Actualizartile()  
         {  
           var tileUpdateManager = TileUpdateManager.
            CreateTileUpdaterForApplication();  
           tileUpdateManager.EnableNotificationQueue(true);  
           ServiceReference.Service1Client client = 
            new ServiceReference.Service1Client();  
           Task<List<TGNews>> news = client.GetNewsTileAsync();  
           List<TGNews> items = news.Result;  
           foreach (TGNews temp in items)  
           {  
             if (!string.IsNullOrEmpty(temp.Thumbnail))  
             {  
               tileUpdateManager.Update(new TileNotification(  
                CrearIconoCuadradoYLargo(temp.Title, 
                "ms-appx:///Assets/" + temp.Title + ".png"))  
               {  
                 ExpirationTime = DateTime.UtcNow.AddMinutes(60) 
               });  
             }  
             else  
             {  
               tileUpdateManager.Update(new TileNotification(  
                CrearIconoCuadradoYLargo(temp.Title, 
                "ms-appx:///Assets/default.png"))  
               {  
                 ExpirationTime = DateTime.UtcNow.AddMinutes(60) 
               });  
             }  
           }  
         }  

        Del método anterior lo primero que debemos observar es el uso de la clase TileUpdateManager, que será la encargada de permitirnos manipular la funcionalidad de Tiles de Windows 8. Luego de definirla, encontramos que debido que en nuestro caso debemos cargar más de un Tile, y que se repita durante una cantidad de tiempo, es indispensable activar la Cola de Notificaciones del Tile:
        var tileUpdateManager = TileUpdateManager.CreateTileUpdaterForApplication();
        tileUpdateManager.EnableNotificationQueue(true);
        Luego de eso, se puede observar cómo se instancia la referencia del servicio y con eso poder consumir los métodos que ya hemos explicado, en este caso el método GetNewsTileAsync().
        Nuevamente volviendo al objeto de tipo TileUpdateManager, podemos observar que se crea una plantilla para desplegar los Tiles amplios, y otra para desplegar los Tiles cuadrados. Esto es muy importante porque es una característica de Windows 8, que el usuario puede activar cuando desee, y si esto no se implementa, la experiencia de usuario se desmejora. Esto se hace en la llamada al método CrearIconoCuadradoYLargo() cuya implementación es similar a lo siguiente:  
        private XmlDocument CrearIconoCuadradoYLargo(string texto,
                string rutaimagen)  
             {  
               //obtenemos el xml del del icono largo  
               var larga = CrearIconoLargoTextoImagen(texto, 
                rutaimagen);  
               //obtenemos el xml del icono cuadrado y extraemos su
                etiqueta binding  
               var cuadrada = larga.ImportNode(CrearIconoCuadradoTexto(texto).
                GetElementsByTagName("binding")[0], true);  
               // insertamos en el xml del icono largo el binding del icono 
                //cuadrado y hacemos que sean hermanos ambos tienen a visual como padre  
               larga.GetElementsByTagName("visual")[0].AppendChild(cuadrada);  
               return larga;  
             }  
        
             private XmlDocument CrearIconoCuadradoTexto(string texto)  
             {  
               var tilexml = TileUpdateManager.GetTemplateContent(
                TileTemplateType.TileSquareText04);  
               tilexml.GetElementsByTagName("text")[0].AppendChild(
                tilexml.CreateTextNode(texto));  
               return tilexml;  
             }  
        
             private XmlDocument CrearIconoLargoTextoImagen(string texto,
                 string rutaimagen)  
             {  
               var tilexml = TileUpdateManager.GetTemplateContent(
                TileTemplateType.TileWideImageAndText02);  
               //añadimos nuestro texto  
               tilexml.GetElementsByTagName("text")[0].InnerText = texto;  
               //obtenemos la etiqueta image  
               dynamic imagen = tilexml.GetElementsByTagName("image");  
               //añadimos la ruta de la imagen dentro del atributo "src"  
               imagen[0].SetAttribute("src", rutaimagen);  
               return tilexml;  
            }  

        El método CrearIconoCuadradoTexto() se encarga de retornar la plantilla de tipo TileTemplateType.TileSquareText04, la cual básicamente nos permite desplegar un mensaje de texto cuando se despliega el Tile en formato cuadrado o pequeño. El método CrearIconoLargoTextoImagen() se encargará a través de la plantilla TileTemplateType.TileWideImageAndText02 de desplegar la imagen y el título de la noticia cuando el Tile se despliega más grande.

        Página de Items Agrupados: En el instante que el usuario hace clic en la aplicación lo primero que verá será el grupo de perfiles que se consultan a través del servicio Web de SharePoint 2010 ya  explicado. Básicamente el grupo de perfiles mostrará por cada persona su foto y su nombre, luciendo similar a lo siguiente:

        Principal

        La imagen anterior es el consumo de los perfiles de un sitio Demo de SharePoint 2010, por lo cual se ven algunas fotos repetidas, pero esto no sucederá consumiendo los servicios de un sitio SharePoint donde ya se tengan datos de perfiles de usuarios reales. Lo importante es que observemos entonces lo interesante de la solución, y es que desde una interfaz de Windows 8 muy amigable, podamos consultar la información de nuestros compañeros en la organización, sin tener que navegar a la interfaz Web del sitio en SharePoint. Esto significa un acceso rápido a información de compañeros de trabajo que podamos requerir consultar rápidamente.

        Luego que se han cargado todos los perfiles, se puede hacer clic en alguno de ellos, y posteriormente se desplegará una ventana donde se muestra el detalle de las propiedades de dicho perfil, similar a la siguiente imagen:

        informacion

        Bien, hasta este punto hemos mostrado lo interesante que es implementar soluciones en Windows 8, porque definitivamente las plantillas que ofrece para carga de información y su consecuente navegación, el modelo de objetos, y todas las facilidades para implementar interfaces WOW para el usuario final, ya están listas, es solo comenzar a utilizarlo. Y por otro lado toda la riqueza que SharePoint 2010 ofrece para consumir su información, esta vez desde una aplicación cliente como Windows 8, son definitivamente una reunión de tecnologías muy interesantes para crear soluciones mucho más avanzadas y con mayor funcionalidad. Todo esto ha sido construido en una máquina con Windows 8 instalado y Visual Studio .NET 2012 Ultimate. La granja SharePoint 2010 está totalmente aislada de todo esto y gracias a los servicios Web y REST se puede consumir su información sin requerir mucho más de eso.

         Andres Ortiz Es Ingeniero de Sistemas de la Universidad del Cauca, con más de 10 años de experiencia en el desarrollo de soluciones de Software y actualmente apasionado y especializado en la plataforma Microsoft SharePoint. Con más de 4 años de experiencia en SharePoint, trabajo en la compañía TopGroup, como Líder de Proyectos del área SharePoint, diseñando la arquitectura e implementando soluciones sobre esta plataforma para una gran variedad de clientes. Puede contactarlo en aortiz@topgroup.com.ar si está interesado en crear soluciones SharePoint de alto impacto en su compañía.

      • WarNov Developer Evangelist

        Efecto Navideño para blogs usando HTML5

        • 2 Comments

        Luego de implementar el citado evento en mi propio blog, he recibido muchas preguntas de cómo lo logré.

        image

        He aquí la respuesta:

        Este trabajo es basado en un algoritmo de Javascript para HTML5 creado por David Flanagan que se basa en generar un elemento canvas por cada copito de nieve bajando en el blog. Entonces cada copo de nieve se agrega al DOM y es animado usando posicionamiento a través de CSS. Sin embargo se puede mejor usar un solo canvas y animar los copos dentro de este tal como lo sugiere Giorgo Sardo, con el fin de ahorrar memoria. Esto sin embargo puede producir que se bloquee la interacción normal con la página… es así que lo mejor es poner el canvas en un background de menor prioridad (atrás del contenido) tal como lo pueden ver en mi blog.    

        Este es el JavaScript requerido:

        (function () {
        
            // Start Animation only if browser support <canvas>
            if (document.createElement('canvas').getContext) {
                if (document.readyState === 'complete')
                    Snow();
                else
                    window.addEventListener('DOMContentLoaded', Snow,
        false); } var deg = Math.PI / 180; //Degrees to radians var sqrt3_2 = Math.sqrt(3) / 2; //Height of an eq triangle var flakes = []; // Things that are dropping var scrollspeed = 64; // How often we animate things var snowspeed = 500; // How often we add a new snowflake var maxflakes = 20;//Max number of flakes to be added var rand = function (n) { return Math.floor(n *
        Math.random()); } var canvas, sky; var snowingTimer; var invalidateMeasure = false; function Snow() { canvas = document.createElement('canvas'); canvas.style.position = 'fixed'; canvas.style.top = '0px'; canvas.style.left = '0px'; canvas.style.zIndex = '0'; document.body.insertBefore(canvas,
        document.body.firstChild); sky = canvas.getContext('2d'); ResetCanvas(); snowingTimer = setInterval(createSnowflake,snowspeed); setInterval(moveSnowflakes, scrollspeed); window.addEventListener('resize', ResetCanvas, false); } function ResetCanvas() { invalidateMeasure = true; canvas.width = document.body.offsetWidth; canvas.height = window.innerHeight; sky.strokeStyle = '#0066CC'; sky.fillStyle = 'white'; } function drawFlake(x, y, size, order) { sky.save(); sky.translate(x, y); snowflake(order, 0, Math.floor(sqrt3_2 * y), size); sky.fill(); sky.stroke(); sky.restore(); } function snowflake(n, x, y, len) { sky.save(); // Save current transformation sky.beginPath(); sky.translate(x, y);
        // Translate to starting point sky.moveTo(0, 0); // Begin a new subpath there leg(n); // Draw the first leg of the fractal sky.rotate(-120 * deg);
        // Rotate 120 degrees anticlockwise leg(n); // Draw the second leg sky.rotate(-120 * deg); // Rotate again. leg(n); // Draw the final leg sky.closePath(); // Close the subpath sky.restore();
        // Restore original transformation // Draw a single leg of a level-n Koch snowflake. // Leaves the current point at the end of // the leg it has drawn and translates the coordinate // system so the current point is (0,0).
        // This means you // can easily call rotate() after drawing a leg.
        function leg(n) { sky.save(); // Save current transform if (n == 0) { // Non-recursive case: sky.lineTo(len, 0);// Just a horizontal line } else { // Recursive case: _ _ // draw 4 sub-legs like: \/ sky.scale(1 / 3, 1 / 3);
        // Sub-legs are 1/3rd size leg(n - 1);
        // Draw the first sub-leg sky.rotate(60 * deg);
        // Turn 60 degrees clockwise leg(n - 1);
        // Draw the second sub-leg sky.rotate(-120 * deg);
        // Rotate 120 degrees back leg(n - 1); // Third sub-leg sky.rotate(60 * deg);
        // Back to original heading leg(n - 1); // Final sub-leg } sky.restore(); // Restore the transform sky.translate(len, 0);// Translate to end of leg } } function createSnowflake() { var order = 2; var size = 10 + rand(90); var t = (document.body.offsetWidth - 964) / 2; var x = (rand(2) == 0) ? rand(t) : t + 964 + rand(t);
        // Make it fit with my blog var y = window.pageYOffset; flakes.push({ x: x, y: y, vx:
        0, vy: 3 + rand(3), size: size, order: order }); if (flakes.length > maxflakes)
        clearInterval(snowingTimer); } function moveSnowflakes() { sky.clearRect(0, 0, canvas.width, canvas.height); var maxy = canvas.height; for (var i = 0; i < flakes.length; i++) { var flake = flakes[i]; flake.y += flake.vy; flake.x += flake.vx; if (flake.y > maxy) flake.y = 0; if (invalidateMeasure) { var t = (canvas.width - 964) / 2; flake.x = (rand(2) == 0) ?
        rand(t) : t + 964 + rand(t); } drawFlake(flake.x,flake.y,flake.size,flake.order); // Sometimes change the sideways velocity if (rand(4) == 1) flake.vx += (rand(11) - 5) / 10; if (flake.vx > 2) flake.vx = 2; if (flake.vx < -2) flake.vx = -2; } if (invalidateMeasure) invalidateMeasure = false; } }());
        Felices fiestas!

        snowflake, snow effect, JavaScript, html5, css, canvas, animation, christmas, blog

      • WarNov Developer Evangelist

        Async, Await y Task: for Dummies

        • 0 Comments

        Cuando queremos brindarle al usuario una experiencia rápida y fluida, lo más importante es no dejar que la interfaz se congele mientras se ejecuta alguna operación adicional, tal como cargar un archivo o conectarse a un servicio.

        En la antigüedad, esto se lograda con Threading, luego BackgroundWorkers y después TPL. Pero la evolución continuó para bien y hoy se logra a través de métodos asíncronos.

        Es un mecanismo por defecto del Framework 4.5 mediante el cual un método marcado como asíncrono, no congela la interfaz de usuario, pues por debajo empieza a correr en otro hilo distinto a aquel que hizo el llamado.

        Para marcar un método como asíncrono, le ponemos la palabra clave async antes del tipo de retorno del mismo.

        private async void ProcedimientoAsincrono()
        {
           for (int i = 0; i < 5; i++)
           {
               //Ejecutar subproceso i
        } }

        En este caso, el proceso  ejecuta todos los subprocesos, sin que la interfaz se congele, dado que ese es uno de los principales motivos de disgusto de los usuarios con las apps.

        Ilustración de un circuito contador asíncrono

         

        Sin embargo, dado que se inicia otro hilo de la app para ejecutar otro proceso… cuándo sabemos que este acaba? Cómo hacemos para proceder en consecuencia?

        Por ejemplo: Si queremos cargar tres páginas de contenido bajado de la web, necesitamos saber cuándo tenemos ya ese contenido en memoria antes de usarlo.

        En la antigüedad, teníamos siempre mecanismos de Callbacks a los que nos suscribíamos de manera que cuando el hilo nuevo terminaba lanzaba un evento y nosotros actuábamos en virtud a ello, asignándole un manejador. En lo personal, puedo decir que aunque es algo que funciona, no es muy natural, por el mismo hecho de que hay que agregar manejadores de eventos y demás.

        No sería más natural hacer el llamado al método y saber que cuando la ejecución pase a la siguiente línea es porque el método anterior ya se ejecutó y lo mejor de todo sin bloquear la interfaz?

        Bueno, para eso está la otra palabrita mágica protagonista de este post: await o sea, esperar. Si ponemos la palabra await antes del llamado a un método asíncrono, esto le dice al sistema que hasta que no acabe de ejecutarse el método llamado, la ejecución no puede avanzar hacia la siguiente línea. Lográndose entonces una ejecución natural sin tener que crear hilos ni objetos extraños e insisto: Sin bloquear la interfaz:

        await ProcedimientoAsincrono();
        SiguienteProcedimiento();

        Tengan muy en cuenta sin embargo, que no siempre vamos a querer este comportamiento.

        A veces por ejemplo requeriremos que se inicie el hilo y corra por su cuenta, mientras otra cosa pasa sin tener que esperar a que termine el procedimiento asíncrono. Por ejemplo, supongan que mientras cargan muchos datos, ponen una animación para entretener al usuario. En ese caso, lo que se debe hacer es lanzar el procedimiento asíncrono sin el await y luego lanzar la animación. De lo contrario, la animación solo comenzará a ejecutarse cuando el asíncrono haya terminado, lo que claramente no es nuestro objetivo. Así que es bueno tener una variable de finalización que sea actualizada por el método asíncrono. La animación entonces chequeará el valor de esta variable y solo se detendrá hasta que observe que la variable tiene el valor adecuado. Cuando este es nuestro objetivo, omitimos entonces el await en el llamado.

        Una vez entendidos los conceptos de async y await, pensemos en lo siguiente:

        Qué pasa si debemos llamar a un método que no fue creado como async?

        Nos veríamos obligados a usar threading o background workers? No. Ni siquiera tenemos acceso a ellos desde el perfil del Framework disponible en WinRT. En este caso, regresamos un poco al Framework 4.0 donde con TPL (Task Parallel Library) Tenemos acceso a la clase Task que nos permite de inmediato ejecutar un proceso en otro hilo; cosa muy útil, cuando este proceso no ha sido declarado como asíncrono.

        Entonces solo basta decirle a Task que ejecute el proceso que queremos:

        Task.Run(()=>ProcedimientoNoAsincrono());
        SiguienteProcedimiento();

        Como se observa, Task.Run recibe una Action, que no es más que una Lambda apuntando al procedimiento no asíncrono que existe en algún otro sitio. El procedimiento llamado por Task, también puede ser asíncrono, pero en este caso es más fácil llamarlo directamente, como vimos arriba.

        El llamado a Task también es susceptible a ser esperado usando await, así que obtenemos las mismas ventajas:
        No se bloque la interfaz y decidimos si trabajar en paralelo o de manera síncrona.

        En conclusión vimos qué nos ofrece el Framework .NET 4.5 para generar interfaces de usuario rápidas y fluidas. En el proceso, comprendimos sin muchas complicaciones para qué son y cómo se usan estos tres sujetos: async, await y task.

        Para ver async y await en acción, les dejo este post, donde capturamos imágenes desde la cámara de un dispositivo con Windows 8.


        asincronía, asincrónico, paralelo, hilos, threads, background, fluido, interfaz fluida, fast, framework 4.5, Windows 8,  metro style, apps, winRT, WindowsRT

      • WarNov Developer Evangelist

        Concierto Gratis de Monsieur Periné para Apps Developers

        • 0 Comments

        Tal como lo leen.

        Así es, Monsieur Periné  Se llevará a cabo este miércoles 12 de diciembre en la Puerta Grande de Bogotá.

        Para desbloquear tu entrada a este evento, solo debes estar cursando alguno de los Bootcamps gratuitos de Apps.co: Windows 8 y Windows Phone. Si no estás registrado, aún hay tiempo. Hazlo aquí. aportar una idea de App para Windows 8 o para Windows Phone aquí y adicionalmente, aprovechar un taller de ideas que tendremos este día.

        Aquí les dejo una muestra de esta gran agrupación colombiana y nos vemos allí!

         

         

        Invitan Microsoft y el MinTIC con su programa APPS.CO

      • WarNov Developer Evangelist

        Escalado Automático de imágenes en Windows Store Apps

        • 0 Comments

        Las apps del Windows Store, a diferencia de las de cualquier otro Store de apps, ofrecen una gran versatilidad de presentación, pues pueden ejecutarse en diversos dispositivos que por ende presentarán diversos tamaños de pantalla.

        Por ejemplo, podemos ir desde netbooks de 1024x768, pasando a tablets como la Surface de 1366x768 y laptops o desktops de 1280x1024 y muchos intermedios hasta llegar a dispositivos HD como televisores a 1920x1200 y más.

        Entonces es lógico concluir que las imágenes que incluyamos en nuestras apps, no van a servir para todas las resoluciones. Deberíamos entonces generar todo programáticamente con vectores, cosa que no es sencilla aunque es posible y soportada en Windows 8.

        Cuál es entonces la solución?

        Igual recomiendo que comiencen a pensar en vectores. Cuando creen una imagen, háganlo en formato vectorial… olviden el dibujito jpg…. literalmente no escala y cuando escala se pixela. Recuerdan la premisa de que la app debe ser linda y así se debe ver en cualquier tipo de resolución? Pues bien; una de las grandes características de los gráficos vectoriales es que escalan muy bien y es fácil generarlos para varias resoluciones. Los gráficos vectoriales vienen en versiones como *.SVG que ya es un estándar. Y pueden exportarse fácilmente a los formatos convencionales. Además al igual que los *.PNG, soportan muy bien las transparencias. Desafortunadamente las apps como tal no soportan gráficos *.SVG. Siempre tenemos que pasarles las versiones *.PNG preferiblemente.

        Pero en ese caso, cómo se logra el escalado para cada tipo de resolución?

        image

        Muy sencillo. Windows 8 soporta que pongamos tres versiones de un mismo archivo, para que este pueda escalar adecuadamente. La idea es que cada archivo tenga una escala específica para cada tipo de monitor. En Windows 8 se han definido tres escalas. Normal (basada en una pantalla de 1366x768) o 100%, luego viene una mediana que es de 140% y finalmente la grande de 180% que soporta resoluciones HD sin distorsionar las imágenes. Y dependiendo de la resolución detectada, Windows 8 carga automáticamente el archivo adecuado. Nosotros solo lo referenciamos con la raíz del nombre y Windows 8 escoge el adecuado; otra opción es usar la convención de un folder por cada tipo de escala. Entonces al final implementaríamos de alguna de estas dos maneras:

        image

        En este caso, una imagen de 100x100 pixeles, tendría otras dos acompañantes: una de 140x140 y otra de 180x180.

        Como se aprecia, es un mecanismo bastante sencillo, ya que teniendo una imagen vectorial, podemos exportarla con las distintas resoluciones, incluirlas en nuestros assets y luego dejar que Windows 8 se encargue del trabajo sucio.

      • WarNov Developer Evangelist

        Visual Studio 2012 Update 1 y la nueva interfaz del Package.appxmanifest

        • 0 Comments

        Tal como fue prometido, VS 2012 estará liberando updates frecuentes para mejorar rápidamente la experiencia que con esta herramienta tenemos como desarrolladores. Es el caso del update 1, que aparece solo pocas semanas tras el lanzamiento oficial. Es así como ya no tenemos que esperar a que aparezcan los pesados Service Pack que venían a ejecutar una serie de mejoras, pero con un alto costo de instalación.

        El Update de Visual Studio 2012 es detectado automáticamente por la herramienta y se instala desde ella misma. No hay que bajar nada manualmente. Es un proceso bastante sencillo.

        Hace solo un día, liberé la segunda versión de mi app PhotoRanker. Y una de las correcciones que le hice, fue incluir el ícono del logo para el store, pues anteriormente había olvidado hacerlo.

        Por qué lo olvidé? Fácil: Porque estando trabajando solo con Visual Studio en el editor del Package.appxmanifest que es donde encontramos el “wizard”para ajustar las imágenes requeridas para el store, en ningún lado nos pide esta imagen. Así que uno debe cambiarla manualmente, reemplazando el archivo StoreLogo.png que se encuentra dentro del folder de Assets. Esto es algo muy fácil de olvidar, claramente:

         

        oldpackagemanifest

        Qué tiene que ver esto con el update de Visual Studio 2012?

        Pues que entre muchas otras mejoras, el editor del Package.appxmanifest ha cambiado, incluyendo un manejador de imágenes mucho más avanzado y adecuado:

        NewPackageManifest

        Como se aprecia, aquí sí aparece el espacio para incluir el Store Logo de nuestra app. Así que ya no vamos a requerir un update solo para esto (cosa de la que yo fui victima). Pero por si fuera poco, además del nuevo orden que se le ha dado, podemos especificar también las tres escalas que manejamos en Windows 8 para poder presentar siempre imágenes de alta resolución sin importar el tamaño del dispositivo de presentación, tal como lo explico en este post.

        Es una gran mejora que facilita la vida a nosotros developers al momento de preparar nuestros paquetes de apps para certificar en el store.

        Otras mejoras incluidas en el update:

        • Code Analysis para apps de Windows Phone 8
        • Mejoramiento en el ALM para aplicaciones de SharePoint sobretodo en el campo de testing.
        • Mejoras para el trabajo en equipos ágiles en la administración de proyectos. Esto incluye soporte a Kanban; una herramienta para hacer tracking de proyectos.
        • La Calidad Continuada ha sido protagonista de mojoras también; por ejemplo con el update ya se puede ejecutar el code coverage en pruebas manuales de ASP.NET, sin mencionar que ya se puede ejecutar también grabado de pruebas en Internet Explorer, que después pueden reproducirse en los browsers modernos, para poder ejecutar pruebas cross-browsing.

        Si aún no te ha llegado el update y quieres aplicarlo ahora, puedes ejecutarlo desde aquí.

      • WarNov Developer Evangelist

        Heridas de guerra en la publicación de apps al Windows Store

        • 2 Comments

        No son tan graves como el título; pero tener conocimiento de ellas, nos ayudará a evitar tener que perder tiempo en envíos/rechazos de nuestras apps al store.

        Este artículo contiene información extraida de este post de uno de nuestros MVPs. Se trata de Roberto Alvarado, quien ha estado trabajando mucho con el desarrollo móvil, aún desde Windows Mobile. Así que me he permitido invitarle a mi blog con su post acerca de esta experiencia y él muy amablemente quiso acompañarnos. También tiene información extraida de este post de Juan Carlos Ruiz, colega mío dentro de Microsoft Colombia, y finalmente de mis propias experiencias desde que ha estado al aire el store de Windows. Es así como primero listaré las observaciones de Roberto y luego las de Juan, adicionando algunos comentarios donde sea requerido: 

        De Roberto Alvarado:

        1. Seleccionar el idioma de la App y de la tienda.

        image

        Independiente que el idioma de Visual Studio sea ingles, el idioma de la aplicación y sobre el cual se certificará en la tienda debe ser claro y especifico.

        En mi caso, el idioma es español y en Colombia.

        Nota de WarNov: Este cambio de idioma tan importante se ejecuta dentro de Visual Studio. No en el store. Se hace en el archivo  Package.AppManifest que tiene un editor visual para hacer el cambio. Los detalles de este procedimiento los pueden encontrar en este post que he creado.

        2. La descripción de la aplicación que se va a colocar en la tienda debe ser una frase que tenga mínimo 7 palabras, no debe ser una palabra. Debe describir de manera rápida y sencilla lo que hace la aplicación.

        image

        3. Se deben enviar mínimo 2 imágenes de 1366 x 768, a pesar de que solo se exige 1, si se envía 1 imagen nos rechazan la App.

        image

        4. Es muy importante tener una pagina web o Url en donde se publique una Política de privacidad para nuestra App.

        image

        Si no tiene una, puede utilizar esta, que fue provista por WarNov para su difusión: tiene el texto tanto en ingles como en español. http://bdotnet.wix.com/privacypolicy

        Además tu App debe tener un charm en donde indique la política de privacidad que utilizas, en este link te indico como puedes crear este charm: Crear página de Política de Privacidad de un App Windos 8

        Nota de WarNov: Solo es requerido que tu app incluya una política de privacidad, si en las capacidades de la app dentro del manifiesto de la misma, se especifica que la app se conecta a internet:

        image

        En el ejemplo ven el manifiesto de mi app PhotoRanker y como ven, dado que mi app no usa internet, no requiere una política de privacidad.

         

        5. Llenar o dar las instrucciones necesarias al equipo de testing en el store, sobre el manejo de la aplicación para que no sea rechazada porque no la saben manejar.

        image

        En la imagen un ejemplo sobre este punto.

        6. Es muy importante el rango de edad en el cual coloca su App, si su rango de edad es de 3 años o superior, o de siete años o superior, su App no debe tener conexión a Internet ni hacer utilización de la cámara del dispositivo.

        image

        Tengamos muy en cuenta las opciones y recomendaciones que nos da la misma tienda de Windows para ubicar nuestra App en uno de los rangos de fechas disponibles.

        En este momento no hay posibilidad si no de estas 4 opciones para nuestro App.

        Nota de WarNov: Para la mayoría de Apps, es recomendable escoger el límite de edad 12+.

        7. La imágenes del App, si verificamos la carpeta Assets del explorador de soluciones de Visual Studio, debemos dejar los mismos nombres de las imágenes, el mismo formato y principalmente las mismas dimensiones de lo contrario nuestra App será rechazada el momento de ejecutar el kit de Certificación de App para Windows 8.

        Un ejemplo de esto:

        image

        Si cambia el nombre de la imagen del logo por ejemplo debe indicarlo en el manifiesto también del App de manera correcta.

        8. Si utiliza una base de datos local, como SQLite, debe asegurarse que en las propiedades del proyecto en la pestaña de Compilación (Build) esté seleccionado el procesador correcto de su PC, y asegurarse que en las referencias del proyecto, la referencia de SQLIte no tenga una advertencia, si la tiene, elimine la referencia y vuelva a crear la referencia a SQLite.

        9. Al publicar su App debe asegurarse que tener en “Release” su App al momento de las compilaciones y verificaciones que se realizan con el KIT de Certificación.

        image

         

        De Juan Carlos Ruiz:

         

        1. Website

          • La aplicación debe estar publicada en un sitio web del publicador o uno específico para la App con vínculos claros que permitan descubrir la aplicación a los usuarios a través de la pagina web
          • No tienes sitio web? no sabes como crearlo? hay muchas formas de crear sitios web sencillos rápidamente sin una línea de código, solo búscalos en internet Guiño

        Nota de WarNov: No es necesario crear un sitio web para la app como tal. Por ejemplo poner tu url de twitter como desarrollador, será suficiente. Aunque sin lugar a dudas, es mucho mejor tener un website dedicado a la app donde tengas info de la misma como instrucciones y changelog, tal como lo hice para mi app PhotoRanker, usando los WebSites de Windows Azure, que son totalmente gratuitos.

        2. Estabilidad

        • Cero fallos después de abrir y cerrar varias veces
        • Desconexión de red, la app no debe hacer crash si no hay dispositivos de red o la red esta caída
        • Desconexión internet la app no debe hacer crash si no hay conexión a internet
        • La aplicación no debe presentar ningún fallo o app crash durante su uso

         

        3. Contenidos

        • Aptos para todos: no sexo explícito , no agredir religiones, no terrorismo, no discriminación de ninguna índole
        • Si la aplicación se clasifica en el rating para niños menores de 7 años NO SE PUEDE HACER USOS DE DISPOSITIVOS NI DE INTERNET, en este caso la aplicación debe considerarse para mayores de 7años de forma obligatoria.
        • Si la aplicación puede mostrar contenidos sensibles como desnudos artísticos parciales o violencia real moderada etc. se recomienda establecerla para mayores de 16 años

         

        4. Funcionalidad

        • La aplicación DEBE soportar Snapped View, con esto no digo que tengan que desarrollar esta vista adicional, pero por lo menos sino lo hacen deben evitar que en ese espacio se muestre la información de manera desordenada o desagradable , en dado caso sino se va a soportar la funcionalidad entonces colocar una banner que cubra todo el espacio, tal como lo hace la propia App del Windows Store
        • Si implementan funcionalidades de búsqueda, esta debe estar creada usando el Charm de búsqueda (Search), cualquier implementación diferente causa el rechazo de la App.

        Nota de WarNov: De la anterior regla de búsqueda, quedan excluidas las apps que tengan funcionalidades de búsqueda avanzada que requieran de más de un campo de búsqueda. Por ejemplo una app para buscar vehículos para comprar puede requerir buscar por modelo, color o placa. En este caso, sí se justifica una búsqueda adicional a la incluida en el charm.

        • No deben haber botones para cerrar la App
        • Si en el manifest se marca que la App soporta determinadas posiciones de la tableta, así debe ser, si falta alguna de las seleccionadas la aplicación es devuelta.
        • La app no debe ser solo para mostrar publicidad, la publicidad debe ser utilizada en justa medida, pero no puede ser el objeto principal de la App.
        • La aplicación debe ser 100% funcional utilizando solo dispositivos Mouse y Teclado
        • La aplicación debe ser 100% funcional utilizando solo dispositivos Touch
        • La aplicación debe tener descripción adecuada, todos los logos necesarios y screenshots en Windows Store y en el Package.appmanifest
        • La aplicación no debe incluir en su nombre palabras como “trial”, “test”, “beta”, “demo” , si es requerido informar que la aplicación esta en etapa preliminar, utilizar la palabra "preview"
        • La aplicación no debe tener en la pantalla principal ninguna característica, marco, tableta, botón o label que indique que es una funcionalidad futura, es decir evitar palabras como "coming soon”, “more to come”, “not available yet” . "próximamente", "en construcción" etc.
        • Las funcionalidades principales de la aplicación no deben re direccionar el usuario al browser. Solo características no principales en el 2do o 3er nivel de navegación son permitidas para direccionar al browser. Las funcionalidades principales deben estar dentro de la App.
        • Se recomienda incluir información para soporte técnico en el Charm de configuración (settings ) y en la página web de la aplicación, con alguno de los siguientes mecanismos de contacto:
            • email de contacto
            • url
            • teléfonos etc.

        5. Información para Windows Store

        • Si la aplicación requiere de usuario y contraseña u otros mecanismos para garantizar el acceso a todas sus características se debe enviar junto con la aplicación la información de acceso necesaria para realizar las pruebas. Hay una sección llamada ‘Notas para testers’ donde se debe depositar dicha información.
        • Si la aplicación requiere información o trámites de pago para activar funcionalidades, en las notas para los testers se debe incluir información de pago que puedan utilizar para acceder a estas características de la aplicación y realizar pruebas.
        • Validar que toda la información del Windows Store este correctamente diligenciada, poniendo especial atención a los ratings y publico objetivo, así como a la descripción de la aplicación, el vínculo a la política de privacidad etc.

        6. Localización y Lenguaje

        • La localización y lenguaje de la aplicación debe ser establecido en el package.appmanifest. Ejemplo: si la app esta en español pero en el manifest dice EN-US será rechazada, puesto que esta cadena de localización indica que la App esta en inglés  y esto no es cierto.
        • Localización: La aplicación debe estar completamente localizada para los lenguajes que se hayan establecido en el package.appmanifest, esto incluye: textos y logos, screenshots etc. Si la aplicación va a nivel mundial se recomienda soportar 100% ingles.
        • Todo lenguaje soportado debe tener personalizados el 100% de los textos, imágenes etc. Localizaciones parciales son rechazadas automáticamente

        7. Política de Privacidad

        • Si la aplicación recopila información del usuario de alguna índole esta DEBE TENER una política de privacidad asociada

        Nota de WarNov: En realidad la condición no es recopilar info del usuario o no, sino el mero hecho de que en las capacidades de la app dentro del manifiesto de la misma, se especifica que la app se conecta a internet, como lo muestro en mi segunda anotación arriba.

        • Aunque la app no haga uso de ninguna información del usuario, se recomienda indicar eso en una política de privacidad sencilla.
        • La política de privacidad que se declara dentro del sitio web creado para la App, debe estar conforme a la estructura del sitio y no ser un archivo de texto nada más. La política debe ser descubrible por vínculos dentro del sitio.
        • Se recomienda que la política de privacidad sea accesible desde el Charm de configuración
        • Si se comparte información con terceros,  en el Charm de configuración junto con la política de privacidad se debe agregar una opción visible para autorizar o denegar ese uso de los datos.
        • Si el usuario no autoriza dicho uso la aplicación no debe perder toda funcionalidad, esto no es aceptado, la restricción de funcionalidad debe ser limitada.

         

        Muy bien, espero que puedan valerse de toda esta experiencia adquirida para minimizar la probabilidad de que sus apps sean devueltas tras un proceso de certificación fallido.

        Muchos éxitos!

      • WarNov Developer Evangelist

        No confundir el idioma de tu app, con los países en los que se verá

        • 0 Comments

        Las apps para el Windows Store y Windows Phone Store, manejan un lenguaje por defecto que se encuentra en el manifiesto de cada una de ellas.

        Este lenguaje se ajusta de acuerdo al lenguaje de la máquina del desarrollador. Por ejemplo si el desarrollador tiene su máquina ajustada a Inglés de Estados Unidos, este será el lenguaje por defecto de la app.

        Sin embargo, este lenguaje es configurable; pero al encontrarse en una ubicación no muy visible, puede pasar que no lo observemos y luego pasemos al proceso de publicación dejando un lenguaje por defecto incorrecto, porque puede que haya quedado en Inglés y nuestra app vaya solo en español.

        Cuando pasamos al proceso de publicación en ambos store nos piden los idiomas en los que está disponible nuestra app. También nos piden los países en los que queremos visible nuestra app.

        Ojo que son cosas distintas que no deben confundirse: Uno como developer puede poner su app visible en diversos países, independientemente del o de los idiomas que esté exponiendo. Hay developers que piensan que dado que nuestra app solo expone español, entonces no puede ponerse en mercados que no hablan español, pero esto no es así. Lamentablemente este hecho nos puede quitar oportunidades de darle visibilidad a nuestra app al ponerla en varios países, tal como lo describo en este post.

        Por ejemplo yo como developer colombiano puedo poner mi app visible en Colombia, Estados Unidos e Inglaterra, habiéndola publicado solo en español. Y esto es válido y la app puede ser publicada sin ningún problema.

        Sin embargo observen este hecho curioso: Supongan que escogemos Español. Y que agregamos todos los recursos e imágenes en español necesarias para este fin. Además que pusimos nuestra app disponible en todo el mundo.

        Pero luego de un tiempo nos llega el rechazo de la app porque dizque no subimos los recursos necesarios para los lenguajes especificados. Será porque escogimos países que no hablan español?

        Como lo expliqué anteriormente, este no es el motivo.

        Por qué pasa esto?

        Como les comenté al principio, dado que las apps además quedaron con lenguaje por defecto Inglés Estados Unidos, pues el store espera que subamos esos recursos también.

        Así que la forma de solucionar este problema es modificar estos lenguajes y culturas por defecto, antes de subir la app al respectivo  store.

        En el caso de Windows Phone, esta información se encuentra en las propiedades de la app. Así que abriendo el cuadro de diálogo propiedades desde el explorador de soluciones dando click derecho obtenemos el editor de propiedades. Allí escogemos la información del assembly y allí modificamos el valor. En este ejemplo vemos como estamos cambiando desde Inglés Estados Unidos a Español Colombia:

        image

        En Windows 8, esta información se configura desde el editor del Package.appxmanifest (doble click al archivo con este nombre para abrir el editor):

        image

         

        Aquí solo basta corregir “en-US” por es o por ejemplo “es-CO”.

        Y listo!

        De esta manera ya le estamos diciendo al store que no espere recursos de Inglés Estados Unidos, porque ahora la cultura por defecto es el Español.

        Conclusión: No se confundan si su app es rechazada por motivos de idioma. Esto no tiene nada que ver con los países de publicación elegidos, sino con la cultura por defecto que viene configurada cuando ustedes arrancan a desarrollar una app.

      Page 2 of 14 (326 items) 12345»