¿Cómo desarrollar para Android? - Parte II

martes, diciembre 21, 2010

En la entrega anterior expliqué como instalar el ambiente de desarrollo para trabajar con Android. Ahora explicaré algunos fundamentos necesarios para poder entrar en calor.

Podemos decir que Android está compuesto por varias capas (muy al estilo del modelo OSI).

Esas capas las podemos diferenciar en 5 grupos:

  • Capa 1 - Kernel: La base de Android es sólida como una roca. Claro, esa base es el kernel Linux. Android usa Linux para manejar todo lo relacionado con el hardware (drivers), gestionar la memoria, los procesos y muchas otras tareas operativas. Sin embargo nuestra aplicación nunca tocará el kernel.
  • Capa 2 - Librerías nativas: La siguiente capa que se ubica por encima del kernel son las librerías nativas. Allí tenemos una serie de herramientas que vienen precompiladas por el fabricante y que nos permiten manejar desde renderizado web hasta bases de datos.
  • Capa 3 - Núcleo: Sobre ésta capa tenemos el núcleo de Android. Allí reside la máquina virtual Dalvik y las librerías de la plataforma.
  • Capa 4 - Framework para aplicaciones: Más arriba está el conjunto de herramientas que nos permite crear y manejar las aplicaciones, notificaciones, recursos y muchas otras cosas.
  • Capa 5 - Aplicaciones: Y por último tenemos la capa de aplicaciones, aquí es donde se encuentran los widgets y todas las aplicaciones que tienen contacto con el usuario.

Ya conocemos un poco mejor la arquitectura de Android, ahora veamos con qué contamos para desarrollar. Parte del framework para aplicaciones son los componentes. Estuadiaremos los más importantes por el momento, ellos son:

  • Activities: Los activities (o actividades) son las interfaces que permiten al usuario interactuar con la aplicación. Generalmente una aplicación está compuesta de muchas actividades. Una actividad puede ser mostrar la lista de contactos y otra puede ser enviar mensajes de texto
  • Intents: Un intent (o como se diría en español, una "intención") no es más que una acción. En Android todas las acciones se manejan con intenciones ;)
  • Services: Es una tarea que se ejecuta en segundo plano, sin interfaz gráfica y sin interacción directa con el usuario. Podemos pensar en el ejemplo típico: un reproductor de música. A todos nos gusta que la música siga sonando incluso si dejamos de ver el reprouctor para pasarnos al navegador web. Eso es un servicio
  • Content Providers: Es un contenedor que permite agrupar un conjunto de datos de una aplicación y ponerlos a disposición de otras aplicaciones. Podemos verlo como una manera de compartir información global entre aplicaciones

Por último vamos a mencionar las fases del ciclo de vida de una aplicación.

Lo primero que debemos entender es que (a diferencia de un sistema operativo de escritorio) en Android una aplicación no está casada con un proceso. En Android existe una sola aplicación que obtiene el foco y se presenta frente al usuario. Mientras ésta aplicación se encuentra en el frente, las demás aplicaciones entran en estados de pausa, detención o incluso, si la memoria es escasa, Android puede llegar a cerrarlas para liberar recursos y sin estar mediando muchas palabras.

Pero no se asusten, si la aplicación es "asesinada" por Android su estado se almacena para que pueda recuperarse cuando el usuario la ejecute nuevamente. Es en este ínterin de cerrar y abrir aplicaciones en que se liberan los procesos. Debemos ver a un proceso como un simple contenedor desechable para las aplicaciones, no más. Siempre ten presente éste comportamiento al momento de diseñar tus aplicaciones.

El ciclo de vida de una aplicación lo podemos ver en la siguiente imagen.


A continuación describo brevemente cada una de sus fases:

  • onCreate(): Se ejecuta la primera vez que la aplicación se muestra. Aquí se pueden realizar toda la inicialización estática (conexiones a bases de datos, creación de interfaces, etc). Recibe un parámetro que puede contener el estado anterior de la aplicación (si fue almacenado correctamente)
  • onStart(): Se ejecuta justo antes de que la aplicación se haga visible al usuario
  • onRestart(): Llamado justo después que la aplicación ha sido detenida. Justo antes de comenzar de nuevo
  • onResume(): Se llamará cuando la aplicación esté lista para interactuar con el usuario. Acá se pueden inicializar cosas como música y animaciones
  • onPause(): Se ejecuta justo antes de que la aplicación pase a segundo plano porque otra aplicación ha sido ejecutada. Este método puede ser lo último que vea tu aplicación antes de morir, pues Android puede matar una aplicación pausado sin previo aviso. Es por eso que este es un buen lugar para guardar el estado de tu aplicación.
  • onStop(): Es llamado cuando la aplicación ya no es visible al usuario y no se necesitará por un rato. Tal como se indicó en el punto anterior, este método es posible que ni siquiera se ejecute
  • onDestroy(): Se llama justo después que la aplicación es destruida. Acá debes hacer el sepelio y esas cosas. Tal como se indicó en el punto anterior, este método es posible que ni siquiera se ejecute

Con toda ésta base teórica podemos decir que estamos listos para empezar a escribir el código de nuestra primera aplicación. Ese será el tema de la próxima entrega.

Para más información sobre éste tema puedes consultar la documentación oficial de Android

