<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>https://wiki.cadt.com/index.php?action=history&amp;feed=atom&amp;title=Data_Recovery_System</id>
	<title>Data Recovery System - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.cadt.com/index.php?action=history&amp;feed=atom&amp;title=Data_Recovery_System"/>
	<link rel="alternate" type="text/html" href="https://wiki.cadt.com/index.php?title=Data_Recovery_System&amp;action=history"/>
	<updated>2026-04-13T11:08:31Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://wiki.cadt.com/index.php?title=Data_Recovery_System&amp;diff=2495&amp;oldid=prev</id>
		<title>Joan a 11:54, 7 gen 2015</title>
		<link rel="alternate" type="text/html" href="https://wiki.cadt.com/index.php?title=Data_Recovery_System&amp;diff=2495&amp;oldid=prev"/>
		<updated>2015-01-07T11:54:14Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ca&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Versió més antiga&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revisió del 11:54, 7 gen 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Línia 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Línia 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:SAPO]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Devel]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Introducció ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Introducció ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Joan</name></author>
	</entry>
	<entry>
		<id>https://wiki.cadt.com/index.php?title=Data_Recovery_System&amp;diff=100&amp;oldid=prev</id>
		<title>Cadtsd: Protegit «Data Recovery System» ([edit=autoconfirmed] (indefinit) [move=autoconfirmed] (indefinit))</title>
		<link rel="alternate" type="text/html" href="https://wiki.cadt.com/index.php?title=Data_Recovery_System&amp;diff=100&amp;oldid=prev"/>
		<updated>2010-11-13T21:32:51Z</updated>

		<summary type="html">&lt;p&gt;Protegit «&lt;a href=&quot;/index.php/Data_Recovery_System&quot; title=&quot;Data Recovery System&quot;&gt;Data Recovery System&lt;/a&gt;» ([edit=autoconfirmed] (indefinit) [move=autoconfirmed] (indefinit))&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Introducció ==&lt;br /&gt;
&lt;br /&gt;
[[Data Recovery System]] es el nou sistema de data recovery creat per al programa Carta (i d&amp;#039;altres). Està format per la llibreria libdrs i certes modificacions a la llibreria libdrf.&lt;br /&gt;
&lt;br /&gt;
== Documentació ==&lt;br /&gt;
&lt;br /&gt;
El document &amp;#039;&amp;#039;doc/pfc1380.pdf&amp;#039;&amp;#039; dins el repositori de libdrs conté la memòria de desenvolupament i funcionament intern del projecte. Per a fer servir la llibreria, només cal treballar amb la interficie C, que es troba als fitxers &amp;#039;&amp;#039;src/lib/capi.cpp&amp;#039;&amp;#039; i &amp;#039;&amp;#039;src/lib/data-recovery.h&amp;#039;&amp;#039; i que es detalla a continuació. Al fitxer &amp;#039;&amp;#039;drs.c&amp;#039;&amp;#039; del codi de Carta 6.1.0 podem veure com es fan servir aquestes funcions.&lt;br /&gt;
&lt;br /&gt;
En general, si no es diu lo contrari, totes les funcionalitats que s&amp;#039;expliquen en aquest document ja es troben implementades. Cal veure el fitxer &amp;#039;&amp;#039;drs.c&amp;#039;&amp;#039; de Carta, que fa d&amp;#039;interfície amb la llibreria DRS; i les llibreries &amp;#039;&amp;#039;libdrs&amp;#039;&amp;#039; i libdrf/branches/drs&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
&lt;br /&gt;
Primer cal &amp;#039;&amp;#039;&amp;#039;inicialitzar&amp;#039;&amp;#039;&amp;#039; la llibreria, identificant el nom del programa i usuari que en fa us. Després s&amp;#039;obtindrà una &amp;#039;&amp;#039;&amp;#039;sessió&amp;#039;&amp;#039;&amp;#039; de treball, ja sigui triant-ne una de la llista de sessions inacabades, o creant-ne una de nova. A mesura que l&amp;#039;usuari va realitzant la seva feina, es van emmagatzemant les diverses &amp;#039;&amp;#039;&amp;#039;operacions&amp;#039;&amp;#039;&amp;#039; que realitza. Cada cert temps, a més, el programa que fa us de la llibreria realitzarà un &amp;#039;&amp;#039;&amp;#039;checkpoint&amp;#039;&amp;#039;&amp;#039;. En qualsevol moment, l&amp;#039;usuari d&amp;#039;una sessió activa pot llistar les operacions anteriors i &amp;#039;&amp;#039;&amp;#039;desfer&amp;#039;&amp;#039;&amp;#039; la seva feina fins a un punt donat.&lt;br /&gt;
&lt;br /&gt;
La llibreria DRS, al igual que la DRF, treballa amb tags. D&amp;#039;aquesta manera, podem veure un fitxer de &amp;#039;&amp;#039;data recovery&amp;#039;&amp;#039; com un DRF on anem guardant nous tags cada vegada que l&amp;#039;usuari els modifica. Realment es guarden les diferencies entre el tag modificat i el tag anterior.&lt;br /&gt;
&lt;br /&gt;
=== Inicialització ===&lt;br /&gt;
&lt;br /&gt;
Per inicialitzar la llibreria només cal cridar la funció&lt;br /&gt;
&lt;br /&gt;
 dr_handle_t *handle;&lt;br /&gt;
 handle = data_recovery_init((const char*)user_name, (const char*)app_name);&lt;br /&gt;
&lt;br /&gt;
Ambdós arguments han de ser diferents de NULL. Retorna un dr_handle_t* en cas d&amp;#039;èxit, NULL en cas d&amp;#039;error.&lt;br /&gt;
&lt;br /&gt;
=== Obtenció d&amp;#039;una sessió ===&lt;br /&gt;
&lt;br /&gt;
El procediment correcte es primer veure si hi han sessions inacabades i donar a l&amp;#039;usuari la opció de continuar-les:&lt;br /&gt;
&lt;br /&gt;
 dr_session_t *list;&lt;br /&gt;
 unsigned int  num;&lt;br /&gt;
 list = data_recovery_list_sessions((dr_session_t*)handle, (unsigned int*)&amp;amp;num);&lt;br /&gt;
&lt;br /&gt;
Retorna una llista de dr_session_t* i el número de sessions contingudes a aquesta llista a &amp;#039;&amp;#039;num&amp;#039;&amp;#039;. En cas de que no existeixi cap sessió inacabada, retorna NULL i &amp;#039;&amp;#039;num&amp;#039;&amp;#039; igual a 0.&lt;br /&gt;
&lt;br /&gt;
El llistat de sessions es pot explorar directament, especialment els camps &amp;#039;&amp;#039;user&amp;#039;&amp;#039;, &amp;#039;&amp;#039;app&amp;#039;&amp;#039; i &amp;#039;&amp;#039;date&amp;#039;&amp;#039; de l&amp;#039;estructura.&lt;br /&gt;
&lt;br /&gt;
Si es vol continuar amb una de les sessions de la llista, s&amp;#039;ha executar&lt;br /&gt;
 data_recovery_resume_session(handle,(dr_session_t*) list[i]);&lt;br /&gt;
Aquesta funció retornarà zero en cas d&amp;#039;error. Per crear una nova sessió es fa servir la mateixa funció però amb el segon argument (dr_session_t*) igual a NULL.&lt;br /&gt;
&lt;br /&gt;
En tot cas, si &amp;#039;&amp;#039;list_sessions&amp;#039;&amp;#039; ens ha tornat una llista, i independentment de si hem fet &amp;#039;&amp;#039;resume&amp;#039;&amp;#039; d&amp;#039;una o no, hem de lliberar la llista de sessions:&lt;br /&gt;
 data_recovery_free_sessions(list,num);&lt;br /&gt;
&lt;br /&gt;
=== Emmagatzemament d&amp;#039;operacions ===&lt;br /&gt;
&lt;br /&gt;
Cada cop que l&amp;#039;usuari realitza una modificació a les dades de treball, cap emmagatzemar l&amp;#039;operació:&lt;br /&gt;
 dr_begin_op(handle,(unsigned short) opcode);&lt;br /&gt;
 _envia_tags();&lt;br /&gt;
 dr_end_op  (handle);&lt;br /&gt;
El opcode es un valor numèric que ens ha de servir més endavant per identificar la operació que ha realitzat l&amp;#039;usuari per generar aquests canvis. Es tracta, per tant, d&amp;#039;un valor que només te significat dins l&amp;#039;aplicació que està fent servir la llibreria &amp;#039;&amp;#039;Data Recovery&amp;#039;&amp;#039;. &lt;br /&gt;
La funció &amp;#039;&amp;#039;_envia_tags&amp;#039;&amp;#039; en aquest exemple, ha de enviar a la llibreria els nous tags resultants de la operació que ha realitzat l&amp;#039;usuari. En el cas de Carta, es realitza la mateixa operació que quan es salva el projecte, generant les estructures necessàries per la llibreria DRF i cridant &amp;#039;&amp;#039;drf_save&amp;#039;&amp;#039;. Com veurem més endavant es tracta d&amp;#039;una llibreria DRF modificada per treballar amb &amp;#039;&amp;#039;Data Recovery&amp;#039;&amp;#039;. En comptes d&amp;#039;escriure cada &amp;#039;&amp;#039;tag&amp;#039;&amp;#039; a un fitxer DRF, lo que fa es cridar a la funció:&lt;br /&gt;
 dr_set_tag (handle, (unsigned short) num_tag, (char) tipus_tag, (void*) ptr_tag, (unsigned int) nbytes);&lt;br /&gt;
&lt;br /&gt;
Per tant per emmagatzemar una operació cal cridar &amp;#039;&amp;#039;dr_begin_op&amp;#039;&amp;#039; amb el identificador d&amp;#039;operació desitjat, fer tantes crides &amp;#039;&amp;#039;dr_set_tag&amp;#039;&amp;#039; com vulguem, i finalment cridar &amp;#039;&amp;#039;dr_end_op&amp;#039;&amp;#039;. La llibreria DRS s&amp;#039;encarregarà d&amp;#039;escriure al fitxer de sessió les modificacions que ha sofert cada &amp;#039;&amp;#039;tag&amp;#039;&amp;#039; amb aquesta operació.&lt;br /&gt;
&lt;br /&gt;
=== Generació de checkpoints ===&lt;br /&gt;
&lt;br /&gt;
Cada cert temps, es necessari realitzar &amp;#039;&amp;#039;checkpoints&amp;#039;&amp;#039;. Només cal cridar la funció&lt;br /&gt;
 dr_checkpoint(handle);&lt;br /&gt;
La creació de checkpoints periòdics es necessària per agilitzar l&amp;#039;accés al fitxer de sessió, de manera que no cal llegir el fitxer complert per anar a un punt donat, sinó només cal llegir des del checkpoint immediatament anterior. També afegeix més robustesa al fitxer. Si una part es perd o es danya, encara es podrà accedir a les dades posteriors a aquesta part.&lt;br /&gt;
&lt;br /&gt;
=== Desfer operacions ===&lt;br /&gt;
&lt;br /&gt;
El propòsit principal de la llibreria, a més de continuar sessions que han fallat, es el de poder desfer la sessió actual fins a un punt anterior en el temps (Desfer errors, fer &amp;#039;&amp;#039;fork&amp;#039;&amp;#039; de projectes, etc.).&lt;br /&gt;
&lt;br /&gt;
Per realitzar aquesta feina, primer necessitem poder llistar o &amp;#039;&amp;#039;navegar&amp;#039;&amp;#039; a través dels canvis emmagatzemats al fitxer de sessió. La llibreria DRS ens ho permet mitjançant un [[http://en.wikipedia.org/wiki/Iterator iterador]]:&lt;br /&gt;
&lt;br /&gt;
 dr_iterator it = dr_get_iterator(handle).&lt;br /&gt;
&lt;br /&gt;
L&amp;#039;iterador es un objecte que ens serveix com a &amp;#039;&amp;#039;punter&amp;#039;&amp;#039; sobre la sessió, i ens permet moure&amp;#039;l endavant i enrere en el temps. Inicialment apunta al final del fitxer (per tant, no apunta a una operació existent). Per llegir la operació immediatament anterior en el temps fem:&lt;br /&gt;
 &lt;br /&gt;
 dr_operation_t op;&lt;br /&gt;
 dr_iterate(iterator,(dr_operation_t*) &amp;amp;op, (char)0); /* 0: enrere en el temps, 1: endavant */&lt;br /&gt;
&lt;br /&gt;
Retorna 0 si ja estem al principi (direcció=0) o al final (direcció=1) del fitxer. Mitjançant l&amp;#039;estructura &amp;#039;&amp;#039;dr_operation_t&amp;#039;&amp;#039; podem accedir a l&amp;#039;informació d&amp;#039;aquesta operació: &amp;#039;&amp;#039;op.date&amp;#039;&amp;#039; es la data en que es va emmagatzemar. &amp;#039;&amp;#039;op.code&amp;#039;&amp;#039; es el identificador d&amp;#039;operació que es va fer servir a &amp;#039;&amp;#039;dr_begin_op()&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Amb aquesta funció podem recórrer el fitxer obtenint un llistat de operacions (per mostrar a l&amp;#039;usuari, per exemple). Si volem tornar a l&amp;#039;estat en que es trobaven les dades en una operació donada, farem:&lt;br /&gt;
&lt;br /&gt;
 dr_undo_to(handle, (dr_operation_t*) &amp;amp;op);&lt;br /&gt;
&lt;br /&gt;
En aquest moment els &amp;#039;&amp;#039;tags&amp;#039;&amp;#039; interns de la llibreria s&amp;#039;han actualitzat (des-actualitzat) fins el punt en que es trobaven al realitzar la operació especificada. Ara els hem de llegir al nostre programa amb les funcions:&lt;br /&gt;
&lt;br /&gt;
 unsigned short tagNum;&lt;br /&gt;
 char           tagType;&lt;br /&gt;
 unsigned int   tagNElements;&lt;br /&gt;
 char          *tagPtr;&lt;br /&gt;
 &lt;br /&gt;
 while ((tagPtr=dr_next_tag(handle,&amp;amp;tagNum,&amp;amp;tagType,&amp;amp;tagNElements)) {&lt;br /&gt;
  ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Aquesta funció ens va retornant les tags una a una, cal repetir-la fins que retorni NULL. &amp;#039;&amp;#039;tagNum&amp;#039;&amp;#039; es el identificador del tag, &amp;#039;&amp;#039;tagType&amp;#039;&amp;#039; el tipus (BYTE, LONG, etc.) &amp;#039;&amp;#039;tagNElements&amp;#039;&amp;#039; el número de elements del tipus (&amp;#039;&amp;#039;&amp;#039;No&amp;#039;&amp;#039;&amp;#039; el número de bytes) i &amp;#039;&amp;#039;tagPtr&amp;#039;&amp;#039; el punter a les dades contingudes al tag (&amp;#039;&amp;#039;tagNElements&amp;#039;&amp;#039; de tipus &amp;#039;&amp;#039;tagType&amp;#039;&amp;#039;). Aquest punter no es pot alliberar ni modificar el seu contingut, doncs per motius d&amp;#039;eficiència es un punter a les dades internes que emmagatzema la llibreria.&lt;br /&gt;
&lt;br /&gt;
També es pot fer servir &amp;#039;&amp;#039;dr_get_tag&amp;#039;&amp;#039;, però no es recomanable per que ens demana el número de tag i no sabem quins tags hi han (no tenen perquè ser consecutius).&lt;br /&gt;
&lt;br /&gt;
Finalment ens hem de recordar d&amp;#039;alliberar l&amp;#039;iterador amb &amp;#039;&amp;#039;dr_free_iterator(iterador)&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Llibreria DRF ==&lt;br /&gt;
&lt;br /&gt;
Per que tot això funcioni sense masses modificacions dins del Carta, es va modificar la llibreria DRF. Aquesta llibreria modificada es va anomenar temporalment &amp;#039;&amp;#039;libdrf.x&amp;#039;&amp;#039; per diferenciar-la de la versió estable. Actualment, aquest codi es troba a &amp;#039;&amp;#039;branches/drs&amp;#039;&amp;#039; dins el repositori de &amp;#039;&amp;#039;libdrf&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Les modificacions respecte a la llibreria DRF original estàn orientades a tenir dues formes de treballar. La tradicional, llegint/escrivint els tags a un fitxer DRF a disk; i una nova forma enviant aquests &amp;#039;&amp;#039;tags&amp;#039;&amp;#039; a la llibreria DRS amb &amp;#039;&amp;#039;dr_set_tag&amp;#039;&amp;#039; i rebent-los amb &amp;#039;&amp;#039;dr_get_tag&amp;#039;&amp;#039; o &amp;#039;&amp;#039;dr_next_tag&amp;#039;&amp;#039;. Internament canvia poca cosa dins la llibreria, només que en comptes de treballar amb un FILE* a tot arreu es fa servir una estructura &amp;#039;&amp;#039;accessor&amp;#039;&amp;#039; que al final de tot ens dirà si escrivim a disk o a la llibreria.&lt;br /&gt;
&lt;br /&gt;
Des del punt de vista del Carta aquesta llibreria es igual a la normal, només que si fem un &amp;#039;&amp;#039;drf_open&amp;#039;&amp;#039; amb un &amp;#039;&amp;#039;path&amp;#039;&amp;#039; del tipus &amp;quot;drs://nnnnnnnn&amp;quot;, aquest DRF* que ens retorna treballarà amb DRS i no a un fitxer. El valor &amp;#039;&amp;#039;nnnnn&amp;#039;&amp;#039; ha de ser la direcció de memòria del handle de la llibreria DRS existent.&lt;br /&gt;
&lt;br /&gt;
Idealment s&amp;#039;ha de continuar desenvolupant aquest branch de libdrf i no la versió tradicional.&lt;br /&gt;
&lt;br /&gt;
== Treball pendent ==&lt;br /&gt;
&lt;br /&gt;
=== Checkpoints ===&lt;br /&gt;
&lt;br /&gt;
Veig que el Carta ara mateix només realitza checkpoints al crear una nova sessió (carregar un DRF nou, crear un nou projecte). S&amp;#039;hauria de generar un checkpoint de tant en tant (cada X operacions enmagatzemades). Millor encara, es podria modificar la llibreria libdrs per que ho fes internament de forma automàtica. Veure l&amp;#039;apartat millores.&lt;br /&gt;
&lt;br /&gt;
=== Desfer ===&lt;br /&gt;
&lt;br /&gt;
Dins el Carta no es va arribar a acabar el formulari de desfer operacions. El principal problema es donar un codi a cada modificació que fa l&amp;#039;usuari i desprès poder mostrar un icono d&amp;#039;eina o cursor que identifiqui aquella operació.&lt;br /&gt;
&lt;br /&gt;
== Millores ==&lt;br /&gt;
&lt;br /&gt;
=== Checkpoints ===&lt;br /&gt;
&lt;br /&gt;
Revisant el projecte passat un any no veig el motiu per no fer els checkpoints automàtics. La propia llibreria, a l&amp;#039;hora de escriure una nova operació al fitxer de sessió, podria escriure-la en forma de checkpoint i no de diferencies si ho troba convenient. Per exemple, si veu que s&amp;#039;han escrit més de X operacions incrementals des del darrer checkpoint, o més de X MBs, o ha passat mes de un temps donat. Tal com està ara mateix es la aplicació qui ha de estar controlant el numero d&amp;#039;operacions que s&amp;#039;han guardat.&lt;br /&gt;
&lt;br /&gt;
=== Altres ===&lt;br /&gt;
&lt;br /&gt;
A la memoria del projecte (&amp;#039;&amp;#039;pfc1380.pdf&amp;#039;&amp;#039;) es llisten algunes millores que es podrien fer (Secció 5.3 &amp;#039;&amp;#039;Trabajo futuro&amp;#039;&amp;#039;). Es interessant sobretot la &amp;#039;&amp;#039;linia de temps&amp;#039;&amp;#039; que permetria fer &amp;#039;&amp;#039;rewind&amp;#039;&amp;#039; al projecte fins a un punt anterior, similar al desfer però sense haver de mostrar un llistat d&amp;#039;operacions. Per això existeix la funció &amp;#039;&amp;#039;dr_seek_to(handle,(time_t)pos)&amp;#039;&amp;#039; a la llibreria.&lt;/div&gt;</summary>
		<author><name>Cadtsd</name></author>
	</entry>
</feed>