Aplicaciones
Vala, Gtk, Pino y Twitter
2Últimamente en mis ratos de ocio he estado aprendiendo un lenguaje nuevo llamado Vala.
Mi desafío para aprender a hacer algo en vala + gtk fue agregar una funcionalidad al cliente de twitter Pino, que dicho sea de paso esta bastante bueno. La funcionalidad es bastante simple, agregar un nuevo proveedor para acortar URLs bit.ly
Complejidades, bondades y rarezas que me encontré:
- Facilidad para enganchar las señales.
- Lo parecido a Java del lenguaje, lo que me ayudo mucho, aquí una ayuda para los Java Developers
- Aún le falta mucho a los IDEs (valide esta muy verde).
- El compilador tiene poca ayuda, sólo dice que fallo pero no en donde ni por qué, rara vez te dice te falta un “;”
- Aun son enredado los script de compilación, al más puro estilo de macros m4, automake y vainas por el estilo, aquí hay mucho por mejorar.
- La API si bien es cierto esta bien documentada en valadoc aún prefiero la facilidad para encontrar las cosas del javadoc
Les dejo aquí mis mejoras de pino-twitter-2.0.5.tar y a ver si lo van mejorando un poco más, por lo pronto voy a subir los cambios al tracker para que los incluyan en la release.
Para compilar es simple, obviamente deben tener todas las herramientas para compilar:
$ ./waf configure --prefix=/home/tu_user/directorio_destino $ ./waf clean buid install $ cd /home/tu_user/directorio_destino/bin $ ./pino &
Espero sus comentarios
Crash de Glipper al iniciar Gnome
1
Desde hace tiempo (2 o 3 releases de Ubuntu hacia atrás) que Glipper viene haciendo clank al iniciar la sesión de Gnome, no he encontrado alguna razón del por qué. Buscando en los reportes alguien dijo que había que darle tiempo para que partes del escritorio estuvieran cargadas y luego pudiera correr Glipper.
Para corregir el crash de Glipper al inicio de sesión haz lo siguiente, edita el siguiente archivo /usr/lib/glipper/glipper con tu editor de texto favorito.
$ sudo vim /usr/lib/glipper/glipper
Y justo antes de que empiece la ejecución agrega un par de líneas, es un timer que hace un pequeño delay al inicio (justo bajo los comentarios línea 21 y 22):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #!/usr/bin/env python # Glipper - Clipboardmanager for GNOME # Copyright (C) 2007 Glipper Team # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # import time time.sleep(10) import gobject gobject.threads_init() |
Con eso debería bastar, si aun sigues con el problema juega con el numerito (10) hasta que encuentres el tiempo apropiado para tu inicio de sesión.
Nótese que esto es un parche y que no arregla el problema de fondo, seguiré investigando a ver que puede hacer, pero con esto ya queda funcionando.
Reparar el molesto ruido que genera Pulseaudio en Ubuntu Karmic
6Después de haber navegado por todos lados buscando el por qué PulseAudio genera un ruido molesto (se pedorrea), encontré una explicación y al parecer es que por ahorro de energía el dispositivo de audio lo desconecta provocando un chasquido molesto cada N segundos definidos en la configuración. (se conecta y se desconecta)
Solución: Modificar el archivo donde se configura dicho parámetro:
$ sudo gedit /etc/modprobe.d/alsa-base.conf
Luego buscar la linea que dice mas o menos así:
# Power down HDA controllers after 10 idle seconds options snd-hda-intel power_save=10 power_save_controller=N
Y finalmente hay que modificar el parámetro que dice power_save=10 aumentando el valor o simplemente comentando la linea, quedando de la siguiente forma:
# Power down HDA controllers after 10 idle seconds # options snd-hda-intel power_save=10 power_save_controller=N
Esto funciona bien en mi maquina, un HP530 con tarjeta de sonido intel:
$ lspci Audio device: Intel Corporation 82801G (ICH7 Family) High Definition Audio Controller
Listo… ahora a trabajar!
Pequeño script de ubiquity
2![]()
Como todos sabrán, Ubiquity es un complemento para Mozilla Firefox que trata de acercar a la web el lenguaje natural, como por ejemplo, puedes decirle, google wikipedia y ubiquity realizara la búsqueda en Google con la palabra Wikipedia. Además tiene un pequeño recuadro de preview donde mostrara los posibles resultados de búsqueda (ver imagen):
Mas información acerca de Ubiquity en Firefox Chile.

