- Timestamp:
- 2007-05-25T16:12:13+12:00 (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gsdl-documentation/manuals/xml-source/fr/Develop_fr.xml
r13868 r14099 2 2 <Manual id="Develop" lang="fr"> 3 3 <Heading> 4 <Text id="1"/> 4 <Text id="1"/><Updated date="1-Mar-2004 by unknown"/> 5 5 </Heading> 6 6 <Title> 7 <Text id="2">Guide du développeur de la bibliothÚque numérique Greenstone</Text> 7 <Text id="2">Guide du développeur de la bibliothÚque numérique Greenstone</Text><Updated date="1-Mar-2004 by unknown"/> 8 8 </Title> 9 9 <Author> … … 17 17 <Text id="top_index">Retourner à l'indexe du dessus</Text> 18 18 </SupplementaryText> 19 <Text id="5">Greenstone est une suite logicielle destinée à la construction et à la distribution de collections de bibliothÚques numériques. Cette suite fournit une nouvelle maniÚre d'organiser l'information et de la publier sur l'Internet ou sur un cédérom. Greenstone est produit par le projet de bibliothÚque numérique de Nouvelle-Zélande (dépendant de l'université de Waikato), et distribué en coopération avec l'UNESCO et le projet de bibliothÚques pour l'humanité. C'est un logiciel Open Source, qu'on peut obtenir à l'URL http://greenstone.org, et qui est diffusé selon les termes de la licence publique générale de GNU.</Text>19 <Text id="5">Greenstone est une suite logicielle destinée à la construction et à la distribution de collections de bibliothÚques numériques. Cette suite fournit une nouvelle maniÚre d'organiser l'information et de la publier sur l'Internet ou sur un cédérom. Greenstone est produit par le projet de bibliothÚque numérique de Nouvelle-Zélande (dépendant de l'université de Waikato), et distribué en coopération avec l'UNESCO et le projet de bibliothÚques pour l'humanité. C'est un logiciel Open Source, qu'on peut obtenir à l'URL http://greenstone.org, et qui est diffusé selon les termes de la licence publique générale de GNU.</Text> 20 20 <Comment> 21 <Text id="6">Nous souhaitons nous assurer que ce logiciel fonctionne bien pour vous.<br/>Faites-nous part, en anglais, de tout problÚme à l'adresse électronique .</Text>21 <Text id="6">Nous souhaitons nous assurer que ce logiciel fonctionne bien pour vous.<br/>Faites-nous part, en anglais, de tout problÚme à l'adresse électronique [email protected].</Text> 22 22 </Comment> 23 23 <Version> … … 60 60 </Bullet> 61 61 </BulletList> 62 </Content> 63 </Section> 64 <Section id="copyright"> 65 <Title> 66 <Text id="copyright-title">Copyright</Text> 67 </Title> 68 <Content> 69 <Text id="right-text-1">Copyright 2002 2003 2004 2005 2006 2007 by the <Link url="http://www.nzdl.org">New Zealand Digital Library Project</Link> at <Link url="http://www.waikato.ac.nz">the University of Waikato</Link>, New Zealand.</Text> 70 <Text id="right-text-2">Permission is granted to copy, distribute and/or modify this document under the terms of the <Link url="http://www.gnu.org/licenses/fdl.html">GNU Free Documentation License</Link>, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled <Link url="http://greenstonewiki.cs.waikato.ac.nz/wiki/gsdoc/GNUFDL.html">âGNU Free Documentation License.â</Link></Text> 62 71 </Content> 63 72 </Section> … … 1998 2007 <Text id="489">Les greffons de traitement de documents sont utilisés par le logiciel de construction de collection pour analyser chaque document source d'une maniÚre qui dépend de son format. Le fichier de configuration d'une collection liste tous les greffons utilisés lors de sa construction. Lors de l'opération d'import, chaque fichier ou chaque répertoire est passé tour à tour à tous les greffons jusqu'à ce qu'un greffon soit trouvé qui puisse traiter l'objet -- c'est pourquoi les premiers greffons listés ont la priorité sur des greffons apparaissant plus tard dans la liste. Si aucun greffon ne peut traiter le fichier, un avertissement est affiché (sur la sortie d'erreur standard) et le traitement passe au fichier suivant (c'est pourquoi l'option block_exp peut être utile -- pour éviter ces messages d'erreur dans le cas de fichiers qui sont peut-être présents mais n'ont pas besoin d'être traités). Lors de la construction, on utilise la même procédure, mais c'est le répertoire archives qui est traité en lieu et place du répertoire import.</Text> 1999 2008 <Text id="490">Les greffons standard de Greenstone sont listés table <CrossRef target="Table" ref="greenstone_plugins"/>. Il est nécessaire d'utiliser un processus récursif pour traverser des hiérarchies de répertoires. Bien que les programmes d'import et de construction n'effectuent pas de récursion explicite, certains greffons provoquent une récursion indirecte en passant des noms de fichiers ou de répertoires dans le pipe-line des greffons. Par exemple, la maniÚre habituelle d'opérer récursivement à travers une hiérarchie de répertoire est de spécifier RecPlug, qui travaille exactement ainsi. S'il est présent, il devrait être en derniÚre position dans le pipe-line. Seuls les deux premiers greffons de la table <CrossRef target="Table" ref="greenstone_plugins"/> provoquent une récursion indirecte.</Text> 2000 <Text id="491">Certains greffons sont écrits pour des collections spécifiques, avec un format de document que l'on ne trouve nulle part ailleurs, tel que le texte électronique utilisé dans la collection Gutenberg <FootnoteRef id="2"/>. Ces greffons spécifiques à une collection se trouvent dans le répertoire perllib/plugins de la collection. On peut utiliser des greffons spécifiques à une collection pour remplacer des greffons généraux portant le même nom, qui ne seront alors pas appelés.</Text>2009 <Text id="491">Certains greffons sont écrits pour des collections spécifiques, avec un format de document que l'on ne trouve nulle part ailleurs, tel que le texte électronique utilisé dans la collection Gutenberg. Ces greffons spécifiques à une collection se trouvent dans le répertoire perllib/plugins de la collection. On peut utiliser des greffons spécifiques à une collection pour remplacer des greffons généraux portant le même nom, qui ne seront alors pas appelés.</Text> 2001 2010 <Text id="492">Certains greffons de traitement de documents utilisent des programmes externes qui analysent des formats de fichiers propriétaires spécifiques -- tel que par exemple Microsoft Word -- et les transforment en texte brut ou en HTML. Un greffon général appelé ConvertToPlug invoque le programme de conversion approprié et en passe le résultat aux greffons TEXTPlug ou HTMLPlug. Nous décrirons cette opération plus en détail sous peu.</Text> 2002 2011 <Text id="493">Certains greffons disposent d'options individuelles, qui les contrÃŽlent de maniÚre plus fine que ce que permettent les options générales. C'est la table <CrossRef target="Table" ref="plugin-specific_options"/> qui décrit ces options individuelles.</Text> … … 2254 2263 <CodeLine></DirectoryMetadata></CodeLine> 2255 2264 </Figure> 2256 <Text id="550">Le fichier d'exemple contient deux structures de méta-données. Dans chacune, l'élément filename décrit les fichiers auxquels les méta-données s'appliquent, sous la forme d'une expression rationnelle. <FileName>nugget.*</FileName> indique ainsi que le premier enregistrement de méta-données s'applique à tous les fichiers dont le nom commence par «nugget»<FootnoteRef id=" 3"/>. Pour ces fichiers, la méta-donnée Title vaudra «Phare de Nugget Point».</Text>2265 <Text id="550">Le fichier d'exemple contient deux structures de méta-données. Dans chacune, l'élément filename décrit les fichiers auxquels les méta-données s'appliquent, sous la forme d'une expression rationnelle. <FileName>nugget.*</FileName> indique ainsi que le premier enregistrement de méta-données s'applique à tous les fichiers dont le nom commence par «nugget»<FootnoteRef id="2"/>. Pour ces fichiers, la méta-donnée Title vaudra «Phare de Nugget Point».</Text> 2257 2266 <Text id="551">Les éléments de méta-données sont traités dans l'ordre dans lequel ils apparaissent. La deuxiÚme structure de la figure 10 positionne la méta-donnée Title pour le fichier nugget-point-1.jpg à la valeur «Phare de Nugget Point, Catlins», en écrasant la spécification précédente. Elle ajoute également un champ Subject dans les méta-données.</Text> 2258 2267 <Text id="552">Parfois, les méta-données sont multi-valuées et les nouvelles valeurs devraient s'accumuler au lieu d'écraser les précédentes. L'attribut mode=accumulate a cet effet. Il est appliqué à la méta-donnée Place (lieu) dans la premiÚre spécification de la figure 10, cette méta-donnée sera donc multi-valuée. Pour revenir à une méta-donnée simple, écrivez<i><Metadata name="Place" mode="override">Nouvelle-Zélande</Metadata></i>En fait, on peut négliger de préciser cette spécification de mode puisque tout élément écrase le précédent par défaut, sauf indication contraire. Pour accumuler les méta-données dans un champ particulier, il faut préciser mode=accumulate à chaque occurrence.</Text> … … 2315 2324 <File width="394" height="143" url="images/Dev_Fig_12.png"/> 2316 2325 </Figure> 2317 <Text id="569">Un classificateur plus simple, appelé List, et illustré dans la figure <CrossRef target="Figure" ref="list_classifier"/>, crée une liste triée d'une méta-donnée spécifiée et l'affiche sans créer de tranches alphabétiques. Un exemple est la méta-donnée how to de la collection «Demo», qui est produite par la ligne classify List -metadata Howto dans le fichier de configuration de la collection<FootnoteRef id=" 4"/>. Un autre classificateur de liste générique est DateList, illustré dans la figure <CrossRef target="Figure" ref="datelist_classifier"/>, qui engendre une liste de sélection d'intervalles de dates (le classificateur DateList est également utilisé dans la collection «Archives» de Greenstone).</Text>2326 <Text id="569">Un classificateur plus simple, appelé List, et illustré dans la figure <CrossRef target="Figure" ref="list_classifier"/>, crée une liste triée d'une méta-donnée spécifiée et l'affiche sans créer de tranches alphabétiques. Un exemple est la méta-donnée how to de la collection «Demo», qui est produite par la ligne classify List -metadata Howto dans le fichier de configuration de la collection<FootnoteRef id="3"/>. Un autre classificateur de liste générique est DateList, illustré dans la figure <CrossRef target="Figure" ref="datelist_classifier"/>, qui engendre une liste de sélection d'intervalles de dates (le classificateur DateList est également utilisé dans la collection «Archives» de Greenstone).</Text> 2318 2327 <Figure id="datelist_classifier"> 2319 2328 <Title> … … 2696 2705 <Text id="664">Le mot-clef format précÚde un mot-clef en deux parties, dont une seule est obligatoire. La premiÚre partie identifie la liste où s'applique le format. La liste générée par une recherche s'appelle Search (rechercher), tandis que les listes générées par des classificateurs sont appelées CL1, CL2, CL3,... pour respectivement le premier, le deuxiÚme, le troisiÚme... classificateur spécifié dans le fichier collect.cfg. La deuxiÚme partie du mot-clef est la portion de la liste à laquelle appliquer la mise en forme -- soit HList (pour une liste horizontale, telle que le sélecteur dans un noeud AZList), VList (pour une liste verticale, telle que la liste des tous les titres sous un noeud de type AZList), ou DateList. Par exemple:</Text> 2697 2706 <Indented> 2698 <Text id="665"> format CL4VList ... s'applique à tous les VListde CL4</Text>2707 <Text id="665"><i>format CL4VList</i> ... s'applique à tous les <i>VList</i> de CL4</Text> 2699 2708 </Indented> 2700 2709 <Indented> 2701 <Text id="666"> format CL2HList ... s'applique à tous les HListde CL2</Text>2710 <Text id="666"><i>format CL2HList</i> ... s'applique à tous les <i>HList</i> de CL2</Text> 2702 2711 </Indented> 2703 2712 <Indented> 2704 <Text id="667"> format CL1DateList ... s'applique à tous les DateListde CL1</Text>2713 <Text id="667"><i>format CL1DateList</i> ... s'applique à tous les <i>DateList</i> de CL1</Text> 2705 2714 </Indented> 2706 2715 <Indented> 2707 <Text id="668"> format SearchVList... s'applique à la liste de Résultats de la recherche</Text>2716 <Text id="668"><i>format SearchVList</i> ... s'applique à la liste de Résultats de la recherche</Text> 2708 2717 </Indented> 2709 2718 <Indented> 2710 <Text id="669"> format CL3... s'applique à tous les noeuds de CL3, sauf indication contraire</Text>2719 <Text id="669"><i>format CL3</i> ... s'applique à tous les noeuds de CL3, sauf indication contraire</Text> 2711 2720 </Indented> 2712 2721 <Indented> 2713 <Text id="670"> format VList ... s'applique à tous les VListde tous les classificateurs, sauf indication contraire</Text>2722 <Text id="670"><i>format VList</i> ... s'applique à tous les <i>VList</i> de tous les classificateurs, sauf indication contraire</Text> 2714 2723 </Indented> 2715 2724 <Text id="671">Les<i>"..."</i>de ces exemples représentent des spécifications de formatage HTML qui contrÃŽlent l'information et sa représentation, apparaissant sur des pages web représentant le classificateur. Comme pour les spécifications HTML, toute méta-donnée peut apparaître entre crochets: sa valeur est interpolée à l'endroit indiqué. Tout élément de la table <CrossRef target="Table" ref="the_format_options"/> peut également apparaître dans des chaînes de formatage. La syntaxe des chaînes prévoit également une instruction conditionnelle, qui est illustrée plus bas.</Text> … … 2865 2874 <Content> 2866 2875 <Text id="717">Les macros sont puissantes, et peuvent sembler un peu obscures. Mais avec une bonne connaissance de HTML et un peu de pratique elles deviennent une maniÚre rapide et facile de personnaliser votre site Greenstone.</Text> 2867 <Text id="718">Supposons par exemple que vous souhaitiez créer une page statique qui ressemble à votre site Greenstone actuel. Vous pouvez créer un nouveau paquetage, que vous appellerez static par exemple, dans un nouveau fichier, et y redéfinir la macro _content_. Ajoutez ce nom de fichier dans GSDLHOME/etc/main.cfg, que Greenstone charge à chaque fois qu'il est invoqué. Vous accéderez à la nouvelle page en utilisant votre URL habituelle pour Greenstone et en lui ajoutant les arguments ?a=p&p=static (on obtiendra par exemple l'URL complÚte suivante: http://serveur/cgi-bin/library?a=p&p=static).</Text>2876 <Text id="718">Supposons par exemple que vous souhaitiez créer une page statique qui ressemble à votre site Greenstone actuel. Vous pouvez créer un nouveau paquetage, que vous appellerez static par exemple, dans un nouveau fichier, et y redéfinir la macro _content_. Ajoutez ce nom de fichier dans GSDLHOME/etc/main.cfg, que Greenstone charge à chaque fois qu'il est invoqué. Vous accéderez à la nouvelle page en utilisant votre URL habituelle pour Greenstone et en lui ajoutant les arguments ?a=p&p=static (on obtiendra par exemple l'URL complÚte suivante: http://serveur/cgi-bin/library?a=p&p=static).</Text> 2868 2877 <Text id="719">Pour modifier l'apparence et l'ergonomie de Greenstone vous pouvez éditer les paquetages base et style. Pour modifier la page d'accueil de Greenstone, éditez le paquetage home (ceci est décrit dans le Guide d'installation de la bibliothÚque numérique Greenstone). Pour modifier la page de requêtes, éditez le fichier query.dm.</Text> 2869 2878 <Text id="720">Expérimentez sans crainte avec les macros. Les modifications apparaissent instantanément, puisque les macros sont interprétées lors de l'affichage des pages. Le langage de macros est un outil puissant que vous pouvez utiliser pour vous approprier vraiment votre site Greenstone.</Text> … … 3067 3076 <Text id="775">SystÚme d'exécution de Greenstone</Text> 3068 3077 </Title> 3069 <File width="534" height="345" url="images/Dev_Fig_24 .png"/>3078 <File width="534" height="345" url="images/Dev_Fig_24_resized.png"/> 3070 3079 </Figure> 3071 3080 <Text id="776">La figure <CrossRef target="Figure" ref="greenstone_runtime_system"/> illustre les portions principales du systÚme d'exécution de Greenstone. Au sommet, le réceptionniste initialise d'abord ses composants, puis analyse les arguments CGI pour savoir quelle action appeler. Lors de l'exécution de l'action (ce qui comprend d'autres traitements des arguments CGI), le logiciel utilise le protocole pour accéder au contenu de la collection. La réponse est utilisée pour générer une page web, avec l'aide du composant de mise en forme et du langage de macros.</Text> … … 4212 4221 </Bullet> 4213 4222 </BulletList> 4214 <Text id="1019">Au début de la définition de classe, argsinfo est le champ de données protégé (utilisé dans l'extrait de code représenté dans la figure <CrossRef target="Figure" ref="using_the_cgiargsinfoclass_from_pageactioncpp"/>) qui stoke les informations d'argument CGI spécifiées dans une fonction constructeur d'action héritée. L'autre champ de données, gsdlhome, enregistre GSDLHOME pour pouvoir y accéder plus facilement<FootnoteRef id=" 5"/>. L'objet inclut également les fonctions configure() et init() à des fins d'initialisation.</Text>4223 <Text id="1019">Au début de la définition de classe, argsinfo est le champ de données protégé (utilisé dans l'extrait de code représenté dans la figure <CrossRef target="Figure" ref="using_the_cgiargsinfoclass_from_pageactioncpp"/>) qui stoke les informations d'argument CGI spécifiées dans une fonction constructeur d'action héritée. L'autre champ de données, gsdlhome, enregistre GSDLHOME pour pouvoir y accéder plus facilement<FootnoteRef id="4"/>. L'objet inclut également les fonctions configure() et init() à des fins d'initialisation.</Text> 4215 4224 </Content> 4216 4225 </Subsection> … … 5174 5183 </Figure> 5175 5184 <Text id="1226">En STL, on fait des tableaux associatifs en utilisant l'objet map (carte, ou correspondance). La figure <CrossRef target="Figure" ref="using_associative_arrays_in_stl"/> présente un exemple quelque peu artificiel qui stocke l'âge de trois personnes (Alice, Pierre, et Marie) dans un tableau associatif indicé par leurs prénoms (lignes 19-22). Le problÚme est d'écrire une fonction qui calcule l'âge total de toutes les personnes présentes, sans savoir combien elles sont ni qui elles sont. Bien sûr, on pourrait résoudre ce problÚme avec un classique tableau d'entiers indicés numériquement. L'exemple est contraint d'illustrer les fonctionnalités de l'objet map et de mettre en valeur les similarités de traitement avec l'objet list équipé d'un iterator.</Text> 5176 <Text id="1227">Tout comme list, map est une classe de contenance. Cependant, lorsque l'on déclare une variable de ce type, il faut spécifier deux<FootnoteRef id=" 6"/>choses: le type d'index, et le type d'élément. Comme on peut le voir ligne 19, on obtient un tableau associatif qui stocke des entiers indicés par des chaînes en écrivant char* (c'est la maniÚre de déclarer une chaîne en C++) en tant que type d'indiçage suivi de int en tant que type d'élément.</Text>5185 <Text id="1227">Tout comme list, map est une classe de contenance. Cependant, lorsque l'on déclare une variable de ce type, il faut spécifier deux<FootnoteRef id="5"/>choses: le type d'index, et le type d'élément. Comme on peut le voir ligne 19, on obtient un tableau associatif qui stocke des entiers indicés par des chaînes en écrivant char* (c'est la maniÚre de déclarer une chaîne en C++) en tant que type d'indiçage suivi de int en tant que type d'élément.</Text> 5177 5186 <Text id="1228">Il existe plusieurs maniÚres de stocker des éléments dans le tableau associatif. Dans l'exemple, on utilise lignes 20-22 l'indice de tableau [ ], qui est surchargé, pour initialiser le tableau avec les âges des trois personnes. La ressemblance entre total_int_table -- qui effectue le calcul principal dans le programme -- et total_int_list de la figure <CrossRef target="Figure" ref="programming_a_list_of_integers"/> est frappante. Ces deux objets sont en fait presque identiques, et ce n'est pas une coïncidence. STL utilise lourdement l'héritage de sorte que des objets différents utilisent encore les mêmes opérations fondamentales. C'est particuliÚrement le cas des itérateurs (iterator). Les petites différences entre les deux fonctions sont que l'itérateur est maintenant tiré de map<char*, int>, et que l'accÚs à ses éléments se fait avec curr->second() -- en effet la déréférenciation de la variable (*curr) est définie comme devant renvoyer un objet de type pair. Ceci enregistre à la fois le nom d'index (first, ou «premier») et la valeur de l'élément (second, ou «deuxiÚme»), mais seul la deuxiÚme nous intéresse. à part cela, le code est identique. La seule différence restante -- le changement de l'unique argument de la fonction d'un pointeur vers une référence -- est superficielle.</Text> 5178 5187 <Text id="1229">Greenstone utilise largement deux autres types STL: vector (vecteur), et set (ensemble). Le premier facilite les tableaux dynamiques, et le second supporte les opérations ensemblistes mathématiques telles que l'union, l'intersection, et la différence ensembliste.</Text> … … 5208 5217 </Footnote> 5209 5218 <Footnote id="2"> 5210 <Text id="1247">... Gutenberg N.D.T.: projet de numérisation de la littérature classique en langue anglaise libre de droits, disponible sur le web.</Text>5219 <Text id="1247">...nugget» Attention: dans Greenstone, les expressions rationnelles sont interprétées dans le langage Perl, et les conventions diffÚrent subtilement d'autres conventions. Par exemple, «*» correspond à zéro ou plusieurs occurrences du caractÚre qui précÚde, et «.» remplace n'importe quel caractÚre -- donc «nugget.*» correspond à toute chaîne commençant par «nugget», que ce préfixe soit suivi d'un point ou non. Pour imposer un point à cette position il faudrait échapper le point, et écrire «nugget..*» à la place.</Text> 5211 5220 </Footnote> 5212 5221 <Footnote id="3"> 5213 <Text id="1248">... nugget» Attention: dans Greenstone, les expressions rationnelles sont interprétées dans le langage Perl, et les conventions diffÚrent subtilement d'autres conventions. Par exemple, «*» correspond à zéro ou plusieurs occurrences du caractÚre qui précÚde, et «.» remplace n'importe quel caractÚre -- donc «nugget.*» correspond à toute chaîne commençant par «nugget», que ce préfixe soit suivi d'un point ou non. Pour imposer un point à cette position il faudrait échapper le point, et écrire «nugget..*» à la place.</Text>5222 <Text id="1248">... collection Remarquez que les versions les plus récentes de la collection «Demo» utilisent un classificateur Hierarchy pour représenter les méta-données how to (comment faire). Dans de tels cas de figure, elles apparaîtront un peu différemment que dans la figure <CrossRef target="Figure" ref="list_classifier"/>.</Text> 5214 5223 </Footnote> 5215 5224 <Footnote id="4"> 5216 <Text id="1249">... collection Remarquez que les versions les plus récentes de la collection «Demo» utilisent un classificateur Hierarchy pour représenter les méta-données how to (comment faire). Dans de tels cas de figure, elles apparaîtront un peu différemment que dans la figure <CrossRef target="Figure" ref="list_classifier"/>.</Text>5225 <Text id="1249">... facilement La valeur gsdlhome provient du fichier gsdlsite.cfg situé dans le même répertoire que l'exécutable CGI library, alors que GSDLHOME est positionné en exécutant le script setup qui accÚde à un fichier différent; il est donc techniquement possible que les deux valeurs soient différentes. C'est possible, mais pas désirable, et le texte ci-dessus est écrit dans l'hypothÚse où ces deux valeurs sont égales.</Text> 5217 5226 </Footnote> 5218 5227 <Footnote id="5"> 5219 <Text id="1250"> ... facilement La valeur gsdlhome provient du fichier gsdlsite.cfg situé dans le même répertoire que l'exécutable CGI library, alors que GSDLHOME est positionné en exécutant le script setup qui accÚde à un fichier différent; il est donc techniquement possible que les deux valeurs soient différentes. C'est possible, mais pas désirable, et le texte ci-dessus est écrit dans l'hypothÚse où ces deux valeurs sont égales.</Text>5228 <Text id="1250">Technically there are four types, but the last two are optional. Since we are only giving a basic introduction to this STL class, details about these last two types are omitted.</Text> 5220 5229 </Footnote> 5221 5230 </FootnoteList>
Note:
See TracChangeset
for help on using the changeset viewer.