Category Archives: Linux

Netbeans y compiz fusion

netbeans 6 beta con compiz fusion

Si usas compiz fusion e intentas usar Netbeans te encontrarás con una hermosa ventana sin contenidos. Para solucionar este contratiempo, simplemente edita el ejecutable de netbeans (el cual es un script shell, {DIR_INSTALACIÓN}/bin/netbeans) y añadir donde te de la gana (en algún lugar que se ejecute siempre claro… al principio, por ejemplo) esta línea:

export AWT_TOOLKIT=MToolkit

Let’s code! (esto mismo es aplicable para todas las aplicaciones que usen el, feo de cojones, toolkit AWT para hacer GUIs en Java, no sería mala idea ponerte esa línea en tu ~/.bashrc, y tal)

 

Parodia de Novell de la campaña “Get a mac”

Los anuncios de Apple de I’m a Mac, I’m a PC han servido para crear un sinfín de parodias posteriores a estos anuncios originales. No conocía la existencia de tres anuncios de Novell (compañía detrás de SuSE Linux) bastante curiosos, sobre todo este primero (que en verdad es el segundo en orden cronológico):

Read More …

Envío de CDs de Ubuntu Gutsy disponible

Faltan 10 días para el lanzamiento de Ubuntu Gutsy y ya se puede solicitar el envío de CDs. Tanto para Ubuntu, como para Kubuntu e incluso para Edubuntu también. Esta vez el máximo son 2 CDs por persona de cada versión, aunque a usuarios “activos” en launchpad.net se les ofrece hasta 10 (supongo que este será el filtro que hacen, no lo sé realmente). Son totalmente gratuítos, sin letra pequeña o cosas similares. Yo ya he pedido los míos :), dos no son muchos, pero suficientes.

banner-ubuntu.png
banner-kubuntu.png
banner-edubuntu.png

Mejorando rendimiento en Linux de escritorio

Las necesidades de un equipo de “escritorio” son bastante peculiares y especiales. Necesidades muy diferentes a cualquier otro tipo de equipo. Es difícilmente predecible su comportamiento y, por lo normal, bastante erróneas o ineficientes las configuraciones por defecto del kernel, concretamente de la gestión de la memoria virtual (vm) o swap. Comentaré dos opciones interesantes de modificar, la primera de ellas bastante conocida y la segunda un tema algo menos popular pero muy importante también.

Swappiness. Si alguien está muy aburrido aquí hay una discusión bastante interesante sobre el tema de swappiness en linux. El valor de swappiness es el tema principal cuando se trata de optimizar Linux para el usuario de escritorio normal. Dado que actualmente los usuarios tienen cantidades ingentes de memoria ram, es muy interesante decremente el valor de swappiness para forzar al kernel a no usar la memoria virtual y maximizar el uso de memoria ram. ¿Qué significa el valor de swappiness realmente? Es un valor entre 0 y 100, que cuanto mayor sea, más le gustará al kernel mover datos “sin usar” de memoria (RAM) a disco. Si nos situamos en el escenario de un usuario de escritorio el cual no va a usar grandes programas (e.g. base de datos con cientos de usuarios concurrentemente) con su memoria ram va a ser más que suficiente para correr todas sus aplicaciones sin usar siquiera la totalidad de su memoria, es decir, queremos forzar a no usar la memoria virtual debido a que en cualquier momento vamos a usar programas que estaban “inactivos” y dado que nos sobra ram por todos lados (yo hasta hace poco estaba con 512mb y sobrado…) mejor usarla al máximo. Esto se consigue poniendo swappiness a niveles muy bajos, simplemente editar el fichero /etc/sysctl.conf y añadir una linea con, por ejemplo:

vm.swappiness=1

Si queremos hacer inmediato el cambio ejecutamos

# sysctl -w vm.swappiness=1

Cache pressure. En Linux existen dos tipos de caches que el kernel utiliza, una de bloques de datos y otra de inodes. La primera de ellas es para datos en general (por ejemplo, copiar un archivo, ahí se está usando la ram y luego se copiará a disco cuando esos bloques se quiten de la memoria) y la segunda para información sobre el sistema de ficheros (para acciones como abrir ficheros, directorios, búsquedas y similares). En un sistema de escritorio es bastante común la segunda tarea y dado que también es muy común el operar con grandes ficheros (por ejemplo descomprimir esa discografía de 1gb que te acabas de bajar) como estos dos tipos de caches compiten entre sí para conseguir memoria mediante el uso de un valor se decidirá quien tiene prioridad. Por defecto suele venir el valor de 100 para la propiedad vm.vfs_cache_pressure que indica que hay prioridad para la cache de bloques de datos. Es conveniente decrementar este valor para que haya una igualdad, por ejemplo a 50. Para comprobar la efectividad de esto se puede realizar una prueba del estilo de:

  • buscar archivos (se están cacheando inodes)
  • copiar un archivo gordo (se eliminan inodes de la cache dependiendo del valor de la propiedad)
  • buscar archivos de nuevo y contar el tiempo (según cuantos se hayan eliminado de la cache esta operación tardará más o menos, dependiendo del valor de vm.vfs_cache_pressure)

