programación

Drupal: Mostrar el nombre completo en lugar del uid con seguridad

DrupalUno de los efectos de que este portal se haya convertido en multiusuario es que el autor de cada post cobra cierta importancia. Por este motivo, hemos incluido en el pie una línea que lo indica.

Ahora bien, Drupal ofrece el nombre de usuario (uid), que en la mayor parte de los casos no sirve más que para autenticarse en el portal. Es más lógico querer mostrar el nombre completo del autor, y aquí es donde empieza lo divertido. Por defecto, los perfiles de Drupal carecen de un campo para recoger este dato. Debemos, por tanto, activar el módulo Profile y seguir estas instrucciones para añadir un nuevo campo a los perfiles de usuario.

A continuación, es necesario modificar la plantilla donde queremos hacer uso de este nuevo campo (node.tpl.php, node-blog.tpl.php, etc.). Por ejemplo:

 <?php
    $nodeUser = user_load($node->uid);
    profile_load_profile($nodeUser);
    $fullname = $nodeUser->profile_fullname;
    $uid = $nodeUser->name;
?></p>
<div><label>Publicado por <a title="ver el perfil" href="/users/<?php print $uid; ?>"><?php print $fullname; ?></a></label></div>
<p>

En el caso de los comentarios, es algo más laborioso, pero la idea es la misma:

 <?php
    $commentUser = user_load($comment->uid);
    profile_load_profile($commentUser);
    $fullname = $commentUser->profile_fullname;
    $author = t('!username', array(
        '!username' => theme('username', $comment)
    ));
    $time = t('@date - <a href="http://m.emartos.es/%3Ca%20href%3D"http://twitter.com/time">http://twitter.com/time"></a>', array(
        !username' => theme('username', $comment),
        '@date' => format_date($comment->timestamp, 'custom', 'd/m/Y'),
        '@time' => format_date($comment->timestamp, 'custom', 'H:i')
    ));
?> <?php if (!empty($fullname)): ?>     <span class="submitted"><a href="/users/<?php print $commentUser->name; ?>"><?php print $fullname; ?></a></span> <?php else: ?>     <span class="submitted"><?php print $author; ?></span> <?php endif; ?> 

Pese a todo, hay que tener muchísimo cuidado al usar este método, ya que podemos provocar un agujero de seguridad gravísimo. Para dar con la solución que propongo en estas líneas, estuve buscando en los foros de Drupal y encontré un par de fragmentos de código que provocaron un exploit en este portal durante algunos minutos. Lo he advertido allá donde lo he leído (aquí y aquí), pero conviene repetirlo aquí dada su relevancia.

"Crear contenido" desaparece en Drupal

Uno de los módulos más inestables de Drupal es Administration menu. Sin embargo, resulta de una utilidad inestimable ya que evita ensuciar el diseño del portal con un bloque destinado a las tareas administrativas.

Ayer advertí que uno de los sitios que gestiono, había perdido la opción de crear contenido (create content). Las secciones seguían existiendo, ya que se podía navegar hasta node/add. Como siempre, cinco minutos de búsqueda en Google permiten ahorrar horas de depuración directa. El resultado es un hilo de los foros de Drupal donde se describe minuciosamente el error y se proporciona un parche para solucionarlo.

Architecture as diagrams is an anti-pattern!

Architecture as diagrams is an anti-pattern! [inglés] es un interesante artículo sobre la necesidad de que los diseños de arquitecturas sean dinámicos y funcionales, y no una mera estampa sin movilidad ni capacidad de interacción. También habla sobre la necesidad de llevar a cabo análisis y diseños completos, no quedándose únicamente en la abstracción del sistema. Es cierto que la captura de atributos es bastante aburrida, pero imprescindible para que la implementación final sea rápida y no se desvíe del objetivo.

AUSSA

AUSSAComo dice el Manifiesto Cluetrain, la verdadera motivación para hacer un buen trabajo no es la satisfacción del cliente, sino la necesidad de demostrar a los demás que somos buenos profesionales. A mí me importa que el cliente esté contento, en primer lugar porque mi empresa depende de que así sea (y yo dependo de mi empresa), y en segundo, porque siempre se acaban estableciendo relaciones que van más allá de lo estrictamente profesional, de modo que uno se alegra cuando su cliente queda contento con el producto o el servicio prestado. Sin embargo, por encima de todo esto está mi propia satisfacción por hacer algo interesante y útil, por hacer algo bueno.

Hay mucho de lo que expongo en el párrafo anterior en el nuevo portal de AUSSA. Me enorgullece decir que he dirigido ese proyecto desde que todavía era una propuesta hasta que se salió a producción para la pasada Feria de Abril, y el cliente está satisfecho. Pero el mérito no es sólo mío: El equipo de trabajo (Jonathan Maerckaert como desarrollador y David Rodríguez como diseñador) han aportado sus conocimientos y esfuerzo para que el producto final tenga una calidad alta. Todavía quedan algunas mejoras, la Intranet (que no es poco) y muchos quebraderos de cabeza para adaptar un CMS como Drupal a unas necesidades muy específicas. Ya hemos superado la más difícil de todas, de la que hemos aprendido y disfrutado (también sufrido), así que afrontaremos el resto con nuestro mejor humor y disposición.

Transacciones en MySQL con JDBC

Hoy teníamos que implementar un prototipo de importación masiva de hojas Excel a una base de datos MySQL. Se trata de una operación transaccional, pero cada sentencia de inserción o actualización se hacía efectiva en la base de datos, de manera que el rollback se hacía imposible, y un commit era inútil.

Tras una breve búsqueda, encontré este enlace, que propone usar el objeto ResultSet en lugar de lanzar directamente el statement.

C como lenguaje de scripting

Leo en Barrapunto que podremos usar C y C++ para escribir aplicaciones web:

C Cod es un front-end para C, C++, o compiladores objeto de C que le permite tratar C como un lenguaje más de scripting. C Cod viene con C Server Pages, que proporciona soporte para CGI para que usted pueda escribir aplicaciones Web en C o C++ y tenerlos automáticamente bajo demanda.

Me parece mucho más práctico escribirlas en PHP, JSP, ASP.NET o RoR, pero una aplicación web en C/C++ puede ser mucho más eficiente y rápida. Para determinados ámbitos con requerimientos de alta disponibilidad, puede ser una solución a tener en cuenta. Habrá que desempolvar los conocimientos de gestión manual de memoria, la sintaxis estricta y las antiguas pero potentes struct.

Problemas con PermGen

Uno de los problemas recurrentes de los servidores de aplicaciones, y que ni siquiera profesionales certificados en Java me han sabido resolver, es el error de memoria agotada en PermGen. El caso es que el servidor se rompe y hay que reiniciarlo, solución nada aconsejable en entornos de producción.

Pues bien, tras algunas búsquedas y lecturas varias, he hallado la solución al problema, y lo que es mejor, una explicación detallada de todo el proceso. Al parecer, el recolector de basura de Java es generacional. Existen cuatro generaciones o etapas: eden, young, old y permanent. De izquierda a derecha, la diferencia fundamental (que no la única) es que el recolector de basura pasa con menos frecuencia que en la anterior. Como ya sabía el lector avezado, por la generación permanente no pasa nunca, así que cuando se llena, salta la conocida excepción que muchos tememos.

El artículo explica detalladamente cómo evitarlo para volver a dormir tranquilos.

Actualización 10/06/2010. He encontrado un artículo que explica magistralmente, y con ejemplos, las causas y soluciones del problema a nivel de implementación.

Java

JavaMi entrada en el mundo Java ha sido nada gradual y de la mano de PYMESevill@, un interesante proyecto que ofrecerá una plataforma de contenidos y comercio electrónico a las PYME de la provincia de Sevilla.

Aunque sigo prefiriendo PHP para mis propios desarrollos, en estos meses he comprobado que J2EE es una especificación sólida y compleja que no sólo propicia, sino que fuerza a desarrollar siguiendo esquemas y patrones. Su integración con entornos como Eclipse ofrece herramientas muy útiles para tener un control total sobre el código. También he agradecido la comodísima gestión de los servicios web; una vez que se conoce el mecanismo, construirlos es baladí.

Claro que hay aspectos que no terminan de convencerme. Como soy un programador responsable, no soy partidario de tanta rigidez a la hora de usar objetos, lo que genera excesivo código innecesario. También echo de menos la facilidad de modificar un fragmento de código sin tener que reiniciar el servidor, por más que Tomcat autodetecte los cambios y dispare el despliegue de la aplicación. Por último, Java me parece menos eficiente que PHP, o al menos no tan susceptible de ser optimizado.

A medida que profundice en este complejo universo de desarrollo, es posible que mi opinión varíe. Pero sin duda, mi perspectiva será mucho más rica y argumentada.

10 snippets de código PHP

A veces perdemos mucho tiempo reinventando la rueda. Tener a mano estos pequeños idioms o fragmentos de código reutilizable puede ahorrarnos más de una búsqueda en Google.

Vía Internet Microsiervos. 

Depurando PHP

ZendMi sistema de depuración en PHP siempre ha sido muy rústico (pero eficaz): colocar trazas en el código y comprobar su salida. Sin embargo, desde que aterricé en el mundo Java, estoy empezando a pasar por el aro de usar el IDE como depurador, lo cual tiene sus ventajas y acelera el desarrollo.

Hoy traigo un par de enlaces interesantes (I y II) para instalar, configurar y usar Zend Debugger en Eclipse PDT.