MSDN Blogs
  • WarNov Developer Evangelist

    LightSwitch: Aprovechando TFS Online para su uso

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

    image

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

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

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

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

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

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

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

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

  • WarNov Developer Evangelist

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

    Esta es la mejor época para los geeks.

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

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

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

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

    xboxplay

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

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

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

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

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

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

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

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

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

    casette

     

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

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

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

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

    Funciona de la siguiente manera:

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

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

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

    3. Juegas

    Preguntas?

    Si:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Kinect 2 y Precio

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

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

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

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

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

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

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

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

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

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

    Xbox On

    Netflix

    Fringe

    y ver la serie...

    Luego:

    Xbox

    MTV

    Y luego al ver que son puros realities,

    XBOX

    Forza

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

    Luego dices:

    Xbox

    Poker Stars

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

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

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

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

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

    preorder 

  • WarNov Developer Evangelist

    Exportando SQL Data desde Visual Studio

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

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

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

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

  • WarNov Developer Evangelist

    WebMatrix: Personalizando el Editor de Código

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

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

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

    image

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

    image

     

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

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

  • WarNov Developer Evangelist

    App Review: Splashtop2 for Windows Phone 8

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

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

    wp_ss_20130523_0001

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

     

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

    PC:

    Splashtop.com

    Phone:

    Splastop2 App

    image 

  • WarNov Developer Evangelist

    XBOX ONE

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

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

     

     

    Xbox One

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

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

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

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

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

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

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

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

    Títulos y Material exclusivo de Xbox One

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

     

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

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

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

     

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

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

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

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

    Xbox Live (Nueva Generación)

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

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

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

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

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

    look and feel

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

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

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

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

  • WarNov Developer Evangelist

    NodeJS: Shared State Concurrency y WebMatrix

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

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

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

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

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

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

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

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

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

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

    PHP

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

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

    .NET (Razor)

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

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

    Node JS

    nodematrix

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

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

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

    Demo en Video

  • WarNov Developer Evangelist

    Windows Azure Websites: Dominios Personalizados

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

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

    Básicamente lo que tenemos que hacer:

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

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

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

       

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

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

    4. WarNov Developer Evangelist

      Windows 8: Su primer semestre

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

           

       
      Otras cifras que hemos alcanzado en estos 6 meses:  

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

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

      • WarNov Developer Evangelist

        Windows 8: Una poderosa herramienta de Marketing

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

        Marketing Tool

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

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

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

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

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

        Slide2

         

        Incrementar la frecuencia de contacto con el consumidor

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

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

        Alcanzar nuevos consumidores

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

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

        Mostrar innovación y una imagen fresca

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

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

        No se trata solo de una app

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

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

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

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

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

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

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

        Las ventajas con Microsoft

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

        Slide3

        1. Fast and Fluid

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

        2. Enriched Content

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

        3. Integrated Devices

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

        4. Highly Interactive

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

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

        5. Social

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

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

        6. Monetization

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

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

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

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

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

         

        Video

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

        PPTx

        Esta es la presentación usada en este post:

        SlideShare

         

        Podcast

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

         

         

      • WarNov Developer Evangelist

        Domando los idiomas en Windows 8

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

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

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

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

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

        Entonces,

         

        Cómo operamos?

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

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

        image

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

        image

        Luego comienza la descarga:

        image

         

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

        image

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

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

        image

         

         

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

        Pasemos ahora al asunto de

        Configuración de Teclados

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

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

        Por qué sucede esto?

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

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

        image

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

        image

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

        Pero entonces viene la llorada:

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

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

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

        Configuración de Layouts de Teclado

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

        Volvamos a ella y observemos:

        image

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

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

        Pero,

        Cómo agregar nuevos Layouts?

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

        image

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

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

        Cómo seleccionar layouts previamente ajustados

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

        image

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

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

         

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

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

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

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

         

        image

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

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

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

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

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

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

        Conclusión

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

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

        2. El idioma en el que nosotros queremos escribir

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

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

      • WarNov Developer Evangelist

        LINQ: Consultando tablas cruzadas en Visual Studio LightSwitch

         

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

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

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

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

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

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

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

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

        ...

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

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

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

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

        Modelo Relacional:

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

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

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

        Escribiré mi primer consulta de la siguiente manera.

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

        Resultado Consulta 1: Error.

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

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

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

        Resultado Consulta 2: Exito.

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

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

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

        Resultado Consulta 3: Exito.

        PROFILING

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

        Consulta 2: Reporte

        Consula 2: Entity SQL Generado

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

        Consulta 3: Reporte

        Consulta 3: Entity SQL Generado

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

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

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

        Muchas Gracias.


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




      • WarNov Developer Evangelist

        Flash: Verdades en Windows 8

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

        Qué?

        Alguna vez dejó de ser soportado?

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

        Básicamente son 4 sabores:

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

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

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

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

        flashpluswin8

         

        Por qué la limitante?

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

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

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

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

        Lista blanca?

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

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

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

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

        Cómo se logró esto?

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

        A partir de cuándo lo puedo tener?

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

         

        image 

      • 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

      Page 2 of 14 (329 items) 12345»