El experimento del remarketing

Después de que en el anterior post me quejase amargamente de la persecución de un baner malencarado, por fin su autor (que ya se ha disculpado) ha publicado las conclusiones y motivaciones de su estudio.

Dejo aquí el enlace a su post: Este Banner me persigue, y le agradezco que se haya molestado en disculparse. Ciertamente me ha hecho ver que las cosas que se pueden hacer con las herramientas de marketing de google también pueden usarse para el mal ;-)

Eduard, estás perdonado, pero, por favor, la próxima vez que nos persigas con una campaña de este tipo, por favor, pon una imagen más agradable como esta:

(Foto sacada de aqui).

Lo que no se es, ¿cuanto te costó esta campaña de «mentalización»?

Páginas estáticas multilingues y con plantilla tiles en struts2

Si, es un título un poco largo, pero he tardado un poco en encontrar una solución a este problema y quiero compartirlo para todos aquellos que os encontréis en la misma tesitura.

Primero, un pequeño resumen de la situación:

  • Aplicación java con struts2+tiles+urlrewrite
  • internacionalización mediante i18n con archivos de properties
  • Necesidad de un número no trivial de páginas «estáticas» con textos largos poco susceptibles de entrar como property.

Los problemas:

  1. No queremos tener una entrada en el tiles.xml por cada página estática pero queremos utilizar las plantillas existentes.
  2. No queremos generar una acción nueva por cada página
  3. No queremos tener que hacer una nueva entrada urlrewrite por cada página
  4. Queremos poder generar páginas de error si no encontramos una página en un idioma determinado.
  5. Queremos poder generar el texto completo en cada idioma como una página html, no como properties.

Si todavía no os habéis hecho una idea, no os preocupeis, es algo normal. Esta situación no se da todos los días.

La solución

O mejor dicho, mi solución…

Voy a crear una única acción que se encargue de determinar el jsp a cargar dentro de la plantilla tiles y voy a modificar una plantilla existente para inyectarle esa nueva página. Además, como el título de la página estará en la plantilla, voy a encargarme de generar el texto en el idioma adecuado. Además, voy a crear un prefijo para el urlrewrite que permita que todo esto quede bonito para google…

Paso a paso:

Modificación del urlrewite.xml:

<rule>
    	<from>^/web/(.*)$</from>
    	<to>/Estaticas.action?pagina=$1.jsp</to>
    </rule>

Con esta regla le decimos que siempre que tengamos una url con la forma /web/mipagina llamaremos a la acción Estaticas y le pasaremos como parámetro mipagina.jsp

Modificacion en struts.xml:

<action name="Estaticas" 
           class="com.yoprogramo.web.action.EstaticasAction">
  <result>/estatica.jsp</result>
</action>

Con esa acción lo que hacemos es llamar a EstaticasAction.java (luego lo vemos) y redirigir a estatica.jsp que tiene este contenido (quitando las cabeceras):

<tiles:definition name="estatica.modif" extends="estatica">
  <tiles:putAttribute name="body" value="${pagina}" />
</tiles:definition>
<tiles:insertDefinition name="estatica.modif" />

Lo que estamos indicando es que se modifique la plantilla con nombre estatica, definida en el tiles.xml y que ponga como atributo body el valor que la acción nos ha devuelto en pagina, de esta manera estaremos utilizando la plantilla definida en el tiles.xml, pero pasándose un jsp distinto. Esta forma de utilizar tiles es lo que se denomina «mutable», para poder utilizarla hay que incluir en el archivo web.xml:

  <context-param>
        <param-name>org.apache.tiles.factory.TilesContainerFactory.MUTABLE</param-name>
        <param-value>true</param-value>
  </context-param>

Ahora que tenemos todo en su sitio, solo tenemos que crear una estructura donde guardar las páginas de cada idioma y poder localizarlas facilmente. Por ejemplo, yo he creado una con esta estructrura:

Arbol de páginas estáticas

Bajo «es» pondré las páginas en español, en «en» las páginas en inglés y en «multi» las páginas multilingues que utilizan el packages.properties para traducir sus claves.