¿Cómo desarrollar para Android? - Parte I

Python For Android - Mito o Realidad

miércoles, noviembre 24, 2010

Estuve unas cuantas horas investigando sobre la posibilidad de desarrollar con Python sobre Android y a continuación les daré un resumen de los resultados y conclusiones que obtuve.

Acá les dejo el script que usé para probar una parte de los widgets disponibles en la API por si quieren probarlo y echarle un ojo (no me detendré a explicarlo mucho porque el código prácticamente se explica a sí mismo). Además supongo que siguieron los pasos de mi tutorial sobre ¿Cómo desarrollar para Android? y tienen configurado su entorno de desarrollo y saben cómo usar el emulador.

droid = android.Android()

tiempo = droid.dialogGetInput("Escriba la cantidad de tiempo que desea para el demo (10-100)","Tiempo:")
print tiempo

tiempo = int(tiempo[1])
if tiempo < 10: tiempo = 10 elif tiempo > 100:
tiempo = 100

droid.dialogCreateHorizontalProgress('Barra de Progreso', 'Hola, estoy progresando...', tiempo)
droid.dialogShow()
for i in range(tiempo):
time.sleep(0.5)
droid.dialogSetCurrentProgress(i)
droid.dialogDismiss()

droid.dialogCreateSpinnerProgress('Spinner de progreso', 'Mirá, mirá... estoy girando')
droid.dialogShow()
time.sleep(tiempo)
droid.dialogDismiss()

droid.notify('Test de Python' , 'Oh! puedo notificar también')

droid.dialogCreateAlert(title, message)
droid.dialogSetPositiveButtonText('Si')
droid.dialogSetNegativeButtonText('No')
droid.dialogSetNeutralButtonText('Cancelar')
droid.dialogShow()
response = droid.dialogGetResponse().result
print response
droid.makeToast('El resultado de la ejecucion del boton es: %s' %response['which'])

droid.dialogCreateAlert('Selecciona un color')
colores = ('amarillo', 'azul', 'rojo')
droid.dialogSetItems(colores)
droid.dialogShow()
respuesta = droid.dialogGetResponse().result
print respuesta
droid.makeToast('El color seleccionado es: %s' %colores[respuesta['item']])

droid.makeToast('Bueno, chao')


Para correrlo deben instalar algunos paquetes en el cel. Pueden hacerlo con el comando del SDK:

$ adb install /ruta/del/archivo.apk

con los QR que están en la página del proyecto SL4A o con el método que mejor les parezca.

Ok, las cosas a instalar son:


Luego que las instalen van al dispositivo/emulador y buscan el icono de Python For Android, tap e instalan. Eso tardará unos minutos mientras descarga unas cosas. Al terminar entonces enviamos el script de prueba al cel, podemos usar el comando:

$ adb push /ruta/del/script.py /sdcard/sl4a/scripts/

Eso lo copiará en la carpeta del SL4A. Ahora cuando ejecutemos el Python For Android veremos en la lista de scripts nuestra infame creación, tap en el script y ejecutar. Lo demás es disfrutar las ventanitas y controles :P

Conclusiones


  1. La API de SL4A es reducida, es decir si bien está bastante adelantada aún faltan muchas cosas/funciones por implementar.
  2. Python For Android a diferencia de lo que pensaba no soporta widgets gráficos en Android, solamente notificaciones, toast y cosas básicas tipo entrada de texto, selección, etc. Así que nos olvidamos de interfaces gráficas ricas en imágenes y esas cosas.
  3. Sí existen algunos issues de performance, de hecho un pana que está trabajando duro con Android me dice que los desarrolladores todos los días se matan por tratar de mejorar el rendimiento pues de por si ya es algo lento (hablo de apps nativas). Sin embargo la versión de Python es cross-compiled y corre incluso más rápido que Jython
  4. Hay formas de empaquetar scripts en .apk y aunque son algo un poco experimentales funcionan bastante bien (son, digamos, "tweaks" del método de construcción de paquetes con Java)
  5. En cuanto a estabilidad no hay mayores issues, se puede usar para aplicaciones de producción


Finalmente puedo decir (muy a mi pesar) que no podemos contar con ésta alternativa para desarrollar aplicaciones ricas en interfaces gráficas, sin embargo es una opción interesante a tener en cuenta cuando madure un poco más. Personalmente le haré seguimiento tipo ninja y esperaré con ansias que en el futuro se puedan crear aplicaciones tan buenas como se hace con Java.

Más información en:

* http://code.google.com/p/android-scripting/
*http://code.google.com/p/android-scripting/wiki/FAQ
* http://code.google.com/p/android-scripting/wiki/Tutorials
* http://code.google.com/p/android-scripting/wiki/ApiReference

¿Cómo desarrollar para Android? - Parte I

sábado, noviembre 20, 2010



Actualmente me he visto en la necesidad de crear aplicaciones para Android y como no había incursionado en ese mundo, he decidido hacer una serie de artículos para documentar todo el proceso.

En ésta primera entrega explicaré los pasos que seguí para poner a punto el entorno de desarrollo. Debo resaltar que las recetas están hechas para Debian GNU/Linux, sin embargo puedes adaptarla a tu distro favorita con unos leves ajustes.

