msgbartop
El síndrome del francotirador majara
msgbarbottom

25 ago 10 Corrección de error en mostrado panorámicas con WordPress y Gallery2

El sistema que utilizo para publicar este sitio web es el siguiente: se utiliza como base el gestor de contenidos WordPress, complementado con algunas soluciones periféricas. La principal de ellas es la integración con el sistema de gestión de galerías fotográficas Gallery2, que se realiza mediante un plugin diseñado al efecto: WPG2.

No todas las fotografías que publico son gestionadas mediante Gallery2. Para fotografías sueltas utilizo el propio sistema de WordPress, pero cuando inserto referencias a una serie fotográfica (correspondiente a algún viaje o evento concreto) sí que suelo utilizar Gallery2. El sistema es bastante simple: una vez subidas las fotografías a Gallery2 y catalogadas por éste, desde WordPress sólo es necesario hacer referencia al identificador de la imagen mediante la etiqueta <wpg2id> para insertar la imagen en la entrada. Con esta referencia, el artículo muestra una versión reducida de la imagen, y un enlace a la imagen original dentro de la estructura de la galería de imágenes, adaptada para su visualización en WordPress,

Por lo general, el sistema funciona bastante bien. Sin embargo, desde hacía tiempo había observado un problema con las imágenes panorámicas, en las que existe una gran diferencia entre el ancho y el alto de la imagen: cuando insertaba una imagen mediante el sistema explicado anteriormente, en el caso de las fotografías panorámicas no se mostraba la miniatura de la imagen, sino la imagen completa, pero escalada al tamaño de la miniatura definida. Los problemas que esto provoca, especialmente en tiempo de carga, eran significativos, ya que algunas de las panorámicas pueden alcanzar tamaños de más de 10000×2000 píxels, y pesos superiores a los 10 MB, mientras que las miniaturas asociadas tienen unas dimensiones máximas de 400 píxels en su lado más grande, y pesos inferiores a los 30 KB.

Tras un tiempo de investigación, he conseguido dar con una solución al problema, en los foros de Gallery: <wpg2> tags use always full-size versions En una de las entradas, uno de los usuarios informa de que el problema se debe al método en el que el sistema estudia si ha de escoger mostrar una miniatura o la versión completa de la imagen, aunque escalada. Para determinar esto el sistema compara el ancho y el alto de la imagen. Esta comparación, si bien resulta adecuada para la mayoría de las imágenes, produce problemas en aquellas con importantes diferencias entre ancho y alto, como es el caso de las panorámicas. Ante ello, el usuario propone hacer uso sólo del ancho. Para ello, es necesario realizar modificaciones en el archivo ImageBlockHelper.class, ubicada en el directorio /modules/imageblock/classes de Gallery2 (en mi caso, al usar el paquete Debian, su ruta completa es /usr/share/gallery2/modules/imageblock/classes). En concreto, es necesario realizar unas modificaciones a partir de la línea 424 del archivo:

/* Get the list of resizes */
$resizes = array();
list ($ret, $ok) = GalleryCoreApi::hasItemPermission(
$derivativeParentId, 'core.viewResizes', $userId);
if ($ret) {
return array($ret, null);
}
if ($ok) {
list ($ret, $resizes) =
GalleryCoreApi::fetchResizesByItemIds(array($derivativeParentId));
if ($ret) {
return array($ret, null);
}
$resizes = isset($resizes[$derivativeParentId]) ? $resizes[$derivativeParentId]
: array();
}
if (isset($thumbnail)) {
$resizes[] = $thumbnail;
}
foreach ($resizes as $imageObject) {
/*Primera modificacion*/
/*                  $rawDifferential = ($imageObject->getHeight() - $maxSize)
+ ($imageObject->getWidth() - $maxSize);*/
$rawDifferential = ($imageObject->getWidth() - $maxSize);

if ($biggerOnly && $rawDifferential < 0) {
continue;
}
$resizeDifferential = abs($rawDifferential);
/*Segunda modificacion*/
/*                  $resizeSize = $imageObject->getHeight() * $imageObject->getWidth();*/
$resizeSize = $imageObject->getWidth();

/*
* If this differential is smaller than the last, update the image target and
* the comparison value.
* If two differentials are equidistant, use the larger based on image size.
*/
if ($resizeDifferential < $imageDifferential
|| $resizeDifferential == $imageDifferential
&& $resizeSize > $imageSize) {
$image = $imageObject;
$imageDifferential = $resizeDifferential;
$imageSize = $resizeSize;
}
}
}

Una vez hecho esto, en WordPress se empezarán a mostrar correctamente las miniaturas de las imágenes en vez de las versiones escaladas de las imágenes completas, en el caso de las panorámicas.

VN:F [1.9.20_1166]
Rating: 0.0/10 (0 votes cast)

Etiquetas: , , , ,

08 mar 10 Cómo solucionar problemas de funcionamiento de aplicaciones Java en Debian Squeeze y SID

Desde hace algunas semanas vengo observando en varias máquinas Debian SID con las que trabajo que presentan problemas de funcionamiento en comunicación con redes (tanto internet como redes locales) de las aplicaciones Java, ya fuera para aplicaciones Java en sí como aquellas que dependen del plugin para los navegadores instalados en el sistema. En concreto, he notado problemas con The Grinder, JXPlorer, y aquellas aplicaciones web que hacen uso del plugin de Java para los navegadores IceWeasel, Firefox, Chrome y Opera.

He encontrado en LinuxQuestions información relativa al problema para Squeeze.

Al parecer el problema está relacionado con estos dos bugs:

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=560238

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=560056

La solución provisional al problema, mientras los bugs no sean corregidos, es la siguiente: editar el fichero /etc/sysctl.d/bindv6only.conf y cambiar el valor de la variable net.ipv6.bindv6only a 0. Una vez hecho esto, es necesario reiniciar procfs mediante el siguiente comando:

# invoke-rc.d procps restart

P.D.: Esta es la entrada 1000 de esta página. He tardado algo menos de 5 años en lograrlo. :D

VN:F [1.9.20_1166]
Rating: 0.0/10 (0 votes cast)

Etiquetas: , , ,

15 jun 09 Streaming de webcam para monitorización remota

Una de las grandes ventajas de los sistemas linux es su flexibilidad: permiten desde realizar instalaciones estándar de escritorio hasta realizar instalaciones de grandes servidores de procesos de datos. Hoy voy a hablar de una posibilidad que permiten: realizar un sistema de monitorización remota mediante webcam. Esta aplicación respondería al siguiente esquema:

  • Una estación remota, con un sistema linux básico con una instalación en modo consola, y una webcam añadida. Idealmente este equipo debería ser de pequeño formato, como un Pico-ITX, pero cualquier equipo sería válido. Con una instalación básica de consola sería más que suficiente.
  • Un equipo de escritorio, dedicado a la monitorización. Este equipo, en desde el que se va a realizar el control de la estación remota, requeriría disponer de un entorno gráfico, a discreción del usuario

El sistema operativo, obviamente, tendría que ser linux. Cualquier distribución valdría, pero por mis preferencias personales he de recomendar Debian, una magnífica distribución con la flexibilidad suficiente como para permitir una sencilla instalación de estos dos entornos tan diferentes.

La piedra angular de esta instalación es el programa netcat, la navaja suiza de los administradores de sistemas. Esta herramienta tiene como principal característica es su capacidad para abrir puertos TCP/IP y redireccionar flujos de datos del sistema operativo por ellos. También tiene una función trascendental los túneles SSH, que permiten enlazar puertos en una máquina remota (a la que se realiza la conexión SSH) con otra máquina que esté en la red local del sistema cliente (esto también incluye, obviamente, la propia máquina cliente).

Otra suposición de la que partimos es que el cliente y el servidor NO se encuentran en la misma red local, sino que se encuentran en redes separadas, ya sea porque hay algún elemento como un cortafuegos interpuesto, o bien porque se encuentran enlazadas por una red WAN. En cualquier caso, algo impide impide que se pueda acceder a cualquier puerto entre el cliente y el servidor, estando limitado a accesos por puertos bien conocidos, como SSH.

En primer lugar, habría que configurar el sistema operativo del servidor para que reconozca la webcam. Esta tarea queda fuera de este mini-tutorial, por lo que me remito a internet para realizar esta labor. Sin embargo, en un sistema linux reciente, tendría que ser más que suficiente con instalar Video For Linux 2, ya que los módulos necesarios suelen venir por defecto en el kernel. Esto debería provocar que la webcam, al ser conectada al servidor, haga aparecer el dispositivo /dev/video0 (o algo por el estilo).

Una vez hecho esto, la idea en el servidor es la siguiente: recoger el flujo de datos de la webcam a través del dispositivo correspondiente (/dev/video0,o el que corresponda), y mediante netcat, abrir un puerto (por ejemplo, el 2000) y dirigir el flujo de datos anterior a este puerto, que estará preparado para recibir conexiones. Esto se haría mediante el siguiente comando:

$ cat /dev/video0 | nc -l -p 2000

Por otro lado, en el cliente, habría que realizar la siguiente operación: realizar un túnel SSH al servidor, de tal manera que se enlace el puerto que hemos abierto en el servidor (en este caso, el 2000) con un puerto en la máquina cliente (en este caso, el 270001). A continuación, con netcat se recoge el flujo de datos del puerto 27001; por último, mediante un pipe, se recoge la salida del comando anterior (que sería mostrada por la salida estándar) hacia un programa de visualización de vídeo adecuado, como mplayer o xine. La sucesión de comandos sería la siguiente:

ssh -f -L 27001:127.0.0.1:2000 usuario@servidor sleep 10; nc 127.0.0.1 27001 | xine -

Un cutre-esquema de lo expuesto anteriormente sería el siguiente:

Diagrama de la instalación

Diagrama de la instalación

Con toda esta película conseguiríamos visualizar desde el equipo cliente la webcam del servidor.

Una pequeña variación de lo anterior permite, por otro lado, hacer streaming de ficheros de vídeo (o audio). Con el siguiente comando abriríamos el puerto local 2000 para accesos desde un servidor remoto, que leerían del fichero video.avi:

nc -l -p 2000 < video.avi

Por la parte del cliente seguiríamos usando el comando anterior.

Existen algunos corolarios a este mini-tutorial. Uno de ellos consistiría en lograr que el acceso al servidor sea sin contraseña, basándonos en el uso de certificados de usuario. Pero eso ya quedará para otro día.

VN:F [1.9.20_1166]
Rating: 5.0/10 (1 vote cast)

Etiquetas: , , , , , ,