Aprendiendo Vaadin #1: Hola Mundo

Gestor de proyectosLlevaba tiempo buscando una forma de poder desarrollar una aplicación RIA sin tener que sufrir una dura curva de aprendizaje, aprovechando mis conocimientos de Java y obteniendo unos resultados suficientemente buenos. De primeras, GWT me pareció una buena opción, pero después descubrí Vaadin, que bajo mi punto de vista va un paso más allá y me convenció mucho más. En esta serie de entradas compartiré mis primeras experiencias con este framework.

Y bien, ¿por qué Vaadin? Creo que es un framework muy a tener en cuenta pues aporta a cualquier equipo de desarrollo RIA grandes y claras ventajas competitivas. Generalmente en este tipo de proyectos suelen existir 2 perfiles claramente diferenciados: el desarrollador de front-end y el de back-end. Aunque se pueda dar el caso, no es muy común contar con miembros en el equipo que dominen ambas vertientes, y más difícil aún es encontrar alguien de estas características en el mercado laboral con cierta urgencia.
Pues bien, usando Vaadin, sólo con perfiles Java es posible desarrollar aplicaciones 100% RIA de resultados sorprendentemente buenos, lo cual aporta una gran flexibilidad para poder echar en cualquier momento más carne en el asador de un lado o de otro.
Por otro lado, la posibilidad de crear aplicaciones móviles HTML5 mediante el add-on TouchKit usando exclusivamente Java para su desarrollo me parece muy atractiva.

Cómo no podía ser de otra forma, el primer acercamiento será creando el típico “Hola Mundo”. Crearé el proyecto AprendiendoVaadin montando primeramente un entorno siguiendo las indicaciones del libro de Vaadin. En mi caso, como voy a usar Eclipse, he seguido las instrucciones para instalar el plugin de Eclipse y para crear y ejecutar un nuevo proyecto. Tras ello me encuentro que ya tengo un pequeño código de ejemplo:

public class AprendiendoVaadinUI extends UI {

	@Override
	protected void init(VaadinRequest request) {
		final VerticalLayout layout = new VerticalLayout();
		layout.setMargin(true);
		setContent(layout);

		Button button = new Button("Click Me");
		button.addClickListener(new Button.ClickListener() {
			public void buttonClick(ClickEvent event) {
				layout.addComponent(new Label("Thank you for clicking"));
			}
		});
		layout.addComponent(button);
	}
}

Resulta fácil de leer y muy claro lo que hace. La clase extiende UI (User Interface) que es la clase padre de donde deben heredar las interfaces de usuario que vayamos a crear. A continuación sobreescribe el método init que inicializará la interfaz de usuario.
Define un Layout vertical que se asigna a la interfaz. Después crea un botón al que asigna un comportamiento ante el evento Click y añade el botón al layout creado previamente.
Ante un click en el botón lo que ocurrirá es que aparecerá un Label dándonos las gracias justo debajo del botón, ya que el layout definido es vertical.

VaadinClickMe

Para llevar este ejemplo tan sencillo un pequeño paso más allá voy a hacer que el mismo botón sirva tanto para mostrar como para ocultar el mensaje “Hola Mundo!!!”. Para ello bastará con jugar con la visibilidad del Label que contiene el mensaje y con la propiedad Caption del botón como se puede ver en el código:

public class AprendiendoVaadinUI extends UI {

	private final String BTN_CAPTION_MOSTRAR_MENSAJE = "Mostrar mensaje";
	private final String BTN_CAPTION_OCULTAR_MENSAJE = "Ocultar mensaje";
	private final String MENSAJE = "Hola Mundo!!!";

	@Override
	protected void init(VaadinRequest request) {
		final VerticalLayout layout = new VerticalLayout();
		final Label mensaje = new Label(MENSAJE);
		final Button button = new Button(BTN_CAPTION_MOSTRAR_MENSAJE);

		layout.setMargin(true);
		setContent(layout);

		layout.addComponent(button);
		mensaje.setVisible(false);
		layout.addComponent(mensaje);

		button.addClickListener(new Button.ClickListener() {
			public void buttonClick(ClickEvent event) {
				mensaje.setVisible(!mensaje.isVisible());
				if (mensaje.isVisible())
					button.setCaption(BTN_CAPTION_OCULTAR_MENSAJE);
				else
					button.setCaption(BTN_CAPTION_MOSTRAR_MENSAJE);
			}
		});
	}
}

Como primer acercamiento no está mal. De una forma muy sencilla y rápida he conseguido algo que de otra forma seguramente me habría costado más, y usando sólo Java. ¿Alguien da más?

Puedes descargar el código fuente de este ejemplo aquí.

Mi carrera de desarrollador de software: el perfil de gestor

Gestor de proyectosPara terminar con la mini-serie de artículos sobre orientación profesional del desarrollador de software trataré con algo más de detalle las peculiaridades del perfil de gestión en desarrollo de proyectos de software. ¿Es éste tu objetivo profesional? ¿Te estás dedicando ya a ello?

Si has leído el primer post de esta mini-serie es probable que hayas decidido que tu orientación profesional debería enfocarse a la rama de gestión. Esta rama puede aportarte, sin lugar a dudas, grandes satisfacciones, sobre todo si no son las cuestiones puramente técnicas las que más te atraen de este trabajo. Igualmente esta rama te puede aportar muchos quebraderos de cabeza.

Para afrontar con éxito la carrera de gestión de software necesitarás una fase previa de preparación:

  • Paso obligatorio es contar con experiencia en desarrollo como técnico antes de ejercer como gestor. Sólo así sabrás de primera mano cómo funcionan las tripas de la profesión, qué problemas pueden aparecer, la experiencia te enseñará a estimar y te ayudará a planificar, etc.
  • Como ya he mencionado anteriormente en anteriores posts, durante esa fase previa a la gestión ejerciendo como técnico, intenta tocar todos los palos posibles y consigue un perfil técnico horizontal: no sólo lenguajes y herramientas de desarrollo, también gestores de BB.DD., servidores web y de aplicaciones, etc. pero sin profundizar demasiado en ninguna de estas tecnologías. Lo que después te servirá es tener una base firme y visión general.
  • Procura ser bueno en tu trabajo pero evita hacerte imprescindible. Si te haces imprescindible por ser el único que posee alguna aptitud técnica te quedarás anclado y no progresarás. Comparte tu trabajo, tus conocimientos, y documenta lo que hagas, y evitarás esa situación.

Esta fase previa de toma de experiencia debería durar entre unos 5 y 10 años, dependiendo del caso. Al final de esta fase será muy conveniente cuidar tu formación orientándola a la gestión:

  • Fórmate en software de gestión de proyectos. Los diagramas de Gantt se convertirán en una herramienta fundamental. Microsoft Project es un clásico en este campo. Herramientas de gestión de proyectos como Redmine (entre otras) también son muy recomendables.
  • En algunos sitios son muy valoradas las certificaciones en gestión de proyectos. Una certificación PMP puede dar mucho peso a tu CV y abrirte muchas puertas, además de convertirte en un solicitado profesional. También una certificación PRINCE2 te puede resultar muy útil si piensas desarrollar tu carrera en Reino Unido.

Así mismo, también es importante contar con una serie de aptitudes que si no son tu fuerte puedes tratar de mejorar durante esta fase previa:

  • Es fundamental contar con dotes de liderazgo. Debes conseguir que el equipo te respete, y debes tratar de transmitir al equipo empuje, ganas y motivación.
  • Como líder debes mostrar interés en entender a los miembros del equipo; cada uno tiene situaciones, inquietudes y objetivos muy diferentes y sólo así podrás conducirles adecuadamente para lograr el éxito del proyecto.
  • Es muy importante que seas ordenado y metódico. La gestión de un proyecto no puede ser un caos o estará abocado irremediablemente al fracaso, y el origen de ese orden debe partir de raíz del gestor del proyecto.
  • Es importante que seas un buen orador. Hablar en público no debe ser ningún problema. Si no es éste tu fuerte, existen técnicas para desarrollarlo.
  • Siempre debes mostrar seguridad. Si te muestras inseguro no conseguirás el adecuado respecto ni de los miembros del equipo ni de tus jefes o clientes. Es natural que sientas inseguridades, pero te las debes quedar para ti.
  • Desarrollar la capacidad de negociación se debe convertir en unos de tus principales objetivos. Convencer, persuadir, involucrar e integrar al personal será fundamental.
  • Al igual que en el caso del gurú técnico, es importante conseguir y mantener una buena red de relaciones profesionales. Herramientas como LinkedIn o Xing pueden ayudar mucho en esta tarea.

En definitiva, esta orientación profesional requiere de una preparación y experiencia previas más larga que la carrera puramente técnica, así como contar con una serie de aptitudes personales que si no son tu fuerte sí que puedes cultivar.

Y hasta aquí la mini-serie de artículos sobre orientación profesional del desarrollador de software. Espero haber servido de ayuda a los compañeros que empiezan o a los que se sienten un poco perdidos.

Mi carrera de desarrollador de software: el perfil de gurú técnico

Gurú técnicoEn mi anterior post hablaba sobre cómo enfocar la carrera de desarrollador de software en torno a dos vertientes: el gurú técnico o perfil vertical, y el gestor o perfil horizontal. Si te ves más identificado con el perfil vertical continúa leyendo pues a continuación pretendo desgranar las características, pros y contras de ejercer como gurú.

Ya has decidido tu opción profesional dentro de la carrera de desarrollador de software, y crees que encajas como un gurú técnico. Hay que reconocer que resulta ciertamente atractivo: algunos de estos gurús son incluso famosos, con gran cantidad de seguidores ¡casi parecen estrellas del rock o del celuloide!
Si es así tendrás una serie de características propias de dicho perfil que van a condicionar el desarrollo de tu carrera, y te van a aportar ciertas ventajas y desventajas en el mundo laboral. Pues bien, ¿qué tendrás que exigirte a ti mismo para llevar a buen término tu carrera? Veámoslo:

  • Necesitarás reciclarte continuamente, estar al día de las novedades y “en la cresta de la ola” de todo lo que acontezca relacionado con tu especialidad.
  • Será fundamental y completamente necesario mantener un blog donde puedas dar fe de tus aptitudes, a modo de escaparate de tus capacidades. Tienes que venderte y ¿qué mejor que un escaparate para vender los artículos de tu tienda?
  • Además del blog, te será mucho más que conveniente participar activamente en portales, foros, etc. relacionados con tu especialidad. Debes darte a conocer.
  • Deberás dedicar regularmente parte de tu tiempo a “moverte por el mundillo” para  conseguir y mantener una red de contactos profesionales. Asiste a encuentros, charlas, conferencias, etc.

Si esto es lo tuyo, seguramente te sientas cómodo y feliz, pero deberás estar atento y alerta a una serie de peligros derivados de la esclavitud tecnológica. Ser un experto en una tecnología implica dedicar grandes esfuerzos a ella, y prácticamente el 100% de tu tiempo o casi. Esto tiene consecuencias:

  • Tu perfil puede quedarse flojo en otros ámbitos, y puedes tener dificultad para sacar adelante trabajos diferentes a los que estás habituado. Esto sin duda puede cerrarte alguna puerta o restarte libertad de actuación.
  • Tendrás una dependencia o bien de un proveedor o fabricante, o bien de modas. Puede que tu rama sea muy demandada y un día de repente puede dejar de serlo, o dejar de ser una vertiente estratégica para el fabricante.
  • A largo plazo puede que algún día te aburras de trabajar siempre con el mismo tema y lo que un día fue tu pasión se puede convertir en tu hastío.

Como defensa de estos peligros lo mejor será saber cuándo es el momento de cambiar de rumbo o especialidad y estar atento a los movimientos y tendencias del mercado para pivotar a tiempo. Siempre será mejor un pequeño viraje en la dirección correcta que un contraproducente empecinamiento hacia el lugar equivocado.

Como conclusión, trabajar en lo que te gusta es un lujo del que no mucha gente puede disponer, pero como todo, no hay nada perfecto y siempre debemos estar alerta a lo que ocurre a nuestro alrededor. Las ventajas están claras. ¿Se te ocurren otros peligros y formas de defensa? Si es así, agradezco tus comentarios.

Mi carrera de desarrollador de software: ¿hacia dónde la enfoco?

Futuro profesionalEn la evolución profesional de todo desarrollador de software se presentan múltiples disyuntivas; ya incluso antes de poder considerarse como tal, una primera duda podría ser orientar la carrera a técnico de sistemas o a desarrollo de software, y una vez elegido el camino del soft se siguen encadenando múltiples decisiones a tomar y posibles caminos a seguir. Hurguemos en la especialización: ¿hacia dónde enfoco mi desarrollo profesional, me convierto en un gurú de una tecnología (especialización vertical) o en un profesional multidisciplinar (especialización horizontal)?

Esta pregunta se la debe haber planteado todo profesional del desarrollo de software con una mínima conciencia de sí mismo y de su situación, y como en todo, no existe una respuesta única y válida para todo el mundo. Si estás empezando o llevas poco tiempo en este mundillo, o simplemente te encuentras un poco perdido, puedo plantearte una serie de preguntas de fácil respuesta que te servirán para orientarte.

Antes de continuar, dejar claro que nada de lo que pueda decir a continuación es 100% tajante y/o cierto para todos los casos, aunque sí puede ser una buena aproximación.

  • Pregunta 1: ¿tienes claro cuál es tu objetivo profesional?

Esto es fundamental. Si no tienes esto claro, lo único que te quedará es navegar en un mar revuelto a donde te lleve el viento, que con suerte puede ser un buen destino o el peor de ellos. Si es éste tu caso, ya va siendo hora de que cojas las riendas de tu carrera y la dirijas a ese punto que te interesa, sin que nada te distraiga de ello.

Básicamente existen 2 posibles evoluciones profesionales para un desarrollador que están íntimamente ligadas a tu objetivo: la vertiente técnica y la de gestión.

Si tu objetivo es ser un gran técnico, especialízate en una tecnología en particular, conviértete en el gurú de esa tecnología y siempre intenta evitar distracciones de otras tecnologías.

Si quieres ser un buen gestor y/o terminar montando tu propia empresa, intenta tocar todos los palos, cuantos más mejor, pero no profundices demasiado. De esta forma conseguirás una visión global que te permitirá gestionar más eficientemente equipos con miembros especializados en diferentes tecnologías.

  • Pregunta 2: ¿eres un apasionado de la informática y tecnología o estás aquí porque es una buena salida profesional?

Para muchos el desarrollo de software es algo más que su trabajo, es su hobby, su pasión. Disfrutan trabajando. Si es éste tu caso te interesará más especializarte en una tecnología, la que más te apasione, pues si terminas haciendo gestión dejarás de disfrutar trabajando. Además, si imprimes tu pasión en lo que haces conseguirás grandes logros.

Si elegiste la informática por sus perspectivas profesionales no pierdas el tiempo convirtiéndote en el gurú técnico que realmente no quieres ser. Opta por una especialización horizontal.

  • Pregunta 3: ¿prefieres interactuar con máquinas o con personas?

A lo largo del día tenemos que interactuar tanto con máquinas como con personas: el ordenador o el teléfono, y tus compañeros o el conductor del autobús. Sin embargo, a largo plazo, para dedicar horas, debes saber cuál es tu preferencia.

Si te gusta más la interacción con la máquina te conviene más optar por especializarte en una vertiente técnica.

Un gestor sin embargo necesitará dedicar más tiempo a tratar con personas. Si es éste tu caso, opta por una especialización horizontal.

  • Pregunta 4: ¿tienes las aptitudes necesarias para ser un buen técnico o un buen gestor?

Es importante considerar esto porque no todo el mundo dispone de los “skills” necesarios para cualquier cosa. Yo mismo desde muy temprana edad ya sabía que no podría ser un gran deportista.

Un buen técnico debe tener capacidad de abstracción, una mentalidad analítica y pragmática, y saber enfocarse a la resolución de problemas. Además debe estar dispuesto a reciclar sus conocimientos constante y rápidamente ya que la tecnología evoluciona a una velocidad vertiginosa. ¿Encajas tú aquí? Si es así, elige una tecnología y céntrate en ella.

Un buen gestor debe ser ordenado y metódico o de lo contrario trasmitirá el caos a su equipo, debe tener capacidad de planificación, que sepa ver el bosque en lugar de los árboles, disponer de buenas aptitudes comunicativas, ser capaz de transmitir y tener carisma de líder. Si te ves mejor aquí, no dediques tiempo a convertirte en gurú de una tecnología en concreto.

Aunque no sea lo más habitual, es posible que te guste la tecnología y el trato con personas al mismo tiempo, y es posible que tengas aptitudes como buen técnico y como buen gestor. En este caso mi recomendación sería elegir basándote en qué opción encaja más en tu estilo de vida. Aquí ya entraríamos en aspectos más personales en los que no pretendo entrar. Lo que sí te recomiendo si fuera este tu caso es que no te quedes en tierra de nadie pues difícilmente podrás llegar a ser un gran gestor y un gran técnico al mismo tiempo.

Bien, si ya tienes claro cuál es tu objetivo, ponte manos a la obra. Hazte un plan de carrera y no dejes que los demás lo hagan por ti, ni te dejes llevar por las corrientes azarosas. Establece hitos, metas, metas volantes, y ve a por ello bien focalizado, sin que nada te desvíe. ¡Ah! ¡Y suerte!

Seguramente se quede en el tintero alguna cuestión más que debería ser planteada. Si así lo crees, te invito a que lo hagas constar en un comentario.

¿Por qué NO voy a utilizar Google Keep?

No-keep-Google-Keep

Justo después de anunciar el cierre de Reader, la todopoderosa Google presenta una nueva herramienta en forma de SaaS: Google Keep. Yo lo tengo claro. Yo tengo claro que no voy a usarla, y también tengo claro que algo ha cambiado en Google. Señores: torres más grandes han caído.

¿Y qué es Google Keep? No es más que una muy muy simple aplicación para gestionar notas, algo así como la versión electrónica de los clásicos Post-it! Lo primero que llama la atención es esa simplicidad extrema: ¿cuestiones de Time To Market o es más bien seguir fieles al estilo y estética que tanto éxito ha dado a la compañía? Pues tras hacer unas primeras pruebas, me inclino más por pensar que se trata de la primera motivación. De hecho opino que el producto no está minimamente maduro, y tengo mis fundamentos:

  • Al crear mi primera nota veo que existe la posibilidad de incluir imágenes. Lo único que se puede hacer es subir imágenes desde tu equipo, no es posible incluir imágenes desde un enlace. Pero por si esto fuera poco, la subida de imágenes no me funciona y me muestra un error invitándome a intentarlo más tarde.

Error al subir imagen

  • No veo por ninguna parte ninguna forma de relacionarse con otras aplicaciones, no tiene ninguna faceta social, y ni mucho menos una forma de exportar la información. Para mi son muy importantes todos estos aspectos, en la línea de lo que comentaba en mi anterior post. Si usas Google Keep estás aislado completamente. Sólo esto ya es motivo más que suficiente como para no usar esta herramienta sin vacilar.
  • Teniendo en cuenta que la herramienta está totalmente aislada, ¿qué ocurriría si de repente Google decide que ya no es una herramienta estratégica o rentable para la compañía? Mejor no pensarlo.
  • Intento destacar un texto en negrita… ¡imposible! No me lo permite, no tengo la opción. Sólo puedo usar texto plano tal cual. Casi que para eso prefiero usar un editor de textos de toda la vida.

En definitiva son razones más que de sobra, y más que de peso, para fundamentar mi idea de no usar Google Keep de ninguna manera, pero es más, empiezo a plantearme dejar de usar muchos más servicios de la compañía. Debo admitir que hasta el momento he sido todo un fan de Google y fiel usuario pero a día de hoy me lo estoy planteando y mucho:

  • En su día dejé Firefox para usar Chrome y últimamente me está dando problemas preocupantes. Se han empeñado en incluir su reproductor PepperFlash que no hace más que dar problemas y no funciona correctamente. Y lo peor de todo, si lo deshabilitas en favor del reproductor Flash de Adobe (que sí funciona como debe ser) al poco tiempo se vuelve a habilitar él solito. La vuelta a Firefox parece ser el mejor movimiento.
  • Drive me pareció una buena opción en su día hasta que he empezado a usarlo más intensivamente. Bastante a menudo me salta con errores que sólo dejan como opción cerrar la aplicación. Desde luego que Drive no puede ser mi herramienta de almacenamiento cloud de uso prioritario.

En definitiva, Google ya no es diferente, o sí lo es pero en el mal sentido. Ya no es innovadora ni ágil como lo fue en el pasado. Ha perdido el espíritu que la hizo grande. Sus nuevos servicios suelen ser copias de baja calidad de servicios ya existentes y además llenas de errores (da la sensación de estar siempre en fase beta). Constantemente dejan en la cuneta a sus usuarios, y no sólo por lo ocurrido con Reader (aparte de que han cerrado muchos más servicios, pregunto ¿qué fue de GWT?). Intento buscar alguna razón para usar Keep pero vaya, es que no encuentro ni una sola. Me reitero en lo dicho anteriormente, “señores, torres más grandes han caído“. Bienvenidos a la etapa oscura de Google.

Integración de aplicaciones: creación de una correspondencia semántica de códigos mediante Excel

cabeceraUna tarea ineludible cuando integramos varias aplicaciones es la creación de diccionarios de códigos de forma que se pueda traducir la información, con diferentes códigos pero la misma semántica, entre sí. Un ejemplo típico podría ser el sexo: mientras una aplicación usa ‘H’ para identificar al varón, otra aplicación puede usar ‘V’. En este ejemplo es poco problemático construir una correspondencia semántica entre códigos, pero si tenemos que construir, por ejemplo, una correspondencia entre códigos de varios cientos de ciudades nos encontramos ante un problema.

Existen diversas herramientas avanzadas para solventar estos problemas, pero dentro de un desarrollo de recursos limitados (esto seguro que le suena a mucha gente) donde el uso de estas herramientas pueda resultar como matar moscas a cañonazos, resulta incuestionable la utilidad de las hojas de cálculo.

Vamos a partir de un ejemplo muy común y veremos la solución usando Excel. Supongamos que tenemos dos listados de provincias españolas. En uno de ellos las tenemos identificadas numéricamente según códigos postales; a esta hoja la llamaremos “CP”. En el otro listado, las provincias están identificadas con códigos no numéricos del ministerio de interior; a esta hoja la llamaremos “MI”. Finalmente queremos conseguir hacer la correspondencia y obtener algo como esto, que luego podríamos guardar en una tabla de nuestra aplicación o donde y de la forma que más nos convenga; a esta tercera hoja la podemos llamar “Resultado”.

La hoja de cálculo de partida sería la siguiente: HojaProvincias_Inicial

Al inspeccionar la hoja nos encontramos con los primeros típicos problemas:

  1. En un caso las provincias vienen con la primera letra mayúscula y en otro caso todo en mayúsculas.
  2. En un caso vienen incluídas las tildes y en otro no.
  3. La descripción no siempre coincide del todo.

El primer paso para solucionar estos problemas consiste en normalizar los literales. Lo pasaremos todo a mayúsculas, sin tildes o acentos y sin espacios sobrantes. Para el paso a mayúsculas la solución es sencilla, aplicar la fórmula MAYUSC de Excel. Después necesitamos eliminar las tildes. Existen varias formas de solventar este problema. La más simple, aplicando la siguiente fórmula nos quitamos los dos primeros problemas de un plumazo:

=ESPACIOS(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(SUSTITUIR(MAYUSC([celda]);"Á";"A");"É";"E");"Í";"I");"Ó";"O");"Ú";"U"))

Sustituyendo [celda] por la referencia a la celda que queremos transformar. En nuestro caso, con esto nos valdría como solución, pero en casos en los que tratemos con varios idiomas será necesaria una función más avanzada para hacer sustitución de tildes y otros caracteres. Una buena solución sería crear la siguiente función VBA en un módulo de nuestra hoja de cálculo:

Function SinAcentos(ByVal Celda As String) As String

Dim temp, strA$, strB$, i&, p&
strA = "áàäâãåçéèêëíìîïóòôöõð?úùûüýÿ?" & _
       "ÁÀÄÂÃÅÇÉÈÊËÍÌÎÏÓÒÔÖÕÐ?ÚÙÛÜÝ?? "
strB = "aaaaaaceeeeiiiioooooosuuuuyyz" & _
       "AAAAAACEEEEIIIIOOOOOOSUUUUYYZ"
temp = Celda

For i = 1 To Len(temp)
    p = InStr(strA, Mid(temp, i, 1))
    If p > 0 Then Mid(temp, i, 1) = Mid(strB, p, 1)
Next

SinAcentos = temp

End Function

Usando esta función podremos hacer cualquier transformación de un carácter por otro muy fácilmente, y aplicar la normalización en la columna C de cada hoja así:

=SinAcentos(ESPACIOS(MAYUSC([celda])))

La hoja Excel con las provincias normalizadas quedaria así: HojaProvincias_Normalizadas

Ahora que ya tenemos las descripciones de provincias normalizadas, nos queda el tercer problema para terminar por conseguir una solución: las descripciones no coinciden de forma exacta. Por ejemplo, tenemos “SANTA CRUZ DE TENERIFE” y “S. CRUZ DE TENERIFE”.

La primera solución que se puede venir a la cabeza es modificar a mano los registros que no coincidan. Para el ejemplo que tenemos, donde tratamos con alrededor de 50 registros puede ser la mejor opción, pero ¿lo haremos si disponemos de varios cientos o miles de registros? Para estos casos la solución ideal será aplicar el algoritmo de la distancia de Levenshtein. En la wikipedia se describe así:

En Teoría de la información y Ciencias de la Computación se llama Distancia de Levenshtein, distancia de edición, o distancia entre palabras, al número mínimo de operaciones requeridas para transformar una cadena de caracteres en otra. Se entiende por operación, bien una inserción, eliminación o la sustitución de un carácter.

Pues bien, implementamos en VBA el algoritmo de Levenshtein en nuestro módulo de Excel de la siguiente forma:

Function Levenshtein(ByVal string1 As String, ByVal string2 As String) As Long

Dim i As Long, j As Long
Dim string1_long As Long
Dim string2_long As Long
Dim distancia() As Long

string1_long = Len(string1)
string2_long = Len(string2)
ReDim distancia(string1_long, string2_long)

For i = 0 To string1_long
    distancia(i, 0) = i
Next

For j = 0 To string2_long
    distancia(0, j) = j
Next

For i = 1 To string1_long
    For j = 1 To string2_long
        If Asc(Mid$(string1, i, 1)) = Asc(Mid$(string2, j, 1)) Then
            distancia(i, j) = distancia(i - 1, j - 1)
        Else
            distancia(i, j) = Application.WorksheetFunction.Min _
            (distancia(i - 1, j) + 1, _
             distancia(i, j - 1) + 1, _
             distancia(i - 1, j - 1) + 1)
        End If
    Next
Next

Levenshtein = distancia(string1_long, string2_long)

End Function

Después necesitaremos una función que saque partido de este algoritmo y nos busque los resultados deseados. En la hoja que habíamos denominado “Resultado” tendremos referenciados los códigos postales y descripciones de provincias de la hoja “CP”. Necesitamos, por cada una de estas provincias, buscar entre las provincias que se encuentren en la hoja “MI” y devolver el código de aquella cuyo mejor resultado dé el algoritmo de Levenshtein.

Para ello lo ideal sería crear una nueva función VBA en nuestro módulo Excel a la que pasamos como parámetros la provincia que vamos a buscar, el rango de búsqueda, y dentro del rango la columna donde buscaremos los valores a comparar y finalmente la columna donde se encuentra el código resultante a devolver. Esta función sería algo así:

Function Correspondencia(ByVal string1 As String, ByVal rango As Range, ByVal columnaABuscar As Integer, ByVal columnaADevolver As Integer) As String

Dim i As Long
Dim levDist As Long
Dim levTemp As Long
Dim result As String

levDist = Len(string1)
For i = 1 To rango.Rows.Count
    levTemp = Levenshtein(string1, rango.Cells.Item(i, columnaABuscar))
    If levTemp = 0 Then
        result = rango.Cells.Item(i, columnaADevolver)
        Exit For
    Else
        If levTemp < levDist Then
            levDist = levTemp
            result = rango.Cells.Item(i, columnaADevolver)
        End If
    End If
Next

Correspondencia = result

End Function

Aplicamos esta función en la hoja de resultado usando referencias absolutas para definir el rango de celdas donde buscar; por ejemplo, en la celda C2 de la hoja “Resultado” tendríamos:

=Correspondencia(B2;MI!$A$2:$C$53;3;1)

Y de esta forma conseguimos el resultado final, que se puede descargar aquí: HojaProvincias_Resultado

Para terminar el post, una cuantas observaciones/comentarios:

  • Para que todo esto funcione es necesario habilitar las macros en Excel y habilitar el editor de Visual Basic, dependiendo de la versión instalada.
  • Aplicar el algoritmo de Levenshtein es algo que sólo se puede hacer si existe tolerancia a errores, pues con él no siempre se consiguen los resultados esperados.
  • Otra opción a considerar además de Levenshtein es el algoritmo n-gram para la detección de secuencias. En algunos casos puede ser incluso más recomendable que Levenshtein. Sería una mejora “para nota” crear un algoritmo que combine a ambos. Una versión fácilmente adaptable a VBA del algoritmo n-gram se encuentra aquí.

Hello world!

hello_worldCuriosamente justo al crear un nuevo blog en WordPress.com la primera entrada que sugiere automáticamente se titula “Hello World!”.  Y digo yo: ¿qué mejor título que éste para un primer post en un blog sobre desarrollo de software (aunque aparezcan 2 posts anteriores, éste se puede considerar el primer post ya que los otros 2 son rescatados de un antiguo blog)?

Pues bien, hurgando en el baúl de los recuerdos, se me antoja un agradable ejercicio de nostalgia hacer un repaso sobre los “Hello World!” que he visto y experimentado en mis propias carnes desde que empecé en el mundo de la programación allá por el año…

1986: el primer ordenador que tuve en mis manos fue un Commodore Vic20. El primero que fue mío, un MSX de Sanyo. Ambos arrancaban con un intérprete de Basic:

10 print "Hello World!"

¡Qué sencillo era programar! Dediqué incontables horas a picar los listados de programas que publicaban en revistas de la época. Después los guardaba en cintas de cassette y los ejecutaba con un “RUN”.

¡Qué tiempos! Mis amigos tenían Spectrum 48K, Commodore 64K, Amstrad CPC464… y yo un MSX de 64K con monitor de fósforo verde!

1988: este año empecé con el ensamblador del Z-80. El Basic se me quedó lento y quería sacar el máximo rendimiento a la máquina. Ahora soy incapaz de escribir de memoria un “Hello World!” en ensamblador pero buscando en la web pude encontrar algo:

 EQU CR    = #0D          ; carriage return
 EQU PROUT = #xxxx        ; character output routine
 ;
         LD  HL,MSG       ; Point to message
 ;
 PRLOOP  LD  A,(HL)       ; read byte from message
         AND A            ; set zero flag from byte read
         RET Z            ; end of text if zero
         JSR PROUT        ; output char
         INC HL           ; point to next char
         JR  PRLOOP       ; repeat
 ;
 MSG     DB  "Hello world!",CR,00
 ;

