Mono for Android – Desarrollo Kindle Fire

Parámetros y permisos de la aplicación

En el Faq de Amazon Kindle viene más información de la que vamos a emplear en este artículo, puedes visitar el faq accediendo al enlace #1 de la parte inferior del artículo.

Configuración de nuestra aplicación de Android

Arrancamos la ventana de depurado y seleccionamos la opción Create new emulator image:

Create_new_emulator_image

Con esto se iniciará el Android SDK Manager, nos vamos a Tools|Manage AVD, y veremos la pantalla del Android Virtual Device Manager:

Android_Virtual_Device_Manager

En name ponemos Amazon Kindle Fire, Target lo rellenamos con Android 2.3.4 – API Level 10, en Skin resolution ponemos 600 x 1024.

Create_new_Android_Virtual_Device

En hardware añadimos los parámetros:

  • Abstracted LCD density: 169
  • Device ram size: 512 mb

Le damos a Create AVD y ya tenemos listo nuestro emulador.

Bibliografía

#1 – https://developer.amazon.com/help/faq.html

Días de Netduino: Empezando hasta llegar a M2-S2

Introducción

Por fin he conseguido el cable micro-USB que conecta con Netduino. El propósito de utilizar Netduino es que M2-S2 sea desde el principio un robot basado en la tecnología .Net/Mono.

¿Qué es Netduino?

Netduino es una placa basada en Arduino pero que lleva por firmware Microsoft .Net Microframework.

Requisitos para empezar a trabajar

– tener instalado Visual Studio 2.010

– tener instalado Microframework

– tener instalado el SDK de Netduino

– tener un cable micro-USB y un Netduino

Configurando

Tras tener todo instalado, nos vamos a Visual Studio 2.010 y creamos un nuevo proyecto de Micro Framework: Archivo  | Nuevo proyecto | Plantillas instaladas | Visual C# | Microframework.

Para nuestro ejemplo y modelo que vamos a usar, un Netduino normal, es decir, ni Mini ni Plus, seleccionamos Netduino Application.

Preparando para el despliegue

Para desplegar, es decir, cargar el programa en Netduino deberemos tener configurado Visual Studio 2.010 con la siguiente configuración: Solution Navigator, Properties, .Net Micro Framework:

  1. Deployment | Transport |USB

El testo lo dejamos como está.

Traducción: Mono.Addins – Localización de Complementos por defecto

Introducción

Este artículo es una traducción del original disponible en [1], las licencias aplicadas al original se aplican a esta traducción.

mono-logo

La traducción

Mono.Addins incorpora un modelo flexible para indicar donde deberían estar los complementos (add-ins). Por defecto, los complementos están en dos rutas:

  • En la carpeta donde está el ejecutable de la aplicación, es decir, dónde está en .exe.
  • En la carpeta ‘addins’, que es la ruta de registro de los complementos.

Por ejemplo, si una aplicación está instalada en ‘/usr/lib/MiAplicacion/inicio.exe’, y la aplicación inicializa el motor de complementos tal que así:

   1:  AddinManager.Initialize("[ApplicationData]/MiAplicacion");

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, «Courier New», courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

Entonces los complementos se buscaran por defecto es:

  1. /usr/lib/MiAplicacion
  2. ApplicationData/MiApplication/addins

Incluyendo carpetas de complementos

Se pueden añadir rutas para la búsqueda de complementos utilizando el archivo .addins. Un archivo .addins es una archivo XML que se ve tal que así:

   1:  <Addins>
   2:     <Directory>/alguna/carpeta</Directory>
   3:     <Directory include-subdirs="true">/alguna/carpeta</Directory>
   4:     <Directory>../ruta/relativa/carpeta</Directory>
   5:     <Exclude>alguna/carpeta</Exclude>
   6:  </Addins>

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, «Courier New», courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

Cuando un registro está buscando complementos en una carpeta y encuentra un archivo .addins, lo analizará sintácticamente y de manera recursiva buscará en las carpetas declaradas, que a su vez incluirán archivos .addins. La etiqueta Directory se usa para declarar nuevas carpetas, esta búsqueda no es recursiva por defecto, para activar la búsqueda recursiva utilizamos el atributo include-subdirs. La etiqueta Exclude se usa para no buscar en una carpeta determinada, puede ser una ruta o un archivo.

Patrón de Diseño: Model View ViewModel (I)

logo

Introducción

El patrón de diseño Modelo Vista VistaModelo es usado por las tecnologías Windows Presentation Foundation, Silverlight y Moonlight. Es un patrón de interfaz de usuario como lo son Modelo Vista Controlador o Modelo Vista Presentación. En este post vamos a ver su uso en WPF/Silverlight/Moonlight.

El patrón MVVM

El patrón MVVM e compone de 3 elementos:

  1. El Modelo es la entidad que representa el concepto de negocio, puede ser cualquier cosa desde una entidad usuario hasta una entidad compleja de almacenaje (que contiene a su vez otras entidades).
  2. La Vista es la representación gráfica del control o un conjunto de controles que muestran el Modelo de datos en pantalla. Una vista puede ser desde un ventana de WPF, una página con Silverlight o una plantilla de un control de datos en XAML. La Vista es un observador (Observer) de la VistaModelo, tan pronto cambie la VistaModelo la interfaz de usuario se actualiza, para esto debe implementar el interfaz INotifyPropertyChanged e implentar el evento PropertyChanged.
  3. La VistaModelo es la que une todo. Contiene la lógica del interfaz de usuario, los comandos, los eventos y una referencia al Modelo. En MVVM, la VistaModelo no se encarga de actualizar los datos mostrados por el interfaz de usuario.

Proyecto en Moonlight bajo MonoDevelop

MonoDevelopLogo

Nota: la librería Moonlight no está disponible directamente para su uso cuando inicias un proyecto Moonlight en MonoDevelop, hay que obtenerla compilando el proyecto Mono, para más información recomiendo la lectura del enlace [2].

Creando la solución

Seleccionamos el menú Archivo|Nuevo|Solución, en la Ventana de Nueva Solución picamos en C# y posteriormente en Moonlight, teniendo dos posibles opciones:

  1. Librería de Controles: una librería con controles XAML sin ejecutables.
  2. Aplicación: una aplicación con un punto de entrada de ejecución.

Agregando las referencias

Para solventar la incidencia de las referencias bajo Windows, puedes utilizar tu instalación de Silverlight disponible en la ruta “C:\Archivos de programa\Microsoft SDKs\Silverlight\v2.0\Reference Assemblies”si tienes instalada la versión 4 o cualquier otra posterior a la 2 saldrá un mensaje de error informándote que requiere Moonlight 3 o Silverlight 2.

Tendrás que eliminar las referencias que vienen por defecto en el proyecto, e insertar las nuevas utilizando el apartado de Ensamblados .Net. Quedando las referencias como siguen:

silverlight_referencias

Pero…

Seguimos sin poder compilar debido a que surge un mensaje de error que nos dice lo siguiente:

Error: Framework ‘Silverlight 2.0’ not installed. (EjemploMoonlight)

Sin embargo si está instalado el SDK, una vez navegas por el foro de Mono te encuentras con que no está implementado el backend para proyectos Silverlight, y alguien debería hacerlo [1]:

Ideally someone would implement a SilverlightFrameworkBackend for the
DotNetTargetRuntime, so that MD could find the Silverlight SDK
assemblies. This would be very easy, but I don’t have time to do it
myself right now.

Editando el complemento Moonlight para MonoDevelop

Es necesario bajarse el código fuente de MonoDevelop de GitHub que parece la versión más actualizada del proyecto y preparar el entorno de desarrollo para Windows.

Pero eso será otra historia.

Bibliografía:

Building Enterprise Applications with Windows Presentation Foundation and the MVVM – Raffaelo Garofalo – Microsoft Press – ISBN 978-0-735-65092-3

Enlaces

[1] – http://go-mono.com/forums/#nabble-td1508851

[2] – http://go-mono.com/forums/#nabble-td2323130

Imagen Logo Moonlight: http://www.go-mono.com/moonlight/

Imagen Logo MonoDevelop: http://www.monodevelop.com

CartujaDotNet: Grupo de Usuarios de .Net en Sevilla

3_1

Introducción

@cartujadotnet es el grupo de usuarios de .net de Sevilla, por lo menos el único por ahora. Hoy hemos quedado 2 de los coordinadores de Cartuja Dot Net y otros programadores de .Net de Sevilla, aunque finalmente sólo hemos contado con la gran presencia de @jmaguilar, autor del blog Variable Not Found e impartidor de cursos en Campus MVP de Krasis.

Contacta con el grupo de usuarios

Para contactar con el grupo de usuarios, puedes seguir la cuenta @cartujadotnet a tu cuenta de twitter, acceder a la web del grupo de usuarios en facebook o escribir un correo electrónico a la dirección cartujadotnet@groups.facebook.com

Próximas charlas

Las charlas de @cartujadotnet las dan los propios componentes del grupo de usuarios, la temática de las charlas impartidas hasta ahora versan desde la robótica con Microsoft Robotics Studio, pasando por la programación en Gtk#, programación del puerto serie… todas ellas impartidas por profesionales que tienen a .Net presente en su vida profesional.

mfa-pro

La siguiente charla que impartirán los miembros de @cartujadotnet versará sobre "Programación de Android en .Net", la inscripción será obligatoria y limitada debido a que el espacio es cedido por una pequeña empresa sevillana dedicada a los blogs corporativos.

Imagen Logo .Net: www.microsoft.com

Imagen Logo Mono Android: http://mono-android.net

Definiendo el estado del servicio [traducción]

Introducción

Esta traducción es un pequeño fragmento del libro “Professional Microsoft Robotics Developer Studio” que he leído. Corresponde al capítulo 3 de dicho libro, Decentralized Software Services. El servicio es el bloque de construcción básico de MRDS, espero que esta pequeña traducción ayude a comprender mejor esta magnifica herramienta de Microsoft.

Traducción

El concepto de estado de servicio implica que debería contener toda la información necesaria para permitir salvar el estado, reiniciar el servicio posteriormente y cargando el estado salvado, continuar con la ejecución donde el servicio se apagó. El estado del servicio está disponible vía las operaciones Get y HttpGet. La operación Get está pensada para ser usada de manera programática, mientras que HttpGet está pensada con propósitos humanos, viendo el estado observando un navegador web.

La forma más simple, es mostrar el estado como un XML. Además, se puede iniciar el servicio sin necesidad de programar un interfaz de usuario. […]

[…]los siguientes pasos sirven para definir el estado de un servicio:

  1. Abres ServiceB en Visual Studio, dentro de éste el archivo llamado ServiceBTypes.cs.
  2. Baja el puntero hasta el estado del servicio y añade dos líneas como se puede ver aquí:

/// < summary >
/// The ServiceB State
/// < /summary >
[DataContract()]
public class ServiceBState
{
	[DataMember]
	public int Interval; 	// definido como público y
	[DataMember] // decorado con el atributo DataMember
	public int SensorValue;
}

 

Estos campos son parte del contrato del servicio y pueden ser serializados (a XML)cuando el estado es salvado o enviado en un mensaje.Si se declaran como privados serán ignorados durante la serialización.

Los puristas prefieren realizar una declaración como la siguiente:

private int _interval;

[DataMember]
public int Interval
{
	get { return _interval; }
	set { _interval = value; }
}

 

Debemos tener en cuenta que el atributo [DisplayName] únicamente puede ser aplicado a una propiedad no a un campo público.

3. Ahora el estado para el ServiceB contiene algunos campos, volvemos a ServiceB y rectificamos la función MainLoop como se muestra:

// Global flag to allow terminating the Main Loop
private bool _shutdown = false;

private IEnumerator < ITask > MainLoop()
{
	Random r = new Random();
	while (!_shutdown)
	{
		// Generate a random number from 0-100 and save it in the state
		_state.SensorValue = r.Next(100);
		Console.WriteLine(“B: “ + _state.SensorValue);
		// Wait a while
		yield return Arbiter.Receive(
			false,
			TimeoutPort(_state.Interval),
			delegate(DateTime time)
			{ }
		);
	}
}

 

Los cambios son como siguen:

  • Hemos añadido una bandera llamada _shutdown.
  • El bucle while ahora usa dicha bandera y puede finalizar.
  • Los valores aleatorios pueden almacenarse la propiedad state SensorValue.
  • El el intervalo del timer es leído desde la propiedad state Interval.

[…]

CNC e Impresora 3D: para construir el R2D2 debo primero hacer las máquinas que lo construyan

Introducción

En este artículo planteo como he planeado construir el R2D2 que utilizaré para mi boda, el objetivo es compartir el proceso y recibir feedback de una comunidad que no se si existe en mi cercana Sevilla (capital).

Cómo empezó todo

Empecé hace ya 3 años a hacer pruebas con Robotics Studio de concepto para tener un prototipo, además aproveché para dar charlas en la Universidad de Sevilla sobre robótica, tanto en la Facultad de Informática como en la Facultad de Ingenieros. Tras estas charlas contacté con la comunidad, por un lado con Esibot y por otro con el recién creado grupo de Robótica del Club .Net, que se creo tras una de mis charlas.

El proceso

El proceso es bastante sencillo, he diseñado el siguiente plan para ir consiguiendo crear mi R2D2 (modelo en realidad 1K-3A):

  • Redimensionar los planos para las nuevas especificaciones del dome: para quien no lo sepa el dome es la cúpula superior de R2D2, yo he utilizado una ensaladera de IKEA que tiene ese toque de aluminio. Los planos están disponibles en www.astromech.net
  • Construir la CNC según las planos disponibles en http://wiki.makerbot.com/cupcake: una máquina CNC es una máquina de control numérico por ordenador que permite realidad cortes de manera exacta en distintos materiales.
  • Construir la impresora 3D para crear las piezas más detalladas en plástico. También de la misma gente de MakerBot.
  • Crear el driver para Linux de estas dos máquinas que parece que solo funcionan con puerto paralelo y yo tengo puertos USB en el portátil.
  • Hacer todas las piezas e ir ensamblando.
  • Optimizar el sistema de servomotores y placas.
  • Reconocimiento visual.
  • Conectar a base de conocimiento.
  • WebServices.

Software

Mi intención es hace dos versiones del robot,  por un lado una basada en .Net y otra basada en Linux. Ya dispongo de dos placas para ir realizando experimentos una placa Arduino y otra Netduino. La lista de tareas son las siguientes:

  • Realizar driver para Linux USB de CNC.
  • Realizar driver para Linux de Impresora 3D.
  • Realizar versión Linux: ROS.
  • Realizar versión para .Net: Microsoft Robotics Studio.

Cosas ya hechas

Ya tengo un modelo en 3D para Robotics Studio con el que estoy realizando cálculos y pruebas.

Plazo: 1.5 años

31 días como MonoDroid: tercer día, configurando tu android para depurar

Introducción

En este artículo vamos a seguir los pasos indicados en [1] en un dispositivo real con Android. Concretamente un HTC Magic con la versión 1.6 de Android.

Para empezar a configurarlo tenemos que ejecutar el archivo por lotes android.bat que se encuentra en el directorio de instalación del SDK de Android, en mi caso está en la ruta C:\android-sdk-windows\tools

Ejecutamos Android.bat y aceptamos los permisos:

A continuación nos aparece una ventana de Terminal de Windows (CMD) y la ventana de configuración de dispositivos:

Miramos los paquetes que tenemos instalados en Installed Packages y si no está instalado USB Driver Package lo instalamos seleccionando la opción Avaliable Packages. En mi caso, ya lo tengo instalado:

Ahora pasamos a configurar nuestro Android, para ello seguimos los siguientes pasos:

Ajustes | Aplicaciones | Desarrollo | Depuración USB

Automáticamente Windows 7 buscará el driver:

Si nos vamos al Panel de Control|Administrador de Dispositivos lo podemos ver instalado:

Ya podemos pasar a depurar nuestra aplicación en nuestro Android.

Referencias

[1] – http://monodroid.net/Documentation/Set_up_Device_for_Development

31 días con MonoDroid: día 2 realizando la primera aplicación real

Introducción

Ya existen vídeos en  Youtube de cómo realizar aplicaciones para MonoDroid, justamente uno de esos videos me ha servido como guía para realizar la primera aplicacion, que es un cliente de Twitter. Parece que los clientes de Twitter se están convirtiendo en los Hola Mundo 2.0 de la era de Internet.

Aquí os dejo el vídeo, y despues de este paso a detallar los inconvenientes que me he encontrado en la codificación.

Pasos que no vienen descritos en el vídeo

  1. Es necesario instalar NuPack y Pro Power Tools para encontrar los paquetes que no están instalados por defecto, en este caso se usa para tratar con JSon.
  2. Además el nombre de dicho paquete es diferente al que usa en el vídeo.

Enlaces

El vídeo: http://www.youtube.com/watch?v=TKXgugOj56I

Los complementos para Visual Studio 2010:

31 días con MonoDroid: día 1 Instalación de MonoDroid

Introducción

Para trabajar con MonoDroid es necesario que se disponga del siguiente software instalado en el equipo:

Una vez tengamos instalado Visual Studio y el SDK podemos instalar MonoDroid siguiendo tres sencillos pasos según se puede ver en las imágenes inferiores:

Hay que configurar una serie de parámetros una vez estemos desarrollando bajo Visual Studio, toda esta información está disponible más detalladamente en la web de MonoDroid.

Desarrollando la primera aplicación

Una aplicación bajo Android para mostrar una pantalla debe tener una Activity, la cual se encarga de cargar el interfaz de usuario disponible en un archivo XML. Pero antes de entrar a ver cómo es internamente el código fuente de una aplicación en MonoDroid, vamos a crear un nuevo proyecto Archivo | Nuevo |Proyecto, y seleccionamos la plantilla que vemos en al imagen:

Ahora le damos directamente a Iniciar Depuración (F5), MonoDroid nos solicitará la imagen que vamos a cargar en el emulador (podemos crear una facilmente) y tras esto tendremos nuestra primera aplicación en MonoDroid funcional.

Y como resultado tenemos nuestra aplicación funcionando…