Archivo del Autor: Roberto Luis Bisbé

Acerca de Roberto Luis Bisbé

Software Developer, Computer Engineering student

Datos locales en apps Windows Store (C#). Lectura y escritura de ficheros

Las aplicaciones Windows Store pueden, además de almacenar ficheros con clave valor o mediante serialización como hemos visto en otros artículos, trabajar directamente con ficheros en 3 carpetas que tenemos a nuestra disposición:

  • Local: Se almacena en un directorio local al cual solamente tiene acceso nuestra app.
  • Roaming: Se almacena de manera local, aunque esos contenidos se sincronizan entre los diferentes dispositivos que tengan nuestra cuenta live id. Si tenemos un juego, y queremos mantener el estado de la partida sincronizado, podremos usar esta carpeta.
  • Temp: Se almacena de manera temporal, y se pueden borrar cuando la app esté cerrada.

En este artículo veremos cómo acceder a los ficheros almacenados en estas carpetas, y como hacer operaciones de lectura y escritura en los mismos.

Sigue leyendo

Merges un poco más inteligentes para C#

Las operaciones de merge son muy comunes en los sistemas de control de versiones distribuidos, y si hay muchos cambios a nivel de pocos ficheros (equipos trabajando en una misma funcionalidad) podemos tener muchos conflictos. Para ayudar a mejorar la productividad en estas operaciones ayer hemos anunciado la disponibilidad a todo el público de la beta de SemanticMerge.

La idea es simplificar la resolución del conflicto entendiendo el código, resolviendo de manera automática aquellos en los que sea posible y permitir al usuario, de manera sencilla, encargarse de los conflictos restantes. En este artículo veremos de un vistazo la herramienta sus características, los casos que cubrimos y cómo la hemos desarrollado.

Una interfaz sencilla

La herramienta, formada básicamente por un panel donde se muestran los conflictos y diferencias, y un visor de código, permite por una parte resolver conflictos, y por otra ver en detalle los cambios sucedidos en cada fichero respecto a la base.

Para ayudar al usuario, cada conflicto tiene, en la cabecera, un campo identificado por una letra y un color por cada cambio que lleven al conflicto, en el ejemplo, un cambio concurrente en un método.

Semantic Merge tool

La magia

Para poder mostrar estos conflictos y resolver de manera automática aquellos en los que sea posible, analizamos los ficheros que el usuario nos pasa por parámetros, o a través de la pantalla inicial, si iniciamos sin parámetros (origen, destino y base).

Una vez hemos leído los ficheros y comprobado que no haya errores de análisis, creamos, para cada uno, un árbol semántico, similar a la ventana de clases que se puede ver en Visual Studio.

Semantic tree

Ya con estos árboles, comparamos el origen y el destino con la base para obtener lo que denominamos un árbol de diferencias. Finalmente comparamos estos árboles de diferencias para obtener los posibles conflictos y las diferentes formas de solucionarlos.

Escenarios

Hemos empleado cientos de horas de análisis, y procesado millones de repositorios para obtener las operacions y los conflictos más comunes, entre los que destacan:

  • Movidos divergentes: Si estamos haciendo refactor de nuestro código y movemos a diferentes partes del mismo (desarrollador A los prefiere por orden alfabético y desarrollador B los prefiere por orden de scope) detectamos el cambio y damos al usuario la opción de elegir.
  • Movidos/borrados: En caso de que un elemento (método, clase…) se haya movido en origen y se haya borrado en destino, lo detectamos y damos al usuario la opción de conservar el movido o el borrado.
  • Movidos + cambiados: En el caso de que un desarrollador mueva un método a otra clase y otro realice cambios en el mismo, se detectará automáticamente, y no habrá conflicto :)

Hay mucho más, disponible en semanticmerge.com

Integración

De momento, tenemos tutoriales sobre cómo integrarlo en Git, PlasticSCM, TFS y Perforce, y pronto deberíamos tener para Mercurial y SVN. Si usas otro sistema de control de versiones, avísanos!

Personalización

Mediante los parámetros de entrada, podemos especificar una herramienta de diff y merge personalizada, a través de los parámetros -emt y -edt de entrada. Además se puede especificar el tipo de fichero que estamos procesando aunque no tenga la extensión adecuada mediante el parámetro -t. En estos momentos el único lenguaje de programación soportado es C#, así que en este caso el único valor válido será text/csharp.

One more thing: Diferencias semánticas

Otra de las cosas que incorporamos es una herramienta de diff, que dados dos ficheros nos permite obtener las diferencias entre ellos.

difftool-included

Cómo se hizo

Aunque la idea ha estado en fase de análisis y diseño varios años, el desarrollo principal del proyecto se ha llevado a cabo en los úitimos 6 meses, en el que una buena parte del equipo de Códice ha estado implicada. Hemos estado divididos en dos grupos, uno encargado de las operaciones de merge y del backend de la herramienta, y otro grupo, que hemos estado cubriendo el diseño y la usabilidad de la herramienta.

Además, llevamos varias semanas usando la herramienta como herramienta de merge por defecto de manera interna, y las primeras betas privadas que distribuimos han tenido una acogida muy buena por parte de los voluntarios.

Bajo el capó

El lenguaje usado para todo el desarrollo de la app es C#, de ahí nuestro interés con que sea el primer lenguaje de programación soportado (llevamos semanas probando la herramienta a nivel interno).

La interfaz está desarrollada en WPF con algunos toques de Windows Forms, y para la ventana sin marco usamos la integración con Windows a través de Windows.Shell.

Las herramientas utilizadas han sido PlasticSCM como control de versiones, Visual Studio 2010 – 2012 como entorno de desarrollo y Blend 4 como herramienta de diseño de interfaces,

Pasos adicionales

Estamos en fase beta, con lo cual hay muchas cosas que pulir, además seguimos trabajando en mejorar la herramienta, la usabilidad, el diseño, la velocidad, así como el soporte para lenguajes adicionales y escenarios más complejos. Para ello hemos habilitado un portal en uservoice para recibir feedback de nuestros usuarios.

Desarrollo para Firefox OS: Primer contacto

See this post in english here

El pasado 20 de marzo tuve la oportunidad de asistir a los Firefox OS App Days de Valladolid, donde, tras unas cuantas sesiones de introducción, tuvimos un hackatón donde pudimos tener un primer contacto con la plataforma.

La plataforma

Firefox OS es, dicho de una manera sencilla, un núcleo de Android y un navegador, con lo cual todo el sistema, incluida la pantalla de inicio, están hechos en HTML5, CSS y Javascript. La diferencia fundamental con un navegador que se ejecute en Android o iOS, es que tenemos acceso mediante las API de Firefox OS a todas las funciones del teléfono, contactos, calendario, etc.

Desarrollo: Lenguajes, herramientas y simulador

El desarrollo es como el de cualquier aplicación web, es decir, HTML + CSS + Javascript, de manera que podemos extenderlo usando LESS, SASS, jQuery, Sencha… Para empezar no necesitamos más que un editor de texto y Firefox para depurar, ya que el motor de renderizado del teléfono es exactamente igual que el de la versión para escritorio.

Sin embargo, hay cosas que no se puedan probar en un navegador convencional, y para ello contamos con un simulador, que se instala como un complemento de Firefox y nos permite probar nuestras aplicaciones.

Building Blocks

Mozilla ha preparado, de manera adicional, algunas plantillas CSS para los elementos comunes (listas, botones, cabeceras, mensajes de diálogo) de manera que nuestra aplicación tenga un aspecto nativo y se integre con el estilo del sistema. Es importante destacar que tendremos que copiar manualmente los ficheros CSS, ya que de momento no contamos con ninguna plantilla vacía. 

Mi primer proyecto

Tras la sesión de introducción pasamos al hackathon, poco menos de dos horas para desarrollar una pequeña aplicación y empezar a trabajar. Mi primer proyecto consiste en una pequeña lista de tareas:

  • Los estilos están tomados del repositorio de Github de Gaia, que es como se llama la Interfaz de Usuario de Firefox OS.
  • Las animaciones y el cambio de página se hacen con una combinación de transformaciones CSS y Javascript, ayuda de los chicos de Mozilla y Telefónica I+D que estaban en el evento.
  • Para gestión de la lista he empleado knockout.js para gestionar la lista de tareas y el proceso de agregar una nueva.

El resultado es lo que se aprecia en las capturas de pantalla:

newTask mainWindow

Siguientes pasos

Esto es poco más que un hola mundo, para que la aplicación fuese funcional necesitaría guardar los datos, y se podría extender enlazando las tareas con acciones del calendario. Hay muchas cosas que se pueden hacer, y parece una plataforma interesante.

Enlaces

Desarrollando para Windows Phone 8, muchos errores y algún acierto

Este fin de semana he tenido la ocasión de desarrollar una pequeña aplicación de tareas para Windows Phone 8 para el concurso de desarrollo IAppYou. Como todo desarrollo, no ha estado libre de errores, así como de algún acierto que me gustaría repetir en el futuro, así que más que hablar de características o de cómo pasar información entre dos páginas, me pareció interesante compartir los aciertos, pero sobre todo, los errores.

Sigue leyendo

Presentamos GitSync: Ahora PlasticSCM habla Git

index

En Códice Software desarrollamos Plastic SCM, un sistema de control de versiones enfocado a un entorno corporativo, que comparte filosofía con sistemas como Git o Mercurial, al ser un sistema pensado para su uso de manera distribuida.

A diferencia de estos, contamos con una serie de características dirigidas a entornos corporativos, por ello, nos adaptamos a sus infraestructuras integrándonos con mecanismos de autenticación existentes como LDAP o Active Directory, así como los diferentes sistemas de bases de datos disponibles, desde soluciones embebidas como Firebird o SQL CE, hasta soluciones basadas en Oracle. Además tenemos nuestra propia capa de seguridad a nivel de repositorio, rama o servidor, de tal manera que se pueden aplicar permisos específicos a diferentes roles de usuarios (por ejemplo, la rama de integración solamente la pueden tocar los chicos de Dev-Ops).

Además contamos con una interfaz muy limpia, elegante y completa, así como integración con entornos como Visual Studio, Eclipse o InteliJ IDEA.

Siempre intentamos ir un paso más allá, y es por eso que presentamos GitSync, un sistema por el cual se puede sincronizar un servidor de Plastic SCM con un servidor remoto de git. Esto nos permite compartir con otros desarrolladores que usen git para trabajar, subir nuestro código a sistemas como Github o Bitbucket, y aprovechar servicios que son compatibles con Git, como es el caso de Heroku, AppHarbor o, recientemente, Windows Azure.

Esta sincronización es bidireccional, y continua, no se trata de un importador/exportador (aunque eso, también lo hacemos). Sincronizamos todo el repositorio: ramas, changesets y etiquetas

En estos momentos estamos en fase de beta privada, a la que se puede acceder en este enlace. Valoramos mucho el feedback de nuestros usuarios, y por ello regalamos un iPhone 5 a aquellos que nos ayuden a mejorar nuestra herramienta. Quieres el tuyo?

Evento: Desarrollo para Windows Phone 8

Hoy tengo el privilegio de poder asistir comp ponente al VallaHackatón, un evento de desarrollo acelerado de aplicaciones móviles, para hablar durante una hora de desarrollo para Windows Phone 8.

Veremos temas como:

  • Herramientas disponibles
  • Plantillas por defecto.
  • Integración con el teléfono.
  • Representación de datos.
  • Navegación entre páginas.

Todo esto mientras desarrollamos la que posiblemente sea la app más útil para Windows Phone, un gestor de tareas!

El código fuente y las slides estarán disponibles más tarde en este mismo artículo.

El VallaHackatón está organizado por los alumnos del Ciclo Formativo de Guía, Información y Asistencia Turística en colaboración con los alumnos de Desarrollo de Aplicaciones Multiplataforma, y junto a instituciones como la Junta de Castilla y León a través del programa de Datos Abiertos, la escuela universitaria de informática de Valladolid, el Centro de Innovación en Movilidad, empresas como Servilia o Códice Software, y grupos de trabajo como Urbapps.

Más información en: http://vallahackathon.es/

Logro desbloqueado: Microsoft Active Professional 2013

Microsoft ha concedido por quinto año consecutivo el diploma MAP, Microsoft Active Professional 2013, que se le otorga sólo al top 5% de la comunidad de Profesionales de IT que por su constante esfuerzo, participación y capacitación en tecnologías Microsoft se destaca por sobre el resto de los profesionales realzando día a día el valor de esta comunidad.

Este año tengo la suerte de formar parte de los galardonados (y a las pruebas me remito):

Diploma MAP 2013

Diploma MAP 2013

Excepciones con Test Unitarios en C#

Una kata, en el contexto de desarrollo de software, es un ejercicio de programación que nos permite, en un entorno controlado, probar nuevas técnicas y mejorar la calidad de nuestro código. Una de las maneras más interesantes de realizarlas es a través de la plataforma Solveet, que, en colaboración con la web 12meses12katas, proponen un ejercicio mensual.

En el ejercicio del pasado mes, descubrí que nunca había probado un método que devolviera una excepción, así que recurrí a lo primero que sabía, un bloque try catch, aunque el resultado deja bastante que desear:

[TestMethod]
public void TestMethodThatShouldReturnAnException()
{
  try
  {
    CodeMachine machine = CodeMachineBuilder.Generate("KKKKK");
    Assert.Fail();
  }
  catch (IncorrectCharactersException){}
}

Un bloque catch vacío es una de las cosas menos recomendadas desarrollando software, ya que se pueden capturar excepciones que no deseamos. Por suerte, Microsoft ha puesto a nuestra disposición el siguiente artículo: A Unit Testing Walkthrough with Visual Studio Team Test, que, aunque algo antiguo, nos propone otra manera de controlar las excepciones en un test unitario:

[TestMethod]
[ExpectedException(typeof(IncorrectCharactersException))]
public void
TestMethodThatShouldReturnAnException
()
{
 CodeMachine machine = CodeMachineBuilder.Generate("KKKK");
}

Con un atributo llamado ExpectedException y el tipo de excepción que esperamos, podemos mantener el código limpio y elegante, así, podemos seguir con nuestras pruebas.

Controlar el tiempo que lleva una aplicación activa con Powershell

Powershell es una herramienta muy versátil para desarrolladores y administradores de sistema, ya que, al igual que la shell de unix, permite automatizar tareas repetitivas con facilidad. Una de estas tareas puede ser controlar un proceso, aplicación o programa, cuanto tiempo lleva activo, y el uso de recursos que está haciendo.

En este artículo se verá cómo obtener el tiempo de un proceso en Powershell, el uso de CPU y RAM, así como enviar un e-mail con esa información de manera periódica.

Sigue leyendo

Detectar etiquetas HTML usando expresiones regulares en C#

A veces es necesario acceder de manera automatizada a sitios web, analizando el contenido de los mismos buscando datos o patrones. Una de las maneras más útiles y flexibles de desarrollar estas tareas es mediante el uso de expresiones regulares.

Una expresión regular es un texto formado por símbolos específicos, que componen un patrón. Este patrón se emplea para localizar elementos en un texto que cumplan los criterios establecidos.

<h1>(.*)</h1>

Esta expresión coincidirá para cualquier título que contenga la página. El significado es sencillo: El punto significa cualquier caracter, incluídos los saltos de línea, y el asterisco significa ninguno o cualquier número de ellos. Los paréntesis significan que es un grupo, es decir, que queremos capturar ese contenido (no solo comprobar que está en el texto). Sigue leyendo