Nuevos themes y plugins

Hoy hemos incorporado un theme nuevo y un plugin nuevo a los alojamientos con WordPress. El theme (que veis en la imagen) aunque esta modificado para ser parte del Instituto CINQUIMA es de libre uso. Se trata de una modificación del theme Yoko traducido al castellano y optimizado.

Respecto al plugin, hemos incorporado el Viper’s Video Quicktags a WordPress para aquellos que quieran incorporar enlaces a videos externos tales como de Youtube, Vimeo, etc.. de forma sencilla.

Este plugin dispone de una configuración dentro del menú Ajustes > Video Quicktags que permite elegir los orígenes y los tamaños de los vídeos a mostrar.

PHP, MySQL y longitud de los password

Warning: mysql_connect() [function.mysql-connect]: Premature end of data (mysqlnd_wireprotocol.c:554) in /XXXXXX on line 12
Warning: mysql_connect() [function.mysql-connect]: OK packet 1 bytes shorter than expected in /XXXXXX on line 12
Warning: mysql_connect() [function.mysql-connect]: mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD('your_existing_password'). This will store a new, and more secure, hash value in mysql.user. If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file in /XXXXXX on line 12

Para aquellos que tengan instalado PHP 5.3 o superior y se intenten conectar a una base de datos mysql, sea de la forma que sea (PDO, mysql o mysqli) y le aparezca ese curioso mensajito que tenéis arriba sabréis (tras un par de consultas a nuestro viejo amigo google) que mysql desde la 4.1 o superior (como indica el mensaje) ha variado la longitud de las contraseñas de 16 a 41 (el hash).

El problema es que las librerías incluidas en PHP aun siguen erre que erre intentando conectarse a la vieja usanza y os lanzara el error que tenéis arriba (con vuestras lineas de código, claro). Que os quedara ojiplaticos y con cara de tontos.

Tranquilos, existen varias soluciones al respecto. La primera es la que indica, entrar en la base de datos (con un gestor que os de la gana o a pedal) con el usuario que tiene ese problema y colocar esa linea para transformar nuestro password de 16 a 41 “caracteres”. Si entráis como root tendréis que seguir estos pasos:

UPDATE mysql.user SET Password = OLD_PASSWORD('password') WHERE Host = 'host' AND User = 'usuario';
FLUSH PRIVILEGES

Recordad que el FLUSH PRIVILEGES es importante porque sino, no vale para nada.

Otra solución, si entráis como root en la base de datos es poner:

SET old_passwords=1

O tocar el my.ini buscar la zona de [MYSQLD] y añadir:

old_passwords=1

O arrancar mysqld con la opción –old-passwords

O, por ultimo, actualizar el driver del php recompilandolo de nuevo. Lo más costoso pero que a la larga os librará de problemas.

Como veis, para un mismo problema hay cientos de soluciones, y cada cual debemos de coger el que más nos guste.

Aun con eso, si queréis más información y charlar un rato os recomendamos ver el foro de mysql y PHP oficial.

Opencms 8 ya está aquí!!

Ya ha llegado el momento de empezar a probar el opencms 8. Por fin tendremos el xsd:choice que tanto se echaba en falta y que nos obligaba a hacer alguna chapucilla.

En http://www.opencms.org os lo podéis descargar.

Trae nuevas cosas como el motor de suscripción, que veremos que tal funciona, el cms:mobile, y una carpeta compartida.

En cuanto lo hayamos metido mano os informaremos de las novedades.

 

Sobre redirecciones y .htaccess

fichero htaccess

El fichero .htaccess es algo muy potente que nos permite (si sabemos) hacer prácticamente pre-procesar cualquier cosa en nuestro servidor web sin tener que programarse nada en ningún lenguaje. El mayor problema es que quien ideo “ese lenguaje” debería tener gripe y resulta algo complejo.

Uno de los problemas que hemos resuelto gracias al .htaccess es el acceso a uno de los blogs desde fuera de un entorno controlado, es decir, unas IPs determinadas. El problema es que dicho blog, al estar en un wordpress multisitio y no tener configuración propia, sino compartida, nos obliga a tener que revisar ciertas condiciones.

Es decir, en cristiano. Si tenemos un ServerAlias en nuestro httpd.conf (o amigos) que apuntan todos a una misma URL pero queremos que a uno de los alias no se pueda entrar salvo desde ciertas IPs nos toca jugar un poco con el .htaccess y que con el Deny o el Allow no se puede hacer.

Por eso hay que redirigir a los clientes que cumplan ciertas condiciones, tales como:

RewriteCond %{HTTP_HOST} ^URL QUE QUEREMOS QUE NO ENTREN(.*)$
RewriteCond %{REMOTE_HOST} !HOSTS PERMITIDOS
RewriteRule ^(.*)$ http://redireccion [L]

De esta forma, aquellos que intenten acceder al host indicado y que no pertenezcan a la URL permitida serán redirigidos a otro sitio.

Es muy recomendable leerse los siguiente enlaces donde hay más información acerca del .htaccess y que son la biblia: perishablepress.com, directorio.efxto.com, apache.org (obviamente)

Recordad que todo lo que se pueda hacer en los ficheros de configuración es mucho mejor que el hacerlo vía .htaccess.

Nuevos themes disponibles

nuevos themes

Hemos estado trabajando y tenemos un par de nuevos themes disponibles para todos los alojamientos de WordPress.

Notepad UVa 1.2 (modificado UVa)
Es una modificación del Theme de Nick La llamado Notepad y traducido al castellano. Este tema con aires de bloc de notas de iOS es ideal para temas de programación aunque puede usarse para un blog genérico.

Twitter 1.2.3 (modificado UVa)
Es una redefinición de lo que es un blog orientandolo a la comunicación instantánea. Es uno de estos usos particulares de wordpress que permite que la gente dada de alta en el blog pueda usar este como mensajería instantánea. También ha sido adaptado de un theme de Automatic y traducido al castellano por nosotros.

Por supuesto, para ambos temas todos los créditos son para los autores de los mismos.

Problemas de memoria con Eclipse en MacOS

Me estaba encontrando con problemas a la hora de lanzar eclipse desde el MacOS a la hora de depurar un programa.

La solución es muy sencilla, y consiste en usar el Xms, Xmx y MaxPermSize. Dentro de la carpeta eclipse debemos buscar el fichero eclipse.ini, normalmente es Eclipse.app/Contents/MaxOS.

Debemos fijarnos en estos tres parámetros:

-XX:MaxPermSize=256m
-Xms40m
-Xmx512m

  • El MaxPermSize es la memoria permanente, y sólo debemos aumentarla si al aumentar Xmx no solucionamos el problema
  • Xms indica el tamaño de memoria con el que empieza el eclipse
  • Xmx indica el tamaño máximo de memoria que puede usar el eclipse. Con aumentar este valor a 1024m debería de dejar de darnos problemas.

con esto la depuración en el eclipse ya no tendrá ningún problema con la memoria.

Aumentar el tamaño de upload de ficheros en IIS6 con asp

El problema es sencillo, los usuarios no podían subir ficheros mayores de 4096Kb o 4Mb… la solución está en aumentar dos parámetros de IIS6, que podemos encontrar en el fichero c:\windows\system32\inetserv\metabase.xml

Probamos a tocar muchso parámetros pero los que realmente funcionaron fueron:

  • AspBufferingLimit de 4194304 a 104857600
  • AspMaxRequestEntityAlloweb de 204800 a 104857600

Con esto aumentamos el límite de subida y se acabaron los problemas.

Espero que os ayude.

Descargar un fichero de una BD con Struts2

Bueno, parece que en a descarga de ficheros tenía problemas con el IE7, así que tuvimos que reformarla, y aprovecho para contaros un poco la experiencia.

Lo primero, usar el resultado “stream” que nos proporciona struts… de manera que la configuración de la acción queda:

<action name=“download” class=“es.uva.aplicaciones.download.struts2.DownloadAdjunto”>

<result name=“success” type=“stream”>

<param name=“contentType”>application/msword</param>

<param name=“inputName”>inputStream</param>

<param name=“contentDisposition”>filename=”PLBValladolid.doc”</param>

<param name=“bufferSize”>1024</param>

</result>

<result name=“error”>/error.jsp</result>

</action>

La clase debe tener el método getInputStream o el correspondiente a la variable InputName que hemos puesto en el struts.xml. En el método execute es donde debemos cargar el fichero de la base de datos y asignarle al inputStream. En mi caso es coger un tipo blob de MySql a través de hibernate.


private InputStream inputStream=null;

public InputStream getInputStream() {
return inputStream;
}

public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}

public String execute() {
HttpServletRequest request = (HttpServletRequest) ServletActionContext
.getRequest();
HttpServletResponse response = (HttpServletResponse) ServletActionContext
.getResponse();

if (request.getParameter(“id”) != null) {
String id = request.getParameter(“id”);
file = dao.findAdjunto(id);
} else {
// ERROR: id no encontrado
addActionError(rb.getString(“errors.sinparametro”));
return ERROR;
}
if (file != null) {
response.setContentType(file.getTipo());
response.setContentLength(file.getSize().intValue());
response.setHeader(“Content-Disposition”,”inline; document.fileName=” + file.getNombre() + “”);
response.setHeader(“Cache-Control”,”must-revalidate, post-check=0, pre-check=0″);
response.setHeader(“Pragma”, “public”);
response.setDateHeader(“Expires”, 0);

Blob blob = file.getDatos();
try {
this.setInputStream(blob.getBinaryStream());
} catch (Exception e) {
System.err.println(e);
addActionError(rb.getString(“errors.escrituraencliente”));
return ERROR;
}
return SUCCESS;
} else {
//Fichero no encontrado
addActionError(rb.getString(“errors.ficheronoencontrado”));
return ERROR;
}
}

Java FDF: Rellenar y procesar formularios pdf

Para mí ha sido todo un descubrimiento. Con FDF puedes rellenar automáticamente los formularios PDF sin ningún problema, y lo más interesante, procesarles. En nuestro caso lo hemos hecho todo a través de J2EE, con Servlets y lo más divertido a sido el tema de los flags de los campos para decir si eran obligatorios, ocultos, sólo lectura, etc.

Los flags F son de anotación, y la posición de los bits son:

  1. invisible
  2. Oculto
  3. Imprimir el campo.
  4. No Zoom
  5. No rotar
  6. No ver
  7. Solo lectura.

Las combinaciones de estos bits nos permiten activando el oculto por ejemplo que nadie vea un campo de un formulario que usamos para almacenar el identificador del formulario, etc.

Los otros flags interesantes son los Ff, de campo:

  1. Sólo lectura, para que el usuario no pueda modificarlo.
  2. Obligatorio, para que el usuario tenga que rellenarlo antes de su envío.
  3. No exportar, es decir, que no se va a enviar al realizar el envío del formulario

Al final, en nuestro servlet tenemos en el doGet el autorellenado de formulario, ya que el usuario se a autenticado previamente, y le rellenamos los datos de nombre, apellido, etc para facilitarle la tarea. El código sería:

public void doGet(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException {
FDFDoc outputFDF = null;
/* Create a new FDF. */
outputFDF = new FDFDoc();
outputFDF.SetFlags("AutorizadorUID", FDFItem.FDFSetF, 2); //Invisible
outputFDF.SetFlags("SolicitanteNombre", FDFItem.FDFSetFf, 1); //Solo lectura
outputFDF.SetFlags("SolicitudDireccionesIP", FDFItem.FDFSetFf, 2); //Obligatorio
outputFDF.SetFlags("SolicitudDireccionesIP", FDFItem.FDFClearFf, 1); //Escribible
try {
outputFDF.SetFile(fichPdf);
fillPDF(outputFDF, formulario);
res.setContentType("application/vnd.fdf");
OutputStream out = res.getOutputStream();
outputFDF.Save(out);
out.close();
} catch (FDFException e) {
/* We handle an error by emitting an html header */
res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.println("Caught FDF exception");
out.println(e.toString());
System.err.println("Error "+e);
e.printStackTrace(out);
}
}

En cuanto al procesado del formulario tenemos algo parecido:

try {
FdfInput = null;
// get the length of incoming data
int howMany = req.getContentLength();
byte data[] = new byte[howMany];
// read data into byte array
req.getInputStream().read(data);
// create FDFDoc from data
FdfInput = new FDFDoc(data);
//Get ComunicadorUID value
String comunicadorUID=FdfInput.GetValue("ComunicadorUID");
} catch (FDFException e) {
reportError(req, res, "Error al generar el pdf. " + e.toString());
// Pte: DEjar un log del error
}

y luego obtenidas las variables del formulario, podemos guardarlo en una base de datos, mandar un correo electrónico, generar otro formulario, etc, etc.

Sinceramente, no me esperaba un tratamiento tan sencillo de los pdf’s. Es una muy buena idea, pero con una limitación, necesitamos acrobat reader 7 o superior, sino este invento no funciona.