A blog about data, information and Tech by Mario Alberich

        

may. 31
2007

Trabajando con subversion y awk


Para los impacientes: resultado final

Empezando por el final, las instrucciones a realizar son:

$ svn log -v -r 400:`svn info | grep Revisión | awk '{print $1}'` | grep dirprj | awk '{print $1}' | sort | uniq | awk '{print "."$0}' > dirprj-`svn info | grep Revisión | awk '{print $1}'`.txt

y luego....

$ tar -zcvf dirprj-`svn info | grep Revisión | awk '{print $1}'`.tar.gz -T -`svn info | grep Revisión | awk '{print $1}'`.txt

Traducido al verbo humano, el proceso es como sigue:

  • Selección de los archivos
    • Lístame los cambios del repositorio desde la revisión 400 hasta la última versión.
    • Del resultado, selecciona sólo lo que incluya la cadena dirprj. [grep dirprj]
    • De los datos seleccionados, selecciona la segunda palabra de cada línea. [awk print $1]
    • Ordena alfabéticamente los datos resultantes (sort).
    • Elimina los datos repetidos [uniq]
    • A las rutas recuperadas les pones un punto delante y los guardas en el archivo con nombre "dirprj-[ultimarevision].txt"
  • Segunda parte: Compresión
    • Comprime en formato tar y gzip los archivos que aparecen listados en el archivo dirprj-[ultimaversion].txt. y lo guardas en el archivo llamado dirprj-[ultimaversion].tar.gz

Ahora, por partes

Así, a palo seco, la instrucción de consola es un poco bestia. Voy desglosando instrucciones para sacar conclusiones:


svn log

svn log es una llamada que se realiza sobre subversion para saber la actividad que ha tenido el repositorio. Al aplicar la opción -v, lo que conseguimos es que nos muestre los archivos alterados para cada actualización.

Si sacáramos todo el log quizá nos pasamos 10 minutos viendo pasar listas de archivos modificados, con lo que lo mejor es establecer un margen de revisiones. Para especificar un número de revisiones se utiliza la opción -r, que tiene la forma:

-r a:b, donde a es la revisión más antigua y b la más actual. En nuestro caso, nos interesa que b sea la última revisión realizada. Para no tener que estar cambiando continuamente el valor, ejecutamos la instrucción:

svn info | grep Revisión | awk '{print $1}'

Para ir más rápido, utilizo directamente las salidas `entrecomillando las instrucciones`. Eso sustituye el la instrucción entrecomillada por el valor devuelto.


Seleccionando los archivos que nos interesan

La instrucción grep que se muestra a continuación es una cuestión de estilo. El caso sirve para los repositorios que almacenan más de un proyecto, como es mi caso. Eso permite que los subdirectorios identifiquen los proyectos relacionados. Este punto es el más adaptable a cada caso, como expone el propio manual de subversion en cuanto a estilos de gestión de repositorios se refiere. Para el caso, la instrucción:

grep nos devuelve sólo los archivos que tienen en su path el nombre indicado. La desambigüación no está de más para estos casos.


Eliminando ruido e información innecesaria

Los listados de log del subversion están bastante, maquetados, por decirlo de algún modo. Al menos la versión por defecto encuadra los resultados con guiones u otros caracteres. Además, para cada archivo indica qué tipo de modificación se ha realizado. Eso aclara la visualización pero entorpece el proceso de cañerías.

Para eliminar ese ruido, ejecuto awk:

$ ... | awk '{print $1}' | ...

Esto hace que de todos los resultados retornados por grep, me coja "la segunda palabra", es decir, la secuencia de caracteres posterior al primer conjunto de espacios. Esto lo que devuelve en definitiva es la ruta del archivo.

Dado que es probable que hayan habido varias alteraciones de un mismo archivo, decido ordenar los resultados (sort) y luego eliminar de la lista ordenada los valores repetidos. Cambiar el orden de estas dos instrucciones no da buenos resultados, porque uniq sólo mira si la fila actual es igual que la anterior.


Relativizando rutas y guardando datos

Dado que el repositorio no tendrá un path completo, la última instrucción le añade un punto (.) al principio de toda la cadena, para dar a entender que se refiere a un path relativo al path actual (en awk, el valor de $0 equivale a toda la cadena).

¿Por qué?

Pues porque svn me devuelve "paths absolutos" respecto la raíz del repositorio, pero cuando trabajo directamente sobre la raíz de mi sistema operativo, esas rutas no son correctas. Es importante tener claro en cada momento el contexto de ejecución, y especialmente cuando trabajamos con pipes.

Almacenamos la lista de rutas limpitas y preparadas para la exportación en un archivo de texto, que para el caso hemos denominado combinando el nombre del directorio del proyecto y el número de revisión, así no hay que estar pendientes de grandes fiascos...


Golpe de gracia: compresión con Tar

Para acabar, llamaremos al programa tar, utilizando la opción -T, que nos permite seleccionar de un archivo la lista de recursos a empaquetar. Así pues, ejecutamos la instrucción comentada antes:

$ tar -zcvf dirprj-`svn info | grep Revisión | awk '{print $1}'`.tar.gz -T -`svn info | grep Revisión | awk '{print $1}'`.txt

Como antes, el entrecomillado de svn info nos devuelve un valor. Por eso, es importante entender que lo que acaba recibiendo el ordenador (suponiendo que dirprj=proyecto1 y que la última revisión sea 425) es algo así como:

$ tar -zcvf proyecto1-425.tar.gz -T proyecto1-425.txt


Mejoras, temas pendientes y Further research

Por lo menos detecto las siguientes mejoras posibles:

  • Subversion indica el tipo de modificación que se ha realizado sobre un archivo. Actualmente no se ha realizado el control sobre lo que pasa con el archivo en cuestión, por lo que quizá estemos tratando de empaquetar un archivo que ya no existe. No obstante, ese no era el problema principal, y por eso lo dejo como caso a desarrollar.
  • el "grep Revisión" es ciertamente mejorable, por ejemplo comprobando si se puede hacer con un tail -n1 -c5 | awk '{print $1}', que nos daría el mismo resultado. Sólo que la versión de subversion fuera en inglés, ya no valdría lo anterior, aunque es fácilmente adaptable.
  • El ejemplo anterior se podría desarrollar en un archivo bash para hacerlo más sencillo, y parametrizable.

Si quieres saber más...

Puedes seguir investigando sobre los anteriores comandos en los enlaces comentados anteriormente. Te recomiendo awk (puedes empezar por algunos ejemplos de awk), ese gran olvidado que yo conocí a fondo estudiando procesamiento del lenguaje natural, cuando para procesar un corpus y categorizar los términos utilizamos esta herramienta. Ahora ya forma parte de mi vida laboral :-D.

Read more »

may. 30
2007

Web 2.0 y profesionales de la información (I): Software social


Una fábula sin moraleja


(Disclaimer: los personajes y situaciones aquí comentados son pura fantasía. Si te identificas con ellos puede que te interese el comentario posterior, pero recuerda que no me he inspirado en ti).

Ana


Ana trabaja en una biblioteca pública donde combina las tareas de catalogación de la mañana con las de atención al público durante la tarde.

Le gusta su trabajo y, a diferencia de algunas de sus compañeras y compañeros de trabajo, le atrae Internet y las posibilidaes que ofrece la tecnología. Le interesa lo que sucede en la denominada web 2.0.

A pesar de ello, desconoce el significado de la mayoría de tecnicismos, y hasta la fecha sólo ha tenido tiempo de profundizar en los temas más cercanos a su profesión: los buscadores, herramientas de tagging, agregadores de contenidos, y gestores de referencias y favoritos.

En los últimos dos años, algunos de los usuarios de la biblioteca que buscan información han preguntado sobre formas de buscar información en estos sitios. Algunos estudiantes de secundaria, por ejemplo, buscan fotografías en Flickr para sus trabajos de ciencias naturales, otros buscan música con licencia Creative Commons, y otros tantos buscan información que sería fácilmente localizable mediante un buscador generalista o en una herramienta de tagging.

Ante tales preguntas, lo que para ella resulta algo complejo por su falta de dominio, para sus colegas resulta prácticamente aterrador. Más de uno reconoce que no conoce Flick, y además sigue teniendo respeto a utilizar el ordenador.

Ante la perspectiva, Ana empieza a investigar algunos de estos servicios. Decide comentarle una idea a la directora de la bibliotec: ¿Qué le parecería si difundieran la actividad de la biblioteca a través de Internet, utilizando otros servicios ajenos al sitio web institucional?

Las últimas estadísticas habían demostrado que el número de altas de nuevos usuarios se había estancado, a pesar que la directora defendía la postura de aumentar esa cantidad para aumentar el número de préstamos y así solicitar un aumento del presupuesto de adquisiciones. Ante esta perspectiva, la directora pensó que no estaría de más tratar difundir la actividad del centro. Dio luz verde a la idea, aunque solicitó que se le fuera informando de los pasos realizados.

