martes, 19 de enero de 2010

GetTempFileName y Trust Levels


No hace mucho tuvimos que lidiar con los problemas de ciertas librerías de .Net cuando trabajan en niveles de seguridad restringidos en un servidor de alojamiento compartido, concretamente uno de ellos fue el método System.IO.Path.GetTempFileName() que devuelve un fichero temporal único que puede ser utilizado para tareas varias.

Pues bien, en un alojamiento compartido dónde no disponemos de un Trust Level el método anterior provoca una excepción de seguridad y no puede ser utilizado.

En nuestro caso este método lo utilizábamos para generar un xml provisional en disco que posteriormente era transformado mediante XSLT en un fichero .fo listo para ser impreso con el Apache FOP (recompilado a .Net en nuestro caso, y que también provoca problemas de seguridad en estos niveles, pero eso lo veremos otro día).

El problema, una aplicación Web puede generar gran cantidad de peticiones, por lo que de algún modo se debe asegurar que todas ellas obtendrán un fichero temporal con un identificador único.

Una solución pasaba por almacenar en BBDD un identificador que se actualizase bajo transacción en cada petición, pero no podía ser que necesitaramos una BBDD para esto, podría ser en ciertos casos que no la tuviésemos disponible.

Pensando se nos ocurrieron dos ideas para generar identificadores de fichero únicos, una utilizar algún método que nos devuelva un GUID, que seguro que .Net lo tiene, pero como no lo recordábamos y no nos apetecía abrir Google, pensamos en la segunda opción, que es utilizar el número de Ticks del timer, es decir, el contador de tiempo desde el comienzo de los tiempos (o desde alguna fecha fija en el pasado que no alcanzo a recordad), pero que en cualquier caso es único ya que como todos bien sabemos, pese a nuestro pesar, el tiempo siempre va hacia delante.

Pues ahora quedaba efectuar los cambios. En primer lugar, crear un método GetTempFileName() tal que retorne un String con el contenido de DateTime.Now.Ticks.ToString(), y segunda quitar las referencias a System.IO.Path, de manera que el cambio sea lo menos traumático posible para el código (y el programador).

Espero os sea de ayuda, no nos costó mucho pensarlo, pero las piernas nos temblaron inicialmente al ver la excepción de seguridad. Como siempre, con un poco de ingenio e intuición, todo sale.

domingo, 17 de enero de 2010

Homenaje al talento y la perseverancia


Léase como la introducción del "Alone in the dark" (para los que sean de la quinta...)

Sábado 17 de Enero de 2010, se prevé un largo y duro día de trabajo con el objetivo de reprogramar unos nuevos dispositivos de seguimiento de vehículos para que hagan todo tipo de tareas de autotesteo que luego comentaremos.

Son apenas las 8 de la mañana (en realidad las 12) cuando reunimos el trabajo realizado por nuestro primer homenajeado y merecedor de los créditos, Javier Pérez, quién se ha encargado de "destripar" las entrañas de los dispositivos (literalmente, a uno de ellos se le cae hasta la tarjeta) y de leerse las casi 1.000 páginas de los manuales del mismo, el conjunto de comandos AT permitidos y un manual de aprendizaje rápido de Java para dispositivos móviles (gran mérito contando que viene del mundo .Net).


La primera tarea es configurar todo el entorno de trabajo, lo que incluye configurar por un lado una máquina con puerto COM y puerto USB para la conexión del dispositivo:






Por otro lado, configurar un equipo con el entorno de desarrollo Java (Eclipse y todos los plugins necesarios para la programación del dispositivo):




Y por último configurar un entorno con el GIS de seguimiento y un cliente FTP para actualizar los cambios al servidor.

Tarea árdua y costosa que hace que las horas vayan pasando sin remedio. Decidimos hacer una parada a media tarde y efectuar unas pruebas. Damos una vuelta de 15 KM por la ciudad y comprobamos con el móvil en la dirección de Twitter dónde volcamos la ruta que todo funciona correctamente (http://twitter.com/corex_whereis) lo que nos da fuerzas para continuar. Bueno, eso y la gran cena que nos preparamos:




Pero comprendemos que todavía nos queda mucho trabajo que hacer y decidimos pedir ayuda (sábado por la noche, Valencia, fiesta, copas, chicas..., ¿nos querrán ayudar?):

- SMS Kico: Iván, cena friqui en mi casa, dispositivo, Javi y yo, necesitamos ayuda, te apuntas?
- SMS Iván: Tengo que llevar algo a parte de una botella de vino? Valencia o Alaquàs?

Dios nos cría y nosotros nos juntamos...


Iván Martínez, segundo homenajeado, el Maquiavelo de los ordenadores, se dedica a meterle el destornillador por todos los sitios imaginables a un servidor que no se quiere encender... Dios se apiade de él (del ordenador)




Algo más de las 3 de la madrugada, lo hemos conseguido, bueno, casi todo, aún no hemos conseguido programar el dispositivo en .Net, pero lo conseguiremos...

El dispositivo envía sus coordenadas a Where Is, y a Twitter, conecta con la API de Google y obtiene la dirección de policía para las coordenadas, responde a llamadas telefónicas, y a SMSs, es capaz de autochequearse, si le preguntas GPS te devuelve coordenadas, si le preguntas GPRS te devuelve el estado de conectividad, si le solicitas TEST te devuelve una serie de indicadores, y si le preguntas WHEREIS, te devuelve su dirección postal (casi, salvo un pequeño casque de Java que a estas horas no se nos ocurre...).

Cansados, exhaustos, pero felices, sólo hay que vernos las caras (sobre todo la de Iván, sea el cansancio, sea el sueño, sea el vino, le costaba mantener los ojos abiertos)...





Sábado por la noche, para unos noche de fiesta, para otros de trabajo duro, para nosotros, el placer del trabajo bien hecho y la buena compañía. Para Corex, el orgullo de contar con gente como esta.



TALENTO Y PERSEVERANCIA debe ser HOMENAJEADO.


miércoles, 13 de enero de 2010

Detección automática de plagio en texto, una breve reseña

Mi tesis de Máster se titula "Detección automática de plagio en texto". Esta tesis, que dirigió Paolo Rosso, fue presentada en el Máster en Inteligencia Artificial, Reconocimiento de Formas e Imagen Digital de la Universidad Politécnica de Valencia en diciembre de 2008.

Como se ha mencionado antes en este blog, la tesis ha sido acreedora del premio MAVIR a la mejor tesis de Máster en "Tecnologías de la Lengua" y "Comunicación científica a través de la web" en su edición 2009. A continuación un muy breve resúmen de nuestra investigación.

Cuando hablamos de texto (no olvidemos que existe plagio de imágenes, videos y sonido, entre muchas otras cosas), plagiar significa incluir en un documento fragmentos de texto escritos por alguna otra persona sin darle el crédito adecuado. Esta falta ha mostrado en los últimos años una explosión en el número de casos. La razón es sencilla: hoy en día tenemos acceso a un enorme repositorio de información entre páginas especializadas, bibliotecas digitales y enciclopedias digitales como Wikipedia. Ante esta pandemia de recursos, el plagio se vuelve una operación muy sencilla que, en el peor de los casos, implica una simple operación de "copy-paste". Por ello, el desarrollo de métodos que faciliten la detección de plagio cobra relevancia.

El principal problema en esta tarea es que la fuente de un plagio puede estar perdida entre un sinnúmero de documentos ubicados en repositorios tan grandes como la misma Web. Mientras en la recuperación de información "tradicional" el problema es a menudo recuperar un conjunto de documentos relevantes para una necesidad de información, en el caso de la detección de plagio es necesario ir más allá: hay que recuperar los textos que fueron utilizados para generar el documento analizado.

Así, es necesario llevar a cabo comparaciones exhaustivas entre documentos para determinar si nos enfrentamos a un caso de plagio o no. Si bien realizar dicha comparación ya es complicado, lo es aún más cuando el plagio ha implicado alguna modificación. Por ejemplo, consideremos las siguientes frases: (1) plagiar es reusar el texto de un autor sin darle crédito; (2) plagiar es reusar texto de otro autor sin citarlo. Si nuestro método realiza una comparación rígida, estas sentencias no serían consideradas un caso de plagio. Sin embargo, una comparación flexible nos lleva a observar que los fragmentos "plagiar es reusar", "texto de" y "autor sin" ocurren en ambas sentencias, lo cual no es común entre textos que no están relacionados. Además, las frases "sin darle crédito" y "sin citarlo" están altamente relacionadas semánticamente.

Hemos aplicado, basados en las propuestas de Lyon y otros investigadores, un enfoque de comparación de texto codificado en forma de n-gramas. Codificar un texto en n-gramas implica extraer de él fragmentos traslapados de palabras de longitud n. Así, los 2-gramas de "esto es un ejemplo" son "esto es", "es un" y "un ejemplo". Experimentalmente se ha observado que dos documentos, aún cuando han sido producidos por el mismo autor y sobre el mismo tema, suelen tener una baja concentración de n-gramas en común, por lo que encontrar varios en dos documentos presumiblemente independientes, lleva a sospechar sobre un reuso de información y sin el crédito adecuado, un caso de plagio.

Sin embargo, este tipo de comparaciones entre textos es computacionalmene costosa y en ocasiones entrega resultados con mucho ruido (falsas sospechas de plagio). Por ello, hemos propuesto un método para, dado un documento sospechoso, recuperar buenos candidatos a ser fuente de sus posibles plagios. El método, basado en la selección de palabras relevantes para el documento sospechoso y su búsqueda en el conjunto de potenciales fuentes, ha demostrado no sólo acelerar el proceso sino, lo que es más importante, mejorar la salida obtenida.

En la actualidad existe bastante investigación a este respecto e incluso hay disponibles diversas herramientas on-line que
buscan casos de plagio en un documento (por ejemplo, Turnitin). Sin embargo, hay un grave problema que recientemente ha llamado la atención de los investigadores en el tema: el plagio translingüe.

Para comprender este tipo de plagio, consideremos un sencillo ejemplo. Un estudiante debe entregar un reporte sobre Guillermo Marconi y para ello busca el artículo correspondiente en Wikipedia. Como el artículo en castellano es demasiado corto para la extensión que le ha sido requerida, decide ir a la versión en inglés. Toma los fragmentos que requiere, los traduce con un traductor on-line y los incluye en su reporte (¡he tenido oportunidad de ver reportes de alumnos en los que ni siquiera los hiperenlaces son eliminados!).

En el plagio translingüe la relación sintáctica entre las palabras de la fuente y el plagio se debilita (peor aún cuando las lenguas implicadas no comparten el mismo alfabeto) y los métodos diseñados para analizar documentos escritos en una sola lengua no son capaces de detectarlo.

Durante este trabajo hemos sentado bases para la detección de plagio translingüe. Nuestro método se basa en diccionarios estadísticos bilingües y los modelos de traducción desarrollados en los años 90 en IBM. En estos mismos modelos se basan traductores automáticos de vanguardia como el de Google.

En el año 2009 hemos organizado la Primera Competición Internacional de Detección Plagio. Por primera vez, investigadores de todo el mundo pudieron comparar sus métodos de detección sobre un conjunto importante de casos de plagio simulado (no olvidemos que el plagio representa una falta ética y que, por ello, encontrar casos reales que se puedan proveer al mundo es muy difícil).

La tesis así como varios de los artículos que hemos publicado sobre el tema pueden encontrarse en mi página personal. Además, el video con la presentación dentro de las jornadas MAVIR, celebradas hace dos meses, puede verse en el Canal UNED. Por otro lado, varios de los recursos que hemos generado se encuentran en la sección de descargas de nuestro grupo.

Actualmente estamos organizando la segunda competición, a la que además de detección de plagio hemos agregado otra tarea: la detección automática de vandalismo en Wikipedia.


Agradezco la invitación de Corex de escribir estas líneas.

Alberto Barrón.