isellogo1

DEPARTAMENTO DE ENGENHARIA DA ELECTRÓNICA
E DAS TELECOMUNICAÇÕES E DE COMPUTADORES
Licenciatura em Engenharia Informática e de Computadores

Projecto Final de Curso (Ano lectivo 2005/2006)

 

 


Sistema de Controlo de Versões  (SiCoV)

Alunos: Fernando Serra e José Alves

 

Orientadores: Artur Ferreira e Paulo Pereira


Resumo

 

A colaboração entre elementos de equipas é uma necessidade incontornável nos dias de hoje. A capacidade de gerir e controlar versões de documentos reduz significativamente o tempo dispendido pelas equipas de desenvolvimento. Existem diversas metodologias associadas à gestão de versões de documentos (ficheiros), no âmbito de desenvolvimento em equipa. Este trabalho trata o problema da gestão de versões de software, num ambiente de desenvolvimento aplicacional distribuído.

A solução proposta consiste num sistema de controlo de versões, com arquitectura cliente-servidor, introduzindo uma componente bidireccional de compressão de dados sobre as versões trocadas entre o cliente e o servidor. O sistema está preparado para o controlo de versões de ficheiros de qualquer tipo, estando especializado, ao nível da compressão, para ficheiros na linguagem C#, usando técnicas baseadas em dicionário.

O servidor mantém persistência das versões antigas em histórico, usa compressão sobre as versões antigas, funciona em modo de operação partilhado ou exclusivo e os clientes recebem versões activas do servidor.

Realizam-se estudos sobre o conteúdo de ficheiros C#, bem como das suas dimensões típicas, para definição dos parâmetros utilizados na compressão. Foi desenvolvida uma aplicação de demonstração do sistema proposto, baseada nas funcionalidades de outros sistemas existentes no mercado, introduzindo a componente de compressão, na qual se evidenciam as taxas de compressão obtidas. A figura 1 ilustra a janela principal da aplicação desenvolvida.

 

Picture3

 

Figura 1 – Janela principal da aplicação de demonstração.

 


Arquitectura

 

A arquitectura do sistema, apresentada na figura 2, é baseada no modelo cliente-servidor, sendo constituída, por servidor e repositório de dados que contém as versões dos documentos, e ainda por clientes ligados através de rede LAN (Local Area Network) ou WAN (Wide Area Network).

 

Picture4

Figura 2 - Arquitectura do Sistema.

 


Funcionalidades

 

As funcionalidades do sistema, estão divididas em duas partes, a do cliente e a do servidor, utilizando o .NET Remoting na comunicação entre eles. A figura 3 resume as funcionalidades do sistema.

 

Picture5

Figura  3 - Funcionalidades do Sistema

 

O cliente é constituído pelo módulo responsável pela compressão e descompressão dos ficheiros, que são enviados ou recebidos do servidor, e gere localmente os ficheiros que processa.

O servidor divide-se na componente aplicacional e no repositório de dados. O componente aplicacional é constituído por:

 

• módulo de compressão – comprime e descomprime as várias versões dos ficheiros enviados e recebidos pelos diferentes clientes;

• módulo da gestão das versões – garante coerência entre a informação da base de dados e o conteúdo do file system;

• módulo de manutenção de históricos – efectua a gestão das várias versões dos ficheiros.

 

O repositório de dados é constituído por uma base de dados relacional, na qual é mantida informação das várias versões dos ficheiros e dos respectivos clientes que efectuam as operações disponibilizadas.

 


Especialização para Ficheiros C#

 

A especialização para ficheiros C#, baseou-se na análise de um conjunto de dimensões típicas, sobre um conjunto de ficheiros deste tipo, que balizaram o intervalo de estudo de diferentes compressores e técnicas de compressão.

Analisando as dimensões típicas dos ficheiros, o histograma dessas dimensões, a sua média, mediana, moda, amplitude e desvio padrão, concluímos que existe grande predominância de ficheiros com dimensão inferior a 4 KBytes, com média 4.295 Bytes, com desvio padrão de 7.247 Bytes. Assim, foi definido o intervalo de estudo para dimensões de ficheiros entre os 500 Bytes e os 15 KBytes. Neste intervalo foram avaliados os compressores GZip, LZARI e LZHUF (técnicas baseadas em dicionário) e o BZip2 (codificador estatístico), tal como documentado na figura 4.

Verificou-se que o compressor GZip apresentava as melhores taxas de compressão e bons resultados relativamente ao factor tempo.

 

image006

Figura 4 – Avaliação de Compressores.

 

Da análise da figura 4, verifica-se que não existe um compressor que se destaque ao longo de toda a extensão do gráfico. Até aos 500 Bytes o compressor que apresenta melhor taxa de compressão é o LZARI, entre os 500 Bytes e os 15 KBytes destaca-se o GZIP, acima dos 15 KBytes o BZIP2 é o compressor que apresenta melhores resultados.

 

Os valores estatísticos previamente calculados auxiliam a escolha do compressor, analisando com detalhe a gama em torno da média. Constata-se que estes valores se encontram no intervalo no qual o GZIP apresenta os melhores resultados ao nível da taxa de compressão, entre os 500 Bytes e os 15 Kbytes. Assim a escolha recaiu sobre o GZIP, pelos resultados apresentados e com a vantagem de ser um compressor de utilização livre.

 

Após esta fase concluída e identificadas as vantagens da utilização da codificação baseada em dicionário, optou-se por estabelecer um dicionário estático, a utilizar para a compressão dos ficheiros C#. Após obter os caracteres de separadores e as palavras mais frequentes, o dicionário foi estabelecidoo, aplicando a lista de separadores sobre um conjunto de ficheiros alvo e ordenando as palavras obtidas, segundo a sua frequência de ocorrência. Sobre o dicionário obtido realizou-se um tratamento com base no conhecimento de algumas particularidades da linguagem C#. Este tratamento conduziu a melhoramentos ao nível da taxa de compressão. A figura 5 mostra a dimensão do ficheiro codificado, em função do tempo de codificação, para diferentes dimensões de dicionário.

 

image008

Figura 5 - Relação de compromisso para dicionários com tratamento

 

A análise do compressor GZip foi realizada com diferentes tamanhos da janela deslizante, usando a relação tal que a dimensão do lookahead buffer é 1/8 da dimensão do dicionário, tendo este valores entre 512 Bytes e 32 KBytes. Conclui-se que a taxa de compressão aumenta à medida que a dimensão do dicionário também aumenta. A figura 6 ilustra a taxa de compressão, obtida para diferentes ficheiros, usando como dicionário a versão anterior do ficheiro ou o dicionário estático, estabelecido para ficheiros C#.

 

Picture6

                Figura 6 – Compressão com dicionário estático versus dicionário baseado numa versão anterior.

 

 

Pela análise da figura 6, verifica-se que quando se utiliza o dicionário baseado numa versão precedente, obtêm-se taxas de compressão elevadas, visto que existem poucas alterações entre versões consecutivas. Conclui-se que a utilização de técnicas de compressão baseadas em dicionário são uma boa opção para ficheiros C# e que a especialização realizada para este tipo de ficheiros, contribui de forma significativa para a taxa de compressão, comparativamente à utilização de compressão universal. O tratamento realizado sobre o dicionário, tendo por base as características da linguagem C#, acrescentou eficácia e conduziu à obtenção de melhores taxas de compressão, comparativamente à utilização do dicionário sem tratamento.

 


Documentação de Projecto

Apresentação

Relatórios

Intermédia

Fernando Serra

Final

José Alves