21/08/2013

Lanzar una aplicación Java desde icono en Ubuntu Linux

Una vez hemos conseguido que nuestra aplicación Java corra en nuestro equipo con Linux (Ubuntu 12.04 LTS), tal como se explica en la entrada anterior del blog, el paso final lógico será el ahorrarnos tener que lanzarla desde el Terminal pudiendo hacerlo desde un icono como el resto de aplicaciones del sistema, icono que además podemos personalizar elaborándolo nosotros. Vamos a ver cómo debemos proceder para ello.

Primero diseñamos un icono, yo lo he hecho desde Gimp pero puede usarse cualquier software, o bien usar una imagen que ya tengamos lista. A modo de ejemplo he puesto simplemente un fondo de color y las iniciales de la aplicación. Un diseño bastante mejorable pero insisto en que es solo un ejemplo rápido.

Creamos el icono


Una vez lo tengamos listo lo guardamos en formato .png ó .xpm o en cualquier formato de icono que sea compatible. Yo lo he hecho en PNG.

guardamos el icono en formato png


Con el icono y el archivo ejecutable .jar localizados abrimos el terminal y escribimos:

sudo gedit /usr/share/applications/nombre-de-nuestra-aplicación.desktop

Con este comando lo que hacemos es, con acceso root, ir a la carpeta de aplicaciones del sistema y crear un archivo .desktop para que Linux sepa que hay una nueva aplicación gráficamente accesible.
Se nos abrirá un archivo de texto vacío .desktop en el que escribiremos lo siguiente:

[Desktop Entry]
Name=nombre de nuestra aplicación
Comment=una descripción corta que puede ser el mismo nombre de la aplicación
Exec=java -jar ruta-del-archivo-ejecutable.jar
Icon=ruta-del-icono.png
Terminal=false
Type=Application


creamos el archivo .desktop


Una vez escrito guardamos el documento. Cerramos los programas y reiniciamos el sistema. Vamos al launcher de aplicaciones y buscamos nuestra aplicación y si todo ha ido bien ahí debe aparecer:

Launcher de aplicaciones de Ubuntu con el icono de nuestra aplicación


Simplemente haciendo click en el icono la aplicación se ejecutará.

aplicación Java corriendo en Ubuntu


Si además queremos fijar el icono en el launcher únicamente tenemos que, mientras se ejecuta la aplicación, dar al botón derecho del ratón en el icono de la aplicación en el launcher y elegir “Lock to Launcher”

Fijar icono de nuestra aplicación al launcher

19/08/2013

Java Básico: Convertir en ejecutable una aplicación Java con NetBeans en Ubuntu Linux

Una vez que hemos terminado el código de nuestro proyecto en NetBeans lo lógico es que queramos que esa aplicación funcione “fuera” del IDE y pueda ser usada en cualquier otro equipo. Para ello debemos compilar el proyecto y generar un archivo .jar que será el que ejecutaremos para hacer funcionar nuestra aplicación.

Voy a mostrar paso por paso cómo he conseguido hacerlo en la distribución de Linux Ubuntu 12.04 LTS:

En nuestro proyecto en NetBeans damos al icono de la escoba y el martillo, si nos fijamos, en el panel de la izquierda, pestaña “files” habrá aparecido una nueva carpeta en el proyecto denominada “dist”. En su interior NetBeans habrá creado el archivo .jar de nuestro proyecto:

Compilando con NetBeans
Compilamos el proyecto mediante el icono del martillo y la escoba ("Clean and Build Project")

Accediendo al .jar en NetBeans
En el panel de la izquierda, en la pestaña Files, aparece la nueva carpeta "dist" con el archivo ejecutable .jar dento


Ahora ese archivo .jar, que podemos cambiar de ubicación si queremos, deberemos ejecutarlo desde el Terminal mediante el comando:

java -jar “ruta-completa-del-archivo.jar"

Para obtener esa ruta completa lo que yo hago es arrastrar el icono del archivo .jar a la ventana del Terminal y automáticamente se crea la ruta completa a ese archivo.

Creando la ruta de un archivo en el Terminal mediante drag and drop


Creando la ruta completa de un archivo en el Terminal mediante drag and drop


Una vez hecho esto lo único que hay que hacer el completar el comando con “java -jar “ delante de la ruta.

comando para ejecutar un .jar en Ubuntu Linux