¡Qué recuerdos! Básicamente lo que hace es guardar un puntero al mensaje en el registro HL y luego va cargando uno a uno los caracteres a imprimir en el acumulador y los va imprimiendo hasta encontrar un cero, momento en el que el programa termina y retorna.

1990: en este año conseguí ser el propietario de un flamante ordenador PC con procesador Intel 80386. ¡Guau! El MSX quedaba atrás y empezaba con palabras mayores. Así, con un buen manual y esa máquina, pude aprender MS-DOS:

echo Hello world!

1992: en octubre de este año ingresé en la universidad para estudiar informática. En el primer curso aprendimos Pascal. Para mi fue una grata sorpresa aprender este lenguaje, teniendo en cuenta que sólo conocía el Basic y el ensamblador Z-80; aquello de la programación estructurada resultaba genial:

program HelloWorld;
begin
  WriteLn('Hello World!')
end.

1993: ya en el segundo año en la universidad aprendimos C. Me pareció aún más interesante que Pascal. Aún podía usar técnicas de programación estructurada pero con accesos de bajo nivel que me recordaban el potencial del ensamblador:

#include <stdio.h>
int main(int argc, char *argv[])
{
 printf("Hello world!\n");
}

Varios dolores de cabeza tuve con punteros perdidos, memorias no liberadas…

1994: el tercer año en la universidad aprendimos bastante sobre bases de datos, y esto me dio la oportunidad de conocer SQLPL/SQL:

SET SERVEROUTPUT ON;
BEGIN
    DBMS_OUTPUT.PUT_LINE('Hello world!');
END;

1995: ya en cuarto curso, gracias a la asignatura de Inteligencia Artificial, pude conocer nuevos lenguajes. Primero fue LISP (menudo lío de paréntesis):

(princ "Hello world!")

y después vino Prolog:

main :- write('Hello world!'), nl.

También fue ese año cuando conocí lo que para mi era un nuevo e interesantísimo concepto, la programación orientada a objetos, y fue con Smalltalk y la torre de Hanoi:

Transcript show: 'Hello world!'.

1996: este año conocí el CGI scripting con Perl. Aquello sí que me maravilló ¡era posible construir páginas web con contenido dinámico!

print "Hello World!\n";

1997: un curso de verano en la universidad me hizo descubrir Javascript. De nuevo estaba maravillado: las páginas web podían ser dinámicas gracias a los scripts CGI y además era posible ejecutar código en cliente!

document.write('Hello world!');

Luego ya vendrían los problemas de compatibilidad entre navegadores etc. pero eso ya es otra guerra… por entonces usábamos el timón de Netscape.

1999: andaba este año buscando mi primer empleo como programador, y una empresa me dio la oportunidad de aprender primero Visual Basic:

MsgBox "Hello, world!"

He de reconocer que me gustó. El lenguaje no era extraño para mi y me daba nuevas e interesantes posibilidades.
A continuación topé con Java por primera vez:

public class HelloWorld {
   public static void main(String[] args) {
       System.out.println("Hello world!");
   }
}

Java me recordaba mucho a C y me enamoró en seguida (y aún lo estoy): escribía un código que funcionaba en todas las plataformas, con programación a la vez estructurada y orientada a objetos, y sin los problemas y dolores de cabeza que ocasionaba C. ¡Eran todo ventajas!

2003: en esta ocasión se me ocurrió desarrollar un proyecto personal, una página web, dinámica por supuesto. Sopesé las opciones que se me planteaban y finalmente decidí que la herramienta ideal para este desarrollo era PHP:

<!--?php print 'Hello world' ?-->

Se me antojaba un extraño potaje entre HTML y programación y de primeras no me terminó de convencer. Aún así, como es habitual en mi, una nueva herramienta, un nuevo reto y un nuevo aprendizaje eran una motivación añadida.

2006: en este año tenía entre manos el desarrollo de una intranet corporativa y Microsoft Sharepoint 2003 resultó ser una gran herramienta para ello, motivo por el cual tuve mi primer contacto con C#, que luego continué con otros proyectos personales:

using System;
class Program
{
    public static void Main()
    {
        Console.WriteLine("Hello world!");
    }
}

Seguramente se me haya quedado algún lenguaje o herramienta por el camino. ¿Por dónde continuar? Pues por ejemplo por Python, Groovy, Objective-C, Ruby, …

Como reflexión, vistos todos estos años con la perspectiva de la experiencia acumulada, el que se ha mantenido ahí siempre y sigo usando a día de hoy es Java, y aún no está muerto en absoluto. Si bien está claro que no es el lenguaje ideal para todo (de hecho no existe tal lenguaje) sí ha quedado claro su gran potencial y que ha sabido evolucionar con el paso de los años sin quedar obsoleto.