Demuestra tu amor por el Software Libre

I love Free Software!

En el abismo de tux nos sigue gustando el FLOSS tanto por sus ventajas éticas, técnicas y económicas.

Así que, como parte de la campaña show your love for Free Software de la FSF Europe quiero agradecer a los siguientes 5 proyectos que desde mi punto de vista son parte fundamental en mi actual vida digital, vale resaltar que hay más proyectos que utilizo día a día pero seria muy difícil nombrarlos a todos.

1) Funtoo Linux y Gentoo Linux: Gracias a toda la gente del Funtoo core team y a todos los devs de Gentoo por crear un sistema operativo tan maravilloso, eficiente, rápido y versátil, administrar mi computadora es una tarea cómoda con las herramientas tan poderosas que hacen de Gentoo ser el líder de las metadistribuciones basadas en código fuente.

2) WordPress: Gracias a todos los devs de WordPress que hacen posible que este blog, mi blog en ingles, mi blog de fotos, el website de Guatejug, el website de Shekalug y algunos otros sitios que administro estén a la vista de todo mundo, a pesar de que he usado otros CMS, WordPress se ha ganado el #1 en mi corazón.

3) OpenJDK: Gracias por impulsar el desarrollo de la maquina virtual para el lenguaje de programación #1 del mundo, a pesar de las criticas por «trabajarle de gratis a Oracle» he seguido de cerca el proyecto y he visto el dinamismo con el que se administra, mención especial a IcedTea por facilitar la instalación libre de OpenJDK.

4) TeXLive: Gracias por todas las noches que llevamos juntos en mi exilio en Brasil junto a TexStudio, han hecho de mi estadía un poco menos complicada.

5) Firefox: Nos conocemos desde tiempos propietarios, y a pesar de que la competencia también es libre Firefox siempre tiene cosas que lo hacen único.

Por supuesto todo este trabajo es soportado por dos grandes jugadores, kernel.org y  GNU pero ellos recibirán suficiente amor este día.

Creo que ha sido suficiente melosidad por hoy
pukerb

POSIX capabilites con la maquina virtual de Java en Linux

TShirt2003Dentro del contexto de verificación de permisos en sistemas UNIX, la mayoría de implementaciones (Linux, MacOS, BSD) presenta dos categorías básicas de procesos:

  • Procesos privilegiados que necesitan ser ejecutados por un usuario con user id 0 o sea root
  • Procesos no privilegiados que pueden ser ejecutados por cualquier usuario sin importar su user id

Los procesos privilegiados por defecto omiten todas las verificaciones de seguridad propias del kernel, y aunque el camino mas rápido para ejecutar este tipo de procesos es ejecutarlos como root, existen entornos de mínimos privilegios donde esto no es deseable. Motivado por esto y  desde el kernel 2.2, Linux divide los permisos de root en 32 unidades denominadas Linux capabilites, con lo cual es posible conceder ciertos privilegios a los procesos sin que esto signifique dar el acceso total como root.

Permisos para la JVM
Para utilizar Linux capabilities es necesario asignar los permisos sobre el ejecutable que deseamos administrar, vale la pena resaltar que Linux capabilities no esta diseñado para funcionar sobre links simbolicos y hay que encontrar la ruta real donde esta ubicado nuestro ejecutable:

$ whereis java
java: /usr/bin/java /opt/icedtea-bin-7.2.3.4/bin/java

Una vez hemos determinado donde se encuentra el ejecutable asignamos uno de los 32 permisos sobre el ejecutable, por ejemplo para habilitar el acceso raw a sockets (CAP_NET_RAW)

# setcap cap_net_raw+epi /opt/icedtea-bin-7.2.3.4/bin/java

Luego de asignar los permisos es probable que al ejecutar Java obtengamos el siguiente error:

/opt/icedtea-bin-7.2.3.4/bin/java: error while loading shared libraries: 
libjli.so: cannot open shared object file: No such file or directory

