Omid Kordestani, el nuevo presidente ejecutivo de Twitter

Siempre he tratado de seguir las novedades tecnológicas, sobre todo las relacionadas con internet, y en la mayoría de los casos he sido un early adopter de todo tipo de servicios en la web; sin embargo, igual puede parecer absurdo, o no, la cuestión es que desde hace ya bastante tiempo me estaba sintiendo como fuera de lugar, o como un bicho raro, simplemente porque no me gusta twitter, no le veo sentido, apenas lo uso para “tuitear” y casi menos aún para ver tuits de otras personas. Es más, los pocos tuits que pongo en su mayoría vienen de otras herramientas que automáticamente me publican el tuit (de hecho creo que este post se publicará automáticamente en un tuit jeje).

Y claro, si ves que twitter está por todos lados, en todos los medios, y que, al menos aparentemente, todo el mundo lo usa (luego es bien fácil comprobar que esto no es tan cierto), pues me queda una sensación extraña.

Sin embargo ahora mi perspectiva ha cambiado totalmente al enterarme de esta noticia: el nuevo presidente ejecutivo de Twitter, Omid Kordestani, no tuitea!!! O sea, el bueno de Omid, según esta noticia, ha publicado 9 tuits en 5 años!!! Hombre, pues a lo mejor no soy un tipo tan raro no?

Si además vemos los problemas que arrastra la empresa últimamente, con importantes movimientos en la cúpula directiva, obligada a practicar despidos, … esto aún más me refuerza en mi postura.

¿Conseguirá Omid engancharse a Twitter al fin? ¿Acabaré yo enganchado algún día? La verdad, dudo ambas cosas, el tiempo lo dirá.

Anuncios

¿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í.