Instalar Adobe AIR 2 en Linux x64

Últimamente he iniciado un proceso de transición a Linux, no por necesidad, si no por ganas de aprender cosas.

En este proceso me estoy encontrando con bastantes problemas. Uno de ellos se produce por que los ordenadores que tengo en casa son de 64 bits (y yo sin saberlo). Lo más curioso es que me estoy encontrando problemas diferentes en cada uno (¿podría ser por que uno es AMD y el otro Intel?).

Muchos de los programas del repositorio de Ubuntu no dan soporte a 64 bits y no permite instalarlos, así que toca buscarse la vida. Uno de ellos es Adobe AIR, que utilizo para mi cliente de Twitter favorito, Tweetdeck.

La propia Adobe da una serie de instrucciones que no acaban de funcionar. Buscando, buscando, he encontrado una solución en el blog de James  Ward (http://www.jamesward.com/2010/10/14/install-adobe-air-on-64-bit-ubuntu-10-10) para instalar los paquetes .deb en 64 bits, que transcribo y traduzco aquí (con su permiso, por supuesto).

  1. Descarga el paquete .deb de  Adobe AIR.
  2. Abre una ventana de terminal y navega al directorio que contiene el archivo adobeair.deb.
  3. Crea un directorio tmp:
  4. Extrae el paquete deb a la carpeta tmp:
  5. Extrae los archivos de control:
  6. Cambia el parámetro Architecture de  “i386? a “all”:
  7. Empaqueta el archivo deb de nuevo:

¡Ahora el paquete ya puede instalarse en sistemas de 64 bits! Simplemente, desde la línea de comandos teclea:

Y listos, ya se puede instalar TweetDeck o similares.

¡Gracias James!

2º Tech Cocktail + Android en el MWC

Por segundo año consecutivo Catdroid tiene el honor de organizar el 2º ??Tech Cocktail mixer durante el Mobile World Congress, y por primera vez formo parte de la organización.

Estamos super contentos de poder contar con la colaboración de ??Tech Cocktail y el ingenioso formato que otorga una oportunidad increíble a emprendedores en el área móvil (locales y visitantes) para enseñar su producto/aplicación.

El principal foco del evento es conectar, educar y amplificar a la propia comunidad técnica, y ofrecer un lugar donde mostrar algunas de las últimas innovaciones técnicas.

Por segundo año, la comunidad local de Android quiere dar la bienvenida a todos los entusiastas y desarrolladores de Android que nos estarán visitando de toda Europa y el mundo, y darles una oportunidad para conocernos y charlar un rato sobre lo último en el mundo de Android y desarrollo móvil en general.

Aquí están los detalles del evento:

  • Cúando: Miércoles, 16 de Febrero del 2011 – 7:00 p.m. a 10:00 p.m.
  • Dónde: Club 41N  (62 Avinguda del Paral.lel , Barcelona)?
  • Qué: Un Cocktail Mixer para entusiastas de la tecnología
  • Precio: $15/12€  (para los “madrugadores”)  – $20/15€  estandard  / $20/15€ en la puerta

El precio incluye dos bebidas (refresco o cerveza) o un cocktail.

Pasa por la página de Teck Cocktail’s en event brite para apuntarte ya:   http://techcocktailbarcelonamwc2011.eventbrite.com/

Si te gustaría traer un producto, empresa o servicio mira las instrucciones en la página de eventbrite.

Si te gustaría participar como patrocinador del evento manda un email core@catdroid.org (tenemos algo especial para ti!).

Nos vemos allí!

Charla sobre Mercurial por Jordi Gerona

Ayer asistí a una charla sobre Mercurial que impartió Jordi Gerona (de Eventuo) en Barcelona Activa a de la mano de SeedRocket.

Aunque estaba orientado a usuarios de SVN (Subversion) con ganas de conocer Hg (Mercurial) y yo no soy un experto en SVN (vamos, más bien novatillo), el buen hacer de Jordi ayudó bastante a seguir los conceptos explicados (sobre todo algunos que son complejos en Hg).

Y francamente, me vendió el producto. He estado haciendo algunas pruebas con BitBucket, y me está gustando mucho. Funciona bien, es rápido y sobre todo gratis (y no me obliga a que mis proyectos sean open source).

La idea básica de Mercurial es que no tenemos una estructura cliente/servidor como en SVN, al contrario, se trata de una arquitectura distribuida (de ahí su nombre DCVS, Distributed Control Version System), donde nos sincronizamos contra otros repositorios. Por comodidad, se tiene uno centralizado pasivo, pero que no manda sobre los demás y en vez de C/S tenemos repositorio local y remoto.

Así pues, tenemos nuestra working folder al igual que en SVN, pero la sincronizamos contra nuestro repositorio local (sito en la misma working folder). Cuando nuestros cambios estan listos para ser distribuidos, descargamos los últimos cambios del repositorio remoto, sincronizamos el head local y el head remoto en nuestro repositorio local, y mandamos estos cambios al remoto.

Un poco complicado de explicar en tres líneas, pero por suerte, Jordi ha compartido la presentación en Slide Share, y Fernando Cejas (de Android10) tuvo a bien de grabarlo en video (la calidad de imagen no es lo más mejor, que lo hizo con el teléfono, pero el audio es lo importante).

Aqui la presentación: http://www.slideshare.net/giro9/mercurial

Aquí el video: http://www.slideshare.net/giro9/mercurial

P.D.: el preguntón del principio que no para de interrumpir soy yo. Sorry Jordi, es que cuando algo me interesa, me pongo muy pesado.

Reporting Services: regenerando ReportServerTempDb

Reporting Services: regenerando ReportServerTempDb

Hola

Ayer se nos cayó un servidor de MS Reporting Services 2005 (entre otras cosas). Al recuperar el backup, ReportServerTempDb no se recuperaba bien.

Esta base de datos es utilizada por Reporting Services para almacenar los objetos temporales que crea al mostrar informes, así que su contenido es volatil (vamos, que no pasa nada si se pierde). El problema es que al menos hay que tener la estructura vacía.

Buscando, buscando, encontré este enlace explicando los pasos para regenerarla en este blog. Pego una traducción:

  1. Creamos la base de datos. Para la instancia predeterminada, el nombre será ReportServerTempDB. Para instancias con nombre, será ReportServer$InstanciaTempDB
    (acordaos de ajustar el tamaño correctamente).
  2. En la base de datos nueva, creamos el rol de base de datos  RSExecRole.
  3. Asignamos al rol RSExecRole de la base de datos los mismos usuarios que tengamos en el rol RSExecRole de la base de datos ReportServer.
  4. Ejecutamos el script CatalogTempDB.sql. Lo encontrareis en la carpeta de Reporting Services (en cada versión cambia bastante)
    (que no se os olvide ejecutar el script en el contexto de ReportServerTempDB).

¡Y voilà! funciona.

Qué ganas tengo de quitarme Reporting Services 2005 y actualizar a 2008, por que esta versión la miras y se rompe.

¿Alguien en la sala con experiencia en RS que me confirme si la versión 2008 es más estable?

Saludos!

Creando los layouts de Meneadroid. Parte I

¡Hola!

Varias personas me han preguntado sobre el layout de Meneadroid. Que si como lo he hecho, que si he utilizado otra cosa, que si con layouts no se puede, etc. Y es que parece que los layouts se le atragantan a mucha gente que empieza con el mundo Android.

La verdad, yo al principio pensaba igual. Esto de los layouts es un peñazo, no se puede hacer nada bien, etc. Pero poco a poco, los fui entendiendo, hasta que se produjo la “singularidad”, es decir, vi como tenían que usarse. Y oiga, desde entonces, como dice el anuncio “hago lo que quiero, con mí… layout”. Y estoy encantado. Ojalá los hubiese conocido antes.

Por eso mismo, he decidido empezar una serie de posts explicando como he hecho el layout de Meneadroid. Empezaré por el menú principal, y luego iré explicando otras cosas, incluso, como he hecho los iconos tirando de Photoshop. Si esperáis que os diga que posts voy a escribir y de que irá cada uno, ya os digo que le estáis pidiendo a la persona equivocada que se organice y tenga capacidad de preparar cosas de antemano (madredelamorhermoso, pedirme eso a mí). Lo que intento es explicar cómo funcionan los Layouts y sus componentes y propiedades más importantes a través de esta interfaz.

Estos artículos van dirigidos a gente que ha empezado a pelearse con los Layouts y todavía está en la fase “odio los layouts” (sí, yo también pasé por ahí), pero si empezáis de cero, os recomiendo leer algo de documentación básica sobre layouts, ya que hay una serie de cosas que doy por supuestas. Y si no, pues preguntad, que responderé a gusto.

A lo que iba. Cuando cree la interfaz de Meneadroid tenía claro que mi patrón de diseño iba a ser la aplicación de Twitter (ver: http://android-developers.blogspot.com/2010/05/twitter-for-android-closer-look-at.html). Por lo tanto, tenía claro como quería que fuese el menú principal, y el resultado final fue este:

Bonico ¿eh?

Por supuesto hice infinidad de pruebas, prototipos y variaciones. Os pondría los prototipos que hice en papel, pero mi hija decidió que ganaban mucho siendo cortados en trocitos.

El contenedor principal

El contenedor principal es un LinearLayout con las siguientes propiedades destacables:

  • Orientation: vertical
  • Layout height: fill_parent
  • Vertical height: fill_parent

Nada del otro mundo. Simplemente, llenamos toda la pantalla con este View.

Dos de un tipo y dos del otro

Ahora agregamos dos LinearLayout y dos TextView según la imagen:

Vamos a hablar primero de los TextView, que son sencillitos, y así nos los quitamos de encima.

La manzana de Newton

En principio, no tienen nada especial, son dos TextViews con las siguientes propiedades:

  • Layout height: wrap_content
  • Layout width: fill_parent
  • Gravity: center

Hablemos sobre la gravedad de los View. La gravedad define cómo se va a alinear un objeto tanto vertical como horizontalmente. Existen dos propiedades que afectan a la gravedad: Gravity y Layout gravity. La primera, Gravity, nos indica cómo se va a alinear el contenido del View, mientras que el segundo, Layout gravity, nos indica cómo se va a alinear el View dentro de su contenedor padre. Pongo un par de ejemplos, fijaos en el recuadro rojo, que es el que me marca exactamente los bordes del View.

Ejemplo 1

  • Layout height: wrap_content
  • Layout width: fill_parent
  • Layout gravity:
  • Gravity: center

Este es el resultado actual. El View ocupa todo el ancho de su contenedor padre (en este caso el root View, por lo que ocupa toda la pantalla).

Además, como su Gravity es center, el testo sale centrado.

Layout gravity está en blanco ya que como ocupa todo el ancho, nos da igual centrar el View o no centrarlo.

Ejemplo 2

  • Layout height: wrap_content
  • Layout width: wrap_content
  • Layout gravity: center
  • Gravity:

Aquí hay una diferencia sutil. En este caso tenemos el width a wrap_content, por lo que el View ocupa el espacio exacto que necesita para mostrar el texto. Y al poner Layout gravity a center el widget queda centrado.

Resultado: tenemos la misma interfaz de cara al usuario, pero en realidad se comporta diferente.

Más manzanas

Es fundamental saber cuándo utilizar Gravity y cuando utilizar Layout gravity, y eso solo se obtiene a golpe de experiencia. Haced pruebas con TextView multilíneas para ver cómo se comportan las diferentes combinaciones. Algunos controles no disponen de Gravity (por ejemplo el ImageView). En ese caso, lo que suelo hacer es envolverlo con un Linear Layout y posicionar la imagen en él.

Los dos grandotes

Bien, vamos a hablar sobre los dos Layout que contienen el título de la aplicación y las opciones.

Por motivos estéticos, decidí que las tres filas debían respetar la misma proporción, es decir, un tercio del espacio sobrante sería para el título, otro tercio para las dos primeras opciones (Portada y Pendientes) y el último tercio para las otras dos (Buscar y Opciones).

De Layout width no nos vamos a preocupar, que está como wrap_content en el primer Layout y como fill_parent en el segundo. Pero del Layout height sí que vamos a hablar. Cómo sabéis, hay tres opciones: fill_parent, wrap_content y tamaño fijo. Las dos últimas las descartamos, ya que queremos que ocupen todo el espacio sea cual el tamaño de pantalla. Entonces, utilizaremos fill_parent.

Pero ¿qué sucede si establezco la propiedad Layout height como fill_parent en ambos casos? Pues que tendré un bonito Layout que tan solo muestra el logotipo. Tened en cuenta que fill_parent significa exactamente eso, llenar el padre, por lo tanto, el primer control con fill_parent llena toda la pantalla.

Busquemos otra solución. ¿Qué tal si ponemos el primer Layout como wrap_content y el segundo como fill_parent? Pues pasan dos cosas. Una, que no consigo la proporción en tercios que quería, y dos, que los dos TextView del final son expulsados fuera de la pantalla.

Es ahora cuando entra en juego el peso de los elementos a través de la propiedad Layout weight.

Weight Watchers

La propiedad Layout weight es un entero que especifica la proporción del espacio disponible que nuestro View va a ocupar. Bueno, en realidad especificamos el valor inverso. Imaginemos que tengo los siguientes Views con unos valores para tamaño:

  • View 1: wrap_content
  • View 2: fill_parent
  • View 3: fill_parent
  • View 4: wrap_content

Si no especificamos ningún peso para ninguno de ellos, veremos View1 en la parte superior ajustado a su contenido y debajo View2 ocupando todo el espacio restante.

Si le damos un peso de 1 a View2, entonces View3 ocupa todo el espacio libre debajo de View1. Básicamente, no es buena idea dentro de un mismo layout mezclar Views con el valor fill_parent con y sin peso.

Si establecemos un peso de 1 para View2 y View3, entonces veremos todos los elementos. View1 en la parte superior ajustado a su contenido, View4 en la parte inferior ajustado a su contenido, y en medio, View2 y View3 repartiéndose el espacio sobrante.

Pero ¿cómo hacemos que ocupen un espacio diferente? Pues asignándoles pesos diferentes. Recordad que el valor que asignemos es la inversa del espacio que ocupará. Así, si damos a View2 le damos un peso de 1 y a View3 se los damos de 2, View3 ocupará la mitad de espacio que View1. Si utilizamos la combinación 1 y 3, pues un tercio, etc. Os recomiendo que juguéis con estos números para ver cómo se comportan.

Entonces, como os comentaba, el LinearLayout que contiene el título tiene un valor de Layout weight de 2, y el TableLayout tiene un peso de 1, así, Android divide el espacio que queda entre estos dos componentes, y le da al primero la mitad que al segundo, lo que viene siendo 1/3 y 2/3 respectivamente.

Cómo siempre digo, ahora a practicar, practicar y practicar. He comentado dos conceptos muy importantes en este artículo, la gravedad y el peso de un widget. Conocerlos y aprender a usarlos es clave.

En el próximo artículo acabaremos de crear el menú, aunque una vez entendido esto, el resto es un paseo.

¡Hasta la próxima!

P.D.: ¿Qué no tienes Meneadroid? pues nada, aquí tienes el enlace:

Discover more Android apps

Creación de aplicaciones multilingües para Android

Hoy he estado dando una presentación en GTUG sobre localización. Luego cuento algo más, pero, de momento, aquí está la presentación. He contado algunas cosas sobre como funciona la localización y traducción de software, y algunas pistas sobre como llevarlo a cabo en Android.

Aquí lo teneis:

Charla sobre localización mañana en GTUG


Mañana estaré dando otra charla, esta vez para GTUG y sobre localización de aplicaciones para Android.

Será en el Citilab de Cornellá, donde GTUG organiza una reunión en la que habrá, además del networking de rigor, varias charlas sobre diversos temas relacionados con tecnologías de Google.

Más info en http://es.citilab.eu/actualidad/noticias/gtug-barcelona

Creo que no quedan plazas ahora mismo, ya que el aforo es límitado, pero mañana colgaré la presentación aquí para aquellos que quieran echarle un ojo. Además, GTUG hara lo mismo con todas ellas, y se intentará grabar la sesión en video. Ya os comentaré.

Nos vemos en el GTUG!

Primera Píldora Android de CatDroid – Exitazo

Hoy ha sido un dia increible.

Hemos llevado a cabo la primera de las Píldoras Android que se han planeado desde Catdroid. El objetivo de estas píldoras es dar pequeñas sesiones formativas de 2 horas (2 píldoras por sesión que hacen un total de 4 horas) sobre temas específicos.

La de hoy era una sesión introductoría, que por desgracía contenía más teoría de la que nos gustaría, pero en las introducciones siempre es necesaria la teoría (repetido conmigo, la teoría es buena, la teoría es buena…). Las próximas serán más prácticas y con muchos más ejemplos.

Pero lo más asombroso ha sido la acogida de la iniciativa. Yo pensaba que si iban 15 personas nos podíamos dar con un canto en los dientes, y han ido ¡más de 70 personas!
¿Cómo estaba la salaaa?
Cuando he visto a todo el mundo sentadito frente a mí, me he quedado bastante impresionado.

Yo me he encargado de la segunda mitad de la presentación, que era una introducción a las Activity, Intent y recursos de una aplicación Android, así como un visión muy somera de los pasos para instalar el entorno de desarrollo.

¡Buf! He disfrutado como loco. No recordaba  lo mucho que me gusta hablar en público y enseñar tecnología, y francamente, con un público tan ávido de aprender, es una gozada.
Enseñando a hacer la pose de la grulla

Y que decir del lugar. Acostumbrado durante mis años de instructor a dar formación en sitios cutres, disponer de las salas del CINC es como estar en el paraiso. Micrófonos, pantallas con proyectores que arrancan a la primera, un encargado que me pregunta si quiero utilizar un atril, etc. Vamos, de lujo.

Para los que estén interesados, aquí teneis la presentación que he utilizado:

Para el que quiera, más info en Catdroid (http://catdroid.org) que se ha grabado en video, y supongo que en breve estará disponible.

Y la semana que viene, al GTUG a dar otra charla sobre localización de aplicaciones en Android. Ui que nervios. :)

Presentaciones del evento Catdroid del 18 de septiembre

Hola!

Estas son dos de las presentaciones mostradas en el evento Catdroid que tuvo lugar el dia 18 de setptiembre.

La primera es un resumen de mi experiencia con Admob en publicidad. Los ingresos obtenidos durante dos meses y medio y las conclusiones obtenidas.

La segunda presentación es una pequeña introducción a Mobclix, el agregador de contenidos, y las conclusiones obtenidas (pros y contras).

Disfrutadlas!

4 of 4
1234