Patrones semi-aleatorios en Small Basic

Hace algunas semanas me encontré por casualidad Microsoft Small Basic, una implementación del paradigma de programación para niños que utiliza una tortuga en pantalla a la cual se le dan órdenes tales como moverse hacia adelante o rotar una cantidad específica de grados.

Logo, otra implementación de este paradigma, fue la forma en la cual yo entré en el mundo de la programación allá por 1986, hace ya 24 años. Debido a esto encontrar Small Basic me llenó de gratos recuerdos y desde entonces he dedicado algunos de mis ratos libres a jugar de nuevo con este paradigma tan interesante y motivador, que me llevó a encontrar mi vocación hace tanto tiempo.

Una de las principales razones por las cuales la Tortuga es una de las mejores formas de introducir a los niños al mundo de la programación es que los resultados del código escrito se pueden ver en pantalla de forma rápida e inmediata y las permutaciones que se pueden hacer al código dan para horas de entretenimiento infantil. Adicionalmente, no es necesario aprender muchos conceptos teóricos de programación antes de obtener resultados agradables.

En una de estas sesiones de juego con la tortuga, me dí a la tarea de crear un algoritmo que me permitiera simular cierto grado aleatoriedad en el resultado visual, pero sin sacrificar la belleza del mismo. Para esto introduje niveles de aleatoriedad controlados dentro del marco de ciertas reglas. El resultado sigue siendo aleatorio (y sorpresivo), y por lo tanto cada uno de los patrones generados tiene una muy baja probabilidad de repetirse nuevamente; sin embargo, a pesar del aparente caos reinante en los patrones, estos muestran orden como un todo, lo cual los hace en su mayoría atractivos al ojo humano.

Algunos de los resultados del algoritmo se presentan a continuación:

 

Si desea ver más resultados, puede descargar Small Basic y utilizar el algoritmo para generarlos:

seed = Math.GetRandomNumber(24)
goal = seed * 15
maxSteps = Math.GetRandomNumber(48)
steps = Math.GetRandomNumber(maxSteps) + 1
For j = 1 To steps
  angles[j] = Math.GetRandomNumber(goal)
EndFor

distance = Math.GetRandomNumber(100)

Turtle.Speed = 10
GraphicsWindow.PenColor = GraphicsWindow.GetRandomColor()

For i = 1 To 50
  For j = 1 To steps
    angle1 = angles[j]
    angle2 = goal – angle1 
    Turtle.Turn(angle1)
    Turtle.Move(distance)
    Turtle.Turn(angle2)
    Turtle.Move(distance)
  EndFor
EndFor

Turtle.Hide()

La Pared Táctil de Schematic

La nueva versión de la pared táctil de Schematic; construida utilizando WPF/C# fue presentada la semana anterior en el festival Cannes Lions en Francia.
 
En este proyecto tuve la oportunidad de participar como líder de plataforma, posición en la cual estuve a cargo de la arquitectura y parte del desarrollo de las distintas partes necesarias para la construcción del masivo dispositivo táctil.
 
Entre los componentes necesarios para la puesta en funcionamiento de la pared se encuentran las siguientes:
 
  • Los datos se encuentran almacenados en una instancia de SQL Server.
  • Los delegados se registran con los organizadores del festival, y su información es enviada en tiempo real mediante un servicio de sincronización, implementado por medio de un servicio de Windows que monitorea los cambios en la base de datos de los organizadores y los envía a la base de datos de Schematic mediante un servicio WCF.
  • Es posible modificar los datos mostrados por la pared por medio de un CMS implementado utilizando ASP.net.
  • Los delegados son reconocidos por la pared de forma automática mediante un dispositivo de radio-frecuencia (RFID Tag). El módulo que obtiene los datos desde el lector de radio-frecuencia y los envia a la pared fue desarrollado utilizando C#.
  • Los eventos que ocurriran durante la semana del festival son sincronizados en tiempo real entre las dos bases de datos mediante un servicio XML publicado por los organizadores del festival y un servicio de Windows que monitorea los datos del XML y los actualiza en la base de datos.
  • La interfaz de usuario de 3840×1600 pixeles fue desarrollada utilizando WPF y Prism (Composite Application Library). Esta hace uso extensivo de características claves de WPF, como el databinding de XAML, los "behaviors" y los "converters", lo cual acelera el proceso de desarrollo y lo hace más fácil de actualizar y modificar.
  • Toda la interfaz de usuario fue realizada por medio de Microsoft Expression Blend.
  • Para detectar la información táctil, se utilizó la tecnología de código abierto TUIO y su implementación en C# (www.tuio.org).
  • Las demostraciones son realizadas por medio de videos de resolución nativa (3840×1600), que son reproducidos por Windows Media Player y controlados remotamente desde un dispositivo móvil a través de la red inhalambrica por medio del protocol Open Sound Control (www.osc.org). Tanto el reproductor de video como el receptor de comandos de control remoto fueron realizados por medio de módulos implementados en C#.