He hecho un script tonto que realiza esto mismo, necesitas tener al menos 3GB en /tmp y cuesta unos 5-10min o así, dependiendo de cuantos archivos tengas (puesto que se realizan unos cuantos find / xD). A mi esta prueba me da una mejora cercana al 25% al usar un valor 50 en vez del 100 inicial. En este caso una solución radical (poner el valor a 0) no sería muy óptimo puesto que, por lo normal, un usuario de escritorio va a hacer uso tanto de operaciones con ficheros grandes como navegación por el sistema de ficheros, por lo que a mi parecer la mejor opción es una solución salomónica, es decir, editar el fichero /etc/sysctl.conf y añadir una linea con:

vm.vfs_cache_pressure=50

Si queremos hacer inmediato el cambio ejecutamos

# sysctl -w vm.vfs_cache_pressure=50

Los 10 comandos Linux que más usamos

Después de verlo en numerosos blogs, como el de Maverick o MundoGeek , y dado que me encantan todas estas pijadillas relacionadas con estadísticas y similares, no me puedo resistir a no acoplarme a realizar este meme nacido por aclamación popular.
 
Sencillo, ejecutas esto y se mostrarán los 10 comandos que más has usado últimamente, si quieres saber más de como funciona el comando, usar man o lee la explicación de Maverick, por ejemplo.

history|awk '{print $2}'|awk 'BEGIN {FS="|"} {print $1}'|sort|uniq -c|sort -rn|head -10

He aquí mis resultados en mi ordenador principal

blaxter@helicon:~$history|awk '{print $2}'|awk 'BEGIN {FS="|"} {print $1}'|sort|uniq -c|sort -rn|head -10
    139 find
     89 ls
     64 cd
     22 rm
     19 svn
     18 sudo
     12 xjc
     11 for
     10 java     
      9 vi

De lo cual se puede concluir que me gusta navegar por consola (find,ls,cd,rm) y uso subversion para la gestión de mi código, el cual últimamente es xml & java (svn, java, xjc).
 
¿Y tú?, ¿cuales son tus comandos?, dejo el meme abierto para quien quiera hacerlo, puedes ponerlo en los comentarios o en tu blog :). Esto es como el marujeo llevado a la consola y comprimido en un comando.

Actualización 18 abril 2008: Acabo de volver a ver este meme, así que me han entrado ganas de actualizar el post con datos actuales. Esta vez tengo el history size a 10 mil, así que los números son bastante más gordos.

blaxter@helicon:~$ history | awk '{a[$2]++ } END{for(i in a){print a[i] " " i}}' |sort -rn|head
610 cd
533 ls
305 sudo
107 more
98 rake
92 svn
76 script/server
71 vi
69 script/console
53 irb

Impresión desde aplicaciones Java con CUPS

Las JVM tienen un bug reportado y solucionado hace poco que afectan a las versiones tanto de java 5 (fixeado en update 12), como java 6 (hasta el update 1). Curiosamente en los repositorios de ubuntu tenemos las versiones justo anteriores a éstas, por lo tanto existe el bug. Este bug consiste en que es imposible imprimir desde aplicaciones Java a impresoras que usen CUPS. Todas tus impresoras te saldrán como “Not accepting jobs” (No se aceptan trabajos). Vaya putada, ¿no?.
 
¿La solución? Muy simple, puedes optar por descargar la última versión de Java de la web de Sun, o usar esta simple solución:

  • Crear enlace simbólico, en ubuntu no existe, en otras distros puede que tampoco

    $ sudo ln -s /usr/lib/libcups.so.2 /usr/lib/libcups.so

  • declarar CUPS_SERVER como localhost

Es decir, si queremos ejecutar una supuesta aplicación Java llamada, por ejemplo, AlAtunTunTun, desde la cual queremos imprimirnos El Quijote, hacemos algo tal que así para iniciarla:

$ export CUPS_SERVER=localhost
$ /ruta/alProgramita/AlAtunTunTun

Y problema resuelto :).