MSDN Blogs
  • WarNov Developer Evangelist

    Microsoft recibe tu feedback para mejorar

    • 0 Comments

    image

    Hoy en día, Microsoft Colombia ha tenido la oportunidad de mejorar muchos aspectos a favor de su relacionamiento con los profesionales en tecnologías de Información y de Desarrollo. Por ejemplo, en {Activa} encuentras todos los recursos para tu actualización permanente, solución de problemas técnicos y evaluación de nuevas tecnologías.

    Esto ha sido posible gracias a que a través de diversos mecanismos se ha podido recibir retroalimentación de nuestros usuarios, para poder ir mejorando cada vez más.

    En este caso, Microsoft quiere escuchar de ti para averiguar cómo estos aspectos se pueden seguir mejorando, para brindarte más apoyo en tu trabajo y crecimiento profesional.

    Así que es muy probable que hayas recibido una encuesta por correo electrónico, proveniente de feedback@e-mail.microsoft.com, cuyo asunto es: "Ayude a Microsoft a centrar su atención en Clientes y socios". Para Microsoft es muy valioso que nos colabores contestando esta encuesta, que nos ayudará a ofrecerte recursos superiores. Colabóranos para ser cada vez mejores!

  • WarNov Developer Evangelist

    Tú nos puedes ayudar a ser mejores!

    • 0 Comments
    clip_image001
  • WarNov Developer Evangelist

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

    • 2 Comments

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

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

    De Roberto Alvarado:

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

    image

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

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

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

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

    image

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

    image

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

    image

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

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

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

    image

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

     

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

    image

    En la imagen un ejemplo sobre este punto.

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

    image

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

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

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

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

    Un ejemplo de esto:

    image

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

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

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

    image

     

    De Juan Carlos Ruiz:

     

    1. Website

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

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

    2. Estabilidad

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

     

    3. Contenidos

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

     

    4. Funcionalidad

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

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

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

    5. Información para Windows Store

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

    6. Localización y Lenguaje

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

    7. Política de Privacidad

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

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

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

     

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

    Muchos éxitos!

  • WarNov Developer Evangelist

    Visual Studio 2012: What’s New.

    • 0 Comments

    Ya habrán leído en mi editorial para este mes del flash de MSDN por qué Visual Studio es todo un templo para desarrolladores.

    Tal como lo mencioné en ese post, aquí quiero profundizar acerca de solo algunas de las novedades que nos esperan con la versión Visual Studio 2012.

    Nuevo explorador de soluciones:

    Veamos un video que nos muestra sus nuevas características:

    Mejoras Generales:

    clip_image002

    La más obvia de todas, es la inclusión de los tipos de proyectos para Windows Store (apps WinRT). Para
    soportar estas apps, Blend ahora es incluido en la instalación de Visual Studio.

    Mejoras para el desarrollo Web:

    Nuevos templates, mejoras a los editores de HTML y CSS, inspector de páginas en vivo que muestra que parte de la página corresponde al código que se está viendo y nuevas herramientas de publicación. Grandes mejoras en el soporte a Javascript (IntelliSense, DOM Explorer y consola JavaScript).

    clip_image004

    Windows Phone 8:

    En bien sea liberado el SDK de WP8, el IDE lo soportará plenamente. Recordemos que se podrá elegir a que versión de Phone se quiere compilar: Windows Phone 7.X y 8.

    Windows Azure:

    Las mejoras incluyen soporte a caching distribuido, nuevas opciones de publicación, nuevos template4s y una instalación más liviana. Además integrándose con Team Foundation Server, se pueden generar escenarios de integración y despliegue continuo.

    Aplicaciones de Negocio

    Aquí hay grandes innovaciones. Por ejemplo en Sharepoint tenemos nuevos diseñadores para listas y tipos de contenido, nuevos templates para columnas y páginas Silverlight, así como nuevas opciones de despliegue. Adicionalmente ahora tiene características de ALM disponibles como profiling de performance, pruebas unitarias e IntelliTrace. Por si fuera poco, estrenamos un nuevo modelo de apps para Office y Sharepoint 2013 en el cual apps hechas por developers pueden ser hospedadas en el cloud (Office 365) usando tecnologías web para desarrollarlas. Visual Studio 2012 da soporte al desarrollo de estas apps a través de las Microsoft Office Developer Tools for Visual Studio 2012 – Preview. Y finalmente LightSwitch está disponible como parte de Visual Studio Professional, Premium y Ultimate. Ahora con un nuevo tema y la habilidad de acceder a fuentes de datos OData, integración con Active Directory y nuevos tipos de negocio. Más de LightSwitch aquí.

    Performance

    Entre muchos otros aspectos, por ejemplo el tiempo de carga de soluciones ha disminuido enormemente en VS2012:

    clip_image005

    ALM:

    Muchas son las mejoras en este sentido, sobretodo la integración con TFS, la inclusión de Pruebas xploratorias (Agile testing) y el soporte a distintos frameworks de pruebas tanto propios como de terceros: xUnit.net y NUnit entre otros, todos con soporte en el nuevo Test Explorer.

    clip_image007

    Lo visto hasta ahora, es apenas un ápice de todas las novedades incluidas en Visual Studio 2012. Para una referencia completa, visiten msdn.

  • WarNov Developer Evangelist

    Algunas Verdades Útiles del Isolated Storage en Windows Phone 7

    • 0 Comments
    El Isolated Storage es el mecanismo ofrecido por Windows Phone para permitir que mantengamos el estado de nuestras apps, dado que para proteger el hardware, el software y al usuario de software malintencionado, el sistema de archivos convencional ha sido modificado para ser un esquema protegido en el cual una app no puede acceder a espacio de memoria física ni lógica de otras apps. Es así como el almacenamiento de cada app está completamente aislado de los espacios de almacenamiento de los demás y por eso recibe este nombre.

    Abundan posts y artículos que enseñan a usar el Isolated Storage: cómo almacenar y leer archivos y demás. Pero este post está dedicado a hablar de las circunstancias especiales que rodean al Isolated Storage y que en general solo la práctica lleva a concluirlas.

     

     
    • Si los espacios de almacenamiento están aislados, entonces cómo hacemos para que dos o más apps compartan datos?
      • En este caso la recomendación es almacenar los datos en la web o cloud, bien sea a través de web services o web apis.
    • Qué pasa con mi Isolated Storage, cuando le hago un update a la app? Se borra?
      • El Isolated Storage permanece intacto, así que la nueva versión de la app podrá seguir accediendo a los datos previamente guardados. Eso sí hay que tener en cuenta que si la app es desinstalada por parte del usuario, en ese caso el Isolated Storage desaparecerá. Por lo tanto si se desean mantener los datos, se recomienda hacer un update sencillo de la app, sin desinstalarla previamente.
      • Lo que si hay que tener MUY en cuenta, es que la nueva versión de la app esté capacitada para leer correctamente la data que estaba en el Iso; porque por ejemplo puede suceder que hayan serializado una clase en el Iso y luego en la nueva versión la estructura de la clase puede haber cambiado, lo que imposibilitará recuperar los datos almacenados. El desarrollador debe asegurarse de que todo funciona antes de subir la nueva versión de la app.
    • Qué cantidad de espacio tengo disponible en el Isolated Storage para mi app?
      • Tanta como para no ocupar más del 90% del espacio del teléfono.

    A pesar de que el Isolated Storage no es el FileSystem tradicional que conocemos, todas las buenas prácticas para manejar un sistema de archivos aplican. Las pueden observar en este post.

    • WarNov Developer Evangelist

      SQL Azure Internals

      • 0 Comments
      SQL Azure, la propuesta de base de datos relacional como servicio que ofrece Microsoft desde Windows Azure tiene varias diferencias con las implementaciones convencionales de SQL Server, a pesar de que para los usuarios finales el uso es prácticamente el mismo.

      Veremos en este video post, realmente cómo está compuesto SQL Azure. En dónde realmente se almacenan nuestras bases de datos. Cuál es el respaldo que ofrece SQL Azure a nuestra información. Cómo se logra un 99.9% de disponibilidad en bases de datos en la nube. Por qué Microsoft no nos cobra los logs, por qué el máximo tamaño de una DB por el momento es de 150GB, cuáles son las configuraciones de hardware de un servidor SQL Azure y muchas otras dudas que seguro hemos tenido alrededor de este tema.

    • WarNov Developer Evangelist

      Usar Visual Studio 2013 con Github

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

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

      image

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

      Abre el Team Explorer y selecciona conexiones:

      image

      Y ejecuta estos pasos:

      image

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

      image

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

      image

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

      image

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

      image

       

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

    • WarNov Developer Evangelist

      Acceso a DB desde móviles con LINQ to DataSets

      • 0 Comments

      Se está volviendo algo tradicional tener invitados a mi blog a los que agradezco mucho su colaboración a través de posts bastante buenos. Espero sea una costumbre semanal.

      En este caso se trata de Jorge Ramírez quien nos comparte un video genial para quienes están iniciándose en el desarrollo de aplicaciones móviles y desean conectarlas a bases de datos. Además, con el valor agregado del uso de LINQ en este caso! Disfrútenlo!

    • WarNov Developer Evangelist

      .NET Avanzado: Closures

      • 0 Comments

      Voy a ponerlo lo más simple que pueda:

      Un Closure  es una entidad de código que encapsula un comportamiento dado teniendo acceso al contexto en que fue definido; en cristiano, es como una clase, pero no con tanta flexibilidad (solo admite una acción dada) y su estado no puede ser cambiado luego de ser inicializado. En síntesis, una seudoclase más especializada, que consume menos recursos. Y que es más felxible que una estructura, dado que se constuye con delegados, que pueden apuntar a distintos métodos.

      Cómo se construye?

      Tomar el framework 2.0 en adelante, usar sus delegados y métodos anónimos, generar un productor de delegados con un parámetro de configuración y se obtendrá un closure.

      Ha tenido por ejemplo que calcular un impuesto como el IVA que puede variar según el artículo?
      Por ejemplo para una crema dental es de 16% pero para un auto es 25%.

      Entonces el programador bien juicioso se hace el siguiente método:

      double IvaCalc(double tax, double amount);

      Así pues siempre que se vaya a llamar al método se han de pasar ambos parámetros:

      double imp1 = IvaCalc(25, 25800);
      double imp2 = IvaCalc(16, 4);
      dpuble imp3 = IvaCalc(16, 5800);

      etcétera

      Entonces se puede optar por hacer dos métodos; uno por cada tipo de IVA.
      Pero si son 10 tipos de IVA habrán 10 métodos?

      Así que se opta por hacer una clase calculadora de IVA:

      Código clase calculadora de impuestos en C#

      De esta manera basta con instanciar un objeto por cada tipo de IVA y ponerlo a trabajar; esto minimiza la cantidad de código escrita, y es bastante claro:

      IvaCalculator autoCalc=new IvaCalculator(25);
      IvaCalculator prodCalc=new IvaCalculator(16);
      double imp1 = autoCalc(25800d);
      double imp2 = prodCalc(4d);
      double imp3 = prodCalc(5800d);


      Pero de nuevo... si son diez tipos distintos de IVA, creará diez instancias de objeto? Es justo tanto empleo de memoria al tener un objeto completo solo para hacer una operación?
      No lo creo... precísamente para solventar esta situación son útiles los closures.(Entre otras)

      Un closure permite reflejar la simple funcionalidad de la pequeña clase que diseñamos anteriormente, sin incurrir en el overhead del objeto como tal. Para lograrlo, se requiere una forma de mantener un estado (en este caso, la tasa del impuesto) para no tener que estar pasando el parámetro de configuración en cada llamado. Además se requiere una operación sobre ese estado. Cómo lograrlo sin tener que hacer un objeto?

      La operación como tal, se logra con un simple método. Pero este método debe ser configurable en su creación de manera que tenga un estado.

      Para que se pueda configurar es necesario que exista una variable en un ambiente léxico (scope) superior al del método, de manera que esta variable pueda ser inicializada sin necesidad de llamar al método. Esta, será pues la variable que indica el "estado" del método. Pero igual, eso está dentro de una clase. De hecho en C# todo lo que ejecute, ha de estar dentro de una clase. La ventaja ahora, es que vamos a trabajar dentro de la misma clase de ejecución de nuestro flujo. No tendremos que crear más instancias.

      Tanto el parámetro como la operación deben quedar encapsulados dentro de un mismo ambiente léxico dentro de la clase, para que tengamos la unidad requerida para poder generar instancias (pero no de una clase que es lo que queremos instanciar, sino de algo más liviano que llamaremos "enclosure"). Para esto es necesario poder hacer referencia al método dado.

      En .NET qué nos permite hacer referencia a métodos? Si... correcto: los delegados. Entonces generamos un ambiente léxico que tenga al delegado referenciando al método y al parámetro de configuración. Obviamente si estamos dentro de una clase y no queremos generar otra, ese ambiente léxico es un nuevo método. Este método deberá retornar el delegado apuntando a la operación ya configurada como es debido, pero además el método al que apunte el delegado deberá estar declarado inmediatamente, de manera que el parámetro de configuración del mismo sea accesible a éste, desde el método que lo contiene.

      En teoría suena bien. Pero cómo lograr que un delegado apunte a un método que se declara "en línea" junto con éste?

      Ahí es donde entran los métodos anónimos. Son precisamente eso: Métodos declarados en línea donde son requeridos por los delegados. Generalmente, los delegados se han inicializado con el nombre de un método que cumpla el contrato de su firma. Ahora (Framework 2.0 en adelante), no es necesario declarar el método aparte para poderlo referenciar luego por un delegado (lo que impediría acceder al dichoso parámetro de configuración) sino en línea junto con la declaración del delegado:

      delegate int MyDelegate(int a, int b);
      MyDelegate myDel = delegate (int a, int b)
      {
         .....
         return ....
      };

      No olvide el ";".

      Ya con este conocimiento, podemos generar el método que queremos:

      //Este delegado que permitira
      delegate double IvaCalculator_(double tax);

      IvaCalculator_ ivaCalcProducer(double tax)
      {
         return delegate(double amount)

         {
            return amount*tax;
         };
      }


      Exótico no?

      Pero a pesar de ello, logramos lo deseado: El método toma una variable de configuración. Así tenemos estado y manipulación de estado. Lo que haría una clase. Entonces ahora cómo se operaría es muy parecido al uso de clases anterior; solo que ahora no hay overhead por creación de nuevos objetos. Lo que se crean son nuevos delegados. Uno por cada tipo de tasa en este caso. Ellos "cuestan" mucho menos que un objeto.

      IvaCalc_ ivaCalc16=ivaCalcProducer(16);
      IvaCalc_ ivaCalc25=ivaCalcProducer(20);
      double imp1 = ivaCalc25(25800); 
      double imp2 = ivaCalc16(4); 
      double imp3 = ivaCalc16(5800);

      Descargar Ejemplo Completo (Aplicación de consola en C# mostrando el uso de Closures)

      Y listo. Así se construyen y usan los closures. Ahora ya puede ir y alardear un poco con su equipo de desarrollo acerca del misterioso "Closure"!!

       Open mind 4 a different Coding!!!

    • WarNov Developer Evangelist

      Windows Azure también es para ITPROS!

      • 0 Comments

      Nuestra plataforma de Cloud Computing no sólo ofrece mejores servicios de software en la nube, más baratos y más escalables y robustos para los usuarios, sino que también nos ofrece a desarrolladores muchas ventajas frente a otros modelos de programación. Por si fuera poco, para los ITPROS también hay!

      Cuándo en los modelos de despliegue tradicionales habían tenido la oportunidad de ampliar la cantidad de servidores en una solución solo cambiando un numerillo en un archivo de configuración?

      En el video que les presento a continuación, observamos cómo un ITPRO puede hacer una instalación de una aplicación en minutos y luego hacerla crecer de una manera muy sencilla.

      Con este fin creé una sencilla aplicación Web que nos informa el ID del servidor que está respondiendo. Cuando solo hay un servidor, siempre se muestra el ID 0, pero cuando hay varios, se muestra alternativamente que responde el 0, el 2, o el 1.

      Recuerdo de mis épocas de desarrollador puro, pasar hasta 5 horas tratando de actualizar un portal web asp.net en un hosting de MIA, consistente en un clúster de 6 nodos, junto con un equipo de 4 personas. Hoy eso no me tomaría más de media hora y lo podría hacer automatizadamente con un script.

      Enjoy!

       

      (Disclaimer: El video lo grabé de una teleconferencia que hice y por ende pueden encontrar ciertas deficiencias en el sonido; sin embargo lo encontré de mucho valor y quise compartirlo con ustedes; quedo atento ante cualquier duda)

    • WarNov Developer Evangelist

      Silverlight Tour – Bogotá, Colombia (27Abr – 29Abr 2010)

      • 0 Comments

      Con permiso de mi buen amigo Rodrigo Díaz  me permito referenciar un post acerca de su visita a Colombia no solo para ser speaker de nuestro gran evento presencial para desarrolladores del 26 de Abril, sino para dictar también el curso de Silverlight 4 que hace parte del internacional Silverlight Tour:

      El Curso de Silverlight: Silverlight Tour Workshop en Español regresa a la capital colombiana el próximo día 27 de Abril.  Se llevará a cabo del 27 al 29 de Abril 2010 con un horario de 08:00 a 19:00 horas los tres días.  Les recuerdo que el material y todo el curso está completamente en Español :) .

      Asimismo, tengo el gusto de informarles que como una promoción especial en conjunto con Microsoft Colombia, esta fecha en Bogotá cuenta con 50% de descuento directo sobre el precio normal en Colombia.  Además, será el primero en utilizar el material actualizado a Silverlight 4 RC anunciado y liberado oficialmente la semana pasada en el marco del evento MIX 2010 en Las Vegas.

      Si desean comprender a profundidad la platataforma de desarrollo de Silverlight, conocer el uso de Expression Blend 4 (Beta), y prepararse para la construcción de aplicativos para Windows Phone 7 esta es su mejor opción.



    • WarNov Developer Evangelist

      Alternativas para evitar abuso de los portales

      • 0 Comments
      Uno de los principales riesgos en la operación de nuestros portales es su posible abuso por parte de terceros que con el fin de hacerse a la base de datos que los alimentan, están en capacidad de ejecutar todas las consultas que a bien tengan, tanto manual como automáticamente. En este artículo me estaré enfocando en ambientes sin manejo de sesión y autorización que son los más vulnerables a este tipo de anomalías.

      Los portales son muy vulnerables a estos abusos (que no se pueden catalogar realmente como “ataques”) dado que la naturaleza del negocio implica que todas las consultas estén abiertas a todos los públicos y no con menos importancia, a los motores de búsqueda; de manera que no existen mecanismos de autenticación que impidan por ejemplo el acceso al sitio por medio de robots o programas que extraen automáticamente el contenido de nuestros sitios; además existen efectos colaterales como disminución del ancho de banda y de velocidad de proceso en los sitios.
      Existen básicamente dos tipos de acciones que podrían ayudar a mitigar este riesgo. El primer tipo comprende las acciones ejecutadas a nivel de la infraestructura de la aplicación. El segundo tipo consiste en las acciones ejecutadas a nivel de desarrollos adicionales en la aplicación como tal.

      Infraestructura
      Existen servidores de seguridad que reciben todas las peticiones de los clientes antes de que estas lleguen a la aplicación como tal. Esta herramientas se instalan al frente de los servidores web. Y ayudan a través de los siguientes mecanismos:

      Cookies
      Las cookies estarían almacenando la cantidad de requests que está haciendo cada cliente en una unidad de tiempo dada. Esto requiere sin embargo que se exija a todos los clientes el uso de cookies; hay que tener en cuenta sin embargo, que existen muchos usuarios que desactivan estas cookies en sus browsers.

      Javascript
      El uso de javascript permite generar rutinas que los robots no podrían seguir, de manera que el acceso quedaría restringido a estos entes automatizados. La gran contra que tiene este enfoque, es que puede requerir procesos de considerable costo en el servidor. Además que se le estaría restringiendo el uso también a motores de búsqueda como google que usan robots para obtener información de los sitios.


      Aplicación
      A nivel de aplicación el conjunto de acciones posibles es más diverso. Se trata de rutinas destinadas a detectar accesos irregulares a la aplicación. Estas pueden ser provistas como productos terminados ya hechas por terceros, o como desarrollos nuevos dentro de la aplicación.

      Delay
      Existen herramientas como ISTools de Peter Blum, que basadas en un patrón de IP (esto puede ser contraproducente en el caso de que las ips reales estén siendo reemplazadas por las ips de los ISP) detectan los accesos irregulares y generan retardos en las respuestas, advertencias y finalmente denegación del servicio a los supuestos atacantes. Un caso favorable es que en algunas ocasiones los ISP mantienen la ip de sus clientes y la reenvían como una variable HTTP que puede ser consultada. Pero esto no ocurre siempre.

      Javascript y Cookies
      Ambos mecanismos funcionan con desarrollos de productos de igual forma a la que fue descrita en el apartado de infraestructura.

      Listado de Robots
      Herramientas de terceros permiten consultar un IP dada y verificar si ha sido tildada como un robot para en ese caso tomar acciones al respecto.

      Cómo obtener la solución al problema
      Para generar una solución se han de tener en cuenta los siguientes puntos:
      1. Hoy en día no hay una solución ad-hoc que abarque todo el problema sobretodo sin efectos colaterales.
      2. Para generar una solución es muy necesario comenzar por definir unas políticas de detección de abuso que permitan establecer los parámetros para las herramientas que se usaran/construirán
      3. Los mayores problemas se presentan cuando no es posible obligar la autenticación en los portales luego no hay manejo de sesión
      4. Existen ISPs que direccionan los requerimientos con una IP única
      5. Existen usuarios que no permiten el uso de cookies en sus máquinas
      Teniendo en cuenta lo anterior, se puede sugerir implementar una solución compuesta tal como se describe a continuación:

      1. Definir la política de uso abusivo (Esto implica declarar cuándo se considera que se está extrayendo información del sitio de manera inescrupulosa; por ejemplo, que un mismo usuario visite más de 50 páginas de resultados de una misma búsqueda, o que realice más de 20 búsquedas distintas en un determinado lapso de tiempo)
      2. Definir las acciones a tomar luego de la violación de la política. (Redireccionar a un captcha, denegar el servicio, retardar el servicio, etc.)
      3. Proveer un mecanismo que permita avisar acerca de la violación de la política de acceso. Dependiendo de lo elaborado de la política, esto puede ser ejecutado desde la infraestructura o de la aplicación. Una política sencilla como solo contar el número de requests de una ip dada se puede implementar en la infraestructura. Una política algo más completa como la descrita como ejemplo en el numeral 1, requiere de un a implementación en el lado de la aplicación.
      4. Implementar e integrar los puntos anteriores de manera que cuando el mecanismo de advertencia avise acerca de un posible abuso de acuerdo a las políticas definidas, se tomen las acciones pertinentes.

      Recomendaciones acerca de la política de abuso


      Un acceso abusivo siempre puede ser detectado cuando desde una misma IP son hechos muchos requests. Pero esto mismo puede suceder con el caso de los ISP que tienen una sola ip de salida. Para evitar tachar incorrectamente a los ISP es necesario verificar el tipo de requests que se están haciendo desde una ip sospechosa. En general las consultas sobre los sitios no abarcan más de 10 páginas de resultados de un mismo tema. También de acuerdo a las estadísticas se puede establecer un límite para distintas búsquedas en un tiempo dado por una ip dada; por ejemplo más de 100 búsquedas distintas en 10 minutos indicarían un comportamiento malicioso.

      Entonces ante una violación a la política establecida anteriormente se garantizaría que no se cae en el falso positivo del ISP así que ante este comportamiento sospechoso se podría iniciar con buscar la IP en una base de datos provista por un tercero en la que están registrados los robots en la actualidad. Si este filtro pasa, se continúa con la verificación de si se trata de un robot autorizado como el de google o yahoo; esto se logra a través de un DNS lookup reverso. Aquí entonces si no pasa la validación, se procederá con la acción correctiva.

      Como inconveniente a esta solución, se cita la complejidad de su desarrollo, ya que requiere hacerse del lado de la aplicación que al no tener manejo de sesión, requeriría una implementación con almacenamiento en base de datos por ejemplo.
    • WarNov Developer Evangelist

      ExtraSmall Instances de Windows Azure disponibles en Beta para todo el público

      • 0 Comments

      En el PDC10 de octubre pasado, se anunció un programa de beta privada para la instancia ExtraSmall de Windows Azure. Esta instancia más pequeña proporciona a los desarrolladores un entorno de formación y desarrollo rentable.

      image

      También, los desarrolladores pueden utilizar la instancia ExtraSmall para prototipos de soluciones de nube a un menor costo. Para ver una comparación de precios y recursos de tamaños de instancia, haga clic aquí.

      Esto significa por ejemplo que podemos hacer un piloto con un web y un worker role ambos (ExtraSmall: $0.05 x 2 = USD$0.1 la hora) en la nube a un costo aún menor que tener una instancia pequeña (small) con solo alguno de estos dos roles (USD$0.12).

      Desde entonces, hemos visto mucho interés en esta instancia por lo que me complace anunciar que todos los clientes ahora pueden utilizar la versión beta ExtraSmall de Windows Azure. Para obtener información sobre cómo configurar la aplicación para comenzar a utilizar instancias ExtraSmall en Windows Azure, consulte este artículo de MSDN Library.

      Para finalizar es muy importante tener en cuenta que las horas de las instancias Extra Small no se cuentan dentro de las ofertas Introductory Special, MSDN Premium o Development Accelerator en cuyo caso, el consumo se facturará aparte de dichas ofertas.

    • WarNov Developer Evangelist

      Del KeyNote de Windows Phone 7 en MIX 10 al MIX 11

      • 0 Comments
      Hace poco más de un año se mostraba al mundo el Windows Phone 7 a través del MIX. Principal evento de Microsoft para desarrolladores y diseñadores. Llevado a cabo en Las Vegas. La siguiente edición será la segunda semana de abril. Detalles aquí.
      Debido al auge que estamos teniendo con nuestro teléfono y a la cercanía de la siguiente edición del evento donde esta vez será protagonista Windows Phone 7, me he permitido volverles a traer este post del año pasado, donde se explica muchas de las ventajas de Windows Phone 7 y se ven como los planes trazados se han llevado a cabo según lo trazado.
      Welcome to mix

      Este gran poster nos espero en el gigantesco Mandalay Bay en Las Vegas. Ciudad en la que cada año se congregan cientos y cientos de diseñadores y desarrolladores de todo el mundo para apreciar los últimos avances tecnológicos para mejorar la experiencia de usuario (UI) en los desarrollos de software.

      El keynote del primer día, estuvo nada menos que genial! Dirigido por el Vicepresidente Corporativo Scott Guthrie:

      WarNov y Scott Guthrie

      Con sus colaboradores mas cercanos, nos mostró a los asistentes un overview de la cantidad de tecnologías emergentes disponibles y en el día de hoy se hizo un alto enfoque en todo lo relacionado a Windows Phone 7 Series.

       

      Un Teléfono Amigable

      IMG_7907

      Y quien mejor para hablarnos de Windows Phone 7 que el señor Joe Belfiore. VP de Windows Phone 7!

      Para comenzar, se mostro como WP7 nace del concepto de usabilidad que se tiene con el Zune. El reproductor de multimedia de Microsoft, que desafortunadamente no es muy conocido en Colombia, y que realmente ofrece al usuario una experiencia bastante agradable.

      Es así, como ya no tenemos el Windows en “miniatura” que solíamos encontrar hasta Windows Mobile 6.5; y donde era muy complicado hasta el mero hecho de abrir el menú inicio. (Tocaba tener puntería)

      Hoy en día con WP7 el acceso a todos los comandos es bastante sencillo gracias a los Tiles que permiten con el dedo desplazarnos entre los aplicativos. (Adiós perdedizo Stylus!!!)

      Es un teléfono realmente amigable y fácil de usar. Enfocado claramente al manejo de redes sociales y reproducción multimedia.

      Un teléfono que se programa con Visual Studio .Net.

      IMG_7908 IMG_7909

      En este apartado, el señor Guthrie nos mostro como en cosa de 5 minutos escribía el “segundo cliente oficial” de Twitter para WP7. Solo escogiendo el tipo de proyecto para WP7 en Visual Studio 2010 ya tuvo un lienzo listo para trabajar y arrastrar un par de botones y luego usar la clase de WebClient para comunicarse con Twitter.

      Cómo obtenemos este tipo de proyecto en nuestro Visual Studio?

      Windows Phone 7 Series es un sorprendente sistema operativo para teléfonos móviles dada su innovadora interfaz de usuario y funcionalidad, así como la grandiosa plataforma de desarrollo sobre la cual nosotros como desarrolladores podemos construir rápidamente juegos y aplicaciones. Se vendrá toda una avalancha de dispositivos corriendo Windows Phone 7 Series (WP7). Y esto junto con la plataforma de desarrollo y el "Marketplace" hará que la demanda de WP7 de los consumidores sea muy alta, así que nosotros como desarrolladores podremos adoptar rápidamente la plataforma de WP7 para capitalizar este crecimiento.

      Para lograrlo, en el MIX10 se anunció la liberación del Windows Phone 7 Training Kit for Developers que incluye todas las librerías para programarlo de una manera similar a como programamos aplicaciones similar, un emulador del teléfono y muchas otras herramientas!Este kit de capacitación les permitirá entrar en el nuevo mundo de WP7 por que le proporciona una explicación paso a paso de las herramientas a utilizar y algunos conceptos clave para la programación en esta plataforma! La información completa la encuentran aquí: http://developer.windowsphone.com/

      Un teléfono que tiene de todo!

      Ya muchas empresas han emprendido el viaje hacia el mundo de la nueva plataforma WP7. Por ejemplo Netflix el gran proveedor de alquiler y streaming de películas. Se creó esta aplicación que corre en WP7 y que nos permite entre otras cosas buscar títulos, ver los títulos recomendados, solicitar las películas a domicilio, y por si fuera poco, verlas en streaming directamente en nuestro teléfono gracias a las poderosas capacidades de reproducción de video de WP7 usando Silverlight 4 y OpenData operado desde Windows Azure

      IMG_7915

      Además se nos mostraron grandiosos juegos creados usando XNA! De manera que el mismo código de programación solo con unas pequeñas modificaciones fue usado para crear las versiones para PC y XBOX! One XNA!!!

      IMG_7904

      IMG_7946 IMG_7945

      Otra aplicación genial que vimos fue un reproductor de Comics:

      IMG_7918 IMG_7920 IMG_7922

      Vemos como nos permite ver toda nuestra colección de Comics, y para cada uno de ellos, leerlo como si fuera una revista normal o hacer acercamientos para ver mejor el arte del dibujo. Como si fuera poco, también se integra con Web 2.0, ya que permite comentar apartes de los Comics y publicar dichos comentarios en las redes sociales!

      Y hablando de redes sociales, me pareció de lujo la aplicación Foursquare que integra nativamente en el WP7 la información de todos nuestros contactos en todas las redes sociales en un solo aplicativo sencillo, fácil de usar y muy llamativo:

      IMG_7924 IMG_7927

      Permite ubicar a nuestros contactos (que tengan GPS) usando Bing Maps. Además permite la creación de eventos y los asistentes entonces tienen una guía basada en mapas para llegar al sitio de encuentro! Todo en WP7 gracias a SL, y programado con VS2010 y Blend 4. Osom!!!

      Otros aplicativos que vi bastante interesantes:

      • Shazam: Para poner al teléfono a oír una canción mientras descifra qué temas es y demás, usando bases de datos musicales online. De hecho, si hay una versión libre dela canción, nos permite descargarla o comprarla.
      • MLS: Un aplicativo que aprovecha tecnología de Message Push, que permite enviar información a aplicaciones WP7 aún cuando estas no estén corriendo actualmente en el teléfono. En este caso, información de los partidos de futbol era enviada al aplicativo y cuando el usuario abría dicha aplicación, encontraba ya toda la información actualizada.
      • Marionette: Trae ciertos “muñecos” personalizables a los que se les puede poner rostros de contactos y manipular como marionetas gracias al brillante manejo del Acelerómetro.
      • Loic Le Meur, gestor de seesmic nos enseñó la última versión de su cliente de twitter creado totalmente en WPF que ahora como novedad, permite a las empresas y personas, crear sus propios News Feed personalizados!! Pero para completar, nos mostró su brillante versión para WP7. Sencillamente genial…

      Para finalizar, nos sorprendieron con un aplicativo en WP7 que controlaba un robot cañón de camisetas real con el cual dispararon varias camisetas hacia la audiencia que luchó por ellas. Todo el manejo se hacía no solo con los botones del teléfono y el TouchScreen sino también con el acelerómetro:

      IMG_7936 IMG_7939 IMG_7976

      Todo esto fue desarrollado usando herramientas que afortunadamente tenemos disponibles desde AHORA!!!

       IMG_7950

      Las versiones Beta de Blend se pueden bajar de:
       http://expression.microsoft.com/en-us/cc507094.aspx  --> Ya estamos en 2011 y todas las herramientas de producción las encuentran al final de este post

      Fue un gran KeyNote que nos dejó muy motivados para el resto de temas a tratar en el MIX. Hoy segundo día hemos visto que aún cuando fue tan impactante se quedó corto con todo el mundo de temas que se liberan en este año. Sigan conectados para más noticias y reviews!!

       

      Estaré cubriendo para ustedes el MIX11 con información adaptada para nuestro entorno y en español. Síganme en twitter

    • WarNov Developer Evangelist

      Modificando los Settings de una aplicación Windows desde el código

      • 0 Comments

      En ocasiones es necesario ajustar la configuración de una app. por ejemplo, configurar cuál va a ser el directorio de trabajo, o qué colores quiere el usuario para la interfaz, etc.

      Las aplicaciones .net tienen un archivo llamado app.config (o web.config en el caso de las aplicaciones web), que puede contener estas configuraciones.

      Por lo general esas configuraciones se hacen a mano en el caso de las aplicaciones web. Pero en ocasiones es necesario que estas configuraciones se modifiquen desde el mismo código.

      System.Configuration contiene todas las herramientas para lograrlo, pero es una API que tiene muchísimas funcionalidades para manejar la configuración de las aplicaciones. Por eso puede resultar fácil perderse tratando solo de hacer unas sencillas manipulaciones en el archivo de settings.

      Aquí muestro de una forma sencilla cómo buscar un valor de llave de configuración de una aplicación Windows. Si no existe, cómo agregarlo y luego cómo modificarlo.

          //Objeto de configuración
          var config=ConfigurationManager
      .OpenExeConfiguration(ConfigurationUserLevel.None); //Búsqueda de un setting en particular var pathSettings = config.AppSettings.Settings["MusicPath"]; //Si está en nulo, es porque no se encuentra.
      //Entonces lo agregamos
      if (pathSettings == null) config.AppSettings.Settings
      .Add("MusicPath",ci.MusicPath); //Si no, ya está agregado, entonces lo modificamos else pathSettings.Value = newValue; //Grabamos la configuración en disco de nuevo. config.Save();

       

      Es necesario operar de esta manera, dado que intentar por ejemplo config.AppSettings.Settings["MusicPath"]=newValue; no es legal de acuerdo a la accesibilidad que se le ha dado a este indexador.

    • WarNov Developer Evangelist

      Métodos Parciales (Partial Methods)

      • 0 Comments

      Una gran adición del Framework 2.0 en cuanto a codificación, fueron las clases parciales. Surgieron como una excelente solución sobretodo para los generadores automáticos de código, pues anteriormente cuando no habían clases parciales y uno trabajaba sobre una clase generada por alguna herramienta, el trabajo ejecutado se perdía cada vez que se regeneraba dicha clase.

      Gracias a las clases parciales entonces, uno podía generar un archivo "paralelo" que hacía referencia a la misma clase, pero que no se veía afectado en las regeneraciones automatizadas. Todo esto con la gran ventaja de que a pesar de que estuvieran en archivos distintos, la clase aparecían al resto del mundo como una sola (intellisense, compilación, etc).

      Otro uso interesante, es la posibilidad de dividir grandes clases en unidades con funcionalidades comunes, para obtener una mayor administrabilidad de las mismas y para permitir que varios desarrolladores estuviesen trabajando sobre una misma clase (en las versiones parciales en archivos distintos)  al mismo tiempo.

      Ya para el Framework 3.5 se incluyeron los métodos parciales que van un paso más allá con este concepto.

      La idea es que en una clase parcial se incluye la firma del método (tiene que ser privado y con tipo de retorno void) y en otra clase se "implementa". Lo pongo entre comillas, porque implementar me lleva a pensar en una interfaz, donde obligatoriamente se tiene que implementar los métodos establecidos por ella. Con los métodos parciales no existe esa OBLIGACION. El desarrollador decide si quiere "implementar" o no los métodos parciales que define la clase parcial.

      Para saber qué metodos parciales incluye una clase, basta con recurrir al intellisense y escribir "partial" y dar espacio; inmediatamente saldrán todos los métodos parciales disponibles.

      Esto resulta muy últil también en el proceso de personalización de código generado automáticamente, tal como pasa con la generación del modelo de datos que ofrece el Entity Framework. Las clases generadas por este framework, agregan métodos parciales para que se puedan controlar los cambios a los atributos en las clases generadas. Entonces si el desarrollador quiere establecer un control granular sobre estos cambios, implementa los métodos parciales en sus clases parciales externas.

      Qué ventajas ofrece esta metodología comparada con una de Interfaces?

      Si se fuera a autogenerar código con una herramienta como el Entity Framework, basado en una interfaz o en una clase base (con métodos virtuales o abstractos), obviamente la implementación de los métodos dictados por la interfaz quedarían en el código autogenerado o se haría muy complicado el proceso de escoger el archivo donde se quiere generar estos métodos y si se quieren generar o no pues tal vez ya han sido modificados.

      Además hay otra ventaja y es que cuando los métodos parciales no son implementados, entonces ni sus firmas ni sus llamados se incluyen en la compilación del código, lo que hace el proceso de compilación y el resultado de la misma, mucho más liviano que cuando se usan interfaces, o cuando se crean métodos virtuales o abstractos.

      En conclusión, vemos como muchas de las innovaciones del Framework .NET tienden a hacer más práctica la programación, sin perder el formalismo que lo ha caracterizado a través de su historia. La aparición de métodos parciales son una buena noticia y entender muy bien su uso nos permitirá desarrollar excelentes piezas de  código con muy poco esfuerzo.

      Pueden encontrar información de referencia aquí.

       

    • WarNov Developer Evangelist

      WP7: Agentes en Background

      • 0 Comments

      Como su nombre lo indica, nos van a permitir ejecutar trabajos en Segundo plano, aún cuando la aplicación no esté activa.

      OJO: No están disponibles para los aparatos que solo tienen 256Mb de memoria.

      Tipos de Tareas:

      Periódicas

      Corren en un pequeño intervalo y recurrentemente. Por ejemplo para informar la locación del dispositivo y ejecutar sincronizaciones de poco tamaño.

      Intensivas

      (En Recursos) Largos períodos de ejecución cuando el teléfono cumple ciertas características de uso (actividad de cpu, fuente de poder, tipo de red. Útil para sincronizar grandes cantidades de datos al teléfono cuando no está siendo usado.

      Una app solo puede tener un agente de estos, que puede ejecutar ambos tipos de tareas.

      Restricciones:

      Existen unas apis que no se pueden usar dentro de las tareas que ejecutan los agentes: Cámara, vibración, radio, sensores, notificaciones, XNA, y otras que encuentran aquí.

      La geolocalización está disponible de manera restringida, ya que no reporta la ubicación real, sino que hace un cache cada 15 minutos, sin embargo, acciones como las que usan los HttpWebRequests desde los agentes sí se pueden hacer sin problema.

      Los agentes no pueden usar más de 6MB, excepto cuando manejan audio, en cuyo caso tienen hasta 15Mb. Cuando se exceden estos límites, la tarea se apaga de inmediato. Cuando cualquier tarea es apagada dos veces debido a un alto empleo de la memoria, dicha tarea es removida del agendamiento de tareas del teléfono. Es útil recordar que estos límites no aplican en modo debug, por lo que es necesario emplear el API ApplicationMemoryUsageLimit para verificar cuánto está empleando la tarea en tiempo de depuración.

      Los agendamientos de las tareas no se pueden hacer por un tiempo mayor a dos semanas. Para poder reagendar, la app tienen que ejecutarse en primer plano.

      Cuando se tienen agentes periódicos, lo normal es que corran mínimo cada 30 minutos. Este tiempo puede desfasarse hasta en 10 minutos, debido a otras tareas que están en segundo plano. La ejecución no debe ser mayor a 25 segundos.

      WP7 tiene un modo de operación llamado Battery Saver: Este modo que solo se puede habilitar por el usuario, podría impedir que los agentes periódicos se ejecuten.

      WP7 tiene una restricción acerca de la cantidad de agentes que pueden estar corriendo en un dispositivo dado y esta puede ser tan pequeña como 6. Antes de este límite, WP7 puede lanzar mensajes al usuario que indiquen que la cantidad de agentes está subiendo mucho y puede que la batería se agote más rápido. Si el límite ya se ha cumplido, cuando la app trata de agregar una nueva tarea, habrá una excepción de tipo InvalidOperationException que debería ser manejada para que la app no se estrelle por este motivo.

      Hay documentación de buenas prácticas que pueden encontrar aquí. En el caso de los agentes intensivos, estos pueden durar ejecutándose hasta 10 minutos. No pueden correr a menos que el dispositivo tenga más de 90% de batería, la pantalla esté bloqueada, no exista una llamada activa, esté conectado a una fuente de poder externa y a datos en una red distinta a la red celular. Si una tarea intensiva comienza a ejecutarse y por algún motivo alguna de las condiciones anteriores deja de cumplirse, de inmediato la tarea es terminada.

      Es bueno tener en cuenta que estas tareas intensivas pueden llegar a no ejecutarse nunca, debido a la gran cantidad de condiciones impuestas. Por ejemplo si el usuario no tiene WiFi en ningún lado, la tarea nunca se ejecutará.

      En mi sitio de preguntas y respuestas he respondido algunas preguntas acerca de los agentes en background:

      1. Hay alguna forma de manejar con código en wp7 que un agente sea suspendido porque hay bajos recursos de memoria o de batería?

      2. En wp7, se pueden concatenar varios agentes periódicos para lograr tener reportes cada 2 minutos en vez de cada 30?

      3. Es posible evitar a través de código que un usuario de WP7 apague los agentes de ejecución en background?


      Bien; ya que vimos las generalidades, si quieres incluir Background Agents en tu app, sigue este link, donde nos enseñan cómo implementarlos.

    • WarNov Developer Evangelist

      Windows Azure: Migrando desde V1.2 a la V1.3 de Noviembre

      • 0 Comments

      Fácilmente podría decir que esta actualización es la más drástica de todas las ocurridas a Windows Azure desde su lanzamiento. Si no la más drástica, es la que más novedades nos ha traído en una sola entrega.


      Coincidiendo con el PDC10 ocurrido en el campus de Microsoft Corporation en Octubre de este año, numerosos anuncios se hicieron públicos acerca de nuestra plataforma de cloud.


      La aparición de un nuevo rol: El VM Role que le da el sabor de IaaS a Windows Azure, los permisos elevados para los roles, el acceso full para IIS, el nuevo tamaño de máquina XSmall, la evoluación del AppFabric, la puesta en producción del Data Marketplace (antes Dallas) , el advenimiento de un Windows Azure Marketplace, mejoras para SQL Azure como Reporting Services, etc.


      Todo lo anterior sumado al proceso lógico de evolución del código, conllevó a algunos cambios también en las librerías del SDK. Y precisamente de esto estaremos hablando en este artículo.


      Si ud. había venido trabajando con la versión 1.2 de los tools de Windows Azure, lo único que tiene que hacer es desinstalarlos e instalar la versión 1.3. Tenga en cuenta que si instala la 1.3 sobre la 1.2 sin haberla desinstalado manualmente, la anterior no se desinstalará y el sistema no funcionará correctamente.

      Cuáles son las principales diferencias?

      En esencia las de más impacto son dos: 1. La inclusión de manejo de FULL IIS. 2. Cambios en el API de acceso al storage (StorageClient.dll).


      Así que ya instalamos y tenemos andando correctamente la versión 1.3 tanto del SDK como de los tools. En ese caso apenas tomamos una solución 1.2, aparece un asistente de migración de nuestro proyecto.


      Qué cosas hace? Básicamente cambia la versión de producto en el .csproj del proyecto cloud a 1.3.0.0 y agrega la sección de Sites al archivo de configuración de los web roles para indicar que se usará la característica de Full IIS. Esos son los cambios.
      Qué puede fallar?


      Primero puede que obtenga esta excepción: “Could not load file or assembly 'Microsoft.WindowsAzure.StorageClient, Version=1.0.0.0“ . Solución en este post.


      Lo otro que puede pasar, es que obtengamos la excepción: “SetConfigurationSettingPublisher needs to be called before FromConfigurationSetting can be used”; para ver detalles de este error y cómo solucionarlo vea este post.

    • WarNov Developer Evangelist

      Windows Apps: Para qué países debería publicarlas?

      • 2 Comments

      El Windows Store y el Windows Phone Store, nos permiten escoger los países en los que nuestras apps estarán disponibles. Podemos escoger uno o varios. Esta segmentación de países existe porque a veces queremos que nuestras apps estén en un solo país o en determinados países y además porque las leyes y costumbres de diversos países pueden provocar que el contenido de ciertas apps sea inaceptable.

      Esto nos lleva a que en general, cuando publicamos nuestra app, escojamos solo publicarla para el país objetivo, que la mayoría de las veces es el país del Desarrollo. Por decir algo, un desarrollador Colombiano, escoge publicar su app en Colombia únicamente.

      Esto no está mal, pero podría estar mejor… por qué?

      La mayoría de las apps están creadas en EEUU. Y los desarrolladores de allí, las han puesto solo disponibles para ese país. De manera que usuarios del resto del mundo que tengan configurado su store para sus países de origen (con un procedimiento como el descrito aquí), no las podrán ver. Es así como varios usuarios optarán por cambiar la región de su store a EEUU y de esa manera poder acceder a esas apps. Esto implica obviamente, que dejarán de ver las apps que solo estén creadas para el país de origen y no estén validadas para estar en EEUU.

      Entonces es aquí donde debemos tener en cuenta que si queremos que esos usuarios también encuentren nuestras apps, deberemos publicar nuestra app en EEUU también, aparte de haber seleccionado también nuestro país de origen. De esta manera aseguramos que tanto usuarios que tengan sus máquinas configuradas con nuestro país de origen, como aquellos que la hayan cambiado a EEUU, puedan encontrar la app.

      mapapp

      Desventajas? Ninguna. Podría pensarse que al poner la app en EEUU tendríamos crear una versión en Inglés para la misma. Pero este no es el caso. Podemos poner apps en cualquier idioma sobre cualquier país.

      En conclusión, si quieres que tus apps sean más visibles, aparte de ponerlas disponibles para los países target, piensa la posibilidad de ponerla disponible también para EEUU.

    • WarNov Developer Evangelist

      SQL Azure BACPAC - DB BACKUP en la nube (Nuevo Portal)

      • 0 Comments

      El formato de archivo BACPAC, se refiere a un nuevo tipo de archivo que contiene tanto el esquema, como los datos de una base de datos.

      En el Nuevo portal de Administración Windows Azure, en la sección de Bases de Datos, existe una opción para exportar una db existente, lo que nos produce un archive BACPAC que es almacenado en una de nuestras cuentas de almacenamiento de Azure. Además cuando se va a crear una nueva DB, se da la opción de importarla desde un BACPAC existente.

       

      Por ejemplo para exporter, nos ubicamos sobre la db a exporter y le damos click o tap a Export, lo que nos muestra el siguiente cuadro de diálogo:


      newbacpac


      Esta operación requiere una cuenta de almacenamiento de Windows Azure para guardar esa copia BACPAC en el blob storage. En este caso, debemos especificar los datos de la cuenta y el container dentro de esa cuenta donde va a quedar la copia BACPAC.

      Luego de especificar la cuenta, comienza a generarse la copia. Este es un proceso asíncrono, cuyo estado se puede consultar entrando a la sección de mensajes del portal:

      image

          

      Una vez creada la copia, podemos importer a través del botón que tiene ese nombre en la sección de Databases del portal, o a través de las opciones de crear una nueva DB:

      newimport1

      Luego de esto específicamos la ruta dentro del almacenamiento de Azure  donde dejamos el bacpac.

      newimport2


      newimport3

      Luego de esto, comienza la importación de la DB

      Lo mejor: Estas operaciones son susceptibles a ser automatizadas gracias al API de REST para acceder a los servicios de BACPAC; de esta forma, podemos programar los backups de nuestras DBs, y estos quedarán almacenados en el blob storage de Azure, que vale un centavo de dólar la giga al mes.

    • WarNov Developer Evangelist

      Debugging de Windows Phone Apps con Fiddler

      • 0 Comments

      Para quienes no lo conocen, Fiddler es un impresionante aplicativo gratuito creado por un colega de Microsoft: Eric Lawrence. Es usado básicamente para capturar tráfico HTTP y si lo deseas, modificarlo. Sin embargo, posee decenas de utilidades más relacionadas con el tráfico HTTP; esto es útil para hacer depuración de aplicaciones que se conectan a servicios web, o aplicaciones web como tal.

      He encontrado supremamente útil por ejemplo, usar Fiddler para hacer depuración de un par de Apps que estaba construyendo y que consumían servicios de Windows Azure, pues Fiddler se puede configurar también para que escuche las transmisiones HTTP originadas por el emulador de Windows Phone. De esta manera, puedo ver claramente cuáles son los requests que está haciendo mi app, y qué es lo que se está retornando desde la Web. Por ejemplo aquí pude ver que el servicio de Windows Azure al que estaba accediendo la app ya no existía:

      image


      Para configurar Fiddler para el emulador de Windows Phone, has de tener la última versión y luego configurarle de esta manera:


      1. Tools->Fiddler Options
      2. Connections tab -> Allow remote computers to connect -> OK
      3. Escribir este comando en la caja de QuickExec (Cuadro de texto en la esquina inferior izquierda de Fiddler):
      prefs set fiddler.network.proxy.registrationhostname NOMBREDETUMAQUINA
      4. Cerrar y reiniciar Fiddler
      5. Reinicia el emulador y ya podrás hacer análisis de las comunicaciones HTTP que se originan desde el mismo Smile

    • WarNov Developer Evangelist

      Windows 8: Su primer semestre

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

           

       
      Otras cifras que hemos alcanzado en estos 6 meses:  

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

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

      • WarNov Developer Evangelist

        WinRT: Live Tiles con Background Tasks

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

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

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

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

        image

         

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

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

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

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

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

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

        Enjoy!



      • WarNov Developer Evangelist

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

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

        image

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

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

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

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

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

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

      • WarNov Developer Evangelist

        TaskCleaner: Velocidad en su sesión (Improving Windows Performance)

        • 0 Comments

        Supongo que como yo, en ocasiones han sentido la necesidad de que su computador corriera como si estuviese recién formateado.

        Hay muchos trucos y tips por ahí para incrementar el performance. Unos sencillos y otros tan complejos como comprar e instalar un arreglo de discos.

        Mi solución se basa en aquella que nos recomienda entrar al archivo de configuración de carga de servicios al inicio de Windows. Pero siendo este un mecanismo muy intrusivo que provoca incluso luego mensajes molestos, también tiene la desventaja de que SIEMPRE estará desactivando esos procesos y puede que eso no sea lo que queramos.

        Mi acercamiento se basa en tener unos archivos que tengan los procesos que uno no quiera ejecutándose y un programa que revisa el archivo deseado y elimina todos los procesos que estén en ejecución. Así pues, sólo se desactivaran los procesos que uno quiera cuando quiera y sin tener que ir a eliminarlos uno por uno en el task manager. Su nombre, TaskCleaner:

        Clean (2)

        La clave del algoritmo está en dos sencillas líneas que usan unos simples mecanismos que nos provee el Framework.net:

        Process[] processes = Process.GetProcessesByName(processName.Trim());
        y
        process.Kill();

        accedemos a este código a través de la inclusión:

        using System.Diagnostics;

        La idea general de mi aplicación entonces es cargar el archivo deseado, convertir su contenido en un arreglo de string donde cada entrada es el nombre (sin extensión) de uno de los procesos a eliminar (por ejemplo msnmsgr). Luego iterando sobre ese arreglo, se “matan” todas las instancias de ese proceso dado y así vamos liberando recursos de la máquina.

        Al final el aplicativo nos suministra un reporte en el que nos indica qué procesos fueron eliminados correctamente, cuáles no se dejaron eliminar (procesos de sistema por ejemplo) y cuáles no se encontraron (pues puede que la lista que hayamos hecho tenga procesos que actualmente no están en ejecución).

        He de decir que el desarrollo fue muy sencillo sobretodo gracias a LINQ que me permitió obviamente y sin problemas hacer consulta sobre el estado de los procesos. Además un claro manejo de excepciones, me permitió determinar cuando se pudieron eliminar los procesos y cuando no.

        Para que la aplicación pueda eliminar todos los procesos que tengamos en nuestro archivo, es necesario ejecutarla con privilegios de administrador; de lo contrario puede que un par de procesos no se deje desactivar. Sin embargo esto no rompe el aplicativo, sino que sencillamente se reporta en el log.

        Cómo crear el archivo de procesos no deseados?

        Es muy sencillo. Solo basta inspeccionar el TaskManager y de allí tomamos el nombre de los procesos que no queremos:

        image

        Eso sí, teniendo en cuenta NO incluir las extensiones, pues el framework busca sin extensión. Entonces en este ejemplo, sencillamente prepararíamos un archivo con el siguiente contenido:

        • babylon
        • flashutil10e
        • orbitnet
        • tweetdeck

        Y ese sería el que cargaríamos con nuestro aplicativo:

        image

        Acto seguido, damos click en “Kill Processes” y voilà!

        Este aplicativo es OpenSource y lo pueden encontrar en http://taskcleaner.codeplex.com



      Page 12 of 14 (334 items) «1011121314