De acuerdo a un bug publicado en el bugtracker de java esto se debe a que algunas bibliotecas como libjli.so no estan dentro del path «bendecido» por el kernel (/usr/lib) y por lo tanto a pesar de que el ejecutable tiene garantizados los permisos, la biblioteca no.

Solución
Para que estas bibliotecas formen parte de las bibliotecas «bendecidas» la solución es agregar un archivo de configuración dentro de /etc/ld.so.conf.d/ con el mismo nombre del ejecutable, en este caso java.conf, el contenido de este archivo deben ser los directorios autorizados

cat "/opt/icedtea-bin-7.2.3.4/jre/lib/amd64/jli/" >> /etc/ld.so.conf.d/java.conf

Vale la pena resaltar que a diferencia de capabilities, ldconfig si trabaja sobre enlaces simbólicos, y en sistemas como Gentoo donde se puede tener más de una maquina virtual la sintaxis alternativa seria:

cat "/etc/java-config-2/current-system-vm/jre/lib/amd64/jli" >> /etc/ld.so.conf.d/java.conf

Hecho esto podemos comprobar que todo este funcionando de manera correcta, la salida debería ser similar a la siguiente:

# ldconfig | grep libjli
libjli.so -> libjli.so
# java -version
java version "1.7.0_09"
OpenJDK Runtime Environment (IcedTea7 2.3.4) (Gentoo build 1.7.0_09-b30)
OpenJDK 64-Bit Server VM (build 23.2-b09, mixed mode)

Acerca de los agujeros de seguridad en Java

FlamingGodzilla
A estas alturas ya sabrán que hay una cantidad absurda de noticias respecto a subsecuentes agujeros de seguridad en la maquina virtual de Java.
Hace un tiempo escribí un poco al respecto de los planes que tiene Oracle, sin embargo hay información nueva vale la pena resaltar para seguirle los pasos a Oracle para ver como termina todo esto y ver si es tiempo de migrar todo a Ruby en Patines :).

¿De que se trata este problema, puedo ser afectado por estos errores?

Como explica Tim Boudreau en una descripción detallada del error, los Java applets son pequeños programas que se ejecutan en el explorador web similar a programas en Javascript o Flash. En su diseño original estos programas son ejecutados dentro de un «sandbox» en la JVM para que en teoría solo puedan realizar operaciones limitadas y solicitar autorización al usuario cuando requieren privilegios elevados como por ejemplo acceder a archivos dentro del computador o utilizar dispositivos de entrada.
El problema inicia cuando varias personas han encontrado como saltarse el sandbox de Java y ejecutar estas operaciones sin solicitar permisos al usuario.

¿Porque el problema con Java ha tenido tanta cobertura?

Oracle afirma existen más de mil millones de instalaciones de Java que al existir estos errores se convierten en mil millones de potenciales puntos de ataque (similar a lo que ocurria con Flash), ademas de esto porque el record de Java en seguridad ha sido considerablemente bueno con lo cual tantos problemas en un corto periodo de tiempo se ha vuelto una sorpresa.

¿El problema puede afectarme a mi?

La respuesta es: depende, este error no afecta a las instalaciones de escritorio, enterprise o embedidas de Java porque estas sencillamente se ejecutan con todos los privilegios, sin embargo si un usuario acostumbra visitar paginas de dudosa procedencia podría ser atacado no solo mediante Java, sino también con códigos más simples en Javascript o Flash, el saltarse los sandbox no es algo nuevo para los atacantes.

¿Quien es el responsable de actualizar Java, porque la respuesta es tan lenta?

