martes, 28 de agosto de 2012

Error generating final archive: Debug certificate expired

Si tenemos un poco abandonado el tema de programar con Android, y después de un tiempo queremos retomarlo, es muy probable que al intentar ejecutar un proyecto antiguo nos encontremos con que Eclipse nos larga este error:

Error generating final archive: Debug certificate expired ...

Tal como indica el mensaje, el problema es que el certificado de depuración de Android ha expirado. En esta url podemos ver que los de Google ya lo tienen registrado como bug, y que la solución temporal que se propone es la eliminación del fichero /.android/debug.keystore, para obligar a Android a regenerarlo.

Eso sí, dentro de un año, a repetir el proceso...

miércoles, 18 de abril de 2012

Windows no busca en ficheros con extensión sql

Hace unas semanas me tocó revisar unos 300 ficheros sql para tratar de sacar información sobre una base de datos que íbamos a migrar. Sin documentación, con tablas y campos en desuso, sin integridad referencial... un trabajo duro. Así que la mejor opción que teníamos para sacar el esquema de datos era analizar consultas que sabíamos que se ejecutaban sobre ella, y funcionaban correctamente.

Estaba centrándome en una tabla concreta, y quería obtener sus relaciones, por lo que pretendía filtrar los ficheros para quedarme con los que hiciesen referencia a ella. Abrí mi explorador de archivos de XP, me fui a la carpeta en la que estaban todos los ficheros, y busqué metiendo el nombre de la tabla en el campo 'Una palabra o frase en el archivo'.

Cero resultados.

Tras un par de comprobaciones (ni había escrito mal el nombre de la tabla, ni estaba distinguiendo mayúsculas...), empecé a olerme que algo iba mal. Abrí algunos ficheros, y pude ver que en varios aparecía el nombre. Entonces, ¿por qué la búsqueda no arrojaba resultados?

Pues porque los ficheros tenían extensión .sql. Si cambiaba alguno a .txt, automáticamente aparecía en los resultados.

Todavía no he podido averiguar a qué se debe esto. Si es algún problema de configuración, o simplemente a Windows no le caen bien estos ficheros. El caso es que he comprobado todas las opciones de la búsqueda, y no veo nada raro. En la opción de Tipos de Archivo tengo marcado Todos los archivos y carpetas, y no se me ocurre mucho más.

Por tanto, la única solución que he podido aplicar es la de utilizar un programa para cambiar la extensión de todos los ficheros de la carpeta. A partir de ahí, pude seguir con mi infernal base de datos.

martes, 13 de marzo de 2012

Diferencia entre dos flujos en Spoon

Hacía mucho tiempo que no tocaba Spoon, una herramienta que siempre me dejó con ganas de poder comprobar de qué es capaz realmente. Así que ha sido muy gratificante encontrarme con la posibilidad de utilizarla en mi trabajo, y de tener encima al lado a una persona con experiencia previa, como es el gran Isvapi.

Así que ya llevo unos días con un caso real. El clásico para este tipo de herramientas: tenemos que migrar los datos de un sistema a punto de morir, a otro nuevo y maravilloso. Si todo va bien y logro sacar un poco de tiempo, es posible que en las próximas semanas me anime a hacer una segunda parte de mi tutorial de iniciación. Pero hoy, como adelanto, la solución a un caso concreto que nos hemos encontrado.

El tema es que la migración la hacemos en dos fases. En la primera migramos todo el contenido de una tabla, y en la segunda el incremental. Por tanto, necesitábamos poder obtener la diferencia entre dos flujos de datos con la misma estructura (que sería el incremental a migrar). La realidad es que hacer algo así con Spoon es bastante fácil, gracias al paso Fundir filas.

Para explicar el proceso, vamos a suponer que trabajamos con una entidad Persona, que consta de un identificador, el nombre y los apellidos.

Lo primero que haríamos sería leer los dos repositorios de entrada, ya sean tablas de una base de datos, ficheros de texto, Excels... A continuación tendríamos que utilizar el paso indicado. Aquí su ayuda contextual:

Fundir dos flujos de filas, ordenadas por un campo clave. Se comparan los dos flujos y se señalan las filas que son iguales, han cambiado, se han eliminado y las nuevas.

Para que nos entendamos, lo que vamos a hacer es coger dos colecciones de datos con la misma estructura; en nuestro caso, dos colecciones de personas. El resultado contendrá la unión de las dos colecciones, indicando para cada elemento si:

- Aparece igual en ambas colecciones (identical).
- Aparece en ambas colecciones, pero algún dato ha cambiado (updated).
- Sólo aparece en la primera colección (deleted).
- Sólo aparece en la segunda colección (new).

Si vemos la configuración del paso, lo primero que tenemos que indicar son las colecciones que vamos a comparar; una de ellas será la de referencia. A continuación tenemos que dar un nombre al campo que se añadirá para indicar el resultado de la comparación (identical, updated, deleted o new).

Por último tenemos que especificar los campos que se utilizarán para hacer las comparaciones. Por un lado, hay que definir qué campos identifican a los elementos para poder indicar si estos están presentes en una de las colecciones, o en las dos. En nuestro caso, el campo id.