Para los que no están familiarizados con mis tutoriales les recuerdo que todas las instrucciones que comiencen con el caracter $ se ejecutan como usuario normal y las que comiencen con # se ejecutan como superusuario (root), por ejemplo:

$ ls -l (instrucción ejecutada como usuario)
# aptitude update (instrucción ejecutada como root)


Dicho esto comenzamos.

Instalar dependencias


Lo primero que debemos hacer es instalar los paquetes necesarios para el desarrollo, que básicamente son: la máquina virtual de Java (JRE) y el entorno de desarrollo (JDK). En una distribución Debian GNU/Linux bastaría con:

# aptitude update
# aptitude install sun-java6-jdk sun-java6-jre
# aptitude remove gcj-jdk


Si se dan cuenta usamos las implementaciones de SUN y removimos cualquier posible instalación del compilador GNU de Java (gcj) pues en la documentación oficial nos dicen que gcj NO es compatible con Android.

Para más información sobre los requerimientos del sistema visita: http://developer.android.com/sdk/requirements.html

Luego que instalamos los paquetes nos aseguramos de que el sistema seleccione las opciones correctas por defecto de cada ejecutable, pare eso usamos:

# update-alternatives --config javac
# update-alternatives --config java


Y en ambos casos, seleccionamos las opciones de SUN.

Instalar Ant


Ant es una herramienta que nos permite construir aplicaciones Java. En nuestro caso, nos permitirá compilar y construir archivos .apk (los instalables en Android) a partir de nuestro código fuente.

Nos vamos a la página de descargas de Ant, descargamos uno de los archivos comprimidos que se encuentran en la sección "Current Release of Ant" y lo descomprimimos en una carpeta de nuestra preferencia. En mi caso lo hice en /opt y me quedó la carpeta: /opt/apache-ant-1.8.1.

Instalar el Android SDK


Bueno, teniendo las herramientas y dependencias listas, vamos a instalar el entorno de desarrollo de Android. Nos vamos a la página del SDK de Android y descargamos la versión que corresponda a nuestra plataforma. Al igual que con Ant, descomprimimos el archivo en la carpeta de nuestra preferencia. Ésta vez también lo descomprimí en /opt, quedando en la carpeta: /opt/android-sdk-linux_x86.

Ahora editamos el archivo ~/.bashrc para agregar la ruta de los binarios al PATH del sistema y establecer las variables de entorno ANT_HOME y JAVA_HOME. Eso lo logramos agregando las siguientes líneas:

export PATH=${PATH}:/opt/android-sdk-linux_x86/tools
export PATH=${PATH}:/opt/apache-ant-1.8.1/bin
export ANT_HOME=/opt/apache-ant-1.8.1
export JAVA_HOME=/usr/lib/jvm/java-6-sun/jre


Recuerda cambiar las rutas de esas variables por las rutas donde se encuentran tus binarios. Si no sabes muy bien hacía dónde debe apuntar JAVA_HOME puedes ejecutar el comando:

# find / -name "tools.jar" | grep sun

Y entonces agrega la ruta que te arroje.

Nota: Debes cerrar las terminales abiertas y volverlas a abrir para que los cambios en las rutas surtan efecto.

Instalar plataformas de Android


¿Plataformas? ¿De qué me hablas? - Seguramente te estarás haciendo esas preguntas. Las plataformas son las "versiones" de Android disponibles (por ejemplo Android 1.6, Android 2.2) y necesitamos al menos una para poder compilar la aplicación y configurar un Android Virtual Device (AVD) para probarla.

Esto es muy simple, basta con abrir una terminal y ejecutar:

$ android

Nos aparecerá una aplicación (AVD Manager) como la que se muestra a continuación y allí nos vamos a la sección Available Packages, actualizamos el repositorio y seleccionamos la(s) plataforma(s) que deseamos instalar.


Finalmente creamos un nuevo dispositivo virtual en la sección Virtual Device. Hacemos clic en el botón New..., le asignamos un nombre, seleccionamos una plataforma y hacemos clic en Create AVD.


Para probar nuestro flamante dispositivo lo seleccionamos y hacemos clic en Start.... Luego clic en Launch y al cabo de unos segundos tendremos el emulador corriendo una instancia de Android :)


Desarrollo


Ahora viene la parte divertida, crear la aplicación. En las próximas entregas estaré hablando sobre el desarrollo, por los momentos pueden jugar creando un Hello World y pueden leer sobre cómo desarrollar con Eclipse y cómo desarrollar con otros IDEs

Compilar y construir el ejecutable


Luego de que tengamos nuestra aplicación lista debemos crear el instalador. Eso es tan simple como navegar hasta la carpeta raíz del proyecto (código fuente) y ejecutar:

$ ant debug

Si nuestro proyecto se llama "HelloAndroid" esto generará un archivo HelloAndroid-debug.apk y ese será nuestro instalador.

Probar en el emulador


Finalmente, una de las partes más esperadas. ¿Cómo se verá nuestra aplicación en un dispositivo? Pues fácil, en una consola ejecutamos:

$ android

E iniciamos nuestro dispositivo virtual. Luego que el dispositivo esté funcionando ejecutamos en otra consola:

$ adb install /ruta/de/nuestro/instalador/HelloAndroid-debug.apk

Y con eso enviaremos la aplicación al dispositivo. La buscamos en el menú y voilá! A jugar :D

