Blog

Limpiar un disco de una máquina virtual en Virtualbox

Si usáis una máquina virtual dentro de VirtualBox, seguramente hayáis borrado alguna vez ficheros pero vais que el disco sigue manteniendo su tamaño.

La solución es sencilla:

  1. Entrar en la máquina virtual linux
  2. Limpiar de los ficheros que no queremos
  3. Ejecutar “dd if=/dev/zero of=zerofillfile bs=1M” que llenará de ceros todo el espacio libre en el disco
  4. Nos aparecerá un mensaje como “dd: writing ‘zerofillfile’: No space left on device”
  5. Ejecutamos “rm zerofillfile”
  6. Apagamos la máquina virtual con “sudo halt” por ejemplo
  7. Vamos a la carpeta de nuestro ordenador donde se encuentra el fichero del disco. Si tenemos alguna duda podemos verlo en la configuración de la máquina, en el almacenamiento.
  8. VBoxManage modifyhd –compact “RUTA AL FICHERO DEL DISCO”.
  9. Si se trata de un fichero vmdl tenemos que hacer algún paso intermedio:
    1. VBoxManage  clonehd “RUTA AL FICHERO DEL DISCO” “cloned.vdi” –format vdi
    2. VBoxManage modifyhd –compact “cloned.vdi”
    3. VBoxManage  clonehd “cloned.vdi” “RUTA AL FICHERO DEL DISCO” –format vmdk

Como siempre, espero que os sirva.

Filtrar CSS para Safari 9

Como bien sabréis, Safari 9 se ha separado de Chrome, usando el primero webKit, mientras que el segundo usa blink. Aunque parezcan muy similares, al ser el motor de renderizado diferente siempre nos puede dar problemas si “pintamos” nuestras web con un motor (para testear) y de golpe, lo abrimos con otro y nos asustamos.

Por eso, si queréis que en vuestros CSS los ejecute solo Safari y Chrome pase de ellos os recomendamos el poner lo siguiente:

@supports (overflow:-webkit-marquee)
   and (justify-content:inherit) {
    /* Estos estilos solo los ejecutara Safari */
    .poner_aqui_tus_estilos_para_safari {
    }
}

Donde, podréis redefinir vuestras capas y estilos a modo de que Safari los reposicione donde sea necesario. Y todo porque preguntamos al navegador a través de CSS3 si tiene el soporte de esos elementos específicos.

JasperReports el report no encuentra las fonts configuradas en tiempo de ejecución

PROBLEMA:  El informe no funciona porque no encuentra las fonts ya que estas pueden variar de una JVM a otra.

Tendríamos una excepción del tipo…

JRFontNotFoundException: Font 'Arial' is not available to the JVM.

SOLUCIÓN:

  1. Instalar las fuentes en la máquina virtual, esto dependerá un poco del sistema operativo, en linux en general se puede optar por instalar el paquete ttf-mscorefonts, para asegurarnos de las fuentes disponibles en nuestra JVM podemos ejecutar el siguiente código:
    public static void main(String[] args) throws Exception {
                System.out.println(Arrays.asList(GraphicsEnvironment
                        .getLocalGraphicsEnvironment().getAvailableFontFamilyNames()));
    }
  2. También podemos hacer que Jasper ignore las fuentes configuradas y las cambie por alguna de las que tenga disponibles, para esto hay que insertar la siguiente propiedad en el report:
    <property name="net.sf.jasperreports.awt.ignore.missing.font" value="true"/>

jasperReports el navegador no muestra los links de un pdf

PROBLEMA:  Un report exportado en PDF y visualizado desde un navegador no muestra los links, puede ser una medida de seguridad del visor PDF del navegador que podría detectarlo como un posible XSS?, cuando te descargas el fichero y lo abres con Adobe Reader todo es correcto.

 

SOLUCIÓN:  Configurar el Link Target de los enlaces como:  “Parent” para que se muestren correctamente.

JasperReports subreport con conexión una Base de Datos distinta al Report

Construyendo un Report que incluye diferentes subreports con Jaspersoft Studio 6.01 me he encontrado con el problema de ejecutar un subreport con una conexion a base de datos diferente a la del Informe principal.

SOLUCIÓN:

  1. Crear un parametro en el Report principal en el que configuramos la conexion para el subereport.

Captura de pantalla 2015-09-24 a las 12.33.29

2. En la llamada al subreport, pasarle el parametro conexión en el campo: “connectionExpresion”

Captura de pantalla 2015-09-24 a las 12.36.56

El código fuente en XML quedaría así…

<connectionExpression><![CDATA[$P{subreportConnection}]]></connectionExpression>
<subreportExpression><![CDATA["file:subreport.jasper"]]></subreportExpression>

TIBCO Jaspersoft studio 6.1

Esta herramienta es la última evolución del bien conocido editor iReport.  En esta versión está construida sobre la plataforma Eclipse y ofrece una solución más completa que el viejo editor extendiendo sus capacidades y funcionalidad.