Por otro lado, tenemos que marcar los campos que se utilizarán para comparar los elementos presentes en ambas colecciones, y determinar si son idénticos, o han sido modificados. En nuestro caso añadiremos tanto el nombre como los apellidos.


Es importante incidir en la necesidad de que ambas colecciones estén ordenadas por los campos indicados como clave para que el paso funcione correctamente.

Una vez unidos los flujos y clasificados los registros, podemos utilizar el paso Switch para hacer lo que necesitemos con cada uno de ellos. En nuestro caso nos interesaba mandar a un fichero de texto aquellos registros que fuesen nuevos o hubiesen sido modificados, y a otro los que hubiesen sido eliminados.


El aspecto del proceso completo sería algo así.


jueves, 16 de febrero de 2012

Animaciones con frames en Android

Este post lo tenía pendiente desde hace tiempo, con idea de profundizar en el tema y hacerlo más completo. Pero dado que las circunstancias me han hecho dejar bastante de lado el desarrollo con Android por el momento, aquí va lo que he podido hacer hasta ahora.

Lo que quería conseguir cuando me metí en este jaleo era dar un toque más atractivo al jueguecillo con el que estaba cacharreando metiendo una animación de fondo. Para ello lo primero, y lo que a mí me parece más complicado por mi escasas aptitudes artísticas, es disponer de una serie de imágenes que compongan la animación (los frames). Para no complicarme, lo que acabé haciendo fue buscarme una secuencia que me gustaba, y sacar de ella los frames para probar.

El tema es bastante sencillo. Lo que tenemos que hacer es crear un fichero en la carpeta drawable, y ponerle el nombre que le queramos dar a la animación. Por ejemplo: background_animation.xml. En el diálogo de creación de ficheros XML de Eclipse veremos que uno de los tipos disponibles es Animation.

El formato del fichero tampoco tiene mayor complicación. Lo único que hace es definir los frames que forman la animación, cada uno en una etiqueta item.





Podemos definir una duración distinta para cada uno de los elementos de la animación, expresada en milisegundos. El parámetro oneshot del elemento animation-list indica si la animación debe ejecutarse en bucle (valor falso), o no.


Para poner en marcha la animación no tenemos más que ponerla como fondo de una vista. Por ejemplo, desde una ActivityView:


this.setBackgroundResource(R.drawable.background_animation);

jueves, 5 de enero de 2012

¡Soy Yuzz!

La semana que viene empiezo una nueva experiencia que afronto con muchísima ilusión y ganas de aprender: mi participación en el programa Yuzz.

Mi intención era ir contando en el blog cómo avanzaba el programa, pero voy a hacerlo de una forma diferente. Hace poco ya os hablé de Banana Campus, una red social pensada precisamente para que podamos compartir nuestras experiencias. Así que lo que he hecho es crear una experiencia en Banana, que os animo a que sigáis.

Por cierto, ¡Feliz año!

lunes, 2 de enero de 2012

Movilbank

Hoy en día, gracias a la guerra de las operadoras de telefonía móvil, y al incesante avance tecnológico del sector, seguro que la mayoría de nosotros tiene en su poder un buen puñado de terminales.

En mi caso concreto, estoy seguro de que hay un mínimo de 10 móviles vagabundeando por mi casa. Desde mi querido y añorado Siemens S25, hasta mi último cacharro, el Nokia N73. Porque generalmente, cada 18 meses más o menos, renovamos nuestro terminal, y el antiguo lo dejamos a mano en un cajón los primeros días, como si no quisiéramos darlo por muerto todavía. Pero la realidad es que poco a poco se va hundiendo en las profundidades con tantos otros trastos inservibles.

Así que cuando hace unos meses me pillé mi nuevo LG Optimus Black, decidí desde el primero momento que tenía que hacer algo práctico con mi N73. Seamos realistas, ni lo voy a usar cuando me vaya de juerga, ni es probable que se me estropee el nuevo y lo necesite como suplente, ni nada parecido. La mejor opción, sin duda, es venderlo.

Había visto muchas veces anuncios de empresas que se dedicaban a comprar teléfonos móviles, como Zonzoo. Si quieres conocer algunas no tienes más que poner "vende tu móvil" o algo similar en Google. A porrillo. Así que hice una pequeña comparación para ver por dónde andaba la cotización de mi pieza, y vi que podía sacarme unos 25 eurillos (30 si no hubiese dejado pasar varias semanas en el camino...). Teniendo en cuenta que pagué por él unos 70 hace ¿tres años?, no está nada mal.

La Web que me daba más dinero era Movilbank. El proceso de registro y venta fue simple y rápido; y pocos días después, dentro del intervalo horario que había solicitado, se presentó un mensajero en mi casa para recoger el móvil. Una semana más, y el dinero estaba en mi cuenta.

Así que la conclusión es que la experiencia ha sido muy positiva, y que recomiendo el servicio a todo el que se lo esté pensando. Sin mover un dedo te desharás de tus viejos móviles, y encima ganarás para unos tintitos con los amigos.

Por cierto, si os olvidáis de incluir el recibo de compra en el sobre no os traumaticéis. A mí me pasó con las prisas (había olvidado que venían a recoger el paquete...), y no supuso ningún problema.