jueves, agosto 23, 2007

Levísima mejora del programa de Amigo Invisible

Esto es bastante friki, la verdad. El programa es el mismo, no he cambiado absolutamente nada. ¿Entonces? Os cuento.

Una de las ideas que tenía cuando creé el programa es que fuera multiplataforma, cosa que es. Está escrito en java y eso le da mucha flexibilidad. Lo malo es que java no tiene lo que se dice un "lanzador universal", lo más parecido que hallé es crear un .jar. Pero tuve problemas porque tenía que usar algunas clases de la versión enterprise de java, y como casi nadie la tiene tuve que añadir dos .jar concretos a mi programa. Y meter un .jar dentro de otro .jar es un problema. Así que la única manera de lanzar el programa era poner java amigo2006.Amigo2006. Una mierda, vamos. Busqué un montón y no encontré ninguna solución libre. Así que me decidí por una chapuza. Para los Windowseros creé un .bat cutre y para los unixeros (Linux, Mac, Solaris, etc.) creé un shell script cutre.

Creía que todos los problemas los tenía solucionados, pero me equivocaba. En Windows no había problema, pero en Linux (concretamente en KDE) sí, ya que si en ese script le decía que ejecutara java amigo2006.Amigo2006 me decía que no encontraba el programa. Y es que cuando ejecutas un script desde KDE por defecto el script se ejecuta en /home/user, no tengo ni idea de por qué (me imagino que por temas de seguridad). Es decir, si haces un script que sea:

#!/usr/bash
dir=`pwd`
kdialog --msgbox $dir

Da igual donde esté el script, si lo lanzas desde kde te aparecerá /home/user. Si lo lanzas desde un terminal te pondrá el directorio en el que se encuentre el script (¿no os dije que esto era muy friki?). Esto es un problema, ya que si le dices al script que ejecute

java amigo2006.Amigo2006

no encontrará la carpeta amigo2006, ya que está buscando en /home/user/.

Así que ya cansado de buscar soluciones para empaquetar un programa hecho y funcionando me decidí por una chapuza más (total...). Obligué a los usuarios de unix (ya que me imaginaba que este problema también afectaría a otros entornos de ventanas) a poner el programa en /home/user/amigo1.0/ (donde user es el nombre del usuario). Escribí en su momento en mi blog:

Si tienes Linux, MacOS, Solaris, etc., bájate este archivo: amigo1.0.tar.gz

Descomprímelo en tu directorio home (de modo que todo quede almacenado en /home/username/amigo1.0/) y ejecuta el script llamado amigo. Lo mismo de antes, un poco chapuza, lo sé. Por cierto, sólo lo he probado con Linux/KDE, aunque debería funcionar con los sistemas operativos que he puesto arriba.


Así hasta que un día, gracias a un blog que ya no existe pero que me encantaba, Lechuga Hervida (no es la primera vez que hablo de este blog) encontré una forma de que un script supiera donde está ubicado. La forma es la siguiente:

dir="`echo $0 | sed 's:[^/]*$::g'`"

No me preguntéis que significa :P Bueno, sí. Parece que $0 es la ruta que se está ejecutando, es decir, la carpeta donde está seguido del nombre del script, y el comando sed le quita precisamente el nombre del script. ¡Ya tenía lo que quería!

Y me dije: pues lo tengo que añadir. Eso fue en febrero, y hoy lo he hecho :) A partir de ahora, si usas KDE (me imagino que en GNOME también pasará algo parecido, y en MacOS también) puedes instalar donde quieras mi programa y el script de lanzamiento funcionará.

Puedes descargarlo ahora mismo y leer el artículo original en el que se explica todo el funcionamiento.


Tags Technorati: , , ,

7 comentarios:

Inés dijo...

Yo te digo lo que significa :P

sed 's:[^/]*$::g'
"Sustituir (todo lo que aparezca al final del string) excepto la "/" por nada (no hay nada entre los dos ":"), es decir, eliminarlo. Y hacerlo en global ("g"), esto es, aplicar ese cambio en todo lo que se le pase como entrada a sed.
De algo me tenía que servir trabajar con tanto fichero CSV :)

Alex dijo...

Gracias por la explicación y sobretodo por leer el artículo. Después de escribirlo pensé que la mayoría de la gente se aburriría en el primer tercio. Menos mal que mi novia se lee todas mis paranoias mentales :)

Inés dijo...

Para eso estamos! :P

Groilés dijo...

Yo he pasado del primer tercio... lo juro!!

Alex dijo...

Sí, claro, tú has pasado directamente a los comentarios, que te he pillado!!

Groilés dijo...

Créeme tío, he desconectado cuando te has autocitado, demasiado para mí.

Alex dijo...

Te has perdido lo mejor :)