Hoy visitando algunos sitios me encontré con que muchos de ellos publican las URL’s sin que sean un link, es decir, un texto simple al cual no se le puede hacer clic y visitar dicho link.
De ahí partió la necesidad de tener algo a la mano que me permita abrir estos pseudolinks, miré rápidamente ubiquity para ver si tenía un comando para este problema y me fue mal. Entonces me decidí a hacerlo yo mismo
, les dejo el código para que lo enchulen mejoren a su medida o hagan sus contribuciones.
/* * Open URL selected in browser. */ CmdUtils.CreateCommand({ names: ["openurl"], icon: "http://www.mozilla.com/favicon.ico", description: "Abre una pestaña con la url seleccionada", help: "open + selected url", author: { name: "Francisco Collao Garate", email: "pcollaog[at]firefox[dot]cl" }, license: "GPL", homepage: "http://blog.pcollaog.cl/", arguments: [{role: 'object', nountype: noun_arb_text}], preview: function preview(pblock, args) { var selectedText = args.object.text; if (Utils.isEmpty(selectedText)){ pblock.innerHTML = "Debes seleccionar una URL."; }else{ pblock.innerHTML = "Abrirás la siguiente URL en una nueva" + " pestaña: <strong>" + selectedText + "</strong>"; } }, execute: function execute(args) { var selectedText = args.object.text; // TODO: validar que la URL sea valida if (Utils.isEmpty(selectedText)) { return; } Utils.openUrlInBrowser(selectedText); displayMessage("Se abrirá la siguiente URL: " + selectedText, this); } });
El código se divide en dos grandes partes, la función preview y la función execute, que como sus nombres lo dicen, una muestra una previsualización de la acción y la otra ejecuta la acción.
Analicemos primero la función preview:
Lo primero que hace es obtener desde el argumento la URL seleccionada asignándosela a la variable selectedText y luego valida que ésta variable no este vacía. En ambos casos (vacía o no) se le envia un mensaje al usuario en el cuadro de preview (en el cuadro de dialogo abajo).
Vamos ahora por la función execute:
Hace lo mismo que la función preview al principio, es decir, asigna el valor del argumento a una variable y valida que no este vacía.
Luego viene la parte interesante, toma la URL seleccionada y haciendo uso de la función Utils.openUrlInBrowser() nos permite abrirla en una nueva pestaña. Luego de eso mandamos una notificación al usuario sobre la acción ejecutada, para eso utilizamos la función displayMessage().
Eso seria por ahora, ahora a seguir jugando con Ubiquity. Espero sus comentarios y/o aportes.
Código: OpenURL ubiquity code
Agregar llaves de repositorios apt en Ubuntu
8Les ha pasado que cuando agregan repositorios extras a su sources.list a veces apt alega de que los paquetes no están firmados o de que no puede encontrar la llave para verificarlos?
Bueno… la mayoría de las veces uno no pone atención y le da aceptar al apt, entonces ¿Cómo podemos hacerlo de la forma correcta?
- Primero: Debes estar seguro que el repositorio es fiable, es decir, que puedas confiar en lo que los desarrolladores ponen a disposición de los usuarios. Ha pasado que a veces los repositorios son intervenidos por manos negras y alteran los paquetes agregándoles algo que beneficie al atacante. Paso hace un tiempo atrás en debian y los repos de fedora.
- Segundo: Una vez que tienes certeza del primer punto, puedes importar la llave del repositorio en cuestión. ¿Cómo se hace eso? veamos un ejemplo
Descargados 55,6kB en 4min 39s (199B/s) Leyendo lista de paquetes... Hecho W: Error de GPG: http://ppa.launchpad.net jaunty Release Las firmas siguientes no se pudieron verificar porque su llave pública no está disponible: NO_PUBKEY B9F1C432AE74AE63 W: Error de GPG: http://192.168.1.101 testing Release Las firmas siguientes no se pudieron verificar porque su llave pública no está disponible: NO_PUBKEY A040830F7FAC5991 W: Error de GPG: http://192.168.1.101 intrepid Release Las firmas siguientes no se pudieron verificar porque su llave pública no está disponible: NO_PUBKEY 079A381C44869960 W: Tal vez quiera ejecutar 'apt-get update' para corregir estos problemas
Si esto les ha pasado mas de una vez es porque les falta la firma y llave de ese repositorio, entonces hagámoslo de la forma clásica:
Primero importamos la llave con lo que sale en la información del error de apt, donde dice NO_PUBKEY NUMERO y luego el segundo comando exporta la llave importada para que apt-key pueda agregarla a su llavero.
$ sudo gpg --keyserver keyserver.ubuntu.com --recv 079A381C44869960 $ sudo gpg --export --armor 079A381C44869960 | sudo apt-key add -
Una forma un poco mas eficiente es utilizando el comando apt-key directamente, veamos como se hace todo en un solo paso:
$ sudo apt-key adv --recv-keys --keyserver \ keyserver.ubuntu.com 079A381C44869960
De esta forma no utilizamos el llavero o keyring de gpg sino que usamos directamente el llavero de apt. Este lo pueden ver en /etc/apt/trusted.gpg
Ahora bien, para facilitarnos la vida en ubuntu (no se si debian lo tenga, creo que no) existe un paquete (que hay que instalar) llamado add-apt-key que nos permite hacer este mismo trabajo de forma mas simple. Lo primero es instalar el paquete:
$ sudo apt-get install add-apt-key
Luego importamos las llaves de la siguiente forma (como root):
$ sudo su - # add-apt-key --keyserver keyserver.ubuntu.com 079A381C44869960
Es todo por hoy, espero que les sea útil este pequeño post. En otra oportunidad profundizaré en los conceptos de gpg, llaves y llaveros.