lunes, 10 de octubre de 2016

Microsoft Solver Foundation

Hace poco tuve que programar unos gráficos, cuya generación se basaba en unos datos de entrada a los que posteriormente se les aplicaba una resolución de un modelo matemático.

El caso es que para la resolución de dicho modelo matemático se utilizó Microsoft Solver Foundation (https://msdn.microsoft.com/en-us/library/ff524509(v=vs.93).aspx), que tal y como describe Microsoft, "es un conjunto de herramientas de desarrollo para simulación matemática, optimización y modelado que se ejecuta en un entorno manejado y el CLR. Así, se puede utilizar cualquier lenguaje CLR, incluyendo Visual C#, Visual Basic, Visual C++, Visual F# e IronPython."

Descarga e instalación

Para descargar e instalar Microsoft Solver, lo mejor es dirigirse al enlace:


Aquí se puede elegir la versión más conveniente (32 ó 64 bit), y realizar la instalación una vez obtenido el ejecutable correspondiente.

Este ejecutable instala:
  1. En el directorio “C:\Program Files\Microsoft Solver Foundation\3.0.2.10889” se encuentran varios binarios y un directorio "Documents" donde se encuentra mucha documentación interesante.
  2. En el directorio “C:\Users\nombre.usuario\Documents\Microsoft Solver Foundation” instala varios ejemplos, tanto en Excel como resueltos en varios lenguajes de programación.
  3. Registra en la GAC la librería "Microsoft.Solver.Foundation.dll", que es la que se puede incluir en nuestros proyectos .Net para la optimización y modelización.
También es muy interesante que esta instalación provee de un Add-In para Excel, que ayuda a la modelización en esta herramienta, y permite la posterior exportación del modelo definido en Excel a XML o a C#.

En este artículo se va a profundizar primero en el modelado utilizando el Add-In para Excel y su posterior exportación y uso en un proyecto C#.

Add-In para Excel

Si se realiza la instalación de Microsoft Solver, incluye un Add-In para Excel. Para que este Add-In funcione correctamente, es necesario cumplir los siguientes prerrequisitos mínimos de software instalado en el sistema:
  1. .NET Framework 4.
  2. Excel 2007 or Excel 2010.
  3. Microsoft Office primary interop assemblies. 
  4. Visual Studio 2010 Tools for Office Runtime o Visual Studio Tools for Office system (version 3.0 Runtime).
Si está correctamente instalado, en la sección de Complementos de Excel se podrá ver como un complemento más:


Además hay una nueva barra de herramientas, "Solver Foundation", con todas las opciones disponibles para este complemento:


Pulsando sobre el botón "Model" , además, se mostrará/ocultará el Panel de Modelado, herramienta fundamental para definir el modelo que resolverá Microsoft Solver:


La mejor forma de ver cómo utilizar este Add-In es pasar a la acción, ayudándonos de la documentación disponible, así que ¡¡allá vamos!!

Problema a resolver

En una pastelería se hacen dos tipos de tartas: Vienesa y Real. Cada tarta Vienesa necesita un cuarto de relleno por cada Kg. de bizcocho y produce un beneficio de 250 Pts, mientras que una tarta Real necesita medio Kg. de relleno por cada Kg. de bizcocho y produce 400 Ptas. de beneficio. En la pastelería se pueden hacer diariamente hasta 150 Kg. de bizcocho y 50 Kg. de relleno, aunque por problemas de maquinaria no pueden hacer más de 125 tartas de cada tipo. ¿Cuántas tartas Vienesas y cuántas Reales deben vender al día para que sea máximo el beneficio?

Lo primero de todo es plasmar en una tabla la información recibida:


Para Microsoft Solver es importante definir una columna "Id" para indizar los datos y que pueda identificar posteriormente cada fila mediante este índice.

Pasos para definir el modelo

1) Lo primero a definir es un Conjunto de Datos, en la pestaña "Sets":

En el caso del problema planteado, el dominio es "Nonnegative Real", es decir, números reales no negativos.

2) Parámetros. En la pestaña "Parameters" se definen los parámetros de entrada del modelo. Para el enunciado dado, se van a definir los parámetros Relleno y Beneficio:
2.1) Se nombra el parámetro y se elige su dominio.

2.2) Ahora se realiza el Binding, enlazado de datos de entrada. Pulsando sobre el botón "..." se accede al "Binding Editor", que recuerda mucho al editor de fórmulas del propio Excel, o a la selección de datos cuando se define un gráfico en Excel. Se elige toda la tabla del modelo como Rango, como Conjunto el que se ha definido en el paso 2.1), como "Column Header" la columna índice "Id" y como "Value Field" la columna del parámetro definido, en este caso "Relleno":