Dando Enter, y si todo está correcto, la aplicación deberá ejecutarse.

Posibles problemas en la ejecución: UnsupportedClassVersionError

Debemos prestar atención especialmente al JDK que hemos usado para la compilación del proyecto y a la máquina virtual que usa nuestro equipo para ejecutar las aplicaciones Java. Si estamos portando la aplicación desarrollada en nuestro equipo personal a otro distinto debemos comprobar previamente que tiene instalada una máquina virtual de Java y si no la tiene descargarla e instalársela, y que las versiones de compilación y ejecución coincidan.

En mi caso mi NetBeans compilaba con un JRE superior a la versión que luego usaba el sistema, lo cual me daba un error de tipo:

Exception in thread "main" java.lang.UnsupportedClassVersionError: ruta/del/paquete/de/mi/aplicación : Unsupported major.minor version 51.0

Para solucionarlo hay que cambiar la versión de la máquina virtual de Java que usa nuestro sistema, lo cual haremos mediante el comando:

sudo update-alternatives --config java

Nos aparecerá un listado con las versiones de las máquinas virtuales que están instaladas en nuestro sistema y elegiremos la que nos convenga.

Elección de máquina virtual JVM JRE en Ubuntu


En mi caso, al usar el JDK7 debía elegir la java-7-openjdk, que correspondía al número 2. Por tanto 2+Enter y solucionado.


Otra opción podría ser aplicar la táctica inversa, es decir, variar la versión de la máquina virtual de Java que usa NetBeans previamente a la compilación del .jar para que coincida con la del sistema.

Referencias


17/08/2013

ESCANEO DE SEÑALES WIFI CON LINSSID EN UBUNTU 12.04 LST

A raíz de escuchar el podcast de Enteratec en el que se hablaba de cómo mejorar la señal WiFi de nuestras redes locales decidí investigar para ver si mejoraba la recepción de la señal WiFi en mi equipo. Vivo en una casa distribuida en dos pisos y, estando el router en el de abajo y mi portátil en el de arriba, no siempre la señal que recibo es la mejor.

En el podcast mencionado se apunta a la saturación de los canales de emisión de WiFi por proliferación de routers como una de las posibles principales causas de la pérdida de señal, por interferencia pura y dura. Si emites en el mismo canal que los ocho vecinos que te rodean la intensidad (claridad, limpieza a la hora de transmitir los paquetes de datos) de la señal de tu red debe verse afectada con mucha probabilidad. Así pues la solución parece evidente: cambiar el canal de emisión de nuestro router.

Pero claro, nuestros routers pueden emitir en 13 canales (hay un catorceavo canal que al parecer no está permitido usar, desconozco el motivo) e ir probando uno a uno y comprobando si mejora en algo la señal o la navegación, se me hacía una idea demasiado tediosa. Así pues pregunté en el mismo blog del podcast de Enteratec por soluciones para, escaneando las redes WiFi de nuestro entorno, descubrir por qué canales emiten y así decidir cuál sería el más indicado para emitir nosotros, el menos saturado vamos. Desde el blog se me apuntaron un par de soluciones de software, concretamente Wifi Explorer para Mac y Netsurveyor para Windows. Pero claro, ahora estoy con Ubuntu y aunque podría arrancar el ordenador con mi partición de Windows me apetecía investigar un poco para ver qué podía ofrecer Linux para este tipo de problemas.

La comunidad

Tras algunos intentos googleando dí con la solución. Había encontrado al parecer otra buena alternativa para Windows y Mac con la app gratuita inSSIDer, pero desgraciadamente no la habían desarrollado para Linux. Partiendo de esa base no tardé en dar con el desarrollo de su equivalente para Linux en el foro de metageek.net. Lo que más me llama la atención, y es la segunda vez que me ocurre en poco tiempo, es ver como en el mundo Linux la comunidad de desarrolladores alternativos está siempre dispuesta para ayudar casi desinteresadamente. Me ocurrió con el driver para mi pulsómetro Garmin y me volvía a ocurrir ahora. Una persona decidía currarse una solución para la plataforma, así porque sí y porque le apetecía, y compartirla con toda la comunidad. Me llama especialmente la atención el comienzo de la presentación en el foro de este desarrollador, de nombre Warren, algo así como “viéndome con demasiado tiempo libre y con ganas de aprender Qt4 en C++ he desarrollado para Linux un escaner de WiFi similar a InSSIDer llamado LinSSID”. Bendita comunidad de desarrolladores y bendita envidia sana que siento.
A continuación, en el foro, se explica cómo descargar la aplicación y se suceden una serie de mensajes por parte de un moderador en los que se reportan bugs que el bueno de Warren ha ido solventando con pericia y decisión en sucesivas versiones hasta tener terminada la aplicación más o menos definitiva.

