MSDN Blogs
  • WarNov Developer Evangelist

    Múltiples Líneas en los Textblock de Windows Phone 7

    • 2 Comments

    Nivel: Básico: 100.

    También surgido de otra pregunta que me hicieron en http://formspring.me/warnov, aquí una corta explicación de cómo funcionan los Texblock multilínea en WP7.

    Básicamente la duda de este developer, era cómo hacía para generar un Textblock (Texto no editable que aparece como nativo en la interfaz) que presentara varios párrafos.

    Lo primero que debemos garantizar, es que el TextBlock haga autoajuste de línea de acuerdo al ancho que tenga en determinado momento. Para esto ajustamos la propiedad de “ TextWrapping” en Wrap. Luego, existen varios métodos para agregar el texto que viene en párrafos.

    El primero, es aprovechando la mayor flexibilidad que nos da el editor XAML para asignar textos. Como ven, sencillamente podríamos traer nuestros párrafos tal y como están por ejemplo en Word o notepad y asignarlos al control:

    image

    Como ven es un sencillo copy paste o escribir las líneas y darles el salto de línea donde sea pertinente.

    Este copy paste también se puede ejecutar en el cuadro de propiedades:

    image

    Sin embargo si queremos escribir las líneas, observaremos que para darles un salto de línea el Enter no funciona. Sencillamente usamos Shift+Enter y listo. Tendremos nuestro salto de línea. Y el resultado es el esperado:

    image

    Obviamente, este tipo de ajuste de contenido no es posible en tiempo de ejecución, ya que no podremos copiar/pegar de ningún lado, sino indicar con una variable el contenido. Esta variable es fácil de armar con el carácter especial de cambio de línea \n:

    txbInstructions.Text = "primera larga línea \n segunda \n tercera";

    Esto nos da:

    clip_image008

    Y qué pasa si el texto está en un archivo de recursos?

    En un mercado de aplicaciones como el de Windows Phone 7, es muy importante ofrecer la capacidad de multilenguaje de nuestras aplicaciones, así que es muy frecuente que nos encontremos con la necesidad de crear un archivo de recursos distinto para cada lenguaje a usar. En estos casos, cada archivo tiene los textos a usar. Entonces cómo poner valores multilínea en los archivos de recursos?

    Allí también podemos copiar y pegar de otra fuente. Igual funciona el mecanismo de Shift+Enter para ingresar un salto de línea.

    image 

  • WarNov Developer Evangelist

    Replicando una aplicación tradicional a Windows Azure I: Base de Datos

    • 0 Comments

    ABSTRACT

    Esta es una serie de post en la que exploraremos las condiciones que deben tener las aplicaciones web para poderse ejecutar desde Windows Azure, bien sea porque se requiere hacer una migración, o porque se quiere tener las dos versiones (hosting tradicional y cloud computing) para una aplicación dada. Este es el post 1/3 y mira los aspectos esenciales a tener en cuenta en lo referido a bases de datos. Los siguientes dos hablarán de la capa de negocios, y de la interfaz gráfica como tal.1

    Nivel: 100-200 Básico

    El rango de opciones para tener una aplicación que se comporte igual de bien tanto en Windows Azure como en servidores tradicionales, depende mucho del tipo de aplicación que se tenga. En esta serie de posts, estaré tratando únicamente aplicaciones web (también en Azure se pueden desplegar servicios destinados a ser consumidos por clientes inteligentes, móviles, a través de TCP, etc).

    Las aplicaciones Web estándar, generalmente tienen la siguiente distribución: Una base de datos (Sql Server, Oracle, etc), una capa de acceso a datos (Entity Framework,LINQ2SQL, ADO.NET, Hibernate, etc) , una capa de negocio (uno o varios proyectos de tipo Class Library) y una capa de presentación conformada por WebForms.

    En este post específico, estaremos observando qué pasa primero con la base de datos:

    Base de datos

    SQL Server

    Si la base de datos viene siendo SQL Server o alguna de sus variantes (Como SQL Compact, SQL Express, etc), nos encontraremos con el caso más sencillo a desplegar en Windows Azure, donde como saben el acceso es casi transparente para las aplicaciones que usan estas variaciones.

    Los temas que deberíamos tener en cuenta en este caso serían sobretodo aquellos que tienen que ver con escenarios muy específicos como:

    1. Consultas distribuidas (no son soportadas)

    2. Tamaño máximo por Base de datos de 150GB

    3. El escenario actual de SQL Azure está completamente enfocado a almacenamiento transaccional y reportería. No tenemos aún servidores de integración ni BI en SQL Azure. Solo OLAP y Reporting. Sin embargo esto no impide que servidores externos a Windows Azure puedan conectarse a las bases de datos de SQL Azure para manipular su información.

    4. La estructura interna e implementación física de SQL Azure es distinta a la de SQL Server; sin embargo para los clientes esto es totalmente transparente, pues SQL Azure ofrece la interfaz TDS que soporta perfectamente las cadenas de conexión tradicionales, así como el T-SQL que todos conocemos. De esta manera podremos acceder a la DB a través de ADO.NET, OLEDB, ORMs como NHibernate, LINQ, Entity Framework y muchos otros.

    Otros temas más fáciles de solucionar se pueden arreglar automáticamente a través del Sql Azure Migration Wizard

    Otros Motores Free

    Si la base de datos se encuentra en otros motores free como MySql, tendremos una limitante total y es el hecho de que para poder instalar un MySQL en Windows Azure, es necesario usar el VM Role de Windows Azure, que permite crear una máquina virtual a la cual le adicionamos un disco duro virtual (VHD) que tiene la configuración previa que le hemos hecho. Esta configuración previa entonces puede incluir la instalación de MySQL por nuestra parte antes de agregar el VHD. Sin embargo, los VM Role son stateless. Esto quiere decir que si por algún motivo la máquina ha de ser reiniciada, todos los cambios generados desde la distribución del VHD se perderían. Situación nada conveniente cuando se tiene la DB instalada en una instancia. En un ambiente de Web Roles y Worker Roles, esto no es un inconveniente, pues su única función es operar y no almacenar. El almacenamiento está en SQL Azure. Pero si en el VM Role ponemos una DB, con cada reinicio, aunque la DB aparezca instalada, estará restaurada a su condición inicial.

    Una de las próximas características que estaremos liberando en Windows Azure, son VM Roles persistentes que permitan instalar servidores de Sharepoint, Biztalk, y herramientas de terceros como MySQL y hasta otros sistemas operativos como Linux.

    Si se implementasen los VM Roles persistentes s instaláramos por ejemplo MySQL, tendríamos una complejidad adicional y estaríamos desperdiciando ciertas características de nuestra plataforma.

    Cuando tenemos un servidor como MySql, que es gratuito, no tendremos ningún problema en instalarlo en un VM Role de Windows Azure. Esto se logra haciendo una instalación del MySQL en una máquina virtual local, y luego subiendo el disco duro de esta máquina virtual a Windows Azure, donde quedará desplegada para ser accedida desde cualquier parte del mundo. Como se aprecia, ya de entrada hay una complejidad y es el proceso de preparar la máquina virtual y luego subirla a Windows Azure.

    Otros problemas se presentan cuando nuestra base de datos MySql comienza a requerir escalabilidad. Es así como si la máquina en la que habíamos instalado el MySql ya no es suficiente para los requerimientos de nuestros usuarios, habremos de entrar a una operación manual de migración hacia una máquina más grande.

    Sql Azure está diseñado para auto escalar los recursos que necesita, de acuerdo a la demanda por parte de los usuarios. Es así, como automáticamente se administra la memoria, discos, etc., para brindar un funcionamiento óptimo.

    Por otro lado, dado que la única opción para instalar MySql sería en un VMRole, entonces necesitaríamos entrar a ejecutar operaciones administrativas adicionales a las que requeriríamos si usáramos solo SQL Azure. En SQL Azure nos desentendemos de la administraci��n del sistema operativo, sus parches, sus actualizaciones, etc. Solo nos enfocamos en usar y mejorar la base de datos. Pero el VM Role al estar más cerca a la Infraestructura como Servicio (IaaS) que a la Plataforma como Servicio (PaaS) requiere un trabajo manual que en SQL Azure se puede omitir completamente.

    Todo esto sin mencionar que no habría un SLA para la MySQL, mientras que para SQL Azure si hay y es de 99.99%

    Recomendación: Migrar la DB a SQLAzure

    Otros motores no Free

    Otros motores no free, como Oracle se podrían instalar en Windows Azure, con las mismas consideraciones de los motores free. Pero adicionalmente le deberíamos sumar otra complejidad, y es que por lo general estos productos aún no tienen definida una licencia específica para ser instalados en esquemas de Cloud Computing como Windows Azure, por lo cual se podría entrar en conflictos legales al desplegar un servidor de estos en la nube. Primero ud. Debería consultar con su proveedor e investigar alrededor de este tema.

    Recomendación: Migrar la DB a SQLAzure.

    Conclusión:

    Una aplicación web que se pueda desplegar fácilmente entre ambientes tradicionales y Windows Azure, debería emplear para su DB (si es que usa DB), un esquema SQL Server. Luego, en la evolución hacia la nube, este SQL Server debería migrarse a SQL Azure (las aplicaciones tradicionales se pueden poner a apuntar a la nube y seguirían funcionando perfectamente) y finalmente la aplicación como tal se pasaría de los servidores tradicionales a la nube, sin tener que hacer cambios sobre la DB. Recordemos que operaciones de Servicios de Integración de Datos, Análisis y Minería siguen estando disponibles a través de conexiones de servidores externos que tengan estas funcionalidades, a la nube.

    Este es el post 1/3 y mira los aspectos esenciales a tener en cuenta en lo referido a bases de datos. Los siguientes dos hablarán de la capa de negocio y de la interfaz gráfica como tal.

  • WarNov Developer Evangelist

    Fallas en el despliegue remoto de aplicaciones al Emulador de Windows Azure

    • 0 Comments

    Abstract:

    En escenarios de testing, por ejemplo pruebas E2E, es necesario desplegar todo el ambiente en los llamados Builds Nocturnos, para verificar la completitud del sistema antes de pasarlo a producción. Las acciones requeridas generalmente se pueden automatizar, pero adquieren cierto nivel de complejidad cuando se trabaja con Windows Azure, en cuyo caso se requiere automatizar el despliegue sobre el Emulador en el cual se harán las pruebas. Esto presenta ciertos retos y aquí veremos cómo solucionarlos.

    Nivel: 400 – Avanzado

    Dice la corresponsal que ya tenía su .bat con todos los CmdLets de Windows Azure requeridos para su despliegue. Básicamente se requiere ejecutar las siguientes tareas:

    1. Apagar los emuladores del fabric y del storage de la máquina a operar
    2. Remover todos los despliegues existentes
    3. Inicializar ambos emuladores
    4. Desplegar el servicio al emulador
    5. Hacer un ping al servicio recién desplegado para verificar que quedó correctamente instalado.

    Me cuenta ella también que cuando entra a la máquina virtual de pruebas con su usuario y ejecuta el batch con las operaciones descritas anteriormente, este funciona correctamente y despliega los servicios sin ningún problema.

    Sin embargo, su objetivo es poder ejecutar el batch remotamente, en este caso a través de la herramienta psexec, que el gran Russinovich nos describe en este post. Desafortunadamente para ella, cuando usa este tool observa que el proceso no es exitoso, aun usando los switch –w (para ejecutar el batch como system y usando –i para seleccionar el id de sesión activa. De hecho me cuenta que hasta usó msbuild para llamar el bat, sin éxito.

    Solución:

    CSRUN.EXE es un tool de la línea de comandos que se instala con el SDK de Windows Azure. Su función es la de desplegar una aplicación o servicio al emulador de Windows Azure y administrar el servicio allí hosteado. Obviamente vemos que en el ejercicio que se intentó llevar a cabo CSRUN es parte esencial. Desafortunadamente, este tool no funciona correctamente y aparecerá como bloqueado si no es lanzado por una sesión interactiva en la máquina donde se encuentra el emulador. Por eso es que a nuestra apreciada corresponsal su solución le funciona cuando hace login con su usuario, pero no sirve usando psexec. Siendo una buena idea poner el switch –i para identificar el Id de Sesión, esto no basta para que csrun pueda identificar completamente la sesión. Así que es necesario ajustar la variable de sesión _DEVFABRIC_SESSIONID_ con el id de la sesión en la que se está corriendo. Con esto, se solucionará el problema de inmediato, así que solo basta adicionar en el bat el código necesario para ajustar esta variable de sesión.

Page 1 of 1 (3 items)