<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Corunet. El Blog &#187; Usabilidad</title>
	<atom:link href="http://blog.corunet.com/category/usabilidad/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.corunet.com</link>
	<description>Web development, usability and more</description>
	<lastBuildDate>Thu, 03 Nov 2011 18:30:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Eye tracking para pobres. Parte 2</title>
		<link>http://blog.corunet.com/eye-tracking-para-pobres-parte-2/</link>
		<comments>http://blog.corunet.com/eye-tracking-para-pobres-parte-2/#comments</comments>
		<pubDate>Mon, 24 Jul 2006 11:46:34 +0000</pubDate>
		<dc:creator>David Pardo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Usabilidad]]></category>

		<guid isPermaLink="false">http://blog.corunet.com/usabilidad/eye-tracking-para-pobres-parte-2</guid>
		<description><![CDATA[En la primera parte del artículo escribimos un pequeño script para analizar la posición de los clicks en una página web. Despues de unas cuantas pruebas más, ya tenemos la información necesaria para hacer un pequeño análisis. He probado a implantar los scripts en el sitio web de corunet y he hecho algunas pruebas de [...]]]></description>
			<content:encoded><![CDATA[<p>En la <a href="/usabilidad/eye-tracking-para-pobres">primera parte del artículo </a>escribimos un pequeño script para analizar la posición de los clicks en una página web. Despues de unas cuantas pruebas más, ya tenemos la información necesaria para hacer un pequeño análisis.<span id="more-7"></span><br />
He probado a implantar los scripts en el sitio web de <a href="http://www.corunet.com" onclick="pageTracker._trackPageview('/outgoing/www.corunet.com?referer=');">corunet</a> y he hecho algunas pruebas de clicks en la pantalla a una resolución de 1280*1024. Al cabo de 65 clicks, tengo un log como este:</p>
<p><code><br />
x332y288	http://corunet.com/	192.168.0.10<br />
x399y288	http://corunet.com/	192.168.0.10<br />
x489y294	http://corunet.com/	192.168.0.10<br />
x655y346	http://corunet.com/	192.168.0.10<br />
x709y351	http://corunet.com/	192.168.0.10<br />
x350y348	http://corunet.com/	192.168.0.10<br />
x384y305	http://corunet.com/	192.168.0.10<br />
...<br />
</code></p>
<p>De aquí, me  interesan las coordenadas x e y de cada click para situarlas sobre la página. Para ello, el siguiente código me va a ayudar bastante:</p>
<p><code><br />
<span style="color:#399;font-style:italic;">#!/usr/bin/perl</span><br />
<span style="color:#001;">open</span> <span style="color:#000;">(</span><span style="color:#3A3;">DATOS</span><span style="color:#000;">,</span><span style="color:#00a;">"</span><span style="color:#00a;">log.txt</span><span style="color:#00a;">"</span><span style="color:#000;">)</span><span style="color:#000;">;</span><br />
<span style="color:#000;">my</span> <span style="color:#f70;">@datos</span><span style="color:#000;">=</span><span style="color:#000;">&lt;</span><span style="color:#3A3;">DATOS</span><span style="color:#000;">&gt;</span><span style="color:#000;">;</span><br />
<span style="color:#001;">close</span> <span style="color:#000;">(</span><span style="color:#3A3;">DATOS</span><span style="color:#000;">)</span><span style="color:#000;">;</span><br />
<span style="color:#000;">my</span> <span style="color:#080;">$i</span><span style="color:#000;">;</span><br />
<span style="color:#000;">foreach</span> <span style="color:#000;">my</span> <span style="color:#080;">$dato</span><span style="color:#000;">(</span><span style="color:#f70;">@datos</span><span style="color:#000;">)</span><span style="color:#000;">{</span><br />
	<span style="color:#000;">if</span> <span style="color:#000;">(</span><span style="color:#080;">$dato</span><span style="color:#000;">=~</span><span style="color:#00a;">/</span><span style="color:#00a;"><span style="color:#800;">\.</span>com<span style="color:#800;">\/</span><span style="color:#800;">\t</span></span><span style="color:#00a;">/</span><span style="color:#000;">)</span><span style="color:#000;">{</span><br />
		<span style="color:#000;">my</span> <span style="color:#f70;">@posicion</span><span style="color:#000;">=</span><span style="color:#001;">split</span><span style="color:#000;">(</span><span style="color:#00a;">"</span><span style="color:#00a;"><span style="color:#800;">\t</span></span><span style="color:#00a;">"</span><span style="color:#000;">,</span><span style="color:#080;">$dato</span><span style="color:#000;">)</span><span style="color:#000;">;</span><br />
		<span style="color:#f70;">$posicion</span><span style="color:#000;">[</span><span style="color:#f0f;">0</span><span style="color:#000;">]</span><span style="color:#000;">=~</span><span style="color:#00a;">s/</span><span style="color:#00a;">x</span><span style="color:#00a;">/</span><span style="color:#00a;"></span><span style="color:#00a;">/</span><span style="color:#000;">;</span><br />
		<span style="color:#000;">my</span> <span style="color:#000;">(</span><span style="color:#080;">$x</span><span style="color:#000;">,</span><span style="color:#080;">$y</span><span style="color:#000;">)</span><span style="color:#000;">=</span><span style="color:#001;">split</span><span style="color:#000;">(</span><span style="color:#00a;">"</span><span style="color:#00a;">y</span><span style="color:#00a;">"</span><span style="color:#000;">,</span><span style="color:#f70;">$posicion</span><span style="color:#000;">[</span><span style="color:#f0f;">0</span><span style="color:#000;">]</span><span style="color:#000;">)</span><span style="color:#000;">;</span><br />
		<span style="color:#080;">$i</span><span style="color:#000;">++</span><span style="color:#000;">;</span><br />
		<span style="color:#300;">print</span> <span style="color:#00a;">'</span><span style="color:#00a;">&lt;img src="/i/pelotilla.png" </span><br />
<span style="color:#00a;">		style="z-index:</span><span style="color:#00a;">'</span><span style="color:#000;">.</span><span style="color:#080;">$i</span><span style="color:#000;">.</span><span style="color:#00a;">'</span><span style="color:#00a;">;position:absolute;</span><br />
<span style="color:#00a;">		left:</span><span style="color:#00a;">'</span><span style="color:#000;">.</span><span style="color:#080;">$x</span><span style="color:#000;">.</span><span style="color:#00a;">'</span><span style="color:#00a;">px;top:</span><span style="color:#00a;">'</span><span style="color:#000;">.</span><span style="color:#080;">$y</span><span style="color:#000;">.</span><span style="color:#00a;">'</span><span style="color:#00a;">px;</span><br />
<span style="color:#00a;">		height:16px;width:16px;"&gt;</span><span style="color:#00a;">'</span><span style="color:#000;">.</span><span style="color:#00a;">"</span><span style="color:#00a;"><span style="color:#800;">\n</span></span><span style="color:#00a;">"</span><span style="color:#000;">;</span><br />
	<span style="color:#000;">}</span><br />
<span style="color:#000;">}</span><br />
</code></p>
<p>Este programilla (en perl) imprime un tag IMG para cada línea del log que conincide con la página raíz (termina en .com/), líneas que luego añadiremos a una copia de la página original. Además, será necesario tener una imagen en formato PNG para marcar los puntos. Yo he utilizado pelotilla.png, una imagen de 16x16px creada en photoshop.</p>
<h2>El resultado</h2>
<p>El programa imprime en pantalla un trocito de código que se puede pegar directamente bajo la etiqueta &lt;body&gt; de una copia de la página en cuestión:</p>
<p><code><br />
...<br />
&lt;img src="/i/pelotilla.png"<br />
                style="z-index:51;position:absolute;<br />
                left:605px;top:773px;<br />
                height:16px;width:16px;"><br />
&lt;img src="/i/pelotilla.png"<br />
                style="z-index:52;position:absolute;<br />
                left:778px;top:792px;<br />
                height:16px;width:16px;"><br />
&lt;img src="/i/pelotilla.png"<br />
                style="z-index:53;position:absolute;<br />
                left:799px;top:810px;<br />
                height:16px;width:16px;"><br />
...<br />
</code></p>
<p> El resultado es este, utilizando las indicaciones de <a href="http://webfx.eae.net/dhtml/pngbehavior/pngbehavior.html" onclick="pageTracker._trackPageview('/outgoing/webfx.eae.net/dhtml/pngbehavior/pngbehavior.html?referer=');">webfx </a>para conseguir transparencia en PNGs en Internet explorer:</p>
<p><img src="/uploads/captura.jpg" alt="Captura de pantalla con clicks" /></p>
<p>Cada uno de los puntos rojos se refiere a un click en la página, con lo que podemos empezar a hacernos una idea de las necesidades del usuario. Por ejemplo, en la sección de las noticias de la derecha, los usuarios han hacho click en el cuerpo de la noticia, buscando más información. Será conveniente agregar un icono de leer más, o convertir el texto en un enlace. En un análisis real, sería interesante tener más puntos, más usuarios y obtener más conclusiones&#8230;</p>
<h2>Problemas y mejoras</h2>
<li>De momento, el sistema no está preparado para cambios de resolución. En un entorno no controlado, habrá que retocar el script para que refiera las coordenadas a un punto conocido de la página.</li>
<li>El evento onclick no soporta flash. En el caso de que se use para colocar menús, será necesario editar manualmente los archivos .FLA y reemplazar los SWF para que también obtengan el punto donde se hace click</li>
<p>Partiendo de este sistema, podríamos capturar, por ejemplo, la posición del ratón cada, por ejemplo,  50 milisegundos, guardarla en un array y almacenarla en un log en el servidor, con lo que sería posible seguir los gestos del usuario tal como navega en una página web. En el futuro, más cosas.</p>
<h2>Agradecimientos</h2>
<p>He obtenido la inspiración para el artículo del post <a href="http://blog.outer-court.com/click/" onclick="pageTracker._trackPageview('/outgoing/blog.outer-court.com/click/?referer=');">&#8220;Click Survey&#8221;</a> que permite hacer click en una imagen determinada y analiza luego la posición de los clicks.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.corunet.com/eye-tracking-para-pobres-parte-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Eye tracking para pobres</title>
		<link>http://blog.corunet.com/eye-tracking-para-pobres/</link>
		<comments>http://blog.corunet.com/eye-tracking-para-pobres/#comments</comments>
		<pubDate>Mon, 17 Jul 2006 12:55:39 +0000</pubDate>
		<dc:creator>David Pardo</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Usabilidad]]></category>

		<guid isPermaLink="false">http://blog.corunet.cor/general/eye-tracking-para-pobres</guid>
		<description><![CDATA[Los dispositivos de eye tracking son caros. Dan un rendimiento excepcional para analizar adónde miran los visitantes de un sitio web, pero a veces es dificil justificar la inversión. Si consigues convencer a tus testers para que hagan click en el punto al que miran, puedes sacar conclusiones&#8230; Con un poco de ingenuidad, es posible [...]]]></description>
			<content:encoded><![CDATA[<p>Los dispositivos de eye tracking son caros. Dan un rendimiento excepcional para analizar adónde miran los visitantes de un sitio web, pero a veces es dificil justificar la inversión. Si consigues convencer a tus testers para que hagan click en el punto al que miran, puedes sacar conclusiones&#8230;<span id="more-6"></span></p>
<p class="fotocentro"><img src="/uploads/566532_eye.jpg" alt="Ojo de usuario" /></p>
<p>Con un poco de ingenuidad, es posible implantar en una página web un sistema parecido, basado en javascript y que siga los puntos en donde la gente hace click con el ratón. Para ello, son necesarios los siguientes pasos:</p>
<ol>
<li>Crear una función que siga el movimiento del ratón, y que se lo pase a un logger cada vez que se hace click.</li>
<li>Hacer una llamada a un método asíncrono (HttpRequest o similar) que mande, de forma transparente para el usuario, las coordenadas del punto en el que se ha clickado.</li>
<li>Que el logger escriba en un archivo, base de datos o similar la información pertinente</li>
</ol>
<h2>Capturar  la posición del ratón </h2>
<p>Antes de nada, es necesario encontrar las coordenadas del ratón. Lo mejor para esto es hacer, al final del ducumento html, un enlace a un fichero javascrip parecido a este:</p>
<p><code>/*detectar navegador y declaraciones*/<br />
var IE = document.all?true:false<br />
if (!IE) document.captureEvents(Event.MOUSEMOVE)<br />
var tempX = 0<br />
var tempY = 0/*llamada a la funcion con un handler*/<br />
document.onclick = getMouseXY;<br />
function getMouseXY(e) { //hace todo el trabajo<br />
  if (IE) {<br />
    tempX = event.clientX + document.body.scrollLeft<br />
    tempY = event.clientY + document.body.scrollTop<br />
  } else {<br />
    tempX = e.pageX<br />
    tempY = e.pageY<br />
  }<br />
  var url="/perl/guardacoordenadas.pl?x="+tempX+"&#038;y="+tempY;<br />
  guardar(url);<br />
  return true<br />
}<br />
if( document.getElementsByTagName ){<br />
 var links = document.getElementsByTagName( 'a' );<br />
 for( var i=0; i < links.length; i++ ){<br />
  links[i].onclick = function(){<br />
   return getMouseXY(this);<br />
  }<br />
 }<br />
}<br />
</code></p>
<p> Lo que hace, más o menos, es detectar que navegador está utilizando el usuario, inicializar el controlador de clicks, asignar a cada enlace una función en tiempo de ejecución y definir una función getMouseXY. Ésta devuelve true despues de llamar a una función externa que se define en el segundo paso:</p>
<h2>HttpRequest</h2>
<p>Permite hacer una llamada al servidor fuera del flujo de la navegación. En este caso, queremos que,  cuando el usuario haga click, el servidor guarde la posición del ratón. Para esto, el código es el siguiente:</p>
<p><code>var xmlDoc = null ;<br />
if (typeof window.ActiveXObject != 'undefined' ) {<br />
 xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");<br />
}else {<br />
 xmlDoc = new XMLHttpRequest();<br />
}<br />
function guardar(url){<br />
 xmlDoc.open( "GET", url, true );<br />
 xmlDoc.send( null );<br />
}</code></p>
<p>Al igual que antes, diferenciamos entre el código de Internet Explorer y el resto. Luego, utilizamos el objeto xmlDoc para hacer la petición. De esta forma, llamamos al servidor sin que el cliente note nada, y podemos guardar la posición del cursor.</p>
<h2>El lado del servidor</h2>
<p>Desde el lado del servidor, la petición se ve como cualquier otra solicitud, pero no es necesario devolver nada por salida estándar. Lo único que haría falta es imprimir en un archivo la <em>query string</em> que le hemos pasado (con las coordenadas x e y), el referer y, si queremos, la dirección IP. Como prueba de concepto, serviría este código (CGI en perl, fácil de entender o de implementar en otro lenguaje)</p>
<p><code>#!/usr/bin/perl<br />
use CGI;<br />
use strict;<br />
my $q=new CGI; #crea una nueva instancia del objeto CGI<br />
print $q->header(); #imprime cabeceras<br />
open (LOG,">>log.txt") ||die; #abre el archivo log<br />
print LOG $q->Vars; #e imprime todos los datos<br />
print LOG "\t";<br />
print LOG $ENV{'HTTP_REFERER'};<br />
print LOG "\t";<br />
print LOG $ENV{'REMOTE_ADDR'};<br />
print LOG "\n";<br />
close (LOG);</code></p>
<p>Con esto, obtendremos un archivo log.txt que nos permitirá saber los puntos donde el usuario ha clickado.</p>
<h2>Más cosas</h2>
<p>Ahora sería el momento de programar un visualizador para toda esta información, superponiendo a la web los puntos en los que se ha hecho click. <del datetime="2006-07-24T12:07:01+00:00">En breve escribiré los resultados de mi primer experimento público y como analizar todos los datos.</del>  <a href="/usabilidad/eye-tracking-para-pobres-parte-2">Ya puedes leer como analizar los logs generados en la parte 2 del artículo</a></p>
<p>Con este mismo sistema es posible hacer muchísimas cosas. Por ejemplo, llevar un log de los enlaces internos y externos que se siguen en la página, guardar los movimientos del ratón para seguir la navegación... La imaginación es la que marca el límite.</p>
<p> </p>
<p> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.corunet.com/eye-tracking-para-pobres/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