Instalación de LinSSID en Ubuntu 12.04 LTS

Se indica cómo hacerlo en la entrada del foro pero lo reproduzco aquí con capturas de pantalla:

1/ Desde el Terminal añadimos el repositorio correspondiente a nuestra lista de fuentes con el comando:
sudo nano /etc/apt/sources.list



2/ En el listado de fuentes que nos ha aparecido añadimos la línea siguiente:
deb http://ppa.launchpad.net/wseverin/ppa/ubuntu precise main

Con la combinación de teclas Ctrl+X pasamos al menú de salida en el que elegimos Y+Enter para guardar el fichero de fuentes.



3/ Escribimos el comando de actualización:
sudo apt-get update

4/ Y finalmente el comando de instalación:
sudo apt-get install linssid

Con ello ya tendremos disponible la aplicación LinSSID en Ubuntu 12.04 LTS. Desconozco si en el resto de distribuciones son válidas estas instrucciones de instalación.



LinSSID
logo de LinSSID


La aplicación en sí es realmente sencilla. Cuando la ejecutamos aparece una primera ventana en la que se nos pide el password (de administrador entiendo) y una vez introducido pasamos ya a la interfaz de la aplicación en sí.



Es una interfaz muy intuitiva en la que con un solo vistazo podemos hacernos una idea de las opciones que se nos ofrecen. En la parte media superior nos aparecerá el listado de redes wifi que capta nuestro equipo, así como sus datos de interés (identificador, MAC, canal, Protocolo o intensidad de la señal).

En la parte media inferior tenemos tres pestañas, la primera de ellas nos muestra una evolución gráfica temporal de la intensidad de las señales captadas, la segunda pestaña, la de 2,4 GHz nos muestra los canales en los que se distribuyen las distintas redes y también su intensidad. La tercera pestaña es para redes de 5 GHz y por tanto no nos aporta información.

Si damos a la tecla Run (en la parte superior de la ventana) comienza el análisis de las redes.


En mi caso mi red de +Pepephone (color rojo) está emitiemdo por defecto por el canal 1 en el que se aprecia que hay bastante tráfico (otras tres redes más, aunque de menor intensidad). Salta a la vista que el canal 4 no lo está usando nadie así como el "hueco" que existe ente los canales 8 y 9.

Con esta información podemos acceder a nuestro router (escribiendo 192.168.1.1 en el campo de direcciones de nuestro navegador) y cambiar el canal de emisión. Así lo he hecho, pasando del canal 1 al 9 la emisión de mi router.


Una vez guardados los cambios he vuelto a realizar el análisis con LinSSID y el resultado ha sido el siguiente:



Ahora mi red (color azul) emite en ese hueco que había en el canal 9 y aunque se topa con las redes de alrededor al menos está en una zona más libre del espectro de emisión.

Resultados tras cambiar al canal 9

Una vez realizado el cambio de canal no he notado mejora significativa en la intensidad de la señal que recibe mi equipo, que parece más o menos la misma que antes. Tampoco los indicadores de intensidad de LinSSID marcan mejores registros pero sí que es cierto que he notado una sensible mejora en la velocidad de navegación que ya de por sí hace que el rato haya merecido la pena.

/// Actualización ///

Una vez publicado el post he recibido un comentario muy interesante de +Adrián Granados en el que se me indica que:

1- La intensidad de la señal no depende del canal de emisión sino de la separación entre el equipo y el router.

2- La mejora que puede obtenerse encontrando el canal adecuado consiste en una navegación más rápida y estable, confirmando el resultado que había obtenido al cambiar al canal 9 de emisión.

3- El canal más recomendable en mi caso no sería el 9 sino el 11 debido a que "aunque haya otras redes usando ese canal, su intensidad de señal es tan baja que no debería ser un problema". Efectivamente, además en el 9 estoy entrando en "conflicto" con otras seis redes mientras que en el 11 sólo encontraría 3 redes de menor intensidad. Una vez realizado el cambio el resultado es el siguiente: