miércoles, 30 de noviembre de 2011

WordPress: Tema Sliding Doors

Buscando un tema de WordPress para un sitio que estoy montando me topé con "Sliding Doors" ("Puertas Corredizas"), y me agradó bastante por su efecto en el menu principal que hace honor al título del tema.

Como tuve que pasar un rato leyendo el foro para averiguar como personalizar el menú, dejo a disposición una pequeña guía de cómo hacerlo para todo aquel que quiera evitar rascarse la cabeza un rato.

Instalar el tema es bastante sencillo con WordPress. Solo se necesita hacer una búsqueda usando "Sliding Doors". Seleccionamos el tema y lo instalamos.


Vamos añadir una nueva página que va a ser enlazada en el menú deslizante. Usamos la opción de añadir una nueva página.



Para cambiar la imagen que se usará en el menú para esta página damos clic al link de "Imagen destacada" y seleccionamos la imagen de nuestra preferencia.


Seguidamente seleccionamos la opción de "Usar como imagen destacada".

Guardamos los cambios y publicamos la página.


Ahora nos vamos a la sección de menús. Creamos un nuevo menú, le agregamos nuestra página recien creada y lo seleccionamos como el menú de "Sliding Navigation".


Listo, tenemos nuestra página en el menu deslizante.

jueves, 17 de noviembre de 2011

Búsqueda de letras faltantes del abecedario en una oración


Creo que siempre es bueno salvar cualquier código que uno haya hecho por más simple o trivial que parezca. Puede ser que en el momento menos esperado lo requiramos y realmente es frustrante acordarse de que ya uno lo había hecho y luego desechado a la basura.

Dejo para el historial un pequeño código que hice como parte del proceso para aplicar a una empresa. El planteamiento es simple. Codificar un programa que busque las letras faltantes del abecedario en una oración.

import java.util.HashSet;
import java.util.Set;

/**
* Test code to find missing letters of the alphabet from a String sentence.
* @author gabriel.solano
*
*/
public class MissingLetters {

private final int ASCII_CODE_FOR_LETTER_A = 97;
private final int ASCII_CODE_FOR_LETTER_Z = 122;

/**
* Gets the missing letters of a sentence in lower case.
* @param sentence
* @return String having all the letters that the sentence is missing from the alphabet.
*/
public String getMissingLetters(String sentence){
/*
* 1. Let's populate a set with the unique characters of the sentence.
* This approach avoids having two nested for's in the code (better performance).
*/
Set<Integer> uniqueASCIICodes = new HashSet<Integer>();

for (char character : sentence.toLowerCase().toCharArray() ) {
if (character >= ASCII_CODE_FOR_LETTER_A
&& character <= ASCII_CODE_FOR_LETTER_Z) { // Range of lower case letters.
uniqueASCIICodes.add((int)character);

if (uniqueASCIICodes.size() == 26) {
break; // Sentence already covered all letter from the alphabet.
}
}
}
/*
* 2. Move in the range of ascii codes of lower case alphabet
* and check if letter was present in sentence.
*/
StringBuilder misingLettersBuilder = new StringBuilder();

for (int i=ASCII_CODE_FOR_LETTER_A; i <= ASCII_CODE_FOR_LETTER_Z; i++) {
if (!uniqueASCIICodes.contains(i)) {
misingLettersBuilder.append((char)i);
}
}
return misingLettersBuilder.toString();
}

public static void main(String[] args) {

String case1 = "A quick brown fox jumps over the lazy dog";
String case2 = "bjkmqz";
String case3 = "cfjkpquvwxz";
String case4 = "";

MissingLetters missingLetters = new MissingLetters();

System.out.println("Missing letters for[" + case1 + "]: " +
missingLetters.getMissingLetters(case1));
System.out.println("Missing letters for[" + case2 + "]: " +
missingLetters.getMissingLetters(case2));
System.out.println("Missing letters for[" + case3 + "]: " +
missingLetters.getMissingLetters(case3));
System.out.println("Missing letters for[" + case4 + "]: " +
missingLetters.getMissingLetters(case4));
}
}

Salida del programa:

Missing letters for[A quick brown fox jumps over the lazy dog]:
Missing letters for[bjkmqz]: acdefghilnoprstuvwxy
Missing letters for[cfjkpquvwxz]: abdeghilmnorsty
Missing letters for[]: abcdefghijklmnopqrstuvwxyz

martes, 25 de octubre de 2011

Expression Language (EL): Activación


El "expression language" es un tipo de notación en JSP que permite navegar sobre beans de una manera más simplificada y sencilla.

Si tengo por ejemplo un bean "Foo" con una propiedad llamada "prop" y a su vez esta contiene otra propiedad llamada prop2, la forma anticuada de accesar la propiedad sería:

"myFoo.getProp1().getProp2()"

Con EL podemos omitir los "get" de esta forma:

"${myFoo.prop1.prop2}"

Recientemente estaba teniendo un conflicto porque el JSP no me interpretaba el EL. Lo que me estaba faltando era un buena declaración del web.xml que indicara que estamos usando la versión 2.4 de Servlets:

<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

Quería dejar esto documentato porque me tomó rato averiguar como se activaba.

lunes, 24 de octubre de 2011

Sin temor a lucir "fuera de onda"


A veces pareciera que el mundo del desarrollo de software se comporta parecido al mundo de la moda. No lo digo porque piense que esté sujeto completamente a condiciones triviales como la influencia de una estrella pop sobre las jóvenes adolecentes, pero en menor escala, los frameworks estrella más populares tienden a monopolizar la atención de los ingenieros de software con recetas, a veces al punto de pensar que cualquier cosas distinta de la receta está fuera de moda.

Frameworks como Struts, Spring o Hibernate son herramientas exelentes para muchos de los desarrollos de software. El problema considero que comienza cuando un desarrollador cría un esquema en su mente, de que todos los proyectos deben implementarse con la receta estandar "para todas la tallas" que él utiliza. Si alguien más sugiere hacer algo diferente, o solamente menciona en alguna conversación amistosa a otro colega que está utilizando una técnica diferente, el chico receta framework podría verlo como el fuera de onda o inclusive hasta molestarlo por ser un dinosaurio a su parecer.

He estado viendo las exposiciones de la reciente conferencia de Java Zone 2011. Dos presentaciones en particular llamaron mi atención por su valentía para cuestionar el “status-quo”. Una expone un acercamiento diferente a la inyección de dependencias:


Dependency injection when you only have one dependency from JavaZone on Vimeo.

Y la otra, particularmente la que disfruté más, es la de esta entusiasta ingeniera, que con buenos argumentos, se para firme ante su negativa de utilizar Hibernate en sus desarrollos con persitencia en bases de datos.


Hibernate should be to programmers what cake mixes are to bakers: beneath their dignity. from JavaZone on Vimeo.

No estoy tomando partido en ninguna de estas dos presentaciones. Debo confesar que me falta experiencia como para tomar una posición informada en los tópicos mencionados, pero realmente admiro a estos dos por mostrar sin ningún titubeo, dos formas alternativas a técnicas actuales del desarrollo de software. La innovación aparece frequentemente en situaciones donde alguien se aparta de los demás.

Creo que como latinoamericanos tenemos mucho que aprender de estos dos ejemplos. Estamos muy acostumbrados a ser consumidores de tecnologías pero no a ser productores de ellas. Debemos tener la mente abierta para experimentar con nuevas alternativas, utilizando un criterio racional y mucha humildad para examinarlo todo, y ejercitar el jucio informático, el cual es clave en nuestro desarrollo profesional.