• WarNov Developer Evangelist

    Paso a paso para instalar SQL Server 2012 Evaluation en Windows 7 SP1 (32 bits)

    • 0 Comments

    La versión 2012 de Sql Server ya está muy evolucionada. Nuestro servidor de Base de Datos ahora está ahora enfocado nativamente a trabajar con Cloud Computing y tiene unas mejoras que siempre hemos esperado y además sorpresas en su funcionamiento que nos hacen nuestro trabajo cada vez más fácil y agradable.

    La siguiente, es una guía de instalación de este producto que en su momento tuvo el nombre código Denali.

    Ha sido preparada por un gran amigo muy querido por toda la audiencia técnica de Latinoamérica. Se trata de Guillermo Taylor, quien muy amablemente me  ha permitido invitarle a postear su guía en mi blog. Guillermo es reconocido sobretodo por los IT Pros. Y es que SQL Server es una tecnología que une ambos mundos: Desarrollo y IT de una manera muy fluida. Es por esto que aprovecho este post, para anunciar el estreno del blog para IT Pros Colombianos. Que estará tratando temas específicos de esta área y donde encontramos como regalo de bienvenida dos excelentes libros para IT Pros. Además, este post también estará allí, para que la audiencia de IT lo encuentre en un ambiente más especializado para ellos.

    Sin más preámbulos, aquí los dejo con esta excelente guía.

    Compilado por Guillermo Taylor para el evento IT Camp 2011 – Track SQL Server 2012

    Abstract

    Este documento recopila los pasos realizados para instalar SQL Server 2012 Evaluation en un sistema Windows 7 Ultimate SP1. Durante el paso a paso, se incluirán imágenes que aclararán mejor este; sin embargo no todos los pasos incluyen o tienen una imagen asociada, principalmente en donde estime que no es conveniente. De igual manera, no asumo responsabilidad alguna por algún paso realizado erróneamente o que no se tuvo en cuenta o que no aplica para un sistema operativo diferente. Por último, este documento se hace para efectos ilustrativos de cómo realizar una instalación del producto SQL Server 2012 Evaluation y de ninguna manera me compromete con los resultados obtenidos al seguirlo.

    Pasos

    Configuración de IIS en Windows 7

    Antes de instalar y de configurar SQL Server 2012 y particularmente Reporting Services en un PC corriendo Windows 7 SP1, validé, particularmente por trabajo realizado en servidores, que tuviese al menos el Internet Information Server corriendo.

    Este es un servicio que generalmente no se habilita en desktops o laptops, pero que para efectos de lo que quiero hacer, tengo que activarlo. Para esto, hay dos maneras de hacerlo; la manual, que es la que describiré en este post y la automática, la cual contempla la instalación mediante Microsoft Web Platform Installer y que además permite instalar SQL Server Express y Visual Web Developer Express, entre otras herramientas.

    El método manual es el siguiente, solo para habilitar el IIS en Windows 7; si ya lo tienen habilitado, sugiero no hacerlo.

    Primero, hay que abrir el panel de control de Windows 7:

    Seleccionar la opción "Programs":

    Y dar clic en la opción "Turn Windows features on or off", recordando que si no son administradores en esta máquina, ésta les pedirá que eleven los privilegios para ejecutar esta opción.

    La ventana que me apareció, puede ser diferente en su caso en cuanto a opciones habilitadas o no, fue ésta:

    A continuación, las opciones que se pueden habilitar:

    En este punto, hago el popular disclaimer de "instalen lo que necesiten y si lo instalan todo, a mí no me echen la culpa si algo no funciona". Si quieren saber qué hace alguna opción en particular, hagan "mouse hovering" sobre el elemento deseado y ahí les aparece un pequeño mensaje. Sin embargo, si les resalto lo que instalé en mi PC:

    Luego de la selección de las características, fui a la parte inferior de la ventana y presioné el botón de OK.

    Luego de algunos pocos minutos, sale el panel de control y IIS está instalado. Para validar que en efecto es así, abran una instancia de su navegador Internet y escriban en la barra de direcciones http://localhost. Debe verse algo similar a:

    Listo. Para abrir el IIS Manager, búsquenlo por la caja de búsqueda de Windows 7 ingresando inetmgr o Internet Information Services; yo no lo encontré en alguna de las opciones del menú Start, tal vez no busqué bien:

    Instalación de SQL Server 2012 Evaluation

    A continuación, los pasos a seguir para instalar el producto.

    Dirigirse a la ubicación del SQL Server 2012.

    Ejecutar SETUP.EXE. Como estoy como usuario, voy a correr el archivo con privilegios elevados. Para ello, doy clic derecho sobre el programa SETUP.EXE y en las opciones que aparecen, selecciono "Run as administrator".

    Aparece la siguiente ventana:

    En el panel izquierdo, ir a "Installation" y dar clic en la opción "New SQL Server stand-alone installation or add features to an existing installation":

    Aparece la siguiente ventana:

    Presionar OK. Esperar que se procese la operación:

    Para este RC, no hay actualizaciones…

    Presionar Next para que aparezca la siguiente pantalla:

    Como el Firewall está habilitado, sale ese aviso de precaución… Luego se indicará que hacer para que el Firewall esté debidamente configurado, sobre todo porque esta instalación contiene una instancia. Presionar Next para que aparezca esta pantalla:

    Presionar Next.

    En esta pantalla se deben aceptar los términos de licenciamiento. Es opcional lo de enviar utilización del producto hacia Microsoft. Presionar Next

    Seleccionar la primera opción, "SQL Server Feature Installation". Presionar Next

    Las características a seleccionar son:

    Si al presionar Next, les aparece esta pantalla:

    Es porque esta versión de SQL Server requiere el SP1 de Visual Studio 2010; esto porque el encontró rastros de la instalación anterior, es decir la de CTP3.

    Así que instalen el SP1 de Visual Studio 2010 para continuar con la instalación…

    Presionar Next

    El nombre de la instancia es sugerido. Y particularmente generé una instancia porque tengo una instancia por omisión de SQL Server 2008 R2 SP1.

    Presionar Next

    Presionar Next para que aparezca la pantalla de configuración del servidor

    Presionar Next

    Además de agregar la cuenta de instalación, agrego una de administración; esto porque como mejor práctica la cuenta de instalación no debe quedar registrada como administradora… De hecho, es muy probable que sea incluso una cuenta creada específicamente para dicho fin, por lo cual después se elimina…

    Se dejan los directorios de datos por omisión y se habilita FILESTREAM…

    Presionar Next

    Seleccionar Multidimensional and Data Mining Mode… Y agregar las mismas cuentas de administración…

    Luego de presionar Next, aparece la pantalla de configuración de SSRS. Seleccionar la opción de instalar y configurar.

    Presionar Next

    Presionar Next

    Presionar Next para que aparezca la pantalla de "Ready to Install":

    Presionar Install y esperar a que termine el proceso…

    Presionar Close.

    Ya en el menú principal del servidor, aparecen las opciones para ejecutar SQL Server 2012 RC0:

    Al correr el SQL Server Management Studio, tal vez les aparezca esta opción si tienen configurado un SQL Server 2008 o 2008 R2, como es mi caso:

    Yo indiqué que no…

    Ahora bien, la instalación de las bases de datos de ejemplo para SQL Server 2012 no tiene el instalador al que nos acostumbramos para versiones anteriores, por lo menos no por ahora… Así que hay que descargar los archivos y adjuntarlos a mano; no es difícil si se siguen las instrucciones.

    1. Descarguen el archivo AdventureWorks2008R2_Data.MDF desde http://msftdbprodsamples.codeplex.com/releases/view/55330 y ubíquenlo en la carpeta de datos de SQL Server. Para mi caso, dicha carpeta es C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA.
    2. Ejecuten el siguiente código:

    CREATE DATABASE AdventureWorks2008R2 ON

    (FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\AdventureWorks2008R2_Data.mdf')

    FOR ATTACH_REBUILD_LOG

    GO

     

    1. No se preocupen si sale alguna advertencia… La base de datos queda creada y lista para usarse…
    2. Para la base de datos dimensional o base del DW o de la solución BI, AdventureWorksDWDenali_Data, descarguen el archivo desde la misma ubicación del punto 1 y sigan los mismos pasos.
    3. El código a ejecutar es el siguiente:

    CREATE DATABASE AdventureWorksDWDenali ON

    (FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\AdventureWorksDWDenali_Data.mdf')

    FOR ATTACH_REBUILD_LOG

    GO

  • WarNov Developer Evangelist

    Breve Historia del Framework .NET

    • 11 Comments

    Otra de las preguntas frecuentes que tengo por ahí generalmente de personas que aún tienen que trabajar con desarrollos .net de legado (versión < 4.0), es: cuáles son las ventajas de hacer el cambio, sobre todo para tratar de convencer a sus líderes, para migrar.

    Lastimosamente ocurre una situación bastante particular, y es que cada versión del Framework ha hecho su trabajo muy bien. Así que una vez se termina una aplicación en determinada versión del Framework, no se ve la necesidad de evolucionar. Pero luego nos damos cuenta de que empezamos a limitar las implementaciones avanzadas que podríamos hacer a las que sí tendríamos acceso con la última versión.

    Es por esto que escribo este post, en el que hago un recorrido por la historia del Framework para que podamos ver rápidamente de qué nos estamos perdiendo, de acuerdo a la versión del Framework que tengamos instalada.

    • .NET Framework 1.0:
      • Liberado el 13 de Febrero de 2002 para Win98, Me, NT 4.0, 2000 y XP. Su soporte terminó en Julio de 2007 y el soporte extendido en 2009.
    • .NET Framework 1.1
      • Publicada en Abril de 2003 junto con el segundo reléase de Visual Studio .NET (2003). Fue la primera versión incluida como parte de un sistema operativo (Windows Server 2003). Su soporte terminó en octubre de 2008 y el extendido termina en octubre de 2013 (así que mejor vayan pensando en migrarse).
      • Mejoras:
        • Los controles ASP.NET que en el 1.0 eran un Addon ahora vienen nativos.
        • Seguridad mejorada con Code Access Security para ASP.NET
        • Soporte nativo para ODBC y Oracle
        • Nacimiento del .NET Compact Framework
        • Soporte a IPV6
        • Cambios numerosos en las APIs.
    • .NET Framework 2.0
      • Liberado con Visual Studio 2005, SQL Server 2005 y BizTalk 2006. El primero en incluirse automáticamente en las instalaciones de SQL Server. Sin ningún Service Pack, fue la última versión en soportar Win98 y Me. Luego vino el SP 2 y con éste, fue la última versión en soportar Windows 2000.
      • Mejoras:
        1. Los fabulosos Generics
        2. Soporte para compilaciones de 64 bits
        3. Numerosos cambios en las APIs
        4. Integración con SQL Server: CLR Integration
        5. Inclusión del Runtime de .NET en aplicaciones nativas.
        6. Nuevos y mejorados controles de ASP.NET
        7. Controles de Datos con Data Binding automático.
        8. Soporte para Temas, Skins y Webparts.
        9. Nacimiento del .NET Micro Framework.
        10. Clases Parciales!
        11. Tipos “Nullable” (por ejemplo enteros a los que se les puede dar el valor de nulo)
        12. Métodos Anónimos!
        13. Iteradores
        14. Tablas de Datos
    • .NET Framework 3.0
      • Conocido en sus comienzos como WinFX fue liberado en noviembre de 2006 e incluyó un nuevo conjunto de APIs hechas en código administrado que son parte integral de Windows Vista y Windows Server 2008. También está disponible para Windows XP SP2 y Windows Server 2003. No hubo mayores cambios arquitectónicos. De hecho, se usa el runtime del Framework 2.0. Aquí tampoco hubo liberación de Compact Framework.
      • Mejoras:
        • Windows Presentation Foundation (conocido antes como Avalon)
        • Windows Communication Foundation (conocido como Indigo)
        • Windows Workflow Foundation
        • Windows CardSpace (Conocido antes como InfoCard).
    • .NET Framework 3.5

       

    .NET Framework

     

    • Vio la luz en noviembre de 2007 pero no es incluida en Windows Server 2008. Modifica el CLR fundamental sobre el que se venía trabajando (2.0) para agregarle los métodos y propiedades requeridas sobre todo para LINQ. Aquí sí se liberó el Compact Framework 3.5. El código fuente de esta versión fue parcialmente liberado para conocimiento público con fines de depuración.
    • Mejoras:
      • Nuevas características de lenguaje en C#3.0 y VB.NET 9.0
      • Soporte para árboles de expresiones y expresiones y métodos lambda
      • Extension Methods!
      • Tipos Anónimos con inferencia estática de tipo
      • LINQ!
      • Soporte a paginación en ADO.NET
      • API de sincronización de ADO.NET
      • API de I/O asincrónico
      • PNRP Resolver (Peer-To-Peer)
      • Wrappers Administrados para instrumentación y Active Directory
      • Motores de WCF y WF mejorados que permiten el manejo de POX y JSON en WCF y también exponer WF como servicio. De esta manera, los servicios WCF se pueden mejorar con persistencia nativa de WF!
      • Soporte para pipeline de HTTP y sindicación de feeds.
      • ASP.NET Ajax ya no viene como un addon sino nativo.
    • Service Pack 1:
      • Liberado en agosto de 2008.
      • Performance mejorado para WPF en un 20-45%
      • Agregado el Entity Framework y los ADO.NET Data Services.
      • Agregados dos nuevos assemblies: System.Web.Abstraction y System.Web.Routing: Esenciales para el funcionamiento del MVC Framework. Incluyó un conjunto de controles de VisualBasic que se habían descontinuado como el Line y el Shape, en un conjunto llamado “Visual Basic Power Pack”. Viene con Windows 7 y Windows Server 2008 R2.
    • .NET Framework 3.5 SP1 Client Profile
      • Nace como una versión reducida del Framework con solo 28MB de tamaño, ideal para clientes inteligentes que no requieren todos los 250 MB del Framework completo.

     

    framework-net

     

    En la mayoría de casos (Excepto cuando se trata de pasar del 1.0 0 del 1.1 a cualquier otra versión del Framework) El paso es transparente y la migración no es muy compleja. Sin embargo es claro que siempre hay temores en las migraciones y puede hacerse complicado comenzar a disfrutar de las características de la última versión. Sin embargo, nada como estar trabajando con ella, de manera que ya vamos a tener disponibles todas las últimas características y sobretodo disfrutar de todas las nuevas tecnologías que siempre se enfocan a la última versión.

    Así que si no tiene el Framework 4.0. Que está esperando?

  • WarNov Developer Evangelist

    Windows Azure Tech-Day Bogotá y Medellín

    • 0 Comments

    Siguiendo con el impulso que le estamos dando a Windows Azure desde nuestra subsidiaria colombiana, me permito invitarlos a nuestro Windows Azure Tech Day. Que se realizará en Bogotá el día 17 de Junio y en Medellín el día 22 de Junio.

    Para registrarse gratuitamente en sus respectivas ciudades hagan click en la imagen correspondiente!

    Bogotá

    image

    Medellín

    image

  • WarNov Developer Evangelist

    Buenas Prácticas en Manejo de Excepciones .Net

    • 18 Comments

    Hace poco me preguntaron acerca de cómo se debería de abordar el manejo de excepciones para una aplicación grande.

    Me sentí agradado de que esa persona estuviera concientizada de que no es un tema que se puede dejar al azar y que hay que tener ciertos temas en cuenta.

    Básicamente, su duda era acerca de cómo capturar unificadamente todas las excepciones producidas en su aplicación; luego de alguna investigación, llegó a saber de Application.ThreadException; un evento al que se le puede poner un manejador y allí tomar las acciones necesarias. Sin embargo, personalmente no recomiendo esta solución. Por qué?

    1. La notificación de la excepción ocurre muy tarde: cuando se recibe la notificación, la aplicación ya no podrá responder a la excepción.

    2. La aplicación terminará abruptamente si la excepción ocurre en el hilo principal o en cualquier otro hilo que sea iniciado por código no administrado (el hilo principal de la aplicación obviamente es ejecutado por Windows – no administrado)

    3. No tenemos acceso a ninguna información valiosa acerca del error, excepto la excepción misma. No se podrán cerrar conexiones a bases de datos, hacer rollback de transacciones ni nada útil. 

    Así que mi recomendación es nunca basar el manejo de excepciones en los eventos Application.ThreadException ni AppDomain.UnhandledException. Ellos deben ser usados y existen como las redes de seguridad de los acróbatas; su función es la de hacer un registro de la excepción en algún mecanismo de log, para alguna examinación futura. Así que hay que darse la pela y manejar cada excepción en su sitio y actuar en concordancia.

    Esta última invitación conlleva a tener en cuenta otra serie de factores que generalmente se omiten cuando uno comienza a desarrollar “en forma”:

    1. El código metido entre try, catch se ejecuta muy lento. Consume muchos recursos. Así que sólo manejemos excepciones cuando realmente se necesite. Cuándo es eso?
    Las excepciones están construidas para manejar condiciones que no se pueden controlar con la lógica de la aplicación. Por ejemplo que se cae la conexión con el servidor, o que el disco está lleno, o que el hardware falló…
    Antes de lanzar excepciones por todo, fijémonos si realmente es necesario. Evitemos también poner mucho código en el try; solo afectemos con el try el código que realmente puede fallar. Por ejemplo es preferible:

    if (conn.State != ConnectionState.Closed)
    {      
       conn.Close(); 
    } 

    a:

    try
    {
            conn.Close(); 
    } 
    catch (InvalidOperationException ex)
    {
         Console.WriteLine(ex.GetType().FullName);
         Console.WriteLine(ex.Message);
    } 

    2. No emita Exception(). O es que eso le da mucha información?
    El framework .net tiene un número de excepciones que nos permite controlar argumentos y operaciones inválidas, timeouts, conexiones, overflows, etc. Usemos esas excepciones que realmente nos indican qué fue lo que sucedió.

    3. Use bloques try/finally. Recuerde que las instrucciones en el Finally siempre se ejecutan independientemente de si se produjo o no la excepción. Esto es muy útil para liberar recursos, cerrar conexiones, etc.

    4. Siempre use un catch para cada tipo de excepción que se pueda generar y ordénelos desde el más específico hasta el menos específico. Esto ayuda a identificar plenamente el error que se generó y no terminar con excepciones como: “Object reference not set to a instance of an Object”.

    5. Cuando cree excepciones propias del aplicativo, asegúrese de distribuir el Assembly a una ubicación compartida para todos los posibles dominios que tengan que ver con ellas.

    6. De acuerdo a como el mecanismo de excepciones funciona, es muy importante siempre que creemos excepciones propias, proveerlas al menos con los tres constructores de excepciones básicos.

    7. Siempre es recomendable usar las excepciones de .Net. Las personalizadas solo tendrán que ver con escenarios programáticos.

    8. Siempre se ha pensado que para las excepciones personalizadas se debería heredar de ApplicationException; sin embargo en la práctica se ha demostrado que no se agrega valor significativo y además se pierde cierto performance. Así que es mejor heredar siempre de Exception.

    9. Use mensajes gramáticamente correctos.

    10. Las excepciones pueden incluir propiedades. Estas propiedades pueden ser accedidas programáticamente para tomar acciones. Incluya información extra relevante en estas propiedades cuando sea útil.

    11. En vez de retornar null, lance excepciones en la mayoría de casos. Eso evita inconvenientes que a veces son difíciles de detectar. Evite también retornar códigos de error.

    Estas son solo unas pocas recomendaciones a la hora de manejar excepciones. Hay muchas más que se aprenden con el pasar de las líneas de código.

    Para finalizar, me parece importante mencionar también que igual existe un Application Block en Patterns And Practices para el manejo de Excepciones. Incluyéndolo en nuestras aplicaciones ya de por sí garantizaremos varias buenas prácticas; eso sí, usandolo tal y cual se explica en los lineamientos.

  • WarNov Developer Evangelist

    Tutoriales de Desarrollo para Windows Phone–totalmente en español y gratuitos

    • 6 Comments

    LigaSilverlight150x150


    Está es una gran noticia que me da mi gran amigo, remarcable MVP en Silverlight, Rodrigo Díaz. Quien desde La Liga Silverlight ha traducido al idioma español el contenido original de todos los tutoriales para el desarrollo de aplicaciones en Windows Phone, disponibles en App Hub.

    ¡Son un total de 27 tutoriales!

    Este material de entrenamiento completamente gratuito y en español te servirá para iniciar en el mundo de la programación de la nueva versión del sistema operativo móvil de Microsoft: Windows Phone 7, o si ya eres desarrollador para este dispositivo estos tutoriales sin duda alguna te ayudarán a reforzar tus conocimientos.

    Cada tutorial trata un tema específico, por lo que no están vinculados directamente uno con otro pero definitivamente les recomiendo que los sigan en el orden establecido. Los tutoriales comienzan con temas básicos de XAML y Silverlight, y posteriormente se van analizando conceptos más a detalle acerca de esta plataforma de desarrollo.

    windowsphone_logo

     

     

    La lista completa de tutoriales es la siguiente:

    Iniciando y Fundamentos
    1. Creando la interfaz de usuario de Windows Phone (XAML)
    2. Usando controles
    3. Tipo de Controles
    4. Controles Panorama y Pivot
    5. Trabajando con texto en Windows Phone
    6. Distribución en la pantalla
    7. Orientaciones de la pantalla
    8. Entrada táctil
    9. Navegación
    10. Ejecutando un aplicación en segundo plano (tombstoning)
    11. Notificaciones de empuje para el desarrollo de Windows Phone
    12. Publicando tu aplicación en el Marketplace
    Visuales y Medios
    1. Imágenes
    2. Animaciones
    3. Video y Audio
    4. Gráficos
    5. Brochas
    Trabajando con Datos
    1. Obteniendo datos en tus aplicaciones de Windows Phone
    2. Enlazando a controles
    3. Almacenamiento Aislado
    4. Accediendo a un servicio web REST
    5. Consumiendo el servicio de datos de Windows Azure utilizando el cliente OData
    Sensores y otras características específicas del teléfono
    1. Lanzadores y Selectores
    2. Detección de movimiento (acelerómetro)
    3. Desarrollando con el GPS de Windows Phone (Servicios de Ubicación)
    4. Desarrollando con la cámara de Windows Phone

    También pueden ver el índice completo en esta página de La Liga Silverlight.

    ¡Esperamos que les sean de utilidad!

  • WarNov Developer Evangelist

    Llenar celdas vacías en Excel con 0

    • 5 Comments

    Nosotros developers en determinado momento tenemos que lidiar con hojas de calculo. Aquí un pequeño tip que nos puede ayudar mucho.
    Como llenar un conjunto disperso de celdas vacías con un valor o formula dado? Por ejemplo con ceros?
    En este video se muestra de una manera muy rápida.
    Enjoy!

     



  • WarNov Developer Evangelist

    Java vs. .NET

    • 40 Comments

    Estaba revisando mi Facebook y por allá alguien dijo a propósito de la salida de su creador James Gosling de Oracle:

    “Es que Java le lleva mucha ventaja a .NET!”

    OMG!

    Abrió la caja de pandora… y entonces comenté algo similar a lo siguiente, dado que soy NINJA (Not INcluding JAva):

    En lo personal me parece que decir que Java le lleva ventaja a .NET, ni siquiera aplica.
    Java es solo un lenguaje. Más bien tendríamos que comparar JDK con .NET aunque tampoco me parece muy apropiado...
    .NET es toda una tecnología.
    Una tecnología basada en código administrado.
    En eficiencia;
    en productividad
    en hacer todo desde un solo lugar.
    En confiar en un solo esquema de librerías bien conocido, documentado y creado bajo los mismos principios.
    Alguién más apuntó:

    “…he programado en los dos lados y eso de que java le lleva a .net mucha ventaja lo discuto.. JAVA cambia sus paradigmas a toda hora… o será muy fácil pasar de EJB 2 a 3 o integrar plugins y librerías en Eclipse: Algo así EJB 2.0 Hibernate jax-ws y jboos 5… eso es un show con una pila de errores que a veces ni idea y después te das cuenta que solo era por una versión menos de alguna librería x ... en fin Calidad de vida mata Esquizofrenia(enfermedad generada por apagar el modo NINJA)…”

    No tengo que importar paquetes extraños. Todo me lo resuelve el IntelliSense.
    Aún SDKs de Javascript tan robustos como JQuery se resuelven en segundos y me dejan programar a la velocidad del.. hum... sí.. del programador .NET... que sin ser exagerado caballeros, siempre será más alta que la de java. A .NET no le gusta "echar pedal" (y no mencionemos la velocidad de ejecución).”


    Pero Java es multiplataforma!


    Y .NET no? Solo hablemos de Mono y ya. O de Silverlight que ahora me permitirá correr la misma aplicación en Linux,. MAC o Windows en modo full trust out of browser o en otras palabras, en modo escritorio... Y me pregunto... cuándo con Java podremos crear algo aunque sea ligeramente parecido a Silverlight? A WPF?


    Además, pienso que la interoperabilidad no es correr sobre todos los sistemas operativos (cosa factible con .NET) Sino más bien la capacidad de interoperar con otras aplicaciones existentes... y .NET está super preparado para esto con WCF que hoy día da amplias capacidades de interconexión comenzando por REST, JSon, OData, y los otros viejitos como SOAP, WSDL...


    Pero Java es gratis!!!


    Y .NET no? Toda la especificación de .NET es abierta. Y tenemos herramientas altamente sofisticadas y SOPORTADAS que son free... si no, pregúntenle a las versiones Express de Visual Studio.
    Existe también el sitio http://codeplex.com donde miles de desarrolladores comparten su código de manera OPEN SOURCE y se encuentran proyectos geniales de código libre.

    Pero Java es Java!!!


    Sí... los programadores se enorgullecen de saber Java... no digo que sea malo... por el contrario rescato la idea original que se tuvo de la JVM y del código administrado y del lenguaje altamente formal y completamente orientado a objetos que en gran parte le dieron vida a mi amado C#...

    Pero C# pertenece a .NET y .NET es una cosa con vida propia que permite crear nuevos lenguajes orientados a su funcionalidad (F#, IronPython, IronRuby. APL.NEXT) y además permite la inclusión de elementos avanzados como expresiones lambdas, métodos y clases parciales, métodos extendidos, LINQ, lenguajes dinámicos, automatización en la generación de capas de datos, de negocio y hasta de interfaz de usuario; MVC, Entity Framework, Cloud Services desde su proyecto en Visual Studio derechito pa’ la nube…

    En integración transparente con Office, con XNA para hacer videojuegos, con Robotics, con Sharepoint, Biztalk y servidores de DB de toda índole. Con todo eso un simple Enterprise Library (lo que más se compara con la mega colección de paquetes de Java) no es nada… es solo una pequeña porción de todo lo que tiene .NET. Sin olvidar el poderoso C++ que aún está disponible para ejecutar aplicaciones que realmente vuelan porque no son administradas. Además hoy día tenemos librerías específicas para hacer programación en paralelo y hypercomputing sin necesidad de hacer un curso para usarlas! en fin... esta cajita de pandora llamada .NET, me daría para escribir un montón de líneas más....


    Para estos días que estamos de lanzamiento de la nueva ola de nuestra plataforma: Visual Studio 2010 (que además ahora incluye modelamiento UML y un manejo de arquitectura que ni en mis sueños me imaginaba) .NET Framework 4.0, Silverlight 4.0, Sharepoint 2010, Windows Azure para Colombia y muchos otros... podría decir que en mis años de experiencia con .NET jamás había presenciado una oleada tan grande de innovaciones que nos va a permitir verdaderamente desarrollar todo nuestro potencial antes de tener que pelear para únicamente mostrar un botón en la interfaz gráfica…

    Y ahí terminó la discusión… luego Willy remató con un brillante chascarrillo acerca del asunto:

    Michael Schumacher llega a casa después de un duro día de entrenamiento en el circuito.
    Su mujer le recibe con un beso y le pregunta:
    - "¿Cómo ha ido hoy el día, cariño?"
    - "Bueno, cuando he llegado al circuito, he ido a boxes y el F1 no estaba en su sitio. En su lugar había un burro."
    - "¿Cómo?", se sorprende la mujer.
    - "Si, así es. Le he preguntado al jefe de equipo y me ha confirmado que habían cambiado el monoplaza por el burro."
    - "¿Y tu que le has contestado?"
    - "Pues yo le he dicho que quizás no seria tan rápido como el F1. Él ha dicho que ciertamente es así, pero que ahora tenemos una ventaja y es que podremos correr en todo tipo de circuitos: F1, rally, motocross, trail sin... Y bueno, al menos hoy he podido venir montado en él hasta casa, cosa que no podía hacer con el F1."
    - "Ya. Pero si tu sólo corres en F1, ¿para que quieres poder correr en otros circuitos?"
    - "Pues no lo se, la verdad. Además, después de montarme en el burro le he dicho al jefe de equipo que no era ni la mitad de cómodo que el monoplaza."
    - "¿Qué ha respondido el?"
    - "Simplemente ha dicho que eso no importa porque ahora podemos correr en todo tipo de circuito."
    - "¡Ay Señor!, ¿Y no corres más riesgo de hacerte daño si te caes?"
    - "En realidad no, porque le han puesto al burro las mismas protecciones que tiene la cabina del F1. A pesar de que hace que todavía vaya un poco mas lento. Según el jefe eso ya no tiene tanta importancia, porque ahora podemos correr en todo tipo de circuito."
    - "Esta bien, enséñame el burro."
    Tras salir al jardín y quedarse estupefacta con la imagen de un burro pintado de rojo, con el escudo de Ferrari pegado en la frente y una protección de F1 encima de la silla de montar, la mujer le pregunta a Michael:
    - "¿Y como se llama el animal?"
    - Se llama ....
    - Se llama ....
    - Se llama ....
    - Se llama ....
    - Se llama ....
    - Se llama ....
    JAVA !!!!!!!!
    X-DDDDD
    Según apunta Willy además no es cierto que Ferrari use Java. Los leguajes oficiales para desarrollo en el equipo Ferrari son VB.NET y C++, tal y como se indica en una entrevista concedida a CNET NEWS"
    http://tiny.cc/42f73

     image

    Y ahora otro más cortesía de @Caycedo:

    - Knock Knock...
    -Who's there?
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    - Java!
    :P

    A lo cual le agregué el siguiente escenario (un poco más abstracto):

    Knock Knock...
    -Who's there?
    -Dont worry, I'm Just Leaving
    (espero aquí sepan de quien estoy hablando)

     

    .NET Rocks!!! Felices lanzamientos 2010!!!

  • WarNov Developer Evangelist

    Windows 8 te hace la vida más fácil

    • 48 Comments

    Veamos en esta cortísima demo de 5 minutos, las características más importantes de Windows 8, que a nosotros como desarrolladores nos han de importar, para poderlas aprovechar a la hora de generar nuestras apps.

    image
  • WarNov Developer Evangelist

    Windows 8: Lo que deberías saber y nadie te ha contado

    • 7 Comments

    Ya a estas alturas del partido, sabrás que con Windows 8 vienen grandes innovaciones dentro de este sistema operativo. Eso, si es que no lo has probado por tu propia cuenta, bajándolo gratuitamente de aquí. Cualquier máquina que corra Windows 7, te servirá para probarlo.

    La innovación más grande por su puesto es la inclusión del ambiente de Interfaz Moderna

    clip_image002

    En pocas palabras, el ambiente de Interfaz Moderna está orientado a ser amigable en dispositivos con touch screen. Específicamente Tablet PCs y Slates:

    Ojo: que esto no quiere decir que el desktop tradicional haya desaparecido. Este sigue existiendo y también ha evolucionado con muchas mejoras como un Explorer con Ribbon, copia de archivos optimizadas, soporte a USB3 para velocidades de transferencia impensables y otras más que pueden encontrar en el blog oficial de Windows para usuarios finales.

    Desktop8

     

    Desde el punto de vista de un desarrollador, el ambiente desktop no tiene muchos cambios radicales a nivel de presentación de nuestras aplicaciones. Habría que tener sin embargo en cuenta las novedades de la nueva versión del Framework .NET que viene con Windows 8, que es la 4.5 y que entre otras cosas interesantes, tiene la inclusión de Async, que nos permite crear interfaces fluidas de una manera más sencilla. Sin embargo, básicamente podemos pensar en estos cambios como sencillamente un par de librerías más por aprender.

    El cambio radical está en la interfaz Moderna:  aunque es radical solo en estructura; pues como veremos, la programación es la misma. De hecho, si ya sabes .NET y XAML o HTML y Javascript, ya sabes programar para Windows 8 en Interfaz Moderna!

    Pero antes de describir estos cambios estructurales consideremos el por qué de aplicaciones de Interfaz Moderna o Windows Store Apps, como son más conocidas, ya que estas apps solo van a estar disponibles a través de una tienda online llamada el Windows Store. Es evidente que la movilidad se ha vuelto supremamente importante hoy en día y que todos queremos tener un sistema operativo fácil de transportar. Hemos visto que estas características son ofrecidas por los tablets y slates. Que estos en general no poseen teclado, sino que son muy basados en touch. Entonces, necesitábamos una versión de Windows adecuada para estos escenarios. Esto sin mencionar que la durabilidad de la batería es súper importante. Queremos que nuestro dispositivo aguante aunque sea todo un día de trabajo sin necesidad de ser conectado a la electricidad. Pero para lograr esto, requerimos de procesadores y discos duros que no consuman tanta energía y de un diseño de aplicaciones que las permita suspender de manera óptima para ahorrar hasta el último vatio cuando no se estén usando.

    Existe un tipo de procesador que tiene un consumo supremamente bajo de energía y que fácilmente puede garantizar 8 horas de funcionamiento. Es el procesador ARM.

    Cómo pueden garantizar esto? Pues teniendo un conjunto de instrucciones reducido en comparación con los procesadores de arquitectura x86 o x64 a los que estamos acostumbrados en nuestras PCs. Es un precio que hay que pagar para lograr durabilidad. Pero si lo vemos bien, un rediseño del sistema operativo pensando en aplicaciones fácilmente suspendibles y en la eliminación de características que no son muy necesarias en un dispositivo móvil, sumado a la inclusión de hardware especial como los discos duros de estado sólido, nos permite tener un aparato que funciona como lo necesitamos y con la duración requerida. Como si fuera poco, por añadidura cuando logramos esto, tenemos un sistema operativo que arranca y está listo para usarse en tiempo de solo 3 segundos!!! Lo cual es una característica súper importante para la movilidad.

    En síntesis, se requería un ambiente de aplicaciones amigables al tacto, que corrieran de manera óptima en procesadores ARM (y por ende en procesadores de arquitectura tradicional) y que además ofreciera muchas facilidades para tener una experiencia de usuario impactante.

    Y precisamente eso es lo que ofrece la interfaz Moderna.

    Esta gran iniciativa nuestra no para con la creación del sistema operativo y la habilitación de excelentes dispositivos móviles que lo usan. También dispondremos de un marketplace: Windows Store. Diseñado específicamente para enriquecer el ecosistema de Windows Store Apps que se van a empezar a requerir bajo este nuevo esquema. Aplicaciones innovadoras, muy atractivas para el usuario que van a poder ser vendidas y compradas de una manera muy sencilla a través del store. Cualquier desarrollador desde su casa va a poder crear su aplicación, subirla al atore y empezar a recibir ganancias por ella, muy al estilo de Windows Phone. Y en este caso, para Colombia tenemos garantizado el acceso al store. Somos uno de los pocos países de Latinoamérica con este privilegio.

    Visto lo visto, supongo que ahora estarás preguntándote cómo crear estas Windows Store Apps…

    Como te dije antes, si sabes .NET; en especial Silverlight, entonces ya sabes crearlas!!! Además, no necesitas ser un desarrollador experimentado en .NET para lograrlo. Si sabes HTML y Javascript, también el desarrollo de este tipo de aplicaciones está a la mano. Así que si has desarrollado sitios web por algún tiempo con cierta carga de Javascript, también estás listo para arrancar! De hecho si tu experiencia es en C++, también hay cabida para ti.

    Lo único necesario es aprender un par de librerías más; tarea nada difícil, teniendo en cuenta que el intellisense es completo para todos los lenguajes aceptados en la plataforma de desarrollo para Interfaz Moderna.

    Entonces, ya sabiendo que a nivel de desarrollo todo funciona de una manera familiar, entremos un poco más y aprendamos realmente cuál es la plataforma sobre la que están las Windows Store Apps.

    WinRT

    WinRT es la abreviación de Windows Runtime. Y es la plataforma sobre la cual se programan aplicaciones de tipo Interfaz Moderna para Windows 8.

    WinRT NO está basada en .NET. De hecho, WinRT está al nivel del API nativa de Windows por excelencia que es Win32. WinRT accede nativamente al Kernel de Windows, ofreciendo gran velocidad de ejecución por un lado y por otro una abstracción muy útil para poder acceder a todos los recursos del sistema a través de un paradigma orientado totalmente a objetos, de una manera extremadamente sencilla.

    .NET tradicional trataba de solventar esta tarea… pero alguna vez trataron de acceder a la webcam de su máquina para obtener una sencilla foto? Si es así de seguro recordaran lo divertido que es hacer los DLLIMPORT requeridos para traer APIs de WIN32.

    Con WinRT estos llamados ya no son necesarios, pues la conexión ya es directa y se logra completamente a través de objetos ya existentes en la plataforma.

    WinRT está basado en 33 APIs nativas con las que se puede acceder al core de sistema operativo. Como se aprecia, están divididas en 5 grandes grupos: Fundamentales, Dispositivos, Media, Comunicaciones y Datos e Interfaz de Usuario.

    clip_image007

    En general WinRT se presenta como la base sólida y eficiente para construir Windows Store Apps.

    De acuerdo a lo anterior, si equiparamos a WinRT con .NET tradicional, tendríamos una gráfica como la siguiente:

    clip_image009

    Como lo había mencionado vemos que WinRT (la zona verde) accede directamente al Kernel de Windows, de igual forma que lo hace .NET, Win32 e Internet Explorer. Vemos sin embargo que estos últimos van a estar destinados para las aplicaciones de escritorio tradicionales, con los conocimientos que ya tenemos.

    WinRT está basado en un modelo de aplicaciones (Application Model) en el cual cada aplicación es una clase como tal (contenedora de otras clases), que son instanciadas por el proceso WWAHost.exe que es el encargado de administrar funciones como la suspensión. Cada aplicación es instanciada por un WWAHost independiente, a través del ejecutable de la aplicación que aparece como miaplicación.exe, pero tiene el comportamiento particular de luego lanzar el Host:

    image

    Esto me recuerdo mucho el viejo esquema de COM; y efectivamente muchos de los conceptos de WinRT provienen de allí, excepto que ya no usamos un acercamiento basado en interfaces sino basado en objetos. Además tenemos variedad de lenguajes gracias a las proyecciones y también nos podemos olvidar del DLL Hell, gracias a la metadata que aún conservan los componentes de WinRT, que son una gran herencia de .NET, que por su puesto sigue su camino en aplicaciones de escritorio convencionales, así como en las capas de backend y servicios en los sistemas n-layer.

    Vemos que sobre este modelo de aplicaciones tenemos todas las apis que describí anteriormente y que básicamente nos permiten acceder a los recursos del sistema y a librerías que nos facilitan el desarrollo de nuestras aplicaciones.

    Sobre las apis, ya podemos extender nuestras proyecciones de lenguaje que nos permiten acceder a ellas de distintas maneras, de acuerdo a nuestros gustos. Si somos familiares con Silverlight y .NET, usamos VB o C#. También podemos usar C++ o si venimos del mundo Web, podemos usar Javascript que usa el motor Chakra. El mismo de Internet Explorer.

    Finalmente, sobre estas proyecciones de lenguaje ofrecemos los lenguajes de marcado para poder crear interfaces declarativamente. No es más que el típico XAML que conocíamos de WPF, Silverlight y WP7 para cuando usemos C#, VB e interesantemente C++. SI algo recuerdo con pena y dolor de C++, es la creación de interfaces gráficas a punta de C++. Era algo completamente dispendioso, complicado y propenso a errores. Ahora tenemos todo el poder nativo de C++, complementado por el poder declarativo de XAML para la UI.

    En el caso de Javascript, naturalmente el lenguaje de presentación viene a ser HTML acompañado de CSS para la definición de estilos. Esto obviamente hará muy fácil traducir aplicaciones HTML5 para web, a aplicaciones HTML para Windows Store.

    .NET y WinRT

    Ya vimos que básicamente estos son dos stacks distintos dentro de Windows. Sin embargo, dado que WinRT ofrece proyecciones de lenguaje para C# y VB, el resultado es que la mayoría de librerías de .NET tienen su equivalente en WinRT. Algunos métodos tienen diferencias sutiles y encontramos nuevas librerías en WinRT que mejoran el acceso a dispositivos y recursos del sistema. De hecho es posible para nosotros crear componentes en .NET que puedan ser consumidos por WinRT, siempre y cuando usen las librerías del Namespace Windows.

    Componentes en WinRT

    En WinRT podemos crear componentes que pueden ser reutilizados en otras apps WinRT. Todos los componentes y aplicaciones generan una metadata que permite un versionamiento transparente y la garantía de que las aplicaciones correrán correctamente en el futuro.

    Cómo comenzar con WinRT y Windows 8?

    Es muy sencillo y free, solo tienes que bajarte tu versión de desarrollador de Windows 8 que además incluye las herramientas de desarrollo que en este caso es Visual Studio 2011, de este link.

    Además para más recursos y videos instructivos, les recomiendo visitar el sitio oficial de Windows para desarrolladores: http://buildwindows.com y http://dev.windows.com. Para saber más de Windows Store Apps: http://msdn.microsoft.com
    /windows/apps
    . Para comentar y resolver dudas: http://forums.dev.windows.com. Para saber más del marketplace: http://blogs.msdn.com/b/windowsstore; para saber más de características de usuario final de sistema operativo, visiten el blog oficial. Y para obetener la información de primera mano desde las redes sociales:

    Facebook (developer)

    http://fb.windows.com/developers

    Twitter (@b8)

    http://twitter.com/BuildWindows8

    Twitter (@windevs)

    https://twitter.com/windevs

    YouTube (developer)

    http://www.youtube.com/user/WindowsVideos

  • WarNov Developer Evangelist

    Windows 8 en las ediciones que deberían ser

    • 14 Comments

    Ya en este punto sabemos mucho del mundo de nuevas cosas que se vienen con Windows 8.

    Comencemos citando entonces que tendremos dos grandes divisiones en las que tendremos Windows 8. La x86/64 y la WOA (Windows on ARM –los procesadores de bajo consumo energético). En ambas se podrán usar touchscreens, así como mouse y teclado cuando se desee.

    Así que para x86/64 el nombre del OS será Windows 8. Y para estos sistemas, tendremos sólo 2 versiones: Windows 8 y Windows 8 Pro. La primera para uso de hogares y pequeñas empresas y la segunda para usos más profesionales con integración a dominios y demás (Ver al final la tabla de características)

    Para el mundo de WOA llega Windows RT como el nuevo miembro de nuestra familia Windows. Y sólo estará disponible pre-instalada en PCs y tablets que tengan procesadores ARM. Vendrá con versiones optimizadas para touch de Microsoft Word, Excel, PowerPoint y OneNote.

    Aquí les muestros las características especiales que podremos encontrar en cada edición.

    Característica

    Windows 8

    Windows 8 Pro

    Windows RT

    Upgrades from Windows 7 Starter, Home Basic, Home Premium

    x

    x

     

    Upgrades from Windows 7 Professional, Ultimate

     

    x

     

    Start screen, Semantic Zoom, Live Tiles

    x

    x

    x

    Windows Store

    x

    x

    x

    Apps (Mail, Calendar, People, Messaging, Photos, SkyDrive, Reader, Music, Video)

    x

    x

    x

    Microsoft Office (Word, Excel, PowerPoint, OneNote)

       

    x

    Internet Explorer 10

    x

    x

    x

    Device encryption

       

    x

    Connected standby

    x

    x

    x

    Microsoft account

    x

    x

    x

    Desktop

    x

    x

    x

    Installation of x86/64 and desktop software

    x

    x

     

    Updated Windows Explorer

    x

    x

    x

    Windows Defender

    x

    x

    x

    SmartScreen

    x

    x

    x

    Windows Update

    x

    x

    x

    Enhanced Task Manager

    x

    x

    x

    Switch languages on the fly (Language Packs)

    x

    x

    x

    Better multiple monitor support

    x

    x

    x

    Storage Spaces

    x

    x

     

    Windows Media Player

    x

    x

     

    Exchange ActiveSync

    x

    x

    x

    File history

    x

    x

    x

    ISO / VHD mount

    x

    x

    x

    Mobile broadband features

    x

    x

    x

    Picture password

    x

    x

    x

    Play To

    x

    x

    x

    Remote Desktop (client)

    x

    x

    x

    Reset and refresh your PC

    x

    x

    x

    Snap

    x

    x

    x

    Touch and Thumb keyboard

    x

    x

    x

    Trusted boot

    x

    x

    x

    VPN client

    x

    x

    x

    BitLocker and BitLocker To Go

     

    x

     

    Boot from VHD

     

    x

     

    Client Hyper-V

     

    x

     

    Domain Join

     

    x

     

    Encrypting File System

     

    x

     

    Group Policy

     

    x

     

    Remote Desktop (host)

     

    x

     

    Si no lo has visto en acción, dascarga una version de prueba de aquí!

    Nota: Para las empresas con SOftware Assurance,  como siempre tendremos la versión Windows 8 Enterprise, con aún más features para el manejo corporativo.

  • WarNov Developer Evangelist

    Windows 8 Surface Tablet/PC

    • 13 Comments

    UPDATE: Ya tenemos disponible el video del Keynote del lanzamiento de la Surface ayer en los Ángeles. Aquí esta:

     

    Ahora, un video de la tablet, porque vale mucho más que miles de palabras!!!

    Ahora imágenes! Muchas imágenes!

    Microsoft Surface

    La Surface, no viene con un docking. Viene con un forro que incluye teclado y pad multitouch (Touch Cover)! Además tiene un soporte en la parte trasera, que permite ajustar el ángulo de visualización.

    Microsoft Surface

     

    Microsoft Surface

    Microsoft Surface

    Microsoft Surface

    Microsoft Surface

    Forros con colores para todas las personalidades

    Un diseño sin precedentes!!!

    También se puede incluir un Type Cover que trae un teclado más físico que el del Touch Cover.

    El mejor tamaño que puede haber para una tablet de este estilo!

    No les  inspira rediseñar su espacio en torno a este aparato?

     

     

    El VaporMg Case es una total innovación que brinda elegancia, comodidad y ligereza gracias al magnesio con el que está construido.

    Todo el poder para una conectividad real!

     

    Que más hay que decir, que toda esta maravilla fue develada hoy a las 6.45pm hora Colombiana en Los Angeles, en un sitio que no fue develado sino hasta el día de hoy, a un grupo de selectos periodistas y bloggers quienes fueron avisados del evento solo hasta el viernes pasado.

    La Microsoft Surface Tablet, vendrá en dos versiones. Aquella para Windows RT,  y aquella para Windows 8 Pro. Se diferencian básicamente en la cantidad de espacio en disco (SSD): 64Gb máx y 128Gb max, la pro vendrá con un Stylus especial, el tipo de pantalla y sobretodo el procesador. la primera vendrá con ARM y la segunda con el Ivy Bridge de GBIntel, l que presumiblemente nos permitirá seguir teniendo el desktop tradicional.

    Otras especificaciones:

    Surface for Windows RT

    • OS: Windows RT

    • Light: 676 g

    • Thin: 9.3 mm

    • Clear: 10.6” ClearType HD Display

    • Energized: 31.5 W-h

    • Connected: microSD, USB 2.0, Micro HD Video, 2x2 MIMO antennae

    • Productive: Office ‘15’ Apps, Touch Cover, Type Cover

    • Practical: VaporMg Case & Stand

    • Configurable: 32 GB, 64 GB

    Surface for Windows 8 Pro

    • OS: Windows 8 Pro

    • Light: 903 g

    • Thin: 13.5 mm

    • Clear: 10.6” ClearType Full HD Display

    • Energized: 42 W-h

    • Connected: microSDXC, USB 3.0, Mini DisplayPort Video, 2x2 MIMO antennae

    • Productive: Touch Cover, Type Cover, Pen with Palm Block

    • Practical: VaporMg Case & Stand

    • Configurable: 64 GB, 128 GB

     

           

    Se espera la llegada de la Surface Windows RT en el RTM de Windows 8 y la Windows 8 Pro, aparecerá tres meses después.

    Mañana mismo podremos ver el video del lanzamiento aquí.

    Para terminar, solo me resta citar unas palabras:

    “I love this company.

    I love that we have brilliant engineers with brilliant ideas. I love that we aren’t afraid to make big bold bets. I love that we are persistent – after all it’s our passion and tenacity that bring our dreams to life. And right now, I love how so much of our hard work, passion and tenacity are coming together in the products we are bringing to market…

    … I’m incredibly proud of the work this company is doing and incredibly optimistic for what’s ahead. “

    Steve Ballmer,  al equipo de Microsoft.

  • WarNov Developer Evangelist

    Transparencia en DIVs HTML (Div Opacity)

    • 2 Comments

    Cada mes acostumbro a cambiar el header de mi Blog usando una fotografía tomada por mí.

    Para este mes quise poner una foto del Palacio de Justicia ubicado en la Plaza de Bolívar en Bogotá.

    En esta foto fue difícil ubicar el título de mi blog, dado los colores de fondo. Así que la alternativa fue ponerle un color de fondo sólido al título.

    Sin embargo, un color sólido arruina la fotografía de fondo, pues no la deja ver para nada. Allí fue donde me nació la duda de cómo hacer un div transparente, para así poder modificar el estilo del blog.

    Investigando un poco, encontré que esto se hace distinto para distintas versiones de navegador. En especial, para Firefox se usa:

    opacity:0.6;

    Luego vi que esto no funcionaba en IE, pues me seguían apareciendo los fondos sólidos.  así que investigando un poco, encontré que esto se hace distinto para IE:

    filter:alpha(opacity=60);

    De esta manera, un estilo escrito así:

    #title {
    opacity:0.6;
    filter:alpha(opacity=60);
    }

    Produce este resultado independientemente del navegador:

    image



  • WarNov Developer Evangelist

    Cómo escalar aplicaciones. SCALE UP vs. SCALE OUT y las posibilidades con Windows y SQL Azure

    • 1 Comments

    Yendo directamente al grano, SCALE UP hace referencia a lograr escalabilidad a nivel de servidor, incrementándole sus recursos de hardware, antes de mejorar la escalabilidad usando otro servidor. Por ejemplo, aumentando su cantidad de memoria, o la capacidad/velocidad de los discos o la cantidad de núcleos de cómputo del servidor.

    En un enfoque SCALE OUT, la escalabilidad se logra “sacando” la carga a otros servidores.

    Al principio el enfoque SCALE UP puede parecer el menos costoso y más sencillo para muchos casos. Pero cuando las exigencias siguen aumentando con el tiempo, lo que sí es seguro, es que se llegará a un límite práctico en el que no será posible “agrandar” más el servidor para ponerle por ejemplo 500 núcleos de procesamiento de manera que pueda satisfacer una fuerte demanda. En estos casos, es fácil observar cómo puede resultar mucho más barato, eficiente y productivo un enfoque de SCALE OUT. Además, un SCALE UP generalmente genera tiempo de baja, mientras se cambian o mejoran las partes de hardware. Mientras que con un SCALE OUT, solo es cuestión de levantar más máquinas independientes.

    Windows Azure es tan flexible, que nos permite ambos tipos de escalamiento. El SCALE UP se logra a través del ajuste que podemos hacer a las instancias que creamos para correr nuestros servicios (recordemos que una instancia es cada uno de los servidores virtuales que ordenamos crear para desplegar nuestras aplicaciones de Windows Azure). Estas instancias vienen en cuatro tamaños. Así que al mejor estilo SCALE UP podemos hacer que el tamaño de cada instancia crezca. Estas son las posibilidades de tamaño que tendríamos:

    image

    Así que podríamos escalar desde 1.6 hasta 10.4 GHz en CPU, desde 1.75GB hasta 14GB de RAM y desde 225MB hasta 2TB de disco duro.

    En cuanto a la alternativa SCALE OUT, tenemos servidores que se aprovisionan muy rápido y pueden comenzar a trabajar en equipo manipulando solo unos elementos de configuración. Así pues, tenemos la ventaja de poder adicionar más y más instancias a nuestro despliegue, las cuales se ajustarán automáticamente con solo un despliegue inicial.

    ESCALABILIDAD CON SQL AZURE

    El SCALE OUT no aplica solo a los servidores de presentación o cómputo (web o worker roles), sino también de SQL Azure como tal. No obstante, en SQL Azure no tenemos la posibilidad de hacer SCALE UP.

    SQL Azure ofrece una gran cantidad de ventajas sobre todo al tener que escalar bases de datos de una manera elástica y rápida, dado que tenemos casi que ilimitada capacidad para levantar nuevas bases de datos para satisfacer cualquier demanda. En SQL Azure, no tenemos una relación física uno a uno entre servidores y bases de datos como en SQL Server tradicional. Pero la abstracción que se nos brinda es perfecta para que la mayoría de las veces el manejo que se le da a estos conceptos sea el mismo que on-premises. Sin embargo, cuando tenemos una cuenta de SQL Azure, tenemos la posibilidad de generar todas las bases de datos que queramos, las cuales residirán en servidores distintos (a veces coincidencialmente residirán en el mismo servidor). Pero esta distribución es ejecutada por los balanceadores de carga automáticos de Azure que se encargan de determinar cómo distribuir las cargas de peticiones a la plataforma.

    Entonces en SQL Azure no vamos a tener la posibilidad por ejemplo de aumentar la memoria de un server dado, sino que sencillamente levantamos otra base de datos. Con esto, podemos tomar una base de datos que requiera ser escalada y segmentarla o particionarla en otras bases de datos más pequeñas y con mejor rendimiento.

    Comprendido ya el concepto de SCALE OUT, veamos ahora que por ejemplo cuando hablamos de bases de datos, existen dos formas para hacer este tipo de escalamiento: Vertical y Horizontal. Estos tipos de escalamiento se ejecutan particionando las tablas que conforman la base de datos horizontal como verticalmente. Luego de estar particionadas, obviamente se generan más tablas y éstas a su vez se pueden ubicar en distintas bases de datos, lo que nos daría el escalamiento buscado.

    Escalamiento Vertical:

    Consiste en dividir las tablas verticalmente a través de columnas. Así pues, uno por ejemplo podría escoger dejar las columnas más importantes en una tabla y las menos usadas en otras. Por ejemplo dejar en una tabla T1 de la base de datos D1 los datos del cliente y su dirección principal, y en otra T2 en la base de datos D2, otra tabla con las direcciones secundarias. Entonces para lograr un correlacionamiento correcto entre T1 y T2, en T2 deberíamos tener un mecanismo de llaves foráneas hacia T1.

    Otro ejemplo de particionamiento vertical se observa por ejemplo cuando dejamos una tabla completa (o conjunto de ellas) en una sola base de datos. Y otras tablas en otras bases de datos. Por ejemplo, tiene mucho sentido en una aplicación de negocios, tener la tabla de clientes en una sola base de datos, para obtener el mayor rendimiento posible para ésta.

    Lo que es más, se puede combinar ese particionamiento para lograr aún más escalabilidad y eficiencia, de manera que podremos poner la tabla de clientes en su propia base de datos, y luego particionar sus columnas en distintas tablas, pero dentro de la misma base de datos.

    image

    Escalamiento Horizontal:

    Este escalamiento comprende la distribución de los datos de una tabla a través de varias tablas con la misma estructura, cada una de las cuales generalmente se encuentra en una base de datos distinta y en ocasiones aún en instancias y/o servidores distintos. Es un excelente acercamiento para circunstancias en las cuales la variabilidad de la carga de trabajo en el servidor de base de datos es muy alta, pues en SQL Azure por ejemplo, es muy fácil aprovisionar y desaprovisionar servidores; además siempre resulta mucho más barato que tener un servidor de muy altas prestaciones siempre encendido esperando por picos de carga de trabajo.

    En cada versión de la tabla se almacena un conjunto de datos que tienen como dato común el valor de una columna que generalmente se conoce como PartitionKey. Entonces cada versión de la tabla se llama Partition. Este es el tipo de particionamiento que se hizo popular con SQL Server 2005.

    Para poder tener “conciencia” de dónde están ubicados los datos con una PartitionKey determinada, existe una tabla maestra donde reside esta información.

    Por ejemplo; en una aplicación comercial, se puede decidir dejar en una base de datos diferente cada las ventas de cada ciudad. En este caso la ciudad sería la PartitionKey para identificar cada tabla. Sin embargo, una clave de partición, podría estar conformada por más campos dependiendo de la naturaleza de la aplicación y el tipo de carga de trabajo.

    Consideraciones para el escalamiento horizontal:

    1. Escoger una llave de partición adecuada, tras un profundo conocimiento del negocio. En general es más recomendable usar una llave natural que una numérica en estos casos. En el caso anterior, haber escogido la ciudad como llave de partición es mucho más eficiente por ejemplo que haber escogido por ejemplo el Id de la venta.

    2. Administración de particiones: Es una de las tareas más complejas luego de haber definido las particiones; generalmente implica consideraciones en el desarrollo de la aplicación que debe saber dónde insertar o modificar nuevos datos así como dónde buscar los existentes. La idea es escoger un tipo de partition key que no vaya a requerir una posterior reubicación de datos cuando el negocio eche a andar, lo que probablemente significaría un tiempo de baja del servicio.

    3. Evitar cross-database joins: Aparte de ser bastante ineficiente, algunas plataformas como SQL Azure no soportan consultas distribuidas. Por eso es mejor que todos los datos que requiere una tabla dada, estén en la misma DB. De lo contrario habrá que escribir el código necesario para poder ejecutar consultas asíncronas a través de varias particiones que retornen datos separadamente que luego tendrán que ser unidos en la capa de aplicación.

    4. Alta disponibilidad: Cuando se escoge un acercamiento de este tipo de escalabilidad, es requerido que todos los servidores a través de los cuales está particionada la base de datos tengan unos índices de disponibilidad bastante altos. Estos índices son provistos por SQL Azure. Es así como cada vez que creamos una base de datos, SQL Azure crea automáticamente tres copias de la misma, para asegurar esta alta disponibilidad. Cada copia es creada en servidores físicos distintos dentro de la misma ubicación geográfica. La sincronización entre estas bases de datos es automática también. En caso de falla, SQL Azure automáticamente redirige las peticiones a una de las copias de seguridad y vuelve a levantar una tercera copia para futuras eventualidades. Todo esto ocurre sin intervención humana y sin caídas del servicio.

    5. Administración: El escalamiento horizontal puede llegar a generar alta complejidad en la administración dado que hay que aplicar updates, ejecutar patching, ajustar un plan de recuperación de desastres, etc. y todo esto para cada servidor usado en el escalamiento. Afortunadamente SQL Azure se encarga de todas estas tareas automáticamente por nosotros. De las únicas tareas de administración que un DBA debería tener en cuenta son: creación de esquemas, afinamiento de índices, optimización de consultas, logins, usuarios y administración de la seguridad.

    image

    Conclusión:

    A pesar de que el particionamiento puede ayudar a mejorar el performance, la escalabilidad y los costos, puede llegar a ser bastante complejo implementar un esquema de particionado exitoso. Algunas aplicaciones tienen un esquema de particionamiento natural del cual se puede tomar ventaja mientras hay otras aplicaciones que requieren ser re - arquitecturadas para volverlas escalables; cosa que vale la pena la mayoría de las veces. Windows Azure y SQL Azure proveen una plataforma sobre la cual las aplicaciones pueden hacer SCALE-UP/SCALE-OUT en el caso de Windows Azure al permitir “agrandar” las instancias y al permitir usar varias instancias con el mismo despliegue. Y en el caso de SQL Azure con SCALE-OUT al permitir pasar de una o dos bases de datos a decenas o cientos de bases de datos de una manera muy sencilla sin incurrir en fuertes costos de infraestructura. Además, los clientes no pierden inversión si necesitas reducir nuevamente la infraestructura, ya que todo estaba en arriendo en el esquema de plataforma como servicio.



  • WarNov Developer Evangelist

    Mi aplicación web no carga imágenes ni estilos cuando publico en IIS7!!!

    • 2 Comments

    Puede que te haya pasado que tienes una aplicación web .NET ya sea MVC o ASP.NET que en modo diseño o publicándola con el servidor Cassini (el incluido en Visual Studio) todo funcione correctamente en cuanto a carga de imágenes y estilos se refiere.

    Pero cuando lo ponen en un IIS7, Naranjas! Ya no hay ni imágenes ni estilos! Sick smile

    Miren el sitio con estilos

    Si esto les ha sucedido alguna vez, el problema puede ser muy sencillo de corregir. Solo tienen que verificar que el IIS tenga activado el módulo de presentación de contenido estático; aquí lo pueden chequear para Windows 7:

    image

    Para otros sistemas con IIS7, sigan estas instrucciones.

    Hope it helps!

  • WarNov Developer Evangelist

    Stairway to Azure 4: Hello Azure

    • 8 Comments

    Ya vimos en este post los conceptos de Software as a Service (Saas), Software + Services (S+S) y Plataform as a Service (PaaS) y de cómo Windows Azure es la alternativa que Microsoft nos ofrece para desplegar este tipo de conceptos que lideran hoy el desarrollo del software.

    En este otro post vimos toda la teoría acerca del funcionamiento de Windows Azure y los conceptos sobre los cuales se construye.

    Pues bien, ya con esto en nuestro conocimiento, hoy les traigo ya para que comencemos de lleno, un video que nos muestra cómo comenzar a programar para Windows Azure y cómo desplegar nuestras aplicaciones en la nube, sobre este esquema.

    Para poder hacer este despliegue, es necesario tener una cuenta en válida en Windows Azure, que nos permita hacer deployment de aplicaciones.

    Aunque lo más obvio y normal es que estas cuentas tengan un costo, hasta el mes de Julio de 2010 tenemos una promoción que nos permite probar la plataforma bajo ciertas restricciones y de manera gratuita.

    Las Cuentas:

    En el siguiente video les muestro como aprovechar esta promoción, para adquirir una cuenta válida:

    Links mencionados en este video:

    El Desarrollo:

    Luego de que tengamos nuestra cuenta, podemos proceder a crear y publicar nuestras aplicaciones en la nube, tal como se muestra en el siguiente video (si no tenemos una cuenta, el video también es útil para aprender a programar para Azure, pero no tendremos la posibilidad de publicar la aplicación):

    Muy bien, espero que con este par de videos, se animen para comenzar a ser productivos con Windows Azure. Ya vendrán más videos con los que les mostraré aplicaciones más avanzadas.

  • WarNov Developer Evangelist

    Las cartas sobre la mesa: HTML5 vs. Silverlight

    • 18 Comments

    Es preocupante ver como ciertos periodistas y no solo ellos sino en general la gente en medios de divulgación siempre aprovecha ciertos acontecimientos para “acomodarlos” de manera tal que parezcan una chiva sin importar las implicaciones sociales que esto pueda llegar a tener.

    Es el caso a mi modo de ver de una señora periodista muy bloguera ella, quien hizo unas conclusiones en su blog a raíz de unas declaraciones de Bob Muglia, presidente de la división de Server and Tools en Microsoft.

    Muglia le afirmó: “Silverlight is our development platform for Windows Phone … Silverlight also has some “sweet spots” in media and line-of-business applications”

    Esta sumada a otras frases desafortunadamente extraídas del contexto hizo parecer el artículo como una clara afirmación del presidente, en la que se indicaba que básicamente Silverlight entraba en decadencia. Sin mencionar que el PDC estuvo muy concentrado en la novedad IE9+HTML5.

    A partir de entonces se inició una revolución en el social media que durante todo este tiempo ha estado precedida por aquellos que de un modo u otro sienten amenazada a la plataforma Silverlight por el advenimiento de HTML5 y el fuerte apoyo demostrado abiertamente por Microsoft a esta tecnología. En esta euforia los desertores de Silverlight comenzaron a publicar por los cuatro vientos que era el fin de la plataforma y demás…

    Ya en varios medios menos formales que este, yo había comentado el total desacuerdo con todas esas opiniones y enumerado ciertos motivos para estas afirmaciones.

    Hoy Bob Muglia anunció oficialmente cual es nuestra postura al respecto y por ende me permito hacer más públicas y formales mis apreciaciones al respecto que como es de esperarse van en favor del futuro de Silverlight, de la mano de los intensos avances que hemos tenido en HTML5 tras la persecución de nuestra meta de ser los mejores implementadores de HTML5 en el mercado; cosa que ya estamos logrando con resultados muy positivos aún en pruebas tan estrictas y objetivas como la de W3C en la cual estamos en el primer lugar con Internet Explorer 9 en el Platform Preview número 6.

    1. Primero comencemos por lo sucedido en el PDC:

    No se mencionó mucho, la verdad… pero son de esas cosas que pasan. Silverlight va por su buen camino al éxito y para este evento desafortunadamente no hubo un nuevo release. Pero señores: En qué tecnología se hizo el streaming del evento? No fue exitosa esta transmisión? Todo el mundo pudo estar siguiéndolo en tiempo real gracias a Silverlight. Con un reproductor inigualable que difícilmente se puede lograr usando mero HTML5 en el cual podíamos ecoger hasta el audio de la traducción simultánea o intercambiar entre la presentación y el speaker para ver a uno u otro más grande. Todo esto apoyado por el Smooth Streaming de IIS7 que nos permite ver videos Silverlight aún en dispositivos que no aceptan ni siquiera Flash como el IPhone (si tienes IPhone chequea: http://iis.net/iphone para comprobarlo). Si quieren crear reproductores tan avanzados como este lo pueden hacer sin ningún problema gracias a que hay todo un framework gratuito y disponible para generarlos muy fácilmente: Silverlight Media Framework 2.0

    image

    2. Cuál es la experiencia de cliente más enriquecida posible?

    Es Silverlight. Microsoft que es quien ha avanzado más en el tema de HTML5, aún no logra toda la versatilidad que tiene Silverlight y de hecho no lo hará, porque HTML5 siempre tendrá la desventaja de tener que reducir sus funcionalidades a un mínimo común denominador, para permanecer estándar. Y esto sucederá con todos los proveedores de HTML5.

    Hoy en día. Silverlight provee experiencias Premium en cuanto al manejo multimedia que difícilmente se podrán encontrar en HTML5 como estándar pasados varios años:

    • Teleconferencia con webcam/micrófono
    • Aplicaciones de Video por demanda con funcionalidad DVR y protección de contenido (Netflix servicio del que soy asiduo y feliz usuario ya que me deja ver todas las películas que quiero como si estuviera alquilando DVDs, pero a través de Internet usando Silverlight)
    • Transmisión completa de eventos masivos como el PDC o los Olímpicos de Invierno en 2010 que soportaron hasta 130.000 usuarios concurrentes viendo en promedio 111 minutos de video High Definition de 720p en vivo y en directo por visita., sumando un total de 4.8 millones de visitas durante las transmisiones y todo esto desarrollado solo en dos semanas… podrá HTML5 llegar a esto poniendo de acuerdo a todos los participantes de la industria? De hecho no se de un caso similar a este logrado con Flash… ustedes sí? Les agradecería me informen…
    • Por si fuera poco, estas transmisiones se pueden emitir a computadores de escritorio como aplicaciones únicas o como embebidas en el browser, a WP7, a IPhone y IPads y hasta a la XBOX, en el caso de Netflix. (HTML5 por definición nunca se acercará a eso)


      • Otros elementos no contemplados en el road map de HTML5 y que Silverlight sí soporta:
        • Video de Alta definición (HD) H.264 and VC-1
        • Protección de contenidos con DRM
        • Video estereoscópico 3D (con el que se transmitió la Nascar Sprint Cup Series de este año en compañía de los desarrollos tecnológicos de NVIDIA 3D Vision) y a través del cual lo usuarios pudieron experimentar video 3D real dentro de su browser, abriendo una posibilidad sin precedentes a nuevos canales y formas de transmisión.
        • Multicast
        • Soporte a broadcasting en vivo
        • Smooth Streaming (transmisión de video que se adapta a las condiciones de red para no producir cortes en los videos)
        • Picture in Picture
        • Soporte a herramientas de análisis que permiten integrar inteligencia de negocio dentro de las aplicaciones Silverlight gracias al Silverlight Analytics Framework

    • Multi hilos para el manejo de la respuesta de interfaz de usuario
    • 3D en perspectiva
    • Los mejores diseñadores y herramientas: Expression Blend, Visual Studio.

    • Para aplicaciones empresariales:
      • Más de 60 controles pre construidos
      • Herramientas y frameworks de productividad (RIA Services)
      • Aprovechamiento del gran performance de .NET y C#
      • Controles de visualización de datos súper avanzados como el Silverlight PivotViewer
      • Soporte flexible a datos: Databinding a objetos de memoria, XML, XML binario, LINQ, Storage Local

    • Impresión Virtualizada
    • Manejo de COM!!!

    Otros escenarios más simples sí son soportados por ambas tecnologías sin problemas… pero que hay del rendimientos y la calidad?

    Rendimiento:

    clip_image001

    Silverlight es el runtime más veloz en la web gracias a estar basado en el CLR.

    Calidad:

    Miren como se ve la misma figura trazada con HTML5 en varios browsers

    clip_image002

    Tiempo:

    clip_image004

    En mucho menos tiempo del que HTML5 ha estado en desarrollo sin ni siquiera la primera versión, Silverlight ha sacado a flote 4 versiones y aún hoy en día sigue sin conocerse cuando se oficializará HTML5 y de acuerdo a todo lo que se necesita para lograrlo, todavía falta más que un poco.. mientras tanto Silverlight seguirá en producción activo en los sistemas operativos y browsers más populares y progresando cada vez más.

    Más allá del Browser:

    Silverlight no es solo un plugin… es todo un concepto y una plataforma para lograr interoperabilidad no solo a nivel de sistemas operativos o browser, sino de dispositivos también. Silverlight se puede hospedar en el browser o fuera de él como una aplicación de escritorio no solo en Windows sino en MAC o Linux. Soporta todos los browsers más populares y por si fuera poco, es la plataforma de desarrollo para el Windows Phone 7 y el futuro es muy prometedor para otras plataformas, como los mismos dispositivos para nuestras salas de estar, por no decir televisores que reproducirán contenido Silverlight gracias a tecnologías ya existentes como Systems-on-a-chip (SoC) que nos han permitido generar demos completamente funcionales con TVs, BluRay y otros dispositivos de consumidor final.

    Así que si como desarrollador tú aprendes Silverlight, de inmediato de conviertes en un desarrollador para móviles y para electrodomésticos de consumo masivo, uniéndote a los más de 600.000 desarrolladores en el mundo que saben programar con esta tecnología que ya está en cerca del 65% (a pesar de su corto tiempo de vida) de las máquinas en el mundo: 600.000.000.

    Si todo esto es tan maravilloso, entonces por qué nos enfocamos en HTML5?

    La cantidad de dispositivos diversos en el mundo está creciendo exponencialmente. Así que tener una implementación “propietaria” en todos es casi imposible. En este caso es mucho más conveniente que todos esos dispositivos estén preparados para ejecutar un estándar global como lo pretende ser HTML5. Como tarde o temprano esto va a suceder, Microsoft se ha propuesto ser el mejor implementador de este estándar para cuando esto suceda; pero recordemos que alcanzar un nivel de estandarización tan alto requiere que la tecnología se baje a un mínimo común denominador… que en el caso de HTML5 no es tan mínimo pues la idea es que soporte muchas funcionalidades de presentación gráfica avanzada, pero que comparadas con las que tiene Silverlight, son muy difíciles de igualar.

    En palabras de Muglia “Silverlight nunca ha querido reemplazar a HTML en ninguna de sus versiones, pero su objetivo sí es hacer las cosas que no puede hacer HTML y otras tecnologías y hacerlo en una manera que es muy fácil e implementar para los desarrolladores. Hoy en día está instalado en 2/3 de los computadores del mundo y 600.000 desarrolladores la usan actualmente. No se equivoquen, nosotros continuaremos invirtiendo en Silverlight y habilitando a los desarrolladores para construir aplicaciones grandiosas con esta tecnología en el futuro… bob”.

    Go Silverlight, go! ( hand in hand with HTML5 Winking smile)

  • WarNov Developer Evangelist

    Stairway to Azure

    • 2 Comments

     

    El objetivo de esta serie de posts, es tender una escalera a la nube (Azure), de tal manera que nosotros, desarrolladores hispanoparlantes tengamos una manera rápida de comenzar con todo lo relacionado con esta tecnología.

    Para introducirnos rápidamente en el mundo de Azure, primero que todo es necesario que entendamos los conceptos de SOA, SaaS y S+S. Para este fin, he preparado este video que nos dejará muchas cosas claras:

     

    Luego del video, es mucho más fácil entrar en materia:

    GENESIS

    Al principio todo era código estructurado. Y miles de líneas de código se entrecruzaban como espagueti dentro de aterradores GoTo’s y Labels. Y la interoperabilidad de aplicaciones era así:

    Arquitectura Spagueti

     

    Todos los sistemas estaban altamente acoplados y hacer un arreglo o un cambio era toda una pesadilla. Era la época de oscuridad en el desarrollo de software. Se desarrollaba sin ciencia. Se administraba con sufrimiento.

    Servicios y SOA

    Después nació el servicio. Y los programadores se dieron cuenta de que era bueno. No tenían que pasar días tratando de hacer un cambio, porque las funcionalidades estaban bien distribuidas independientemente. Además tampoco se duplicaban. Entonces, nació SOA o Arquitectura Orientada a Servicios. Con la cual se hizo mucho más fácil la administración del software y los procesos más eficientes.

    El milagro de SOA hizo que las empresas progresaran mucho y que cada vez requirieran más servicios; sus sistemas de software crecían y obviamente así el hardware que los soportaban. Y el crecimiento de hardware trajo consigo un purgatorio para el personal de IT. Administrar decenas de servidores y estar pendientes de los nuevos requerimientos de infraestructura para estos grandes sistemas de software se hizo cada vez más doloroso. Los costos también aumentaban exponencialmente cada vez que crecían los sistemas. Además el negocio en crecimiento obligaba a viajar a los empleados de las empresas, quienes en sus viajes de negocio requerían tener acceso al software. Pero el software estaba internado en el centro de datos empresarial. Los empleados estaban atados a la ubicación física de la empresa. Todo fue un caos!

    SaaS

    Entonces apareció el evangelista promulgando el uso de los servicios de Hosting. Empresas encargadas de mantener los centros de datos para otras empresas sumergidas en el caos del manejo de IT. Y aparecieron grandes centros de datos que a pesar de estar fuera de las instalaciones de los clientes, podían albergar todas sus soluciones  de software. Las empresas se ahorraron costos y dolores de cabeza, porque ya no tenían que estar pendientes de la administración de IT. La comunicación entre el servicio de hosting y las empresas fue posible gracias a la explosión de internet y el ancho de banda; así que los empleados ya no estaban atados a la casa matriz; todo mundo se olvidó de los detalles no funcionales y se dedicó más enfocadamente a su negocio… Los gerentes vieron que todo esto era muy bueno! Así que se dedicaron solo a producir servicios para ser hosteados y ese fue el origen del SaaS (Software as a Service) o software como servicio.

    Entonces todo mundo comenzó a adorar al nuevo modelo de conexión al software (la internet). Y nadie volvió a conectarse al interior de la empresa. Siempre era necesario tener internet para poder trabajar. Así que si había un problema de conectividad, se perdía la productividad. Además las aplicaciones tuvieron que estandarizarse para poder visualizarse desde todos los browsers y se perdieron las características especiales y únicas de las aplicaciones de escritorio. Entonces los negocios que un día crecieron vertiginosamente, comenzaron a decaer por la limitante de funcionalidad. Esto sumado a que los proveedores de servicios de hosting también estaban a tope y tardaban mucho en escalarse, empeoró aún más la situación. El oscurantismo cayó de nuevo por el uso excesivo de una novedad.

    S+S

    El desarrollador reflexionó; y se dio cuenta que el modelo de software tradicional instalado al interior de la empresa que había desechado, tenía grandes ventajas sobre el nuevo ídolo. Y que sin embargo SaaS también conservaba características brillantes. Entonces observó que la solución no era irse por un único camino. Sino tomar el mejor camino de acuerdo a cada tipo de aplicación. Así decidió que parte de su software iba a ser software como tal y otra parte iba a ser servicio. Esto dio origen a S+S: Software más Servicios. Desarrolladores y gerentes se dieron cuenta que esto era bueno y se mantiene hasta nuestros días.

    AZURE (PaaS)

    Microsoft también observó que todo esto era bueno. Y decidió hacerlo aún mejor! Así que está poniendo a disposición de sus clientes los servicios de hosting, almacenamiento y procesamiento de datos; tal cual como lo hacen los actuales proveedores; pero esta vez, ofreciendo estadios completos de servidores que hacen más fácil lograr la escalabilidad y disponibilidad que requieren algunas de las aplicaciones de misión crítica de los clientes. En síntesis, Azure cubre la parte de software como servicio; pero como se observa al mirar en detalle la tecnología, se ofrece todo un framework para poder conectarnos con las aplicaciones al interior de la empresa y otras hospedadas por los proveedores de servicios de hosting convencionales que seguirán trabajando con muchas de las aplicaciones que actualmente manejan sin problemas. Concluyendo, la nueva tecnología Azure basa su desarrollo en la interoperabilidad limpia y eficiente con las fuentes de software que han demostrado ser muy adecuadas hasta ahora: al interior de las empresas (Software – On Premises) y hosteadas por terceros (Servicios).

    Una vez recorrido el camino necesario para entender la historia y el porqué de Azure, esperen en próximos blogs una inmersión especial a la plataforma y todas sus características!

  • WarNov Developer Evangelist

    Windows Azure: Compilado de Recursos

    • 3 Comments

    A continuación les presento un conjunto de recursos acerca de Windows Azure que aplica sobretodo a la audiencia hispana.

    La primera, es una presentación de PowerPoint que da un recorrido global sobre la plataforma. El segundo recurso precisamente es un video donde hago la presentación de estos slides, de tal manera que les permitirá tener un mayor sentido de la presentación.

    El tercer punto presenta todos los artículos de este blog, relacionados con Windows Azure, desde el último hasta el primero. En general es buena idea que si están comenzando con esta plataforma, comiencen a leer desde el primero, ya que progresivamente va subiendo el nivel técnico de estos artículos.image

     

     

    Herramientas

    1. Cliente WPF para Administración de Blob Storage
    2. Windows Azure Service Management CmdLets
    3. Explorador de Tablas Azure Online
    4. Sitio de cmdlets de Azure para PowerShell

    Para finalizar, si tienen preguntas acerca de Windows Azure, tras algún evento, este es el post en el que en los comentarios las pueden anotar, y con mucho gusto trataré de resolverlas!

    Gracias por Asistir!

  • WarNov Developer Evangelist

    Boletas para Aerosmith via Windows Azure!!!

    • 0 Comments

    Quieres ganarte DOS BOLETAS PLATINO para ver a AEROSMITH en Bogotá este 20 de Mayo?

    image 

     

    Sólo debes crear una aplicación y subirla a Windows Azure.

    En este POST de mi blog encontrarás los pasos a seguir para crear una cuenta en Windows Azure válida en Colombia y la guía para subir dicha aplicación.

    Envía un mail a devcol@microsoft.com con el asunto “Windows Azure” e incluye los siguientes datos:  URL de tu aplicación, Nombre, Cédula y teléfono.

    El sorteo se realizará el Martes 18 de Mayo a las 5PM entre los mails que hayamos recibido hasta ese momento y nos comunicaremos directamente con el ganador.

    *Sólo serán válidas las cuentas creadas en Colombia

    ** El sorteo será realizado por un jurado de 5 personas en la hora y fecha indicadas.

    www.microsoftactiva.com

  • WarNov Developer Evangelist

    Qué tiene y qué no tiene SQL Azure?

    • 1 Comments

    Esta es una de las dudas que se presenta frecuentemente con respecto a las tecnologías de Windows Azure.

    Aquí va rápidamente la respuesta:

    Transact-SQL es un lenguaje que contiene comandos que se utilizan para administrar instancias de SQL Server, incluyendo la creación y administración de todos los objetos de una instancia de SQL Server e insertar, recuperar, modificar y eliminar todos los datos en tablas. Las aplicaciones pueden comunicarse con una instancia de SQL Server mediante el envío de instrucciones Transact-SQL al servidor.

    Microsoft SQL Azure admite un subconjunto de Transact-SQL para SQL Server.

    El soporte para Transact-SQL en SQL Azure puede ser descrito en tres categorías principales:

    • Elementos de lenguaje Transact-SQL que se admiten tal cual.
    • Elementos de lenguaje Transact-SQL que no son compatibles.
    • Elementos de lenguaje Transact-SQL que proporcionan un subconjunto de los argumentos y las opciones en sus correspondientes elementos de Transact-SQL en SQL Server 2008.

    Las siguientes características de Transact-SQL son compatibles o parcialmente soportadas por Sql Azure:

    • Constantes
    • Constraints
    • Cursores
    • Administración y reconstrucción de Índices
    • Tablas Temporales Locales
    • Palabras Reservadas
    • Procedimientos almacenados
    • Administración de Estadísticas
    • Transacciones
    • Triggers
    • Tablas, join y variables de tablas
    • Funciones definidas por Usuarios
    • Vistas

    Las siguientes características de Transact-SQL no son soportadas por SQL Azure:

    • Common Language Runtime (CLR)
    • Ubicación de archivos de base de datos
    • Creación de Mirrors
    • Consultas distribuidas
    • Transacciones distribuidas
    • Administración de grupos
    • Tablas temporales globales
    • Índices y datos espaciales  Ya lo tiene! Open-mouthed smile
    • Opciones de configuración de SQL Server
    • SQL Server Service Broker
    • Tablas del sistema Ya las tiene!
    • Indicadores de traza

     

    Para información detallada, visiten MSDN



  • WarNov Developer Evangelist

    LINQ: Consultando tablas cruzadas en Visual Studio LightSwitch

     

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

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

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

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

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

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

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

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

    ...

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

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

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

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

    Modelo Relacional:

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

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

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

    Escribiré mi primer consulta de la siguiente manera.

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

    Resultado Consulta 1: Error.

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

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

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

    Resultado Consulta 2: Exito.

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

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

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

    Resultado Consulta 3: Exito.

    PROFILING

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

    Consulta 2: Reporte

    Consula 2: Entity SQL Generado

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

    Consulta 3: Reporte

    Consulta 3: Entity SQL Generado

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

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

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

    Muchas Gracias.


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




  • WarNov Developer Evangelist

    CTE: Common Table Expressions – SQL Server 2008

    • 4 Comments

    Este es el primero de una serie de artículos que estaré escribiendo acerca de características de SQL Server 2008 para desarrolladores.

    Un CTE es un artefacto que nos mantiene en memoria el resultado de una consulta, para que lo podamos llamar luego dentro de esa misma consulta. Es como una “variable” temporal que nos evita tener que declarar una vista no persistente, o una tabla temporal.

    La sintaxis es muy sencilla:

    WITH <nombre de su CTE> <nombre de columnas>
    AS
    (
    <query de origen>
    )
    SELECT * FROM <nombre de su CTE>

    Por ejemplo:

    image

    Para qué es útil?

    Imagínense por ejemplo que tienen una tabla de ventas donde están todas las ventas hechas y el ID de los vendedores que las hicieron.

    Piensen que necesitan un reporte donde aparezca el total de ventas y el nombre del vendedor.

    Los datos extendidos del vendedor están en otra tabla. Además como el reporte totaliza la cantidad de ventas se requiere un query con una función de agregado ( count(*) ) Dado que existe este agregado no es posible usar un simple join, sino que tendríamos que usar una subconsulta o una tabla temporal:

    select Vendedores.FirstName, VentasAgrupadas.VentasTotales from
    (
       SELECT Sales.SalesOrderHeader.SalesPersonID, COUNT(*) as VentasTotales
       FROM Sales.SalesOrderHeader
       WHERE Sales.SalesOrderHeader.SalesPersonID IS NOT NULL
       GROUP BY Sales.SalesOrderHeader.SalesPersonID
    ) as VentasAgrupadas
    inner join Sales.vSalesPerson as Vendedores on Vendedores.SalesPersonID=VentasAgrupadas.SalesPersonID
    order by VentasAgrupadas.VentasTotales

    Como se aprecia esto es engorroso y poco claro.

    Con un CTE es mucho más sencillo, ya que no existe la necesidad de la subconsulta sino que parece como si declaráramos una variable de tipo tabla o vista con los resultados que queremos:

    WITH VentasAgrupadas(IdVendedor, VentasTotales)
    as
    (
      SELECT Sales.SalesOrderHeader.SalesPersonID, COUNT(*)
      FROM Sales.SalesOrderHeader
      WHERE Sales.SalesOrderHeader.SalesPersonID IS NOT NULL
      GROUP BY Sales.SalesOrderHeader.SalesPersonID
    )
    SELECT Vendedores.FirstName, VentasAgrupadas.VentasTotales
    FROM Sales.vSalesPerson as Vendedores
    INNER JOIN VentasAgrupadas ON Vendedores.SalesPersonID=VentasAgrupadas.IdVendedor
    ORDER BY VentasAgrupadas.VentasTotales

    Un caso aún más dramático puede observarse cuando queremos detectar los duplicados de una tabla.

    Por ejemplo si tengo una tabla de productos con Ids distintos pero mismo nombre, la consulta luce así:

    SELECT * FROM Products WHERE ProductID NOT IN
    (SELECT MIN(ProductID) FROM Products as P
    WHERE Products.ProductName=P.ProductName)

    Exótico no?

    Es lo que conocemos como Self-Join en SQL.

    Eso me retorna todos los registros duplicados. Observen que se logra luego de extraer el mínimo id para los duplicados, selecciono todos los duplicados cuyo id no sea ese mínimo, lo que me da como resultado los registros redundantes:

    clip_image003

    Obviamente con un CTE la complejidad del query se reduce completamente:

    WITH MinProductRecords AS
    (
      SELECT MIN(ProductID) AS ProductID, ProductName
      FROM Products
      GROUP BY ProductName
      HAVING COUNT(*) > 1
    )
    
    SELECT Products
    FROM Products AS P
    INNER JOIN MinProductRecords AS MP
    ON P.ProductName = MP.ProductName AND P.ProductID > MP.ProductID

    Aquí aunque hay más código, es más claro y administrable, pues vemos cómo primero seleccionamos los mínimos Ids y luego hacemos un join donde los Ids sean mayores a estos mínimos. Así se obtienen los mismos resultados.

    Entonces si quisiéramos además eliminar de inmediato los duplicados bastaría con reemplazar el último SELECT por un DELETE

  • WarNov Developer Evangelist

    Video y Podcast: Introducción Avanzada a Windows y SQL Azure

    • 0 Comments

    A veces queremos saber de algo, sin tener que dedicarla el 100% de atención o tiempo… tal vez hacerlo mientras vamos en el transporte público o conduciendo… o sencillamente no tenemos tiempo para leer un extenso artículo y preferimos ver un video o tal vez oír al respecto.

    Este video – podcast está basado en este artículo de Windows Azure el cual tiene una presentación que hago siempre a mis entrenados. Se brinda una introducción avanzada a la plataforma para conceptualizarla y poder comenzar a trabajar de lleno con ella.

     

    Enjoy!



  • WarNov Developer Evangelist

    Stairway to Azure (3): Componentes de Cómputo y Almacenamiento

    • 4 Comments
    Descarga la presentación PowerPoint de este Post.
     En mi post anterior, vimos por qué en determinado momento, es ventajoso tener alguien que se preocupe por el manejo de la infraestructura de nuestras aplicaciones en vez de nosotros. Y observamos que esto nos dejaría libres para preocuparnos únicamente por desarrollar la lógica de nuestras aplicaciones. Ya no es necesario comprar, instalar y operar sistemas de IT. Además solo pagaríamos por el cómputo y almacenamiento usado (como con los servicios públicos) y no una tasa fija que solo se requiere para ciertos picos. Finalmente, si enfocamos correctamente nuestras aplicaciones, estas pueden escalar muy fácil tomando ventaja de los enormes centros de datos que ofrece Microsoft para hospedar nuestras aplicaciones. Por ejemplo; si decidiéramos crear el siguiente “Facebook” sería muy últi Windows Azure ya que soporta trabajos de presentación (Web Role) y trabajos de proceso (Worker Role). Además si es una iniciativa con poco presupuesto inicial, es ideal ya que a medida de que se tengan más usuarios y se requiera escalar el sistema, se tendrán más recursos para adquirir dentro de Windows Azure.  

    Nuevamente, eso no implica que todo lo desplegaremos en Azure. La idea no es tener únicamente  SaaS sino también S+S. Así que por ejemplo las aplicaciones que hoy en día corren dentro de una organización (on-premises) podrían almacenar datos en la nube o usar otros servicios de la misma. Aplicaciones que corren en el escritorio o teléfonos móviles pueden usar los servicios de la nube para hacer sincronización de datos. 

    Toda esta maravilla requiere de aplicaciones que la exploten! Y para lograr dichas aplicaciones, necesitamos de una plataforma para construirlas. Esta plataforma es provista por Windows Azure y está compuesta por un grupo de tecnologías que nos proveen servicios a nosotros como desarrolladores.  

     

     

    Componentes de Azure

    En Windows Azure básicamente encontramos tres componentes principales:

    Windows Azure

    Ambiente basado en Windows (en esta edición es Server 2008), para ejecutar aplicaciones y almacenar datos en los centros de datos de Microsoft.

    SQL Azure

    Provee servicios de datos basados en SQL Server

    .NET Services

    Infraestructura distribuida para usar con aplicaciones locales y hospedadas en la nube.

    Estos componentes los podemos apreciar en la siguiente ilustración. En este post exploraremos en detalle el componente Windows Azure (Cómputo y Storage) y posteriormente observaremos Sql Azure y .NET Services.

    Windows Azure

    Comencemos entonces con Windows Azure:

    Overview

    Como podemos observar en la gráfica, este componente se subdivide en tres elementos: la estructuta principal o Fabric, el componente de cómputo y el componente de almacenamiento (storage). Empecemos viendo en detalle el componente de cómputo.

    Servicios de Cómputo

    Windows Azure corre sobre una gran cantidad de máquinas, todas ubicadas en los datacenter de Microsoft y accesibles vía internet. Todas estas máquinas conforman un todo que le da el poder y escalabilidad necesarios. Aunque al principio solo se iban a poder ejecutar aplicaciones .NET hoy en día, esta plataforma permite ejecutar aplicaciones nativas de Windows (esto lógicamente comprende todos los lenguajes de programación tradicionales que hoy en día sirvan para correr aplicaciones sobre Windows Server 2008).
    En Windows Azure, una aplicación típicamente tiene múltiples instancias y cada una corre una copia de todo o una parte de la aplicación. Cada instancia corre en su propia máquina virtual. Estas VMs están sobre Windows Server 2008 x64. Las aplicaciones se instancian en uno de dos roles, según escoja el desarrollador. Web Role, o Worker Role:

     

    Azure

     El Web Role corre sobre IIS7 y acepta los llamados HTTP o HTTPS (tecnologías: ASP.NET, WCF, todas las que trabajen con IIS). El balanceo de carga es automático, gracias al Load Balancer incluido en la plataforma.
    El Worker Role no puede aceptar peticiones directas desde el mundo exterior. Típicamente estos roles adquieren sus entradas a través de colas en el Windows Azure storage. Estos mensajes sí pueden provenir de una aplicación exterior o de un Web Role. Son procesados y la respuesta se puede poner en una cola, o enviarse directamente al mundo exterior (esto último sí es permitido).
    Independientemente del tipo de rol en una VM, siempre existe un Agente de Azure que permite la interacción del rol con el resto de la aplicación y la plataforma.
    Aunque es algo que puede cambiar en el futuro, en la actualidad Windows Azure mantiene una relación 1:1 entre VMs y cores físicos de procesador. Esto obviamente garantiza el performance de la aplicación que sea predictible (cada instancia tiene su propio core dedicado; esto también significa que no hay un límite arbitrario en el tiempo de proceso concedido a una instancia en especial). Sin embargo si se desea aumentar el performance, el dueño de la aplicación podría decidir crear más instancias de la misma, solo modificando el archivo de configuración. De esta manera, Windows Azure detecta el requerimiento y ajusta una nueva VM con su respectivo core. Si en algún momento alguna instancia falla, Azure lo detecta e inicia una nueva.

    Esto genera una notoria implicación: Para ser escalable, las instancias de Windows Azure Web role, deben ser stateless (no manejar estado en sesión o aplicación por ejemplo). Todo estado requerido ha de ser escrito en los mecanismos de storage de Windows Azure, o pasados al usuario final por medio de cookies por ejemplo. Además debido al load balancer, no hay forma de garantizar que múltiples peticiones de un mismo usuario sean enviadas a un mismo Web Role.
    Este tipo de implicaciones hace que el pasar aplicaciones a la nube o crearlas destinadas para ellas, no sea completamente transparente comparado con el modelo on-premises. Sin embargo, los cambios son muy sutiles (usar ADO.NET Data Services –compatible con Azure Storage-, tener en cuenta el modelo de colas para los Worker Role, etc.)
    Por esto, para los desarrolladores, trabajar con Windows Azure, es muy similar a crear aplicaciones tradicionales Windows. Microsoft provee templates para Visual 2008 que permiten crear Web Roles, Worker Roles y combinaciones de los dos. Los desarrolladores son libres de usar cualquier lenguaje de programación Windows. Todo esto viene en un SDK de Azure que también contiene una versión de ambiente Windows Azure que corre en la máquina del desarrollador. Este ambiente es conocido como Windows Azure Development Fabric e incluye Windows Azure Storage, un agente Windows Azure y todo el resto de tecnologías que requiere una aplicación para correr en la nube.
    Un desarrollador puede crear y depurar su aplicación usando este simulacro local y luego desplegar la aplicación a Windows Azure, cuando ésta esté lista, aunque en la nube hay cosas que son realmente diferentes. Por ejemplo, no es posible hacer el attach de un debugger a una aplicación en la nube. Así que básicamente para hacer el debugging de una aplicación en la nube, el mecanismo principal sería la escritura a los logs de Windows Azure, vía el agente de Azure.
    Otros servicios provistos incluyen por ejemplo el envío de mensajes desde los agentes a Windows Azure, quien los captura y reenvía por medio de emails, mensajería instantánea o cualquier otro mecanismo especificado. Además también se puede especificar a Windows Azure que detecte fallas automáticamente y envíe alertas. También está disponible información acerca de consumo de recursos tales como tiempo de proceso, ancho de banda entrante y saliente y almacenamiento.

    Cuando el desarrollador ha depurado completamente su aplicación de manera local, ésta ha de ser instalada en un proceso de dos etapas. Primero se sube la aplicación al área de staging en Azure. En este momento, la aplicación queda identificada con un nombre DNS que tiene la forma <GUID>.cloudapp.net, donde <GUID> representa un identificador asignado por Windows Azure. Este nombre es asociado con una dirección IP virtual (VIP) que identifica al balanceador de carga a través del cual la aplicación será accedida. En el momento en que se decide pasar ya la aplicación a producción, se usa el portal de Windows Azure para solicitar el paso a producción. En este caso, Azure automáticamente cambia la entrada en sus servidores DNS para asociar la VIP con el nombre de producción que el desarrollador ha escogido; por ejemplo: myapp.cloudapp.net. (Es posible usar un nombre de dominio personalizado, sencillamente creando un DNS alias usando un CNAME estándar). Otro punto para resaltar aquí: las IPs reales de las aplicaciones jamás son reveladas.

    Esto brinda un fuerte componente de seguridad.

    Servicios de Almacenamiento

    Esta parte de la plataforma también provee un tipo de almacenamiento: Azure Storage. Que es distinto a SQL Azure (otra parte de la plataforma). El almacenamiento Azure no es relacional. Su lenguaje de consulta tampoco es SQL. Es un almacenamiento mucho más sencillo, pero más escalable y más rápido que un almacenamiento relacional. Básicamente hay tres tipos de almacenamiento Azure:

    Storage

     

    1.       BLOBS:  (Binary Large Objects). Prácticamente, archivos. Los requerimientos de File System de nuestras aplicaciones en la nube, se suplen con los blobs. Un blob puede ser de hasta 50Gb de espacio y se encuentra dividido en bloques, de manera que cuando se hacen transferencias y ocurren fallos, la transferencia puede continuar desde el último bloque transferido correctamente.

    2.     Tablas: Los Blobs son la opción justa para algunas situaciones. Pero para otras son muy poco estructurados. Son muy sencillos de entender; pero para permitir a las aplicaciones trabajar con datos de una manera más formal se proveen las tablas. Estas tablas no son tablas relacionales y tienen su complejidad:
           
            Tables

    De hecho, a pesar de que se llaman tablas, los datos que ellas contienen realmente se encuentran almacenados en una jerarquía simple de entidades que contienen propiedades. Cada propiedad tiene un nombre, un tipo y un valor. Varios tipos son permitidos incluidos: Binary, Bool, DateTime, Double, GUID, Int, Int64 y String. Una propiedad puede tomar diferentes tipos dependiendo de los valores almacenados en ella. De hecho, no hay obligación de que todas las propiedades en una entidad tengan el mismo tipo. El tamaño para cada entidad puede ser de hasta 1MB y siempre es accesada como una unidad. Cuando se lee una entidad se retornan todas sus propiedades y al escribir una, esto se hace atómicamente de manera que se reemplazan todas sus propiedades. Y en vez de usar SQL, una aplicación accesa los datos de una tabla usando las convenciones definidas por ADO.NET Data Services (no ADO.NET convencional), o REST. La razón para este tipo de solución, es que nos permite escalar el almacenamiento de una forma tal, que podemos distribuir nuestros datos en distintas máquinas (muchas más de las que se posibilitan con bases de datos relacionales tradicionales); de hecho, una sola tabla en SQL Azure puede ser de terabytes!

    3.    QUEUES: Los blobs y las tablas están enfocados en almacenamiento y acceso de datos. La tercera opción en Windows Azure son las colas, que tienen un propósito muy distinto. Una función principal de las colas es proveer un mecanismo para que las instacias de tipo Web Role se puedan comunicar con las instancias de tipo Worker role. En la siguiente gráfica, se describe el funcionamiento de las colas. En un escenario típico, un rol acepta trabajos de los usuarios (paso 1). Para pasar esos requerimientos a los worker role, se escribe un mensaje en la cola (paso 2). Este mensaje, puede ser de hasta 8kb y es posible usarlo para que contenga URIs apuntanto a blobs o entidades en tablas en caso de que se requiera transmitir más información. El worker lee los mensajes de su cola (paso 3) y ejecuta el trabajo como tal. Una vez leído el mensaje, éste no se borra. En vez de esto, el mensaje se hace invisible a otros lectores por un período de tiempo (por defecto 30 seg). Cuando el worker ha completado su trabajo, en ese momento se borra explícitamente de la cola. (paso 5)
            QUeues


    Separar las instancias web de las worker tiene sentido porque libera al usuario de tener que esperar a que una tarea larga sea procesada y también hace la escalabilidad más simple, dado que solo sería necesario agregar más instancias. Pero por qué hacer que las instancias borren explícitamente los mensajes? Esto se hace para manejar fallos. De esta manera si  un worker que está haciendo el trabajo indicado falla, el mensaje no se borrará de la cola.  Así que cuando vuelva a estar visible, el mensaje reaparece en la cola para ser leído por otro worker. Y de esta manera se proteje el mensaje de fallos.

    Independientemente del tipo de almacenamiento, todo dato almacenado es replicado tres veces, para garantizar redundancia de datos y tolerancia a fallos.

    El storage de Windows Azure puede ser accedido por aplicaciones de Windows Azure o cualquier otra. En ambos casos, todos los tres tipos de storage pueden consultarse a través de REST. Todo es nombrado usando URIs y accesado con operaciones HTTP estándares. No obstante, un cliente .NET podría usar ADO.NET Data Services o LINQ para acceder más cómodamente a esta información. Pero un cliente java  usaría REST estándar. Por ejemplo, un blob puede ser leído con un HTTP GET contra un URI formateado así:

    http://<StorageAccount>.blob.core.windows.net/<Container>/<BlobName>

    De manera similar, una consulta sobre una tabla sería:

    .table.core.windows.net/?$filter=http://<StorageAccount>.table.core.windows.net/<TableName>?$filter=<Query>

    y una cola se accesaría:

    .queue.core.windows.net/http://<StorageAccount>.queue.core.windows.net/<QueueName>

    La Estructura (Fabric)

    Todas las aplicaciones de Windows Azure y todos sus datos en el Storage, residen en alguno de los centros de datos de Microsoft. Dentro de ese centro de datos, el conjunto de máquinas dedicadas a Windows Azure se organizan en una fábrica tal como lo muestra la siguiente gráfica:

     

    Fabric

     

    Tal como se aprecia, la Estructura Azure es un gigantesco grupo de máquinas administrado por un componente de software llamado Fabric Controller. Este controlador es replicado a través de un grupo de 5 a 7 máquinas y es dueño de todos los recursos en la estructura: computadoras, switches, balanceadores de carga y más. Dado que el controlador se comunica con un “Fabric Agent” en cada máquina, también tiene información de cada aplicación en la estructura. Como punto a resaltar, puedo mencionar que el Storage también aparece ante el controlador como una aplicación más. Así que el controlador no conoce los detalles del storage; esto último indica obviamente que el almacenamiento es autocontrolado. Es decir; el Storage, es solo una aplicación más dentro de la estructura, que se administra autónomamente.

    Este amplio conocimiento le da la capacidad al Fabric Controller de cumplir múltiples funciones como monitorear todas las aplicaciones que están corriendo y de esta manera ser capaz de dar información en vivo, de qué es lo que está pasando en la estructura. Administra los sistemas operativos teniendo en cuenta aspectos como las actualizaciones de los Windows Server 2008 que corren en las VMs de Azure. También decide dónde deben correr las aplicaciones, escogiendo los servidores físicos para optimizar la utilización del hardware. Para lograr esto, el controlador depende del archivo de configuración que es subido con cada aplicación a la nube. Este archivo provee una descripción basada en XML de las necesidades de la aplicación: cuántos roles web necesitará, cuantos roles de trabajo y otros detalles. Cuando el controlador recibe una nueva aplicación, éste usa su archivo de configuración para determinar cuántos roles de cada tipo ha de crear. Una vez creadas estas VMs, el controlador las monitorea. Si una aplicación requiere 5 instancias de Web Role y una muere, el controlador automáticamente reiniciará una nueva.

    Esta creación de instancias debe realizarse inteligentemente. Por ejemplo, suponiendo que además de las 5 instancias web el desarrollador pide cuatros instancias worker. Una asignación ingenua podría poner todas estas instancias en máquinas en el mismo rack servidos por el mismo switch. Si el rack o el switch fallara, la aplicación entera quedaría no disponible. Dadas las metas de alta disponibilidad de Windows Azure, hacer que una aplicación dependa de puntos sencillos de falla como este, no es una buena idea.

    Para evitar esto, el controlador agrupa las máquinas en conjuntos llamados “Dominios de Falla”. Cada dominio es parte de un data center que independizaría las fallas únicamente a su contenido. Eso se ilustra en la siguiente gráfica:

    Failure

    En este ejemplo sencillo, la aplicación está corriendo en dos instancias Web y el datacenter está dividido en dos Dominios de Falla. Cuando el controller despliega la aplicación, se establece una instancia de Web Role en cada uno de los dominios. Este arreglo significa que una falla en el hardware no va a provocar que toda la aplicación se caiga.

    Hasta aquí vimos todo lo relacionado al componente de Windows Azure. En mi post Stairway to Azure (4): Sql Azure y .NET Services, veremos la descripción de estos otros dos componentes.

  • WarNov Developer Evangelist

    Introducción a Generic Handlers en ASP.NET

    • 2 Comments

    Un Generic Handler (GH) es una clase de objeto .NET que puede procesar http requests, sin necesidad de estar dentro del scope de una página aspx (que está dirigida a presentar salidas de tipo HTML clásico). Un ejemplo de GH es el HTTP Handler. Como es bien sabido un http Handler se puede asociar a cualquier extensión de archivo (de acuerdo a lo permitido por el IIS). Los GH sin embargo, solo se pueden asociar a la extensión ASHX que está directamente soportada por los proyectos web en visual Studio 2005 y posteriores. Así que los GH en .NET se asocian a archivos con extensión ASHX.

    Todos los Handlers implementan System.Web.IHttpHandler. Además, en IIS 7 se puede alojar cualquier Handler directamente.


    El hecho que el GH pueda correr fuera del entorno de una página y aparte procesar HTTPRequests, lo hace una herramienta perfecta para ofrecer servicios similares a los que ofrecería un Web Service. De esta manera, es un muy buen candidato para reemplazarlos, cuando no se pueden implementar ya sea por requerimientos del negocio o requerimientos no funcionales.

    Por qué puede no ser deseado un WebService?

    Según la arquitectura y requerimientos de algunos clientes, es mejor recibir resultados a través de HTTPRequest "simple", debido a que por ejemplo el llamado se hace desde una plataforma distinta a .NET desde la cual se hace bastante complejo crear un llamado a un WebService, tal vez porque la herramienta no puede manejar todos los tipos estándar en los WebServices (como sucede por ejemplo con PHP antiguo).

    Entonces por qué no hacer una página Web Normal que responda a los llamados?

    Si se crea una página aspx que responde a las peticiones se incurre en adicionales encabezados y todo el overhead adicional que genera la creación de una página completa (ciclo de vida, viewstate, etc), cuando en realidad sólo se desea obtener una simple respuesta (una imágen un xml, etc).

    Entonces para ganar performance y facilidad de administración en este tipo de funciones, es posible crear un Generic Handler sin dejar de atender al requerimiento de que la comunicación permanezca sencilla.

    Entre los métodos obligatorios al estarse implementando IHttpHandler está ProcessRequest que es el que ejecuta el proceso requerido y por ende al fnal de su alcance habrá de tener un llamado a context.Response.Write o similar, que devuelva una respuesta http. Esta respuesta puede ser html, txt plano, imágenes, xml, etc.

    Uso Avanzado 

    Suponga le siguiente escenario: Existe un objeto en memoria que se desea presentar al usuario como una página html.

    Opciones:

    1. Serializar el objeto a XML, leer el XML y pasarlo a un XSLT que crea el HTML, y grabarlo en un archivo que luego es presentado en un IFrame. Como es obvio, el overhead de crear y borrar estos archivos físicos generados es absolutamente inaceptable.
    2. Otro enfoque es incluir en la página un control XML que muestre el objeto serializado y en el cual luego de hacer la transformación se vea el HTML como tal. Es una alternativa muy aceptable que a primera vista no tiene ninguna desventaja, excepto el mismo overhead y tamaño que implica una página ASP.NET.
    3. Generic Handler: Se obtiene un control más directo sin el overhead que implica agregar un control XML a una página que además tendrá otros elementos que sumaran innecesariamente peso al resultado.

    Cómo se Logra?

    Al crear un GH, éste puede ser llamado como cualquier otra página aspx. (Por ejemplo desde un browser) Además también pueden aceptar parámetros: http://warnov.com/miGH.ashx?param=valor;otroparam=otrovalor a través de su URL. Para incluir un GH en su aplicación Web, solo agreguelo como un nuevo item en el proyecto en Visual Studio.

    En el caso especial de querer mostrar un objeto serializado en XML y transformado a través de XSLT es bastante sencillo: Solo se tiene que incluir en el XML la directiva de transformación XSLT y el archivo XSLT se ha de encontrar en la ruta que allí se especifica.

    Conclusión:
    Como se observa, son muchas la aplicaciones que tienen estos objetos y es considerable la ganancia que se obtiene con su uso, aunque en general pasan muy desapercibidos.

Page 1 of 14 (342 items) 12345»