Se hace lo mismo con todos los parámetros necesarios:

3) Variables de decisión. Es el elemento desconocido en el problema de optimización, en este caso la "Cantidad". Todo esto se define en la pestaña "Decisions", de la misma forma que se han introducido los parámetros en el apartado 2):

Hay problemas en los que las variables de decisión pueden definir un valor inicial que ayude a reducir el tiempo que el algoritmo tarda en resolver el modelo, si fuera así se establecería en "Initial Value". 


4) Restricciones. En la pestaña "Constraints" se definirán las restricciones del Modelo. Para el enunciado dado se tiene:

4.1) La suma de los bizcochos no puede superar las 150 unidades.
4.2) La suma del relleno no puede superar las 50 unidades.
4.3) No se pueden hacer más de 125 tartas de cada tipo.
4.4) Las cantidades deben ser números enteros positivos.

Para definir las restricciones, y el posterior punto 5), Goals, es interesante tener conocimientos sobre  la sintaxis OML (Optimization Modeling Language). Al respecto, es conveniente consultar:

- Al instalar Microsoft Solver Foundation, en el directorio “C:\Program Files\Microsoft Solver Foundation\3.0.2.10889\Documents” hay un PDF "MSF-OMLSyntax.pdf" que detalla todas las funciones y sintaxis definidas para este lenguaje.
- La documentación on-line de Microsoft: https://msdn.microsoft.com/en-us/library/ff524507(v=vs.93).aspx

De esta forma, por ejemplo, para definir la restricción 4.1), se haría de la siguiente forma:

Y así con el resto de las restricciones. Hay que tener en cuenta que mediante las flechas estas restricciones se pueden ordenar y así el modelo se resolverá según el orden definido para las restricciones:

5) Goals. La función objetivo es maximizar el beneficio, y se define de la misma forma que las restricciones:

Modelo definido y resolución

El modelo ya está definido.

La pestaña "Directives" permite, si se considera necesario, definir directivas en función del algoritmo de resolución empleado:

La pestaña "Model" permite ver este modelo en lenguaje OML (Optimization Modeling Language), permitiendo la edición manual, aunque si no se tiene mucho conocimiento de este lenguaje es mejor dejarlo en Automático:

El botón "Check" de la barra de herramientas "Solver Foundation" permite verificar si el modelo recién definido es válido, esto se ve en la pestaña "Log":

Una vez verificado, el botón "Solve" realiza la resolución del modelo.


Microsoft Solver añade una pestaña al Excel donde se ven los resultados de la resolución del Modelo. También se ve en la pestaña de Log los pasos seguidos para su resolución. Además, en la hoja Excel donde se define el Modelo, ahora se ven las variables de decisión rellenas con la solución encontrada:


Si se establece un valor inicial para la/s variable/s de decisión (en el ejemplo sería  Cantidad Inicial), es probable que se encuentren otras soluciones válidas para el modelo:


Y de esta forma, el Add-In para Excel de Microsoft Solver muestra su potencia a la hora de resolver modelos matemáticos.

Si fuera necesario, el modelo obtenido se puede importar o exportar a un fichero de extensión .oml, mediante los botones "Import" y "Export" de la barra de herramientas de Solver Foundation.

Obtención del Modelo en C#

El Add-In para Excel de Microsoft Solver, permite, utilizando el botón, exportar el modelo obtenido a un fichero .cs y a un fichero .xml:


Si se edita el fichero .cs, se puede ver que se tiene la definición y resolución del modelo en C#, utilizando las librerías de Microsoft Solver Foundation:


De esta forma, se puede llevar fácilmente al proyecto .Net en el que se quiera utilizar. A mí me ha pasado que normalmente he tenido que hacer algunas adaptaciones, pero como primer paso ahorra mucho trabajo, sobre todo en la definición de Constraints (variables de restricción) y el Goal (función objetivo).

Adjunto un ejemplo en proyecto de Consola .Net en el que se puede ver tanto el Modelo definido en este artículo como su resolución. También adjunto el Excel que se ha visto con el modelo definido.


Saludos y ¡hasta la próxima!

domingo, 26 de junio de 2016

Raspberry Pi 3: Primer contacto


Llevo bastante tiempo observando las placas Raspberry Pi, y hace un par de semanas me surgió una oportunidad para poder utilizar una de ellas y convertirla en un centro multimedia.

Para este proyecto utilicé la última versión: Raspberry Pi 3, que ya tiene integrado tanto WIFI como BLUETOOTH.

Compré todo a través de Amazon:

  • Un pack casi completo con la placa, fuente de alimentación, caja, tarjeta sd,... Podéis verlo en el siguiente enlace.
  • Unos disipadores. Es lo único que le falta al pack anterior. También lo tenéis aquí.

Me llegó todo en el plazo previsto y en perfecto estado. Y aprovechando la ocasión hemos hecho un vídeo con el unboxing:



Aquí tenéis todos los componentes:


La caja es una auténtica maravilla, se desarma totalmente, la placa encaja perfectamente y tiene todos los detalles muy cuidados. Los pequeños tacos de goma que incluye para las "patas" están muy bien pensados.





Antes de comenzar, le pegamos los disipadores a la placa. El método es bastante sencillo, como si fueran pegatinas. Los disipadores que pedí no eran para este modelo, y nos sobró uno.



Después conectamos la placa a la televisión a través del HDMI, a nuestro router por el cable de red, a un teclado y por último a la toma de red, que enchufamos.


Y después de unos segundos en pantalla teníamos una lista de sistemas operativos para instalar en nuestra plaquita. Teniamos Raspbian, LibreELEC e incluso Windows 10.



Nosotros seleccionamos LibreELEC.


Y empezó la instalación.


En menos de cinco minutos ya teníamos el sistema instalado.


Reiniciamos y ya teníamos por defecto un sistema operativo que lo único que tiene es KODI. ¿Qué más se le puede pedir a un centro multimedia?

En la SD de Amazon, venia preinstalado NOOBS (https://www.raspberrypi.org/downloads/noobs/), gracias a esto aparecen los sistemas operativos disponibles para instalar. 

Una vez verificado su funcionamiento, apagamos la placa, desconectamos todos los cables y empezamos a montarla dentro de su caja.





La verdad es que más simple imposible.



Como punto fuerte comentaros que gracias a la tecnología HDMI CEC, podéis controlarla con el mando a distancia de la televisión. Lo que hace que sea una elección magnifíca.


jueves, 2 de junio de 2016

Salvapantallas en C#

Aunque este artículo debería ser de Rebeca (la experta en .Net del grupo), lo estoy escribiendo yo. En mis inicios (ese año 2000) pasé unos años programando en Visual Basic 5 y 6, y años después hice un par de cursos en C#.

La verdad es que todo surgió hablando un día con Rebeca sobre el Visual Studio, siempre he pensado que es el mejor IDE del mercado, pero con un coste muy elevado. Hasta ahora, que puedes descargarte una versión casi profesional sin pagar ni un euro.

Total que me he decidido a probarlo, y casi dos horas de instalación después ya tengo el Visual Studio instalado, con posibilidad de hacer cualquier desarrollo.



Lo primero que he intentado hacer es un Servicio Windows, no viene instalado de fabrica, pero en el propio entorno, puedes añadirlo y en unos segundos ya tenía la plantilla lista para empezar el desarrollo.

También me ha sorprendido mucho, la posibilidad de desarrollar aplicaciones Android. 

Volviendo al tema que nos ocupa: crear un salvapantallas. Así definiría yo uno:
  • Un salvapantallas de Windows es una aplicación que tiene tres funcionalidades:
    • Mostrar la configuración en un "dialog box"
    • Una previsualización
    • Visualización en pantalla completa
  • Su extensión es "scr"
  • Tiene que estar en Windows\system32 o en Windows\SysWOW64 dependiendo del sistema operativo (32 o 64 bits)
El mio va a ser muy sencillo, lo único que queremos hacer es que una vez abierto cambie de color cada dos segundos.

Para conseguir esto vamos seguir lo siguientes pasos:
  1. Nos creamos una aplicación de Windows Forms
  2. Configuramos el formulario para que esté maximizado y no se vean los controles de la esquina
  3. También le ponemos un color por defecto.
  4. Añadimos un temporizador, lo habilitamos y le ponemos un intervalo de 2 segundos
La parte más complicada es la de previsualización, ya que hay que tirar de componentes que interactúan con la API de Windows, para la posición, etc, etc. Esta parte ha sido un copy/paste.

Todo el código está en nuestro repo: https://bitbucket.org/tecnificados/public, en la carpeta "ScreenSaveNet".

A partir de ahora no voy a descartar el utilizar .Net para realizar algunas aplicaciones.

Espero poder probar a desplegar alguna aplicación web de .Net pronto en Apache.

Ya os contaré.

jueves, 31 de marzo de 2016

Extracción de datos con Import.io



Los desarrolladores a veces necesitamos información para realizar nuestras tareas, pero no la tenemos disponible en una fuente de datos tal y como nos gustaría.

Ejemplo: llevo tiempo queriendo hacer un "simulador" de la bolsa con el IBEX 35, para esto lo ideal sería tener una API en tiempo real (o casi) que nos fuera devolviendo los valores actuales de cada valor. Una API en JSON gratuita que nos permita esto no existe (o yo no la he encontrado).

Y para esto hay una herramienta de terceros llamada Import.io que nos puede ayudar.

Vamos a seguir con nuestro ejemplo. Hay muchas páginas que tienen los datos de los valores del IBEX-35, yo voy a elegir ésta: http://www.infobolsa.es/acciones/ibex35



Ahora nos vamos a la página web de Import.io, y en el campo donde está escrito "Enter an URL..." escribimos la URL de nuestra página y pulsamos el botón "Try it out". Después de unos segundos veremos la siguiente pantalla:



En ella vemos todos los datos correctamente extraídos de la página. Al final aparece el botón "Save", si lo pulsamos nos llevará a la página de alta en el servicio (es gratis).


Una vez dados de alta, veremos nuestro panel de control, que contiene nuestra URL. Arriba a nuestra derecha, podremos ver estos botones:


Si pulsamos en el botón "Run URLs". Nos llevará a la sección "History" donde veremos la cantidad de datos extraídos en esta ocasión:



En el enlace "Download" podremos escoger el formato de los datos a descargar:


¿Podemos pedir más? Si, una API. Pues para esto nos vamos a la Sección "Integrate" y allí tendremos nuestra URL para hacer peticiones a nuestros datos. Que nos serán devueltos en JSON:



Esta llamada devuelve los datos de la última extracción.

Para terminar lo ideal sería poder decirle a Import.io que nos refresque nuestras URLs automáticamente cada X minutos, pero esto aún no lo tienen implementado, aunque están en ello. 

De momento tendremos que hacerlo manualmente.

Aunque para mi proyecto de Simulador Bursátil no me vale, podemos sacarle mucho partido en otras situaciones.

lunes, 29 de febrero de 2016

Aplicaciones móviles con INTEL XDC



Ya llevo dos cursos para realizar aplicaciones móviles: "Desarrollo de aplicaciones en Android", y "Apps en Firefox OS". La gracia que tenía el último, es que desarrollabas en HTML5, empaquetabas tu proyecto en un zip, y ya tenías el instalador.

Por desgracia Firefox OS, no ha triunfado, pero la idea de HTML5 como base para una APP me parecía muy sencillo y potente.

En esta idea se basan las aplicaciones híbridas. Aunque soy más partidario de las nativas, reconozco que es mucho más rápido desarrollar para varias plataformas con este modelo.

Navegando por la web he encontrado Intel XDK, un IDE de desarrollo en HTML5 que utiliza librerías como Apache Cordova para exportar las aplicaciones a distintas plataformas.

Como primera prueba voy a intentar importar una pequeña página web que replica una App muy básica:


Antes de nada tenemos que descargarnos XDK, esto lo podemos hacer desde esta página: https://software.intel.com/es-es/intel-xdk.

Una vez descargado, nos lo instalamos, nos registramos para poder utilizarlo y una vez dentro veremos la siguiente pantalla:



La verdad es que es sorprendente todo lo que podemos llegar a hacer, desde aplicaciones básicas hasta juegos utilizando motores que ya están integrados. La cosa promete.

Nosotros vamos a probar la última opción: "Import Your HTML5 Code Base".

En el primer paso seleccionamos la ruta de nuestro proyecto (la carpeta que contiene el archivo "index.html"), y al cabo de unos pasos básicos más ya tenemos nuestro código importado.


Desde esta pantalla, en el menú de la derecha podemos ejecutar la aplicación en un emulador y ver cómo queda en distintos dispositivos.


En la parte superior hay una serie de pestañas, una de ellas es "BUILD", si la pulsamos nos aparecen todas las opciones para las que podemos construir un instalador para nuestra APP.


Al pulsar el siguiente paso nuestro código se sube a la nube de Intel para un posterior compilado.


Si pulsamos en el botón verde se realizará el paso final y se preparará nuestro instalador.


Último paso, descargar nuestra APP, con un pequeño resumen del estado de la compilación.


Unos minutos después lo he instalado en el móvil, esto es lo que aparecía:


Y así es como se ve cuando se ejecuta:


No me ha quedado muy responsive :(

La verdad es que como primera aproximación estoy muy contento con XDC, tengo que practicar más.