<?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>El vol de l&#039;home ocell &#187; Projectes</title>
	<atom:link href="http://www.elvoldelhomeocell.net/archives/category/jo/projectes/feed" rel="self" type="application/rss+xml" />
	<link>http://www.elvoldelhomeocell.net</link>
	<description>Vull tenir dret a volar.</description>
	<lastBuildDate>Thu, 26 Apr 2012 00:57:47 +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>Correcció automàtica en l&#8217;Oracle: Trie</title>
		<link>http://www.elvoldelhomeocell.net/archives/1553</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1553#comments</comments>
		<pubDate>Sat, 05 Nov 2011 16:20:41 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[Programació]]></category>
		<category><![CDATA[Projectes]]></category>
		<category><![CDATA[algorismes]]></category>
		<category><![CDATA[cerca aproximada]]></category>
		<category><![CDATA[complexitat computacional]]></category>
		<category><![CDATA[correcció automàtica]]></category>
		<category><![CDATA[estructures de dades]]></category>
		<category><![CDATA[friki]]></category>
		<category><![CDATA[oracle de woody allen]]></category>
		<category><![CDATA[trie]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1553</guid>
		<description><![CDATA[Continuem amb la segona alternativa que vaig fer servir per a permetre la correcció automàtica, o si voleu cerca aproximada. Ja us vaig comentar en l&#8217;anterior entrada els problemes que presenta la cerca dicotòmica amb cadenes ordenades per ordre lexicogràfic &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1553">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Continuem amb la <a href="http://www.elvoldelhomeocell.net/archives/1515" target="_blank">segona</a> alternativa que vaig fer servir per a permetre la <a href="http://en.wikipedia.org/wiki/Spell_checker" target="_blank">correcció automàtica</a>, o si voleu <a href="http://en.wikipedia.org/wiki/Approximate_string_matching" target="_blank">cerca aproximada</a>.</p>
<p>Ja us vaig comentar en l&#8217;anterior entrada els problemes que presenta la cerca dicotòmica amb cadenes ordenades per ordre lexicogràfic per a buscar alternatives a una cerca que conté algun error. Semblava doncs que l&#8217;ordre lexicogràfic no era suficient per a establir la relació que jo necessitava entre els noms de les persones, així que la segona idea que vaig tenir és la d&#8217;utilitzar la famosa <a href="http://en.wikipedia.org/wiki/Levenshtein_distance" target="_blank">distància de Levenshtein</a>.</p>
<p>Sols comentar que quan estava escrivint aquest post em vaig adonar que tenia un greu error en el meu algorisme, de fet vaig haver de canviar-lo. Això em va servir per a entendre bé aquest nou algorisme que explique ací i millorar alguns aspectes en la implementació del meu programa. Eixe és el motiu pel qual m&#8217;ha dut quasi una setmana publicar aquesta entrada.</p>
<p>Avisar-vos també que aquest post és molt més llarg i pesat que l&#8217;anterior, això sí, molt més interessant també. Els algorismes que ací descric no són cosa meua i poden haver errors en la descripció de l&#8217;algorisme o la seva complexitat. Evidentment, aquest blog no tracta de ser una font de referència i no deuríeu de confiar excessivament en els detalls que s&#8217;expliquen ja que poden ser imprecisos o inclús erronis. Si us interessa el tema i voleu informació en la que pugueu confiar més, sols heu de cercar els termes en articles de la <a href="http://en.wikipedia.org" target="_blank">Wikipedia</a> o els algorismes en publicacions de <a href="http://scholar.google.com/" target="_blank">Google Scholar</a>.</p>
<p>Fet aquest avís, comencem.</p>
<p><strong id="damerau-levenshtein">Distància de Damerau-Levenshtein</strong></p>
<p>La <a href="http://en.wikipedia.org/wiki/Levenshtein_distance" target="_blank">distància de Levenshtein</a> mesura la distància d&#8217;edició entre dues cadenes de text en termes d&#8217;insercions, esborrats i substitucions. Això és, el nombre mínim d&#8217;aquestes operacions que són necessàries per transformar una cadena <em>A</em> en una altra cadena <em>B</em>. Si volem comptar també les transposicions com a operacions, la mètrica s&#8217;anomena distància de <a href="http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance" target="_blank">Damerau-Levenshtein</a>. L&#8217;algorisme utilitzat per a computar aquesta mètrica és un clàssic de qualsevol curs de <a href="http://en.wikipedia.org/wiki/Dynamic_programming" target="_blank">programació dinàmica</a>. </p>
<p>Intentaré explicar l&#8217;algorisme de manera breu. Imaginem que volem calcular la distància d&#8217;una cadena <em>X</em> a una cadena <em>Y</em>. Llavors és construeix una matriu <em>D</em> de <em>|X|+1</em> files i <em>|Y|+1</em> columnes. L&#8217;element <img src='http://s.wordpress.com/latex.php?latex=D_%7Bij%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D_{ij}' title='D_{ij}' class='latex' /> indica quina és la distància de la subcadena <img src='http://s.wordpress.com/latex.php?latex=x_1%20%5Cldots%20x_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='x_1 \ldots x_i' title='x_1 \ldots x_i' class='latex' /> a la subcadena <img src='http://s.wordpress.com/latex.php?latex=y_1%20%5Cldots%20y_j&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='y_1 \ldots y_j' title='y_1 \ldots y_j' class='latex' />. La fila 0 i la columna 0 representen les distàncies de la cadena <img src='http://s.wordpress.com/latex.php?latex=%5Cepsilon&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\epsilon' title='\epsilon' class='latex' /> a <img src='http://s.wordpress.com/latex.php?latex=y_1%20%5Cldots%20y_j&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='y_1 \ldots y_j' title='y_1 \ldots y_j' class='latex' /> i de la cadena <img src='http://s.wordpress.com/latex.php?latex=x_1%20%5Cldots%20x_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='x_1 \ldots x_i' title='x_1 \ldots x_i' class='latex' /> a <img src='http://s.wordpress.com/latex.php?latex=%5Cepsilon&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\epsilon' title='\epsilon' class='latex' /> respectivament (<img src='http://s.wordpress.com/latex.php?latex=%5Cepsilon&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\epsilon' title='\epsilon' class='latex' /> és la cadena buida, aquella que no conté cap símbol).</p>
<p>Doncs bé, la fórmula per a calcular cada element de la taula és la següent.<img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/formula_d.png" alt="" title="formula_d" width="300" height="120" class="aligncenter size-full wp-image-1605" /></p>
<p><img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/formula_s.png" alt="" title="formula_s" width="138" height="43" class="aligncenter size-full wp-image-1606" /></p>
<p><img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/formula_t.png" alt="" title="formula_t" width="213" height="43" class="aligncenter size-full wp-image-1607" /></p>
<p>Ací teniu un exemple de com quedaria matriu per a les cadenes <em>hola</em> i <em>poal</em>.</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20%5Cbegin%7Barray%7D%7B%7Cc%7Cc%7Cc%7Cc%7Cc%7Cc%7C%7D%20%20%5Chline%20D%20%26%20%5Cepsilon%20%26%20p%20%26%20o%20%26%20a%20%26%20l%20%5C%5C%20%20%5Chline%20%5Cepsilon%20%26%200%20%26%201%20%26%202%20%26%203%20%26%204%20%5C%5C%20%20%5Chline%20h%20%26%201%20%26%201%20%26%202%20%26%203%20%26%204%5C%5C%20%20%5Chline%20o%20%26%202%20%26%202%20%26%201%20%26%202%20%26%203%5C%5C%20%20%5Chline%20l%20%26%203%20%26%203%20%26%202%20%26%202%20%26%202%5C%5C%20%20%5Chline%20a%20%26%204%20%26%204%20%26%203%20%26%202%20%26%202%5C%5C%20%20%5Chline%20%20%5Cend%7Barray%7D%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{array}{|c|c|c|c|c|c|}  \hline D &amp; \epsilon &amp; p &amp; o &amp; a &amp; l \\  \hline \epsilon &amp; 0 &amp; 1 &amp; 2 &amp; 3 &amp; 4 \\  \hline h &amp; 1 &amp; 1 &amp; 2 &amp; 3 &amp; 4\\  \hline o &amp; 2 &amp; 2 &amp; 1 &amp; 2 &amp; 3\\  \hline l &amp; 3 &amp; 3 &amp; 2 &amp; 2 &amp; 2\\  \hline a &amp; 4 &amp; 4 &amp; 3 &amp; 2 &amp; 2\\  \hline  \end{array}  ' title='  \begin{array}{|c|c|c|c|c|c|}  \hline D &amp; \epsilon &amp; p &amp; o &amp; a &amp; l \\  \hline \epsilon &amp; 0 &amp; 1 &amp; 2 &amp; 3 &amp; 4 \\  \hline h &amp; 1 &amp; 1 &amp; 2 &amp; 3 &amp; 4\\  \hline o &amp; 2 &amp; 2 &amp; 1 &amp; 2 &amp; 3\\  \hline l &amp; 3 &amp; 3 &amp; 2 &amp; 2 &amp; 2\\  \hline a &amp; 4 &amp; 4 &amp; 3 &amp; 2 &amp; 2\\  \hline  \end{array}  ' class='latex' /></p>
<p>Si mirem l&#8217;element <img src='http://s.wordpress.com/latex.php?latex=D_%7B4%2C4%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D_{4,4}' title='D_{4,4}' class='latex' /> de la taula, veiem que la distància de Damerau-Levenshtein entre les dues cadenes és 2 (transformacion: <em>hola</em>-><em>pola</em>-><em>poal</em>). Fixeu-vos que és menor que la distància de Levenshtein (que no admet transposicions) i que seria 3.</p>
<p>La gràcia d&#8217;aquest algorisme és que pot anar construint-se fila a fila i columna a columna, de manera que el cost temporal de l&#8217;algorisme per a dues cadenes de longituds <em>m</em> i <em>n</em> és <img src='http://s.wordpress.com/latex.php?latex=O%28m%20%5Ccdot%20n%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(m \cdot n)' title='O(m \cdot n)' class='latex' />, a l&#8217;igual que el cost espacial.</p>
<p>El problema d&#8217;aquesta mètrica és el cost: no és lineal. No era una alternativa adequada simplement computar per a cada cerca la seva distància de Damerau-Levenshtein amb els noms de les persones i quedar-me amb aquelles amb un mínim error. Suposant que tenim <em>n</em> persones i la longitud dels seus noms és aproximadament <em>l</em>, el cost temporal d&#8217;aquesta cerca seria <img src='http://s.wordpress.com/latex.php?latex=O%28n%20%5Ccdot%20l%5E2%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(n \cdot l^2)' title='O(n \cdot l^2)' class='latex' />, un cost massa alt si el comparem amb el de la cerca dicotòmica (<img src='http://s.wordpress.com/latex.php?latex=O%28l%20%5Ccdot%20%5Clog_2%20n%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(l \cdot \log_2 n)' title='O(l \cdot \log_2 n)' class='latex' />).</p>
<p><strong id="damerau-levenshtein-ukkonen">Millora d&#8217;Ukkonen</strong></p>
<p>El primer que hem de tenir clar és que no necessitem saber la distància exacta entre dues paraules. Imaginem que un usuari s&#8217;equivoca escrivint la paraula que busca i escriu <em>ocel</em>. Què serà més probable, que l&#8217;usuari estigués buscant una paraula que està a una distància 1 (p.ex: <em>ocell</em>) o que estigués buscant una paraula a una distància 5 (p.ex: <em>tomaca</em>)? Realment, sols estem interessats en saber si la distància entre dues cadenes <em>X</em> i <em>Y</em> és menor o igual que un cert llindar <em>k</em>.</p>
<p>Si estem calculant la distància entre dues cadenes i tenim una fila per a la qual, cap element és menor o igual que <em>k</em>, llavors cap element de les següents files serà menor o igual que <em>k</em>.</p>
<p>A més, siga <img src='http://s.wordpress.com/latex.php?latex=C_i%20%3D%20j&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C_i = j' title='C_i = j' class='latex' />, l&#8217;última columna <em>j</em> per a la fila <em>i</em> tal que <img src='http://s.wordpress.com/latex.php?latex=D_%7Bi%2Cj%7D%20%5Cleq%20k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D_{i,j} \leq k' title='D_{i,j} \leq k' class='latex' />, llavors quan construïm la fila <em>i</em> sols haurem de fer-ho fins la columna <img src='http://s.wordpress.com/latex.php?latex=C_%7Bi-1%7D%2B1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C_{i-1}+1' title='C_{i-1}+1' class='latex' />, ja que els elements de les columnes posteriors tindran un valor <img src='http://s.wordpress.com/latex.php?latex=D_%7Bi%2Cj%7D%20%3E%20k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D_{i,j} &gt; k' title='D_{i,j} &gt; k' class='latex' />.</p>
<p>Ací teniu un exemple de com quedaria la matriu per a les cadenes <em>hola</em> i <em>poal</em>, amb un valor de <em>k</em> igual a 1.</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20%5Cbegin%7Barray%7D%7B%7Cc%7C%7Cc%7Cc%7Cc%7Cc%7Cc%7Cc%7C%7D%20%20%5Chline%20C%20%26%20D%20%26%20%5Cepsilon%20%26%20p%20%26%20o%20%26%20a%20%26%20l%20%5C%5C%20%20%5Chline%201%20%26%20%5Cepsilon%20%26%200%20%26%201%20%26%20%20%26%20%20%26%20%20%5C%5C%20%20%5Chline%201%20%26%20h%20%26%201%20%26%201%20%26%202%20%26%20%20%26%20%5C%5C%20%20%5Chline%202%20%26%20o%20%26%202%20%26%202%20%26%201%20%26%20%20%26%20%5C%5C%20%20%5Chline%200%20%26%20l%20%26%203%20%26%203%20%26%202%20%26%202%20%26%20%5C%5C%20%20%5Chline%200%20%26%20a%20%26%20%20%26%20%20%26%20%20%26%20%20%26%20%5C%5C%20%20%5Chline%20%20%5Cend%7Barray%7D%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{array}{|c||c|c|c|c|c|c|}  \hline C &amp; D &amp; \epsilon &amp; p &amp; o &amp; a &amp; l \\  \hline 1 &amp; \epsilon &amp; 0 &amp; 1 &amp;  &amp;  &amp;  \\  \hline 1 &amp; h &amp; 1 &amp; 1 &amp; 2 &amp;  &amp; \\  \hline 2 &amp; o &amp; 2 &amp; 2 &amp; 1 &amp;  &amp; \\  \hline 0 &amp; l &amp; 3 &amp; 3 &amp; 2 &amp; 2 &amp; \\  \hline 0 &amp; a &amp;  &amp;  &amp;  &amp;  &amp; \\  \hline  \end{array}  ' title='  \begin{array}{|c||c|c|c|c|c|c|}  \hline C &amp; D &amp; \epsilon &amp; p &amp; o &amp; a &amp; l \\  \hline 1 &amp; \epsilon &amp; 0 &amp; 1 &amp;  &amp;  &amp;  \\  \hline 1 &amp; h &amp; 1 &amp; 1 &amp; 2 &amp;  &amp; \\  \hline 2 &amp; o &amp; 2 &amp; 2 &amp; 1 &amp;  &amp; \\  \hline 0 &amp; l &amp; 3 &amp; 3 &amp; 2 &amp; 2 &amp; \\  \hline 0 &amp; a &amp;  &amp;  &amp;  &amp;  &amp; \\  \hline  \end{array}  ' class='latex' /></p>
<p>Si consultem el valor de l&#8217;element <img src='http://s.wordpress.com/latex.php?latex=D_%7Bi%2Cj%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D_{i,j}' title='D_{i,j}' class='latex' /> aquest sols és vàlid si <img src='http://s.wordpress.com/latex.php?latex=C_i%20%3E%200&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C_i &gt; 0' title='C_i &gt; 0' class='latex' />. Si no és així, sabem que <img src='http://s.wordpress.com/latex.php?latex=D_%7Bi%2Cj%7D%20%3E%20k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D_{i,j} &gt; k' title='D_{i,j} &gt; k' class='latex' />.</p>
<p>Doncs bé, tenint en compte aquesta millora, el cost temporal de l&#8217;algorisme es redueix a <img src='http://s.wordpress.com/latex.php?latex=O%28k%5E2%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(k^2)' title='O(k^2)' class='latex' />, segons diu la <a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.37.2019&#038;rep=rep1&#038;type=pdf" target="_blank">publicació</a> d&#8217;on vaig treure l&#8217;algorisme.</p>
<p>Així i tot, no resulta interessant aplicar aquest algorisme sobre tots els noms ja que el cost estaria en <img src='http://s.wordpress.com/latex.php?latex=O%28n%20%5Ctimes%20k%5E2%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(n \times k^2)' title='O(n \times k^2)' class='latex' />. Per a <em>k</em> xicotetes és molt menor que <img src='http://s.wordpress.com/latex.php?latex=O%28n%20%5Ctimes%20l%5E2%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(n \times l^2)' title='O(n \times l^2)' class='latex' /> de la idea original, però que encara es pot millorar.</p>
<p>Necessitava tenir els noms de les persones representats d&#8217;alguna manera per a estalviar-me treball reduir aquest cost. I ací és on entren en joc els <em><a href="http://en.wikipedia.org/wiki/Trie" target="_blank">tries</a></em>.</p>
<p><strong id="trie">Trie</strong></p>
<p>Un <em>trie</em> no és més que un arbre de prefixes. El node arrel representa el prefixe de la cadena buida (o <img src='http://s.wordpress.com/latex.php?latex=%5Cepsilon&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\epsilon' title='\epsilon' class='latex' />). Cada aresta de l&#8217;arbre s&#8217;etiqueta amb un símbol de l&#8217;alfabet <img src='http://s.wordpress.com/latex.php?latex=%5CSigma&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\Sigma' title='\Sigma' class='latex' />, de manera que el node representa el prefix format per la concatenació de tots els símbols en les arestes des de l&#8217;arrel fins a l&#8217;esmentat node.</p>
<p>Vegem-ho més clar en un exemple. Suposem que tenim els noms de <a href="http://en.wikipedia.org/wiki/Alan_Turing" target="_blank">Alan</a>, <a href="http://en.wikipedia.org/wiki/Andrew_S._Tanenbaum" target="_blank">Andrew</a>, <a href="http://en.wikipedia.org/wiki/Leslie_Lamport" target="_blank">Leslie</a>, <a href="http://en.wikipedia.org/wiki/Johan_H%C3%A5stad" target="_blank">Johan</a> i <a href="http://en.wikipedia.org/wiki/John_Hopcroft" target="_blank">John</a>. El trie que representaria tots aquests noms és el següent.<br />
<img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/trie1.png" alt="" title="trie1" width="350" height="633" class="aligncenter size-full wp-image-1564" /></p>
<p>Com vegeu, les fulles de l&#8217;arbre corresponen al nom complet d&#8217;alguna de les persones: <em>allan</em>, <em>john</em>, <em>johan</em>, <em>andrew</em> i <em>leslie</em> (recorreguent l&#8217;arbre en amplada).</p>
<p>Un dels avantatges d&#8217;utilitzar un arbre de prefixes és que el cost de buscar una persona no depèn del nombre de persones. Amb una cadena de longitud <em>l</em>, el cost de la cerca és <img src='http://s.wordpress.com/latex.php?latex=O%28l%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(l)' title='O(l)' class='latex' />. Simplement hem de descendir de nivell en nivell en l&#8217;arbre per a cada lletra del nom. </p>
<p><strong id="radixtree">Compressió de camins</strong></p>
<p>El problema dels tries, com ja podreu deduir de la imatge anterior és l&#8217;espai que ocupen en memòria. Suposant de nou que totes les cadenes tenen la mateixa longitud <em>l</em>, en el pitjor dels casos, cap de les <em>n</em> cadenes codificades en l&#8217;arbre tindrà un prefixe comú i en aquest cas el nombre de nodes és <img src='http://s.wordpress.com/latex.php?latex=O%28n%20%5Ccdot%20l%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(n \cdot l)' title='O(n \cdot l)' class='latex' /> (encara que això sols passar quan <img src='http://s.wordpress.com/latex.php?latex=n%20%5Cleq%20%5Cvert%20%5CSigma%20%5Cvert&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='n \leq \vert \Sigma \vert' title='n \leq \vert \Sigma \vert' class='latex' />). </p>
<p>A primera vista sembla que no és gran cosa, ja que té el mateix cost temporal que mantenir els noms en un vector. El problema és que necessitem emmagatzemar per a cada node quins són els seus descendents.</p>
<p>Si volem mantenir el cost de cerca <img src='http://s.wordpress.com/latex.php?latex=O%28l%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(l)' title='O(l)' class='latex' />, necessitem determinar en cost <img src='http://s.wordpress.com/latex.php?latex=O%281%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(1)' title='O(1)' class='latex' /> per quina branca em de descendir quan busquem una cadena. La resposta en aquest cas és evident: Mantenir un vector de punters amb tants elements com símbols té l&#8217;alfabet amb el que treballem. Si hi ha algun descendent en el node per al símbol <em>i</em>, el punter <img src='http://s.wordpress.com/latex.php?latex=p_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_i' title='p_i' class='latex' /> apuntarà a aquest descendent. Mentre que si <img src='http://s.wordpress.com/latex.php?latex=p_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_i' title='p_i' class='latex' /> és nul, sabem que no hi ha cap descendent del node actual per al símbol <em>i</em>. D&#8217;aquesta manera, el cost espacial de mantenir l&#8217;arbre de prefixos és <img src='http://s.wordpress.com/latex.php?latex=O%28%20l%20%5Ccdot%20n%20%5Ccdot%20%5Cvert%20%5CSigma%20%5Cvert%20%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O( l \cdot n \cdot \vert \Sigma \vert )' title='O( l \cdot n \cdot \vert \Sigma \vert )' class='latex' />.</p>
<p>El cost ja no és tan atractiu com semblava. Suposem que el nostre alfabet té 26 caràcters (de la <em>a</em> a la <em>z</em>), que tenim 3 milions de persones i la longitud mitjana dels noms és de 30 caràcters. Suposant que els punters són de 4 bytes, com serien en un processador de 32 bits, mantenir aquesta estructura podria necessitar al voltant de 9GB! </p>
<p>Evidentment, en la realitat el nombre de nodes és molt menor ja que els noms sí que tenen prefixos en comú així i tot en la realitat no només tenim 26 caràcters en l&#8217;alfabet: els noms de les persones de <a href="http://www.imdb.com" target="_blank">IMDB</a> inclouen també números, espais, símbols d&#8217;exclamació, caràcters accentuats i caràcters d&#8217;altres alfabets que no són el llatí (ciríl·lic o grec, per exemple).</p>
<p>Com solucionem aquest problema? En primer lloc, tractant de reduir el nombre de nodes i això pot fer-se fàcilment utilitzant compressió de camins en l&#8217;arbre. Què és la compressió de camins? Fixeu-se en el primer arbre que us he presentat. Veureu que molts dels nodes sols tenen un descendent. No seria possible unir en un únic node tots els nodes que tenen un únic descendent? Això és la compressió de camins i aquest <em>trie</em> s&#8217;anomena <em><a href="http://en.wikipedia.org/wiki/Radix_tree" target="_blank">Radix Tree</a></em>. Veieu com quedaria l&#8217;arbre anterior amb els camins comprimits.<br />
<img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/10/trie2.png" alt="" title="trie2" width="350" height="304" class="aligncenter size-full wp-image-1567" /></p>
<p><strong id="reduint-espai-nodes">Reduint l&#8217;espai dels nodes</strong></p>
<p>Una altra millora que pot fer-se per a reduir l&#8217;espai és intentar reduir el nombre de punters que s&#8217;emmagatzemen en cada node. Havíem dit que si volem mantenir el cost de cerca en <img src='http://s.wordpress.com/latex.php?latex=O%28l%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(l)' title='O(l)' class='latex' /> necessitem un vector de <img src='http://s.wordpress.com/latex.php?latex=%5Cvert%20%5CSigma%20%5Cvert&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\vert \Sigma \vert' title='\vert \Sigma \vert' class='latex' /> punters. Però no podem reduir aquest nombre? La resposta és sí, però a costa d&#8217;incrementar el cost de cerca.</p>
<p>Una possible millora és emmagatzemar els punters en un arbre de cerca (en el meu cas he utilitzat el map de la STL de C++). Així, en cada node sols s&#8217;emmagatzema un punter per a cada descendent i no per a cada símbol de l&#8217;alfabet (per tant, no tenim punters nuls que ocupen memòria). Si en un node no hi ha cap punter per al símbol que busquem, llavors no hi ha descendent per a aquest símbol. D&#8217;aquesta manera el nombre de punters en cada node es redueix considerablement, especialment a mesura que es descendeix en l&#8217;arbre, que és també quan més nodes hi ha. Penseu que és probable que tinguem noms començant en totes les lletres (el node arrel tindrà tants descendents com símbols té l&#8217;alfabet), en canvi és poc probable que tinguem molts noms amb el mateix prefix i amb l&#8217;última lletra diferent (els nodes de nivells inferiors tindran pocs descendents).</p>
<p>El problema és que ara el cost de cercar una cadena en el trie és <img src='http://s.wordpress.com/latex.php?latex=O%28l%20%5Ccdot%20%5Clog_2%20p%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(l \cdot \log_2 p)' title='O(l \cdot \log_2 p)' class='latex' />, on <em>p</em> és el nombre de punters en els nodes (<img src='http://s.wordpress.com/latex.php?latex=p%20%5Cleq%20%5Cvert%20%5CSigma%20%5Cvert&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p \leq \vert \Sigma \vert' title='p \leq \vert \Sigma \vert' class='latex' />, normalment prou menor). </p>
<p>Amb totes aquestes millores, el meu programa ocupa ara mateixa 3686MB en memòria, que és bastant menys dels 9GB que comentàvem al començament. Hi ha que tenir en compte a més, que aquests 3686MB no són només del <em>trie</em> sinó també de mantenir els títols de les pel·lícules, el graf que relaciona pel·lícules i actors i tota la informació corresponent a cada persona i pel·lícula. </p>
<p>Comentaré també que em vaig endur una desagradable sorpresa al passar el programa d&#8217;una màquina de 32 bits a una de 64 bits: els punters van passar d&#8217;ocupar 4 bytes a ocupar-ne 8 i clar, emmagatzemar el mateix arbre necessitava el doble de memòria!</p>
<p><strong id="approximate-matching">Cerca aproximada</strong></p>
<p>Hem parlat molt de com emmagatzemar eficientment el <em>trie</em>, però encara no hem solucionat el problema que havíem plantejat: fer una cerca aproximada donada una cadena <em>X</em>. Ací és on unim l&#8217;algorisme de Damerau-Levenshtein explicat <a href="http://www.elvoldelhomeocell.net/?p=1553#damerau-levenshtein-ukkonen">abans</a> i els <em><a href="http://www.elvoldelhomeocell.net/?p=1553#trie">tries</a></em>.</p>
<p>Hi ha dos coses importants a tenir en compte a l&#8217;hora de calcular la distància de Damerau-Levenshtein sobre distintes cadenes:</p>
<ol>
<li>Al calcular la distància entre la cadena <em>X</em> i la cadena <em>YZ</em>, les <em>|Y|+1</em> primeres files de la matriu de Damerau-Levenshtein seran iguals a les del càlcul de la distància entre la cadena <em>X</em> i la cadena <em>Y</em>.</li>
<li>Si per al càlcul de la distància entre una cadena <em>X</em> i una cadena <em>Y</em>, totes les columnes de la fila <em>|Y|</em> tenen un valor major que <em>k</em>, cap cadena amb el prefix <em>Y</em> estarà a una distància menor que <em>k</em> de <em>X</em>.</li>
</ol>
<p>El <em>trie</em> permet estalviar temps ja què la matriu de Damerau-Levenshtein va calculant-se iterativament quan descendim en l&#8217;arbre, pel que havíem comentat en la propietat (1). A més, tenint en compte la propietat (2), si per a un node la distància a la cadena buscada és major que un cert llindar <em>k</em> llavors sabem que cap dels descendents d&#8217;aquest node tindrà un llindar menor, de manera que no hem d&#8217;explorar els descendents. </p>
<p><img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/approximate_lookup_algorithm.png" alt="" title="approximate_lookup_algorithm" width="454" height="274" class="aligncenter size-full wp-image-1655" /></p>
<p>Algunes consideracions sobre les operacions que apareixen en el pseudocodi. L&#8217;operació <img src='http://s.wordpress.com/latex.php?latex=update%28D%2C%20C%2C%20x%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='update(D, C, x)' title='update(D, C, x)' class='latex' /> el que fa és actualitzar la matriu <em>D</em> afegint <em>|x|</em> files i computant el valor dels nous elements i el vector <em>C</em> com he explicat en la millora de Ukkonen.</p>
<p>L&#8217;operació <img src='http://s.wordpress.com/latex.php?latex=dist%28D%27%2C%20C%27%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='dist(D&#039;, C&#039;)' title='dist(D&#039;, C&#039;)' class='latex' /> el que fa es tornar el valor de l&#8217;element <img src='http://s.wordpress.com/latex.php?latex=D%27_%7B%7Cv%7C%20%2C%20%7Cw%7C%20%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D&#039;_{|v| , |w| }' title='D&#039;_{|v| , |w| }' class='latex' /> tenint en compte que potser aquest element no ha arribat a calcular-se en l&#8217;operació <em>update</em>. Aquest valor és la distància que hi ha entre les cadenes <em>v</em> i <em>w</em> si aquesta distància és menor o igual que <em>k</em>, o <em>k+1</em> en cas contrari.</p>
<p>La gràcia d&#8217;aquest algorisme és que té una complexitat temporal de <img src='http://s.wordpress.com/latex.php?latex=O%28k%20%5Ctimes%20%7B%5Cvert%20%5CSigma%20%5Cvert%7D%5Ek%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(k \times {\vert \Sigma \vert}^k)' title='O(k \times {\vert \Sigma \vert}^k)' class='latex' />, segons l&#8217;article que us citava <a href="http://www.elvoldelhomeocell.net/?p=1553#damerau-levenshtein-ukkonen">abans</a>. Això suposant que l&#8217;arbre de prefixos és complet i que cada node emmagatzema un vector de punters als possibles descendents (és a dir, sense tenir en compte les millores per a <a href="http://www.elvoldelhomeocell.net/?p=1553#radixtree">reduir</a> <a href="http://www.elvoldelhomeocell.net/?p=1553#reduint-espai-nodes">espai</a>). </p>
<p>Fixeu-vos que l&#8217;algorisme no depèn del nombre de cadenes en el <em>trie</em>! Això significa que podem trobar els noms que més s&#8217;aproximen a una cerca feta per l&#8217;usuari sense importar quants noms tenim emmagatzemats. Una considerable millora front al cost <img src='http://s.wordpress.com/latex.php?latex=O%28n%20%5Ctimes%20k%5E2%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(n \times k^2)' title='O(n \times k^2)' class='latex' />, això sí, sempre que <em>k</em> siga menuda, perquè el cost creix de manera exponencial amb <em>k</em>!</p>
<p>El gràfic que es mostra ací baix és el temps mitjà de resposta per part de l&#8217;oracle quan es busca el nom d&#8217;un actor que no existeix en la base de dades. El valor de <em>k</em> que utilitze és <img src='http://s.wordpress.com/latex.php?latex=%5Cmin%283%2C%20%5Cleft%5Clfloor%20%5Cfrac%7B%7Cw%7C%7D%7B4%7D%20%5Cright%5Crfloor%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\min(3, \left\lfloor \frac{|w|}{4} \right\rfloor)' title='\min(3, \left\lfloor \frac{|w|}{4} \right\rfloor)' class='latex' />. Si usés un valor fixe per a <em>k</em> hi hauria molts suggeriments per a noms curts que realment no tenen massa sentit. Anem al cas extrem: imaginem que un usuari busca el nom <em>a</em>, té sentit suggerir-li els noms <em>b</em>, <em>c</em>, <em>d</em>, etc? La distància a tots ells és 1, però és que la longitud de la cadena era 1! Això significaria que l&#8217;usuari ha errat en el 100% de la cadena! Jo permet a l&#8217;usuari que s&#8217;equivoqui fins a un 25% de la longitud de la cadena. Però si la cadena cercada fos molt llarga el valor <em>k</em> seria molt gran, per això pose un límit al número d&#8217;errors a 3.</p>
<p><a href="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/lookup_times.png" rel="lightbox[1553]"><img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/lookup_times.png" alt="" title="lookup_times" width="400" height="250" class="aligncenter size-full wp-image-1660" /></a></p>
<p>Dir que l&#8217;<a href="http://en.wikipedia.org/wiki/Confidence_interval" target="_blank">interval de confiança</a> que es mostra és per a un valor crític del 95%. Crec que el gràfic no mereix més explicacions. El temps de resposta mitjà és de 0.208 segons amb totes les millores comentades. També apareix el temps de resposta utilitzant el càlcul de la distància de Damerau-Levenshtein sense la millora de Ukkonen (0.301 segons).</p>
<p><strong>Encara millor?</strong></p>
<p>Des del primer moment vaig tenir com a referència a Google i el seu &#8220;<em><a href="http://www.google.com/support/websearch/bin/answer.py?answer=1723" target="_blank">Did you mean&#8230;?</a></em>&#8220;. I tenia ben clar que els de Google no podien utilitzar un <em>trie</em> gegantí perquè el vocabulari amb el que treballen és enorme: imagineu totes les paraules diferents que poden haver en la WWW i el que suposaria construir un <em>trie</em> com el descrit! </p>
<p>Google utilitza un <a href="http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en/us/pubs/archive/36180.pdf" target="_blank">enfocament</a> basat en <a href="http://en.wikipedia.org/wiki/Machine_learning" target="_blank">aprenentatge automàtic</a> i <a href="http://en.wikipedia.org/wiki/Natural_language_processing" target="_blank">processament del llenguatge natural</a>. I aquesta va ser la ruta que em vaig proposar seguir i que us explicaré en el pròxim post.</p>
<p>Mentrestant els <em>tries</em> han funcionat prou bé: són ràpids i sobretot obtenen els resultats que l&#8217;usuari espera. I poden ser una alternativa senzilla en situacions amb un vocabulari i un alfabet més reduït. Per exemple, per a construir un corrector automàtic en un editor de textos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1553/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Correcció automàtica en l&#8217;Oracle: cerca dicotòmica</title>
		<link>http://www.elvoldelhomeocell.net/archives/1515</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1515#comments</comments>
		<pubDate>Mon, 31 Oct 2011 00:59:53 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[Programació]]></category>
		<category><![CDATA[Projectes]]></category>
		<category><![CDATA[algorismes]]></category>
		<category><![CDATA[cerca aproximada]]></category>
		<category><![CDATA[cerca binària]]></category>
		<category><![CDATA[cerca dicotòmica]]></category>
		<category><![CDATA[complexitat computacional]]></category>
		<category><![CDATA[correcció automàtica]]></category>
		<category><![CDATA[friki]]></category>
		<category><![CDATA[oracle de woody allen]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1515</guid>
		<description><![CDATA[La màxima &#8220;qui no te feina, Déu li&#8217;n busca&#8221; és ben certa, però a sovint alguns anem més enllà i ens en busquem de nova quan encara no hem acabat la que tenim entre mans. I si no tenia prou &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1515">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>La màxima &#8220;qui no te feina, Déu li&#8217;n busca&#8221; és ben certa, però a sovint alguns anem més enllà i ens en busquem de nova quan encara no hem acabat la que tenim entre mans. I si no tenia prou amb estar d&#8217;Erasmus, els <a href="http://ai-class.com" target="_blank">cursets</a> a <a href="http://ml-class.org" target="_blank">distància</a> de Stanford i la competició de <a href="http://aichallenge.org/" target="_blank">ai-challange.com</a>, farà un parell de setmanes que em ronda pel cap una nova millora per al meu Oracle de Woody Allen. Però bo, no vaig a queixar-me perquè no es pot dir que la feina vinga forçada.</p>
<p>Recordeu l&#8217;<a href="http://joapuipe.dyndns.org/allen/" target="_blank">Oracle de Woody Allen</a>? Ja us he parlat d&#8217;aquest xicotet projecte en <a href="http://www.elvoldelhomeocell.net/archives/990" target="_blank">altres</a> <a href="http://www.elvoldelhomeocell.net/archives/997" target="_blank">posts</a>, però us refrescaré la memòria. Es tracta d&#8217;una senzilla pàgina web que et permet trobar quina connexió uneix a dos persones del món del cinema (actors, directors, guionistes i productors). La idea és que si dos persones han treballat juntes en una pel·lícula, hi ha una distància de separació de 1. De la mateixa manera, Si la persona <em>A</em> ha treballat amb la persona <em>B</em>, i aquesta amb la pesona <em>C</em>, les persones <em>A</em> i <em>C</em> estan a una distància de 2. I així successivament.</p>
<p>No em centraré amb els detalls de com es calcula aquesta distància i la connexió (camí, en terminologia de grafs) perquè no és del que va aquest article, simplement dir que s&#8217;utilitza l&#8217;algorisme de <a href="http://en.wikipedia.org/wiki/Breadth-first_search" target="_blank">cerca per amplada</a>.</p>
<p>Des de les primeres versions, volia que el meu programa fora capaç de &#8220;tolerar&#8221; errades humanes. Per exemple, si un usuari escriu &#8220;Wody Allen&#8221; en lloc de &#8220;Woody Allen&#8221;, el meu programa fora capaç de suggerir-li una <a href="http://en.wikipedia.org/wiki/Spell_checker" target="_blank">correcció automàtica</a>. En els següents tres articles comentaré dues alternatives que ha utilitzat el programa per a solucionar el problema i finalment una tercera que encara no he implementat, però que us plantejaré ja que encara queden alguns detalls per polir i amb un poc de sort algú es decideix a aportar alguna idea.</p>
<p>Avise que el contingut de les pròximes entrades és molt tècnic. Per als dos primers articles necessitareu coneixements bàsics d&#8217;algorísmica i complexitat computacional, res que un alumne de primer o segon d&#8217;Enginyeria Informàtica no puga entendre. Per al tercer, a més, necessitareu coneixements bàsics d&#8217;aprenentatge automàtic, que inclou estadística bàsica (bàsicament, teorema de Bayes). </p>
<p><strong>Cerca dicotòmica</strong></p>
<p>La primera tècnica que vaig utilitzar per a proveir de correccions a l&#8217;usuari era l&#8217;algorisme de <a href="http://en.wikipedia.org/wiki/Binary_search" target="_blank">cerca dicotòmica</a> o binària.</p>
<p>La idea és mantenir els noms de les persones en <a href="http://en.wikipedia.org/wiki/Lexicographical_order" target="_blank">ordre lexicogràfic</a>. No vaig a explicar l&#8217;algorisme de la cerca dicotòmica, perquè entenc que si heu arribat fins ací el coneixeu.</p>
<p>El que fa l&#8217;algorisme és suggerir com a correccions els noms més pròxims (en ordre lexicogràfic) al nom introduït per l&#8217;usuari. Per a veure com funciona l&#8217;algorisme, suposarem que els noms de les persones són nombres enters. Imaginem que tenim el següent conjunt de nombres en un vector ordenat (<img src='http://s.wordpress.com/latex.php?latex=i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='i' title='i' class='latex' /> indica l&#8217;índex de l&#8217;element i <img src='http://s.wordpress.com/latex.php?latex=p&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p' title='p' class='latex' /> el <em>nom</em> de la persona):</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20%5Cbegin%7Barray%7D%7B%7Cc%7Cc%7Cc%7Cc%7Cc%7Cc%7Cc%7C%7D%20%20%5Chline%20%20i%20%26%200%20%26%201%20%26%202%20%26%203%20%26%204%20%26%205%20%5C%5C%20%20%5Chline%20%20p%20%26%201%20%26%202%20%26%203%20%26%205%20%26%207%20%26%209%20%5C%5C%20%20%5Chline%20%20%5Cend%7Barray%7D%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{array}{|c|c|c|c|c|c|c|}  \hline  i &amp; 0 &amp; 1 &amp; 2 &amp; 3 &amp; 4 &amp; 5 \\  \hline  p &amp; 1 &amp; 2 &amp; 3 &amp; 5 &amp; 7 &amp; 9 \\  \hline  \end{array}  ' title='  \begin{array}{|c|c|c|c|c|c|c|}  \hline  i &amp; 0 &amp; 1 &amp; 2 &amp; 3 &amp; 4 &amp; 5 \\  \hline  p &amp; 1 &amp; 2 &amp; 3 &amp; 5 &amp; 7 &amp; 9 \\  \hline  \end{array}  ' class='latex' /></p>
<p>Suposem que busquem la persona amb <em>nom</em> 6, llavors l&#8217;algorisme s&#8217;executaria de la següent forma:</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20%5Cbegin%7Barray%7D%7B%7Cc%7Cc%7Cc%7Cc%7Cc%7C%7D%20%20%5Chline%20%5Ctext%7BIter.%7D%20%26%20l%20%26%20r%20%26%20c%20%26%20p_c%20%5C%5C%20%20%5Chline%201%20%26%200%20%26%205%20%26%202%20%26%203%20%5C%5C%20%20%5Chline%202%20%26%203%20%26%205%20%26%204%20%26%207%20%5C%5C%20%20%5Chline%203%20%26%203%20%26%203%20%26%203%20%26%205%20%5C%5C%20%20%5Chline%20%20%5Cend%7Barray%7D%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{array}{|c|c|c|c|c|}  \hline \text{Iter.} &amp; l &amp; r &amp; c &amp; p_c \\  \hline 1 &amp; 0 &amp; 5 &amp; 2 &amp; 3 \\  \hline 2 &amp; 3 &amp; 5 &amp; 4 &amp; 7 \\  \hline 3 &amp; 3 &amp; 3 &amp; 3 &amp; 5 \\  \hline  \end{array}  ' title='  \begin{array}{|c|c|c|c|c|}  \hline \text{Iter.} &amp; l &amp; r &amp; c &amp; p_c \\  \hline 1 &amp; 0 &amp; 5 &amp; 2 &amp; 3 \\  \hline 2 &amp; 3 &amp; 5 &amp; 4 &amp; 7 \\  \hline 3 &amp; 3 &amp; 3 &amp; 3 &amp; 5 \\  \hline  \end{array}  ' class='latex' /></p>
<p>Com que l&#8217;últim element considerat (<img src='http://s.wordpress.com/latex.php?latex=p_c%5E%7B%283%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_c^{(3)}' title='p_c^{(3)}' class='latex' />) és menor que el cercat, es proposarien com a correccions els elements 5 (posició <img src='http://s.wordpress.com/latex.php?latex=c%5E%7B%283%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c^{(3)}' title='c^{(3)}' class='latex' />) i 7 (posició <img src='http://s.wordpress.com/latex.php?latex=c%5E%7B%283%29%7D%20%2B%201&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c^{(3)} + 1' title='c^{(3)} + 1' class='latex' />). En el cas de que l&#8217;últim element considerat fora major que el cercat, es proposarien com a correccions els elements en les posicions <img src='http://s.wordpress.com/latex.php?latex=c%5E%7B%283%29%7D%20-%201&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c^{(3)} - 1' title='c^{(3)} - 1' class='latex' /> i <img src='http://s.wordpress.com/latex.php?latex=c%5E%7B%283%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c^{(3)}' title='c^{(3)}' class='latex' />.</p>
<p>Fixeu-se que en cas de no trobar un element, sempre proposarem un element menor i un major. I a més, sempre seran els dos que més s&#8217;aproximen a l&#8217;element cercat.</p>
<p>El problema és que els noms no són enters i l&#8217;ordre lexicogràfic té un xicotet problema: Dos noms als que sols els hem canviat una lletra poden estar molt separats en ordre lexicogràfic. Ací un exemple que il·lustra el problema:</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20%5Cbegin%7Barray%7D%7B%7Cc%7Cc%7Cc%7Cc%7Cc%7C%7D%20%20%5Chline%20i%20%26%200%20%26%201%20%26%202%20%26%203%20%5C%5C%20%20%5Chline%20p%20%26%20%5Ctext%7Bblai%7D%20%26%20%5Ctext%7Bjaume%7D%20%26%20%5Ctext%7Bjavi%7D%20%26%20%5Ctext%7Btoni%7D%20%5C%5C%20%20%5Chline%20%20%5Cend%7Barray%7D%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{array}{|c|c|c|c|c|}  \hline i &amp; 0 &amp; 1 &amp; 2 &amp; 3 \\  \hline p &amp; \text{blai} &amp; \text{jaume} &amp; \text{javi} &amp; \text{toni} \\  \hline  \end{array}  ' title='  \begin{array}{|c|c|c|c|c|}  \hline i &amp; 0 &amp; 1 &amp; 2 &amp; 3 \\  \hline p &amp; \text{blai} &amp; \text{jaume} &amp; \text{javi} &amp; \text{toni} \\  \hline  \end{array}  ' class='latex' /></p>
<p>Suposem que en l&#8217;anterior situació, un usuari s&#8217;equivoca escrivint el nom de <em>J<strong>a</strong>ume</em> i escriu <em>J<strong>e</strong>ume</em>:</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20%5Cbegin%7Barray%7D%7B%7Cc%7Cc%7Cc%7Cc%7Cc%7C%7D%20%20%5Chline%20%5Ctext%7BIter.%7D%20%26%20l%20%26%20r%20%26%20c%20%26%20p_c%20%5C%5C%20%20%5Chline%201%20%26%200%20%26%203%20%26%201%20%26%20%5Ctext%7Bjaume%7D%20%5C%5C%20%20%5Chline%202%20%26%202%20%26%203%20%26%202%20%26%20%5Ctext%7Bjavi%7D%20%5C%5C%20%20%5Chline%203%20%26%203%20%26%203%20%26%203%20%26%20%5Ctext%7Btoni%7D%20%5C%5C%20%20%5Chline%20%20%5Cend%7Barray%7D%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{array}{|c|c|c|c|c|}  \hline \text{Iter.} &amp; l &amp; r &amp; c &amp; p_c \\  \hline 1 &amp; 0 &amp; 3 &amp; 1 &amp; \text{jaume} \\  \hline 2 &amp; 2 &amp; 3 &amp; 2 &amp; \text{javi} \\  \hline 3 &amp; 3 &amp; 3 &amp; 3 &amp; \text{toni} \\  \hline  \end{array}  ' title='  \begin{array}{|c|c|c|c|c|}  \hline \text{Iter.} &amp; l &amp; r &amp; c &amp; p_c \\  \hline 1 &amp; 0 &amp; 3 &amp; 1 &amp; \text{jaume} \\  \hline 2 &amp; 2 &amp; 3 &amp; 2 &amp; \text{javi} \\  \hline 3 &amp; 3 &amp; 3 &amp; 3 &amp; \text{toni} \\  \hline  \end{array}  ' class='latex' /></p>
<p>Llavors, les correccions proposades serien <em>Javi</em> i <em>Toni</em> i cap dels dos és el que l&#8217;usuari buscava.</p>
<p>Una possible millora és no sols considerar els dos noms al voltant del cercat, sinó considerar <em>k</em> noms més pròxims en ordre lexicogràfic (per exemple, amb <em>k</em> igual a 3, l&#8217;algorisme consideraria <em>Jaume</em>, <em>Javi</em> i <em>Toni</em>). Però aquesta solució no funciona massa bé quan el nombre d&#8217;elements en el vector és de més de dos milions i l&#8217;usuari s&#8217;equivoca en una de les primeres lletres del nom.</p>
<p>No obstant això, l&#8217;algorisme és molt eficient en quant a temps i memòria i sobre tot, és molt senzill. Suposant que tots els noms tenen aproximadament la mateixa longitud <em>l</em>, podem expressar la complexitat espacial i temporal (de cerca) en funció del nombre de persones <em>n</em> i aquesta longitud <em>l</em> (la suposició de la longitud <em>l</em> és sols per a simplificar les expressions de la complexitat).</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20S%28n%2C%20l%29%20%5Cin%20O%20%5Cleft%28%20l%20%5Ccdot%20n%20%5Cright%29%20%5C%5C%20%20T%28n%2C%20l%29%20%5Cin%20O%20%5Cleft%28%20l%20%5Ccdot%20%5Clog_2%20n%20%5Cright%29%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  S(n, l) \in O \left( l \cdot n \right) \\  T(n, l) \in O \left( l \cdot \log_2 n \right)  ' title='  S(n, l) \in O \left( l \cdot n \right) \\  T(n, l) \in O \left( l \cdot \log_2 n \right)  ' class='latex' /></p>
<p>La primera expressió es deriva del fet que tenim <em>n</em> noms i cada nom té una longitud de <em>l</em> caràcters. La segona expressió es deriva del fet que la cerca dicotòmica fa <img src='http://s.wordpress.com/latex.php?latex=O%28%5Clog_2%20n%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(\log_2 n)' title='O(\log_2 n)' class='latex' /> comparacions de cadenes, i per comparar dues cadenes de longitud <em>l</em> necessitem fins a <em>l</em> comparacions de caràcters.</p>
<p>Aquesta senzilla idea fou reemplaçada per una que donava millors resultats cara a l&#8217;usuari, però que té un fort inconvenient: l&#8217;ús de memòria. L&#8217;alternativa que presentaré en la pròxima entrada, és la que està implementada ara mateixa en l&#8217;Oracle.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1515/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>L&#8217;Oracle de Woody Allen: últims canvis</title>
		<link>http://www.elvoldelhomeocell.net/archives/997</link>
		<comments>http://www.elvoldelhomeocell.net/archives/997#comments</comments>
		<pubDate>Sat, 18 Sep 2010 18:58:53 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Estudis]]></category>
		<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[Programació]]></category>
		<category><![CDATA[Projectes]]></category>
		<category><![CDATA[bacon]]></category>
		<category><![CDATA[bacon number]]></category>
		<category><![CDATA[enginyeria informàtica]]></category>
		<category><![CDATA[estiu]]></category>
		<category><![CDATA[fiv]]></category>
		<category><![CDATA[friki]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[google code]]></category>
		<category><![CDATA[llen number]]></category>
		<category><![CDATA[número de bacon]]></category>
		<category><![CDATA[oracle de bacon]]></category>
		<category><![CDATA[oracle de woody allen]]></category>
		<category><![CDATA[oracle of woody allen]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[upv]]></category>
		<category><![CDATA[woody allen]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=997</guid>
		<description><![CDATA[Imagine que tots els que visiteu aquest blog us haureu passat per la web de l&#8217;Oracle de Woody Allen i espere que quan entràreu estiguera funcionant. Després explicaré perquè no està en funcionament el 100% del temps. Aquests darrers dies &#8230; <a href="http://www.elvoldelhomeocell.net/archives/997">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Imagine que tots els que visiteu aquest blog us haureu passat per la web de l&#8217;<a href="http://www.jpuigcerver.net/allen" target="_blank">Oracle de Woody Allen</a> i espere que quan entràreu estiguera funcionant. Després explicaré perquè no està en funcionament el 100% del temps.</p>
<p>Aquests darrers dies he estat documentant el codi font, corregint algunes coses, preparant els fitxers de l&#8217;<a href="http://en.wikipedia.org/wiki/Automake" target="_blank">Automake</a>, etc. És a dir, feina que no mola però que s&#8217;ha de fer si vols que algú més a part de tu siga capaç de llegir i entendre el que fas.</p>
<p>Doncs bé, fruit d&#8217;aquest treball he obert un <a href="http://code.google.com/p/oracleofwoodyallen/" target="_blank">projecte al Google Code</a> que a partir d&#8217;ara serà la pàgina oficial del projecte, d&#8217;aquesta manera acabe de trencar completament amb l&#8217;antic &#8220;<a href="http://svn.assembla.com/svn/oraclebacon" target="_blank">Número de Bacon</a>&#8220;. En aquesta pàgina web podreu trobar les últimes novetats pel que fa al desenvolupament del projecte.</p>
<p>També he penjat a Internet la <a href="http://joapuipe.dyndns.org/allen/doc/html" target="_blank">documentació HTML</a> de l&#8217;Oracle i també <a href="http://joapuipe.dyndns.org/allen/doc/latex/refman.pdf">una versió en PDF</a>.</p>
<p>He intentat escriure-ho tot en anglès el menys <em>macarroni</em> possible, però si en valencià ja se me&#8217;n passen de burrades, en anglès de segur que també. Els suggeriments i correccions són benvinguts/des.</p>
<p>I ara el que us havia d&#8217;explicar al principi. Per què no està en funcionament l&#8217;Oracle tot el dia? Resposta ràpida: No tinc un ordinador amb prou memòria RAM disponible per a tenir-lo connectat 24h.</p>
<p>En casa tinc un ordinador (<em>clarke</em>) que està connectat les 24h realitzant càlcul científic en la xarxa <a href="http://boinc.berkeley.edu/" target="_blank">BOINC</a>, l&#8217;utilitze de servidor web i servidor ftp, etc. Però aquest ordinador té 2GB de memòria RAM i el client BOINC i els càlculs científics ocupen entre 500 i 600MB.</p>
<p>Com que la base de dades de l&#8217;Oracle es carrega en memòria i es prou gran (el programa ocupa 1,4GB) no en cap tot en la memòria de <em>clarke</em> (peu de nota, els meus ordinadors tenen noms de científics i escriptors de ciència ficció). Quan us connectàreu a l&#8217;Oracle, aquest s&#8217;estava executant en un altre ordinador que tinc amb 4GB de RAM.</p>
<p>Què pense fer? En primer lloc, he començat a mirar-me la documentació d&#8217;un gestor de bases de dades anomenat <a href="http://www.eyedb.org/" target="_blank">EyeDB</a>. Aquest gestor no utilitza el típic <a href="http://en.wikipedia.org/wiki/Relational_model" target="_blank">paradigma relacional</a>, sinó que utilitza el paradigma <a href="http://en.wikipedia.org/wiki/Object_database" target="_blank">Orientat a Objectes</a>. En poques paraules i per al cas, això significa que és molt més ràpid que <a href="http://www.mysql.com/" target="_blank">MySQL</a>, per exemple. Possiblement adapte l&#8217;Oracle per a treballar amb aquesta base de dades. El funcionament serà un poc més lent, però consumirà menys memòria RAM.</p>
<p>En segon lloc, si algú té una placa base amb <a href="http://en.wikipedia.org/wiki/LGA_775" target="_blank">Socket 775</a> per a un Pentium 4 de 64 bits i que suporte almenys 4GB de memòria RAM, estic interessat en adquirir-la. Si no, una placa base nova d&#8217;aquestes característiques costa uns 50 euros. S&#8217;accepten donacions.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/997/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>L&#8217;Oracle de Woody Allen</title>
		<link>http://www.elvoldelhomeocell.net/archives/990</link>
		<comments>http://www.elvoldelhomeocell.net/archives/990#comments</comments>
		<pubDate>Fri, 27 Aug 2010 23:24:14 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Cinema i televisió]]></category>
		<category><![CDATA[Estudis]]></category>
		<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[Programació]]></category>
		<category><![CDATA[Projectes]]></category>
		<category><![CDATA[allen number]]></category>
		<category><![CDATA[bacon]]></category>
		<category><![CDATA[bacon number]]></category>
		<category><![CDATA[enginyeria informàtica]]></category>
		<category><![CDATA[estiu]]></category>
		<category><![CDATA[fiv]]></category>
		<category><![CDATA[friki]]></category>
		<category><![CDATA[número de bacon]]></category>
		<category><![CDATA[oracle de bacon]]></category>
		<category><![CDATA[oracle de woody allen]]></category>
		<category><![CDATA[oracle of woody allen]]></category>
		<category><![CDATA[upv]]></category>
		<category><![CDATA[woody allen]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=990</guid>
		<description><![CDATA[Normalment els estius aprofite per començar tots els projectes que em passen pel cap durant el curs, però malauradament, no acostume a acabar-ne mai cap i l&#8217;any següent tornem a ser igual. Aquest any ha estat un poc diferent: He &#8230; <a href="http://www.elvoldelhomeocell.net/archives/990">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Normalment els estius aprofite per començar tots els projectes que em passen pel cap durant el curs, però malauradament, no acostume a acabar-ne mai cap i l&#8217;any següent tornem a ser igual. Aquest any ha estat un poc diferent: He començat alguna coseta, sí, però sobretot m&#8217;he centrat en <em>finiquitar </em>projectes que tenia començats.</p>
<p>I així ha passat amb l&#8217;<em>Oracle</em>. Ja us vaig parlar sobre el <a href="http://www.elvoldelhomeocell.net/archives/310" target="_blank">Número de Bacon i l&#8217;Oracle</a> que havia fet quan feia Programació en primer. Us vaig comentar que havia reescrit el codi que havia fet en Programació per fer-lo més ràpid, que consumís menys memòria i amb més funcionalitats. Volia construir un servidor que rebés peticions i les atenguera, a l&#8217;estil de la web <a href="http://www.oracleofbacon.org" target="_blank">The Oracle of Bacon</a>.</p>
<p>Doncs bé, aquest estiu (les dues últimes setmanes) m&#8217;he posat de nou a la feina i li he afegit algunes millores i he rematat la part del servidor, que no estava acabada. Ahir, aprofitant l&#8217;estrena a Espanya de l&#8217;última pel·lícula de <a href="http://ca.wikipedia.org/wiki/Woody_Allen" target="_blank">Woody Allen</a> (<em><a href="http://www.imdb.com/title/tt1182350/" target="_blank">Coneixeràs a l&#8217;home dels teus somnis</a></em>) vaig llançar la pàgina web titulada, en un moment de màxima inspiració, <a href="http://www.elvoldelhomeocell.net/works/allen" target="_blank">The Oracle of Woody Allen</a>.</p>
<p>El llançament ha estat un poc precipitat per fer-lo coincidir amb l&#8217;estrena de la pel·lícula (que encara no he vist), però ha estat una estratègia de &#8220;màrqueting&#8221;. Durant els propers dies estaré fent proves al servidor i a la pàgina web, així que és molt probable que quan la proveu el servidor no estiga funcionant (jo diria que es troba en fase pre-pre-Alpha).</p>
<p>Haig de solucionar encara un parell de <em>Segmentation Fault</em>s que apareixen en certes peticions i dels quals no he pogut descobrir el perquè i implementar en la web dues funcionalitats més a banda de la que apareix ara mateixa. Una vegada acabada la web, les funcionalitats seran:</p>
<ul>
<li>Calcular la distància entre dues persones en la base de dades.</li>
<li>Obtenir totes les persones a una distància <em>N</em> d&#8217;una determinada persona.</li>
<li>Calcular la distància mitjana d&#8217;una persona</li>
</ul>
<p>Les dues primeres funcionalitats també es troben disponibles en <a href="http://www.oracleofbacon.org" target="_blank">www.oracleofbacon.org</a> però no la tercera (degut al seu cost computacional, imagine) i en aquesta web tampoc hi ha la possibilitat d&#8217;explorar directors, productors i guionistes, sols actors. Jo, per diferenciar-me un poc de la pàgina web original, he decidit que les cerques es facen entre directors, productors i guionistes per defecte (ja que a Woody Allen se&#8217;l coneix principalment com a director i guionista).</p>
<p>En una altra ocasió (quan estiga 100% funcional) ja us contaré més detalls sobre el funcionament. Els més <em>geeks </em>podeu trobar el codi font en <a href="http://svn.assembla.com/svn/oraclebacon/trunk/" target="_blank">el servidor Subversion</a> (llicència GPL v3).</p>
<p>En fi, <em>stay tunned</em> i com diu en la pàgina web: <em>molt prompte estarà completament funcional (o no tan prompte)</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/990/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Síndrome postvacacional</title>
		<link>http://www.elvoldelhomeocell.net/archives/842</link>
		<comments>http://www.elvoldelhomeocell.net/archives/842#comments</comments>
		<pubDate>Mon, 31 Aug 2009 21:25:39 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Estudis]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[Projectes]]></category>
		<category><![CDATA[Reflexions]]></category>
		<category><![CDATA[Viatges]]></category>
		<category><![CDATA[algorismes]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[code jam]]></category>
		<category><![CDATA[dafi]]></category>
		<category><![CDATA[eda]]></category>
		<category><![CDATA[fiv]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[herpt]]></category>
		<category><![CDATA[holanda]]></category>
		<category><![CDATA[malroïn]]></category>
		<category><![CDATA[síndrome postvacacional]]></category>
		<category><![CDATA[upv]]></category>
		<category><![CDATA[urss]]></category>
		<category><![CDATA[vacances]]></category>
		<category><![CDATA[wodax]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=842</guid>
		<description><![CDATA[Demà serà 1 de Setembre, cosa que significa mals de cap per a molta gent. Els estudiants comencen a suar perquè durant les pròximes dues o tres setmanes aniran de cap amb els exàmens de setembre, qui no ha començat &#8230; <a href="http://www.elvoldelhomeocell.net/archives/842">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Demà serà 1 de Setembre, cosa que significa mals de cap per a molta gent. Els estudiants comencen a suar perquè durant les pròximes dues o tres setmanes aniran de cap amb els exàmens de setembre, qui no ha començat a treballar avui segur que ho fa demà i a més, els que tenen fills, hauran de suportar a la canalla, que no comença l&#8217;escola fins d&#8217;ací uns dies, després de tenir que aguantar als companys de treball contant el divertides que han estat les seves vacances i observar que tenen la pell més blanca que ningú en la oficina. I a sobre, aguantar la paranoia de la grip A.</p>
<p>Jo, digueu-me despreocupat, mai he tingut síndrome post-vacacional. No sé ni definir-lo. Perdoneu-me els qui patiu d&#8217;aquest mal, però com segur que diria el meu avi en els seus bons temps: això són <em>mariconaes</em> (ell ha sigut llaurador i obrer tota la vida, així que vacances poquetes).</p>
<p>També serà perquè per a mi les vacances no són sinònim de passar-me el dia estirat a la platja torrant-me com les serps (de fet sols he anat una vegada a la platja aquest estiu). Si foren així, segur que seria més difícil. A mi m&#8217;agrada fer coses. Ja us vaig fer al principi de l&#8217;estiu una <a href="http://www.elvoldelhomeocell.net/archives/781" target="_blank">llista de totes les coses que volia fer</a>. Quantes n&#8217;he fet? Si excloem a les referents al viatge, cap ni una.</p>
<p>El viatge ha segut la cosa més pareguda a unes vacances normals que he tingut, això si acceptem que cinc imbècils (un parlant amb les vaques traient el cap de la finestra mentre condueix per l&#8217;autopista francesa, l&#8217;altre invocant al dimoni mentre imita a un cantant de <a href="http://www.myspace.com/malroin" target="_blank">rock satànic</a>, un altre passejant una <a href="http://upload.wikimedia.org/wikipedia/commons/a/a9/Flag_of_the_Soviet_Union.svg" target="_blank">bandera de la URSS</a> per terres holandeses, i la parella restant a punt de cremar una casa després de fer-se els matxots i intentar beure&#8217;s un <em>xupito</em> de Sambuca encès) poden fer alguna cosa normal.</p>
<p>Volia escriure-vos un resum de tot el trajecte, de fet tenia ja bona part escrita quan <a href="http://www.blaiserver.net/archives/3934" target="_blank">Blai publica la seva bitàcola del viatge</a>. No m&#8217;agrada massa aquesta forma de contar les nostres aventures, però vaja, no anava a contar una altra vegada el mateix, tenint en compte que compartim gran quantitat de visitants, així que ho vaig deixar estar.</p>
<p>Pel que fa a la resta de coses de la llista, o no he tingut temps, o no he tingut ganes. Però n&#8217;he fet d&#8217;altres.</p>
<p>El primer que vaig fer en tornar del viatge va ser posar-me a pintar el portàtil. Aquesta vegada l&#8217;he pintat de negre i ha quedat bastant bé (almenys queda més net que pintat de blanc&#8230;). Després de quasi carregar-me&#8217;l a l&#8217;hora de tornar-lo a muntar (no s&#8217;encenia per culpa de no estar ben posada la memòria RAM i m&#8217;he carregat una de les dues antenes WiFi), ja està operatiu de nou. Ara amb <a href="http://www.debian.org" target="_blank">Debian</a> instal·lat (abans utilitzava <a href="http://www.archlinux.org/" target="_blank">ArchLinux</a> que em va agradar molt, però tenia ganes de provar Debian) i sense el problemes de sobreescalfament que tenia abans (vaig netejar el ventilador conscienciosament). D&#8217;entorn d&#8217;escriptori utilitze el <a href="http://www.xfce.org/" target="_blank">XFCE</a>, que es molt lleuger (no tant com l&#8217;<a href="http://icculus.org/openbox/index.php/Main_Page" target="_blank">OpenBox</a>) i és quasi tan complet com el <a href="http://www.gnome.org/" target="_blank">GNOME</a>.</p>
<p>Després m&#8217;he dedicat a fer <em>frikades</em> vàries: he fet alguns problemes de <a href="http://code.google.com/codejam/" target="_blank">Google Code Jam</a> de l&#8217;any passat. El dia 2 de setembre comença la fase de classificació. L&#8217;any passat la vaig superar (sols havies de fer un problema), però no em vaig ni presentar a la primera ronda. Enguany ja veurem; he intentat seguir on havia deixat el <a href="http://www.elvoldelhomeocell.net/works/?page=wodax&#038;lang=ca" target="_blank">Wodax</a>, però m&#8217;he adonat que tenia algunes errades, així que he tingut que replantejar-me algunes coses; i m&#8217;he posat a refer el programa que vaig presentar per al Concurs d&#8217;Algorísmica de l&#8217;assignatura d&#8217;Estructures de Dades i Algorismes. <a href="http://www.bellverde.org/" target="_blank">El guanyador</a> em va passar el seu codi i la seva memòria, vaig llegir la memòria i m&#8217;he posat a desenvolupar l&#8217;<a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.2.5996">algorisme que utilitzava</a>. I deixant les <em>frikades</em>, aquests dies he estat recollint ametles dels arbres que envolten ma casa.</p>
<p>Total, que ja ha passat un estiu mes i d&#8217;ací no res comença el nou curs. Jo demà ja me n&#8217;aniré cap a València per començar a arreglar-me l&#8217;habitació, fer el <em>papeleo</em> corresponent a la facultat, començar amb reunions i prepara-me per al començament del nou curs: tercer (collons tu, això ja és l&#8217;equador de la titulació!). Ja tinc ganes de començar el curs. Ho admet, m&#8217;il·lusione com un xiquet. Però de les expectatives d&#8217;aquest nou curs ja parlarem un altre dia, que avui el post ja se m&#8217;ha quedat prou llarg.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/842/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Número Bacon v2.0</title>
		<link>http://www.elvoldelhomeocell.net/archives/310</link>
		<comments>http://www.elvoldelhomeocell.net/archives/310#comments</comments>
		<pubDate>Wed, 11 Feb 2009 14:28:45 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Estudis]]></category>
		<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Projectes]]></category>
		<category><![CDATA[algorismes]]></category>
		<category><![CDATA[bacon]]></category>
		<category><![CDATA[fiv]]></category>
		<category><![CDATA[friki]]></category>
		<category><![CDATA[upv]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=310</guid>
		<description><![CDATA[Molt prompte tindré preparada la versió 2.0 del programeta que calculava el Número de Bacon, que va sorgir a partir d&#8217;un repte de l&#8217;assignatura de Programació l&#8217;any passat (per saber més i conèixer detalls tècnics de la implementació anterior, visiteu &#8230; <a href="http://www.elvoldelhomeocell.net/archives/310">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Molt prompte tindré preparada la versió 2.0 del <em>programeta</em> que calculava el <a href="http://en.wikipedia.org/wiki/Six_Degrees_of_Kevin_Bacon" target="_blank">Número de Bacon</a>, que va sorgir a partir d&#8217;un repte de l&#8217;assignatura de <a href="http://www.upv.es/pls/oalu/sic_asi.Busca_Asi?p_codi=5537&amp;p_caca=act&amp;P_IDIOMA=v&amp;p_vista=" target="_blank">Programació</a> l&#8217;any passat (per saber més i conèixer detalls tècnics de la implementació anterior, visiteu <a href="http://www.elvoldelhomeocell.net/works/bacon" target="_blank">la seva web</a>).</p>
<p>Gràcies a aquest repte vaig poder aprendre un colló i part de l&#8217;altre l&#8217;any passat i amb aquest mateix objectiu he anat polint-lo i afegint-li característiques. Amb quines millores i característiques compta aquesta versió respecte l&#8217;anterior?</p>
<p><strong>Optimització del graf.</strong></p>
<p>Els vèrtex del graf són tant les pel·lícules com els actors i no únicament els actors com passava en la versió anterior. D&#8217;aquesta manera, el número d&#8217;arestes que apareixen al inserir un actor nou en una pel·lícula <a href="http://en.wikipedia.org/wiki/Big_O_notation" target="_blank">creix</a> linealment i no de forma quadràtica <a href="works/bacon/images/arestes_per_peli.png" target="_blank" rel="lightbox[310]">com passava abans</a>. Em vaig treure de la barret una implementació per a un graf no dirigit que <a href="works/bacon/images/graph_linkedlist_white.png" target="_blank" rel="lightbox[310]">millorava en un 20% la implementació clàssica</a> mitjançant llistes d&#8217;adjacència, però així i tot, el fet que el número d&#8217;arestes cresquera de forma quadràtica era una bomba de rellotgeria. Ara, l&#8217;espai ocupat pel graf en memòria és molt menor (els que enteneu d&#8217;açò ja sabeu quina és la diferència entre un creixement quadràtic i un altre lineal&#8230;).</p>
<p>Per a que ens fem una idea, en la versió anterior havia de filtrar les pel·lícules i els actors quan es creava el graf per a que aquest no ocupara més memòria de la disponible en la computadora. Filtrant les pel·lícules per a adults, sèries de televisió, telenotícies, entregues de premis (<em>Oscar</em>, <em>Grammy</em>, etc) i moltes més coses, el graf ocupava vora 1,5GB de memòria principal. Ara, sense cap tipus de filtre ocupa uns 950MB!</p>
<p>Dues connotacions que té la millora de la representació del graf és el temps que tarda en generar-se i en carregar-se aquest. Abans havia de dedicar HORES a generar-lo en un fitxer i després MINUTS per carregar-lo en memòria cada vegada que s&#8217;executava el programa. Ara en uns 40 SEGONS (sense cap tipus d&#8217;optimització del nostre amic el GCC) el programa està carregat en memòria i llest per funcionar. Tornem de nou a la diferència entre un cost <em>O(n)</em> i un cost <em>O(n^2)</em>.</p>
<p><strong>Optimització de les taules <em>hash</em>.</strong></p>
<p>Ara s&#8217;utilitzen funcions <em>hash</em> que ofereixen una millor dispersió i per tant el temps de recerca en la <a href="http://en.wikipedia.org/wiki/Hash_table" target="_blank">taula</a> és menor. A més no s&#8217;utilitzen una, sinó dues funcions de dispersió. La primera serveix per dispersar l&#8217;element entre les cubetes de la taula i la segona per comparar els elements dins la cubeta, de forma que el element que s&#8217;està buscant es compara amb la resta de la seva cubeta amb un enter (cost constant) evitant així tenir que fer comparacions de <em>strings </em>(amb un pitjor cas amb cost lineal).</p>
<p>De totes formes, la idea és substituir les taules de dispersió en un futur per unes altres que oferisquen major tolerància a fallades d&#8217;escriptura (<a href="http://en.wikipedia.org/wiki/Fuzzy_string_searching" target="_blank"><em>Fuzzy string searching</em></a>) en detriment de l&#8217;eficiència. Per aquest cas, ens dóna igual un cost <em>O(1)</em> que un cost <em>O(log n)</em> i el segon ens ofereix algunes avantatges.</p>
<p>La idea és aconseguir el que fa <a href="http://www.google.com" target="_self">Google</a> quan t&#8217;equivoques escrivint però has escrit una cosa semblant a algun índex que tenen en la seva memòria cau. Per exemple, si busqueu al Google &#8220;<em>el vol de lhome ocell</em>&#8221; us apareixerà: &#8220;<em>Did you mean? el vol de l&#8217;home ocell</em>&#8220;. El mateix vull fer jo per si algú s&#8217;equivoca i busca &#8220;<em>Kevin Bakon</em>&#8221; o &#8220;<em>Qevin Vacon</em>&#8220;, que li aparega &#8220;<em>Volies dir Kevin Bacon?</em>&#8220;.</p>
<p>Lamentablement per fer tot això ens clavem en el meravellós món de la programació dinàmica i altres tècniques i estructures de dades avançades de les quals jo no tinc ni punyetera idea, així que això haurà de ser en paciència.</p>
<p><strong>Optimització del càlcul del camí de menor pes entre dos vèrtex del graf.</strong></p>
<p>Quan vaig fer el programa per primera vegada vaig utilitzar <a href="http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm" target="_blank">l&#8217;algorisme de Dijkstra</a>. Havia sentit parlar d&#8217;ell en <a href="http://www.upv.es/pls/oalu/sic_asi.Busca_Asi?p_codi=5541&amp;p_caca=act&amp;P_IDIOMA=v&amp;p_vista=" target="_blank">EMI1</a>, així que quan vaig veure que els actors eren vèrtex d&#8217;un graf i &#8220;El Número Bacon&#8221; era el camí de menor pes entre l&#8217;actor indicat i Kevin Bacon, em vaig tirar de cap. Greu error. Perquè si hagués investigat un poc més abans de pegar-me la gran <em>currada</em> hauria descobert que l&#8217;algorisme de Recerca per Amplada (o <em>Breadth-First Search</em> en anglès, que queda més <em>cool</em>) també permet calcular el camí de menor pes en un graf no ponderat (o amb tots els pesos igual a 1), que era el que jo tenia, i en un temps molt menor.</p>
<p>La implementació habitual de l&#8217;algorisme de Dijkstra té un cost en el pitjor cas d&#8217;ordre quadràtic (<em>O(V^2)</em>), inacceptable per a la dimensió del graf del meu problema. Per això vaig trobar <a href="./works/bacon/images/dijkstra_algorithm.png" target="_blank" rel="lightbox[310]">una implementació que utilitzava monticles de mínims</a> (<em>MinHeaps</em>) per elegir el pròxim vèrtex a visitar i reduïa el cost a <em>O((V+E)*Log(V))</em>. Tenint en compte que el número d&#8217;arestes (<em>E</em>) era bastant major que <em>V</em> (però no arribava a <em>V^2</em>), llavors el cost era <em>O(E*Log(V))</em>, que no estava malament. Però la Recerca per Amplada, per a aquest cas, li pega cent voltes al de Dijkstra, ja que calcula el camí de menor pes en un temps <em>O(E+V)</em>, en el nostre cas <em>O(E)</em> (ja que <em>E</em> &gt;&gt; <em>V</em>)!</p>
<p><strong>Oracle.</strong></p>
<p>Aquesta és la millor característica de cara a l&#8217;usuari. He construït un servidor utilitzant <em>Sockets</em> i <em>Threads</em> (mai havia utilitzat cap dels dos en C o C++, únicament en Python i Delphi) al qual se li poden enviar consultes de l&#8217;estil &#8220;<em>link?n1=Bacon, Kevin&amp;n2=Connery, Sean</em>&#8221; i el servidor torna al client la distància entre els dos actors i el camí que hi ha que recórrer. A més se li poden passar filtres per buscar el camí únicament entre les pel·lícules que corresponen a un cert gènere, o que estiguen dintre d&#8217;un rang temporal, etc.</p>
<p>Què és pretén amb això? Doncs executar aquest servidor des del meu servidor casolà (s&#8217;anomena <em>asimov</em>) i fer una xicoteta pàgina web des de la qual poder enviar consultes (més o menys el que fa la web http://www.oracleofbacon.org), però també podria implementar-se en qualsevol plataforma connectada a la xarxa (una versió mòbil?). Ja especificaré millor com funciona el servidor en la documentació del programa, em queda corregir unes <em>cosetes</em>.</p>
<p>En definitiva, per a que veieu que no us mentisc, ací us deixe amb una xicoteta captura de pantalla del servidor amb tres clients connectats i els recursos que està consumint.</p>
<p style="text-align: center;">
<div id="attachment_319" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.elvoldelhomeocell.net/wp-content/uploads/2009/02/preview_bacon.png" rel="lightbox[310]"><img class="size-medium wp-image-319" title="Vista prèvia del Número de Bacon" src="http://www.elvoldelhomeocell.net/wp-content/uploads/2009/02/preview_bacon-300x196.png" alt="Vista prèvia del servidor amb tres clients connectats" width="300" height="196" /></a><p class="wp-caption-text">Vista prèvia del servidor amb tres clients connectats</p></div>
<p>En fi, ja us contaré més coses!</p>
<p>PS: Els qui m&#8217;heu vist cansat avui, per culpa de la <em>frikada</em> aquesta anit em vaig gitar <em>mooolt</em> tard&#8230;</p>
<p>PS2: Jo NO he fet la web  <a onmousedown="UntrustedLink.bootstrap($(this), &quot;d70c33f6ed42a86f40613e2698167957&quot;, event)" rel="nofollow" href="http://www.oracleofbacon.org%29/" target="_blank"><span>http://www.oracleofbacon.o</span>rg.</a> He fet un servidor que és el primer pas per poder fer una web com aquesta.<a onmousedown="UntrustedLink.bootstrap($(this), &quot;d70c33f6ed42a86f40613e2698167957&quot;, event)" rel="nofollow" href="http://www.oracleofbacon.org%29/" target="_blank"><br />
</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/310/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Present i Futur (I)</title>
		<link>http://www.elvoldelhomeocell.net/archives/301</link>
		<comments>http://www.elvoldelhomeocell.net/archives/301#comments</comments>
		<pubDate>Wed, 28 Jan 2009 17:58:11 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Estudis]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[Projectes]]></category>
		<category><![CDATA[beques]]></category>
		<category><![CDATA[dsic]]></category>
		<category><![CDATA[experiència]]></category>
		<category><![CDATA[fiv]]></category>
		<category><![CDATA[futur]]></category>
		<category><![CDATA[upv]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/blog/archives/301</guid>
		<description><![CDATA[Avui he vist en el Google Reader que els del DSIC han publicat una beca de col·laboració de, nada menos que, 700€ al mes per programar amb C i Python (a banda es requereix coneixements de Linux, XML i SQL). &#8230; <a href="http://www.elvoldelhomeocell.net/archives/301">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Avui he vist en el Google Reader que els del <a href="http://www.dsic.upv.es" target="_blank">DSIC</a> han publicat una <a href="http://www.upv.es/pls/oalu/sic_infobec.ficha_beca?P_CODIGO=338884&amp;P_IDIOMA=v" target="_blank">beca de col·laboració</a> de, <em>nada menos que</em>, 700€ al mes per programar amb C i Python (a banda es requereix coneixements de Linux, XML i SQL). Les beques de col·laboració solen estar entre els 300-400€, així que aquesta és una de puta mare. La qüestió és que l&#8217;oferta de la beca m&#8217;ha fet pensar mentre em bevia un got de llet amb cereals i em recuperava d&#8217;una baixada de sucre (no he dinat prou).</p>
<p>No sóc un <em>master</em> en C, ni molt menys en Python. Els conec, he fet les meves <em>virgueries</em> amb ells, però poc més. El C és el que tinc més mastegat, he treballat amb ell durant tot l&#8217;any passat i aquest any faig les meves cosetes en C++, però realment, pel que utilitze de C++ (les classes i els <em>streams</em>) és com si hagués treballat amb el C també.</p>
<p>El <strong>GNU/</strong>Linux (perdoneu que insistisca amb la primera part del nom) duc utilitzant-lo contínuament des de fa quasi dos anys, més el temps que el vaig tenir com a sistema secundari, encara que l&#8217;utilitzava ben poc. Sé algunes cosetes del sistema en general i d&#8217;algunes distribucions en específic. Sóc el talibà de classe del GNU/Linux (ja que no està <a href="http://www.stallman.org" target="_blank">Stallman</a>, algú ha de fer el paper).</p>
<p>Ara bé, els que escriuen els requisits de les beques són un poc <em>cabronets</em>, perquè això de &#8220;Requisits: coneixements i experiència en &#8230;&#8221; és bastant ambigu. Què s&#8217;entén per coneixement i per experiència? Imagine que tinc més coneixement i experiència que molta gent respecte els requisits, al igual que molta altra en té més que jo, però és suficient el coneixement i la meva experiència? Com ho demostre? I ací entra la segona part de la reflexió.</p>
<p>Per demostrar els teus coneixements i experiència se suposa que està el <em>Currículum Vitae</em> eixe, no? Ho pregunte perquè tampoc tinc massa clar quin és l&#8217;objectiu d&#8217;un <em>Currículum Vitae</em>, si dir el que saps fer o fantasmejar amb els cursets de Word de l&#8217;Acadèmia Paquirri de baix de casa o amb Màsters de la <em>Universitat Traumhaft de Poltergeist</em> (això està a Alemanya, incultes!) , que és el que fan molts.</p>
<p>Què collons haig de posar per demostrar els meus coneixements i experiència en alguna cosa (sense mentir)? Perquè no he treballat, ni he fet cap <em>Màster Avançat Xiripitiflàutic en Aplicacions del Llenguatge C de Programació de Computadors</em> (els Màsters millors amb noms llargs!). Què, pose un enllaç al <a href="http://svn.assembla.com/svn/wodax/" target="_blank">Wodax</a> i <a href="http://www.elvoldelhomeocell.net/works/bacon/" target="_blank">al repte</a> de l&#8217;any passat?</p>
<p>En fi, si algú sap què collons s&#8217;ha de posar a un Curriculum Vitae d&#8217;aquests que avise, així ja el tindré preparat per a la pròxima vegada.</p>
<p>Aquesta és la part del present, la part del futur seguirà un altre dia. Ara vaig a seguir amb EC, que les memòries cau em porten <em>loco</em>&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/301/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>&#8220;Spam&#8221; del Wodax</title>
		<link>http://www.elvoldelhomeocell.net/archives/296</link>
		<comments>http://www.elvoldelhomeocell.net/archives/296#comments</comments>
		<pubDate>Sat, 03 Jan 2009 18:33:11 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Criptografia]]></category>
		<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Projectes]]></category>
		<category><![CDATA[egocentrisme]]></category>
		<category><![CDATA[esteganografia]]></category>
		<category><![CDATA[friki]]></category>
		<category><![CDATA[kriptópolis]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[wodax]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/blog/archives/296</guid>
		<description><![CDATA[Entre ahir i avui he traduït al castellà i corregir el document que vaig escriure sobre el Wodax per enviar-lo a Kriptópolis (una web d&#8217;aficionats a la criptografia i la seguretat informàtica) per a que el revisaren, el paper i &#8230; <a href="http://www.elvoldelhomeocell.net/archives/296">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Entre ahir i avui <a href="http://www.elvoldelhomeocell.net/works/wodax/doc/wodax.es.pdf">he traduït al castellà</a> i corregir <a href="http://www.elvoldelhomeocell.net/archives/293" target="_blank">el document que vaig escriure sobre el Wodax</a> per enviar-lo a Kriptópolis (una web d&#8217;aficionats a la criptografia i la seguretat informàtica) per a que el revisaren, el paper i el programa i li buscaren d&#8217;errors i com corregir-los.</p>
<p>Avui he enviat un post al fòrum de <a href="http://www.kriptopolis.org/" target="_blank">Kriptópolis</a> i quina ha segut la sorpresa que m&#8217;he endut quan l&#8217;administrador ha penjat el post com un <a href="http://www.kriptopolis.org/wodax-esteganografia" target="_blank">article en la portada de la web!</a> Però ací no acaben les sorpreses perquè resulta que algú a enviat l&#8217;article de Kriptópolis a Menéame.</p>
<p>Ara sols falta que el programa i el PDF estiguen plens d&#8217;errors i quede com el cul xD.</p>
<p>PS: <a href="http://meneame.net/story/wodax-pequena-utilidad-esteganografia" target="_blank"><em>Menegeu</em> la notícia al Menéame</a>, vinga.</p>
<p>PS2: He dit que he corregit el document PDF, però sols ha sigut en la versió castellana. A veure si demà tinc una estona i corregisc la versió en català, però no promet res: haig d&#8217;estudiar!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/296/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Sí, sí, sí. Wodax ja està ací!</title>
		<link>http://www.elvoldelhomeocell.net/archives/293</link>
		<comments>http://www.elvoldelhomeocell.net/archives/293#comments</comments>
		<pubDate>Tue, 16 Dec 2008 16:56:17 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Criptografia]]></category>
		<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Projectes]]></category>
		<category><![CDATA[esteganografia]]></category>
		<category><![CDATA[friki]]></category>
		<category><![CDATA[paper]]></category>
		<category><![CDATA[wodax]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/blog/archives/293</guid>
		<description><![CDATA[Doncs com bé aclama el títol, la versió 1.1 del Wodax ja està &#8220;llançada&#8221;. Tal vegada, els que no teniu un contacte més directe amb mi us estareu preguntant què és el &#8220;Wodax&#8221;(perquè Adrià i Fernando ho saben ben bé, &#8230; <a href="http://www.elvoldelhomeocell.net/archives/293">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Doncs com bé aclama el títol, la versió 1.1 del Wodax ja està &#8220;llançada&#8221;. Tal vegada, els que no teniu un contacte més directe amb mi us estareu preguntant què és el &#8220;Wodax&#8221;(perquè Adrià i Fernando ho saben ben bé, porten dues setmanes aguantant <em>spam</em>&#8230;). Encara que <a href="http://www.elvoldelhomeocell.net/archives/267" target="_blank">ja ho vaig</a> dir en el seu moment, ho tornaré a explicar.</p>
<p>En primera instància, Wodax és més que rés, una <em>frikada</em> de les grosses i l&#8217;única finalitat és el pur entreteniment i aprenentatge (a no ser que sigueu uns paranoics perduts, llavors us serà ben útil!). Una vegada aclarit aquest xicotet detall, procedim amb l&#8217;explicació més formal. Traduisc del primer paràgraf del <a href="http://svn.assembla.com/svn/wodax/stable/1.1/README" target="_blank"><em>README</em></a> (tota la documentació, excepte el <em>paper</em> del que us parlaré tot seguit, està en&#8230; diguem-li &#8220;anglès&#8221;).</p>
<blockquote><p>Wodax és un programa d&#8217;<a href="http://ca.wikipedia.org/wiki/Esteganografia" target="_blank">esteganografia</a> que us permet ocultar un arxiu de text pla en una imatge PNG i, per suposat, us permet obtenir un text ocult a partir d&#8217;una imatge PNG escrivint la contrasenya correcta.</p></blockquote>
<p>Mola, eh? No explicaré res sobre el funcionament del programa. Està tot explicat en aquest article titulat <a href="http://www.elvoldelhomeocell.net/works/wodax/doc/wodax.pdf" target="_blank">&#8220;Wodax: Text entre les ombres&#8221;</a> (que m&#8217;ha costat dues setmanes de treball).</p>
<p>L&#8217;article està dividit en tres seccions. Comença amb una xicoteta introducció i història de l&#8217;esteganografia i la representació d&#8217;imatges en el computador; la segona secció és la més extensa i densa, explica el funcionament del programa, possibles &#8220;atacs&#8221; per fer-lo ineficaç, defenses front eixos &#8220;atacs&#8221;, algunes restriccions i manques que té (de moment); i la tercera secció inclou un xicotet text on conte com apareix Wodax i la gran xorrada que se m&#8217;ocorregué per nombrar les versions (em passat de la 0.1 a la 1.1 directament!), com instal·lar-lo i usar-lo, etc.</p>
<p>Dir que de moment sols el podreu compilar en un sistema GNU/Linux de 32 o 64 bits. Jo de fet l&#8217;he provat amb tres distribucions i en les dues arquitectures i funciona perfectament en les quatre combinacions. <a href="http://www.elvoldelhomeocell.net/works/wodax/wodax_v11.tar.gz" target="_blank">Podeu descarregar-vos un paquet</a> amb el codi font, un binari precompilat per a l&#8217;arquitectura x86 i amd64 que inclou les llibreries (així no les haureu d&#8217;instal·lar) i una carpeta anomenada test que inclou tres textos amagats dins de tres imatges (fotos meves del Flickr). Els textos són les obres &#8220;<em>El ingenioso hidalgo Don Quijote de La Mancha</em>&#8220;, de Cervantes; &#8220;Tirant Lo Blanc&#8221;, de Martorell; i &#8220;<em>Hamlet</em>&#8220;, de Shakespeare. Totes tres en anglès gràcies al projecte <a href="http://www.gutenberg.org" target="_blank">Gutenberg</a>.</p>
<p>El codi font de tot el projecte el podeu trobar en <a href="http://svn.assembla.com/svn/wodax/" target="_blank">aquest servidor de codi Subversion</a>. El programa està publicat sota els termes de la <a href="http://svn.assembla.com/svn/wodax/stable/1.1/LICENSE" target="_blank">llicència GNU GPL v3</a>. L&#8217;article, per la seva part està publicada sota la <a href="http://svn.assembla.com/svn/wodax/article/LICENSE" target="_blank">llicència FDL</a>.</p>
<p><strong>Actualització:</strong> Meresc dos dies de càstig a pa i aigua. Com bé m&#8217;ha apuntat Adrià això de <em>&#8220;sombres</em>&#8221; és una burrada com una catedral i més encara per estar en el títol d&#8217;un document! Ombres, ombres! El document ja està actualitzat, podeu tornar a descarregar-lo i com si no hagués passat res. Per la meva part us promet que ho copiaré 100 vegades&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/293/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Wodax (pre-alpha)</title>
		<link>http://www.elvoldelhomeocell.net/archives/267</link>
		<comments>http://www.elvoldelhomeocell.net/archives/267#comments</comments>
		<pubDate>Wed, 06 Aug 2008 23:39:32 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Criptografia]]></category>
		<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Programació]]></category>
		<category><![CDATA[Projectes]]></category>
		<category><![CDATA[esteganografia]]></category>
		<category><![CDATA[friki]]></category>
		<category><![CDATA[wodax]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/blog/archives/267</guid>
		<description><![CDATA[Ja us vaig comentar que arrel del llibre de Cryptonomicon se me va ocórrer fer un xicotet programa d&#8217;esteganografia. Doncs ja hi ha una versió pre-alpha disponible. De moment podeu únicament ocultar un arxiu de text en una imatge i &#8230; <a href="http://www.elvoldelhomeocell.net/archives/267">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ja us vaig comentar que <a href="http://www.elvoldelhomeocell.net/archives/264" target="_blank">arrel del llibre de <em>Cryptonomicon</em></a> se me va ocórrer fer un xicotet programa d&#8217;esteganografia. Doncs ja hi ha una versió <em>pre-alpha</em> disponible.</p>
<p>De moment podeu únicament ocultar un arxiu de text en una imatge i obtenir un text ocult. No vaig a explicar com funciona per ara, simplement us deixaré una prova. Aquest text (<a href="http://ca.wikipedia.org/wiki/Esteganografia" target="_blank">extret de la Viquipèdia</a>) es troba ocult en la imatge de la dreta de la <a href="http://en.wikipedia.org/wiki/Mona_Lisa" target="_blank">Mona Lisa</a> (una obra d&#8217;art <a href="http://en.wikipedia.org/wiki/Speculation_about_Mona_Lisa" target="_blank">plena de misteris</a>), la de l&#8217;esquerre és l&#8217;original. Noteu alguna diferència (feu clic per ampliar les imatges al 100%)?</p>
<blockquote>
<p align="left">L&#8217;esteganografia és l&#8217;art i la ciència d&#8217;escriure missatges ocults de tal manera que només en conegui l&#8217;existència el destinatari previst; a diferència de la criptografia, en que l&#8217;existència del missatge per ell mateix no s&#8217;oculta, però el contingut és amagat.</p>
<p align="left">La paraula &#8220;steganografia&#8221; té origen grec i vol dir &#8220;escrit ocult o tapat&#8221;. Els seus orígens es remunten a l&#8217;any 440 aC. L&#8217;historiador Heròdot va mencionar dos exemples d&#8217;esteganografia a les seves Històries. Demeratus va escriure un missatge per alertar d&#8217;un possible atac a Grècia, escrivint-lo en una tauleta de fusta i la va cobrir de cera. Les tauletes de cera s&#8217;utilitzaven com a superfície d&#8217;escriptura reusable. Un altre exemple de l&#8217;ús de l&#8217;esteganografia el trobem en Histiaeus, que rapava el cap dels seus esclaus més fidels i els tatuava un missatge. Quan el cabell els creixia, el missatge quedava ocult. El propòsit d&#8217;aquests missatges fou instigar una revolta contra els perses. Més tard, Johannes Trithemius va escriure Steganographia, un tractat de criptografia i esteganografia disfressat de llibre de màgia negra.</p>
</blockquote>
<p align="center"><a href="http://www.elvoldelhomeocell.net/wp-content/uploads/2008/08/mona.png" target="_blank" rel="lightbox[267]"><img title="Mona Lisa original" src="http://www.elvoldelhomeocell.net/wp-content/uploads/2008/08/mona_thumb.png" alt="Mona Lisa original" width="210" height="300" /></a> <a href="http://www.elvoldelhomeocell.net/wp-content/uploads/2008/08/mona_out.png" target="_blank" rel="lightbox[267]"><img title="Mona Lisa modificada" src="http://www.elvoldelhomeocell.net/wp-content/uploads/2008/08/mona_out_thumb.png" alt="Mona Lisa original" width="210" height="300" /></a></p>
<p>Està bé, fem les coses més fàcils&#8230; El mateix text està ocult en la imatge de la dreta. Feu clic i veureu les imatges al 500% i notareu xicotetes diferències en el color d&#8217;alguns píxels.</p>
<p align="center"><a href="http://www.elvoldelhomeocell.net/wp-content/uploads/2008/08/rgb_big.png" target="_blank" rel="lightbox[267]"><img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2008/08/rgb.png" alt="" width="128" height="128" /></a> <a href="http://www.elvoldelhomeocell.net/wp-content/uploads/2008/08/rgb_out_big.png" target="_blank" rel="lightbox[267]"><img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2008/08/rgb_out.png" alt="" width="128" height="128" /></a></p>
<p align="left">Ara falta fer que a banda d&#8217;ocultar text en les imatges, aquest text estiga xifrat per evitar així possibles atacs per força bruta (que són fins i tot prou complicats com ja us explicaré). Us deixe un <a href="http://svn.assembla.com/svn/wodax/trunk/" target="_blank">enllaç al servidor Subversion</a> on tinc penjat l&#8217;última versió del codi per si algú vol pegar-li una <em>miradeta</em> al codi (necessitareu la llibreria <a href="http://www.nongnu.org/pngpp/" target="_blank">png++</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/267/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

