offtopic: instalacion plr con soporte para imagenes (mini how-to)

From: Felipe de Jesús Molina Bravo <fjmolinabravo(at)gmail(dot)com>
To: pgsql <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: offtopic: instalacion plr con soporte para imagenes (mini how-to)
Date: 2009-10-09 17:48:25
Message-ID: c31298e50910091048r77f95494p574f39f3fb35323a@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Que tal

Recientemente, instalamos plr. Se usará para aplicar métodos de validación y
generar graficas. En el servidor de base de datos no se tiene ambiente
grafico (X server).... los pasos realizados fueron los siguientes ....
espero sirva... al final están las ligas que me sirvieron de referencia ...
saludos

Ambiente

distribucion: Gentoo
kernel: 2.6.28 (vserver 2.3.0.36.4 )
R: 2.9.2
PL-R: 8.3.0.8

Para instalar PLR, suponiendo que ya tenemos instalado postgres

* En el directorio donde se encuentra el ebuild
(/usr/portage/dev-db/postgresql-server)

ebuild postgresql-server-8.4.1.ebuild unpack
ebuild postgresql-server-8.4.1.ebuild compile
* Ir al directorio temporal para la compilación:
/var/tmp/portage/dev-db/postgresql-server-8.4.1. Posicionado en el
directorio del contrib de postgres, desempacar PL-R
* Ir al directorio .../contrib/plr y teclear
make
make install

Con esto ya tenemos instalado plr. Para habilitar el plr en la bd, ejecutar
el script de plr.sql, el cual se encuentra en:
/usr/share/postgresql-8.4/contrib

Por lo regular en los servidores de base de datos no tenemos un X server,
por lo tanto para hacer que PL-R pueda generar las imágenes se instala Xvfb.
Se realizó de la siguiente forma:

* editar /etc/portage/package.use

dev-db/postgresql-server xml perl
dev-db/postgresql-base xml perl
dev-lang/R bash-completion nls readline jpeg png cairo X -doc -java
-lapack -minimal -threads -tk
x11-base/xorg-server xvfb minimal -xorg -dmx -kdrive -xprint -ipv6
x11-libs/cairo svg X
x11-libs/gtk+ minimal X jpeg

* instalar:
emerge xorg-server
emerge cairo
emerge gtk+
emerge dev-lang/R

* instalar librerias requeridas por R (los paquetes son obtenidos desde
cualquier mirror del CRAN):

R CMD INSTALL -l quantmod_0.3-12.tar.gz
R CMD INSTALL -l RGtk2_2.as.15.tar.gz
R CMD INSTALL -l cairoDevice_2.10.tar.za

::Esto instala las libreria requeridas y xvfb.

Para probar si todo esta listo:

* Iniciar xvfb:

Xvfb :5 -ac -screen 0 1024x768x24

* En otro terminal
localhost ~ $ DISPLAY=":5.0"
localhost ~ $ R

* En R:
> library("quantmod")
> library(cairoDevice)
> library(RGtk2)
> pixmap <- gdkPixmapNew(w=500, h=500, depth=24)
> gdkDrawableSetColormap(pixmap, gdkColormapGetSystem())
> asCairoDevice(pixmap)
> plot(c(1:10))
> plot_pixbuf <- gdkPixbufGetFromDrawable(NULL, pixmap,
pixmap$getColormap(), 0, 0, 0, 0, 500, 500)
> buffer <- gdkPixbufSaveToBufferv(plot_pixbuf, "png", character(0),
character(0))$buffer
> buffer

:al teclear la última linea debe de aparacer los valores hexadecimales de la
imagen ... ej:
[1] 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 01 f4 00 00 01
f4
[25] 08 02 00 00 00 44 b4 48 dd 00 00 00 03 73 42 49 54 08 08 08 db e1 4f
e0
[49] 00 00 1f a9 49 44 41 54 78 9c ed dd 79 58 94 f5 fe ff f1 7b d8 64 70
10
[73] 0b 42 49 45 51 0b 50 50 09 2d dc 4e ee c7 12 a5 70 cf c0 0d 35 cb d2
ab
.....

Si todo fue correcto, esta lista para ser usado en postgres. Antes de
iniciar el motor de postgres, es necesario declarar la variable Display.

* Editar /etc/conf.d/postgresql-8.4 y agregar:
DISPLAY=":5.0"
* Eidtar /etc/init.d/postgresql-8.4 y cambiar la linea que inicia el motor
por:
su -l ${PGUSER} \
-c "env PGDATA=\"${PGDATA}\" DISPLAY=\"${DISPLAY}\"
/usr/lib/postgresql-8.4/bin/pg_ctl start {WAIT_FOR_START} -o
'--silent-mode=true ${PGOPTS}'"

Iniciar el motor de bd y entrar a una bd. (suponemos que esta bd ya tiene
instalado plr)

* Para verificar que la variable de ambiente DISPLAY es correcta:
pba=# select * from plr_environ() where name = 'DISPLAY';
name | value
---------+-------
DISPLAY | :5.0

* crear la función:

CREATE OR REPLACE FUNCTION plr_plot_return_data() RETURNS CHARACTER[] AS $$
library("quantmod")
library(cairoDevice)
library(RGtk2)
pixmap <- gdkPixmapNew(w=500, h=500, depth=24)
gdkDrawableSetColormap(pixmap, gdkColormapGetSystem())
asCairoDevice(pixmap)
plot(c(1:10))
plot_pixbuf <- gdkPixbufGetFromDrawable(NULL, pixmap,
pixmap$getColormap(), 0, 0, 0, 0, 500, 500)
buffer <- gdkPixbufSaveToBufferv(plot_pixbuf, "png", character(0),
character(0))$buffer
return(buffer)

* ejecutar

pba=# select plr_plot_return_data();

si en la salida tenemos algo parecido a:

{89,50,4e,47,0d,0a,1a,0a,00,00,00,0d,49,48,44,52,00,00,01,f4,00,00,01,
.....

todo esta correcto.

Finalmente, esto ya podría ser usados desde un cgi ó algo parecido ... en
nuestro caso, mason:

<%once>
use DBI;
use Data::Dumper;
</%once>

<%perl>

$r->content_type("image/png");
my $dbh = DBI->connect("DBI:Pg:dbname=pba;host=xxx;port=xxx",'cta',
'pssw');
print -1 unless ($dbh);
my $sth = $dbh->prepare("SELECT ARRAY_TO_STRING(plr_plot_return_data(),
'')");
$sth->execute();
my @array = $sth->fetchrow_array;
$r->print(pack "H*", $array[0]);
</%perl>

Ligas donde obtuve la información

http://ubuntuforums.org/archive/index.php/t-613149.html

http://archive.netbsd.se/?ml=pgsql-general&a=2007-12&m=5999899

http://pgfoundry.org/pipermail/plr-general/2008-January.txt

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Emanuel Calvo Franco 2009-10-09 18:00:03 Re: offtopic: instalacion plr con soporte para imagenes (mini how-to)
Previous Message ceduardo 2009-10-09 17:45:31 Re: OT. Lista JAVA