La respuesta de nuevo es depende, existe más de una maquina virtual de Java donde cada uno de sus creadores es responsable de mantenerla al día. En el caso de las maquinas virtuales soportadas por Oracle (Hotspot, JRockit y OpenJDK) el responsable es Oracle (duh!) que tiene una política bastante clara pero poco conocida al respecto del manejo de estos errores, en palabras de seres humanos normales es «si el error no es tan grave, la actualizacion llegara en un periodo maximo de 3 meses, si el error es muy grave, se generará una actualización de seguridad en el menor tiempo posible», motivado de nuevo por la relativa omnipresencia de Java lo que significaría un dolor de cabeza a varios administradores de sistemas, especialmente aquellos que tengan un numero considerable de sistemas a su cargo.

¿Y porque no se hacen actualizaciones incrementales como en Windows o Linux?

Básicamente por la forma monolítica en la que esta construida la maquina virtual. Aunque Oracle mantiene la maquina virtual de referencia (OpenJDK) decisiones tan radicales son planificadas por el JCP (el consorcio que dirige el desarrollo de Java). Sin embargo esta característica ya esta planificada y depende del avance del proyecto Jigsaw para la modularización de Java, entonces es cuestión de tiempo.

¿Todo es culpa de que el código sea propietario?

Diremos que en parte si, que el software sea Open Source o no nunca garantiza que un software no tenga fallos de seguridad (de hecho son bastante comunes) pero generalmente garantiza que habrá alguien cuidando que el software reciba más colaboraciones.
Aunque la mayoría de código fuente fue liberado por Sun, el plugin para navegadores web fue parte de lo que no se pudo liberar porque Sun no tenia la propiedad intelectual sobre algunos componentes y las implementaciones libres de Java como IcedTea tuvieron que implementarlo a su modo.

Oracle no ha comentado al respecto ¿Le importan poco los usuarios y desarrolladores de Java?

Dejare que ustedes decidan esto para no parecer fan de Oracle (de hecho en estos momentos programo más en C++ que en Java). Motivado por estos hechos Oracle ha intentado obtener comentarios de la comunidad de desarrolladores Java acerca de la mejor forma de manejar este problema y asignó un encargado de tiempo completo para estas políticas de seguridad, si tienen curiosidad pueden escuchar en The Aquarium la discusión de este encargado con los JUG Leaders mundiales que básicamente representan a la comunidad Java a nivel mundial.

A mi me gusta Java ¿Donde puedo colaborar o con quien tengo que hablar?

La ruta más corta seria entrar en contacto con su JUG más cercano y si están dispuestos a aportar código pues existen los proyectos AdoptOpenJDK y AdoptAJSR donde su ayuda sera bienvenida, vale la pena resaltar que los JUGs también tienen presencia en el JCP y pueden influenciar bastante.

A mi no me gusta Java ¿Vale la pena tener instalada la maquina virtual?

Depende de ustedes, en mi caso las dos veces que he sido «hackeado» fue porque deje sin bloquear mi computadora al alcance de mi novia. A opinion personal aun dependo mucho de Java y realmente me gusta la plataforma por sus virtudes, además necesito Java para utilizar Vuze, JDownloader, jugar Minecraft, y acceder a las paginas del Banco do Brasil.
Sin embargo si son adictos a la deep web y temen por su seguridad pero necesitan de Java en el escritorio, siempre esta la opción de deshabilitar solo el plugin web, de hecho Apple y Mozilla ya lo han hecho por ustedes mientras esta situación vuelve a estar bajo control.

[QuickTip] Copiar dependencias de un proyecto en maven

binary-107510-48999

Para copiar las dependencias de un proyecto podemos utilizar maven-dependency-plugin, por ejemplo:

<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>

Con lo anterior todas las dependencias de nuestro proyecto seran copiadas al directorio target/lib.

[QuickTip] Crear un jar con dependencias embedidas en maven

binary-107510-48999

Para crear un .jar con dependencias en maven, podemos utilizar maven-assembly-plugin. Por ejemplo si nuestra clase principal es org.foo.Main, bastaria con agregar la siguiente configuración al archivo pom.xml

<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>org.foo.Main</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin-->