Lo único que nos queda ahora es programar la acción EstaticasAction.java .. Os dejo el código del execute:

		// Eliminamos ruta de lenguaje
		int idx=pagina.lastIndexOf("/");
		String page_name = pagina;
		
		if (idx>0)
			page_name = pagina.substring(idx+1);
		
		idx = page_name.lastIndexOf(".");
		if (idx>0)
			page_name=page_name.substring(0,idx);
		
		//Parte multilingue.
		//Vamos a crear una página para cada idioma, excepto para las
		//que sean muy simples y esas estarán en el directorio /multi
		if (!pagina.contains("/multi")) {
			String lang = getText("locale.language");
			if (lang==null)
				lang="en";
			pagina = "/"+lang+"/"+pagina;
		}
		
		// Ahora comprobamos si existe la página y si no existe redirigimos
		// a una página de error del tipo multi
		String servletContext = 
                     ServletActionContext.getServletContext()
                                                 .getRealPath("/estaticas");
		String filePagina = servletContext+pagina;
		File f = new File (filePagina);
		if (f.exists())
			pagina="/estaticas"+pagina;
		else
			pagina="/estaticas/multi/noexiste.jsp";
		
		// Ahora ponemos el título, que deberá estar como un texto 
		// en package con la forma web.<nombre_pagina>.titulo
		String key = "web."+page_name+".titulo";
		titulo = getText(key);
		
		return SUCCESS;

Una vez todo puesto en su sitio la mecánica para crear páginas estáticas y usarlas en nuestra aplicación es bastante simple:

  1. Crear un jsp con el texto para cada idioma y colocarlos bajo el directorio correcto (p.je. es/mipagina.jsp y en/mipagina.jsp)
  2. Crear una entrada en el package_en.properties y package_es.properties con la clave web.mipagina.titulo indicando el título de la página en cada idioma. (Recordemos que el titulo está en el head de la página y eso suele estar en la plantilla, no en el jsp que estamos modificando).
  3. Ya podemos acceder a /web/mipagina y ver cómo queda dentro de nuestra plantilla.

Igual inicialmente parece mucho trabajo, pero una vez hecho esto podréis hacer tantas páginas estáticas como queráis sin ningún esfuerzo y ligadas a las plantillas del resto de vuestra aplicación.

Hablando con las paredes (del banco digital)

UNO-E te roba

Cuando en el año 2000 aparecío el banco uno-e, el primer banco en España completamente digital, yo me apunté y cree una cuenta en parte como experimento, en parte como apoyo a este tipo de operativa por internet que tanto me gustaba.

Este banco siempre se ha caracterizado por cosas que ahora son normales, como no cobrar comisiones por operativa ni por tarjetas de crédito. A cambio, solo se podía operar por internet o por teléfono. Sufrí la primera implementación del banco, donde todo iba muy, pero que muy lento, el sistema de seguridad dejaba mucho que desear con claves de 4 y 5 caracteres y no ha sido hasta finales de 2010 cuando han lanzado la versión movil (con operativa limitada).

Cuento todo esto para que sepáis que estoy comprometido con la entidad ya que es en ella en la que voy ahorrando mes a mes lo poco que puedo e ingresándolo en una cuenta remunerada ligada a una cuenta corriente. Según lo que operes con la cuenta corriente te dan más o menos interés cada mes en la cuenta remunerada. Entre las cosas que valoran está el hecho de (según el contrato) tener un abono de nómina mensual mayor que 600 Euros (en su publicidad dicen «domiciliando la nómina»). Y yo la tengo domiciliada.

El caso es que me llegó el extracto sobre los intereses que iba a recibir por el mes de octubre y no me incluyen el 1% correspondiente a la nómina. Después de comprobar que efectivamente en septiembre había tenído nómina, pongo una reclamación por internet (método incómodo y con un formulario feo-feo), esperando que reparen su error. Dos días después (haciendo gala de una velocidad impresionante) y a las 9 de la noche, me llaman al movil…

La señorita, tras explicarle de nuevo el problema, me indica que el ingreso de mi nómina ese mes aparece como transferencia y no como abono de nómina (el código interno) y por eso no tengo derecho al 1% de intereses en la otra cuenta. Yo, obviamente, intento hacerle ver que si el importe es el mismo, la fecha es la misma e incluso la cuenta de origen es la misma, es evidente que se trata de mi nómina, independientemente del código interno. Después de tenerme al teléfono durante media hora, consultando con su ¿supervisor? me indican que no, que es un proceso automático y que no tengo derecho. Le indico que puedo pasarles el justificante del banco de origen o incluso pedir un certificado a dicho banco indicando que se trata de una nómina (o incluso de la empresa, que por algo soy empresario)… Pero ella erre-que-erre que no querían considerar como nómina el ingreso.

