Ejecución indirecta/remota de aplicaciones Java

Exception in thread “main” java.lang.InternalError: Can’t connect to window server – not enough permissions.

El error anterior, oculto en el log de Apache HTTP Server, generado al intentar ejecutar Apache FOP desde PHP para generar informes para un proyecto que estoy desarrollando con Cx Networks, me mantuvo varios minutos preocupado y buscando soluciones para el problema.

Al principio parecía un simple problema de permisos de archivo. Pero tras tomar las acciones comúnmente necesarias (el ya conocido modo diabólico), todo parecía ir de mal en peor. Y es que estaba por maldecir a Steve por hacerme perder el tiempo; ya que en los servidores de Cx Net (Linux) todo funcionaba bien, pero en mi Macbook sólo veía el error en cuestión.

Tras investigar un rato en la Internet (por estos días Google), encontré que el problema se generaba por la imposibilidad de la máquina virtual de Java de acceder a ciertos dispositivos de interfaz humana como el mouse, el display o el teclado. Al parecer esto ocurre cuando llamamos indirectamente a la aplicación Java. Por ejemplo con un usuario que no tiene acceso a una shell como www de Apache (o _www en Mac OS X). También podríamos enfrentarnos a esta situación cuando ejecutamos un proceso Java de manera remota a través de SSH.

La solución es más simple de lo esperado. Al ejecutar el proceso Java, debemos indicar que estamos en un ambiente headless (sin mouse, teclado o pantalla). Para lo anterior, utilizamos el siguiente argumento:

-Djava.awt.headless=true

Para más información sobre el modo headless, les invito a visitar el siguiente enlace:

http://java.sun.com/j2se/1.4.2/docs/guide/awt/AWTChanges.html#headless

Publicado en Español,Java,Linux,Mac,PHP 5,Programación | Comments off

PHP y PostgreSQL en Mac OS X 10.6

Junto a las críticas, burlas, y (envidia) aplausos de amigos geeks, hace ya varios meses, llegó a mi vida un MacBook Pro 13”. Siempre había sostenido que comprar un Mac era un lujo y que no gastaría tanto dinero en una computadora. Sin embargo, al estar en Estados Unidos era imposible resistir la tentación ante el descuento por ser alumno de la University of Illinois y el (iPad Nano) iPod Touch 8GB que venía de regalo.

Durante estos meses que he usado la laptop, no había sido necesario usarla para desarrollar sitios o aplicaciones Web. Hasta ahora sólo había programado en C, C++, Java. Para estos 3 lenguajes Mac OS X está preparador out of the box. Sin embargo, desde algunas semanas atrás estoy desarrollando un sistema Web como parte de mi Proyecto de Título y, como (me robaron) no tengo un computador de escritorio, he tenido que desarrollar usando el notebook. Hasta ahora lo hacía todo en la nube, pero como el tiempo apremia, y no tengo Internet 3G, he tenido la necesitad de preparar un ambiente de desarrollo en la laptop.

Mac OS X 10.6 viene con Apache 2 (HTTP) instalado y listo para ejecutar (apachectl start o desde System Preferences->Sharing). Entonces sólo era necesario instalar PostgreSQL y PHP 5 con los respectivos drivers. Si bien es cierto existen packages de PostgreSQL para Mac OS X, es mucho más “lindo” compilar el código fuente.

Instalando PostgreSQL

Antes de compilar PostgreSQL necesitamos un paquete llamado readline. Para instalar esta utilidad de GNU podemos usar fink o MacPorts.

$ sudo /sw/bin/fink install readline

Una vez instalado readline, descargamos el código fuente de PostgreSQL. Nota que el siguiente enlace corresponde a la última versión estable de Postgres al momento de escribir este post, y el mirror es para Chile.

$ sudo bash
 
# cd /usr/local/src
 
# curl -O http://wwwmaster.postgresql.org/redir/394/h/source/v8.4.2/postgresql-8.4.2.tar.gz
 
# tar xvfz postgresql-8.4.2.tar.gz
 
# cd postgresql-8.4.2/

Ahora ejecutamos el script configure con los argumentos del path donde se encuentra readline.

# ./configure --with-includes=/sw/include/ --with-libraries=/sw/lib
 
# make
 
# make install

Ahora que PostgreSQL está instalado, sólo resta configurarlo. El primer paso será crear una cuenta de usuario llamado postgres. Esa cuenta la podemos crear utilizando System Preferences->Accounts. Una vez creado el usuario, debemos crear un directorio donde PostgreSQL pueda escribir datos:

# mkdir /usr/local/pgsql/data
 
# chown postgres /usr/local/pgsql/data

Ahora en otra consola, usando el usuario postgres configuramos PostgreSQL:

$ su -l postgres
 
$ /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data

Listo, ya podemos iniciar el servidor. Pero antes, algo muy útil será configurar el PATH de ejecución, agregando el directorio que contiene los binarios de PostgreSQL (como psql):

$ export PATH=$PATH:/usr/local/pgsql/bin

Para no tener que escribir lo anterior cada vez que hagamos login, lo mejor será ponerlo en nuestro ~/.profile (el de nuestro usuario regular, no postgres).

Iniciemos el servidor, usando el usuario postgres:

$ /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start

Instalando PHP 5 y los drivers para PostgreSQL

Necesitamos recompilar PHP con la opción adecuada para usar PostgreSQL. Como es habitual, descargamos el código fuente desde el sitio oficial php.net. Al momento de escribir este post, la última versión estable es la 5.3.1. Una vez descargada en /usr/local/src, procedemos a configurar y compilar:

# tar xvfz php-5.3.1.tar.gz
 
# cd php-5.3.1/
 
# ./configure --with-pgsql --with-apxs2
 
# make
 
# make install

En el paso de compilación (make), en mi sistema arrojó un error relacionado a la biblioteca ICONV. Buscando en la Web encontré que se trababa de un bug (o al menos así está reportado en el bugtracker de PHP). El workaround que funcionó para mi fue hackear iconv en las fuentes de PHP (ext/iconv/iconv.c); eliminar las líneas 185-187.

Finalmente, copiar php.ini al directorio adecuado

# cp php.ini-development /usr/local/lib/php.ini

Instalando PDO para PostgreSQL

Otra cosa que necesitamos quienes usamos frameworks como PRADO o Symfony, es instalar el driver PDO. El proceso es simple:

$ pecl download pdo_pgsql
 
$ tar xzf PDO_PGSQL-1.0.2.tgz

Ahora necesitamos compilar e instalar la extensión:

$ cd PDO_PGSQL-1.0.2
 
$ phpize
 
$ ./configure --with-pdo-pgsql=/usr/local/pgsql/
 
$ make && sudo make install

Sólo resta editar la configuracion en php.ini:

extension_dir = "/usr/lib/php/extensions/no-debug-non-zts-20090626/"
 
extension = pdo_pgsql.so

Reiniciamos apache (apachectl restart) y listo, ya tenemos nuestro sistema preparado para desarrollar aplicaciones y sistemas con PHP & PostgreSQL.

Publicado en Español,Mac,PHP 5,Programación | 2 Comentarios

Sitios de interés