MSDN Blogs
  • WarNov Developer Evangelist

    Añadir IP a Azure SQL DB con PowerShell

    Azure brinda enormes ventajas; entre ellas, la posibilidad de poder configurarlo y administrarlo desde cualquier parte del mundo. Sin embargo en ambientes como el de SQLDB (antes conocido como SQL Azure) para poder entrar a administrar la DB la ip de nuestra máquina de trabajo ha de estar autorizada; así que cada vez que nos conectamos desde una IP nueva, debemos entrar al portal a autorizarla… y esto me parece una pérdida de tiempo que puede ahorrarse a través de las herramientas de automatización que Azure provee tanto para línea de comandos multiplataforma (Windows, Linux, MacOS) como para PowerShell (únicamente en Windows)

    image

    Las interfaces de comandos cross platform están basadas en JavaScript y requieren de NodeJS; las puedes descargar de aquí:

    Pero; aunque hasta aquí vamos bien, podemos ir mejor! Y es que en Windows, como lo mencioné existe PowerShell que ofrece muchas más utilidades que la simple consola de comandos. Así que también se publicaron los cmdlets (así se llaman los comandos en PowerShell) para esta plataforma y los pueden descargar de aquí. El poder de PowerShell lo lleva hasta a integrarse a Visual Studio 2013, tal como lo ilustro en este post.

    Los nombres técnicos que adquirieron cada uno de estos conjuntos de interfaces fueron azure-sdk-tools para PowerShell y  azure-sdk-tools-xplat  para las consolas cross platform. Y, siguiendo los links citados, podrán observar que además de todo, tanto el código C# para PowerShell como el código JavaScript para xplat ha sido abierto y publicado en GitHub.

    Y bien, ya que los empapé con el contexto que gira alrededor de mi solución para el problemilla aquel de agregar la IP a mi servidor de SQLDB, les comento que decidí usar PowerShell con el fin de aprovechar que ahora puedo editar código PowerShell desde el mismísimo Visual Studio 2013, aprovechando características como IntelliSense y demás que hacen la codificación más agradable. Para lograr esto, instalé PowerShell Tools for Visual Studio 2013, que es una extensión para nuestro editor preferido. (Si quieres saber cómo construir tu propia extensión, haz clic aquí).

    Luego de esto, de una manera bastante cómoda escribí las siguientes líneas de código, que con fines ilustrativos comentaré de manera extensiva:

    #
    # SQLDBAuthCurrentIP.ps1
    #===========================
    #By: @WarNov 7/12/2014 - 18:12
    #This script adds to the Specified SQL DB Server Database the IP
    #of this machine as a new firewallrule
    
    
    
    Param(
    
        #Nombre del servidor SQLDB ej. p5x8y4oi1z    
        [string]$serverName,  
        #Nombre de la regla de firewall que se insertará. A pesar de ser
    #obligatorio en el comando de Azure, en este script es opcional #si se omite, el script produce un GUID como nombre
    #y lo pasa a Azure
    [string]$ruleName, #La ruta donde el archivo *.publishsettings está localizado con
    #la información de la suscripción de Azure a la que accederemos
    [string]$publish ) #Hacemos referencia a la suscripción de Azure, sencillamente
    #importando el archivo



    Import-AzurePublishSettingsFile -PublishSettingsFile $publish #Procesamos el nombre de la regla. Si viene vacío,
    #creamos un GUID. Observen el manejo que se da a los comparadores
    if($ruleName.Length -eq 0){
    #A través de .NET instanciamos la clase guid y asignamos
    $ruleName=[guid]::NewGuid(); } #Ahora obtendremos la ip que queremos agregar. #Dado que no hay forma de obtener la ip externa usada por nuestro
    #cliente es necesario usar una herramienta online que nos informe
    #cual es nuestra ip; en este caso, usaré una que construí yo mismo
    #y que corre en Azure basada en un Generic Handler sencillo de
    #ASP.NET; con esta sencilla línea de código:
    #Request.UserHostAddress #Luego a través de .NET creamos un WebClient #y ejecutamos un downloadstring especificando la url
    $ipAddress=(New-Object Net.WebClient).
    DownloadString('http://warnov.com/@ip')
    #Finalmente ejecutamos el comando principal,
    #que agregará la IP al servidor bajo la suscripción de Azure
    New-AzureSqlDatabaseServerFirewallRule -ServerName $serverName ` -RuleName $ruleName -StartIpAddress $ipAddress `
    -EndIpAddress $ipAddress

    Ya con este script listo, lo podemos ejecutar desde el mismo VS2013 para chequear si hay posibles errores.
    Una vez depurado, lo podemos llamar desde la consola de comandos, pasando como parámetro el nombre del servidor, el nombre de la regla (opcional) y la ruta del archivo de .publishsettings de Azure que se requiere para que tengamos acceso a la suscripción desde nuestra máquina. Este archivo se descarga una sola vez con este comando: azure account download

    Un ejemplo de ejecución:

    image

    Y, como en la mayoría de casos tanto el nombre del servidor como el archivo de settings es el mismo, lo que podemos es hacer otro script que ponga estos parámetros automáticamente por nosotros, así cuando necesitemos agregar la IP solo llamamos a este segundo script sin necesidad de poner parámetros.

    Así pues, hemos visto cómo mediante PowerShell podemos automatizar tediosas tareas como la de agregar la IP a Azure como una regla de firewall cada vez que queremos administrar nuestras bases de datos SQL DB desde una máquina distinta.

    He abierto el código de este pequeño proyecto en Github, donde también podrán encontrar por ejemplo, una rutina que permite borrar todas las reglas de firewall que tengamos para un servidor SQL DB dado, a través de PowerShell:

  • WarNov Developer Evangelist

    PowerShell en Visual Studio 2013


    Nuestra velocidad de vida cada vez aumenta. Y necesitamos hacer más cosas correctamente en el menor tiempo posible. En un escenario de estos, repetir una tarea, un comando, una rutina, me parece cada vez más desgastante.

    A través de la historia de la ingeniería de sistemas, siempre ha existido la manera de programar tareas a través de lenguajes tipo script con los que creamos archivos de procesamiento por lotes; por ejemplo los .bat en Windows. Desde Unix con BASH, hasta Windows con la discreta consola de comandos o el todo poderoso PowerShell (que hasta permite llamar a ejecutarse objetos .NET para desarrollar tareas inimaginables en un entorno de scripting tradicional), están hoy disponibles para que ahorremos nuestro precioso tiempo.

    Precisamente PowerShell siendo tan poderoso, cada vez toma más vigencia hoy en la industria y hasta en la vida de los desarrolladores (ya no es cosa única de IT Pros). Y en este orden de ideas lo primero que un desarrollador pensaría es:

    “… y puedo usar PowerShell desde casa? –o sea: desde el allmighty Visual Studio 2013?…”

    Hoy día me agrada responder que sí; hoy se puede y se pueden entonces aprovechar todas las ventajas de administración de código fuente tanto con git como con TFS, el intellisense, step by step debugging, etc. etc:

    image

    Esto es una maravilla en escenarios complejos en los que tenemos que manejar mucha automatización. Sobretodo ahora con Microsoft Azure, donde casi todas las tareas de configuración las podemos ejecutar a punta de comandos que tienen su representación en PowerShell a través de los azure-sdk-tools.

    Sin embargo esta funcionalidad no viene out of the box hoy en día. Tal vez en un siguiente update o release de VS, tengamos la plantilla para proyectos tipo PowerShell preinstalada. Pero pues… para eso están las extensiones de Visual Studio; en especial, PowerShell Tools for Visual Studio 2013, que es la extensión que por ahora requeriremos para trabajar con PowerShell. (Si quieres saber cómo construir tu propia extensión, haz clic aquí).

    Una vez instalada la aplicación, tendremos el tipo de proyecto PowerShell disponible:

    image

    Y una vez creado, aparece la solución con el proyecto embebido y allí podemos agregar tantos ítems como queramos:

    image

    Cada uno de esos archivos es un script PowerShell que podremos ejecutar desde la línea de comandos o con el mismo PowerShell.

    De hecho cada script se puede ejecutar desde Visual Studio propiamente para poder hacer el debug. Por ahora, el medio de escoger cual script se ejecutará es un poco arcaico, pero efectivo. Y es dar F5 mientras se tiene el foco en el archivo de script abierto que queremos depurar.

    Pues bien, arranquemos con el padre de los programas de ejemplo. El Hello World.

    En PowerShell, se escribe en consola con el comando Write-Host y entre comillas el texto a imprimir (o acaso directamente una variable como $textoAImprimir). Así que abrimos el archivo de script y escribimos:

    #
    # Script.ps1
    #
    Write-Host "hello world"
    pero cuando le damos F5, CRASH!

    [ERROR] . : File Script.ps1 cannot be loaded because running scripts is disabled on this system…

    Esto ocurre porque el scope de ejecución de VS no tiene los permisos para la ejecución de scripts.

    Pero este sencillo fix es suficiente ejecutándolo una sola vez desde Visual Studio:

    Reiniciar Visual Studio, abrir el proyecto de PowerShell, y escribir en el editor la línea

    Set-ExecutionPolicy RemoteSigned

    seleccionar el texto y presionar CTRL+F8  (O clic derecho sobre la línea y escoger ejecutar línea actual).

    Ahora borramos la línea y al presionar F5, todo funcionará sin problemas, porque Visual Studio en adelante tendrá permisos para ejecutar scripts de PowerShell:

    image

    Digamos ahora que queremos algo un poco más avanzado y es averiguar cual es nuestra IP externa. O sea con la que los servidores identifican nuestros llamados. No hay un comando estándar que nos permita saber esto. Entonces podemos recurrir a un servicio web que lo haga, o hacer webscrapping de alguna página web que retorne esta info (como cuando escribimos en el buscador what’s my ip).

    Personalmente, he creado un servicio en uno de mis sevidores de Azure que hace esto. La dirección del mismo es http://warnov.com/@ip

    Si visitan esa dirección, aparecerá un texto con su dirección IP externa.

    Entonces necesitamos un comando que pueda hacer una conexión http y bajar contenido de tipo string. Una alternativa sería instalar curl y hacer el llamado desde PowerShell, cosa que es completamente válida. Pero para darle más matiz al asunto, me permitiré hacer un llamado a .NET para traerme el nunca bien ponderado WebClient y luego decirle que baje un string desde una URL que para ilustración, vendrá dada por un parámetro:


    param
    ( #The URL from which we can obtain our current external IP [string]$serviceURL ) $ipAddress=(New-Object Net.WebClient).DownloadString($serviceURL) Write-Host $ipAddress

    Como se aprecia, hay una sección de param (esto es estándar en PowerShell). Y luego los parámetros se pueden llamar por nombre o ubicación.

    Vemos como a través de New-Object instanciamos una clase .NET. En este caso usando toda la jerarquía, llamamos a Net.WebClient para ser instanciado. Luego, a esa instancia de inmediato le llamamos el método DownloadString y como parámetro le pasamos el parámetro del script.

    Cómo se pasa ese parámetro a Visual Studio?

    Solo basta con darle clic derecho al proyecto en la solución y escoger Properties, lo que nos abre un form para escribir de inmediato los parámetros del script tal como lo haríamos en la línea de comandos:

    image

    Luego de esto ejecutamos, y obtenemos:

    image

    Y así pues, hemos creado un script usando todo el poder de Visual Studio. Además, podemos adicionarlo a git o TFS y tener todas las otras ventajas de trabajar con este poderoso IDE.

    Luego, solo basta acceder el script con PowerShell y ejecutarlo!

    image

    Es así como hemos visto la manera en la que podemos trabajar con PowerShell desde Visual Studio, ahora que será cada vez más frecuente la necesidad de usar esta herramientas en entornos de configuración y automatización. Vimos como es posible pasar parámetros al script y como ejercicio les dejo que pongan un breakpoint y vean como la ejecución se detiene y pueden evaluar el valor de las variables, como si fuera una aplicación típica de Visual Studio.

  • WarNov Developer Evangelist

    Cómo crear extensiones para Visual Studio 2013 (vsix)

    Andaba yo por ahí dando Soporte a uno de mis SaaS que tengo sobre Azure, cuando noté que era muy molesto que dado que el internet 4G que tengo me cambia en todo momento la IP, entonces siempre tenía que meterme al portal a agregar una nueva regla de firewall para poder acceder a administrar la SQL DB desde mi máquina local.

    Entonces se me ocurrió escribir un script en powershell que hiciera esa tarea en batch, de manera de que ya me podría ahorrar mucho tiempo. Además me motivó el hecho de que ahora en VS2013 tenemos un excelente plugin que nos permite desarrollar sobre PowerShell directamente desde Visual Studio.

    Pues bien, acabé de hacer mi script, e iba a pasar a poner en la documentación la fecha en la que fue creado. Pero oh sorpresa cuando noté que no tenía ni idea de cuál era la fecha en la que estábamos. Así que miré en el teléfono y vi que no podía hacer copy paste de esa fecha.

    Y bueno, abrí notepad para presionar F5, pues esto inserta la fecha y hora actual en el editor y podría copiar y pegarla en Visual Studio. Pero sucede que reemplacé Notepad por Notepad++ y este último tampoco tiene esa funcionalidad.

    Así que para nunca tener que volver a pasar por esta inmensa agonía, decidí escribir mi propia macro para Visual Studio 2013, que insertara la fecha y hora… pero; momento, las macros ya no están en Visual Studio 2013. Así que a hacer una extensión se dijo.

    Afortunadamente hoy a diferencia de cuando yo hacía las extensiones para un lenguaje de programación que estaba creando llamado APL.NET por allá en 2005, crear extensiones para VS es muy sencillo. Y obviamente, se puede a punta de código administrado.

    Basta descargar el SDK de Visual Studio 2013 que es de apenas unos cientos de megas. Después de esto ya en el mismísimo Visual Studio 2013 tendremos unas nuevas plantillas de proyecto para extensibilidad:

    image

    Las opciones son enormes. Pero para comenzar, crearemos un Visual Studio Package. Con esto será suficiente para crear la extensión que inserta un timestamp en el editor de código de Visual Studio 2013.

    Esto nos lleva a un Wizard donde primero escogemos el lenguaje y firmamos el assembly con una llave propia o una autogenerada. La autogenerada funciona bien.

    image

    Luego agregamos la información básica de nuestra extensión:

    image

    Ahora escogemos las funcionalidades ofrecidas por nuestra extensión. Como solo quiero insertar la fecha y la hora, un comando de menú basta

    image

    Asignamos un nombre programático y uno descriptivo para nuestro comando. El nombre descriptivo es el que aparecerá en el menú Tools de Visual Studio 2013 para que al hacerle clic, la fecha y hora se inserte en nuestro editor:

    image

    El soporte a testing está incluido si lo deseamos. Por ahora no lo incluiré y sencillamente daré Finish:

    image

    Obtenemos entonces una solución nueva con esta estructura:

    image

    El archivo que seleccioné es el core de nuestro comando y allí es donde lo vamos a implementar.

    Si alguna vez escribieron macros para VS con VB, recordarán el famoso objeto DTE (Development Tool Environment). Este es el objeto que encapsula toda el modelo de objetos de automatización de Visual Studio. Así que recurriremos a él para poder intervenir en el editor de código.

    El assembly que lo incluye (EnvDTE) ya viene referenciado por el wizard. Así que solo basta incluir el Namespace.

    using EnvDTE;

    Ahora buscamos el método MenuItemCallback y borramos el código por defecto que incluye.

            private void MenuItemCallback(object sender, EventArgs e)
            {
                
            }

    El código que escribamos dentro de este método será el que se ejecute cuando el usuario le hace clic al comando. Copiaré aquí todo el código con extensos comentarios para que observen como trabajé la extensión:

    private void MenuItemCallback(object sender, EventArgs e)
    {
    //Obtenemos una referencia al objeto DTE


    DTE dte = GetService(typeof(DTE)) as DTE;
    //El objeto DTE tiene un documento activo y es aquel
    //archivo de código sobre el que estamos
    //trabajando actualmente. Este documento activo tiene
    //varios objetos sobre los que podemos actuar. Aquí como
    //modificaremos el texto, hacemos referencia al contenido
    //de texto del documento activo:
    TextDocument objTextDoc =
    dte.ActiveDocument.Object("TextDocument")
    as TextDocument;

    //Este objeto de tipo TextDocument tiene un atributo
    //llamado Selection que como su nombre lo indica, nos
    //permite acceder al texto seleccionado en el editor.
    //De esta manera nos permite cambiarlo. Si no hay texto

    //seleccionado, entonces nos retorna cadena vacía.
    //Qué pasaría si cambiamos el texto en este caso?
    //Correcto, se inserta un nuevo texto en la posición actual
    //del cursor. Entonces sencillamente procedemos:
    objTextDoc.Selection.Text = String.Concat(DateTime.Now.ToShortDateString(),
    " - ",
    DateTime.Now.ToShortTimeString()); }

    Y bien, apuesto que muchos de ustedes jamás pensaron que fuera tan fácil escribir una extensión para Visual Studio 2013.

    Ahora, para probar la extensión, en Visual Studio siempre hemos tenido una gran característica que es la instancia experimental de Visual Studio. De manera que nuestras extensiones propias no vayan a dañar nuestra instalación en producción de Visual Studio. O sea que si ejecutamos este proyecto, se abre otro Visual Studio (experimental) y la extensión se ejecuta solo sobre este último (imagínense un “emulador” de VS). El debug se hace idéntico a el que se haría con cualquier tipo de aplicación convencional:

    image

    Y el resultado de hacer clic sobre el comando:

    image

    Ahora solo basta compilar ir a la carpeta bin por nuestro archivo .vsix, que es auto instalable en los sistemas con Visual Studio 2013:
    image

    Si le damos doble clic, nuestra extensión se instalará ahora sí en nuestra versión de producción de Visual Studio y ya no tendremos problema porque no sabemos en qué fecha estamos cuando vayamos a poner un timestamp! Smile

    He abierto el código fuente de esta solución y lo puedes encontrar en mi cuenta de Github:

    Por si fuera poco, si queremos compartir la extensión, la podemos subir gratuitamente a la Galería de Visual Studio donde miles de desarrolladores tendrán acceso a ella. El proceso es muy sencillo y permite además de subir la extensión ponerle tags para que por ejemplo cuando un desarrollador busque insert timestamp, obtenga resultados: 

    image

    Es más, si desde dentro de Visual Studio el developer entra a Tools->Extensions and Updates, nuestra extensión también queda disponible:

    image

    Es una excelente forma de compartir con la comunidad!!!

  • WarNov Developer Evangelist

    Usar Visual Studio 2013 con Github

    Este párrafo solo es para dar una ligera indicación de la manera más cómoda para trabajar nuestro código a ser creado con VS2013, hospedándolo en Github, sobretodo al iniciar un nuevo desarrollo.

    En este caso solo es necesario crear el repo en Github. Luego de allí sacamos la url del mismo:

    image

    Después de esto fijamos la carpeta local sobre la que queremos trabajar la solución. Una vez fijada, en Visual Studio ejecutamos el clone ANTES de crear la solución:

    Abre el Team Explorer y selecciona conexiones:

    image

    Y ejecuta estos pasos:

    image

    1. Pegar la URL del repo
    2. Ubicar el folder local
    3. Clonar el repo

    image

    Solo después de la clonación, creamos la nueva solución. Primero escogemos el repo recientemente clonado:

    image

    Y entonces tendremos la opción de asociarle una nueva solución:

    image

    Luego de crear la solución de inmediato aparece el Solution Explorer, con todos los elementos nuevos (observa el símbolo + ) listos para hacer commit y posteriormente push a Github:

    image

     

    De esta manera, ya tendríamos sincronizada nuestra nueva solución con Github, lista para trabajar.

  • WarNov Developer Evangelist

    DynamicTableEntity: Azure Storage con Entidades Dinámicas

    Recuerdo por allá en la prehistoria de Azure cuando pocos éramos los que nos aventurábamos en esas aguas inexploradas, que cuando uno quería usar el Azure Storage y en especial las tablas, tenía que generar toda una capa de acceso a datos con la parafernalia que ello conlleva para poder usar el api que en esa época se llamaba Microsoft.WindowsAzure.StorageClient.dll. Hasta la versión 1.7 se llegó con este acercamiento. A uno le tocaba SIEMPRE crear clases correlativas a las tablas que estaban en el storage y además acoplarlas a la librería lo que hacía difícil las pruebas unitarias. Adicionalmente había que crear los wrappers para hacer operaciones CRUD.

    Luego vino el revolcón de la versión 2.0 del storage API que se identifica con el cambio de nombre a Microsoft.WindowsAzure.Storage.dll y después de esto, el fuerte encaminamiento que tomamos en Microsoft para ir a toda velocidad alcanzando los estándares y tendencias de la industria, obviamente con un trabajo impecable. Es así como hoy en día con el dominio del dinamismo y temas como nodejs y demás, ya vamos en la version 4 del api. Mantenemos el nombre desde la versión 2 porque los cambios no han sido tan “breaking”. Pero sí han traído cosas maravillosas como las DynamicTableEntity.

    Gracias a ellas, podemos trabajar con las Azure Tables desde el api para .net sin necesidad de mapearlas al estilo ORM como antaño era requerido. Solo basta entender un poco las abstracciones que hemos hecho sobre el storage, para hacer los llamados correctos.

    Es mi intención entonces en este post, mostrar la manera AGIL y DINAMICA de acceder al storage, en este caso, desde una sencilla aplicación de escritorio.

    Lo primero que hay que hacer es importar el api. Agrega una referencia a Microsoft.WindowsAzure.Storage.dll. Ojo; no uses Microsoft.WindowsAzure.StorageClient.dll porque es la versión antigua que no contiene la magia que voy a mostrar ahora.

    Del api, vamos a necesitar puntualmente dos Namespaces:

    using Microsoft.WindowsAzure.Storage;
    using Microsoft.WindowsAzure.Storage.Table;

    Acto seguido, creamos la conexión. Lo haremos “manualmente” sin necesidad de agregar más pasos por ejemplo a través del uso del CloudConfigurationManager, para mantenerlo todo más simple. Si vamos a usar el DevelopmentStorage, en este post muestro cómo hacer lo mismo.

    CloudStorageAccount _account = CloudStorageAccount.Parse(
       String.Format("DefaultEndpointsProtocol=https;AccountName={0};"
    "AccountKey={0}",
    "tucuenta",
    "45JHDAMEegL7G7wlCZhZ60UYNltbj6bZiH9x3eLHNSD1TEIQ+jw=="));

    Luego de esto, procedemos a crear un cliente de tablas. Este cliente, nos permitirá hacer todas las operaciones que requiramos con ella. Así hay clientes para blobs y colas. Anteriormente, todo esto quedaba dentro del mismo Namespace. Hoy en día, como vemos, tenemos un Namespace separado para cada elemento del storage de Azure. Aquí hemos incluido obviamente el Namespace de tablas.

    CloudTableClient _tableClient = _account.CreateCloudTableClient();

    Ahora supondremos que estamos trabajando sobre una cuenta de storage que ya tiene data probablemente obtenida a través de otra app y que lo que haremos es consultar dicha data. Usando Cloud Storage Studio:

    image

    Así pues, debemos obtener una referencia a esa tabla para poder trabajar con ella. Dicha referencia se obtiene a través del cliente que creamos:

    CloudTable _tblInventory = _tableClient.GetTableReference("Inventory");

    Ahora; cómo consultar dicha tabla sin tener una clase/entidad que la represente dentro de nuestro proyecto?

    Hay varios tipos de consultas sobre el storage de Azure. Podemos por ejemplo traer todos los elementos dentro de una partición dada, solo un subconjunto de elementos dentro de una partición, o solo un elemento obviamente especificando la PartitionKey y la RowKey. En este artículo encuentran una descripción de todas las operaciones que se pueden ejecutar sobre el storage. Solo que allí no se muestra cómo se puede operar sin necesidad de crear las entidades de mapeo. Y ese precisamente es el objeto de este post. Así que todas las operaciones indicadas allí, se pueden hacer dinámicamente, si siguen la metodología que describo aquí.

    Entonces para nuestra ilustración requeriremos hacer una consulta de todos los laptops que vende nuestra ficticia tienda de tecnología en la que en la tabla inventario tenemos como PartitionKey la categoría del elemento de tecnología, por ejemplo: compute, mobile, videogames, etc. En el RowKey tendríamos entonces la referencia de cada producto y además tendríamos entre muchas otras propiedades, la SubCategory del producto; por ejemplo, en la categoría cómputo, tendríamos subcategorías como laptop, PC, server, etc. Estamos interesados en laptops.

    Así que lo que queremos es seleccionar todos los elementos cuya PartitionKey=”Compute” y cuya Subcategory=”laptop”.

    Iniciemos entonces armando los filtros usando el método estático GenerateFilterCondition de TableQuery que trabaja así:

    (valorIzquierdo, operadorComparativo, valorDerecho):

    string categoryFilter = TableQuery.GenerateFilterCondition(
        "PartitionKey",
        QueryComparisons.Equal,
        "Compute");
    
    string subcategoryFilter = TableQuery.GenerateFilterCondition(
        "SubCategory",
        QueryComparisons.Equal,
        "Laptop");

    Ahora debemos combinar estos filtros con un “AND”, de acuerdo a nuestros requerimientos. Para esto usamos el método estático CombineFilters de la clase TableQuery que recibe dos filtros y un operador lógico.

    (Filtro1, Operador, Filtro2):

     string combinedFilters = TableQuery.CombineFilters(
         categoryFilter,
         TableOperators.And,
         subcategoryFilter);

    Como se puede ver, todo esto es mero texto. Pero usando estos metoditos nos ahorramos posibles errores al manipular mucho texto, como cuando escribíamos comandos de “T-SQL” para ejecutar por allá en los tiempos del ADO.NET. De hecho, el filtro resultante es:

    (PartitionKey eq 'Compute') and (SubCategory eq 'Laptop')

    Que si ponemos en una herramienta como Cloud Storage Studio nos da:

    image

    Todo esto porque nos basamos en el estándar de WCF Data Services Filters.


    Ahora usamos todo eso para armar una instancia de TableQuery que luego una tabla (tblInventory) ejecutará, obteniendo un conjunto IEnumerable de precisamente DynamicTableEntity, donde cada elemento es un registro coincidente con la consulta:

    TableQuery query = new TableQuery().Where(combinedFilters);
    IEnumerable<DynamicTableEntity> virtualResults = 
        _tblInventory.ExecuteQuery(query);

    Hasta aquí solo tenemos la definición del conjunto de datos que queremos y esto es Lazy; o sea que aún no se ha ejecutado contra el servidor, pues esto solo sucede cuando en realidad iteremos sobre los elementos. Por ejemplo si convertimos esto a una lista de DynamicTableEntity:

    List<DynamicTableEntity> laptops = virtualResults.ToList();

    Ahora supongamos que queremos mostrar en la consola las referencias de cada uno de los elementos filtrados (laptops) y la existencia actual. Entonces sencillamente podríamos escribir:

    foreach(var laptop in laptops)
    {
        Console.WriteLine(
            String.Concat(
                laptop.RowKey,
                "\t",
                laptop["StockAmount"].Int32Value));
    }

    Obsérvese que las propiedades nativas de las tablas de Azure como PartitionKey, RowKey, ETag, y Timestamp vienen fuertemente tipadas en una DynamicTableEntity, mientras que a las demás debemos acceder a manera de diccionario, además teniendo la facilidad de elegir el tipo de dato que vamos a recibir.

    Al final obtenemos:

    image

    De esta manera tendríamos cubierta la consulta de elementos tablas de Azure de manera dinámica.

    Ahora; cómo se haría una inserción o un update?

    Para explicar ambas cosas usaré la operación InsertOrReplace que ejecutará nuestra tabla. En este caso, primero necesitaré ejecutar la operación Retrieve para ver si el elemento que busco ya existe y modificarlo, o si no, crear uno nuevo.

    TableOperation retrieve = TableOperation.Retrieve("Compute", "X220");
    TableResult retrievedLaptop = _tblInventory.Execute(retrieve);
    //Tenemos que hacer un casting a DynamicEntity para trabajar ágilmente
    //El resultado originalmente viene en un object
    DynamicTableEntity dynaLaptop = 
    (
    DynamicTableEntity)retrievedLaptop.Result;

    Por ejemplo, llegó un embarque de 100 laptops de referencia X220 y hemos de agregarlos al inventario. Ya existirán? En ese caso debemos hacer un update. Si no, será una inserción nueva.

    Veamos; si la entidad no existe, entonces creamos una nueva:

    if(dynaLaptop==null)
    {
        dynaLaptop = new DynamicTableEntity()
        {
            PartitionKey = "Compute",
            RowKey = "Laptop"
        };
    }

    Solo las propiedades nativas de las tablas de Azure como PartitionKey, RowKey, ETag, y Timestamp vienen por defecto en una DynamicTableEntity. Las otras como “stockAmount” debemos incluirlas de la siguiente manera:

    dynaLaptop.Properties.Add("StockAmount", 
    EntityProperty.GeneratePropertyForInt(100)); dynaLaptop.Properties.Add("SubCategory",
    EntityProperty.GeneratePropertyForString("Laptop")); /*No es necesario crear propiedades para todos los campos
    existentes en la tabla. Aquí intencionalmente dejé por fuera
    ModelName y UnitPrice. Además dada la flexibilidad del
    Azure Storage, podemos agregar propiedades que no estaban
    antes en la tabla:*/
    dynaLaptop.Properties.Add("HDD",
    EntityProperty.GeneratePropertyForString("300GB"));

    Si por el contrario, la entidad ya existía, lo que hacemos es actualizarla:

    dynaLaptop["StockAmount"].Int32Value += 100;                
    //Aquí también podemos aregar nuevas propiedades
    dynaLaptop.Properties.Add("RAM", 
    EntityProperty.GeneratePropertyForString("32GB"));

    Así que ahora que ya tenemos la entidad lista para enviarla al storage usamos:

    TableOperation updateOperation = 
    TableOperation.InsertOrReplace(dynaLaptop); _tblInventory.Execute(updateOperation);

    Si luego de esto chequeamos la tabla en la nube tenemos:

    image

    Donde se aprecia que se insertó el nuevo elemento con la nueva propiedad HDD. Y que no pasó nada, por no haber indicado por ejemplo un ModelName.

    Ahora, si volvemos a ejecutar, lo que tendremos es un update, donde se sumarán otras 100 unidades y se agregará la propiedad RAM:

    image

    Y eso sería todo. La solución completa la pueden encontrar en GitHub:

    Hemos visto entonces cómo podemos acceder al Azure storage de una manera ágil y dinámica, sin necesidad de hacer montones de preparativos código circenses para lograrlo. Al mejor estilo nodejs ;) Algo muy útil cuando ya tenemos datos en la nube y queremos hacer un sencillo cliente para usarlos, sin necesidad de montar toda una arquitectura de mapeo detrás; cosa que obviamente aún sigue estando disponible para los desarrollos que lo justifiquen.

  • WarNov Developer Evangelist

    MÁS ALLA DE LOS MOBILE SERVICES: Una nueva era en el backend

    Update:

    Descarga la presentación PPT de este post de aquí:

    Y el código de ejemplo de aquí

    Seguramente ya has trabajado algo con Azure Mobile Services (en este artículo ZuMo) o al menos los has oído nombrar y sabes que son usados para que tus apps puedan acceder fácilmente a un backend a través de llamados http o de apis nativas en las plataformas de desarrollo de esas apps que lo encapsulan.

    Eso a simple vista suena muy sencillo y directo, pero en realidad nos estamos enfrentando a todo un nuevo paradigma de desarrollo que cambia las reglas y las formas en que se hacen las cosas, sobre todo para nosotros los desarrolladores que venimos del mundo .net tradicional.

    Con ZuMo podemos tratar escenarios tan abstraídos y sencillos como insertar datos en una tabla de SQL Database, reaccionar ante un update o enviar una push Notification:

    image

    Pero no estamos restringidos solo a estas operaciones básicas. Hoy en día a través de ZuMo podemos generar APIs personalizadas que podemos llamar cuando queramos. Podemos establecer Jobs que se ejecuten automática y periódicamente; podemos aprovechar los mecanismos de autenticación provistos out of the box y mantener el código y desplegarlo con GIT, entre muchas otras características provistas por esta plataforma que aprovecha lo mejor de Azure.

    En síntesis, hemos pasado de proveer un mecanismo que nos permitía guardar datos en la nube con cierta lógica, a tener todo un servidor de Backend para aplicaciones conectadas. Y obsérvese que no usé el término APPs, sino aplicaciones. Quiero decir entonces que esto no solo es para los móviles. Es tan robusto el esquema ofrecido por ZuMo, que claramente puede apoyar aplicaciones web, escritorio, etc. para ejecutar tareas específicas.

    De hecho, en ocasiones como lo veremos en este artículo, TODO el backend puede dejarse en manos de mobile services y así proveer funcionalidad a clientes web, móviles y lo que sea que pueda establecer una conexión HTTP. Y lo mejor de todo, es que esto se logra con ventajas sobre los modelos tradicionales.

    Qué ventajas se pueden obtener de un backend?

    1. Performance en la ejecución

    2. Performance en el storage

    3. Capacidad de storage

    4. Simplicidad de desarrollo

    5. Ahorro$

    Y en Azure qué elementos proveen estas ventajas?

    1. Servidores nodejs en Mobile Services
    image

    2. Azure Storage (tables, queues, blobs; particularmente: tables con su esquema NoSQL)

    Estos dos elementos tienen un performance sin igual comparado con esquemas tradicionales como los obtenidos con servidores ASP.NET o SQL Server. Adicionalmente el costo es mucho menor,

    Esto sucede ya que nodejs o el Azure storage no están enriquecidos con todas las abstracciones, características y herramientas adicionales que traen unos servidores tan robustos como IIS o SQL Server.

    Por ende, la ejecución es más veloz y los costos mucho menores!

    Son más bien elementos muy básicos que hacen extremadamente bien lo “poco” que hacen. Y esto nos lleva entonces a ver que tampoco es que sean la receta mágica de todo backend. Son más bien elementos que resuelven muy bien cierto tipo de problemas, al contrario de los servidores tradicionales que han sido construidos tratando que puedan solucionar todo tipo de problemas. Precisamente esto es lo que los convierte en piezas de software muy grandes que consumen muchos recursos y que pueden resultar más costosas.

    Esto no implica entonces que hoy en día no sigan siendo súper relevantes los servidores tradicionales (como IIS o SQL). De hecho imagínate construir todo un ERP encima de un modelo NoSQL donde no hay manejo de integridad referencial incluido en la herramienta. Eso es reinventar la rueda. Y ni hablar por ejemplo de la administración de conexiones y seguridad en los servicios que provee automáticamente IIS: en últimas tendrías que volver a escribir estos servidores para que hagan todo esto que ya se ha resuelto.

    El asunto es que hay tareas que no requieren de toda esta parafernalia. Por ejemplo una app que ofrezca resultados deportivos alrededor del mundo. Que se pueda ejecutar desde cualquier dispositivo o internet browser.

    Si lo pensamos, el modelo de datos es relativamente sencillo. Solo hay unas pocas entidades. Así que mapearlo en un esquema NoSQL, aunque es más complicado que mapearlo en un modelo E-R, no es una cosa imposible o muy difícil de hacer.

    Como es una aplicación abierta al público en general, el manejo de seguridad es bien sencillo. Además la funcionalidad la podemos mapear en sencillos métodos que ejecutan procesos sobre los datos almacenados. Estos métodos pueden ser escritos dentro de las apis personalizadas de mobile services y entonces ser llamados desde cualquier lugar del mundo a través de HTTP. Esto sin mencionar que ZuMo ofrece mecanismos de autenticación integrada con Facebook, Twitter, Google, Active Directory y la posibilidad de generar nuestros propios mecanismos.

    Obsérvese que al ser esta una aplicación mundial abierta al público, se espera una gran cantidad de peticiones por unidad de tiempo. Pero al estar todo montado en nodejs, podremos responderlas sin mucho problema y escalar de acuerdo a las poderosas ventajas ofrecidas por Microsoft Azure. El storage podrá almacenar inmensas cantidades de información (centenares de teras) y de acuerdo a cómo se hayan creado las tablas, ofrecerá unos tiempos de consulta inalcanzables por cualquier motor relacional de bases de datos (cosa que pasa por ejemplo con twitter o Facebook).

    Es este entonces un escenario propicio para implementar usando este nuevo paradigma de desarrollo en el cual se provee la lógica gruesa de la aplicación en un servidor nodejs para que los clientes (apps o browsers) puedan acceder a ella y el código que necesiten internamente sea mínimo. Facilitando por ende la engorrosa tarea de la portabilidad y esta es otra inmensa ventaja que sale naturalmente a través de este cambio.

    Con lo anterior solo bastaría hacer ciertas salvedades antes de dar el paso e ir a programar nuestro backend con nodejs en Mobile Services y Azure table storage.

    1. Mobile Services YA soporta .net como plataforma, a través de WebAPI. Esto permite que el desarrollador pueda hacer su backend sin necesidad de aprender nodejs. Pero como la arquitectura .net es distinta a la nodejs, entonces no se tendrán las ventajas de performance obtenidas con nodejs.

    2. Mobile Services SIEMPRE ha soportado SQL Database. Así que si se requiere generar un backend contra un modelo relacional tradicional (el desarrollo es más sencillo), no hay ningún problema.

    3. Desarrollar para nodejs y Azure table storage no es tan sencillo como desarrollar .net sobre un modelo relacional. Muchas abstracciones del modelo tradicional no se encuentran en nodejs ni el table storage. Así que en general habrá que esforzarse un poco más en el desarrollo y entender muy bien los conceptos de la arquitectura de un único hilo que no se bloquea en nodejs o de la forma en que las tablas nosql trabajan.

    4. No existe un IDE completo que abarque todo el ciclo de desarrollo con nodejs y Azure Storage. Por ejemplo con Visual Studio y ninguna otra herramienta adicional, es posible construir toda una aplicación cliente servidor desde la misma base de datos, pasando por la lógica de negocio, hasta el cliente web y las apps Windows. De hecho aunque el soporte a Javascript ha mejorado enormemente aún siguen habiendo algunas falencias:

    i. La habilidad de tener un tipo de proyecto que sea solo JavaScript: Esto se puede emular con un proyecto de tipo web, pero no es tan práctico

    ii. Incluir un ejecutor de scripts que use por ejemplo el intérprete de nodejs integrado: Emulable usando la Nugget Package Manager console para ejecutar los scripts.

    iii. No existe una integración visual con GIT para mantener y desplegar el código a Azure: Emulable usando la Nugget Package Manager console para ejecutar los comandos de GIT pero no en modo visual.

    iv. No existe un debugging difuso en tiempo de diseño para minimizar errores en un lenguaje interpretado como JavaScript: Update: El update 2 de Visual Studio 2013 ya incluye JSHint integrado en la edición de JavaScript, que permite tener más confianza y velocidad en el JavaScript que escribimos a través de su analizador de código estático:

    image

    5. No existe un cliente REST integrado para hacer testing rápido de los Servicios: Se puede usar una herramienta separada como Fiddler o Postman para hacer este testing, o tal vez usar curl desde la consola de NPM.

    Dadas todas estas condiciones recomiendo altamente usar un editor Javascript avanzado mientras existe más soporte en Visual Studio para lo que podríamos llamar proyectos Javascript o nodejs como tal. Una buena alternativa sería WebStorm, aunque no es gratuito, pero tiene versiones para Windows, Linux y Mac y posee todas las características descritas anteriormente.

    Adicionalmente para operar rápida y eficientemente el Azure Storage, recomiendo ampliamente Azure Management Studio de Cerebrata. Que a pesar de no ser gratuito ofrece numerosas ventajas para tener un buen entorno de desarrollo sobre el cloud en la parte del storage. Una alternativa gratuita podría ser Azure Storage Explorer.

    La metodología descrita hasta ahora, la he sumarizado luego de desarrollar varios proyectos sobretodo enfocados a aplicaciones móviles. Y para darle identidad, he creado el término nojats. Una aplicación nojats, está hosteada en Azure,  tiene su backend en nodejs (noj) y el almaceniamiento lo maneja con el Azure Table Storage (ats).

    Así que luego de esta introducción a las aplicaciones nojats, en posteriores posts, estaré mostrando más detalles de cómo optimizar el ambiente de desarrollo para explotar al máximo todas las ventajas que les he mencionado.

    Particularmente mostraré en la siguiente entrega cómo usar WebStorm para optimizar el trabajo con JavaScript Azure Mobile Services.

  • WarNov Developer Evangelist

    El titán ágil (Los Resultados)

    image

    Este es el desenlace de la dupla de posts que emergieron como consecuencia del gran cambio que está teniendo Microsoft desde sus entrañas técnicas, logrando una velocidad de desarrollo y evolución que creo no se habían visto nunca. Esta parte tiene un toque netamente técnico mostrando los últimos anuncios del TechEd para tener en cuenta en tus futuros proyectos de software. Si quieres leer la primera parte que es más teórica, puedes hacer clic aquí.

    Los anuncios fueron tanto para developers como para IT Pros.

    Como los estaré mencionando a manera global, incluiré un resumen de ambos, para nuestra cultura general.

    Developers:

    Comencemos con Azure API Management: Las organizaciones podrán exponer los componentes públicos de su core de negocio de manera segura y escalable a través de proxies en Azure que exponen estos componentes con APIs que se consumirán por nuevos clientes. Este servicio hace transparente la administración, elasticidad y configuración de las apis expuestas, minimizando las operaciones adicionales para establecer este nuevo canal para las empresas.

    image

    En cuanto a caché, Azure Cache Services pasa a disponibilidad general mientras que a evaluación entra nuestro Azure Redis Cache basado en el OSS Redis. Este será accesible por cualquier aplicación dentro de Azure.

    image

    Y si siempre quisiste tener en Azure una máquina de desarrollo accesible desde cualquier parte del mundo, ahora es posible, ya que para todos los suscriptores de MSDN están disponibles las imágenes de máquinas Windows 7 y Windows 8.1 en el catálogo de máquinas virtuales para que despliegues en la nube.

    Recuerda sin embargo que para mantener nuestros desarrollos EN la nube, también tenemos disponible Visual Studio Online que ahora expone APIs que permitirán la integración con servicios de terceros, de manera que las organizaciones lo puedan adoptar sin abandonar las herramientas que están usando actualmente mientras los desarrolladores pueden construir apps en cualquier plataforma que pueda consumir estos servicios. Adicionalmente, hemos hecho una asociación con OpsHub con el fin de ofrecer una utilidad de migración gratuita desde TFS hasta Visual Studio Online. Y para finalizar en cuanto a mejoras para la administración de los proyectos de software, anunciamos el soporte a Desired State Configuration (DSC) a través de nuestra herramienta de Release Management para Visual Studio mediante la cual a través de scripts de PowerShell podremos administrar infraestructura de despliegue de nuestras aplicaciones no solo nivel on premises, sino cloud también, aún en un mismo proyecto de despliegue híbrido. Así que ya no hay que recurrir a servicios externos como Puppet o Chef.

    También anunciamos la liberación de BizTalk Server 2013 R2, el Update 2 de Visual Studio 2013 con cuyas novedades se podría escribir un tratado completo y ASP.NET vNext, nuestro framework web orientado de manera nativa a la nube que sale a evaluación y será parte de .NET Foundation como un proyecto OSS que correrá en múltiples plataformas a través de una asociación con Xamarin.

    Las actividades con Xamarin son varias, recuerden también que gracias a ellos los desarrolladores .NET podemos compilar apps nativas hechas con Visual Studio para iOS y Android. Pero además, ahora también anunciamos otra estrategia multiplataforma que vamos a poder usar para hacer apps desde Visual Studio y es la integración con Apache Cordova (Multi-Device Hybrid Apps for Visual Studio – CTP). Con estas herramientas, los desarrolladores web podemos usar nuestros conocimientos en HTML y Javascript para crear aplicaciones híbridas empaquetadas que toman ventaja de las capacidades de cada dispositivo.

    Ahora IT Pros. Ojo, que muchos de los anuncios para IT Pros, también aplican para Developers.

    IT PROS

    Comencemos con Microsoft Azure: ya hemos puesto en disponibilidad general las máquinas A8 y A9 con una capacidad de procesamiento gigante para hacer modelaciones, simulaciones y renderizado de películas, por ejemplo. Igualmente nuestra tecnología de ExpressRoute está disponible para crear conexiones de red físicas directas y privadas entre el data center propio de una empresa y la nube de Azure; a parte de seguridad esto nos provee unas velocidades de transferencia inigualables. De hecho otro mecanismo que ahora proveemos para transferir archivos desde y hacia la nube, es Azure Import/Export que permite agregarlos o extraerlos a través de discos duros físicos como tal; obviamente esto facilita la transferencia de grandes cantidades de información que tal vez queramos compartir entre nuestros servicios de nube provistos por distintas instancias. Y precisamente para apoyar la compartición de archivos en la nube, acabamos de implementar Azure Files. A través de esta tecnología podemos crear un repositorio de archivos compartidos a través del protocolo SMB, montado sobre nuestras máquinas virtuales en Azure. Esto permite que compartamos los archivos de una ubicación centralizada de manera concurrente entre otras varias máquinas virtuales o roles de plataforma como servicio.

    Una característica que me ha encantado y que siempre me habían solicitado mucho, es Azure RemoteApp, a través de la cual las aplicaciones de negocio que corran sobre Windows Server se pueden ejecutar desde la nube, permitiendo a los clientes conectarse a ellas desde sus PCs, laptops, tablets o teléfonos a través de Microsoft Remote Desktop para ejecutarlas como si corrieran localmente, mientras esas apps escalan y se actualizan de una manera muy sencilla.

    Otras nuevas características de nuestra nube: Balanceo de carga interno de máquinas virtuales disponible, Traffic Manager pasa a disponibilidad general permitiendo controlar la distribución del tráfico de los usuarios a distintos endpoints tanto dentro como fuera de la nube, mientras Biztalk Hybrid Connections permite que desde Azure nos podamos conectar con cualquier recurso de una red local via HTTP o TCP, sin necesidad de escribir código adicional; además para la conectividad ofrecemos VPNs de tipo site-to-site y VNET-to-VNET, reservación de IPs públicas fijas, implementación de seguridad con Microsoft Antimalware y con productos de partners nuestros como Trend Micro y Symantec, mejoras en Azure Active Directory Premium que incluyen el nuevo motor de sincronización llamado Azure AD Sync y para finalizar, esperamos en Junio Azure Site Recovery: un mecanismo que permite replicar máquinas virtuales ubicadas en el date center del usuario, directamente a Azure, o a cualquier otro data center!

    Bien, ya sabes que cosas nuevas ofrece el mundo Microsoft para ti. Así que solo basta con que emplees lo que necesitas para materializar esa solución que tienes en mente. Cualquier duda o comentario, es bienvenido! Con gusto los atenderé. Smile

  • WarNov Developer Evangelist

    El titán ágil (La transformación)

    Definitivamente esta es otra era. Sobre todo para Microsoft. Pueden ser varios los motivos y sabemos que por algún tiempo parecía que el titán reposaba sobre el palacio que construyó en las últimas dos décadas, mientras nuevos titanes se hacían y construían sus propios palacios que a decir verdad, por grandes que sean, solo llegan a ser como una habitación del primero. Y tal vez esto mismo le dificultó en su momento moverse tan rápido como sus competidores.

    clip_image002

    Uno se pone a ver y si se hiciera una matriz de empresas y sus competidores, la que más tendría intersecciones sería efectivamente Microsoft y esto no es más que el fiel reflejo de la injerencia que se tiene en la industria. Y analistas como Gartner, muestran que ya a la hora del retorno de la inversión se ven los resultados de esta grandeza:

    Así que en realidad el tamaño aquí no tiene comparación.

    Esto no quiere decir sin embargo que el titán no pueda despertar de los laureles y ponerse en forma para aprender a ser ágil! Sobretodo viendo que hay tanto en disputa. Tanto que se está perdiendo. Tanto que se puede ganar.

    A estos hechos que hoy día acaecen puedo tildarlos como afortunados dado que nos han obligado a espabilarnos y en realidad hacer evidente el material del que estamos hechos en Microsoft.

    Tanto así, que no ha terminado de pasar el Build (la conferencia más importantes para desarrolladores de Microsoft) que definitivamente me dejó abrumado con toda la cantidad de cosas anunciadas (y eso que ya en secreto conocía algunos de los anuncios), cuando ya apenas pasado un mes llega el TechEd con otra ola de novedades que amenaza con freírnos el cerebro a quienes trabajamos sobre esta brillante plataforma.

    Producir tantos updates y novedades en tan poco tiempo realmente requiere unas calidades que no se logran de la noche a la mañana. Son calidades que abundan en Microsoft, pero que no habían podido desplegar todo su potencial hasta que en esta coyuntura se han mostrado aún desde los mismos grandes líderes internos como el mismísimo Nadella o el genial Guthrie.

    Cuando me imagino a los grupos de desarrollo de producto allá en Redmond no puedo evitar preguntarme como están haciendo para ir tan increíblemente rápido… y me maravilla pensar entonces qué cosas tendremos de aquí a un año… qué estaré evangelizando y usando en los productos que genero. Es sencillamente fantástico y me encanta ver un futuro tan promisorio.

    Sin embargo tratar de digerir todo este contenido puede llegar a ser como haber pedido unas onces y a cambio recibir entrada, plato fuerte, postre y café… pero para 8 personas y consumirlo y digerirlo antes de que llegue la cena.

    En la mayoría de casos lo que recomendaría es que de acuerdo a tu especialidad te “comas” solo lo que te va a alimentar. Bien sea que vas por web, por apps, por dbs, o por backend. Para todos tenemos en nuestro menú.

    En otros casos como el mío, tenemos que estar al tanto de todas las posibles opciones que hay para poder imaginar cómo será nuestro siguiente producto de software y accionar los recursos requeridos para que hagan una implementación impecable.

    De cualquier manera, es útil encontrar en algún lado el abrebocas que nos deje saber de qué trata el plato fuerte que escojamos consumir… o tal vez queramos solo tener un almuerzo de entradas, porque solo con eso basta para satisfacer nuestra hambre conceptual. Precisamente en el desenlace de este post: El titán ágil (Los Resultados) que publicaré el día lunes, encontraremos ya este contenido meramente técnico que nos dejará al día con todas las cosas nuevas en las tecnologías de cloud y desarrollo de Microsoft desde un punto de vista global.

    Por último quiero reafirmar algo que ya muchos están notando pero sé que otro tanto aún no conoce, para que ustedes cuando puedan se lo cuenten: y es que ese titán que veían por allá aislado y muy pausado en su andar, hoy es otro que socializa más con todos los chicos de la cuadra y que además parece que ha aprendido parkour, porque ahora va a una velocidad vertiginosa librando todos los obstáculos que se atraviesan en su camino. Estoy seguro que más de ustedes querrán acompañarme a montarme en hombros de este titán que nos ayudará a convertir en realidad nuestros sueños tecnológicos de unas formas que difícilmente imaginábamos antes.

  • WarNov Developer Evangelist

    Presentando: Microsoft Project Siena

    Microsoft Project Siena (nombre código) es una nueva Tecnología en Beta que permite crear apps orientadas a línea de negocio (LOB Apps) sin ningún tipo de programación, aprovechando los datos y contenido corporativos, así como servicios web.

    Estos son algunos ejemplos de los tipos de apps que se pueden crear con Microsoft Project Siena:

    • Apps para consumir información, como catálogos de productos y planes de entrenamiento basados en vídeo.
    • Apps para toma de decisiones, tales como reclamaciones de seguros.
    • Apps para capturar datos, imágenes, audio y escritura a mano en terreno.

    Construir una aplicación de Siena es tan fácil como editar una presentación de PowerPoint o una hoja de cálculo Excel. Basta incluir algunas imágenes en la app y enlazarlas a un conjunto de datos o servicios.

    Para la lógica especial se pueden escribir algunas expresiones al estilo de las usadas en Excel. Se puede utilizar la app inmediatamente, o compartirla con colegas.

    En este video, veremos como en minutos tenemos lista una app de catálogo de ventas sin ningún esfuerzo.

  • WarNov Developer Evangelist

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

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

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

    clip_image002

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

    clip_image004

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

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

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

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

    clip_image005

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

  • WarNov Developer Evangelist

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

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

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

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

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

    clip_image002

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

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

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

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

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

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

    Viste… servicios, dispositivos… servicios, dispositivos…

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

    clip_image004

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

    Conocen la historia del caballo de Troya?

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

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

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

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

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

  • WarNov Developer Evangelist

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

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

    En ese caso, te tengo la solución:

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

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

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

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

    http://warnov.com/@WPhoneUpdate3

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

    wp_ss_20131015_0001wp_ss_20131015_0002wp_ss_20131015_0003wp_ss_20131015_0004wp_ss_20131015_0005

  • WarNov Developer Evangelist

    Crónica de una supervivencia anunciada

     

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

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

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

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

    clip_image002

    Dijo @caycedo

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

    No llovió.

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

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

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

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

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

    Ahí está! Ahí está!

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

     

    WP_000898WP_000899WP_000902WP_000903

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

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

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

  • WarNov Developer Evangelist

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

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

    Encoding

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

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

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

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

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

    Funciones

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

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

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

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

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

    image

    En Not Set, se usará Ansi por defecto.

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

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

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

    Tipos de Datos

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

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

    Literales

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

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

    wcscmp(palabraBase,"mipalabra");

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

    wcscmp(palabraBase, L"mipalabra");

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

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

    Versión Ansi:

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

     

    Versión Genérica:

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

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

    Versión Unicode:

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

    WinRT: Live Tiles con Background Tasks

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

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

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

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

    image

     

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

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

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

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

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

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

    Enjoy!



  • WarNov Developer Evangelist

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

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

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

    split

    Descárgala con tu Windows Phone.

    Split My BillQRCode

    Cómo logré que esto sucediera?

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

    Funcionalidad:

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

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

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

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

    clip_image002

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

    clip_image003

    Utilidad:

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

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

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

    clip_image005

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

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

    Enjoyment:

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

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

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

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

  • WarNov Developer Evangelist

    Plugins para Construct 2 con JavaScript y Visual Studio

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

    image

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

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

    Ingredientes:

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

    Resultado:

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

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

  • WarNov Developer Evangelist

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

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

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

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

    image

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

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

    image

    Dejemos esa historia hasta ahí por ahora.

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

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

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

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

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

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

    Entonces todo comenzó a esclarecerse.

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

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

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

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

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

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

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

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

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

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

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

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

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

    CONCLUSION:

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

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

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

  • WarNov Developer Evangelist

    Por qué prefiero HTML5 para WinRT Apps?

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

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

    clip_image002

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

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

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

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

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

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

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

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

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

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

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

    Por qué relativamente pequeños?

    Porque para que el negocio funcione, tenemos dos limitantes:

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

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

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

    Tenemos dos vertientes entonces:

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

    clip_image004

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

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

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

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

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

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

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

    Por qué es esta paradoja?

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

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

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

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

    Estas herramientas no son otras que Blend y Visual Studio.

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

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

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

    clip_image006

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

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

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

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

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

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

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

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

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

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

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

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

    clip_image008

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

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

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

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

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


    clip_image010


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

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

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

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

    clip_image012

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

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

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

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

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

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

    clip_image014

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

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

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

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

    Lo dije: HTML5

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

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

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

    clip_image016

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

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

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

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

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

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

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

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

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

    shining

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

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

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

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

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

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

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

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

    image

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

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

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

    Vean; en síntesis, son estos puntos:

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

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

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

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

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

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

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

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

    Es por eso que prefiero HTML5 para WINRT apps.

  • WarNov Developer Evangelist

    Visual Studio 2013 y Apps Windows 8.0 y 8.1

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

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

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

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

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

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

    image

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

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

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

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

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

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

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

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

    appsok 

    Que hay de Windows 7?

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

     

  • WarNov Developer Evangelist

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

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

    image

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

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

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

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

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

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

  • WarNov Developer Evangelist

    LightSwitch: Aprovechando TFS Online para su uso

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

    image

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

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

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

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

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

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

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

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

  • WarNov Developer Evangelist

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

    Esta es la mejor época para los geeks.

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

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

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

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

    xboxplay

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

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

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

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

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

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

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

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

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

    casette

     

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

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

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

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

    Funciona de la siguiente manera:

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

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

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

    3. Juegas

    Preguntas?

    Si:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Kinect 2 y Precio

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

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

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

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

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

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

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

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

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

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

    Xbox On

    Netflix

    Fringe

    y ver la serie...

    Luego:

    Xbox

    MTV

    Y luego al ver que son puros realities,

    XBOX

    Forza

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

    Luego dices:

    Xbox

    Poker Stars

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

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

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

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

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

    preorder 

  • WarNov Developer Evangelist

    Exportando SQL Data desde Visual Studio

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

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

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

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

  • WarNov Developer Evangelist

    WebMatrix: Personalizando el Editor de Código

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

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

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

    image

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

    image

     

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

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

Page 1 of 14 (326 items) 12345»