jueves, 29 de enero de 2009

Java Sun en Ubuntu

Es trivial, pero hay que conocer los comandos:

sudo apt-get install sun-java6-jdk (para desarrolladores)
sudo apt-get install sun-java6-jre (si sólo se quiere ejecutar la JVM)
sudo apt-get install sun-java6-bin (no es necesario si se usó el primero)

Ahora, para que ésta sea la versión que se ejecuta por defecto [2]:

sudo update-alternatives --config java
sudo update-alternatives --config keytool

Resuelve:

Signing Key Creation: keytool error: java.lang.IllegalArgumentException: java.io.IOException: Invalid char:

[1] Ya no me acuerdo :(
[2] http://groups.google.com/group/android-developers/browse_thread/thread/398b4bedaaa3df3d

miércoles, 27 de febrero de 2008

Actualizando Glut

¡Hey! Esto sí está lejos de ser una solución oficial, pero funciona suficientemente bien.

Resulta que algunas personas hemos intentado utilizar la vieja biblioteca GLUT con versiones actuales del Visual Studio, díganse, 2003, 2005 o 2008. En el momento en el que uno intenta compilar alguna aplicación que dependa de GLUT, aparece el siguiente error:

c:\program files\microsoft visual studio 9.0\vc\include\stdlib.h(371) : error C2381: 'exit' : nueva definición; __declspec(noreturn) es diferente
c:\documents and settings\...\gl\glut.h(146) : vea la declaración de 'exit'

o una versión en inglés:

C:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdlib.h(371) : error C2381: 'exit' : redefinition; __declspec(noreturn) differs
c:\Documents and Settings\Owner\Desktop\FG WIN32 compile\3rdparty\include\GL/glut.h(146) : see declaration of 'exit'

Bueno, resulta que algunas definiciones en stdlib.h han sido actualizadas.

Lo primero que se me ocurrió fue recompilar GLUT, bajándo el código fuente de la liga citada arriba, sin embargo, apareció el mismo error, acompañado de otras advertencias. La solución es simple, hay que modificar la línea 146 de glut.h:

Cambiar:
extern _CRTIMP void __cdecl exit(int);

Por:
extern _CRTIMP __declspec(noreturn) void __cdecl exit(int);

Con esto, en lugar de error, se obtendrá otra advertencia, pero las aplicaciones compilan y corren. (También aparece el error de que no logra instalar glut.lib y glut.h en los directorios indicados, que son del visual studio viejo, pero es pecata minuta, en el peor de los casos se pueden copiar a mano.) Sospecho que incluso basta con hacer esta modificación en glut.h y no es necesario recompilar toda la biblioteca.

Sin embargo ojo, al compilar la biblioteca recuerdo haber visto inclusive advertencias sobre funciones deprecadas, por lo que puede que este parche no dure mucho y haya que hacer una revisión más cuidadosa de glut.

martes, 19 de febrero de 2008

Mesa OpenGL - cannot restore segment prot after reloc

Descargué y compilé Mesa en mi directorio local y quise usarlo localmente, para no afectar lo que ya tenía instalado en el sistema. Todo iba perfecto, hasta que intenté ejecutar uno de los ejemplos: ./gears, tal y como indican las instrucciones bajo "Running the demos". El error que apareció fue el siguiente:

./gears: error while loading shared libraries: /home/[...]/Mesa-7.0.2/lib/libGL.so.1: cannot restore segment prot after reloc: Permission denied

No fue difícil encontrar en la red que este error se debe a SELinux. Lo que tomó un poco más fue encontrar cómo repararlo y resultó extremadamente sencillo. Entrando al directorio lib/ de Mesa, se modifica el contexto de las bibliotecas con el comando siguiente:

chcon -t texrel_shlib_t *.so

Al utilizar ls -lZ, podremos ver el nuevo contexto de las bibliotecas:

lrwxrwxrwx _______ _______ user_u:object_r:user_home_t libGL.so -> libGL.so.1
lrwxrwxrwx _______ _______ user_u:object_r:user_home_t libGL.so.1 -> libGL.so.1.5.070002
-rwxrwxr-x _______ _______ user_u:object_r:textrel_shlib_t libGL.so.1.5.070002
lrwxrwxrwx _______ _______ user_u:object_r:user_home_t libGLU.so -> libGLU.so.1
lrwxrwxrwx _______ _______ user_u:object_r:user_home_t libGLU.so.1 -> libGLU.so.1.3.070002
-rwxrwxr-x _______ _______ user_u:object_r:textrel_shlib_t libGLU.so.1.3.070002
...
Después de esto las bibliotecas recién compiladas de Mesa pueden ser utilizadas asignando la variable de ambiente LD_LIBRARY_PATH, tal y como se indica.

miércoles, 30 de enero de 2008

Páginas centradas con divs y css

¡Al fin lo logré!

Después de una cantidad increíble de intentos he encontrado dos formas verdaderamente sencillas de hacer páginas centradas.

El caso más trivial es cuando el tamaño del contenido es variable, como en esta página. Aquí basta con poner un margen simétrico para body:
body { padding-right: 30%, padding-left: 30%}
Puede hacerse con porcentajes o pixeles. No recuerdo si funciona igual con magin, para el caso, el problema está resuelto.

El problema se vuelve algo más complicado si lo que se quiere centrar tiene un ancho fijo. Este blog tiene esa propiedad, aunque no encontré entre todo el css una forma clara de cómo lo lograron. Encontré la mía. Funciona perfectamente en Firefox (linux y windows) pero desafortunademente, por alguna ilógica razón, alinea a la derecha en IE. El sitio resultante se encontrará aquí.

Se requiere crear dos divs (y un tercero por simetría). La primera funciona como una especie de marco, se usará para calcular el centro de la pantalla; la otra es para el contenido. La tercera es para rellenar el espacio vacío a la derecha. Algunos navegadores pueden pintar esta mitad de otro color si no se la rellena con algo.

El html deberá quedar así:
<body>
<div id="izquieda">
<div id="centro"> ...
</div>
</div>
<div id="der"/>
</div>
</body>
El css correspondiente es:
body { background:black; color:cyan; padding: 0px; margin: 0px;  font-family:arial; }
#izquierda { padding: 0; margin: 0; width:50%; position:relative; left:374px; }
#centro { padding: 0; margin: 0; float:right; width:748px; }
#der { padding: 0; margin: 0; float:right; }
Todos los margin y padding igual a cero están ahí porque no quiero márgenes, en otros diseños alguien podría querer experimentar con otros valores.

Ahora veamos porqué funciona:

Nótese que se desea que la región central mida 748 pixels. Con izquierda, al 50% de ancho, se obtiene la mitad de la pantalla. Ahora, lo que uno querría es utilizar la coordenada del centro de la pantalla para calcular e indicar alguna de las esquinas de la región central. Prové con varias combinaciones, pero la única que funcionó fue esta:

Con float:right, el lado derecho de la región central es alineada con el lado derecho de "izquierda", que se encuentra a la mitad de la pantalla. Lo que resta, es recorrerla 374 pixeles más a la derecha (la mitad de su tamaño). Sin embargo, los navegadores no entienden la petición si las cosas se salen de sus nodos padres. Por ello la solución fue empujar la región izquierda esta cantidad. Concecuentemente, su borde derecho se recorre y la región "centro" queda, efectivamente, en el centro.

jueves, 4 de octubre de 2007

Django, mod_python y SELinux

Hoy pasé algunas horas buscando una forma fácil de configurar mis aplicaciones de Django con Apache. Algo que me permitiera agregar aplicaciones sencillas y mantenerlas funcionando como si fueran scripts de php.

Lo más sencillo fue usar mod_python. Mi Apache ya lo cargaba y las instrucciones en la documentación de Django son claras. Como me agrada usar anfitriones virtuales, basta tener:


ServerName midominio.net
DocumentRoot /var/www/html

MaxRequestsPerChild 1 #Sólo para pruebas, si no es una grosería.

ServerName subdominio.dominio.net

SetHandler python-program
PythonHandler django.core.handlers.modpython
PythonPath "['camino_a_un_directorio_arriba_del_proyecto', 'camino_uno_arriba_de_las_aplicaciones'] + sys.path"
SetEnv DJANGO_SETTINGS_MODULE [proyecto].settings
PythonDebug On


SetHandler None


SetHandler None



La parte truculenta vino de SELinux. Los proyectos de Django (y sus aplicaciones) no deben ir en la ruta de Apache, lo cual lo hace especialmente seguros. Sin embargo, al tener mis archivos, inocentemente, en algún profundo lugar de mi hogar, aunque agregara el directorio con PythonPath, me aparecía un error indicando que el módulo [proyecto].seetings no existía:

EnvironmentError: Could not import settings '____.settings'
(Is it on sys.path? Does it have syntax errors?): No module named wap.settings

El verdadero problema es que, no sólo apache debe tener los permisos normales de lectura, sino que toda la ruta hasta el proyecto (y todos los archivos de éste) deben tener el contexto para la web:

user_u:object_r:httpd_sys_content_t

Copiar mis archivos a un directorio en el que pudiera otorgar dichos permisos con

$ chcon -R user_u:object_r:httpd_sys_content_t [directorio]

resolvió el problema.

martes, 24 de julio de 2007

Script que obtiene el nombre del día de ayer

Por increíble que parezca, este ejemplo no es una ociosidad, lo utilicé el vida real para nombrar carpetas de archivos de respaldo:



#!/bin/bash
# +++++++++
# Calcula el dia de ayer.
# +++++++++

#
# Obtiene el nombre del dia de la semana almacenado en $NDIA.
#
getDia () {
case $1 in
1) DIA=lunes ;;
2) DIA=martes ;;
3) DIA=miercoles ;;
4) DIA=jueves ;;
5) DIA=viernes ;;
6) DIA=sabado ;;
7) DIA=domingo ;;
*) echo "$1 No es un dia de la semana valido"
exit $DIA_MAL
;;
esac
}

NDIA=`date +%u`
getDia $NDIA
echo Hoy es $DIA

let "NAYER=$NDIA - 1"
if [ $NAYER -eq 0 ]
then
NAYER=7
fi
getDia $NAYER
echo Ayer fue $DIA

sábado, 19 de mayo de 2007

Capturas de pantalla - VLC

Dejo esto como un recordatorio:
* Tomado en parte del FAQ de VLC

Para poder tomar capturas de un video en ejecución se require:
(Linux)
  1. Iniciar con vlc -V x11
  2. Seleccionar Opciones -> Preferencias... En la pestaña Video, inidicar el directorio y el formato donde se guardarán las imágenes y el formato.
  3. Presionar "Captura de pantalla" cada vez que quiera :)
Si no se cumple el paso 1, los otros dos no bastan, no se guarda nada. Sin embargo, tampoco es recomendable dejar vlc con -V x11 por defecto, pues la reproducción pierde calidad.