Espero que les haya sido de utilidad éste tutorial. Próximamente seguiré documentando mis travesías en el mundo de Android. Cambio y fuera.

MPD + Sonata: Una combinación perfecta para reproducir música

martes, julio 27, 2010

Lo primero que debo aclarar antes de empezar éste post es que la forma de reproducir música con éstas herramientas es completamente diferente a la tradicional. Si no te interesa reproducir música como un verdadero geek entonces huye y busca otras aplicaciones, éstas no son para tí.

Si eres valiente, continuemos entonces. MPD es un demonio (o sea un servicio) para reproducir música, corre en segundo plano y no tiene interfaz gráfica. De hecho se inicia como cualquier otro servicio de tu equipo (red, hal, udev, etc).

¿Cómo demonios hago para interactuar con él? te preguntarás. Sencillo, está basado en una arquitectura cliente-servidor así que existen aplicaciones que se comunican con él (clientes) y que te permiten manejarlo. Ahí es donde entra Sonata y compañía.

Lo primero que debemos hacer es instalar las dependencias:

# aptitude install mpd mpc sonata

Yo instalaré 2 clientes, Sonata y MPC, porque quiero controlar la reproducción vía SSH desde mi celular xD (sí, sí, muy geek... pero me gusta la comodidad)

Luego vamos a nuestro directorio personal, creamos la carpeta .mpd y dentro de ésta creamos dos carpetas más, playlists y music

$ cd ~
$ mkdir -p .mpd/playlists
$ mkdir -p .mpd/music


Dentro de la carpeta .mpd creamos los archivos mpd.db, mpd.log y mpd.error

$ touch .mpd/mpd.db
$ touch .mpd/mpd.log
$ touch .mpd/mpd.error


Ahora, por cada carpeta de música que tengamos en nuestro sistema creamos un enlace simbólico dentro de music:

$ ln -s /ruta/de_la/carpeta1 .mpd/music
$ ln -s /ruta/de_la/carpeta2 .mpd/music
...


Luego (como root) editamos el archivo de configuración del MPD en /etc/mpd.conf y modificamos las siguientes opciones:

music_directory     /home/tu_usuario/.mpd/music
playlist_directory  /home/tu_usuario/.mpd/playlists
db_file             /home/tu_usuario/.mpd/mpd.db
log_file            /home/tu_usuario/.mpd/mpd.log
error_file          /home/tu_usuario/.mpd/mpd.error


Comentamos la línea de usuario para evitar problemas con los permisos:

#user             "mpd"


Y buscamos el apartado de audio y lo configuramos para ALSA o para PulseAudio:

ALSA:
audio_output {
        type    "alsa"
        name    "My ALSA Device"
}


PulseAudio:
audio_output {
        type    "pulse"
        name    "My PulseAudio Device"
}


Establecemos un mezclador por software descomentando la siguiente línea:

mixer_type "software"

Y voilá! Luego reiniciamos el servicio y creamos la base de datos de tags:

# /etc/init.d/mpd restart --create-db

Ahora desde Sonata (o desde mpc) agregamos las canciones que queramos a la lista y empezamos a disfrutar. Es tan genial ésta combinación que podemos cerrar el Sonata e incluso hasta la sesión gráfica y la música seguirá sonando.

Nos quedará algo tan mínimo como esto:


O en su versión extendida:


Y con unas agradables notificaciones:


Díganme... ¿No es una maravilla? Bueno de aquí en adelante los dejo para que experimenten y se enamoren.

Webcomic: Los FUUU de la vida (I)

sábado, julio 10, 2010

Con éste webcomic quiero inaugurar un espacio muy querido y vivido por todos nosotros... Los FUUUU de la vida. He aquí la primera entrega. Enjoy!

Clic en la imagen para agrandar

Respuesta a críticas destructivas sobre Turpial

miércoles, junio 02, 2010

Me considero una persona tolerante y abierta a las críticas y sugerencias. No hay cosa que me guste más que el feedback de las personas sobre las cosas que hago y más aún sobre Turpial. Sin embargo cosa que no tolero es la mediocridad.

He decidido crear este post para colocar la respuesta que le he dado a @MichelEnLaRed respecto a algunos comentarios que me ha hecho por Twitter sobre Turpial, que en lugar de contribuir al desarrollo del proyecto empañan todo el esfuerzo que duramente se viene haciendo. No pretendo agregar nada a la respuesta que le dí por Twitter, solo la pegaré aquí para unificarla y permitir su mejor lectura.

El comentario que derramó la gota fue el siguiente (sí, hubo 3 o 4 comentarios previos en el mismo tono que dejé pasar por consideración y tolerancia):


Mi respuesta fue:

No había querido responder tus comentarios porque no tenía nada bueno que decirte, pero ya que insistes me tomaré la molestia.

1.- No sé de dónde sacas información para formar juicios de valor sobre mi incapacidad para solventar el cuelgue de Turpial, no estás suscrito a la lista de desarrollo, no te conectas al canal IRC, ni siquiera te veo involucrado como colaborador. Para tu información actualmente estoy usando la API nueva que he diseñado para resolver los problemas de Turpial, pero
está en estado experimental. En el desarrollo de software primero se prueban las cosas antes de lanzarlas al público, son controles de calidad y pruebas q debe pasar la aplicación antes de que pueda ser "usada" por el público en general. Pero veo que no conoces mucho al respecto y por eso lanzas esa sarta de comentarios estériles que en lugar de contribuir desmeritan el fuerte trabajo que he estado haciendo estos últimos días para que ustedes puedan disfrutar de un buen cliente.

2.- Soy una persona con un trabajo de verdad y una vida de verdad, nada me gustaría más que poder dedicarle el 100% de mi tiempo al Turpial, pero lamentablemente eso no me da para comer en estos momentos, así que los pocos instantes libres que me quedan al día son los que invierto en desarrollar el Turpial. Considera eso antes de llamar "incapaz" a otra persona.

3.- Si no te gusta el desempeño de Turpial o te parece que no programo lo suficientemente rápido pues usa otro cliente y ya. Hay centenares de clientes de twitter allí afuera esperando por tí, que no se cuelgan y con programadores realmente "capaces". Turpial es un hobby para mí y la idea es que la comunidad pueda disfrutar, beneficiarse y sentirse a gusto con mi hobby y pues con eso poner en alto el nombre de nuestra patria, hay mucho talento en éste país y debemos sacarle provecho.

No tienes ningún compromiso para usar Turpial, eres libre de escoger... así como el software, completamente libre. Si realmente deseas apoyar Turpial entonces razona y analiza las cosas antes de decirlas, involucrate y colabora, así funciona el software libre y es uno de los principios básicos del socialismo, unión, comunidad, participación...

La mejor forma de cambiar las cosas es formando parte de ellas, no necesitas ser programador para ayudar a Turpial, existen muchas cosas por hacer, eres bienvenido siempre y cuando tus ganas sean de trabajar y de hacer las cosas mejor pero no si lo que tienes es ganas de joder, eso se lo dejamos a los mediocres. Puedes empezar leyendo el archivo de la lista de correos http://smlk.es/6JfSkX, y si gustas únete y aporta tus ideas como un ser racional, pensante e inteligente que eres.

Saludos y gracias por el apoyo

Me disculpo de antemano si hiero algunas susceptibilidades pero las cosas son como son. Las críticas, cuando son constructivas, vienen acompañadas de un planteamiento o una solución.

Mis 2 lochas

Turpial, KumbiaPHP y SigueMiLink trabajando juntos

domingo, abril 11, 2010

Hace unos días mi buen amigo Deivinson Tejeda (desarrollador del framework KumbiaPHP) me comentó sobre un nuevo acortador de URLs hecho en España llamado SigueMiLink.

Se preguntarán: ¿Bueno y cuál es la gracia del asunto? Pues lo interesante del asunto es que:

  1. El acortador de URLs SigueMiLink está hecho en KumbiaPHP
  2. Los creadores de SigueMiLink le plantearon a Deivinson la posibilidad de incluirlo en Turpial
  3. Turpial y KumbiaPHP son como proyectos hermanos :) (ambos son Venezolanos)

Al parecer todo se confabuló para crear un círculo de apoyo entre los 3 proyectos y así fue. Ahora me complace anunciar que Turpial soporta a SigueMiLink como nuevo servicio acortador de URLs y que tanto los amigos de SigueMiLink como los de KumbiaPHP apoyan fuertemente a Turpial.

Ojalá se puedan repetir más situaciones como ésta, en la que varios proyectos pueden colaborar entre sí por un fin común... La libertad del software :D

Webcomic: Unfollow

lunes, abril 05, 2010

Un webcomic para liberar un poco el estrés de la programación... ¡Que lo disfruten! :)

Clic en la imagen para agrandar

Turpial ahora con soporte para idiomas / Turpial now with support for languages

martes, marzo 23, 2010

Español

Turpial, el cliente Twitter con sabor Venezolano ahora tiene soporte para idiomas. Actualmente está disponible en inglés y español, pero con ésta sencilla guía puedes animarte a traducirlo a cualquier otro idioma. Es muy simple y no necesitas saber nada de programación xD

Aquí vamos:
1.- Descarga la plantilla template.pot para las traducciones de aquí

2.- Abre el archivo con tu editor de texto favorito y llena el encabezado del archivo con tus datos (nombre, correo e idioma de la traducción)

3.- Comienza la traducción. El texto que aparece seguido de msgid debes traducirlo y colocarlo en la línea inferior, justo después de msgstr. Mira la imagen si tienes dudas:


4.- Envía la traducción a cualquier miembro del equipo: wil.alejandro, meza.eleazar, kstnshadows o milmazz, todos en gmail punto com


Recuerda lo siguiente:
  • El texto traducido no puede contener errores ortográficos
  • El archivo template.pot debes abrirlo con un editor de texto plano
  • No debes traducir el texto que está en inglés, siempre la traducción va en la línea de abajo y manteniendo las comillas

Eso es todo lo que debes hacer. Anímate y colabora con el proyecto :)


English

Turpial, the Twitter client with Venezuelan taste now got support for languages. Actually are available english and spanish, but with this easy guide you can try to translate it to any other language. Is really easy and you don't need to know anything about programming xD

Here we go...
1.- Download the file template.pot for translations here

2.- Open the file with your favorite text editor and fill the header with your information (name, mail and language of translation)

3.- Start the translation. The text that appears followed by msgid must be translated and put in the line below, just after msgstr. Look at the image if you're doubtful:


4.- Send the translation to any of the team members: wil.alejandro, meza.eleazar, kstnshadows o milmazz, all in gmail dot com


Remember this:
  • The translated text can't contain orthographic errors
  • template.pot file must be opened with a plain text editor
  • You don't have to translate the text in English, the translation always goes in the line below and maintaining the quotation marks

That's all you need to do. Come on and collaborates with the project :)


Webcomic: Maldito Calor

sábado, marzo 13, 2010

Estos serán los cuentos que le echaremos a nuestros nietos xD

Clic en la imagen para agrandar

Mucho Software Libre en un solo sitio: Planeta Linux

lunes, marzo 08, 2010



Planeta Linux es una comunidad de usuarios, desarrolladores y activistas iberoamericanos de Software Libre en donde cada miembro cuenta el día a día del Software Libre a través de su blog. Gracias a toda la gente que hace vida en este Planeta y comparte sus experiencias con el resto de nosotros, podemos enterarnos de lo que pasa en el mundo del Software Libre, de primera mano y más fresco que el pan de cada día.

Por mi parte felicito a todo el equipo responsable de ésta excelente iniciativa e invito a todos los que siguen mi blog a que hagan lo propio con Planeta Linux, no se arrepentirán. Excelentes publicaciones, noticias interesantísimas, puro Software Libre... ¡no tiene desperdicio!

Desde hace unos días éste humilde blog pasa a formar parte de la gran lista de blogs que conforman Planeta Linux, así que no sigas leyendo más esto y anímate a formar parte de la comunidad xD

Gestor de ventanas por defecto en GNOME 2.28

Hace algún tiempo publiqué cómo configurar el gestor de ventanas por defecto en GNOME. Esa receta fue probada con éxito en el GNOME de ese entonces (si mal no recuerdo era algo como 2.22 o 2.24) pero al intentar usarla en mi nuevo GNOME 2.28, simplemente no funcionó.

La cuestión es que ahora el GNOME ignora la variable de entorno WINDOW_MANAGER y la clave de gconf /desktop/gnome/applications/window_manager. La nueva forma de configurar el gestor de ventanas por defecto es mediante la clave /desktop/gnome/session/required_components/windowmanager. Allí simplemente colocamos el comando de nuestro gestor de ventanas preferido (en mi caso compiz) y voilá.

Firefox casi tan rápido como Google Chrome

martes, febrero 16, 2010

Esta semana estuve formateando mi PC (con Debian obviamente xD) y una de las cosas que más me gusta hacer es poner el sistema a punto.

Firefox, Firefox, Firefox... necesitaba optimizarlo con urgencia, estaba lento como una marrana y a pesar de que Google Chrome le estaba quitando algo de terreno (porque es rapidísimo), le soy fiel a mi obeso amigo. Decidí entonces investigar y tratar de ponerlo a dieta. Los resultados: ¡Excelentes! Casí tan veloz como Chrome. Acá les dejo la receta.

Intentaré explicar solo los más resaltantes para no extenderme mucho. Para empezar vamos a la barra de direcciones y escribimos about:config, luego de aceptar la advertencia editamos las claves que indicaré a continuación. Si la clave no existe, debemos crearla. Podemos ayudarnos con el filtro para ubicar las claves con mayor rapidez.

¡Empecemos!

1.- Optimizar las conexiones TCP: Si tienes una conexión banda ancha esto hará que Firefox la aproveche para mejorar su rendimiento al momento de cargar las páginas.

  • network.http.max-connections = 48
  • network.http.max-connections-per-server = 16
  • network.http.max-persistent-connections-per-proxy = 8
  • network.http.max-persistent-connections-per-server = 4
  • network.http.pipelining = true
  • network.http.pipelining.maxrequests = 8
  • network.http.pipelining.ssl = true
  • network.http.proxy.pipelining = true
  • network.http.request.timeout = 300
  • network.dns.disableIPv6 = true (si vives en un país donde no usen IPv6)
  • network.prefetch-next = false (evita que Firefox descargue las páginas antes de que les des clic)
  • content.notify.ontimer = true
  • content.interrupt.parsing = true
  • content.max.tokenizing.time = 2250000
  • content.maxtextrun = 8191
  • content.notify.interval = 750000
  • content.switch.threshold = 750000

2.- Optimizar el consumo de memoria: Todos sabemos que Firefox consume mucha RAM; bueno esta es la parte donde lo ponemos a dieta.

  • browser.cache.disk.capacity = 20000 (establece la cantidad de disco en KB que se usará para la cache. Usa 20000 si tienes más de 1GB de RAM, 15000 si tienes entre 1GB - 512MB y 5000 si tienes menos de 512MB de RAM)
  • browser.cache.memory.capacity = 32768 (indica la cantidad de RAM en KB que usa Firefox para la cache. Si la clave no existe la creamos de tipo Entero. Se recomienda 32768 si tienes 2GB de RAM, 16384 si tienes entre 1GB - 512MB y 8192 para menos de 512MB)

3.- Usar el nuevo motor de JavaScript TraceMonkey: El nuevo motor es más rápido y mejora la experiencia al momento de cargar páginas con alto contenido de JS (ya viene por defecto en las versiones más nuevas de Firefox).

  • javascript.options.jit.chrome = true
  • javascript.options.jit.content = true

