MSDN Blogs
  • WarNov Developer Evangelist

    NaCl: El Silverlight/Flash de Google?

    • 9 Comments

    En mi continuo transitar por las novedades tecnológicas (no sé a que hora visito tanto sitio…) Me encontré con que Google de una manera bastante discreta estaba lanzando una tecnología abreviada como la sal: NaCl. Acrónimo de Native Client.

    NaCl = Sal

    Native Client es una idea supernovedosa

    Con la cual de acuerdo a lo que encontramos en el sitio del proyecto, tenemos un fabuloso SDK que permitirá al browser ejecutar código nativo para construir aplicaciones web de alta respuesta e interactividad… (no les suena esto familiar?)

    Lo cual, me parece bastante curioso, dado todo lo que Google ha dicho acerca de su firme apoyo a HTML 5, que pretende solucionar el mismo tipo de problema.

    Dijo el vice presidente de ingeniería Vic Gundotra en el Google I/O de 2009: “HTML 5, will be the future of the web”.

    Y si es así? Para qué desgastarse tratando de implementar toda una tecnología para correr código nativo desde el browser? Sobretodo cuando se ha criticado al mismo tipo de tecnologías ya implementadas como Silverlight y Flash?

    Será que en el fondo no creen mucho en HTML5? O será que en el fondo creen mucho en tecnologías Silverlifght/Flash?

    NaCl tiene un SDK que funciona en Windows, Linux y Mac… Genial! Y lo mejor de todo, es que las aplicaciones las programaríamos en una suerte de sancocho (léase mescolanza o MIX para los más modernos) de CSS, HTML, Javascript y sí, el amigable C/C++! Todo para lograr que la aplicación no se vea como un frame embebido dentro del HTML, sino como puro HTML.

    Este C/C++ nos permitirá crear de una forma bastante sencilla gráficos en 2D/3D, ejecutar audio y responder a eventos del mouse y teclado!

    Pero…

    Cuál es el AS bajo la manga de Google que aventajará a Silverlight y Flash?

    Pues que no se requerirá plugin! No habrá que instalar nada!!!
    Bueno, excepto el propio browser de Google (Chromium). Entonces ha de ser que para ellos no existen más browsers :

    “all without requiring users to install a plugin. These web apps run in recent versions of Chromium with the --enable-nacl flag.”

    Bueno; pero pongamos esas des-virtudes a un lado y démosle una oportunidad de prueba; observemos cómo sería la programación. Primero, veamos cómo sería la página web que hospedaría la sal; digo, NaCl:

       1:  <!DOCTYPE html>
       2:  <html>
       3:    <!--
       4:    Copyright (c) 2010 The Native Client Authors. All rights reserved.
       5:    Use of this source code is governed by a BSD-style license that can be
       6:    found in the LICENSE file.
       7:    -->
       8:  <head>
       9:    <title>Hello, World!</title>
      10:   
      11:    <script type="text/javascript">
      12:      hello_world = null;  // Global application object.
      13:      status_text = 'NO-STATUS';
      14:   
      15:      function moduleDidLoad() {
      16:        hello_world = document.getElementById('hello_world');
      17:        updateStatus('SUCCESS');
      18:      }
      19:   
      20:      // If the page loads before the Native Client module loads, then set the
      21:      // status message indicating that the module is still loading.  Otherwise,
      22:      // do not change the status message.
      23:      function pageDidLoad() {
      24:        if (hello_world == null) {
      25:          updateStatus('LOADING...');
      26:        } else {
      27:          // It's possible that the Native Client module onload event fired
      28:          // before the page's onload event.  In this case, the status message
      29:          // will reflect 'SUCCESS', but won't be displayed.  This call will
      30:          // display the current message.
      31:          updateStatus();
      32:        }
      33:      }
      34:   
      35:      function fortytwo() {
      36:        try {
      37:          alert(hello_world.fortytwo());
      38:        } catch(e) {
      39:          alert(e.message);
      40:        }
      41:      }
      42:   
      43:      function helloworld() {
      44:        try {
      45:          alert(hello_world.helloworld());
      46:        } catch(e) {
      47:          alert(e.message);
      48:        }
      49:      }
      50:   
      51:      // Set the global status message.  If the element with id 'status_field'
      52:      // exists, then set its HTML to the status message as well.
      53:      // opt_message The message test.  If this is null or undefined, then
      54:      //     attempt to set the element with id 'status_field' to the value of
      55:      //     |status_text|.
      56:      function updateStatus(opt_message) {
      57:        if (opt_message)
      58:          status_text = opt_message;
      59:        var status_field = document.getElementById('status_field');
      60:        if (status_field) {
      61:          status_field.innerHTML = status_text;
      62:        }
      63:      }
      64:    </script>
      65:  </head>
      66:  <body onload="pageDidLoad()">
      67:   
      68:  <h1>Native Client Simple Module</h1>
      69:  <p>
      70:    <button onclick="fortytwo()">Call fortytwo()</button>
      71:    <button onclick="helloworld()">Call helloworld()</button>
      72:   
      73:    <!-- For development, use a #develop location, which loads the develop
      74:    version of the module.
      75:    -->
      76:    <div id="nacl_helloworld_content"></div>
      77:    <script type="text/javascript">
      78:      contentDiv = document.getElementById('nacl_helloworld_content');
      79:      if (window.location.hash == '#develop') {
      80:        // Load the develop version of the module.
      81:        contentDiv.innerHTML = '<embed name="nacl_module" '
      82:                               + 'id="hello_world" '
      83:                               + 'width=0 height=0 '
      84:                               + 'type="pepper-application/hello_world" />';
      85:        moduleDidLoad();
      86:      } else {
      87:        // Load the published .nexe.  This includes the 'nexes' attribute which
      88:        // shows how to load multi-architecture modules.  The relative URLs in
      89:        // the following table should be matched with a similar directory
      90:        // structure on your server.
      91:        var nexes = 'x86-32: hello_world.nacl/x86_32/hello_world.nexe; '
      92:                    + 'x86-64: hello_world.nacl/x86_64/hello_world.nexe; '
      93:                    + 'ARM: hello_world.nacl/arm/hello_world.nexe; ';
      94:        contentDiv.innerHTML = '<embed name="nacl_module" '
      95:                               + 'id="hello_world" '
      96:                               + 'width=0 height=0 '
      97:                               + 'src="hello_world.nexe" '
      98:                               + nexes
      99:                               + 'type="application/x-nacl-srpc" '
     100:                               + 'onload=moduleDidLoad() />';
     101:      }
     102:    </script>
     103:  </p>
     104:   
     105:  <p>If the module is working correctly, a click on the "Call fortytwo" button
     106:    should open a popup dialog containing <b>42</b> as value.</p>
     107:   
     108:  <p> Clicking on the "Call helloworld" button
     109:    should open a popup dialog containing <b>hello, world</b> as value.</p>
     110:   
     111:  <h2>Status</h2>
     112:  <div id="status_field">NO-STATUS</div>
     113:  </body>
     114:  </html>

    Bastante código para un Hello World no?

    Independientemente de eso, observemos la estructura. Básicamente se trata de una página web convencional, cuyo DOM es manejado por un Javascript que accede a un objeto embebido (finalmente si se embeben objetos) que es precísamente el gestor de NaCl, el cual carga archivos binarios de tipo “.nexe” escritos en C++ (Entonces lo que uno hace es indicar la ruta de dicho .nexe; muy parecido a Flash o Silverlight, donde uno indica la ruta del .xap). Hasta aquí noto algunas desventajas con Silverlight… por ejemplo, no se sabe si la página carga antes o después del NaCl; así que hay que escribir lógica adicional para cuando esto sucede. También tenemos que estar mezclando en todo lado Javascript, para traer los datos desde el NaCl al DOM de la página. Finalmente siempre tienen que diferenciarse las versiones de desarrollo de las de producción. En Silverlight, no hay tal diferenciación. Sin embargo, he de decir, que no son diferencias tan graves y que en el fondo el funcionamiento es muy similar, en cuanto a la idea como tal.

    Pero ahora veamos, cómo se programa la parte nativa de la aplicación.

    Como ya les había comentado, usamos el poderoso y amigable C/C++ para dicha programación.

    Luego de muchos tropiezos, por fin logré sacar el código que me daría un mensaje de texto que diría Hello World, el cual se transfiere a la página a través de Javascript y se muestra en un ‘alert´.

    Veamos el código:

       1:  // Copyright 2008 The Native Client Authors. All rights reserved.
       2:  // Use of this source code is governed by a BSD-style license that can
       3:  // be found in the LICENSE file.
       4:   
       5:  #include <stdbool.h>
       6:  #include <stdio.h>
       7:  #include <stdlib.h>
       8:  #include <string.h>
       9:   
      10:  #if defined(__native_client__)
      11:  #include <nacl/nacl_npapi.h>
      12:  #else
      13:  // Building a develop version for debugging.
      14:  #include "third_party/npapi/bindings/npapi.h"
      15:  #include "third_party/npapi/bindings/nphostapi.h"
      16:  #endif
      17:   
      18:  // These are the method names as JavaScript sees them.
      19:  static const char* kHelloWorldMethodId = "helloworld";
      20:   
      21:  // This function creates a string in the browser's memory pool and then returns
      22:  // a variable containing a pointer to that string.  The variable is later
      23:  // returned back to the browser by the Invoke() function that called this.
      24:  static bool HelloWorld(NPVariant *result) {
      25:    if (result) {
      26:      const char *msg = "hello, world.";
      27:      const int msg_length = strlen(msg) + 1;
      28:      // Note: |msg_copy| will be freed later on by the browser, so it needs to
      29:      // be allocated here with NPN_MemAlloc().
      30:      char *msg_copy = reinterpret_cast<char*>(NPN_MemAlloc(msg_length));
      31:      strncpy(msg_copy, msg, msg_length);
      32:      STRINGN_TO_NPVARIANT(msg_copy, msg_length - 1, *result);
      33:    }
      34:    return true;
      35:  }
      36:   
      37:  static NPObject* Allocate(NPP npp, NPClass* npclass) {
      38:    return new NPObject;
      39:  }
      40:   
      41:  static void Deallocate(NPObject* object) {
      42:    delete object;
      43:  }
      44:   
      45:  // Return |true| if |method_name| is a recognized method.
      46:  static bool HasMethod(NPObject* obj, NPIdentifier method_name) {
      47:    char *name = NPN_UTF8FromIdentifier(method_name);
      48:    bool is_method = false;
      49:    if (!strcmp((const char *)name, kHelloWorldMethodId)) {
      50:      is_method = true;
      51:    } else if (!strcmp((const char*)name, kFortyTwoMethodId)) {
      52:      is_method = true;
      53:    }
      54:    NPN_MemFree(name);
      55:    return is_method;
      56:  }
      57:   
      58:  static bool InvokeDefault(NPObject *obj, const NPVariant *args,
      59:                            uint32_t argCount, NPVariant *result) {
      60:    if (result) {
      61:      NULL_TO_NPVARIANT(*result);
      62:    }
      63:    return true;
      64:  }
      65:   
      66:  // Invoke() is called by the browser to invoke a function object whose name
      67:  // is |method_name|.
      68:  static bool Invoke(NPObject* obj,
      69:                     NPIdentifier method_name,
      70:                     const NPVariant *args,
      71:                     uint32_t arg_count,
      72:                     NPVariant *result) {
      73:    NULL_TO_NPVARIANT(*result);
      74:    char *name = NPN_UTF8FromIdentifier(method_name);
      75:    if (name == NULL)
      76:      return false;
      77:    bool rval = false;
      78:   
      79:    // Map the method name to a function call.  |result| is filled in by the
      80:    // called function, then gets returned to the browser when Invoke() returns.
      81:    if (!strcmp((const char *)name, kHelloWorldMethodId)) {
      82:      rval = HelloWorld(result);
      83:    } else if (!strcmp((const char*)name, kFortyTwoMethodId)) {
      84:      rval = FortyTwo(result);
      85:    }
      86:    // Since name was allocated above by NPN_UTF8FromIdentifier,
      87:    // it needs to be freed here.
      88:    NPN_MemFree(name);
      89:    return rval;
      90:  }
      91:   
      92:  // The class structure that gets passed back to the browser.  This structure
      93:  // provides funtion pointers that the browser calls.
      94:  static NPClass kHelloWorldClass = {
      95:    NP_CLASS_STRUCT_VERSION,
      96:    Allocate,
      97:    Deallocate,
      98:    NULL,  // Invalidate is not implemented
      99:    HasMethod,
     100:    Invoke,
     101:    InvokeDefault,
     102:    NULL,  // HasProperty is not implemented
     103:    NULL,  // GetProperty is not implemented
     104:    NULL,  // SetProperty is not implemented
     105:  };
     106:   
     107:  NPClass *GetNPSimpleClass() {
     108:    return &kHelloWorldClass;
     109:  }

    Cristalino no?

    Y solo para un “Hello World!“


    Ahora veamos lo mismo con Silverlight

       1:  using System;
       2:  using System.Windows;
       3:  using System.Windows.Controls;
       4:   
       5:   
       6:  namespace HelloSilverlight
       7:  {
       8:      public partial class MainPage : UserControl
       9:      {
      10:          public MainPage()
      11:          {
      12:              // Required to initialize variables
      13:              InitializeComponent();
      14:          }
      15:   
      16:          private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
      17:          {
      18:              MessageBox.Show("Hello World");
      19:          }
      20:      }
      21:  }

    Bueno; el código habla por sí solo!!!

    Por si fuera poco, observemos el tamaño del ejecutable que finalmente tiene que descargar el usuario:

    NaCl:

    image

    Silverlight:

    image

    Hum… 1143 veces menor

    Bueno; a favor de Google digamos que esta es la primera muestra en público de la plataforma y que todavía no está en producción. Pero que o recuerde, Silverlight en sus primeras apariciones no tenía esos inconvenientes.. yo creo que deberían refinar un poco más el producto a mostrar, antes de sacar su preview!

    Por otro lado, también pienso que así evolucione mucho, (disminuir el tamaño final, simplificar la comunicación con el DOM, etc.) La programación como tal del cliente nativo no tendrá nada que hacer en cuanto a productividad si no se usa un lenguaje administrado.

    Hoy en día los recursos de hardware que existen para la mayoría de las aplicaciones (yo diría un 96%) permiten que las ligeras ventajas en tiempo de ejecución logradas con lenguajes no administrados como C/C++ sean imperceptibles… así que vamos… cuál es el punto?

     

  • 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

    Creando un Switch en C# para enumeraciones grandes en segundos!

    • 6 Comments

    Alguna vez han tenido que evaluar una sentencia Switch-Case de C# sobre una enumeración que tiene, que se yo; unos 30 elementos?

    Si les ha tocado pasar por eso, sabrán que es bastante tedioso escribir todas las líneas pertinentes para cada uno de los elementos de la enumeración.

    En este video, les muestro cómo con Visual Studio lo podemos lograr en solo segundos. Es un video de solo un poco mas de un minuto, que hace parte de una serie de videos cortos que encontrarán en mi blog bajo la categoría de WarFastVideos, y que pretenden mostrar cosas interesantes en muy pocos minutos.

    Enjoy!

  • WarNov Developer Evangelist

    Hablar Ilimitadamente usando el plan de datos del Celular

    • 3 Comments

    Hoy un amigo aquí en la subsidiaria me compartió esta valiosa información al respecto:

    Loudtalk Site

    “Para quienes tienen plan de datos ilimitado o WiFi en su celular (y puedan acceder a Internet) y sus minutos de voz sean limitados, les presento esta aplicación que les permitirá hablar con un compañero de la siguiente forma:

    - De celular a celular

    - De celular a PC

    - De PC a PC

     

    NO IMPORTA DE QUE OPERADOR CELULAR SEAMOS, PUEDEN HABLAR ILIMITADAMENTE!!!

    La aplicación se llama Loudtalks y emplea el concepto denominado Push To Talk (PTT), parecido al servicio que tienen los Avantel, la cual permite emplear el canal de datos para enviar la voz (Voz/IP), a algunos de Ustedes les he hecho la demostración, esta es la última versión que han liberado.

    La aplicación tanto para el Windows Phone como para el PC es gratuita

    Adjunto el instalador para el celular (copiar en el equipo y luego ejecutar el instalador) y el link para quien desee instalarlo en el PC http://loudtalks.com/download/

  • WarNov Developer Evangelist

    De las mejores evoluciones de Visual Basic en 2010

    • 3 Comments

    Antes:

     

    VB vs C# 1

    Después:

    106894368

    Gracias a @afontang

  • WarNov Developer Evangelist

    Nuevo Ciclo del Conocimiento ALM con Visual Studio 2010

    • 3 Comments

    Como ya es toda una tradición, en Microsoft Colombia cada martes a partir de las 6.30pm, venimos realizando ciclos de conocimiento de manera presencial en nuestras instalaciones y también via LiveMeeting, para que personas de otras locaciones o los que no puedan asistir no se queden sin disfrutar de este contenido técnico.

    El mes pasado tuvimos nuestro ciclo de Windows Phone 7 Series. En este, nos estaremos enfocando en estudiar la herramienta Visual Studio 2010 en lo concerniente a la Administración del Ciclo de Vida del Software o ALM.

    image

    Es por esto, que para ustedes tenemos preparadas las siguientes 5 sesiones:

    1-Jun-10 Planeación de Proyectos con Visual Studio 2010: Introducción a VS2010 como herramienta de AALM, Planeación de Proyectos, Branching y Merging
    8-Jun-10 Arquitectura de Software con Visual Studio 2010 Primera Parte: Introducción y Descubrimiento de código usando las herramientas de arquitectura
    15-Jun-10 Arquitectura de Software con Visual Studio 2010 Segunda Parte: Class Coupling y Architecture Explorer
    22-Jun-10 Calidad de Software I: Introducción y creación y ejecución de pruebas Manuales. Administración de casos de prueba con Microsoft Test Manager
    29-Jun-10 Calidad de Software II: Introducción a las pruebas automatizadas de interfaz de usuario. Depuración con Intellitrace usando VS2010

    En este link pueden registrarse para asistir presencialmente o via Live Meeting.

    Los esperamos!

  • WarNov Developer Evangelist

    Mayo en Colombia y LATAM, es de Windows Phone 7

    • 2 Comments

     

    Windows Phone 7

    Como ya lo describí en el review de mi anterior post, Windows Phone 7 es todo un nuevo mundo para las aplicaciones móviles, que aparte de ser tan novedoso, nos da la gran ventaja de aprovechar lo que ya sabemos para construir aplicaciones orientadas a esta plataforma. Es así como si ya sabemos Silverlight o XNA, ya sabremos el 70~80% de lo requerido para programar en Windows Phone 7 (WP7).

    En todo caso, la web está llena de recursos para aprender de esta tecnología. Me permito aquí citar algunos recursos que nos ayudarán < salir adelante con aplicaciones para WP7:

    Para desarrollar todo esto, tenemos numerosas herramientas y lo mejor de todo es que hoy en día, la mayoría de ellas están gratuitas.

    Por ejemplo, tenemos totalmente gratis:

    Visual Studio 2010 for Windows Phone

    También en forma gratuita, tenemos el RC de Blend 4.0, que nos permite crear interfaces de usuario realmente impactantes:

    Expression Blend

    Para poder trabajar con Blend 4.0 RC para Windows Phone 7, es necesario instalar:

    También es necesario instalar las herramientas de desarrollador que si además tenemos instalado Visual Studio 2010 RTM, nos lo dejan listico para programar WP7. Hasta hace dos días, no podíamos programar WP7 en el RTM, pero con esta descarga, ya es posible:

    Windows Phone Developer Tools CTP - April Refresh

    Esta última descarga incluye Visual Studio 2010 Express for Windows Phone. Así que no sería necesario descargarlo.

    Con todo eso, no queda más que poner manos a la obra y comenzar a aprender. Para más recursos, vamos al portal oficial de WP7:

    Windows Phone Developer Portal

    Pero un momento!

    Es todo para nosotros desarrolladores colombianos y latinos?

    No!

    By: Javier Cáceres He organizado junto con nuestro nuevo MVP en desarrollo para móviles: Javier Cáceres un conjunto de workshops y capacitaciones para aquellos que prefieren aprender con un tutor.

    Así es como en todo Mayo, en las instalaciones de Microsoft tendremos cada martes una sesión de Workshop en la que Javier nos estará enseñando acerca de WP7. A estas sesiones también podrán asistir de manera online a través de Live Meeting.

    La agenda es la siguiente:

    • 04/Mayo Introducción a la Plataforma Windows Phone
    • 11/Mayo Arquitectura de Windows Phone
    • 18/Mayo Desarrollo de aplicaciones para iPhone en .Net
    • 25/Mayo Distribución de apps y juegos para Windows Phone

    Para ver los detalles de cada workshop y registrarse para asistir presencial u online pueden visitar: http://www.microsoft.com/colombia/activa/activa_conocimiento_desarrollo.aspx

    Habrán otras 4 sesiones que son webcast en el horario de 08:00PM a 09:00PM (GMT-5) a los cuales pueden asistir solo a través de Live Meeting. Los temas y enlaces a LiveMeeting de los webcasts son:

    • 05/Mayo: Navegación en el Windows Phone: En esta sesión se mostrará la navegación y los controles de la plataforma Windows Phone. Click aqui.
    • 12/Mayo: Silverligth para Windows Phone: En esta sesión se mostrará como reutilzar el conocimiento de Silverligth para desarrollar en Windows Phone y la integración con otras herramientas. Click aquì.
    • 19/Mayo: Servicios de la Plataforma Windows Phone: En esta sesión se mostrarán las implicaciones en cuanto a botones, barra de aplicaciones y demás consideraciones de la platafoma. Click aquí.
    • 26/Mayo: Windows Phone 7 Data Binding: En esta sesión se mostrará cómo hacer enlace a datos e integraciòn con LINQ. Click aquí.

    Para finalizar, Javier nos comenta:

    Javier Cáceres (MVP Windows Mobile) Para que se vayan preparando les dejo: este artìculo http://tinyurl.com/39wfgto, este foro en el cual pueden preguntarme cualquier duda sobre Windows Phone 7 en inglés http://tinyurl.com/ASKjacace, este foro en español http://tinyurl.com/WP7esp y mi cuenta en twitter @jacace

     

    Agradezco mucho a Javier por su colaboración, y los espero en nuestros eventos. WP7 en nuestras manos!

  • WarNov Developer Evangelist

    Reproduciendo Sonidos Secuencialmente en Silverlight

    • 1 Comments

    Ya hace poco les mencioné un proyecto OpenSource en el que trabajo; pronto postearé al respecto.

    Bien; en ese proyecto Silverlight es protagonista. De hecho el proyecto se llama SilverTeacher.

    Dado que es un proyecto altamente cargado de multimedia, obviamente se necesita reproducir sonido.

    Cómo se reproducen sonidos en Siverlight?

    Rocket Science!!! Observen:

     
       1:  private void ReproduceSound(string name)
       2:  {
       3:      melSounds.Source = new Uri(
       4:          String.Concat("/sounds/", name, ".wma", UriKind.Relative));
       5:      melSounds.Stop();
       6:      melSounds.Play();
       7:  }

    Bueno… aquí el único sujeto desconocido es el tal melSounds

    Se los presento:

    internal System.Windows.Controls.MediaElement melSounds;

    Es un sujeto de tipo MediaElement. MediaElement es un control que uno arrastra del toolbox. No tiene representación visual en el editor. Queda a un ladito invisible, casi como los DialogBox de la programación Windows tradicional.

    Observen entonces que lo único que hay que hacerle, es proporcionarle la Uri del elemento a reproducir y luego darle “Play”.

    Observen también que primero doy la instrucción “Stop”. Por qué?

    Esto lo hago, porque cuando por primera vez se reproduce un sonido, el “cursor” de la reproducción queda al final del mismo. Así que si luego de reproducirse le damos “Play” no se ejecutará nada, porque el cursor está al final.

    La forma de reposicionar el cursor, es mediante la instrucción “Stop”. Súper fácil no?

    Hasta ahí todo bien. Pero que tal si quisiéramos reproducir dos o más sonidos consecutivamente?

    Usando el método anterior, uno pensaría: “Muy fácil, ejecuto este código:”

       1:  ReproduceSound(nombrePrimerArchivo);
       2:  ReproduceSound(nombreSegundoArchivo);

    Desafortunadamente la cosa no funciona bien así

    Dado el carácter asincrónico de la reproducción de los sonidos, lo que pasaría es que sólo el último sonido se reproduciría.

    La solución no es muy directa. Es más bien “tricky”.

    Luego de probar y probar, descubrí que el MediaElement tiene un evento llamado MediaEnded. Entonces lo único que habría que hacer, es controlar ese evento, para que se comience a reproducir el siguiente archivo.

    De hecho, ya una aplicación real de esta teoría, se aprecia en el siguiente método:

       1:  private void melSounds_MediaEnded(object sender, System.Windows.RoutedEventArgs e)
       2:  {
       3:      switch (melSounds.Source.OriginalString)
       4:      {
       5:          case "/sounds/success.wma":
       6:              if (goals == GOALS_TO_WIN)
       7:              {
       8:                  //ShowStars();
       9:                  ReproduceSound("cheer");
      10:              }
      11:              break;
      12:          case "/sounds/error.wma":
      13:              SayColor();
      14:              break;
      15:          default:
      16:              break;
      17:      }
      18:  }

    Observen allí cómo de acuerdo al sonido que haya acabado de reproducirse (lo sé a través de su “source” o fuente) escojo cuál debería ser el siguiente archivo y lo reproduzco.

    Tal cual, es la solución!!!

  • WarNov Developer Evangelist

    Gobierno 2.0 Camp Colombia 2010

    • 0 Comments

    Es una iniciativa que se ha realizado en ciudades como Washington, Berlín, México DF  y que ahora tendremos en Bogotá. Los primeros en Sur América!

    image

    Se trata de un foro de participación abierta, donde se tratarán temas de Gobierno 2.0 y cómo las redes sociales y la web 2.0 han apoyado 3 pilares de gobernabilidad:

    • Transparencia
    • Colaboración
    • Participación ciudadana

    En este encuentro contaremos con la participación de entidades como:

    • Alcaldía Mayor de Bogotá
    • Ministerio de Comunicaciones
    • Programa Colombia en Línea
    • Corporación Colombia Digital
    • Universidad Externado de Colombia
    • Colombia es Pasión

    image

    Entre otros, veremos temas muy interesantes como:

    • Open Government (Demo de Participación Ciudadana). Esto incluirá TownHall de Azure
    • Gobierno electrónico, ciudades inteligentes y protección del medio ambiente
    • Gob Camps alrededor del mundo

    Es una gran oportunidad para que nosotros desarrolladores nos pongamos al día en los nuevos campos en los que nuestros conocimientos pueden ser aplicados! Sean cordialmente invitados a participar!

  • WarNov Developer Evangelist

    Mejor BING: Cápsulas de uso modificado

    • 0 Comments

    En el videopost rápido de esta semana, quiero mostrarles algunas acciones sobre Bing e Internet Explorer 8 que nos permiten realmente aprovechar todo su potencial.

    Por ejemplo veremos cómo obtener mejores resultados técnicos cambiando el lenguaje por defecto del buscador, cómo aprovechar las ventajas de búsqueda de video e imágenes y cómo establecer un buscador personalizado para un blog por ejemplo, mediante la integración con Internet Explorer 8.

    Mejor Bing from WarNov on Vimeo.

    Como bonus video, describo como IE8 y Bing se integran genialmente para permitir crrear búsquedas dentro de sitios específicos que quedan disponibles inmediatamente en la barra de búsqueda, así que se puede buscar muy fácilmente dentro de cualquier sitio sin necesidad de abrirlo. Esto es productividad!!

    Disclaimer: Este último video tiene edición de sonido experimental e intencional con un algoritmo en C# que luego estaré posteando.

    Proveedores de Búsqueda Personalizados en Bing from WarNov on Vimeo.

  • WarNov Developer Evangelist

    Development Storage en Windows Azure no puede ser accedido

    • 0 Comments

    Sea el siguiente escenario:

    Ud ha hecho desarrollos con Visual Studio 2008 o 2010 para Windows Azure y no ha tenido problemas. Luego, después de un par de semanas sin programar nada en Azure vuelve y se encuentra con un error cuando se intenta crear el Development Storage Service de Windows Azure. Un error que le dice que el usuario no tiene permiso en la DB master para ejecutar cierta operación.

    image

    Entonces Ud. se pregunta: Cómo puede ser esto, si hasta hace poco todo me funcionaba perfectamente?

    Pues lo mismo me ocurrió a mi, con una máquina en la que había dejado de programar Azure por un buen tiempo. Así que emprendí resolución del problema.

    En primera medida, tengamos en cuenta que por defecto Windows Azure Development Fabric,  siempre busca la instancia SQLEXPRESS para simular crear el Development Storage (recordemos que cuando se antepone la palabra Development al fabric o al storage siempre estamos haciendo referencia a los ambientes locales simulados que nos sirven para tener una pequeña réplica de Azure en nuestras máquinas de desarrollo)

    Con ello ya pude minimizar el campo de pruebas, así que traté conectarme a la instancia SQLEXPRESS con el Sql Server Management Studio.

    La conexión se hizo sin problema. Pero noté que no tenía permisos de nada. Ni siquiera para crear una base de datos. Así que pensé  que algo realmente andaba mal. Obviamente pensé en recurrir a la desinstalación – reinstalación de mi versión de SQLEXPRESS. Y de antemano, pensé en actualizarla, pues tenía la versión SQL Express 2008 y hoy en día ya está disponible la SQL Express 2008 R2.

    De hecho, ya había instalado la versión SQL Server 2008 R2 Developer Edition…
    Momento, Eureka!
    Eso fue lo que dejó “inservible” a mi SQL Express anterior. Hallé la respuesta indirectamente!

    Conclusión:

    Si se tiene SQL Express 2008 instalado y luego se instala SQL Server 2008 R2, es probable que la versión Express se arruine. En cuyo caso la solución es desinstalar la versión Express 2008 e instalar la versión Express 2008 R2, si es que se va a requerir  (como cuando hacemos desarrollos para Windows Azure).

    Para desinstalar SQL Express 2008, no encontrarán en Desinstalar Programas del Panel de Control algo que diga SQL Express. En su lugar, encontrarán una entrada llamada SQL Server 2008 y otra que dirá SQL Server 2008 R2. Obviamente escogeremos la primera y de allí seleccionaremos la instancia a remover. O sea, SQLEXPRESS.

    De allí en adelante la desinstalación es bastante sencilla.

    Luego nos bajamos la versión R2, la instalamos, volvemos a ejecutar las aplicaciones de Windows Azure que teníamos en desarrollo y voilà: De nuevo todo funcionando correctamente.

    Es una solución sencilla, a la cual no se puede llegar fácil si no entendemos ciertos detalles de la operación de Windows Azure en ambientes de desarrollo.

  • 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

    Comunidades MSDN Reloaded

    • 0 Comments

    Como parte de las estrategias enfocadas a desarrollar el potencial de nuestros usuarios, y con el objetivo de establecer mejores canales de comunicación e interacción con ellos, Microsoft ha desarrollado el Programa de Comunidades MSDN, como un medio a través del cual los Profesionales de Desarrollo y Arquitectura de Software podrán aprovechar al máximo las diferentes soluciones y tecnologías de desarrollo, obteniendo una ventaja competitiva a nivel profesional, y por tanto, dando valor agregado a las organizaciones. El programa de Comunidades Microsoft es una iniciativa que se ejecuta a nivel mundial, y actualmente las Comunidades Colombianas se encuentran entre las mejores, tanto en número de usuarios como en impacto y calidad de ejecución. El participar en alguna Comunidad MSDN es sin duda una gran oportunidad de aprender de otros colegas de profesión y compartir experiencias propias, de conocer gente y establecer importantes redes de contacto, así como de tener mayor visibilidad dentro de la industria de software, tanto en Colombia como en otros países.

    ComunidadesMSDN

    Una Comunidad se define como un conjunto de personas vinculadas por características o intereses comunes, y que desarrollan una identidad y sentido de pertenencia. Finalmente, el objetivo de pertenecer a una Comunidad es convivir con personas afines, con intereses similares y poder tanto aprender como aportar nuevas cosas. Se busca que las Comunidades tengan un impacto social, ayudando a difundir y democratizar el acceso a la tecnología en sus localidades. Utilizando esta definición como base, la Comunidad MSDN se integra como un grupo de profesionales con intereses comunes, aprovechando, generando y compartiendo conocimiento y recursos a través de una serie de herramientas, actividades, contenidos y procesos soportados por Microsoft. Es necesario mencionar que las Comunidades y miembros pertenecientes a dicho programa, tienen completa facultad para definir sus propios objetivos, actividades y políticas. El rol de Microsoft es el de dar soporte y orientación, proporcionando las herramientas, procesos y contenidos que cada Comunidad utilizará como mejor convenga.

    Esta es la oportunidad para que re establezcamos este importante mecanismo de potenciación profesional en el que Microsoft ofrece muchas ventajas tanto pasa compañías del sector, como para profesionales y comunidades como tal. Más información en esta página.

    Encuentre este documento en formato word aquí

  • WarNov Developer Evangelist

    Ventajas Rápidas en Expression Web

    • 0 Comments

    En el video rápido de esta semana, muestro ventajas que he encontrado usando Expression Web en la creación de un proyecto Open Source en el que necesitaba algo muy rápido y sencillo, pero con estilo.

    Veamos cómo para lograr esto, Expression Web nos ayuda bastante. Principalmente abordo temas como edición de texto, formateo y aplicación de estilos: Cómo se crean automáticamente dentro de la página a través de cuadros de diálogo visuales. Y cómo se pueden administrar para reunirlos automáticamente en un archivo de estilos.

    También algunos tips HTML como. Centrar un div dentro del body y crear un template con varias columnas en divs.

    Algo rápido, sencillo y útil. Enjoy!

     

    Credits:

    Thnx to @andresruiz for teaching me some really cool http tips. His blog.

    .



Page 1 of 1 (14 items)