Informática - Tienda de ultramarinos
logo Tienda de Ultramarinos
Categorías Informática

El orden de las letras del teclado

Distribución de teclado es el nombre que se le da a un cierto orden de letras en nuestro teclado. Hay varias de estas disposiciones, aunque la más famosa con diferencia es QWERTY y sus variantes: como AZERTY que usan franceses y portugueses o QWERTZ para los alemanes.

El orden de las letras en nuestro teclado no es fortuito. Pese a que la máquina de escribir existiese en muy diversas formas más de cien años antes, fue en 1868 cuando Christopher Sholes diseñó y patentó el primer modelo comercial de éxito que pronto, 1873, sería comprado por E. Remington and Sons popularizando la distribución QWERTY.

Esta compañía surgió cuando Eliphalet Remington, en 1816, tuvo una de esas ideas que mueven a los hombres a grandes empresas: pensó que podría construir un arma mejor que cualquiera que pudiera comprar. Y vaya si lo consiguió. A pesar de comenzar como un proyecto personal, en seguida todos su vecinos quisieron una, por lo que decidió constituir la empresa. Durante los siguiente años la calidad de sus rifles se hizo suficientemente famosa como para ser el principal proveedor de rifles del ejército norteamericano durante la guerra contra México (1846-48). A finales de los 50, y sobre todo tras la Guerra de Secesión estuvieron muy interesados en diversificar el negocio, de modo que empezaron a vender máquinas de coser, biciletas, útiles agrícolas y otros aparatos mecánicos. Así que la empresa de Remington tenía la maquinaría, los expertos mecánicos, la fama y las ganas necesarias para iniciarse en el negocio de la mecanografía. No sólo eso, sino que estaban situados en Ilion, en medio del estado de Nueva York , no muy lejos de donde terminaría trabajando nuestro protagonista. Aún así no dejaron las armas de lado, a finales del XIX eran los fabricantes de armas más exitosos del mundo (aparecen en la bandera de Guatemala); la compañía terminaría por llamarse Remington Arms y tiene el “honor” de ser la empresa más antigua de Estados Unidos que continua fabricando su producto original.

Sholes, que trabajaba como editor de un periódico en Milwaukee, empezó interesándose por automatizar ciertas tareas como numerar páginas de libros o boletos, pero pronto el proyecto fue a más cuando se unió a Carlos Glidden y terminaron desarrollando un primer modelo que 1868 con dos filas de teclas en lugar de las cuatro que conocemos, con las letras estaban ordenadas alfabéticamente. ¿Por qué dos líneas? Pues porque el artículo que les motivó describía una nueva máquina de escribir, de forma figurada, como “piano literario” y de hecho se inspiraron en el mecanismo del piano, utilizando realmente un sus teclas, en el que blancas y negras representaban cada fila. En realidad el Pterotipo de John Pratt del que hablaba el artículo en nada se parecía a este instrumento como se ve en las fotos, pero su artículo no llevaba fotos.

Pero tras eso siguió un intenso proceso de análisis y pruebas que condujo en 1873 a presentar un modelo definitivo a Remington, quién adquiriría los derechos y, tras un par de pequeñas modificaciones presentaría y popularizaría a la distribución QWERTY que hoy en día conocemos sin apenas cambios mayores.

Un falso mito bastante extendido dice que Christopher Sholes ordenó las letras intencionadamente para escribir más lento y así evitar atascos en las partes mecánicas, que eran uno de los principales problemas de todas estas primigenias máquinas. En realidad con el orden, más que buscar la lentitud o incomodidad del mecanógrafo, pretendía separar las letras que se pulsan seguidas lo suficiente para que no chocasen entre ellas al subir o bajar, nada más.

Para saber qué letras separar es muy probable que se basase en los estudios de pares-frecuencia realizados por Amos Densmore, hermano de James Densmore, uno de los principales inversores en su idea; donde contaba el número de repeticiones de cada par de letras en un texto.

Otro método, mucho más sencillo, para evitar atascos fue distribuir las columnas en diagonal en lugar de crear una rejilla perfecta con las teclas. Estamos tan acostumbrados a ver así los teclados que nos parece hasta normal, pero si nunca hubiésemos visto uno y nos encomendasen fabricar el primero, la mayoría lo ordenaríamos perfectamente recto. De hecho existen teclados así y aseguran provocar menos lesiones musculares, o cansancio, por tener que desplazar menos los dedos, ya que las teclas quedan más juntas. Por el mismo motivo afirman ser más rápidos.

La historia del diseño de estas máquinas está, al igual que cualquier otra, llena de pequeñas maravillas de la ingeniería. Por ejemplo, con el fin de poder hacer iguales todas las barras que sujetan las letras que se imprimen, éstas se ensamblan en un segmento de disco circular, de modo que todas quedan a la misma distancia del centro; seguro que ahora os vienen a la cabeza imágenes de máquinas de escribir y caéis en que la parte curva donde reposan las letras formaría una circunferencia perfecta si la continuásemos. También es curioso que al principio el mecanógrafo no podía ver lo que estaba escribiendo, pues el papel se golpeaba por debajo: tenía que esperar a pulsar intro y desplazar el papel (de ahí el rodillo en el que está insertado) para poder comprobar el texto impreso. No fue hasta 1895 que desarrollaron las innovaciones para ver lo que se estaba escribiendo, introducidas principalmente de la mano de Thomas Oliver.

Cuando los primeros ordenadores se crearon puedo imaginar a algún hacker antediluviano modificando una máquina de escribir para hacer los agujeros adecuados en las primeras tarjetas o modificar la salida las máquinas eléctricas (ya eran populares en los años 40) para comunicarse con el ordenador. Buscando un poco he encontrado la Friden Flexowrittersiguiente imagen.