espués de recibir una respuesta afirmativa, abre una cuenta en Flickr, otra en del.icio.us (alguien le habla de connotea y también lo prueba). Se da de alta en Youtube, echa un vistazo a las Google Apps que tiene con su cuenta de Google Mail, abre un blog en Wordpress (que evidentemente tratará de evaluar con Google Analytics) y también se da de alta como usuario en Wikipedia en castellano. Al final de la campaña de altas, ha abierto una cuenta en ocho servicios.

El primer problema de Ana es la gestión de las cuentas y contraseñas. Ha puesto la misma contraseña en todos lados, pero en algunos lados la cuenta de usuario ya estaba alojada, se da cuenta de la dispersión digital que le supone guardar esto. Además, guardar usuarios y contraseñas no es muy adecuado, ¿Verdad?

Para ubicarse un poco, recopila información que tiene disponible en la red local de la biblioteca. Básicamente se refiere a actos y cursos que se han realizado en la biblioteca durante el último trimestre. Encuentra información sobre el total de asistentes, y alguna que otra fotografía de grupo.

Con esta información ya tiene para empezar. Realiza media docena de entradas en el blog y cuelga unas cuantas fotos en Flickr. Realiza una selección de estas fotos teniendo en cuenta la calidad, las emociones que transmiten, y el hecho que no se distingan demasiado las caras de personas ajenas a la biblioteca.

Después de realizar esta tarea, busca ganar visibilidad solicitando al webmaster de su página web que enlace el blog y el espacio de Flickr. El resto de servicios ya se irán activando con el tiempo...

...Y pasan seis meses


A las 11 de la mañana entra por la puerta la directora de la biblioteca. Es un momento calmado de la mañana y por eso se oyen sus pasos prácticamente desde el momento que traspasa el umbral de la puerta. Sin que se dé cuenta, Ana la tiene enfrente:

- Qué tal, Ana? ¿Cómo va la promoción de la web?

- Bien... Bueno, ejem -Ana trata de recordar los cuatros datos básicos que sacarían del apuro- tenemos entre 30 y 80 visitas diarias al Blog, 250 enlaces externos que apuntan a él, unas 50 fotos de cursos, dos vídeos, y... creo que 30 enlaces a nuestras guías de lectura.

- Hoy he tenido una reunión a la que ha asistido el webmaster. Me ha comentado que tenemos que aumentar no sé qué del tráfico de la banda del servidor. ¿Tú sabes algo de esto?

- Mmm... no, no tengo datos sobre las estadísticas del servidor. ¿Es un problema eso?

- Lo sería si no fuera que al resto de directores les ha entrado algo de envidia, especialmente cuando Joaquín (el webmaster) ha comentado que era la web de biblioteca pública más visitada "y de largo"... Me han preguntado cómo lo he hecho. Suerte que el Webmaster ha hablado de los referers, creo que es algo así como las citas bibliográficas, verdad?

- Sí, son los enlaces que hay en otros sitios y que la gente utiliza para acceder a nuestra web.

- Ya, entiendo... Y por qué nos enlaza la gente?

- No he tenido tiempo de entrar a fondo, pero en general han gustado las guías de lectura, y también el espacio de fotos. Lo segundo normalmente es de gente que tiene Blog y nos enlaza porque sale en una foto.

- De acuerdo... -La directora ponía cara de apuros, pero Ana lo tenía claro: con la curiosidad que tiene, lo que hoy está fagocitando la semana que viene y lo habrá aprendido-. Y eso del Pagerank? Porque dice que tenemos un 4 sobre 10.

- Vaaaya! -Ana se sorprendió: era algo en lo que no había reparado-.

- ¿Eso es mucho o poco?

- Bueno, para el tiempo que le hemos dedicado y lo competitivo que está el tema... la verdad es que no está nada mal!

La conversación decayó y la directora fue interrumpida por un colega de Ana. Poco después la directora se dirigió al despacho y Ana intentó recopilar toda la información que pudiera sobre el resultado de su actividad socializadora de la biblioteca.

Lógicamente esa información era importante para justificar el tiempo invertido. Contando mentalmente,
Ana consideraba que había invertido unas tres horas semanales en los servicios de las webs. A razón de unas 26 semanas laborables durante estos últimos meses, eso equivalía a... 78 horas? Tampoco era mucho...