Formaron parte del equipo de desarrollo de la pared, mis colégas en Schematic:

  • Jose Madriz, encargado de la realización de toda la interfaz de usuario utilizando Expression Blend, así como del desarrollo de varios behaviors y converters.
  • Herberth Madrigal, encargado de la realización del reproductor de video de alta resolución y el receptor de control remoto.
  • Alexis Cedeño, encargado de la realización de los servicios de sincronización e importación de datos.
  • Anthony Baker, originalmente encargado de la realización de los servicios de sincronización e importación de datos, pero tuvo que dejar el proyecto anticipadamente por razones personales.
  • Jonathan Salas, encargado de la realización de varias de las más llamativas animaciones de la aplicación.
  • Benjamin Gorton, encargado de la implementación de la aplicación de control remoto que envía los comandos de control a través de la red.

Adicionalmente fueron parte del equipo:

  • Michelle Kempner, arquitecta de solución a cargo del proyecto.
  • Mitchell Gould, productor.
  • Bill Hermanns, gerente de proyecto.
  • Karen Ibenthal, gerente de proyecto, etapa de control de calidad.
  • Erin Pionkowski, gerente de proyecto, reproductor de video.
  • Jimmy Chen, director creativo.
  • Andy Jonez, diseñador.
  • Sean Porter, creación de videos demostrativos.

(Nota: estoy seguro de que algunos de los miembros del equipo no están en esta lista, pido disculpas de antemano, pero no logro recordar a todos los miembros del equipo en este momento, iré agregando a otros miembros conforme me lleguen a la memoria).

Es posible encontrar mayor información en el blog de Schematic:

http://touch.schematic.com/2010/06/schematic-touch-walldemo/

http://touch.schematic.com/2010/06/sneak-peek-at-setup/

Pueden enviar sus preguntas acerca del proyecto y su realización a mvarela@schematic.com

 

TFS en Expression Blend 3

Para habilitar la integración entre Expression Blend 3 y Team Foundation Server, es necesario bajar e instalar un parche que se encuentra en la siguiente ubicación:
 
 
Después de la instalación Blend realizará el "check out" de los archivos de forma automática cuando estos son modificados, lo cual ahorra mucho tiempo al trabajar sobre archivos que están bajo control de versiones de código usando TFS.

Diálogo de creación de pruebas unitarias vacío

En estos días he estado modificando un proyecto bastante grande que hemos retomado después de casi un año de inactividad. Después de varios días llego el momento de crear la primera prueba unitaria (unit test) para las clases agregadas.
 
Para mi sorpresa, cuando abrí el cuadro de diálogo correspondiente este se desplegó vacío y no me daba ninguna opción.
 
Después de realizar una rápida búsqueda, descubrí que la causa era una pulga que se presentaba cuando uno de los proyectos no producían como salida un esamble (assembly, .dll), como es el caso de los proyectos de bases de datos y Silverlight.
 
En este caso el problema era un proyecto de base de datos (VSTS DBE GDR2).
 
Afortunadamente Microsoft ya había producido un parche para esta pulga, el cual puede ser descargado desde esta dirección:
 
 
Después de bajarlo e instalarlo la generación de pruebas volvió a funcionar adecuadamente.
 
 

Expression Blend: Habilitar la edición de controles

Estos días he desarollado algunos controles de WPF en librerías externas al proyecto principal, y en el proceso me dí cuenta de que en algunos casos, al abrir el proyecto con Blend, no era posible editar los controles en la vista de diseño, sino que se habrían por defecto en la vista de código y no permitían cambiar de vista.
 
Me dí cuenta de que los proyectos creados bajo la categoría "WPF Control Library" si permitían abrir los controles en vista de diseño, mientras los creados bajo la categoría "Class Library" eran los que presentaban el problema.
 
Entonces me dí a la tarea de encontrar que era lo que los diferenciaba. Creé un proyecto de cada tipo usando el mismo nombre y luego utilicé el comparador de TFS para comparar los archivos .csproj.
 
Además de algunas referencias a librerías adicionales, el proyecto de libraría de controles contenía las dos líneas siguientes:
 
    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
    <WarningLevel>4</WarningLevel>
Procedí a abrir el archivo .csproj del proyecto de librería de clases usando Notepad y le agregué las dos líneas faltantes. Luego lo abrí en Blend y comprobé que efectivamente era posible abrir los controles en la vista de diseño después de efectuar este cambio.

Silverlight 3: tipo de objeto se mantiene

Cuando se instancia una aplicación de Silverlight en una página HTML es necesario utilizar el tag <OBJECT/>, que se utiliza para crear instancias de plug-ins externos al navegador de Internet.
 
Este tag requiere dos parámetros, "data" y "type" que le informan al browser el tipo y la versión del plug-in que se desea instanciar en este espacio. Los valores para estos parámetros han ido cambiando durante el desarrollo de Silverlight, pasando por las distintas versiones e incluso utilizando un valor específico para las versiones beta del producto. Sin embargo para mi sorpresa, entre las versiones dos y tres no hubo cambio en estos valores.
 
Tanto para la versión dos como para la versión 3 de Silverlight, el plugin se instancia usando los siguiente valores:
 
data="data:application/x-silverlight-2," type="application/x-silverlight-2"
 
De forma que, la declaración completa se ve de la siguiente forma:
 
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
    <param name="source" value="ClientBin/AppName.xap"/>
    <param name="onError" value="onSilverlightError" />
    <param name="background" value="white" />
    <param name="minRuntimeVersion" value="3.0.40624.0" />
    <param name="autoUpgrade" value="true" />
    <a href="
http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40624.0" style="text-decoration:none">
      <img src="
http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style:none"/>
    </a>
</object>
 
Es de suponer que ahora en consecuencia el valor que se toma en cuenta para seleccionar la versión requerida del plug-in es el que se encuentra en el parámetro minRuntimeVersion, que para las aplicaciones de Silverlight 3 debe contener el valor "3.0.40624.0".
 
Cuando se crea un nuevo proyecto de Silverlight 3 usando Visual Studio, la herramienta se encarga de crear páginas de ejemplo con estos valores por defecto, por lo que es fácil pasar por alto estos detalles.

Electricidad Inhalámbrica 02

Hace algún tiempo escribí acerca de la electricidad inhalámbrica, y de como un grupo del MIT había descubierto una forma viable de lograrla. Hoy me volví a topar con esta tecnología, pero como era de esperarse, el tiempo y el esfuerzo invertido en la misma ha dado sus frutos y ahora ya no solo se puede usar para encender una bombilla eléctrica, sino también televisores, teléfonos celulares y computadoras portátiles!
 
Esta interesante demostración fue presentada en TED. El video se encuentra en Inglés, pero no es necesario entender lo que se dice para apreciar la tecnología:
 
 
Como dije en mi entrada anterior, era solo cuestión de tiempo antes de que pudieramos ver una aplicación comercial. Lo más interesante es que se habla de cargar los autos eléctricos, sin necesidad de conectarlos, lo cual cambiaría completamente la percepción de la gente acerca de estos vehículos.