<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<?xml-stylesheet href="docbook.xsl" type="text/xsl"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<article lang="pt_BR">
  <articleinfo>
    <title>Usando o Subversion</title>
    <authorgroup>
      <author>
        <firstname>Leonardo</firstname>
        <othername>Serra Maciel de</othername>
        <surname>Campos</surname>
        <affiliation>
          <address>
            <email>linuxbh@brfree.com.br</email>
          </address>
        </affiliation>
      </author>
    </authorgroup>
    <revhistory>
      <revision>
        <revnumber>0.1</revnumber>
        <date>2004-09-17 10:50:04 -0300</date>
        <authorinitials>Leonardo Serra Maciel de Campos</authorinitials>
      </revision>
      <revision>
        <revnumber>0.2</revnumber>
        <date>2004-09-20 12:06:23 -0300</date>
        <authorinitials>Leonardo Serra Maciel de Campos</authorinitials>
      </revision>
      <revision>
        <revnumber>0.3</revnumber>
        <date>2004-09-20 20:46:01 -0300</date>
        <authorinitials>Leonardo Serra Maciel de Campos</authorinitials>
      </revision>
      <revision>
        <revnumber>0.4</revnumber>
        <date>2004-09-20 23:03:09 -0300</date>
        <authorinitials>Leonardo Serra Maciel de Campos</authorinitials>
      </revision>
      <revision>
        <revnumber>0.5</revnumber>
        <date>2004-09-21 21:54:54 -0300</date>
        <authorinitials>Leonardo Serra Maciel de Campos</authorinitials>
      </revision>
      <revision>
        <revnumber>0.6</revnumber>
        <date>2004-09-22 00:05:11 -0300</date>
        <authorinitials>Leonardo Serra Maciel de Campos</authorinitials>
      </revision>
      <revision>
        <revnumber>0.7</revnumber>
        <date>2004-09-22 09:07:04 -0300</date>
        <authorinitials>Leonardo Serra Maciel de Campos</authorinitials>
      </revision>
      <revision>
        <revnumber>0.8</revnumber>
        <date>2004-09-27 23:50:53 -0300</date>
        <authorinitials>Leonardo Serra Maciel de Campos</authorinitials>
      </revision>
      <revision>
        <revnumber>0.9</revnumber>
        <date>2005-01-29 10:13:49 -0300</date>
        <authorinitials>Leonardo Serra Maciel de Campos</authorinitials>
      </revision>
      <revision>
        <revnumber>1.0</revnumber>
        <date>2005-02-20 17:50:52 -0300</date>
        <authorinitials>Leonardo Serra Maciel de Campos</authorinitials>
      </revision>
      <revision>
        <revnumber>1.1</revnumber>
        <date>2007-02-06 11:38:17 -0200</date>
        <authorinitials>Leonardo Serra Maciel de Campos</authorinitials>
      </revision>
    </revhistory>
    <copyright>
      <year>2004-2007</year>
      <holder>Leonardo Serra Maciel de Campos</holder>
    </copyright>
    <legalnotice>
      <para>Este documento é licenciado sobre a licença de Atribuição-Compartilhamento da Creative Commons. Para ver uma cópia desta licença, visite <ulink url="http://creativecommons.org/licenses/by-sa/2.0/"/> ou envie uma carta para Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.</para>
    </legalnotice>
    <abstract>
      <para>Este documento visa ensinar como usar o Subversion para fazer controle de versão.</para>
    </abstract>
  </articleinfo>
  <sect1>
    <title>Introdução</title>
    <sect2>
      <title>O que é Subversion?</title>
      <para>O objetivo do projeto Subversion é construir um sistema de controle de versão que seja um substituto para o CVS. O Subversion é liberado sob a licença Apache/BSD-style.</para>
    </sect2>
    <sect2>
      <title>Controle de versões</title>
      <para>Com o controle de versões podemos gravar o histórico de todos os nossos arquivos. Por exemplo às vezes são criados problemas quando o <glossterm baseform="Logicial">logicial</glossterm> é modificado, e o programador pode detectar isto muito tempo depois da modificação, acarretando um problema grave para descobrir onde aconteceu tal falha. Com o controle de versões podemos restaurar facilmente as versões antigas para ver exatamente qual mudança gerou tal problema.</para>
      <para>Poderíamos, é claro, guardar todas as versões de todos os arquivos que criamos sem a ajuda de uma ferramenta de controle de versão. Porém, além do desperdício de um espaço considerável em disco, o Subversion armazena todas as versões de uma forma inteligente, guardando apenas as diferenças entre as versões. O que é muito mais vantajoso.</para>
      <para>Podemos realizar o controle de versão para todo tipo de arquivo. Não apenas para arquivos de codigo fonte, mas qualquer tipo de arquivo, incluindo arquivos binarios.</para>
      <note>
        <para>
          <ulink url="http://www.ead.unicamp.br/minicurso/cvs/">Esta seção foi adaptada do minicurso de CVS da Unicamp.</ulink>
        </para>
      </note>
    </sect2>
  </sect1>
  <sect1>
    <title>Ambiente</title>
    <para>Será presumido que o seu sistema <glossterm baseform="Debian GNU/Linux">Debian GNU/Linux</glossterm> e o aptitude estão corretamente configurados.</para>
    <note>
      <para>Apesar da instalação ser para <glossterm baseform="Debian GNU/Linux">Debian GNU/Linux</glossterm>, os comandos são independentes do sistema operacional e dependentes apenas do Subversion estar instalado, assim apenas a seção de instalação se refere a <glossterm baseform="Debian GNU/Linux">Debian GNU/Linux</glossterm>.</para>
    </note>
    <para>Também estaremos acreditando que o seu servidor Subversion já se encontra instalado, configurado e rodando de maneira correta. Estaremos acessando o servidor Subversion pelo protocolo WebDAV/DeltaV, pois este é o método de acesso que mais recursos possui.</para>
    <note>
      <para>Apesar de estarmos utilizando o protocolo WebDAV/DeltaV para acessar o servidor Subverion existem outras maneiras de se realizar esta tarefa, para conhecer melhor estas maneiras é recomendado a leitura do <ulink url="http://svnbook.red-bean.com/">livro sobre o Subversion</ulink>.</para>
    </note>
    <para>A tabelo abaixo mostra as versões de cada <glossterm baseform="Logicial">logicial</glossterm> usado.</para>
    <table>
      <title>Versão dos logiciais</title>
      <tgroup cols="2">
        <thead>
          <row>
            <entry>
              <glossterm baseform="Logicial">Logicial</glossterm>
            </entry>
            <entry>Versão</entry>
          </row>
        </thead>
        <tbody>
          <row>
            <entry>Debian GNU/Linux</entry>
            <entry>Sarge</entry>
          </row>
          <row>
            <entry>subversion</entry>
            <entry>1.1.4-2</entry>
          </row>
        </tbody>
      </tgroup>
    </table>
    <para>A tabelo abaixo mostra as principais características do ambiente onde foi feito esta documentação.</para>
    <table>
      <title>Ambiente</title>
      <tgroup cols="2">
        <tbody>
          <row>
            <entry>Servidor Subversion</entry>
            <entry>
              <replaceable>svn.exemplo.com.br</replaceable>
            </entry>
          </row>
          <row>
            <entry>Método de acesso ao repositório</entry>
            <entry>
              <replaceable>http://</replaceable>
            </entry>
          </row>
          <row>
            <entry>Endereço para acesso ao repositório</entry>
            <entry>
              <replaceable>http://svn.exemplo.com.br/svn/</replaceable>
            </entry>
          </row>
          <row>
            <entry>Servidor proxy</entry>
            <entry>
              <replaceable>proxy.exemplo.com.br</replaceable>
            </entry>
          </row>
          <row>
            <entry>Porta do servidor proxy</entry>
            <entry>
              <replaceable>3128</replaceable>
            </entry>
          </row>
        </tbody>
      </tgroup>
    </table>
    <note>
      <para>Usaremos palavras <replaceable>desta maneira</replaceable> para indicar substituição.</para>
    </note>
  </sect1>
  <sect1>
    <title>Instalação</title>
    <warning>
      <para>Execute a etapa de instalação como usuário root, as demais etapas não precisam ser realizadas pelo usuário root!</para>
    </warning>
    <orderedlist numeration="arabic">
      <listitem>
        <para>É necessário instalar o pacote do cliente do Subversion, para isto execute:</para>
        <screen><prompt>#</prompt> <userinput>aptitude install subversion</userinput></screen>
      </listitem>
    </orderedlist>
  </sect1>
  <sect1>
    <title>Configuração</title>
    <orderedlist numeration="arabic">
      <listitem>
        <para>Podemos alterar nosso método de acesso de <replaceable>http://</replaceable> para <replaceable>https://</replaceable>, assim as transações com o servidor serão criptografadas. Para criar uma copia local do repositório desta maneira, execute:</para>
        <screen><prompt>$</prompt> <userinput>svn checkout <replaceable>https://</replaceable><replaceable>svn.exemplo.com.br/svn/</replaceable></userinput></screen>
        <note>
          <para>O Apache2 deve estar configurado para tratar conexões HTTPS.</para>
        </note>
        <warning>
          <para>Caso o Apache2 esteja utilizando um certificado não assinado por uma certificadora autorizada será mostrada as informações do certificado e será necessário aceita-lo manualmente. Para isto responda <userinput>t</userinput> para aceitar temporariamente, <userinput>a</userinput> para aceitar definitivamente ou <userinput>r</userinput> para rejeitar definitivamente.</para>
          <para>A opção de aceitar definitivamente o certificado só existe caso as informações de autenticação estejam sendo gravadas, para mudar isto edite o arquivo em <filename>~/.subversion/config</filename> e altere a seguinte linha de:</para>
          <screen>store-auth-creds = no</screen>
          <para>Para:</para>
          <screen>store-auth-creds = yes</screen>
          <para>Caso a linha não exista ou esteja comentada (começando com #), basta acrecentar ela dentro da seção <userinput>[auth]</userinput></para>
        </warning>
      </listitem>
      <listitem>
        <para>Por padrão o cliente Subversion só irá pedir senha durante a primeira conexão com o servidor Subversion, pois o cliente do Subversion irá armazenar a senha e outras informações de autenticação em <filename>~/.subversion/auth</filename>. Isto cria possíveis pontos de exploração do servidor Subversion, para mudar isto edite o arquivo em <filename>~/.subversion/config</filename> e altere a seguinte linha de:</para>
        <screen>store-passwords = yes</screen>
        <para>Para:</para>
        <screen>store-passwords = no</screen>
        <para>Caso a linha não exista ou esteja comentada (começando com #), basta acrecentar ela dentro da seção <userinput>[auth]</userinput></para>
      </listitem>
      <listitem>
        <para>Caso a conexão com o servidor Subversion seja atraves de um servidor proxy, edite o arquivo <filename>~/.subversion/servers</filename> e acrescente as seguintes linhas:</para>
        <screen>
[global]
http-proxy-host = <replaceable>proxy.exemplo.com.br</replaceable>
http-proxy-port = <replaceable>3128</replaceable>
</screen>
        <note>
          <para>Caso exista algum servidor Subversion que deva ser acessado sem servidor proxy, acrescente a linha abaixo ao arquivo dentro da seção <userinput>[global]</userinput>, colocando cada servidor separado por virgula.
<screen>http-proxy-exceptions = <replaceable>localhost, 192.168.0.1</replaceable></screen>
</para>
        </note>
      </listitem>
    </orderedlist>
  </sect1>
  <sect1>
    <title>Ciclo básico de trabalho</title>
    <orderedlist numeration="arabic">
      <listitem>
        <para>Criar uma copia local do repositório:</para>
        <screen><prompt>$</prompt> <userinput>svn checkout <replaceable>http://svn.exemplo.com.br/svn/</replaceable></userinput></screen>
        <warning>
          <para>Esta etapa só é necessária ser executada uma vez.</para>
        </warning>
      </listitem>
      <listitem>
        <para>Atualizando a copia local do repositório:</para>
        <screen><prompt>$</prompt> <userinput>svn update</userinput></screen>
      </listitem>
      <listitem>
        <para>Altere os arquivos através do seu editor predileto e/ou executando comandos de alteração da estrutura do repositório.</para>
      </listitem>
      <listitem>
        <para>Atualizando a copia local do repositório:</para>
        <screen><prompt>$</prompt> <userinput>svn update</userinput></screen>
      </listitem>
      <listitem>
        <para>Enviando as alterações para o repositório:</para>
        <screen><prompt>$</prompt> <userinput>svn commit</userinput></screen>
      </listitem>
    </orderedlist>
  </sect1>
  <sect1>
    <title>Comandos</title>
    <itemizedlist>
      <listitem>
        <para>Criando uma copia local do repositório:</para>
        <screen><prompt>$</prompt> <userinput>svn checkout <replaceable>http://svn.exemplo.com.br/svn/</replaceable></userinput></screen>
        <warning>
          <para>Isto ira criar uma pasta chamada svn. Todos os outros comandos deverão ser executados dentro desta pasta.</para>
        </warning>
      </listitem>
      <listitem>
        <itemizedlist>
          <para>Atualizar o repositório local:</para>
          <listitem>
            <para>Atualizando a copia local do repositório:</para>
            <screen><prompt>$</prompt> <userinput>svn update</userinput></screen>
          </listitem>
          <listitem>
            <para>Atualizando a copia local do repositório para a revisão 3:</para>
            <screen><prompt>$</prompt> <userinput>svn -r 3 update</userinput></screen>
          </listitem>
          <listitem>
            <para>Atualizando <filename>trem</filename> para a revisão 3 do repositório:</para>
            <screen><prompt>$</prompt> <userinput>svn -r 3 update <filename>trem</filename></userinput></screen>
          </listitem>
        </itemizedlist>
      </listitem>
      <listitem>
        <itemizedlist>
          <para>Alterando a estrutura do repositório:</para>
          <listitem>
            <para>Adicionando <filename>trem</filename> ao repositório:</para>
            <screen><prompt>$</prompt> <userinput>svn add <filename>trem</filename></userinput></screen>
            <note>
              <para>A adição de pasta é realizada no modo recursivo. Opcionalmente pode ser passado o parâmetro <userinput>-N</userinput> que tornara a adição não recursiva.</para>
            </note>
          </listitem>
          <listitem>
            <para>Removendo <filename>trem</filename> do repositório:</para>
            <screen><prompt>$</prompt> <userinput>svn delete <filename>trem</filename></userinput></screen>
            <warning>
              <para>A remoção de pasta é realizada no modo recursivo.</para>
            </warning>
            <note>
              <para>A remoção não deve ser feita através do comando <userinput>rm</userinput>, pois ela só será apagada após o envio das operações realizadas localmente para o repositório.</para>
            </note>
          </listitem>
          <listitem>
            <para>Criando uma copia de <filename>trem</filename> para <filename>coisa</filename> no repositório:</para>
            <screen><prompt>$</prompt> <userinput>svn copy <filename>trem</filename> <filename>coisa</filename></userinput></screen>
            <note><para>A vantagem da utilização deste comando é que ele realiza a copia de <filename>trem</filename> para <filename>coisa</filename> através do tradicional utilitario <userinput>cp</userinput> e em seguencia realiza a adição de <filename>coisa</filename> ao repositório.</para></note>
          </listitem>
          <listitem>
            <para>Alterando o nome de <filename>trem</filename> para <filename>coisa</filename> no repositório:</para>
            <screen><prompt>$</prompt> <userinput>svn move <filename>trem</filename> <filename>coisa</filename></userinput></screen>
            <note><para>A vantagem da utilização deste comando é que ele move de <filename>trem</filename> para <filename>coisa</filename> através do tradicional utilitario <userinput>mv</userinput>, em seguencia realiza a adição de <filename>coisa</filename> ao repositório e a remoção de <filename>trem</filename> do repositório.</para></note>
          </listitem>
          <listitem>
            <para>Criando a pasta <filename>trem</filename> no repositório:</para>
            <screen><prompt>$</prompt> <userinput>svn mkdir <filename>trem</filename></userinput></screen>
            <note><para>A vantagem da utilização deste comando é que ele cria a pasta <filename>trem</filename> através do tradicional utilitario <userinput>mkdir</userinput> e em seguencia realiza a adição de <filename>trem</filename> ao repositório.</para></note>
          </listitem>
        </itemizedlist>
      </listitem>
      <listitem>
        <itemizedlist>
          <para>Monitoramento o repositório</para>
          <listitem>
            <para>Visualizar o estado de cada arquivo, comparando a copia local com as informações coletadas do repositório no servidor durante a ultima atualização:</para>
            <screen><prompt>$</prompt> <userinput>svn status</userinput></screen>
          </listitem>
          <listitem>
            <para>Visualizar informações sobre o repositório:</para>
            <screen><prompt>$</prompt> <userinput>svn info</userinput></screen>
          </listitem>
          <listitem>
            <para>Visualizar os relatórios das mudanças no repositório:</para>
            <screen><prompt>$</prompt> <userinput>svn log</userinput></screen>
            <note>
              <para>Opcionalmente pode ser passado o parâmetro <userinput>-v</userinput> que informa quais foram as alterações estruturais realizadas.</para>
            </note>
          </listitem>
          <listitem>
            <para>Visualizar os relatórios das mudanças no repositório mostrando apenas as revisões de 3 a 7:</para>
            <screen><prompt>$</prompt> <userinput>svn -r 3:7 log</userinput></screen>
          </listitem>
          <listitem>
            <para>Visualizar as diferenças entre as revisões de 3 a 7 para <filename>trem</filename> do repositório:</para>
            <screen><prompt>$</prompt> <userinput>svn -r 3:7 diff <filename>trem</filename></userinput></screen>
          </listitem>
          <listitem>
            <para>Visualizar <filename>trem</filename> da revisão 3 do repositório:</para>
            <screen><prompt>$</prompt> <userinput>svn -r 3 cat <filename>trem</filename></userinput></screen>
          </listitem>
          <listitem>
            <para>Visualizar a estrutura do repositório da revisão 3:</para>
            <screen><prompt>$</prompt> <userinput>svn -r 3 list</userinput></screen>
          </listitem>
        </itemizedlist>
      </listitem>
      <listitem>
        <itemizedlist>
          <para>Enviando as alterações para o repositório:</para>
          <listitem>
            <para>Envio simples:</para>
            <screen><prompt>$</prompt> <userinput>svn commit</userinput></screen>
            <note>
              <para>Após a execução do comando será aberto o editor definido pelo variavel $EDITOR, dentro do editor é recomendado que seja feito um pequeno resumo de quais foram as alterações realizadas.</para>
            </note>
          </listitem>
          <listitem>
            <para>Envio simples somente das operações realizadas em <filename>trem</filename>:</para>
            <screen><prompt>$</prompt> <userinput>svn commit <filename>trem</filename></userinput></screen>
          </listitem>
          <listitem>
            <para>Envio sem abrir o editor, usando parametro para o resumo:</para>
            <screen><prompt>$</prompt> <userinput>svn commit -m "Texto explicando as alterações realizadas"</userinput></screen>
          </listitem>
          <listitem>
            <para>Envio sem abrir o editor, usando o arquivo <filename>explicacao.txt</filename> para o resumo:</para>
            <screen><prompt>$</prompt> <userinput>svn commit -F <filename>explicacao.txt</filename></userinput></screen>
            <warning><para>O arquivo <filename>explicacao.txt</filename> não deve fazer parte do repositório, pois isto pode causar um ciclo redundante!</para></warning>
          </listitem>
        </itemizedlist>
      </listitem>
    </itemizedlist>
  </sect1>
  <sect1>
    <title>Dicas</title>
    <orderedlist numeration="arabic">
      <listitem>
        <para>O Subversion é seu amigo e irá lhe ajudar.</para>
        <itemizedlist>
          <listitem>
            <para>Quando houver alguma duvida sobre quais comandos existem, execute:</para>
            <screen><prompt>$</prompt> <userinput>svn help</userinput></screen>
          </listitem>
          <listitem>
            <para>Quando houver alguma duvida sobre algum comando, execute:</para>
            <screen><prompt>$</prompt> <userinput>svn help <replaceable>comando</replaceable></userinput></screen>
          </listitem>
        </itemizedlist>
      </listitem>
      <listitem>
        <para>O Subversion permite que seja feito acesso direto ao repositório. A vantagem disto é que não é necessario possuir uma copia local do repositorio para rodar os comandos.</para>
        <screen><prompt>$</prompt> <userinput>svn mkdir <replaceable>http://svn.exemplo.com.br/svn/</replaceable><filename>trem</filename></userinput></screen>
        <note>
          <para>Muitos comandos permitem o acesso direto ao repositório, através da ajuda do Subversion é possivel saber se um comando permite ou não isto!</para>
        </note>
        <warning>
          <para>Alguns comandos ao realizarem acesso direto ao repositório, ao fim do comando realizam um commit imediato.</para>
        </warning>
      </listitem>
      <listitem>
        <para>Com o intuito de facilitar a utilização do Subversion, ele possui abreviações para seus comandos. Abaixo esta a tabela com estas abreviações.</para>
        <table>
          <title>Abreviações</title>
          <tgroup cols="2">
            <thead>
              <row>
                <entry>Comando</entry>
                <entry>Abreviação (ções)</entry>
              </row>
            </thead>
            <tbody>
              <row>
                <entry>checkout</entry>
                <entry>co</entry>
              </row>
              <row>
                <entry>commit</entry>
                <entry>ci</entry>
              </row>
              <row>
                <entry>copy</entry>
                <entry>cp</entry>
              </row>
              <row>
                <entry>delete</entry>
                <entry>del, remove, rm</entry>
              </row>
              <row>
                <entry>diff</entry>
                <entry>di</entry>
              </row>
              <row>
                <entry>help</entry>
                <entry>?, h</entry>
              </row>
              <row>
                <entry>list</entry>
                <entry>ls</entry>
              </row>
              <row>
                <entry>move</entry>
                <entry>mv, rename, ren</entry>
              </row>
              <row>
                <entry>status</entry>
                <entry>stat, st</entry>
              </row>
              <row>
                <entry>update</entry>
                <entry>up</entry>
              </row>
            </tbody>
          </tgroup>
        </table>
      </listitem>
    </orderedlist>
  </sect1>
  <appendix>
    <title>Colaboradores</title>
    <itemizedlist>
      <listitem>
        <para>Raphael Fonte Boa <address><email>rfonteboa [at] gmail.com</email></address></para>
      </listitem>
      <listitem>
        <para>Otavio Salvador <address><email>otavio [at] debian.org</email></address></para>
      </listitem>
      <listitem>
        <para>Fernando Ike <address><email>fernando [at] ikenet.com.br</email></address></para>
      </listitem>
    </itemizedlist>
  </appendix>
  <bibliography>
    <title>Bibliografia</title>
    <para>Os seguintes sítios foram usados como base para a criação desta documentação</para>
    <biblioentry>
      <title>Sitio do projeto Subversion</title>
      <releaseinfo><ulink url="http://subversion.tigris.org/"/></releaseinfo>
    </biblioentry>
    <biblioentry>
      <title>Livro sobre o Subversion</title>
      <releaseinfo><ulink url="http://svnbook.red-bean.com/"/></releaseinfo>
    </biblioentry>
    <biblioentry>
      <title>Perguntas e respostas sobre o Subversion</title>
      <releaseinfo><ulink url="http://subversion.tigris.org/project_faq.html"/></releaseinfo>
    </biblioentry>
    <biblioentry>
      <title>Minicurso da Unicamp sobre CVS</title>
      <releaseinfo><ulink url="http://www.ead.unicamp.br/minicurso/cvs/"/></releaseinfo>
    </biblioentry>
  </bibliography>
  <glossary>
    <title>Glossário</title>
        <glossentry>
          <glossterm>Debian GNU/Linux</glossterm>
          <glossdef>
            <para>O <ulink url="http://www.debian.org">Debian</ulink> é um sistema operacional (SO) livre para seu computador. Um sistema operacional é um conjunto de programas básicos e utilitários que fazem seu computador funcionar. O Debian usa o kernel (núcleo de um sistema operacional), <ulink url="http://www.kernel.org">Linux</ulink>, mas a maior parte das ferramentas do SO vêm do projeto <ulink url="http://www.gnu.org">GNU</ulink>; daí o nome GNU/Linux.</para>
          </glossdef>
        </glossentry>
        <glossentry>
          <glossterm>Logicial</glossterm>
          <glossdef>
            <para>Conjunto de instruções lógicas. Na informática designa um conjunto de instruções lógicas e suas dependências, também conhecido como programa ou sistema de computador.</para>
            <para>Esta palavra é pouco usada no Brasil, onde se usa muito a expressão "Software".</para>
            <para>Origem: <ulink url="http://pt.wikipedia.org/wiki/Logicial">Wikipédia, a enciclopédia livre.</ulink></para>
          </glossdef>
        </glossentry>
      </glossary>
</article>