Pero la directora no buscaba la justificación de las horas: no aún por lo menos. Había recibido unas cuantas informaciones que le daban por pensar que aquello quizá mereciera la pena:

  • La información del webmaster.
  • La sorpresa del resto de directores. Aunque sólo fuera por curiosidad, el hecho que el sitio web fuera visitado generó una especie de necesidad no cubierta: ganar visibilidad en el entorno web.
  • El hecho que usuarios de la biblioteca estuvieran enlazando el sitio web y el blog desde sus webs personales. ¿Acaso no es eso una forma de recomendar la web?
  • Algunos usuarios se habían acercado a mesa de información para pedir ayuda de cara a crear una cuenta en alguno de los sitios que Ana utilizaba. Al final, la propia Ana había creado un pequeño tutorial que colgó en el sitio de la biblioteca, y que ella enlazó en el blog.


La apuesta estaba clara: daba un alto grado de libertad a Ana para que, durante una tercera parte de su jornada laboral, llevara a cabo los siguientes objetivos:

  • Promocionar y dar visibilidad al sitio web con la misma filosofía que hasta ahora: proximidad y reconocimiento.
  • Desarrollar cursos para el uso del denominado software social. El curso sería inicialmente impartido al resto de trabajadores del centro.
  • Preparar documentación y redactar una ponencia que la directora apoyaría en los siguientes congresos sobre bibliotecas públicas.
  • Responder periódicamente a dudas de la propia directora, con el objetivo de identificar las posibles mejoras del servicio.

Objetivos sobre la mesa


Pocas palabras le quedaban a Ana ante la situación. Tenía delante suyo un horizonte no identificado. Arrojada a un entorno que aún no conocía pero con el que disfrutaba, empezó a buscar información y recursos sobre cómo llevar a cabo esos objetivos...

¿Y tú, cómo los continuarías?

Me comprometo a continuar la historia, con pena o gloria (es que rimaba...), aunque estaría bien conocer alguna opinión...

Read more »

may. 26
2007

Utilizando Yahoo! Pipes

Lo primero que gusta del espacio reservado es que el entorno de diseño es muy parecido a un entorno visual de trabajo en entorno escritorio, aunque la velocidad se nota. Esta es quizá la única característica que no me ha gustado, aunque eso no es una cuestión de desarrollo del entorno, sino sobre el debate de si la proxima generación de aplicaciones en red se desarrollarán en el navegador con lenguajes de script o fuera de éste.

Volviendo al tema, empiezo a trastear en las opciones que aparecen en la columna izquierda del entorno de diseño. Para empezar, decido seleccionar la mayoría de mis feeds.

Dentro de mis fuentes decido hacer tres grandes diferenciaciones según el comportamiento de tales recursos:

  • Fuentes que tienen poca producción de contenidos pero que acostumbran a ser de gran calidad.
  • Fuentes que no tienen un control directo de nadie y que tienen una producción relativamente baja, con algún riesgo de spam. Estas fuentes son principalmente Archivos de sindicación de tags de del.icio.us
  • Fuentes que tienen un alto volumen de producción y que presentan problemas de ruido, especialmente porque incluyen contenidos de muchas áreas.

El principal interés de la tercera tipología (que básicamente viene representada por digg.com y meneame.net) es que acostumbran a ser sitios en los que las nuevas noticias suben muy rápidamente.

Empezando por el final, éste es un pantallazo de lo que ha acabado siendo mi tubería:

Muestra de Yahoo! Pipes

El proceso ha pasado por:

  • Poner cada una de las tres categorías de feed en un widget Fetch Feed. Eso se puede hacer facilmente clicando sobre el botón con signo "+" que hay en la parte superior izquierda del widget.
  • Para los casos de digg.com y meneame.net, cada uno va en un elemento Fetch Feed.
  • Para el caso de digg.com he dirigido las noticias a un filtro para que me elimine todas las entradas que coincidan con al menos una de las siguientes condiciones (el objetivo es descartar noticias sobre consolas y juegos):
    • Se ajuste a la expresión regular "game.*" (Es decir, todo lo relacionado con juegos).
    • Se ajuste a la expresión regular "Wii|PS3|PS2|Xbox".
  • Para el caso de meneame.net, el caso es un poco diferente. Será por proximidad pero lo cierto es que el efecto ruido de su feed es bastante más moderado. En cambio, las noticias sobre política y especialmente en relación a noticias del periódico "El mundo" (no me refiero a las noticas que lleve el diario, sino a las noticas que hablan Sobre el diario) me agobian (no las leo). En este sentido, pongo los siguientes criterios de bloqueo:
    • Eliminar toda noticia que incluya los términos PP, PSOE, Aznar, Zapatero o Rajoy
    • Eliminar la noticia que incluya la expresión "el mundo".

Soy consciente que lo último es crítico, pero cabe pensar que si se está hablando del mundo en cuanto globo terráqueo y no del diario, aparecerá algo en Digg o en otras partes. Eso es una especulación pero de momento lo dejo ahí.

Una vez definido el proceso de filtro he filtrado para que elimine las noticias repetidas, y también que me lo ordene por fecha. Esto último me parece interesante para poder ver con calma la evolución de las noticias: dado que se recogen todos en un mismo momento, queda claro dónde ha aparecido en primera instancia la novedad.

Como resultado final, comentar que el archivo RSS devuelve más de 400 resultados. Para ser un primer intento no está mal, porque de hecho se está recogiendo información de más de 30 fuentes, dos de las cuales muy intensivas.

Como mejora, comentar que mi agregador recibe los feeds en formato HTML mostrando el código fuente y no el contenido formateado. Probablemente esto se deba a algún error de procesamiento de las entidades HTML.

En fin, una experiencia recomendable. Me ha recordado al establecimiento de categorías en base a estrategias de búsqueda, sólo que algo más desarrollado. Desde luego he echado en falta la posibilidad de desarrollar un filtro más avanzado con operadores booleanos y demás. Quizá sea yo que no he llegado al fondo de la cuestión.

Read more »

may. 21
2007

Long tail: diversidad y factores productivos


Introducción

La cola de las distribuciones estadísticas alberga los valores extremos, que normalmente afectan a los datos de los estadísticos descriptivos como son la media, la desviación estándar, los máximos y mínimos, etc.

Esta característica llevó en su momento a crear la denominada estadística robusta, que se centra en descartar los extremos para que los estimadores tengan comportamientos más estables y menos dependientes de tales extremos. Hay que pensar que en ciertos entornos la aparición de valores extremos podria dificultar el control de un sistema crítico, mientras que el valor informativo de ese dato es ínfimo. Desde luego, esto debe plantearse para cada caso.

Volviendo a la cola, uno de los factores que parece que más llevan a su aparición es el hecho de la interacción entre elementos. Esto por ejemplo es aplicable a muchas áreas: cuando los usuarios se relacionan en una red social, aparece una distribución polinomial.

Inciso: Para los casos de las redes sociales (y en general de otros tipos de redes), hay un documento que me ha servido como punto de referencia para situarme. Se titula "Statistical mechanics of complex networks" (formato PDF, descarga libre). Vale decir que para los poco dados a las matemáticas, es un documento muy denso.

Esa interacción implica en algunos casos relación. Por ejemplo, el modelo entidad-relación de una base de datos normalizada puede presentar una densidad ajustada a un modelo polinomial (las relaciones 1:N no son homogéneas, con lo que si el tipo de relación de datos lo permite, puede darse el caso).


Distribuciones exponenciales y reproductibilidad

Para el caso de las distribuciones exponenciales, el caso va un poco más allá. Digamos que las distribuciones exponenciales tienen una cosa en común: en su fórmula consta de un modo u otro la forma matemática ef, donde f acostumbra a ser una función negativa en relación a X, que confiere a estas distribuciones formas generalmente redondeadas, tan habituales en (por ejemplo) la distribución normal, que forma parte de la familia de distribuciones exponenciales.

A lo que quiero llegar es a una diferencia sutil entre distribuciones polinomiales y exponenciales, basada en el proceso de generación de datos: a mi modo de ver, las distribuciones polinomiales son aplicables a fenómenos en los que existe relación entre elementos, pero que tal relación no genera un valor adicional que realimente el sistema.

Eso no significa que no hayan efectos derivados de la relación: en cualquier caso quedan fuera del sistema. En cambio, las distribuciones exponenciales no sólo establecen relaciones sino que también generan un valor. Es decir, tienen características de reproductibilidad del valor.

Esa reproductibilidad es lo que, por ejemplo, caracteriza la distribución de la riqueza en el mundo, que tradicionalmente se ajusta a modelos como el log-normal: Tener dinero no sólo significa tener más que los otros, sino poder reinvertirlo, obtener más beneficio... A eso me refiero en la reproductibilidad: lo que tradicionalmente dice la máxima "el dinero llama al dinero".

Otro caso muy claro es el hecho de compartir ideas: no sólo se comparte una idea, sino que el hecho de compartir las ideas, relacionarlas con las que ya tenía, y sacar de ahí conclusiones convierte nuestra mente en un órgano exponencialmente sabio.

Como colofón, dos principios:

  • La ley de Metcalfe, principalmente aplicada a las telecomunicaciones, que indica que el valor de una red equivale al cuadrado de los miembros que la forman, hasta que llegan a una masa crítica, momento en el cual el valor de la red aumenta de forma exponencial. Esto tiene una aplicación principal en el llamado efecto red (por ejemplo, el valor que tiene que una compañía telefónica). Robert Metcalfe fue el creador de 3Com, y desarrolló esta ley en base al protocolo Ethernet, que actualmente predomina de forma clara en redes locales y demás. En su primera fase parece que presenta un comportamiento polinomial y en la segunda, exponencial.
  • La ley de Reed (conocida hace poco y por lo tanto), aplicada directamente a las redes sociales, presenta por el contrario un comportamiento exponencial, aunque presenta muchas similitudes con la ley de Metcalfe.

Como curiosidad, existe una crítica a la Ley de Metcalfe en un artículo del IEEE Spectrum, donde se critica el hecho de no entrar en los detalles (precisamente donde entra en acción el efecto long tail): cada nodo funciona diferente, cada uno tiene su actividad.

En el momento que se acepta esa variedad, es donde entran las reglas de los porcentajes (la regla del 1%, 19%, 20% y 80%), que no son más que simplificaciones de la larga cola.

Read more »

may. 21
2007

Sitios sociales y Spam: buscando referencias

Por un lado, un artículo que más bien parece un manifiesto: Social Networking Spam: The enemy of knowledge.

Tenemos también algo relacionado con el spam, aunque más enfocado a buscadores: el cloaking. Aquí tenemos un análisis de la prevención del cloaking en base a la cotización de términos.

El sitio del que he sacado este enlace tiene más interés: es la Adversarial Information Retrieval, es decir, el análisis de la recuperación de la información cuando los documentos van en contra (por seguir el hilo) del sistema de recuperación. Los documentos del año 2006 parecen interesantes, aunque no le echado un ojo a todos, a decir verdad.

De los documentos presentados en el 2007, destacaría el documento Combating Spam in Tagging systems (PDF), que me ha gustado bastante, aunque creo que el tema dará para más.

Otra fuente de información que me ha impresionado por su calidad es el sitio www.miislita.com. Es que tiene de todo: desde algoritmos de almacenamiento y recuperación, álgebra matricial, la aplicación de los fractales a la semántica... Muy interesante, ciertamente.

De momento eso es todo, sigo investigando porque el tema tiene mucho interés: aplicar las técnicas de spam a las búsquedas y a los sitios sociales va a dar mucho que hablar. Mi opinión es que reducir el tiempo de limpieza del usuario aumenta el tiempo de interacción en la red, y por ello de ventas, recuperación efectiva de información y en último término satisfacción. Quizá me equivoque.

Read more »

abr. 26
2007

Expresiones regulares para interpretar URLs

Como precondición, es necesario disponer de una URL referencial (es decir, la URL donde estaba el enlace). Esta URL referencial tiene una estructura de Array del siguiente tipo:

$mxReferer = array ("protocol" => "","domain"=>"","uri"=>"","params"=>"","anchor"=>"");

LLamaremos a la función enviando la URL, que puede ser relativa, pero siempre al referente. Es decir: recogeremos del referente la información que falta en la URL analizada.

Para el caso que presento en el código de muestra, se supone que estamos en el documento "http://www.sopadebits.com/un_primer_post" y nos encontramos con un enlace cuyo atributo href es "/cuando_etiquetas_un_recurso".

El código de la función es:

 

$mxReferer = array
(
"protocol" => "http",
"domain" => "www.sopadebits.com",
"uri" => "content/view/",
"params" => "",
"anchor" => ""
);

print_r(tokenizeUrl("/un_primer_post"));

function tokenizeUrl($szUrl = false,$mxReferer = false)
{
if($szUrl == false || $mxReferer == false)
return false;
$mxTokens = array();
preg_match

(

"/^(((http|https|ftp):)?(\/\/)?|\/)([\w\.\/\_-%=&@]+)*((?)[\w\.\/\_-%=&@]+)?((#)[\w\.\/\_-%=&@]+)?$/i",

$szUrl,

$mxUrl
);

if($mxUrl[5] == '')
$mxUrl[5] = $mxReferer['uri'];

$mxUri = explode("/",$mxUrl[5]);

if($mxUrl[1] == $mxUrl[4])
{

$mxTokens['protocol'] = $mxReferer['protocol'];
if($mxUrl[4]=='//')
{
// no protocol, yes domain
$mxTokens['domain'] = $mxUri[0];
array_shift($mxUri);
}
else
{
// no protocol, no domain
$mxTokens['domain'] = $mxReferer['domain'];
}
}
else
{
if($mxUrl[4] == '//')
{
// no protocol, yes domain
$mxTokens['protocol'] = $mxUrl[3];
$mxTokens['domain' ] = $mxUri[0];
array_shift($mxUri);
}
else
{
// no protocol, no domain
$mxTokens['protocol'] = $mxReferer['protocol'];
$mxTokens['domain' ] = $mxReferer['domain'];
}
}

if(isset($mxUrl[7]))
{
$mxTokens['params'] = substr($mxUrl[6],1,strlen($mxUrl[6])-1);
}
if(isset($mxUrl[9]))
{
$mxTokens['anchor'] = substr($mxUrl[8],1,strlen($mxUrl[8])-1);
}

$mxTokens['uri'] = implode("/",$mxUri);
return $mxTokens;
}

?>

El resultado debe(ría) ser:

array

(

"protocol" => "http",

"domain" => "www.sopadebits.com",

"uri" => "/cuando_etiquetas_un_recurso"

)

Los parámetros y el ancla son opcionales. La simplicidad apremia, ya que trato lo que va "después" del dominio como un todo, sin importarme si se trata de un archivo php, html ni nada por el estilo.

A lo que vamos: la expresión regular. A ver si así se ve mejor:

/^(((http|https|ftp):)?(\/\/)?|\/)([\w\.\/\_-%=&@]+)*((?)[\w\.\/\_-%=&@]+)?((#)[\w\.\/\_-%=&@]+)?$/i

No me estoy acordando de la familia de nadie, que conste...


Explicación de la expresión regular


Primera parte: la expresión se da al principio de la cadena

^ : Esto indica que la expresión se debe encontrar al principio de línea (es decir, que si hubiera espacios en blanco al principio, no se encontrarían coincidencias. Se podría realizar un trim pero eso ya lo dejo para quien le interese).


Segunda parte: el protocolo

(((http|https|ftp):)?(\/\/)?|\/)

Esta parte verifica si la URL tiene el protocolo indicado, y en caso afirmativo, verifica que se trata de http, https o ftp. Incluso el FTP podría sobrar, pero mira... viene de propina ;-)

Como vemos, se abren tres paréntesis. Esto indica que la cadena que concuerde se guardará en una matriz ($mxUrl para el caso del código anterior).

  • El primer paréntesis guarda el protocolo (es decir, me va a guardar "http", "https" o "ftp") ó la barra inicial de la uri (si la hubiera). Mención aparte para el carácter "|" que indica opción (o protocolo o barra).
  • El segundo paréntesis guarda el protocolo y los dos puntos (:)
  • El tercer paréntesis guarda las dos barras (\/\/) que van después del protocolo y los dos puntos.

Esto es importante: las URLs se pueden indicar en la forma "//dominio/uri...". Es decir, no siempre debe indicarse el protocolo. Lo más conocido es que suponga el nombre de dominio y que por lo tanto empiece por "/uri...", pero he querido asegurar esta posibilidad.


URI, parámetros y ancla

Los tres paréntesis siguientes son prácticamente idénticos. El primero corresponde a la URI, el segundo a los parámetros indicados con el interrogante y el tercero es el ancla. Echando un vistazo, sólo se diferencian del primer carácter de la expresión, que es lo que indica cuándo empieza uno y acaba el otro. La expresión:

([\w\.\/\_-%=&@]+)*

Busca 0 o más coincidencias (el asterisco) para un carácter alfanumérico (w), punto, barra, guión bajo o medio, signo % (esto es para los caracteres codificados), signo igual, ampersand y arroba. Esto puede ser una cadena (el signo + después del corchete indica que se pueden encontrar 1 o más ocurrencias) y los caracteres aceptados pueden estar en cualquier orden (se indican dentro de un corchete).

Bueno, creo que con esto ya basta por hoy. Si falta algún carácter, quizá se lo haya tragado el editor de HTML.

Read more »

abr. 4
2007

Una partida de Ajedrez entre Windows y Linux

Hablo de una situación que viví hace más de diez años, con lo que no voy a entrar en detalles. En un campeonato abierto de ajedrez, cuando las partidas de la jornada ya estaban terminándose, surgió una conversación entre dos ajedrecistas de buen nivel (uno de ellos era Maestro Internacional).

Cuando me acerqué, oí que estaban comentando sobre cómo variaba la valoración de un jugador para una determinada posición, según si se realizaban las mismas jugadas con blancas o negras. Es decir, al empezar una partida, empiezan las negras, que juegan las mismas jugadas que harían las blancas en situación normal.

El principal impacto que se percibe es el cambio de situación. Las aperturas parecen diferentes, la misma posición que con blancas podía parecer equilibrada (sin ventajas para los oponentes) era ahora muy mala para las negras. Una situación buena para las blancas, era simplemente de equilibrio para las negras. ¿Por qué? Del sinfín de razones que se me ocurren, apunto las siguientes:

  • La primera, y obvia, es por la costumbre de ver las cosas desde un lado.
  • La segunda, porque al ver las cosas desde el lado opuesto, es fácil darse cuenta lo importante que es disponer de la iniciativa, pero que no es suficiente.
  • La tercera, corolario de la anterior, porque a veces el cambio de mentalidad comporta olvidarse de lo aprendido cuando se ocupaba otra postura.

En el fondo, da igual si hablamos de ajedrez o del entorno empresarial: la iniciativa (o lo que por analogía se llama the first mover's advantage) es importante, pero los errores en la iniciativa traen dos tipos de consecuencias: las propias del error, y la posibilidad de perder esa misma iniciativa.

Traspasando esto a la partida Windows-Linux, ¿os imagináis por un momento si se cambiaran los colores? Es decir, en el mercado estaba Linux con posición dominante, y aparece Windows... Con errores, vulnerabilidades, inestabilidad...

En esa situación... ¿Qué cuota de mercado creéis que absorbería Windows?

También estoy pensando qué pasaría si el conjunto de distribuciones de Linux llegaran a tener mayor cuota de mercado que Windows (personalmente creo que aún queda). Es decir, si Linux jugara con blancas y llega Windows... ¿Què estaría ofreciendo mejor que la comunidad Linux? Sea lo que sea, eso es lo que tiene pendiente Linux para mejorar su juego y obtener en algún momento ventaja por calidad.

 

 

Read more »

abr. 2
2007

Un primer post

Lo que me interesará tratar son tres aspectos diferentes de la información:

  • Los aspectos semánticos, tratados especialmente desde el ámbito de la documentación.
  • Los aspectos técnicos, relacionados con la informática.
  • Los aspectos cuantitativos, tratados desde las matemáticas.


Son también mis tres ámbitos de conocimiento, unos por cuestiones académicas y otros por vocación y actividad profesional. Ninguno de los tres constan en la lista habitual de las profesiones que nombran los niños cuando les preguntan qué quieren ser de mayores. En el fondo, no me extraña...

Las tres actividades son de carácter técnico, en el sentido que debes aplicarlo a algo más. Sin embargo, creo que con el tiempo han ido sucediendo cosas, y todas ellas relacionadas con el trabajo relacionado con la información:

  • El volumen de información ha crecido de forma exponencial. No es tratable "caso por caso".
  • La gran especialización profesional está siendo compensada con la necesidad de grupos de trabajo cada vez más interdisciplinares... cuyos miembros prácticamente hablan idiomas diferentes.
  • Al otro lado, el usuario desea cada vez un mayor grado de síntesis, menor esfuerzo y más resultados.
  • Como consecuencia de todo lo anterior, aumenta la presión sobre el tratamiento de la información y con ello la necesidad de encontrar vías de solución a la infoxicación.


Todo este panorama pone en manos de los profesionales de la información una serie de preguntas que cada vez deben responderse de forma más contextualizada. Personalmente creo que los anteriores roles profesionales pueden cumplir con los siguientes objetivos:

  • Los profesionales de la documentación pueden ayudar en la construcción de interfaces de consulta (entendiendo esto desde el punto de vista más amplio: un espacio en el que el usuario consulta), y organizar la información para que pueda ser recuperada con un buen nivel de relevancia.
  • Los profesionales de la informática pueden acercar la tecnología a un rango cada vez mayor de usuarios para que el concepto de acceso sustituya al de disponibilidad. Desde luego, la optimización y la agilización de los sistemas, además de su capacidad de aprendizaje son aspectos clave. Pero también lo es permitir que personas sin tantos recursos puedan acceder a lo que necesitan.
  • Los de las matemàticas y las estadísticas pueden ofrecer soporte a los dos anteriores en su capacidad de abstracción para mejorar los sistemas de síntesis y perfilado de usuarios, los algoritmos de detección de la relevancia, los algoritmos propios de los sistemas de recuperación de información...


Aquí todos ayudan a todos... ¡Qué bonito!

Desde luego no voy a matar todo el tema en un solo post. Pronto vendrán otros...

Read more »

© 2007 and beyond Mario Alberich, licensed under CC-BY-SA unless stated otherwise.