Y no sólo estamos hablando de la facilidad de incorporar un elemento que ya estaba muy desarrollado (como el teclado electrónico): si se pretendía que el ordenador triunfase y se hiciese un hueco en las oficinas se tenía que facilitar el paso a éste; así que teniendo un ejército de eficientes mecanógrafos acostumbrados a una distribución específica es fácil entender que nadie se plantease seriamente hacer teclados de ordenador muy distintos de como eran en las máquinas de escribir.

Resulta muy sorprendente darse cuenta de que el orden de las letras de la mayoría de teclados está basado en resolver un problema puramente mecánico de hace 150 años. Es una distribución que era muy ingeniosa para evitar el problema de atasco que sufrían las máquinas de escribir, pero que obviamente no existe con los teclados actuales, pero siguen arrastrando el mismo sistema invariablemente.

Por supuesto mucha gente ha pensado en esto antes, por lo que hay diferentes distribuciones de teclado muy distintas de QWERTY, como Colemak, Neo, HCSAR… pero son prácticamente variedades regionales; al igual que existen distribuciones distintas para todos los otros lenguajes no basados en caracteres latinos (aunque luego no dejen de tener algo latino paralelo que suele ser QWERTY).

La alternativa más popular de todas es la que desarrollaron August Dvorak y su cuñado William Dealey durante los años 30 (cuando empezaban a aparecer máquinas de escribir eléctricas), pero que nunca llegó a triunfar. Se marcaron como objetivo diseñar científicamente un teclado para disminuir los errores de mecanografía, aumentar la velocidad y rebajar la fatiga del mecanógrafo (llegaron a estudiar la fisiología de la mano además de mucha estadística de frecuencias de palabras).

Numerosos estudios entonces demostraron una mayor velocidad con teclados Dvorak (a día de hoy desprestigiados dado que los principales los dirigió su propio creado) e incluso llegaron a ganar varios campeonatos de mecanografía —por aquel entonces eran populares los concursos de velocidad de escritura—, pero todo fue en vano. Otros estudios más recientes concluyeron que no había diferencia de velocidad significativa entre mecanógrafos utilizando teclados QWERTY o Dvorak. A pesar de su poca difusión, cualquier sistema operativo moderno está preparado para trabajar con uno de estos teclados.

Entre las causas que se citan para el poco éxito destacan que apareció en mitad de la Gran Depresión y luego llegó la 2ª Guerra Mundial, que paró la producción de máquinas de escribir (guerra total); tampoco consiguió hacer que el público fuese consciente de su existencia. Sumando estos dos factores es difícil que consiguiese convencer a ningún fabricante para hacer un lote suficientemente grande que ayudase a generalizarlo.

Por supuesto el diseño de los teclados Dvorak está lleno de otras curiosidades, como que la inmensa mayoría de las palabras se escriben con la línea central del teclado (requiriendo menor movimiento de dedos), en un porcentaje muy superior a lso QWERTY, pero ya son otra historia.

Escribir palabras alternando las manos

Una de las muchas asignaturas pendientes que acarreo hace años es aprender algo de bash scripting, escribir programas de ejecución por lotes en sistemas GNU/Linux (el equivalente a los .bat de MS-DOS pero infinitamente más potentes). Así que últimamente me he animado a probar a hacer cosillas por practicar.

Uno de los comandos más útiles y completos con que cuentan los sistemas tipo unix es grep, un programa que busca en un archivo coincidencias con un patrón dado y las imprime por pantalla. El patrón no tiene por qué ser simplemente una palabra o un fragmento de la misma, la miga está en que también acepta expresiones regulares que, explicado de forma sencilla, son una manera lógica de expresar varias (o infinitas) cadenas de texto de forma reducida utilizando símbolos con ciertos significados. Es un mundo maravilloso una vez lo descubres y empiezas a comprender, así que si tienes interés visita el artículo de la wiki para saber más sobre el tema.

Esta semana estuve pensando cuántas palabras existirían en español que pudiesen escribirse alternando cada letra con una mano, escribiendo de forma correcta desde el punto de vista de la mecanografía. Por ejemplo: tutor, usual, blanco, airoso, soslaya, vividor, palenque, flamenco, ornamento, audiencia, antisocial, tormentoso, antiséptico, suboficial, digitiforme o ditirámbico. La palabra más larga en castellano que conozco es autosuficiencia, de 15 letras.

Hay que prestar especial atención a las palabras con tilde. El acento se escribe con la mano derecha, por lo que sólo son válidas las vocales de la mano izquierda, a y e.

¿Cuál es la expresión regular que nos ayudará a encontrar esto? Llamaremos izq las letras que se escriben con la mano izquierda izq={qwertasdfgzxcvb} y dch a las de la derecha, dch={yuiophjklñbnm}.

Para construir una expresión regular debemos ayudarnos de algunos símbolos con ciertos significados, por ejemplo el dólar $ representa el final de línea. Texto entre corchetes significa que todos los caracteres de su interior son válidos y hay que elegir uno de ellos. Un más (+) detrás de una expresión indica que hay que repetirla una o más veces (incluso infinitas). Por ejemplo, si tenemos [izq]+, las siguientes cadenas están representadas por esa expresión regular. ewt, qwezcvasdaq, dfgr… Hay algunas más como asterisco, interrogante, tubería o los paréntesis agrupan expresiones de forma general como en matemáticas. Si tenéis interés por internet hay cientos de páginas explicando estos detalles en profundidad. Una que me gusta especialmente es Regular-Expressions.

La primera aproximación sería decir:

^(([izq][dch])+|([dch][izq])+)$

Cualquier letra de la izquierda, seguida de otra de la derecha, una o más veces. O viceversa. Al envolverlo entre ^y $ indicamos que queremos que eso se cumpla para la palabra entera. Parece una buena aproximación, pero… ¡Sólo conseguimos palabras con número de letras par!

Para solucionarlo hay que pensar un poco… ¿Cómo se forman los impares? Pues cogiendo un par y añadiendo la unidad; y lo mismo haremos aquí. Tomamos la misma expresión que hemos utilizado antes y el añadimos una letra extra. La dejaremos como opcional utilizando el interrogante (elegir una o ninguna) y así no tenemos que escribir una expresión distinta para pares e impares.

^((([dch][izq])+[dch]?)|(([izq][dch])+[izq]?))$

Por ahora evitaremos los acentos, que complican las cosas. Tal y como está ya podemos empezar a buscar palabras ¿dónde? Pues toda distribución linux trae incorparada de serie un diccionario y se pueden instalar más. Bueno, más que diccionario es un listado de palabras que están en el diccionario, pero sin definiciones ni nada. En mi equipo están en la carpeta /usr/share/dict/ y tengo tres: spanish, british-english, y american-english, que contienen 86016, 98326 y 98569 entradas respectivamente.

Entonces, todo lo que tenemos que teclear en nuestro terminal es…

grep -E ‘^((([yuiophjklñnm][qwertasdfgzxcvb])+[yuiophjklñnm]?)|(([qwertasdfgzxcvb][yuiophjklñnm])+[qwertasdfgzxcvb]?))$’ /usr/share/dict/spanish

¡Pero cuidado! son más de mil palabras lo que escupirá esta expresión. Quizás queramos guardarlas en un archivo para leerlas con detenimiento (si al final de la expresión añades > nombreArchivo se guardarán en un fichero de texto). Otra maravilla que tienen los sistemas unix es la posibilidad de utilizar la salida de un comando como la entrada del siguiente utilizando el símbolo de la tubería (altgr 1) para separar ambos comandos. Así, si simplemente quieres contar cuántas salen, basta añadir al final del comando un simple | wc -l para que te lo indique. wc es un programa para contar palabras, pero con la opción -l cuenta líneas.

Y se pueden encadenar expresiones regulares sin parar. Poniendo al final | egrep ‘^.{5}$’ obtendremos todas las palabras de cinco letras. Y con | egrep ‘^.{10,}$ nos imprimirá solamente aquellas con 10 o más caracteres.

Por supuesto es un coñazo escribir la expresión regular cada vez que se quiera cambiar el conjunto de izquierda y derecha, por lo que he escrito un pequeño script en bash que nos genera la expresión regular y realiza la búsqueda automáticamente. Puedes verlo y descargarlo aquí. Con los dos primeros parámetros se indican ambos conjuntos; el tercer parámetro es opcional, y permite cambiar fácilmente de diccionario para comprobar esto mismo también en otros diccionarios. El cuarto argumento nos permite especificar que sólo se imprima la expresión regular en lugar de realizar la búsqueda. Si no se especifican al menos los dos primeros parámetros lanzará un mensaje explicando cómo ejecutarlo.

El tema de las tildes simplemente hace un poco más larga la expresión, pero se sigue basando en el mismo sistema. Habrá que tener en cuenta que el acento sólo puede ir después de una pulsación con la izquierda, y a continuación tendrá que ir una con la mano derecha. Y lo más importante: que no tiene por qué ocurrir siempre, por lo que ha de ser un parámetro opcional (usaremos el interrogante). Para facilitar la lectura la divido en dos lineas equivalentes, sólo que cada una representa un orden distinto. A lo mejor existe otra expresión regular más sencilla que lo simplifique, pero no se me ocurre.
‘^(([izq][áé]?)|(([izq][áé]?[dch])+|([izq][áé]?([dch][izq][áé]?)+))
|(([áé]?[dch])|([áé]?[dch][izq])+|([áé]?[dch]([izq][áé]?[dch])+)))$’

Al igual que antes, he escrito un script para que lo genere automáticamente y facilitar las pruebas con distintos conjuntos ver y descargar el script aquí. En este no preconfiguro diccionarios (los ingleses no tienen tildes después de todo), pero también puede cambiarse fácilmente a otro. Ejecutando el archivo sin suficientes parámetros mostrará la ayuda explicando esos detalles.

En el diccionario que tengo en mi equipo, que cuenta con 86 016 palabras, encuentro 1109, en la que la más larga es quelenquelen. Un amigo ha hecho pruebas con otro diccionario con algunas entradas más y obtiene 1307 (puedes ver la conversación aquí). He fusionado ambos archivos eliminando las repetidas y obtengo 1463 palabras que dejo aquí colgadas.

Una de las motivaciones que me han llevado a buscar esto era saber si se podría componer un texto que se pueda escribir alternando las manos ¿Alguien se atreve a escribir un texto utilizando únicamente este tipo de palabras?.

Nexos y palabras cortas que pueden ser útiles:

a, al, dos, e, el, él, en, ha, he, la, le, me, o, os, pro, que, se, si, su, sus, todo, tu, tus, u, vos, y, ya

Al estar la R, E y A en el mismo lado no aparecen verbos terminados en AR y ER, por lo que también he cogido palabras que cumplan la condición anterior, pero con esa terminación. No todas serán verbos, pero sí la mayoría. Este diccionario no tiene conjugaciones verbales, así que esto es una posible ayuda a todo aquel que se quiera atrever a escribir un texto, para facilitarle la búsqueda de las palabras apropiadas. Puedes consultar esta nueva lista aquí.

Ininite Scroll + Automatic Text Expander

Dos de los detalles en los que más me he esforzado y que más me gustan del nuevo diseño son que tenga scroll infinito, de modo que no hace falta clicar en página atrás para ver viejos posts (tanto en la página principal como en categorías), y que las entradas aparezcan contraídas con posibilidad de extenderse en el mismo lugar.

Activar el scroll infinito es muy fácil en WordPress utilizando el plugin Infinite Scroll, que funciona perfectamente y es sencillísimo de configurar. Únicamente hay que decirle bajo qué clases CSS están los posts y el link de navegación atrás. Nada más.

Por otro lado, para facilitar las cosas decidí que mostrar unos pocos párrafos sería lo ideal. Busqué y busqué, pero no fui capaz de encontrar nada que cortase los artículos con posibilidad de expandirlos. Creo que la única alternativa ahora mismo en WordPress es mandar que aprezca un extracto (the_excerpt()) en lugar de todo el contenido (the_content()), con el cuál eliges un número de caracteres que quieres que se muestren.

La función propia de wordpress parece ser bastante probre y hay muchos plugins mejorándola, evitando que corte palabras enteras, que corte etiquetas HTML, etc. Pero nada de esto hacía lo que yo quería, pues obliga al lector a abrir el post y cargar otra página (de lo cual algunos estarán encantadísimos porque les suma visitas; pero mi intención es que me lean, no hacerme pajas con las estadísticas de páginas visitadas).

De ese modo, terminé por bajarme Text Expander, un plugin que permite contraer ciertas partes de un post simplemente escribiendo entre corchetes EXPAND y /EXPAND rodeando al texto a ocultar. Parecía la solución… pero hubiera supuesto añadir a mano en cada una de todas las entradas del blog esas etiquetas, lo cual es una tarea titanica. Además de que si algún día decido cambiarlo supondría un esfuerzo equivalente.

Por eso terminé por empezar a cacharrear con el código del plugin para hacerme algo a la medida. Ahora, para cada entrada que se carga se cuentan los párrafos que tiene, y si son más de cinco, le digo que me añade el EXPAND entre el segundo y el tercero. En realidad no sólo tiene en cuenta párrafos, sino también listas, citas e imágenes. Parecía sencillo, pero la cosa se empezó a complicar cuando me di cuenta de que había que tener mucho cuidado con los párrafos dentro de un blockquote, o las sublistas dentro de listas (ul); de lo contrario, al perderse las etiquetas de cierre, se desestructuraba todo el blog. Creo que finalmente he sido capaz de solucionarlo, pero como puede haber alguna combinación que no haya tenido en cuenta os pediré que si en algún momento descubrís algún error me lo comuniquéis.

Otro problema que me costó identificar fue que las nuevas entradas obtenidas al deslizar la página hasta el final se cargaban expandidas, de modo que pensaba que no estaba aplicandose la conversión allí. Al final me di cuenta de que la contracción se aplicaba al cargar la página con una línea de Javascript, pero esto no funciona con las nuevas al estar ya “cerrada” la web. Afortunadamente Infinite Scroll incluye un apartado en su configuración que permite al usuario añadir código Javascript que se invoque una vez el nuevo contenido se carga, de modo que con tres o cuatro líneas solucioné el problema.

Creo que es algo bastante útil y que quizás más gente necesite algo así, de modo que he pensado que quizás podría darle un retoque y publicarlo como plug-in; aunque nunca lo he hecho así que no tengo ni idea de si es un proceso sencillo. ¿Alguien tiene experiencia en plugins de WordPress y puede darme un consejo?

Por cierto, pensé que sería interesante dejar la primera entrada de la página principal directamente extendida, pues al ser la última publicada será más probable que la gente entre a leer esa. ¿Os gusta así o la preferís contraída como el resto?

Phishing – ¿Sabías lo fácil que es hacer una página que robe tus datos?

Anoche unos amigos me comentaron sus infructuosos intentos por conseguir la contraseña del facebook de una amiga. Es una buena amiga, sólo lo quieren por diversión (para enviar solicitudes de amistad a usuarios filipinos) y para retarse a sí mismos. Sin pensarlo demasiado, les sugerí algo de phishing.

Entonces me dije ¿Por qué no intentar hacer mi propia página? (tranquilo, no hace nada malo, puedes acceder con datos falsos también) Es un tema interesante y, como todo, se aprende mucho cuando lo haces por ti mismo. Pensé que sería mucho más complicado, pero en una hora conseguí una página falsa de login que reenviaba usuario y contraseña a mi email, y redirigía a facebook.com. Todo sin saber apenas nada de PHP (lo poco de modificar alguna cosilla del blog), que he tenido que buscar hasta como concatenar cadenas. Y sin mirar ningún tipo de guía sobre cómo hacer una página de phishing. Una hora trabajando por mi cuenta.

Aunque mucha gente pueda saber lo que es el phishing, no se le da una importancia real porque todos pensamos que es mucho más complicado; sin embargo quiero demostrar aquí lo sencillísimo que es empezar a pescar datos, para concienciaros de que hay que tener un poco más de cuidado al introducir nuestras contraseñas en los links que seguimos. Lo he probado con éxito con algunos de mis amigos. Si no te interesan los detalles técnicos, sáltatelos y aprende a defenderte.

Gone Phishing Martha Stewart Chocolate Cupcakes

Primero – Enviar email con PHP

Supongamos que queremos recibir los datos que introduce el usuario por email. También se podrían ir almacenando en un fichero en nuestro servidor y luego consultarlo, pero para este caso me preferí utilizar el email. En PHP es sencillísimo, y en esta página explican todo. Con un fichero de seis líneas es suficiente, el primer ejemplo de todos.

Pero nosotros no queremos enviar siempre el mismo mensaje, queremos el usuario y contraseña, que en la página de login de facebook se envían como parámetros mediante POST bajo las variables email y pass. Así que escribimos:

$message = “Otro pardillo pone sus datos!:\n\n”. $_POST[“email”] . ” – ” . $_POST[“pass”];

En lugar de escribir en la misma página si el email fue enviado con éxito, lo que hacemos es redirigir a facebook.com (el usuario normalmente está ya logueado, por lo que no se dará cuenta de nada), por lo que escribimos al final del archivo:

header(“Location: http://www.facebook.com/”);

Completado. Luego podemos mejorarlo todo lo que queramos. Por ejemplo, mi fichero acepta un parámetro “newurl” que permite redirigir a cualquier otra web. Además, si el campo “pass” llega vacío, vuelve a la página anterior.

Finalmente, tenemos un fichero como este (haz clic para ver en tu navegador), listo para recibir los datos.

Segundo – Modificar login de Facebook

Ahora vamos al link de cualquier página de facebook sin estar logueados y nos saldrá la ventana de login y la guardamos como cualquier otra página.

Lo único que tenemos que hacer aquí, es buscar el formulario y cambiar la dirección a la que lo envía facebok, por la de nuestro fichero que envía emails, en mi caso action=”email.php”.

Y ya está. Ahora, subimos todo a un servidor, y cualquiera que acceda a nuestra página, verá una perfecta copia del login de Facebook, pero que nos enviará toda la información a nuestro email.

Tercero – Mejoras al login

Todo lo siguiente es un extra, con lo hecho hasta ahora ya es perfectamente funcional.

Por supuesto la página de login también puede mejorarse. Por ejemplo, personalizarla para cada víctima, haciendo que aparezca por defecto su email en la caja de texto. Esta información podemos pasarla con parámetros al enviarle nuestra dirección, de la forma:

http://loginfalso.php?name=fulanito&domain=gmail.com

Buscamos el input con id=email y añadimos la siguiente línea.

value=”<?php if($_GET[“name”]){echo ($_GET[“name”].”@”.$_GET[“domain”]);}?>”

También, puesto que el fichero email.php acepta un parámetro para cambiar la redirección, podemos configurarlo desde aquí, “http://loginfalso.php?name=fulanito&domain=gmail.com&newurl=www.otrapagina.com

cambiando el “action” del formulario por:

action=”<?php echo “email.php?newurl=”.$_GET[“newurl”]?>”

Desde luego, todo esto es muy descarado, así que se puede ofuscar añadiendo parámetros sin sentido, para hacer más larga la dirección. De hecho, el email se especifica en dos parámetros precisamente para esto. Se pueden poner todos los que se quieran y en cualquier orden.

Tampoco se va a fiar mucho alguien a quién le pases por chat un enlace a tu propio dominio, como tiendadeultramarinos.es, y cuando le salga el login de facebook le parecerá raro. Por eso, cuando alguien se toma en serio este tema, compra dominios con nombres parecidos al original. Por ejemplo, facebok, fecebook, facebooc, feisbuk.es… de modo que cuando entras al link no te fijas de que realmente es otra página.

Pero si alguna vez habéis copiado un vínculo desde Facebook, veréis que los envía a través de una página que redirige al vínculo. Algo como lo siguiente, envía a mi blog, pero cuando lo ves, parece que sea interno de Facebook.

https://www.facebook.com/l.php?u=http%3A%2F%2FDIRECCION&h=b70fc

https://www.facebook.com/l.php?u=http%3A%2F%2Fwww.tiendadeultramarinos.es&h=b70fc

Claro que, una vez accedido al link, la parte inicial de www.facebook.com desaparece: pero muchas veces el usuario no se fijará una vez esté dentro de la web, sólo en el momento de clicar el enlace.

Una última mejora sería bajarnos las páginas de login de distintos idiomas y modificarlas al gusto. Para gestionar todas sencillamente con la misma dirección, he creado un pequeño fichero PHP que redirige a las páginas de login de cada idioma en función de un parámetro lang. Más info y ejemplos de direcciones ofuscadas, en el fichero de redirección.

Cuarto – Lo mismo en Gmail

No os penséis que Google lo pone más difícil. He seguido el mismo proceso con idénticos resultados. Aquí la página falsa. Como no tenemos el truco de facebook de poner la dirección primero, tenemos que recurrir a otro modo para dar la sensación al ver el link de que es la página real de gmail. Esto lo explican muy bien en la wikipedia, y se hace sencillamente poniendo la dirección destino detrás de la arroba, así:

http://www.gmail.com@direccionfalsa

Finalmente – ¿Cómo me defiendo?

Como habéis visto es tremendamente sencillo hacer una página falsa para robar vuestras cuentas de acceso a cualquier servicio. Generalmente nadie se va a molestar en robaros la cuenta del Facebook, el objetivo real detrás del phishing es tener acceso a las cuentas de los bancos, así que es con lo que más cuidado hay que tener.

El principal consejo es, siempre, escribir vosotros mismos la dirección de la página en la que queréis loguearos. Nunca lo hagáis siguiendo vínculos. Primero iniciad sesión en una pestaña aparte, y luego volved al email y seguid el enlace que os han pasado, y si no es trampa no os pedirá que volváis a iniciar sesión.

La banca electrónica es segura, simplemente hay que ser cuidadoso a la hora de meter nuestros datos. Del mismo modo que no enviríais vuestra tarjeta de crédito con vuestro PIN en un sobre a una dirección desconocida, ni daríais vuestros datos a cualquiera que se presentase en casa o llamase por teléfono. En internet hay que seguir, exactamente, las mismas precauciones que en la vida real: sentido común.

El objetivo de la explicación en este post de cómo hacer la página es doble. Primero, llamar vuestra atención sobre el problema destacando la facilidad de crearlas. Segundo, entendiendo cómo puede atacaros vuestro “enemigo” tenéis más posibilidades de comprender cómo defenderos.

Para terminar, os dejo un par de guías en español para protegerse del phishing, más completas que las pinceladas que he dado yo: Vulneravility Team e  Internautas.

Filtro de spam en Gmail

Los que me conocieron en los primeros tiempos de gmail recordarán que escrutaba casi con obsesión la lista de spam, con la constante duda de que pudieran colarse mensajes reales. Tras comprobar la sobrada eficiencia del filtro, pasó de ser algo habitual a una breve comprobación cada largo periodo.

Hoy, sorprendido ante su reducido volumen (240 emails durante el último mes, cuando habitualmente superan el millar*) he decidido echarle un vistazo y he encontrado nada menos que cinco mensajes erróneamente clasificados como spam.

Además, durante los últimos meses se están colando en bandeja de entrada varios emails de spam procedentes de un par de amigos con cuentas “infectadas”. Está tan claro que son spam que no necesito ni abrirlos para darme cuenta de ello. Supongo que superan el filtro al estar en mi libreta de direcciones, por lo que acabo de eliminarlos de la misma, a ver si así dejan de llegar.

¿Soy solo yo, o alguien más ha notado una merma en la eficiencia del filtro de spam?

*No sé si las últimas semanas habrán desmontado alguna botnet de spam de esas que suponen un importante porcentaje del flujo mundial, pero me resulta muy extraño ver la cuarta parte de lo habitual.

Votar las elecciones en Facebook

No, el voto electrónico todavía no significa que las elecciones se harán en Facebook, pero poco le falta. Parece ser que una de las últimas actualizaciones de la red social (debe de ser relativamente reciente porque no he visto nada referenciado en blogs españoles) consiste en preguntar a todos los usuarios de un país en elecciones se han ido a votar.

Me parece curioso y extraño. ¿Triunfará? ¿Estará la gente dispuesta a reconocer que vota a esa panda de ladrones que son todos los políticos? En estos momentos, son las 12 del mediodía (la misma hora en Canarias) y 35 000 usuarios han confirmado su voto (entre ellos yo a pesar de no haber votado). ¿Eso son muchos o pocos?

Hay aproximadamente 4,5 millones de habitantes en la República de Irlanda. De los cuales 850 mil son menores de 14, por lo que digamos que hay 3,5 millones en edad de votar. Según RTE, a estas horas más o menos ha votado el 10% de la población, lo cual nos da 350 000 votos.

El año pasado había 1,6 millones de usuarios activos en Facebook Irlanda. Los menores de 18 suponen un 15% de los usuarios de USA, pero supondremos que el porcentaje es similar aquí. Eso nos deja un 85% de usuarios en edad de votar, es decir, 1,3 millones. Si ha votado el 10% de la ciudadanía, 130 000 de los usuarios de Facebook deberían haber votado.

130 000 está lejos de los 35 000 contabilizados hasta ahora. Pero pensemos que por la mañana sólo vota la gente mayor, con mucha menos presencia en Facebook, y que además es día laboral. También habrá votos falsos, como el mío o de media docena más de otros Erasmus que he visto que ya han pulsado votar.

No sé cómo terminará el día porque me voy a Dublín dentro de una hora, pero hasta el momento, suponiendo que sean votos reales, y que las cifras de mi estimación sean correctas, no me parece una diferencia tan grande con la realidad como había pensado en un principio.

¿Será lo siguiente preguntar a quién se ha votado o hacer encuestas de intención de voto? ¿Se harán los sondeos electorales el día de la votación en Facebook en lugar de a pie de urna? ¿Se terminarán haciendo las elecciones en Facebook?

Ya me contaréis en un mes o dos, cuando sean en España, si también aparece y qué acogida tiene.

Ideas para un autómata celular basado en genes

A raíz de un buzz que publiqué sobre El Juego de la Vida, un colega hizo que me entrara el gusanillo de programar mi propio autómata celular. Lo más difícil de hacer algo así no es la propia programación, sino desarrollar un buen modelo que sea consistente y que pueda dar lugar a cosas interesantes. En los momentos de aburrimiento de alguna asignatura, esta semana he ido dando un poco de forma a este mundo que me gustaría crear.

A diferencia del de Conway, estos autómatas se podrán desplazar. El escenario, en un principio, sería una cuadrícula normal y corriente, en la que cada celda está conectada con sus ocho vecinas, lo cual quiere decir que una célula podría desplazarse como el rey en una partida de ajedrez.

Las acciones se sucederán por turnos, al final de los cuales cada célula tiene que satisfacer un mínimo de energía, por lo que su objetivo es desplazarse por el mapa en busca de comida (que aparecerá al azar al inicio de cada turno). Podrán ir almacenando los excedentes por si en algún momento no encuentra comida, y porque además de ese mínimo, si adquiere un determinado nivel de “reservas”, podrá dividirse por mitosis en dos células iguales. En el momento de la división celular existirá un factor aleatorio de “malformaciones” que permitirá la variabilidad genética. Cada célula vivirá durante un número determinado de turnos, transcurridos los cuales morirá si no se ha reproducido.

Para localizar la comida utilizarán dos tipos de “sensores” a los que he llamado visión y olfato. La visión sólo funciona en la dirección hacia la que está mirando la célula, mientras que el olfato es omnidireccional. En la imagen superior, los puntos negros representan células, y línea blanca es la dirección en la que miran. A pesar de los colores, dudo que implemente una disminución en la calidad de la visión con la distancia, pero sí habrá algo como diferentes niveles permitiendo más alcance.

Otro de los genes determinará la velocidad, representando la cantidad de cuadrados que se puede desplazar en un tiempo dado. Sólo existirá el movimiento hacia delante (siendo delante cualquiera de los tres cuadrados adyacentes en su campo de visión) y el giro para mirar en otra dirección. Cada turno se dividirá en fases, probablemente cuatro, durante las cuales se sucederán las distintas acciones de las células. Si ven/huelen comida, se dirigirán a ella; en caso contrario girarán o se moverán aleatoriamente hasta encontrar algo. Para comer, basta con estar situados en la misma celda de la comida al finalizar cada fase.

En principio en cada fase la célula deberá decidir si moverse, girar, o quedarse a comer. Quizás en un futuro se podría implementar un sistema por puntos de movimiento en el que cada una de las acciones consuma distinto número y se puedan combinar. Al inicio de cada turno se descontará de la reserva la cantidad de comida que requiera la célula; si al final del turno la reserva es negativa, la célula morirá. Si es superior al umbral de reproducción, se dividirá. No hay problemas en que dos o más células se sitúen en la misma celda, pero si todas quieren comer, se dividiría el total equitativamente.

El juego básico de genes que he pensado son: visión, olfato, vida y velocidad, los cuales he explicado ya. Tengo alguno más en mente, que debería desarrollar más, como por ejemplo: reserva, capacidad de almacenar más recursos; hijos, pudiendo dividirse en más de dos células; ataque, quitando vida y evitando que una célula en la misma celda pueda se quede a comer.

Finalmente, cada tipo de genes tendrá varias versiones, siendo unos recesivos y otros dominantes. Esto implicará que las células tengan dos juegos distintos de genes, y sólo se hará efectivo uno de cada par. Aunque así se puedan complicar las cosas, esto permitirá que en los hijos de una célula determinada puedan reaparecer ciertas atributos  ocuridas en generaciones anteriores. Además, abre la puerta a una posible implementación futura en la que la reproducción se realice entre dos pares de células.

Los diferentes niveles de mejoría que proporcione cada gen, tendrán la contrapartida de que provocarán que la célula sufra un mayor consumo energético.

¿Alguna sugerencia, crítica o recomendación de mis lectores? Estoy abierto a cualquier idea puesto que para mí es todo un mundo que explorar.

Máximo número de aristas en digrafo de diametro D

Breve introducción o repaso

Un grafo es una estructura compuesta por nodos unidos por aristas (edges, en inglés). En teoría de grafos, se denomina grafo completo K_n a aquel que cada uno de sus n nodos tiene una conexión con cada uno de los otros n-1 nodos.

El número de aristas en estos grafos es siempre E(K_n) = \frac{n (n-1)}{2}, que coincide con la suma de enteros de 1 hasta n. Esto se ve claramente dibujando un K_n en una hoja de papel. Primero pones los n nodos, luego tomas cada uno y dibujas todas las aristas que lo unen con el resto, n-1. Cuando lo hagas con el siguiente sólo podrás pintar n-2, con el siguiente n-3, etc.

En un grafo normal, las aristas son bidireccionales, pero hoy vamos a trabajar los grafos dirigidos o digrafos, donde cada arista va acompañada de una flecha que indica la única dirección posible que se puede tomar. Así, el número de aristas en un digrafo dirigido será el doble que en el mismo normal, por lo que:

 E(k) = n^2 - n = n(n-1)

Para simplificar los siguientes dibujos (todos de digrafos), asumiremos que las aristas sin flecha son bidireccionales, valen por dos, y las dibujadas con flecha indicarán la única dirección posible. De ese modo, los dos siguientes grafos dirigidos son equivalentes.

El número de nodos que hay que atravesar para ir de uno a otro se llama distancia. Si medimos la distancia de cada nodo a todos los demás y tomamos el valor máximo, tenemos el diámetro del grafo. En un grafo completo, el diámetro siempre es 1. En el las imágenes de encima, el diámetro es 2.

¿Cuál es el número máximo de aristas que puede tener un digrafo de diámetro D?

A estos grafos les llamaremos K_n^d, donde n es el número de nodos y d el diámetro. Así K_6^3 es el grafo de diámetro 3 y 6 nodos con el mayor número de aristas posibles entre ellos. Además, utilizaremos la función E(G) para contar el número de aristas en el grafo G.

\exists i,j \in K_n^d\Rightarrow distance(i,j)

Voy a poner los ejemplos con K_5^d, pero para seguir mejor los resultados, estaría bien que antes de continuar cogieras papel y lápiz y tratases de solucionar los grafos con 3 y 4 nodos, que son muy sencillos: K_3^2, K_4^2 K_4^3

D=1, es el caso trivial, K_n^1 = K_n por lo que E(K_n^1)=n^2 - n.

Para K_n^2, simplemente tenemos que tomar K_n^1, y eliminar cualquier arista en una dirección, dejándola en la otra. En la siguiente imagen se puede ver que para ir de A a E hemos de pasar obligatoriamente por otro nodo, teniendo así el diametro igual a dos que necesitábamos. Así pues, E(K_n^2)=n^2 - n - 1.

La estrategia a partir de ahora es clara, “aislar” dos nodos de forma que en una dirección siempre sea necesario recorrer los suficientes como para justificar el diámetro. La otra dirección no hay que “cerrarla”, ya que únicamente hacen falta un par de nodos con distancia igual a diametro, y el resto son aristas extra que se suman a la cuenta.

Con K_5^2, hemos visto que los recorridos posibles para llegar de A a E eran pasando por B, C ó D, sin embargo ahora necesitamos un salto más. Para ello, “cerramos” todas las entradas a E, salvo por D. Ahora simplemente prohibimos a A moverse directamente a D, teniendo que ir a través de B ó C. Así, al total de aristas E(K_5^1) =  n^2 - n le hemos quitado cuatro, quedando: E(K_5^3) = 5^2 - 5 - 4 = 16. También podemos decir que a K_5^2 le quitamos tres aristas.

Repetimos el mismo proceso para K_5^4=, que es el último para cinco nodos y donde lo que finalmente hemos conseguido es que de A a E sólo se pueda ir por el camino ABCDE. Para ello simplemente hemos tenido que quitarle dos aristas a E(K_5^3) E(K_5^4)= 16 -2 = 14.

K_5^d termina aquí, pero si hacemos esto con grafos mayores veremos claramente un patrón que se repite: (los paréntesis no son necesarios, sólo para visualizarlo más claro).

 E(K_n^1) = n^2 - n
 E(K_n^2) = (n^2 - n)  -1
 E(K_n^3) = (n^2 - n) - (n - 2) -1 = n^2 - 2n + 1
 E(K_n^4) = (n^2 - n) - (n - 2) - (n - 3) - 1 = n^2 - 3n + 4
 E(K_n^5) = (n^2 - n) - (n - 2) - (n - 3) - (n -4) - 1 = n^2 - 4n + 8
 E(K_n^d) = E(K_n^{d-1}) - (n - ( d - 1))
 E(K_n^d) = n^2 - (d-1) \cdot n + \frac{d\cdot (d-1)}{2} -2

En realidad, K_n^1 es K_n y no se puede tratar con la misma ecuación genérica que el resto, por lo que K_n^d sólo funciona para d\ge2.

Por otro lado, el caso específico K_n^{n-1} se puede solucionar mediante otra aproximación, de igual forma para todos los grafos. Primero, sabemos que la solución constará de un único camino bidireccional que recorra todos los nodos (lo cual es además un camino hamiltoniano). Esto es 2(n-1). El número de aristas es n-1, que valen doble porque son bidireccionales. Veamos el ejemplo con cinco y seis nodos.

Ahora simplemente tenemos que rellenar los huecos del grafo con aristas en la dirección correcta. ¿Cuántas son? Pues fácil, el total de aristas de Kn menos n-1, que son las que acabamos de pintar.

 E(K_n) - (n-1) = \frac{n\cdot (n-1)}{2}-(n-1)

Lo cual, se lo sumamos a lo que ya teníamos y queda:

 E(K_n^{n-1}) = 2\cdot (n-1) +  \frac{n\cdot (n-1)}{2}-(n-1) = \frac{n^2+n-2}{2}

Si tomamos el caso general E(K_n^d) y sustituimos d=n-1, veremos que llegamos exactamente a la función E(K_n^{n-1}). Si bien dije previamente que K_n^d no funciona para d=1, esta nueva ecuación sí que respeta ese caso. Si despejamos n en E(K_n^1) = n^2 - n = \frac{n^2+n-2}{2} = E(K_n^{n-1}) sale una ecuación de segundo grado con raíces en 1 y 2; nos nos interesa la segunda puesto que estábamos considerando d=n-1 y demuestra que la igualdad es correcta. También es mucho más sencillo directamente sustituir n=2 en ambas fórmulas y ver que el resultado es el mismo, 2. El cual es exactamente el número de aristas en un digrafo de dos nodos y diámetro uno.

También podemos tomar valores específicos y comprobar que obtenemos el mismo resultado, por ejemplo:

 E(K_n^4) =  n^2 - 3n + 4
 E(K_5^4) = 5^2 - 3\cdot 5 + 4 = 25 - 15 + 4 =14
 E(K_n^{n-1}) = \frac{n^2+n-2}{2}
 E(K_5^{4}) = \frac{5^2+5-2}{2} = \frac{25 + 5 - 2}{2} = 14

¿Aplicaciones prácticas de este resultado?

En la asignatura Distributed System estamos estudiando algoritmos para seleccionar el nodo líder de una red, figura necesaria en muchas ocasiones para coordinar algoritmos distribuidos. Cada nodo tiene un identificador distinto del resto, así que la selección del líder se puede hacer bien con el que tenga el mayor ID o el que tenga el menor (para lo cual éste ha de pasar por todos los nodos).

Existen muy diversos algoritmos para comunicar el ID entre los participantes, difiriendo todos ellos en el número de rondas necesarias y de mensajes enviados. Es una asignatura a nivel teórico en la que tenemos que analizar la complejidad temporal y computacional (número de mensajes), distinguiendo mejor caso, peor, y comportamiento medio.

Un algoritmo muy simple es FloodMax, en el cual la complejidad es linear. Dura tantas rondas como el diámetro de la red, y en cada ronda cada nodo envía a todos sus vecinos el máximo valor ID que ha recibido hasta entonces. Así pues, el número de mensajes es simplemente el número de aristas por el diámetro.

Un par de clases después de esto, estaba lo suficientemente aburrido como para pensar en el peor caso de una red de tamaño N, para lo cual el primer paso era saber el máximo número de aristas posibles con cada diámetro existente.

Entonces, para saber el número de mensajes en una red de n nodos con diametro d, se hace msg = d \cdot E(K_n^d) y listo. He hecho un pequeño programita para calcular y mostrar estos valores (Graph.java y Graph.class). Ejecutando “java Graph -v N” imprime información detallada de cada diámetro, y con “java Graph N” escribe sólo los resultados para los cuales el número de mensajes es el mayor.

En realidad, la guinda del pastel sería resolver el problema de optimización para maximizar el valor msg = d \cdot E(K_n^d) \quad \forall d, 1 \le d < n[/latex] pero hasta ahí ya no llego. Consulté ayer a un amigo matemático que finalmente demostró que el máximo valor es siempre en [latex]E(K_n^{n-1})[/latex] y pese a que me indicó algunos de los pasos, no he sido capaz de reproducirlos. Si alguien se anima, [latex]\LaTeX[/latex] está activado también en los comentarios, utilizando $ latex fórmula $ , sin espacio entre “$” y “latex“.