Y listo, una vez que regeneramos el proyecto encontraremos un archivo-version.jar y tambien un archivo-version-jar-with-dependencies.jar en nuestro directorio target.

[QuickTip] Agregando anotaciones a archivos PDF con evince

1308725027Crear anotaciones sobre un PDF es el proceso más fácil del planeta, tan fácil que luego de buscar como loco durante 15 minutos encontré que Evince soporta de serie esta característica, que al menos para mi, es poco conocida.
Para esto basta con seguir los siguientes pasos:

  • Abrir su PDF favorito
  • En la esquina superior izquierda buscar la opcion «Thumbnails» y alternarla por la opción «Anotaciones»
  • Luego en la pestaña «Agregar» basta con presionar el icono de agregar, generalmente un lápiz, esto ultimo depende del tema de iconos.
  • Al realizar esto el cursor debería haberse transformado en un símbolo + y basta con hacer click para agregar la anotación.

A mi gusto el icono de anotaciones es bastante feo y puede ser cambiado por otros no tan feos, ademas de eso para no perder las anotaciones se debe guardar el PDF como una copia, de lo contrario perderán todas sus anotaciones :'(.

39 tutoriales de Java y relacionados

JuicyNewsNetwork

Limpiando bookmarks encontré algunos links interesantes de Java y tecnologías relacionadas que datan desde mis estudios de pregrado hasta épocas recientes.
Muchos de estos links son clásicos y otros los tengo en un lugar especial porque a pesar de los años, van al grano en sus explicaciones y aun son validos.

Por supuesto deben ser complemento y no reemplazo al tutorial oficial de JSE, JME y JEE.
JSE/General:

JEE/Java Web:

JME

Configuraciones y herramientas

Migración rapida desde Gnome hacia awesome-wm en Gentoo

Algunos posts atras comentaba mi experiencia con awesome-wm y Sabayon, luego de utilizarlo la mayor parte del tiempo decidí que era el momento de aceptar que me estaba gustando más que Gnome 3 a excepción de un solo detalle: perdía demasiado tiempo configurando el entorno y le he invertido mucho tiempo a Gnome.
Durante la instalación en mi computadora de casa (esta vez con Funtoo y compilando) note que el ebuild de awesome ofrece la use flag gnome, y si se compila con esta use flag  todas las configuraciones mencionadas en la wiki de awesome, se realizan de manera automática.
¿Que ventajas obtengo?
Entre las mas importantes y que me interesaban puedo mencionar:

  • Las aplicaciones recuperan las notificaciones via libnotify
  • Las teclas multimedia y especiales del teclado funcionan exactamente igual que Gnome (inclusive los screenshots con gnome-screenshot)
  • Las configuraciones de layouts de teclado y el shortcut de cambio (Shift+Caps Lock) son conservados

Podría continuar la lista pero básicamente obtengo todas las configuraciones propias de una sesion de Gnome dentro de awesome (o Gnome usando awesome como su window manager, como quieran verlo), mi sueño hecho realidad :D.
¿Algun problema con esta configuración?
Por defecto awesome utiliza el comando awesome.quit para cerrar sesión, pero al existir una sesion de Gnome en ejecución la sesión no es terminada y solo queda un lindo escritorio Gnome sin administrador de ventanas (otra referencia).

Mi solución para este inconveniente es utilizar gnome-session-quit como reemplazo a awesome.quit modificando el menú de awesome, el atajo de teclado de cierre de sesión y configurarlo como una ventana flotante en el archivo rc.lua:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#awesome menu config
myawesomemenu = {
{ "manual", terminal .. " -e man awesome" },
{ "edit config", editor_cmd .. " " .. awesome.conffile },
{ "restart", awesome.restart },
{ "quit", "gnome-session-quit --logout"}
}
....
#keyboard shortcut config
awful.key({ modkey, "Shift"   }, "q", 
function () awful.util.spawn("gnome-session-quit --logout") end),
...
#floating windows section
{ rule = { class = "gnome-session-quit" },
properties = { floating = true } },
....

Ademas de esto existe el inconveniente de que awesome depende de Gnome pero es un costo que no me molesta pagar a cambio de usabilidad y dejar de quebrarme la cabeza con el archivo rc.lua :).

Si la configuración es correcta obtienen algo como el siguiente screenshot:

Gentoo Linux 20121221 LiveDVD – End Of World Edition


Siguiendo con su tradición esporádica de lanzar ediciones especiales de LiveDVD como las que vimos en anteriores oportunidades con la versión 10 y la versión 12.1, el proyecto Gentoo publico un LiveDVD conmemorativo al fin del mundo que debe ocurrir exactamente a las 11:12 UTC (aproximadamente 4 horas después de la publicación de este post).
Como de costumbre el DVD presenta algunos paquetes actualizados en relacion a DVDs anteriores incluyendo Kernel 3.6.8, Xorg 1.12.4, KDE 4.9.4, Gnome 3.4.2, XFCE 4.10, Fluxbox 1.3.2, Firefox 17.0.1, LibreOffice 3.6.4.3, Gimp 2.8.2-r1, Blender 2.64a, Amarok 2.6.0, Mplayer 2.2.0, Chromium 24.0.1312.35.
De acuerdo a la publicación oficial no hay mucho por mostrar ya que el FAQ y el artwork siguen siendo los mismos. Entonces disfrutemos del fin de la humanidad utilizando uno de los sistemas operativos más eficientes del planeta y cantemos con R.E.M.

Last.fm player sobre un tunel ssh con proxychains

El año 2009 muchos usuarios frecuentes de Last.fm fuimos discriminados por no ser habitantes de Estados Unidos, Reino Unido o Alemania, y perdimos el acceso a las estaciones de radio gratuitas.
Luego de unos meses de usar un clásico tunel ssh, termine refugiándome en Shoutcast porque el reproductor web esta basado en Flash y reproductores de terceros como Clementine o Amarok solo funcionan con una suscripción activada.
Esto ultimo lo descubrí hace poco 😀 y luego de varios meses sin radios de Last.fm instale el cliente oficial. . . que no admite el uso de proxy socks (supongo que para evitar los tuneles ssh).

Y aquí es donde entra en juego proxychains, una herramienta diseñada para forzar las conexiones tcp de cualquier aplicación sobre un proxy y/o multiples proxies.

Paso 0: Instalación de proxychains
Instalamos proxychains con nuestro administrador de paquetes favorito, en el caso de Gentoo, usamos Portage.

1
# emerge proxychains

Paso 1: Configuración de proxychains
De acuerdo a la documentación del proyecto, proxychains presenta la siguiente jerarquía para su búsqueda de configuraciones:

1) ./proxychains.conf
2) $(HOME)/.proxychains/proxychains.conf
3) /etc/proxychains.conf **

Por defecto solo existira el archivo /etc/proxychains.conf el cual puede ser copiado a cualquiera de las primeras dos direcciones. Posteriormente agregamos a la seccion [ProxyList] nuestro proxy socks, en mi caso la sección tiene la siguiente estructura:

1
2
3
4
5
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
socks5  127.0.0.1 9999

Paso 2: Creación del port forwarding
Establecemos una conexión via ssh con un cliente que soporte características de port-forwarding (OpenSSH lo soporta de serie) creando con esto un proxy socks 5. Vale la pena resaltar que el servidor de destino debe de estar en alguno de los países admitidos por Last.fm.

1
# ssh -D 9999 usuario@servidor.com

Paso 3: Ejecución
Por ultimo ejecutamos proxychains y como parámetro la aplicación que deseamos que sea forzada a utilizar el proxy

1
$ proxychains lastfm

Si toda la configuración es correcta el reproductor lastfm se conectara a través de nuestro proxy: