pabluk's blog
Development
Screenkey 0.2 released!
Jun 16th
- A preferences dialog to adjust size and position
- Two keyboard modes (normal and raw)
- Command line options (see –help)
- Some bug fixes
The next release will include support for Launchpad translations, save session to file and more keyboard modes (specific vim and emacs key bindings).
Thanks to Ivan Makfinsky for Fedora packaging and thanks to everyone who reported problems and made suggestions for improvement!
Another Counter… and J2ME
Apr 8th
Just to try Java Wireless Toolkit, also know as J2ME, on my Samsung C3050 mobile phone I wrote a silly and simple application called Another Counter, wich as its name says is used to count things, like a tally counter, then you can count people, events, measure traffic, etc.
A version of the toolkit for Linux can be downloaded from here, it includes build tools, utilities, examples, and a device emulator. With some knowledge of Java programming and reading the API is easy to write small applications like this.
To install and run the application on the phone you have to download these files: AnotherCounter.jad and AnotherCounter.jar.
The source code is licensed under GPL and hosted on GitHub.
Metacity Window Buttons
Mar 10th
Una simple herramienta para configurar los botones de Metacity (el window manager del escritorio GNOME).
Si estas usando Ubuntu Karmic Koala y querés configurar los botones para que se vean como en la nueva versión Lucid Lynx. O si usas Lucid Lynx y querés volver la configuración al estilo de Karmic Koala, lo podés hacer sin tener que usar el editor de configuraciones de GNOME (gconf-editor).
Me parece muy bueno el cambio en los botones de las ventanas para la nueva versión de Ubuntu, para hacerlo diferente, único. Costará un poco adaptarse pero es como todo, por eso yo ya cambié el estilo de los botones en mi Karmic
. De todas formas si a alguien no le gusta lo puede cambiar a su gusto, incluso si lo preferís, podés sacar todos los botones de las ventanas
Este es el enlace a la página de descarga.
Y estos son los pasos para descargarlo y ejectuarlo desde una terminal
wget http://launchpad.net/mwbuttons/trunk/v0.2/+download/mwbuttons chmod +x ./mwbuttons
La aplicación esta hosteada en Launchpad y la idea inicial fue solo para probar el módulo gconf de Python y el plugin de Launchpad para Bazaar.
Compilando php-gtk2 en Ubuntu 8.10
Jan 11th
Update! you can read this post translated to English here.
Escribo este post porque compilar PHP-GTK 2 en Ubuntu Intrepid no es tan obvio como debería ser, o al menos como dicen acá.
Descargué la última versión estable de PHP-GTK 2, la 2.0.1 pero al intentar compilarlo tira algunos errores, en LaunchPad hay un reporte sobre este bug. El fix para esto es
cd /usr/share/aclocal cat lt~obsolete.m4 ltoptions.m4 ltsugar.m4 ltversion.m4 >> libtool.m4
por un problema con libtool.
El tema es que después de hacer esto tampoco compiló. Se me ocurrió probar la versión del CVS de PHP-GTK pero pasaba el configure pero al hacer make tiraba otros errores.
La solución fue descargar la versión anterior a la estable de PHP-GTK, la 2.0.0. Este es el link para descargarla http://gtk.php.net/do_download.php?download_file=php-gtk-2.0.0.tar.gz
Una vez descargado, solo hay que hacer
./buildconf --with-phpize=/usr/bin/phpize5 ./configure --with-php-config=/usr/bin/php-config5 make sudo make install
Después para poder usarlo hay que crear /etc/php5/conf.d/php_gtk2.ini, con el siguiente contenido
extension=php_gtk2.so
para comprobar si el módulo carga correctamente
php -m|grep php-gtk
y listo, ese fue todo el post dominguero
Another Twitter command-line client
Jun 13th
No sé hasta cuando me va a durar, pero por ahora sigo usando Twitter. El tema o la excusa para escribir este script, es que es un embole tener un browser corriendo solo para ver los updates. Y aprovechando que la API esta por todos lados y no es nada complicado hacerse un cliente en cualquier lenguaje. En este caso lo hice con PHP, si si ya sé que podría haber usado hasta bash y tidy para esto. Pero esto fue lo más rápido que encontré para hacerlo, solo necesitaba PHP para parsear JSON y un poco de PEAR. Twitter también soporta XML, RSS y ATOM.
<?php
include ("HTTP/Request.php");
$user = "pabluk";
$pass = "pass";
$timeline = new HTTP_Request("http://twitter.com/statuses/friends_timeline/" .
$user . ".json");
$timeline->setBasicAuth($user, $pass);
$timeline->sendRequest();
$updates = array_reverse(json_decode($timeline->getResponseBody(), TRUE));
foreach ($updates as $update) {
if ($update['user']['screen_name'] == $user) {
echo "\033[32m" . $update['user']['screen_name'] . ":\33[37m " .
$update['text'] . "\n";
} else {
echo "\033[33m" . $update['user']['screen_name'] . ":\33[37m " .
$update['text'] . "\n";
}
}
?>
Bastante sencillo, muestra el username en color y uso array_reverse() para ordenar los updates en la terminal, así aparecen los más recientes al final.
Lo ejecuto con
pabluk@amidala:~$ php twitter-status.php
Para tenerlo cada tanto actualizado se puede correr con
pabluk@amidala:~$ while : ; do clear ; php twitter-status.php ; sleep 120 ; done
Y por supuesto que también se pueden enviar updates, usando curl
#!/bin/bash
curl -u "pabluk:pass" -d status="$@" \
"http://twitter.com/statuses/update.json" &> /dev/null
y haciendo
pabluk@amidala:~$ twitter-update.sh "fin del post..."
Webcam shots and the Picasa Web Data API
Jun 3rd

Hace unos días estuve probando darle algún otro uso a la webcam de mi latop. Y terminé probando esto.
Capturar imágenes con la webcam y enviarlas a un webserver, en este caso como no tengo un hosting ni tengo forma de llegar al puerto 80 de mi router desde internet, se me ocurrió usar la API de Picasa Web para subir las fotos a un álbum desde un script.
Para capturar las imágenes probé varios programas que están en los repos de Ubuntu, pero termine usando fswebcam que no está en los repos, más que nada porque soporta v4l2, que es el driver con el que funciona mi webcam.
Con fswebcam tomo la foto, le seteo el tamaño, un titulo, etc. Y usando curl subo la imagen a un álbum público de Picasa Web. La API de Picasa Web está bastante documentada así que no hubo muchos problemas para hacerlo.
Acá están los scripts para capturar la imagen y para subirla a Picasa Web.
#!/bin/sh
fswebcam --resolution 640x480 --timestamp "%d.%m.%Y %H:%M GMT-03:00" \
--banner-colour "#AA000000" --line-colour "#ff000000" --skip 50 \
--loop 30 --title "PaBLuK" \
--font "/usr/share/fonts/truetype/freefont/FreeSans.ttf:10" \
--exec subirFotoPicasa.sh ~/webcamshots/habitacion.jpg
Con la opción –exec ejecuta el script que sube la imagen después de capturada.
#!/bin/bash
FOTO="/home/pabluk/webcamshots/habitacion.jpg"
AUTHKEY="$(curl --silent https://www.google.com/accounts/ClientLogin \
--data Email=pabluk@gmail.com --data Passwd=eltuyo \
--data accountType=GOOGLE --data source=Google-cURL-Example \
--data service=lh2 | grep Auth)"
FOTOID="$(curl --silent --header "Authorization: GoogleLogin $AUTHKEY" \
"http://picasaweb.google.com/data/feed/api/user/pabluk/album/Webcam?kind=photo" \
| tidy -quiet -xml|grep -A 1 edit-media|grep href| cut -d "'" -f 2)"
curl --silent --request PUT --data-binary "@$FOTO" --header "Content-Type: image/jpg" \
--header "Authorization: GoogleLogin $AUTHKEY" "$FOTOID" | tidy -quiet -xml
En estas líneas se autentifica, toma el id de la imagen dentro del albúm, en mi caso el álbum se llama Webcam, y con la última línea sube y reemplaza la imagen.
Lo bueno:
- No se necesita tener un hosting.
- No me preocupo por el BW consumido, que no es poco.
Lo malo:
- No se puede agregar Javascript o algo para recargar la página de la foto automáticamente desde Picasa Web.
Freedesktop specs y mi patch para Conky
May 17th
Para los que no lo conocen se podría decir que Conky es un monitor de sistema, como gkrellm, nada más que este es un fork de Torsmo. Se lo puede utilizar para monitorear casi cualquier cosa, uso de CPU, memoria, tráfico de red, sockets, disco, mpd, etc. En esta imagen lo que está a la derecha es Conky.
Hasta ahí todo muy bueno pero tengo el problema que si maximizo una aplicación me lo tapa o cuando el window manager mapea una ventana nueva a veces me lo tapa. Y es un perno, al menos para mí.
Para solucionarlo probé cambiando el placement mode de mi window manager a Centered, Random, Smart y nada. Cambiar el tamaño del output device en Compiz tampoco, busqué si había alguna opción para que las ventanas solo se maximizaran hasta un tamaño máximo pero ni ahí. Tampoco era una solución que aparezca siempre encima de todas las ventanas, porque tapa el contenido de la ventana que queda debajo. En internet, incluida la web de Conky, no encontré nada, parece que a nadie le molesta
Después me dí cuenta de que el comportamiento que yo quería es como el de los panels de Gnome, así que fui a ver la fuentes de Conky y para entender un poco tuve que consultar algunas especificaciones de freedesktop.org, en especial esta.
Para bajar las fuentes y poder compilar Conky en Ubuntu hay que poner
sudo apt-get install build-essential sudo apt-get build-dep conky apt-get source conky
Después de un rato entendí que lo que había que hacer es setear una propiedad de la ventana de Conky que se llama _NET_WM_STRUT.
Y bueno con mi conocimiento básico de C hice este patch
--- conky-1.5.1.orig/src/x11.c 2008-03-31 01:56:42.000000000 -0300
+++ conky-1.5.1/src/x11.c 2008-05-17 16:03:21.000000000 -0300
@@ -535,6 +535,38 @@
return (long) color.pixel;
}
+/* Reserve space at the borders of the desktop */
+void set_strut(int window, int x, int y, int w, int h)
+{
+ Atom xa;
+
+ xa = ATOM(_NET_WM_STRUT);
+ if (xa != None) {
+ int left = 0;
+ int right = 0;
+ int top = 0;
+ int bottom = 0;
+
+ if (w < h) {
+ if (x <= display_width / 2) {
+ left = w;
+ } else {
+ right = w;
+ }
+ } else {
+ if (y <= display_height / 2) {
+ top = h;
+ } else {
+ bottom = h;
+ }
+ }
+
+ CARD32 prop[4] = { left, right, top, bottom };
+ XChangeProperty(display, window, xa, XA_CARDINAL, 32,
+ PropModeAppend, (unsigned char *) prop, 4);
+ }
+}
+
void create_gc(void)
{
XGCValues values;
--- conky-1.5.1.orig/src/conky.c 2008-04-01 00:52:20.000000000 -0300
+++ conky-1.5.1/src/conky.c 2008-05-17 14:45:58.000000000 -0300
@@ -7208,6 +7208,7 @@
window.height = text_height + border_margin * 2 + 1;
XResizeWindow(display, window.window, window.width,
window.height);
+ set_strut(window.window, window.x, window.y, window.width, window.height);
if (own_window) {
set_transparent_background(window.window);
}
Con eso funciona y queda solucionado mi problema!
Vim para CakePHP
Apr 8th
Hace un tiempo que me decidí a usar algún framework para PHP, cansado de tener que usar mis libs, que por supuesto estaban lejos de ser perfectas, pero que en su momento me fueron útiles. Terminé elegiendo, por ahora, CakePHP. Es bastante fácil de entender, mucho mas que el framework de Zend y se ajusta a lo que necesito… hacer mucho con poco esfuerzo
Lo único que me faltaba era decidirme por un IDE o un editor de código, a pesar de los grandes IDE como Eclipse y otros. Me terminé decidiendo por Vim, ya sé que muchos me recordaran que siempre me incliné por Emacs (ping Pepe) pero a pesar de es el mejor editor de texto, creo que Vim gana por su sencillez.
Así que ahora a configurar Vim para hacer más fácil la vida con CakePHP. Lo que voy a mostrar es como agregar el resaltado de sintaxis para los archivos .thtml usados en CakePHP.
Sacado de The Bakery, sitio donde se cocina CakePHP, estan estos sencillos pasos
mkdir ~/.vim vi ~/.vim/filetype.vim
y agregamos esto
" my filetype file
if exists("did_load_filetypes")
finish
endif
augroup filetypedetect
au! BufRead,BufNewFile *.thtml setfiletype html
augroup END
Solo queda guardar, salir y voilà!
mmm… rotar slogan con Drupal
Feb 23rd
Quizás no muchos sepan que últimamente me estoy dedicando, entre otras cosas, a desarrollar módulos para un CMS llamado Drupal.
La idea es que tengo ganas de hacer un módulo que eliga de una lista de slogans uno al azar para mostrar cada vez que se carga alguna página del sitio web. Puede ser que esta idea no sea muy original, es más quizás ya existe este módulo. Pero bueno si existe voy a ver en que estado está y sino lo voy a crear.
De más esta decir lo bueno que esta Drupal para desarrollar sitios web, es increíble!!, bien documentado, diseño modular, claro, etc….
Como setear el número de columnas en Emacs
Dec 11th
Algo que siempre olvido, al menos por ahora que estoy comenzando a usar Emacs, es como setear la cantidad de columnas a 72. Por lo general lo uso así cuando quiero editar documentos o notas en texto plano, solo para que se vean un poco más prolijas.
Buscando un poco en Google encontré la esta página que mas o menos decía lo que estaba buscando.
Resumiendo, las opciones son
- column-number-mode para ver el número de columna.
- set-fill-column para establecer la cantidad de columnas. En este caso es necesario pasarle como argumento el número de columnas. Lo podemos hacer con ‘C-u 3 Alt-x’ o ‘ESC 3 Alt-x’ ‘Alt-3 Alt-x’.
- auto-fill-mode para que corte automáticamente las líneas al ancho de las columnas.
Con esto me es sufiente por ahora para mejorar mi entorno Emacs.









Hi! this is my personal web site and weblog about my projects, news related to free and open source software, internet and sometimes about real life ;)