Resumiendo mucho para los que no estén familiarizados con la herramienta, jaspersoft studio permite entre otras cosas la generación de informes preparados para ser compilados y ejecutados con la libreria Jasper Reports que es la librería de código abierto más popular a la hora de generar informes, esta librería está escrita completamente en Java y permite la utilización de cualquier tipo de origen de datos además produce documentos “pixel-perfect” que pueden verse, imprimirse o exportarse en múltiples formatos  como: HTML, PDF, Excel, OpenOffice, Word etc…

TIBCO Jaspersoft studio es una pieza más de una compleja suite orientada al BI y al Data mining incluyendo servidores de informes, interactive reporting y complejos editores para la generación de informes (que son almacenados en xml bajo la extensión .jrxml para posteriormente ser compilados bajo la extensión .jasper ).

Más información acerca de este producto en la web Jaspersoft

 

Detectar en opencms cuando en un containerpage estoy cargando un detail

La situación que se describe a continuación está probada para las versiones 8 y 9 del opencms.

Recientemente hemos tenido un problema que consistía en extraer propiedades de un CmsResource a partir de la uri, para ello se puede insertar  sin problema en el template un pequeño script el cual partiendo de la uri desde la que es invocado obtenga un objeto CmsResource y a partir de este su CmsUUID etc… esto puede conseguirse de forma sencilla como sigue:

Leer más

Cachear un 302 con Squid

Aunque sea un poco saltarse el estándar por la torera, os vamos a plantear una solución para que el Squid guarde en su caché los 302. En el caso de OpenCms con sitios exportados, con un squid+Apache+Tomcat, la redirección 302 del sitio por ejemplo de www.uva.es a www.uva.es/export/sites/uva/index.html supone un a carga extra al tomcat ya que llega al Squid (que no o cachea por defecto), llega al apache y finalmente llega al Tomcat. Con un número muy grande de accesos esto supone ua carga extra al Tomcat que podemos evitar.

Lo primero, documentarnos. En la página http://wiki.squid-cache.org/SquidFaq/InnerWorkings, en la sección “How come some objects do not get cached?” podemos leer dos cosas interesantes. que por defecto no cachea los 30x y que para cachear el 302 “A 302 Moved Temporarily response is cachable ONLY if the response also includes an Expires header.”, es decir, tenemos que tener una respuesta del servidor del 302 con el dato “Expires” en la cabecera, y aunque no lo dice, debe ser una fecha futura, ya que si ponemos una fecha pasada no lo va a cachear tampoco.

Pues vamos a ponernos a trastear ya. ¿Donde? Tenemos tres opciones, tocar el código de OpenCms, tocar el Tomcat o tocar el apache. En nuestro caso la más sencilla es el apache con su documentación, pero para el Tomcat también en muy sencilla y viene en la documentación buscando “Expires” , y la que no hemos mirado es el código de OpenCms.

En el caso de apache, podemos añadir un htaccess o directamente en la definición del virtualhost añadir estas líneas para que todos los contenidos digan que expiran en 5 minutos.

ExpiresActive On
ExpiresDefault "access plus 5 minutes"

A partir de ese momento los 302 empezarán a ser cacheados por el Squid

<div class="">1434098144.302      0 188.85.71.120 TCP_MEM_HIT/302 415 GET <a href="http://www.uva.es/">http://www.uva.es/</a> - NONE/- text/plain</div>
<div class="">1434098144.541      0 157.88.20.208 TCP_MEM_HIT/302 415 GET <a href="http://www.uva.es/">http://www.uva.es/</a> - NONE/- text/plain</div>
<div class="">1434098160.693      0 157.88.240.224 TCP_MEM_HIT/302 415 GET <a href="http://www.uva.es/">http://www.uva.es/</a> - NONE/- text/plain</div>
<div class="">1434098163.364      0 157.88.150.22 TCP_MEM_HIT/302 415 GET <a href="http://www.uva.es/">http://www.uva.es/</a> - NONE/- text/plain</div>

y desde los navegadores veremos también que el Squid nos devuelve el X-Cache: HIT como podéis ver en la imagen

Squid cacheando 302

 

A continuación podemos afinar más el dato Expires diferenciando por tipo por ejemplo, pero tened en cuenta que ya está el Squid de intermediario, y no afecta mucho al cliente:

<pre>ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 year"

y podemos meter condiciones para que sólo lo haga los 302, pero no lo vemos necesario.

Como siempre, esperamos que os ayude!!

Instalar templates y temas a tu WordPress sin FTP

Los alojamientos que ofrecemos no dan la oportunidad de conectarse por FTP (o SFTP) debido a restricciones de seguridad. Por eso, cuando alguno de vosotros quiere instalar o actualizar algún elemento o el propio WordPress os toca conectaros al alojamiento y subir los ficheros a mano.

Esto esta bien si tienes capacidad de llegar al alojamiento, pero, puede que por emergencia no podáis hacer esto y os interese hacerlo desde el propio administrador del WordPress, descubriendo, que os pide los datos del FTP.

Para que no os lo pida y podáis hacerlo “directamente” añadid la siguiente linea tras el último define del fichero wp-config.php:

define(‘FS_METHOD’, ‘direct’);

Recordad dar permisos de escritura al directorio wp-content ya que lo utilizara de temporales para dejar las cosas y, de disponer de hueco (espacio) suficiente en vuestro alojamiento.