4.- Mejorar el comportamiento: Modificaremos otras claves para mejorar el comportamiento de Firefox en diferentes situaciones.

  • toolkit.scrollbox.scrollIncrement = 75 (acelera el scrolling entre pestañas)
  • browser.sessionstore.interval = 30000 (guarda la sesión cada 30 seg y no cada 10)
  • browser.sessionstore.max_tabs_undo = 5 (indica el número de pestañas que puedes restaurar luego de cerrarlas)
  • browser.sessionhistory.max_total_viewers = 4 (indica el número de páginas que son almacenadas en la RAM para que no deban ser reprocesadas por Firefox. Puedes visitar éste sitio para mayor información)

Ya está, con eso tendremos un Firefox un poco más rápido. Y a ti, ¿te ha funcionado la receta? Deja tu comentario

Webcomic - El pisapapeles

martes, febrero 02, 2010

Pues dedicado a todos los Fanboys de Apple xD

(Click en la imagen para agrandar)

Publicada versión 0.9.3-a1 de Turpial

sábado, enero 23, 2010

Hoy se publica oficialmente la versión 0.9.3-a1 de Turpial. Es similiar en funcionalidad a la 0.9.2 porque solo tiene unos cuantos bugs corregidos. También se cambió la numeración de las versiones y a partir de este momento cada una contendrá una letra al final (seguida por un número). Las letras usadas serán a: alpha, b: beta, rc: release candidate.

Otra cosa importante a resaltar es que con este lanzamiento Turpial cuenta con su primer paquete para una distro GNU/Linux. El paquete en cuestión es un .rpm para Fedora 11 y 12 (i386) elaborado por el amigo Edwind Contreras (aka Richzendy). Gracias por el excelente trabajo.

A continuación la lista de bugs corregidos en esta entrega:
  • Castellanizada toda la aplicación (a excepción de términos muy específicos)
  • Corregido bug que impedía guardar la opción de cargar color del perfil
  • Corregido error que bloqueaba la opción 'Follow' del menú contextual cuando el usuario no tiene amigos
  • Corregido error #54 con las notificaciones (el programa fallaba si no estaba instalado python-notify)
  • Corregido error #56 que impedía mostrar correctamente los hashtags en el menú contextual
  • Corregido bug #55 que impedía abrir el perfil del autor de un tweet
  • Corregido error #57 que bloqueaba la interfaz gráfica al actualizar y enviar un tweet al mismo tiempo (deadlock entre hilos)

No queda más que invitarlos a que prueben o actualicen a esta nueva versión; si consiguen un bug o tienen una sugerencia reportenlo aquí y si les gusta comenten, apoyen y difundan :D

Descargar 0.9.3-a1
Descargar 0.9.3-a1 (RPM Fedora)

Para más información del proyecto:
Página oficial
Preguntas y Respuestas Frecuentes
Manual de Instalación en Ubuntu (por Renata Franco)
Manual de Uso (por Azrael Arocha)

Publicaciones anteriores:
Lanzamiento de la versión 0.9.2
Lanzamiento de la versión 0.8
Lanzamiento de la primera versión (0.6)


Webcomic - El rebelde

miércoles, enero 20, 2010

Después de sacar la versión 0.9.2 del Turpial he podido tomarme unos minutos de descanso y retomar mis comics. Espero que les guste :D

(Click en la imagen para agrandar)



Disponible versión 0.9.2 de Turpial

martes, enero 19, 2010




Por mucho que le dí vueltas a la cabeza para empezar este post, no puedo abrirlo de otra forma que no sea diciendo...

¡GRACIAS!


Gracias a todas las personas que han apoyado este proyecto de una u otra manera, gracias a los que se han tomado la molestia de probarlo, gracias por todos los RT y las menciones en Twitter, gracias por los buenos comentarios y las sugerencias, de verdad... ¡Muchas Gracias!. Gracias a la comunidad de Software Libre en general por la gran aceptación que le han dado a esta humilde aplicación... el Turpial.

Ahora sí... empecemos.

Siguiendo con un ciclo intensivo de desarrollo presento con orgullo la versión 0.9.2 de Turpial, el cliente Twitter con sabor Venezolano.

A pesar de que solo han pasado 4 días desde el lanzamiento de la versión anterior 0.8.5, hay un montón de cosas nuevas y bugs corregidos en esta nueva entrega.

Las novedades más resaltantes:

  • Añadida opción para configurar el número de tweets por columna
  • Resaltado de los tweets favoritos
  • Mejorados mensajes de error
  • Almacenado el tamaño que el usuario le asigne a la ventana
  • Corregido shebang del lanzador para hacerlo compatible con Fedora (gracias a Richzendy)
  • Agregado soporte para los servicios su.pr y bit.ly (cortado de URLs)
  • Usado el esquema de colores del perfil del usuario para los elementos resaltables
  • Soporte para abrir los hashtags desde el menú contextual
  • Añadido botón para limpiar las búsquedas
  • Mejoradas la detección de hashtags y menciones
  • Agregada la opción para activar/desactivar el sonido de las notificaciones
  • Mejorados los módulos de configuración y notificaciones
  • Corregidos otro bugs menores

Si ya tienes instalada una versión 0.8.x y quieres actualizar solo basta con que descargues la 0.9.2 y descomprimas la carpeta turpial, reemplazando la carpeta anterior. Todo debería funcionar sin ningún problema e incluso deberías conservar toda tu configuración intacta.

Debo decir que detrás de una aplicación como Turpial hay muchas horas de programación, pero también hay muchas horas de pruebas y detección de errores. Afortunadamente Turpial cuenta con un par de beta testers estrellas: Azrael Arocha y José Leonel Subero (aka arawako). Excelente trabajo muchachos.

Pueden seguir el progreso de Turpial en Twitter a través de @TurpialVe; también tenemos la página principal del proyecto en google code, una página de Preguntas y Respuestas Frecuentes (FAQs) y dos excelentes tutoriales; un Manual de Instalación en Ubuntu realizado por mi pana Renata Franco y un Manual de Uso hecho por el pana Turpial Beta Tester, Azrael. Ya no tienes excusas... ¡A probarlo!

De más está invitarlos a que lo descarguen, lo prueben, lo comenten y lo apoyen. No es necesario saber programar para apoyar y colaborar con el Turpial.

Espero que lo disfruten. Screenshots después del salto (click en las imágenes para agrandar)


Turpial 0.9.2


Nuevas funciones en el menú contextual y resaltado de favoritos


Soporte para nuevos servicios de cortado de URLs


Implementadas nuevas preferencias

¿Y tu, ya probaste Turpial? Cuéntanos que te pareció, deja tu comentario


Publicado Turpial 0.8: Más criollo que una arepa

lunes, enero 11, 2010




Hace aproximadamente un par de meses hice oficialmente la primera publicación de Turpial (v0.6); un cliente alternativo de Twitter para GNU/Linux escrito en Python.

Para aquel entonces solo contaba con interfaz para geeks modo texto y un buen repertorio de funciones. Ahora, gracias a la colaboración del pana Azrael, traemos la versión 0.8 con un montón de bugs corregidos y funciones nuevas, pero lo más importante... ¡con interfaz para gente normal! :D

Ha sido un trabajo duro, aún quedan MUCHAS cosas por terminar y otras más por corregir (si no me creen miren la lista de bugs y cosas pendientes xDDD), pero lo importante es que el trabajo está dando sus frutos y al menos alguien más, a parte de mi, usa Turpial (sí, es Azrael, y que!?)

Entre las características del nuevo Turpial tenemos:

  • Interfaz GTK+ para el modo gráfico (el modo texto está en reconstrucción)
  • Puedes ver el timeline, las menciones, los mensajes directos, los favoritos y el perfil del usuario
  • Permite tuitear, borrar tuits y retuitear
  • Marcar y desmarcar tuits favoritos
  • Soporta búsquedas
  • Envía mensajes directos (solo usando el comando D)
  • Dispone de servicios para cortado de URLs
  • Descarga las imágenes de los usuarios
  • Tiene una interfaz con respuesta mejorada (usando threads)
  • Notificaciones integradas con el entorno de escritorio (y con sonido)
  • Guarda las preferencias del usuario
  • Modo "wide" a 3 columnas
  • Nueva API usando la autenticación segura de Twitter (OAuth)

Para los interesados, aquí pueden descargarlo y tenemos una sección de FAQs (Preguntas y Respuestas Frecuentes) donde se aclaran dudas comúnes y se explica cómo instalarlo y probarlo (no, lamentablemente no explicamos cómo desinstalarlo)

Este nuevo Turpial viene con puro sabor venezolano y es casi tan criollo como comerse una buena arepa con queso y mantequilla, así que los invito a que lo prueben, lo comenten, lo compartan y si les gusta, lo apoyen.

Los dejo con una pequeña galería de screenshots pa' que se animen.







Es todo por ahora, cambio y fuera.





Cómo determinar la ruta de ejecución de un script en BASH

domingo, enero 10, 2010

Este fin de semana estuve buscando la manera de hacer un script en BASH que funcione como lanzador para el Turpial y necesitaba saber la ruta de ejecución del propio script.

Por un momento no supe como hacerlo, pero La Gran Totuma me iluminó y recordé los parámetros básicos de cualquier script... fue entonces cuando llegó a mi mente el famoso $0.

$0 contiene la ruta completa del script en ejecución. Ese parámetro junto con otro programita nos permitirán hacer la magia.

La aplicación dirname recibe una ruta y devuelve la misma ruta pero sin el último componente (RTFM para más información).

Lo que hacemos es pasarle $0 a dirname y luego concatenamos el nombre de cualquier otro programa/script y voilá! Tendremos nuestro lanzador automático. Quedaría algo así:

#!/usr/bin/bash

CWD=$(dirname $0)
sh $CWD/otro_programa.sh


Webcomic: Despecho

martes, enero 05, 2010

¿Y quién no ha sufrido un despecho?
Click para agrandar



Webcomic: El invento

lunes, enero 04, 2010

El fin de semana estuve un poco ocupado y por eso no hubo webcomic, pero como lo prometí aquí está el de hoy. Enjoy it:

Click para agrandar



Webcomic - Feliz Año 2010

viernes, enero 01, 2010

Y como era de esperarse, el comic para dar la bienvenida al nuevo año. Que lo disfruten

Click para agrandar