Una vez quedado claro que no voy a conseguir arreglar el tema, decido poner una reclamación y es ahí donde viene lo mejor:

Yo:

Señorita, ¿podía indicarme el procedimiento para hacer una reclamación?

Ella:

Ya le tomamos nota nosotros de lo que dice, no le corresponde una reclamación.

Yo:

¿Cómo que no? Yo tengo derecho a hacer una reclamación

Ella:

No, como no se ha ingresado como nómina no le corresponde y no puede reclamar

Yo:

Señorita, yo puedo poner una reclamación tenga razón o no, estoy en mi derecho como cliente.

Ella:

Ya dejamos constancia aqui de su caso

Yo:

Señorita, tengo todo el derecho del mundo a hacer una reclamación formal y recibir una respuesta a la misma. Solo le estoy preguntando por el procedimiento

En este punto todo me parecía tan subrealista que no me lo podía creer, ¿realmente no hay forma de poder poner una reclamación? He tenido menos problemas reclamando a telefónica, y eso ya es mucho decir.

Finalmente me pasan con otra señora de atención al cliente (recordemos, las 9:30 de la noche ya) que me insiste que no es un problema suyo, que ellos no lo consideran nómina y que no tengo derecho a la renumeración ¡ni siquiera derecho a quejarme!. Finalmente me dan un numerito para que me quede constancia de que he planteado un problema.

En resumen, una entidad de la que soy cliente desde hace más de 10 años me dice que no puedo quejarme de sus servicios… Bueno, pues me quejaré y no solo eso, sino que me cambiaré de banco: bye-bye uno-e, bienvenido ing…

Para el que esté interesado, este es el enlace para el Servicio de reclamaciones del banco de España y aquí el enlace al procedimiento telemático para presentar las quejas. Aunque eso, si, el plazo de resolución es de 4 meses (solo si estáis dispuestos a esperar).

Y mientras yo perdía el tiempo hablando con las pareces del banco me perdía cómo mi hijo terminaba el Uncharted 3 que estábamos jugando a medias… grrrr…

Steve Jobs nos ha dejado

Steve Jobs

Aunque era una noticia que se esperaba desde hace tiempo, cuando alguien se entera de que uno de sus ídolos ha muerto, le invade una sensación de perdida irreparable. Este es el caso de Steve Jobs, una personalidad que ha cambiado el mundo.

Al margen de todo lo que objetivamente ha hecho Jobs en sus 56 años para la tecnología, el entretenimiento y el mundo de los negocios, lo que a mi, personalmente, me impresiona de esta persona se puede resumir en estos puntos:

  • Pudo ser un bala perdida pero una maestra le recondujo de pequeño y le ayudó a buscar su camino. Un ejemplo para todos los que creen que no tienen arrglo
  • Creó de la nada una empresa, basándose en el conocimiento de su amigo Woz y en su determinación
  • Tuvo una visión del futuro y luchó para conseguir que esa visión fuese real, nada ni nadie pudo pararle
  • Cometió errores, fue despedido de la empresa que fundó por alguien que contrató el mismo, pero supo reaccionar, siguió su instinto y nunca dudó sobre su visión
  • Sufrió en lo personal, pero nunca uso su enfermedad como excusa ni como disculpa, al contrario, consiguió que la cercanía de la muerte reafirmara sus motivaciones
  • Nunca buscó solo el dinero, aunque lo consiguió a toneladas, siguió moviéndose cuando algunos se habrían retirado
  • Su visión nos ha traído más cerca a la tecnología y la ha hecho más agradable y fácil de usar

En palabras de gente que le conoció, no fue una persona fácil de tratar, a veces fue un déspota y a veces un auténtico dictador, aunque también sabía ser agradecido y detallista. Una personalidad, en suma, centrada en conseguir hacer realidad sus ideas y que nos ha aportado muchos ratos buenos con sus productos.

Descanse en paz.

Os dejo un video con el discurso que dio Jobs en Stanford, muy motivador: