Você está na página 1de 32

Trabalho de Conclusão de Curso

Implantação de uma grade BOINC no CEC


com aplicações para codificação de vı́deos

Aluno: Orientador:
Alexandre Ouno Atoji Roberto Hirata Jr.

4 de fevereiro de 2011
Sumário
1 Introdução 3

2 Bases Tecnológicas 4
2.1 Computação Distribuı́da . . . . . . . . . . . . . . . . . . . . . 4
2.2 Computação Voluntária . . . . . . . . . . . . . . . . . . . . . 4
2.3 Codec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.4 Speed-up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.5 Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.5.1 Linguagem Multiplataforma . . . . . . . . . . . . . . . 6
2.6 PyMW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.7 FFmpeg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

3 BOINC 8
3.1 Arquitetura e Funcionamento . . . . . . . . . . . . . . . . . . 8
3.1.1 O servidor . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.1.2 Os voluntários . . . . . . . . . . . . . . . . . . . . . . . 8
3.1.3 Criação e Distribuição de Tarefas . . . . . . . . . . . . 9
3.1.4 Gerenciamento de Tarefas e Limpeza de Disco . . . . . 9
3.1.5 Integração do BOINC com o Python . . . . . . . . . . 10
3.2 Requisitos Mı́nimos . . . . . . . . . . . . . . . . . . . . . . . . 10

4 Atividades realizadas 11

5 Resultados Obtidos 13
5.1 Implementação . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5.1.1 Instalação do PyMW . . . . . . . . . . . . . . . . . . . 13
5.1.2 Criação de programas . . . . . . . . . . . . . . . . . . 14
5.1.3 Enviando o interpretador Python para as workunits . . 16
5.1.4 Outros tipos de argumentos . . . . . . . . . . . . . . . 16
5.1.5 Enviando e Recebendo arquivos como resultado . . . . 16
5.1.6 Processando vı́deos . . . . . . . . . . . . . . . . . . . . 17
5.2 Implantação . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.3 Testes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.3.1 Ambiente de Teste . . . . . . . . . . . . . . . . . . . . 17
5.3.2 Procedimento . . . . . . . . . . . . . . . . . . . . . . . 18
5.3.3 Teste com vı́deo pequeno . . . . . . . . . . . . . . . . . 18
5.3.4 Teste com vı́deo de 12 minutos . . . . . . . . . . . . . 18
5.3.5 Teste com vı́deo de 50 minutos . . . . . . . . . . . . . 19
5.3.6 Teste com vı́deo de 1 hora e 41minutos . . . . . . . . . 21

1
5.4 Um caso de uso: compressão de dados recebidos de câmeras . 23
5.5 Vantagens e Desvantagens no uso do BOINC e Python . . . . 23
5.5.1 Vantagens . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.5.2 Desvantagens . . . . . . . . . . . . . . . . . . . . . . . 24

6 Conclusão 26

7 Desafios e frustrações encontradas durante o curso 28

8 Disciplinas relevantes para o trabalho 28


8.1 MAC0122 - Princı́pios de Desenvolvimento de Algoritmos . . . 29
8.2 MAC0211 - Laboratório de Programação I . . . . . . . . . . . 29
8.3 MAC0323 - Estruturas de Dados . . . . . . . . . . . . . . . . 29
8.4 MAC0417 Visão e Processamento de Imagens + MAC0338 -
Análise de Algoritmos . . . . . . . . . . . . . . . . . . . . . . 29
8.5 MAC0422 - Sistemas Operacionais . . . . . . . . . . . . . . . 29
8.6 MAC0438 - Programação Concorrente . . . . . . . . . . . . . 30

9 Conceitos Aplicados 30

10 Continuação do trabalho 30

11 Agradecimentos 31

2
Parte I - Objetiva
1 Introdução
O processamento de vı́deo é, mesmo com o aumento do poder computacional
do computador pessoal, uma tarefa muito custosa pois nela é processada um
grande volume de dados. Atualmente os vı́deos possuem maior resolução,
melhor qualidade de áudio.
Ao mesmo tempo que queremos assistir vı́deos em telas com resoluções
maiores, também queremos assisti-los em celulares, aparelhos mp4, iPods,
video-game portátil. Para isso precisamos converter esses vı́deos em vários
formatos. Tarefas simples como conversão de formato ou redimensionamento
de vı́deo costumam demorar um tempo considerável e por muitas vezes é um
fator suficiente para desmotivar a realização da tarefa.
Pode-se pensar em diversos sistemas que recebem grande volumes de vı́-
deos como entrada diariamente e que necessitam de conversão. Um exemplo
é de um sistema de câmeras de vigilância que recebe como entrada vı́deos 24
horas por dia e 7 dias por semana. Guardar esses vı́deos sem nenhum tipo de
compressão gera um grande problema pois necessita de grande quantidade
de espaço para armazenar esses vı́deos.
Uma abordagem recente para mitigar esta tarefa é realizá-la numa GPU
(Graphics Processing Unit). A quantidade de núcleos de uma GPU recente
pode chegar a 512, o que tem motivado muitos desenvolvedores a migrar suas
aplicações para aproveitar esse grande poder de processamento.
Uma outra abordagem é oferecida por empresas de serviços de codificação
de vı́deos por internet. Um exemplo é o da pandastream.com que oferece um
serviço web de conversão de vı́deo que se utiliza de uma grade com máquinas
virtuais da Amazon EC2.
Neste trabalho porém foi realizada uma abordagem diferente: utilizare-
mos uma grade computacional oportunista.
Para construir esta grade oportunista utilizamos o middleware BOINC
que é uma solução de código livre. Construı́mos o programa para ser execu-
tado na grade com a linguagem Python com o módulo PyMW para realizar
a comunicação com o BOINC e o FFMpeg para a conversão do vı́deo. E por
fim, analisamos os resultados obtidos e concluı́mos que a solução é viável.
Além dessas aplicações, existem outras áreas de pesquisa que possuem um
grande volume de dados para serem processados, mas que nem sempre tem
a disposição super computadores para realizar tal processamento. Utilizar
computadores ociosos é uma forma barata de utilizar recursos já existentes
para criar uma grade computacional de processamento.

3
2 Bases Tecnológicas
Neste capı́tulo faremos um levantamento dos conceitos e tecnologias estuda-
das para o desenvolvimento deste trabalho.

2.1 Computação Distribuı́da


Programação distribuı́da é uma forma de realizar processamento simultane-
amente, utilizando múltiplos computadores autônomos que se comunicam
entre si através de uma rede para atingir um objetivo em comum [And00].
Em sistemas distribuı́dos geralmente são utilizados clusters, que são con-
juntos de máquinas que trabalham como se fosse um só computador, em
vários aspectos e se comunicam por uma rede. Um tipo de cluster é a Grade,
que difere um pouco dos tradicionais clusters de alta performance pelo fato
das máquinas conectadas serem heterogêneas e distribuı́das geograficamente
[GJG+ 05].
Um exemplo famoso é o projeto Beowulf, no qual são utilizados compu-
tadores de baixo custo para formar uma grade dedicada agindo como um
único supercomputador. Segundo o projeto, uma grade deste tipo provê um
recurso computacional equivalente a um supercomputador por um terço do
preço [Flo10].
Na listagem do TOP500 de novembro de 2010, 83% dos computadores
mais rápidos do mundo são clusters [TOP].
Uma caracterı́stica de sistemas distribuı́dos é que eles possuem alta dis-
ponibilidade, são tolerantes à falhas de máquinas individuais e expandir um
sistema distribuı́do é relativamente simples.
Os algoritmos desenvolvidos para serem executados em sistemas distribuı́-
dos são diferentes dos programas executados em um único processador. Eles
devem se preocupar com a sincronização de tarefas evitando que ocorram
deadlocks, condição de corrida, etc.

2.2 Computação Voluntária


Computação voluntária [BOI10] é um tipo de computação no qual as pes-
soas(voluntários) disponibilizam recursos computacionais para projetos que
utilizam para fazer computação ou armazenamento distribuı́do. Esses proje-
tos geralmente são acadêmicos, como o GIMPS1 e o distributed.net2
Os projetos são de diversas áreas do conhecimento humano, desde busca
de curas de doenças até a busca de formas extra-terrestres de vida.
Os computadores voluntários inscritos em um projeto doam os seus ciclos
de processamento não utilizados, ou quando estão realizando tarefas que não

4
utilizam todo o poder computacional do computador ou quando o computa-
dor está totalmente ocioso.
Existe um grande número de computadores no mundo e esse número vem
aumentando com o passar do tempo. Boa parte destes recursos não utiliza
todo seu poder na maior parte do tempo.

2.3 Codec
Codec é um software responsável por codificar e decodificar os dados de áudio
e vı́deo [Cod10].
Codecs podem ser separados em duas categorias em relação à qualidade
da compressão:

ˆ Com perdas: São codecs que conseguem comprimir os dados, mas


ocorre perda de informação em sua decodificação. Essa perda geral-
mente é ajustada para que haja a menor percepção por parte do usuá-
rio final. Eles são populares por oferecerem uma taxa de compressão
bem alta em relação ao arquivo original.

ˆ Sem perdas: São codecs que comprimem os dados, mas em sua decodi-
ficação não há perda de informação. Eles são populares por preservar
a qualidade do vı́deo.

2.4 Speed-up
Em computação paralela, speed-up é uma medida para indicar o quanto um
programa paralelo é mais rápido que o programa sequencial.
Seu cálculo é dado por:
T1
Sp = (1)
Tp
Onde:

ˆ T1 é o tempo de execução do algoritmo sequencial

ˆ Tp é o tempo de execução do algoritmo paralelo com p processadores


2
http://www.mersenne.org/
2
http://www.distributed.net/

5
2.5 Python
A Linguagem Python é uma linguagem dinâmica amplamente utilizada em
vários domı́nios de aplicação.[Pyt10b].
A linguagem é de tipagem dinâmica e forte considerada como de altı́s-
simo nı́vel, pois é multi paradigma, isto é, pode ser programada de forma,
imperativa, orientada a objetos, etc. Prioriza a legibilidade de código sobre
a expressividade. Foi criada por Guido van Rossum em 1991. É conside-
rada uma linguagem bem estável e tem lançamentos de versões principais
em perı́odos de 18 meses em média. Devido suas caracterı́sticas, o Python
é bastante indicado para programadores iniciantes e vem sendo utilizado em
cursos introdutórios de diversas faculdades no mundo [Pyt10a].
O Python é uma linguagem amplamente utilizada em várias aplicações ci-
entı́ficas (mesmo não possuindo uma performance comparável ao C ou C++)
e possui uma grande quantidade de bibliotecas especializadas em diversos
domı́nios como Processamento de Imagens3 , Visão Computacional4 , Álgebra
Linear5 , entre outros. Além de possuir essa grande quantidade de bibliote-
cas nativas, ela é facilmente integrada com objetos COM, .NET, CORBA e
bibliotecas Java.
Exemplos de casos de sucesso de projetos utilizando esta linguagem po-
dem ser encontrados no site: http://www.python.org/about/success/
Outro campo que vem se utilizando amplamente o Python é no desenvol-
vimento web, com frameworks famosos como o Django6 e o Pylons7 .

2.5.1 Linguagem Multiplataforma


Outro fator importante é que programas feitos em Python podem ser execu-
tados em diversos sistemas operacionais como Windows, Unix, Linux, Ma-
cOS/X, Amiga e sistemas de portáteis como Symbian, Windows Mobile, iOS
e Android [Pyt10b].
Este foi um fator determinante para a escolha da linguagem para a rea-
lização do projeto pois como o BOINC distribui tarefas para qualquer com-
putador anexado no projeto, é de extrema importância que o programa rode
em uma boa quantidade de sistemas operacionais. Com linguagens compi-
ladas como C é possı́vel compilar um executável para cada sistema e enviar
para o voluntário o executável especı́fico do seu SO, mas o problema é que
você precisa recompilar para todos os sistemas a cada mudança do código,
3
PIL - http://www.pythonware.com/products/pil/
4
PyOpenCV - http://code.google.com/p/pyopencv/
5
NumPy - http://numpy.scipy.org/
6
Django - http://www.djangoproject.com/
7
Pylons - http://pylonshq.com/

6
e compilar para diversos sistemas são necessários cross-compilers ou possuir
máquinas com esse sistema operacional.

2.6 PyMW
O PyMW é um módulo Python que possibilita a computação paralela no es-
tilo Mestre-Escravo em diversos ambientes como Condor8 e BOINC [PyM10].
Ele é indicado no site do BOINC como sendo o módulo que deve-se utilizar
ao fazer um programa em Python para o BOINC.
Parte de seu código foi desenvolvido durante o Google Summer of Code.
O PyMW foi criado por Eric Heien e a interface com o BOINC foi desen-
volvida por Adam Kornafeld e Jeremy Cowles. Ambos são muito atenciosos e
sempre respondem as perguntas relacionadas ao projeto muito rapidamente.
Por ser um projeto recente, ainda não existem projetos grandes utilizando-
se do PyMW, apenas pequenos programas de exemplo criados pelos desenvol-
vedores do PyMW, como por exemplo, um programa que estima o PI através
de Monte Carlo [HTHK09].

2.7 FFmpeg
O FFmpeg é um projeto opensource e multiplataforma que produz bibliote-
cas e programas que lidam com vı́deo e áudio. Suas partes mais notáveis são
o libavcodec, libavformat e o programa de linha de comando com o mesmo
nome do projeto [FFM10], sendo este último utilizado no trabalho para re-
alizar operações sobre os vı́deos que são dados como entrada. O Projeto
FFmpeg suporta umas dezenas de codecs e formatos de áudio e vı́deo.
Uma vantagem do FFmpeg é que, assim como o Python, ele é multipla-
taforma, possibilitando a sua execução em diversos sistemas operacionais.
O FFmpeg está sob a licença LGPL ou GPL dependendo da escolha de
configurações.
Suas bibliotecas são utilizadas por diversos softwares que processam vı́-
deos, e em muitos casos é quebrada sua licença. O projeto FFmpeg mantém
uma listagem dos softwares comerciais que quebraram sua licença em uma
página chamada ”Hall of Shame9 ”e desencoraja a compra desses softwares.
8
http://www.cs.wisc.edu/condor/
9
http://www.ffmpeg.org/shame.html

7
3 BOINC
O Berkeley Open Infrastructure for Network Computing (BOINC) é um
sistema middleware não comercial desenvolvido para computação voluntá-
ria e em grade [And]. Ele foi inicialmente desenvolvido para o projeto
SETI@home, que tem como objetivo buscar vida extra-terrestre, e depois
acabou virando uma plataforma para aplicações distribuı́das de diversas áreas
do conhecimento. Uma listagem de projetos ativos utilizando o BOINC pode
ser encontrada em: http://boincstats.com/.
O BOINC é um software livre e está sob a licença LGPL.

3.1 Arquitetura e Funcionamento


O BOINC inicialmente foi desenvolvido para projetos que se utilizam de
computação voluntária, mas também pode ser utilizado como uma grade
dedicada apenas alterando algumas configurações do servidor.
Em uma grade BOINC há dois tipos de máquinas: o servidor e os volun-
tários.

3.1.1 O servidor
Está é a máquina responsável por hospedar e distribuir tarefas para os com-
putadores voluntários. O servidor também é responsável por gerenciar as
respostas retornadas pelos voluntários, chegar a coerência da resposta para
produzir o resultado final. Periodicamente o servidor realiza tarefas de ma-
nutenção e limpeza dos dados do projeto.
Todas essas tarefas são feitas através de daemons que ficam sempre em
execução no servidor.
A figura 1 apresenta um esquema do funcionamento do servidor e como
ele se comunica com os clientes.

3.1.2 Os voluntários
Os voluntários são máquinas que se conectam ao projeto hospedado pelo
servidor. Elas podem doar somente o processamento quando estão ociosas
ou podem ser dedicadas.
O computador voluntário pode disponibilizar vários recursos para um
projeto, como por exemplo: CPU, GPU, memória RAM e armazenamento.
A figura 1 também apresenta o funcionamento interno de um cliente e
como se comunica com o servidor.

8
Voluntário Servidor

Requisita Tarefas Cria Tarefas

Processa Tarefa

Envia Resultado Assimila Resultados

Resultado Final

Figura 1: O funcionamento do BOINC

3.1.3 Criação e Distribuição de Tarefas


Para criação de tarefas, o projeto deve estar com o código preparado para a
criação de tarefas. Há disponı́vel bibliotecas para a escrita de código nativo
em linguagens como C/C++, Python, Java e Fortran.
Projetos que necessitam de alguma linguagem que não tenha suporte
nativo ou que utilizam executáveis legados podem se utilizar do chamado
Wrapper [Flo10] do BOINC, que é um programa escrito utilizando as biblio-
tecas nativas permitindo que esses projetos sejam enviados para as máquinas
voluntárias.
Com o código preparado, o servidor gera as tarefas que são pequenos
programas. Esses programas são empacotados pelo servidor e armazenados,
esperando a requisição por parte de um computador voluntário. Quando um
computador voluntário envia um sinal dizendo que está requisitando tarefas,
o servidor envia uma quantidade estipulada de tarefas para essa máquina.
Essa máquina processa as tarefas recebidas e retorna o resultado obtido para
o servidor.

3.1.4 Gerenciamento de Tarefas e Limpeza de Disco


Com os resultados recebidos, o servidor, verifica se eles são válidos e se não
houve má intenção de algum voluntário em mandar um resultado incorreto.
Para isso existem algumas técnicas para contornar esse problema como cripto-
grafia de resultado e enviar a mesma tarefa para vários voluntários diferentes
para comparar seus resultados.
Após a verificação dos resultados, caso sejam válidos, é executado um
programa gerenciador, que pega os resultados dos diversos voluntários e
processa-os gerando um resultado final.

9
Após obter um resultado final, são apagados os arquivos que não são mais
necessários.

3.1.5 Integração do BOINC com o Python


Utilizamos o PyMW, que é um módulo que possibilita a computação mestre-
escravo escrevendo código Python no BOINC. O PyMW provê uma API que
possui funcionalidades comuns para diversos ambientes de computação em
grade, um deles é o BOINC. A figura 2 mostra as camadas de um programa
escrito com o PyMW.

Cliente BOINC
Servidor BOINC

API Python do BOINC


PyMW
PyMW
Programa em Python
Programa em Python

Figura 2: Integração do cliente e do servidor BOINC com o PyMW

3.2 Requisitos Mı́nimos


Necessita-se de uma máquina com PHP, Apache e Mysql instalados para criar
um servidor BOINC, além de bibliotecas e compiladores necessários para a
compilação do código-fonte do servidor BOINC. Recomenda-se instalar no
sistema operacional Linux.
Para os clientes os requisitos variam de projeto para projeto. Alguns
projetos exigem um mı́nimo de memória RAM, outros exigem que tenha
interpretador de alguma linguagem instalada na máquina. Projetos também
podem restringir sistemas operacionais.

10
4 Atividades realizadas
O trabalho teve inı́cio em meados de fevereiro de 2010 quando foi decidido,
junto com o professor Roberto Hirata Jr. o tema do trabalho de conclusão de
curso. Inicialmente cogitou-se em fazer um software para codificação de vı́deo
utilizando processamento em GPU, mas com o passar da discussão chegamos
em um consenso de fazer o uso do BOINC para testar a sua viabilidade e
performance para processamento de vı́deo e programas em Python. Além
disso, um fator que proporcionou a escolha desse tema foi o fato do IME já
ter uma grade BOINC instalada no CEC no qual foi utilizado pelo Rodrigo
Flores no ano anterior em seu trabalho de conclusão de curso, dando em
partes, uma continuação de seu projeto.
Após a escolha do tema começou o trabalho de aprender como era o
funcionamento do BOINC. Primeiramente foi instalado o cliente BOINC em
máquinas locais e virtuais (cada uma não conectada com outra) e instalado
projetos BOINC já existentes. Em seguida foi criada e testada uma rede local
entre esses computadores, e criado um servidor BOINC em uma máquina
virtual.
Com o ambiente já inicialmente preparado e testado, foi iniciado o estudo
das bibliotecas e softwares a serem utilizados. Assim começou o estudo da uti-
lização do PyMW e do FFmpeg. Após um tempo de estudo, foi desenvolvido
uma biblioteca auxiliar que permitia a divisão dos vı́deos em diversas partes
e a união desses vı́deos. Então foi iniciado o desenvolvimento de programas
simples que já utilizavam o PyMW para enviar tarefas ao mesmo computa-
dor de forma concorrente. Depois foi desenvolvido a versão desses programas
que utilizavam a grade BOINC local para a realização de tarefas. Nesta fase
percebeu-se que o PyMW apresentava problemas ao codificar e decodificar
os arquivos para serem transmitidos na rede BOINC, para isso entrou-se em
contato com os criadores da biblioteca, e após algumas conversas e pesquisas,
foi descoberta uma solução para tal problema.
Já com os programas prontos e funcionando na grade BOINC local, che-
gou a hora de partir para o ambiente real, ou seja, a grade BOINC instalada
no CEC, pois na grade BOINC local havia todo o controle sobre todas as
máquinas e servidor.
Primeiramente, para configurar o ambiente real foi necessário configurar
o servidor da grade que está localizado na rede Vision. Aparentemente já
estava tudo configurado e funcionando, bastava criar o projeto dentro dele
e fazer a implantação da aplicação. Mas logo ao colocar a aplicação no ar,
notou-se que a versão do servidor (que era do ano passado) não era compatı́vel
com o PyMW sendo necessária a reinstalação e reconfiguração do mesmo.
Após a reinstalação do servidor, surgiu-se outro problema: a versão dos

11
clientes BOINC era incompatı́vel com a versão do servidor. A versão do
cliente é uma versão antiga, presente no Debian Lenny (a versão atualmente
estável), e como era inviável a instalação de uma versão mais atual (por causa
da polı́tica do CEC) precisou-se obter uma outra solução. Para conseguir esta
solução, foram testadas diversas versões de servidor até obter uma que era
compatı́vel com o PyMW e os clientes do CEC ao mesmo tempo.
Com o ambiente real funcionando começou a realização dos testes. Pri-
meiro um teste com um vı́deo pequeno e com o passar do tempo, com entradas
cada vez maiores.

12
5 Resultados Obtidos
O trabalho tem como objetivo o teste de viabilidade de uma aplicação de
codificação de vı́deo utilizando Python em uma grade BOINC.

5.1 Implementação
Para desenvolver o trabalho foi necessária a utilização do PyMW para li-
dar com a criação e distribuição de tarefas, conforme descrito no capı́tulo 3
destinada ao PyMW.
O programa recebe um vı́deo como entrada, quebra-o vı́deo em diversas
partes menores e envia pela rede aos computadores localizados no CEC. Cada
computador voluntário, converte o vı́deo para MPEG e redimensiona para
a resolução HVGA. Ao terminar o processamento, o computador voluntário
retorna esse vı́deo processado para o servidor. Quando o servidor recebe todas
as respostas, ele junta esses pedaços em um único vı́deo, que é o resultado
final.
A aplicação, então, é composta somente de um programa para a distri-
buição na grade. Isso ocorreu pelo fato do PyMW + PyBOINC encapsular
o interpretador Python junto com os arquivos que são enviados para os vo-
luntários.
É necessário que a máquina do voluntário possua o FFmpeg instalado,
pois o programa realiza chamadas ao FFmpeg para realizar algumas opera-
ções sobre o vı́deo.

5.1.1 Instalação do PyMW


A instalação do PyMW é bastante simples, segue o padrão de instalação de
outras bibliotecas Python.

ˆ Basta fazer o download do projeto em http://pymw.sourceforge.net/

ˆ Descompactar o arquivo em alguma pasta, como por exemplo execu-


tando tar -xzvf pymw-0.x.tar.gz

ˆ Entrar na pasta

ˆ E executar o comando python setup.py install

O PyMW necessita que o Python instalado tenha versão maior do que a


2.6

13
5.1.2 Criação de programas
Para a criação de um programa que utilize o PyMW necessita-se que o módulo
pymw esteja importado no programa.

from pymw import pymw

Com o módulo importado, precisa-se criar a função que será o código a


ser executado nas máquinas voluntárias:

d e f work ( name , video ) :


”””
R e a l i z a uma s i m p l e s o p e r a c a o com o ffmpe g .
”””
f = open ( name , ' wb ' )
f . write ( video )
f . close ( )

subprocess . call ( [ ' ffmpe g ' , '− i ' , name , '−s ' , ' 480 x320 ' , ' t o s e n d . mpg ' ←-
])
to_send = open ( ' t o s e n d . mpg ' , ' rb ' )
video = to_send . read ( )
to_send . close ( )
r e t u r n video

Após a criação do código para ser executado, precisa-se criar o programa


principal que ficará no servidor e que se encarregará de criar e enviar tarefas.
Este programa principal deve:

ˆ Definir qual será o grid no qual o programa será enviado (BOINC,


Condor, MPI...)

ˆ Criar o objeto PyMW Master

ˆ Submeter tarefas

ˆ Receber resultados e tratá-los

Para definir qual será o ambiente no qual será enviado o programa, deve-se
criar um objeto interface e é comum criar utilizando-se o método

interfaces . get_interface ( options )

Que recebe um objeto de opções obtidas através do método

interfaces . parse_options ( parser )

14
Estas opções são obtidas através dos argumentos inseridos ao executar
o programa na linha de comando, tornando o programa desacoplado de um
ambiente grid em especı́fico.
Caso necessite que o programa seja especı́fico para um ambiente de com-
putação em grade pode-se criar o objeto de interface especı́fico:

pymw . interfaces . generic . C l a s s e _ R e f e r e n t e _ a o _ a m b i e n t e

No caso de utilizar o PyMW com o BOINC há a possibilidade de confi-


gurar o objeto interface com esse o método

set_boinc_args ( tar get _nre sult s =2 , min_quorum =1 , max_nbytes =65536)

Com o objeto de interface criado, para criar um objeto PyMW Master


simplesmente basta passar o objeto de interface como argumento para o mé-
todo

pymw . PyMW_Master ( pymw_interface )

Este objeto PyMW Master é o responsável por enviar e receber informa-


ções enviadas para os voluntários.
Para enviar um trabalho executa-se o método

submit_task ( executable , input_data=None , modules =() , dep_funcs =() , ←-


data_files =() )

Este método tem como parâmetro:


ˆ executable - referência para a função que será enviada para as workunits
ˆ input data - variáveis que serão dadas como entrada na função execu-
table
ˆ modules - módulos utilizados pela executable
ˆ dep funcs - funções que o executable é dependente
ˆ data files - arquivos para serem enviados junto com as workunits
O método submit task retorna um objeto do tipo Task que você deve
armazenar em algum local para posteriormente recuperar a informação pro-
cessada com o método

get_result ( task=None , blocking=True )

15
5.1.3 Enviando o interpretador Python para as workunits
Uma vantagem do PyMW é a possibilidade de enviar o interpretador Python
para as workunits. Com isso torna-se possı́vel para os computadores volun-
tários executar qualquer programa escrito em Python mesmo não possuindo
ele ou o PyMW instalados.
Para isso é necessário baixar os interpretadores do projeto PyBOINC
que estão em http://bitbucket.org/jeremycowles/pyboinc/downloads/pyboinc-
0.01.zip e ao executar o programa deve-se passar como argumento, -c e -a
como a seguir:

python main . py −c / home / boincadm / pyboinc −a 1 . 0 0 _python26 . zip

5.1.4 Outros tipos de argumentos


Além da possibilidade de passar como argumento o interpretador, existem
outras opções:

ˆ -n : Indica quantas workunits serão criadas

ˆ -i : Indica qual interface será usada

ˆ -p : A localização do projeto

5.1.5 Enviando e Recebendo arquivos como resultado


Para enviar arquivos para as workunits existem duas maneiras. Uma é abrir
o arquivo no servidor ler o stream e enviar o stream.

video = f . read ( )
f . close ( )
tasks . append ( pymw_master . submit_task ( workunits . work , input_data =(name , ←-
video , ) , modules =( ” s u b p r o c e s s ” , ” e n c o d i n g s ” , ” c o d e c s ” , ) , ) )

Outra maneira, mais simples é passar como argumento no método sub-


mit task.
Assim como o primeiro método de enviar arquivos para as workunits
existe a mesma abordagem para retornar um arquivo de uma workunit.

( ... )
video = to_send . read ( )
to_send . close ( )
r e t u r n video

16
5.1.6 Processando vı́deos
Para processar vı́deo, uma abordagem é a utilização do FFmpeg através de
chamadas do módulo subprocess do Python. Este módulo permite a cria-
ção de processos e possibilita a manipulação das entradas e saı́das de um
programa através do código. Segue um exemplo de código:

import subprocess
subprocess . call ( [ ' ffmpe g ' , −i
' ' , name , '−s ' , ' 480 x320 ' , ' t o s e n d . mpg ' ] )

Este trecho converte um vı́deo mpeg de qualquer resolução para um vı́deo


mpeg de resolução 480x320 (hvga).
Enviar e receber vı́deos através do PyMW gera problemas de encoding
quando o PyMW tenta manipular os arquivos, pois o arquivo é salvo pelo
servidor em uma codificação que o cliente não consegue lidar sem ter módulos
do Python importados. Para resolver este problema precisa-se importar os
módulos codecs e encodings na função que será enviada para as workunits.

5.2 Implantação
Com o final do trabalho obtivemos 1 servidor BOINC atualizado e configu-
rado para a execução e distribuição de programas desenvolvidos em Python,
além de 32 máquinas da rede CEC com o projeto instalado e rodando tarefas
obtidas do servidor BOINC.
Foi necessária a reinstalação do servidor BOINC, pois a versão que estava
instalada era antiga e não conseguia conversar com os clientes e nem tinha
compatibilidade com a versão 0.4 do PyMW. Para reinstalar foi necessário
baixar o código fonte e compilar. Para a configuração do servidor BOINC foi
necessária a instalação do Python2.6 via compilação, pois o Debian Lenny
não suporta tal versão e a instalação do conector de MySQL para Python2.6.

5.3 Testes
5.3.1 Ambiente de Teste
Foram realizados testes para determinar o desempenho da aplicação. Para
isso foram executados testes em dois ambientes: uma máquina local e a grade
do CEC.
A máquina local possui um processador Intel(R) Core(TM)2 Duo T6600
@ 2.20GHz com 4Gb de memória RAM. E a grade da rede CEC utilizada
para testes possui 32 computadores Celeron E3300 2.50GHz, metade com
2Gb de memória e com outra metade com 4Gb.

17
5.3.2 Procedimento
Foram feitos 4 testes diferentes. Um com um vı́deo de 400kb, outro de 50Mb,
outro de 100Mb e finalmente um de 200Mb. Além de variar o tamanho
dos vı́deos, também variou-se a quantidade de voluntários utilizados para
processar o vı́deo. Foram feitas baterias de testes utilizando-se 1, 2, 4, 8, 16
e 32 voluntários. Isso foi feito para determinar para qual tamanho e quantas
máquinas utilizadas valem a pena utilizar a grade voluntária.
Para determinar o tempo médio de execução para processar cada tarefa
foi feita uma bateria contendo 10 execuções idênticas.

5.3.3 Teste com vı́deo pequeno


Neste teste foi utilizado um arquivo de vı́deo no formato MPEG de tamanho
pequeno, de apenas 400kb. Como processamento foi feito o redimensiona-
mento do vı́deo para a resolução 480x320 (hvga). Os vı́deos não foram dividi-
dos em menos de 8 partes10 .

Executando esta operação na máquina local demorou em média 0.865s.

A tabela abaixo indica os resultados obtidos na grade BOINC.

Número de Voluntários Tempo Médio de Execução


1 133.7727s
2 120.0363s
4 134.2714s
8 143.9511s

Este teste foi feito para mostrar que utilizar uma grade BOINC para
converter pequenos arquivos de vı́deo não é viável. Isso ocorre porque se gasta
mais tempo em enviar e receber dados do que no tempo de processamento
nas máquinas voluntárias.

5.3.4 Teste com vı́deo de 12 minutos


Neste teste foi realizada a mesma operação realizada no teste anterior.
O vı́deo possui 12 minutos e 50Mb de tamanho.
Executando esta operação na máquina local demorou em média 75.477s.

A tabela abaixo indica os resultados obtidos na grade BOINC.


10
Pois em partes menores ocorre problema na codificação do vı́deo pois o tamanho do
vı́deo torna-se menor do que a distância de dois keyframes

18
Figura 3: Gráfico com tempos de execução do teste com vı́deo pequeno

Número de Voluntários Tempo Médio de Execução


1 265.2712s
2 197.911s
4 148.7023s
8 144.9689s
16 149.363s
32 155.0923s

Nota-se que neste teste a diferença entre executar na máquina local e


na grade BOINC não é gigantesca, como no teste anterior. Outro fato a
considerar é que o tempo de processamento deste vı́deo é bem semelhante ao
tempo conseguido ao realizar o processamento do vı́deo pequeno na grade.

5.3.5 Teste com vı́deo de 50 minutos


Neste teste foi realizada a mesma operação realizada no teste anterior. O
dado como entrada possui 50 minutos e 100Mb de tamanho.

19
Figura 4: Gráfico com tempos de execução do teste com vı́deo de 12 minutos

Executando esta operação na máquina local demorou em média 508.625s.

A tabela abaixo indica os resultados obtidos na grade BOINC.

Número de Voluntários Tempo Médio de Execução


1 532.463s
2 285.6347s
4 217.2571s
8 171.5135s
16 148.6487s
32 164.5705s

Percebe-se claramente observando os resultados que para este vı́deo de


100Mb, que utilizando a partir de duas máquinas voluntárias passa a valer a
pena utilizar a grade para converter o vı́deo, com 359.9763 segundos de ganho
ao utilizar 16 máquinas. Ao utilizar 32 máquinas se percebe que o overhead

20
Figura 5: Gráfico com tempos de execução do teste com vı́deo de 50 minutos

adquirido para distribuir partes do vı́deo para todas as máquinas faz com
que o tempo de execução médio seja maior que se utilizando 16 máquinas.

5.3.6 Teste com vı́deo de 1 hora e 41minutos


Neste teste foi realizada a mesma operação realizada no teste anterior.
O vı́deo possui 1 hora e 41min e 201Mb de tamanho.
Executando esta operação na máquina local demorou 1061.280s.

A tabela abaixo indica os resultados obtidos na grade BOINC.

21
Número de Voluntários Tempo Médio de Execução
1 1872.7312s
2 664.7858s
4 497.2947s
8 286.5701s
16 234.1787s
32 225.6725s

Figura 6: Gráfico com tempos de execução do teste com vı́deo de 1 hora e


41 minutos
Com o vı́deo de 201Mb, passa-se a valer a pena após a utilização de 2
máquinas voluntárias também. Neste caso, utilizar-se das 32 máquinas é
mais vantajoso do que se utilizar de 16. O ganho com as 32 máquinas é em
média de 835.6075 segundos.

22
5.4 Um caso de uso: compressão de dados recebidos
de câmeras
Neste trabalho também foi desenvolvido um software que captura dados de
uma webcam e os armazena em diversos arquivos. Estes arquivos são envi-
ados para a grade BOINC e convertidos para um formato ou tamanho mais
conveniente para seu armazenamento.
Este tipo de abordagem pode ser de muita utilidade para sistemas de
segurança patrimonial, pois recebem um grande volume de vı́deos para serem
armazenados.
O programa desenvolvido executa em três threads no servidor. Uma cha-
mada Producer que é responsável para capturar o vı́deo, outra chamada
Submitter que é responsável para enviar para a grade os vı́deos recém cria-
dos e a última chamada Assimilator que recebe os vı́deos já convertidos e os
armazena. Ele funciona no estilo produtor-consumidor clássico.
O vı́deo é capturado de forma semelhante aos testes executados na sub-
seção anterior, utilizando-se do FFmpeg.

subprocess . call ( [ ' ffmpe g ' , '−v f r a m e s ' , ' 100 ' , '−f ' , ' v i d e o 4 l i n u x 2 ' , −s ' , ←-
'

' 640 x480 ' , '− i ' , ' / dev / v i d e o 0 ' , '−f ' , ' mpeg ' , output ] )

O código da workunit utilizada para converter o vı́deo na máquina volun-


tária é o mesmo código utilizado para os testes realizados na seção anterior.

5.5 Vantagens e Desvantagens no uso do BOINC e


Python
5.5.1 Vantagens
Como o trabalho pudemos observar as seguintes vantagens na utilização do
BOINC com o Python:
ˆ Facilidade de acrescentar novos nós: Para acrescentar novos nós
na grade basta instalar um programa no computador. Sua configura-
ção é fácil, tanto em ambientes como Windows como em Linux. Nas
distribuições Linux, a instalação do Servidor e do Cliente podem ser
feitas por gerenciadores de pacotes. No Windows basta instalar um
executável disponı́vel no site do BOINC.
ˆ Plataforma OpenSource: Por ser uma plataforma de código aberto,
muito do custo para instalação e manutenção dos clientes é reduzido.
Também pode-se alterar o código para tornar o BOINC mais otimizado
para seu software ou para corrigir bugs.

23
ˆ É possı́vel utilizar Python sem a necessidade do Wrapper:
Com o trabalho foi possı́vel criar programas escritos em código Python
para executar na grade BOINC. Essa solução é boa pois pode-se escre-
ver códigos de maneira simples e utilizar todos os recursos da lingua-
gem, inclusive módulos de terceiros.

ˆ Solução multiplataforma: Basta fazer apenas um programa para


distribuir pela rede. O mesmo código pode ser rodado tanto no Linux
quando no Mac e Windows. Utilizando-se de outras linguagens precisa-
se gerar um executável para cada plataforma no qual o programa será
rodado.

ˆ Baixo custo de implantação e infraestrutura: Por ser open


source e utilizar de qualquer computador conectado em uma rede, tanto
ociosos quanto ativos, o custo para implantar e expandir a grade é bem
pequeno, pois não precisa comprar hardware especializado.

ˆ Utilização de recursos ociosos: Utiliza computadores que estão


ociosos para o desenvolvimento cientı́fico.

5.5.2 Desvantagens
O projeto enfrentou impedimentos por causa da plataforma. Aqui serão
listados e comentados tais desvantagens que notamos na plataforma.

ˆ Latência: Quando o servidor cria as tarefas elas podem ficar algum


tempo em espera até os voluntários começarem a requisitá-las. Isso
acontece pois quando o servidor fica sem tarefas para enviar, os clientes
entram em um modo de espera. Esse modo de espera começa com 30
segundos sem pedir tarefas, caso não receba tarefas, esse tempo dobra,
e assim sucessivamente até no máximo 15 minutos. Isso gera uma
latência até as primeiras máquinas começarem a requisitar tarefas. Este
modo de espera é feito para não sobrecarregar o servidor de requisições
caso não tenha tarefas disponı́veis e por isso não é possı́vel desabilitar
esta funcionalidade no cliente. Isto é uma desvantagem somente para
grades BOINC no qual são liberadas novas tarefas ocasionalmente e
que possuem poucos voluntários (até 16).

ˆ Desempenho variável: O tempo de execução depende do estado


que a grade se encontra. Se os voluntários não estiverem ociosos e
liberando recursos computacionais para o BOINC, o tempo de proces-
samento de vı́deo poderá sofrer um atraso. Essa desvantagem é mais

24
notada em execuções de tarefas em grades pequenas (entre 2 e 8 má-
quinas) com máquinas voluntárias antigas. Isso ocorre pois quando há
alguém usando o computador velho, geralmente, consome boa parte dos
recursos, fazendo que não tenha recursos sobrando para disponibilizar
para a grade.

ˆ Para cargas de processamento pequenas e médias não vale a


pena: O processamento de cargas pequenas de processamento no
BOINC não vale a pena devido ao overhead de comunicação. Com os
testes realizados, começa a valer a pena a utilizar a grade para converter
vı́deos de tamanho maior de 100Mb.

ˆ Incompatibilidade entre versões de cliente e servidor: Algumas


versões do servidor BOINC não são compatı́veis com certos clientes.
Essa incompatibilidade ocorre em versões diversas tanto de servidor
quanto de cliente, não seguindo um padrão cronológico de versão. Por
exemplo, um servidor é compatı́vel com clientes de versão Y1 e Y3, mas
não com a versão Y2 sendo esta mais recente que a Y1 e mais antiga
que a Y3.

25
6 Conclusão
Com este trabalho concluı́mos que é possı́vel e viável escrever programas em
Python para serem executados em uma grade BOINC e que seu desenvol-
vimento é bem simples. Esse desenvolvimento vale a pena pelos diversos
benefı́cios proporcionados pela linguagem, como o fato dela ser multiplata-
forma.
No caso do processamento de vı́deo, vale a pena utilizar uma grade
BOINC para processar vı́deos. Com os testes realizados na rede CEC, foi
verificado que passa a valer a pena utilizar a grade para realizar a conversão
de vı́deos em formato mpeg com tamanho maior que 100Mb. Obteve-se um
ganho no tempo de processamento chegando a 470% ao converter um vı́deo
de 200Mb na grade utilizando-se 32 voluntários.
Este tipo de abordagem pode ser utilizada para outras aplicações, como
por exemplo, o programa feito neste trabalho para receber vı́deos de webcams
(ou câmeras de segurança) e armazenar tal vı́deo em um formato comprimido
utilizando a grade para fazer a compressão.
Espera-se que este trabalho seja de grande ajuda para grupos do IME-
USP que necessitam de grande volume de processamento, como o de Visão
Computacional, Processamento de Imagens e Bioinformática. Este tipo de
plataforma é uma ótima solução para realizar processamento distribuı́do de
horas ou dias com pouco investimento por parte da universidade.

26
Referências
[And] David P. Anderson. Boinc: A system for public-resource compu-
ting and storage.

[And00] Gregory R. Andrews. Foundations of Multithreaded, Parallel, and


Distributed Programming. 2000.

[BOI10] Volunteercomputing – boinc, 2010.


http://boinc.berkeley.edu/trac/wiki/VolunteerComputing.

[Cod10] Codec - wikipedia, the free encyclopedia, 2010.


http://en.wikipedia.org/wiki/Codec.

[FFM10] Ffmpeg, 2010. http://www.ffmpeg.org/.

[Flo10] Rodrigo L. M. Flores. Boinc + r: Executando rotinas de bioin-


formática em grades oportunistas. 2010.

[GJG+ 05] Fabrizio Gagliardi, Bob Jones, François Grey, Marc-Elian Bégin,
and Matti Heikkurinen. Building an infrastructure for scientific
grid computing: status and goals of the egee project. 2005.

[HTHK09] E. Heien, Y. Takata, K. Hagihara, and A. Kornafeld. Pymw - a


python module for desktop grid and volunteer computing. 2009.

[PA] Jeferson Librelotto Prevedello and Rafael Antonioli. Boinc - um


sistema para computação voluntária.

[PyM10] About pymw, 2010. http://pymw.sourceforge.net/?page id=2.

[Pyt10a] General python faq, 2010. http://docs.python.org/faq/general.html.

[Pyt10b] Python programming language – official website, 2010.


http://www.python.org/about/.

[TOP] Architecture share for 11/2010 | top500 supercomputing sites.


http://www.top500.org/stats/list/36/archtype.

27
Parte II - Subjetiva
7 Desafios e frustrações encontradas durante
o curso
O curso de bacharelado em ciência da computação apresenta diversos desafios
para o aluno desde o começo. O curso foca fortemente na base teórica, isto
é algo bom pois prepara o aluno para adquirir conhecimento novo com mais
facilidade.
Porém com esse forte enfoque na parte teórica faz com que a parte técnica
deixe muito a desejar. Há pouquı́ssimas matérias que dão a oportunidade do
aluno aprender novas tecnologias e isso é uma grande desvantagem quando o
aluno parte para o mercado de trabalho. Em algumas matérias, como Enge-
nharia de Software, requer do professor além de experiência acadêmica, uma
boa vivência em desenvolvimento de software, principalmente no mercado de
trabalho.
O curso exige a dedicação exclusiva do aluno, porém alguns alunos preci-
sam trabalhar desde o começo para ajudar na renda familiar. Muitos deles
não conseguem acompanhar o curso, ficam desmotivados e por muitas vezes
desistem do curso ou pedem transferência para outro curso. Isso é triste, pois
muita gente boa deixa de concluir o curso.
Um fato a se comentar é o baixo ı́ndice de alunos se formando em 4 anos.
Algumas matérias acabam ”segurando” os alunos. No meu ponto de vista,
os professores que dão essas matérias estudam a tanto tempo o assunto que
para eles esses assuntos são considerados triviais, mas para os alunos não.
Algumas matérias que tem um conteúdo bem interessante acabam virando o
”terror” dos alunos. Do meu ponto de vista, essas matérias não deviam ter
um nı́vel de dificuldade tão alto. Deveriam ter um conteúdo mais leve e mais
diluı́do, possibilitando que o aluno que tenha interesse no assunto possua
condições de aprofundar no conhecimento por conta própria ou em uma IC
ou Pós.

8 Disciplinas relevantes para o trabalho


Muitas disciplinas foram importantes para o desenvolvimento do projeto.
Comentarei abaixo as disciplinas que mais contribuı́ram para a conclusão do
projeto.
Estes anos cursando Bacharelado em Ciência da Computação proporcio-
naram uma grande experiência de desenvolvimento de software em ambiente

28
Linux. Assim como sua configuração, instalação de servidores, bancos de
dados. Essa experiência foi de extrema importância para a realização do
trabalho.

8.1 MAC0122 - Princı́pios de Desenvolvimento de Al-


goritmos
Esta é a primeira disciplina dedicada ao aprendizado de algoritmos. O apren-
dizado de algoritmos eficientes nesta disciplina ofereceram uma vivência na
elaboração de códigos com soluções elegantes.

8.2 MAC0211 - Laboratório de Programação I


Esta disciplina proporcionou uma boa vivência com diversas ferramentas que
são extremamente úteis no dia-a-dia, como subversion e LATEX. Foi a primeira
matéria que lidamos com um projeto e a utilização de bibliotecas para a
construção de um software.

8.3 MAC0323 - Estruturas de Dados


A disciplina de Estrutura de Dados é de extrema importância para a forma-
ção, pois nela você estuda conceitos e algoritmos que são muito utilizados
no desenvolvimento de qualquer software. Assim como em MAC0122, pro-
porciona uma boa vivência em desenvolvimento de programas com soluções
elegantes e eficientes.

8.4 MAC0417 Visão e Processamento de Imagens +


MAC0338 - Análise de Algoritmos
Ter uma noção de quão complexo é processar um vı́deo é importante para
esse trabalho.

8.5 MAC0422 - Sistemas Operacionais


Esta disciplina contribuiu com o melhor conhecimento do funcionamento dos
sistemas operacionais. Isto foi de grande importância para o Trabalho de
Conclusão, pois o trabalho é executado em diversos sistemas operacionais
e saber como eles são executados foi necessário para o desenvolvimento do
projeto. Esta disciplina ofereceu um conhecimento inicial sobre programação
concorrente.

29
8.6 MAC0438 - Programação Concorrente
Está é a disciplina que mais se aproxima com o que o trabalho propõe, pois
não fiz o curso de Programação paralela e distribuı́da pois esta não foi ofe-
recida este ano. Ensinou conceitos de programação concorrente, que são
utilizados para o desenvolvimento do projeto.

9 Conceitos Aplicados
Os conceitos aplicados vieram principalmente da matéria de Programação
Concorrente como o de problemas trivialmente paralelizáveis, processamento
distribuı́do, grids e overhead. Outras disciplinas como Visão e Processamento
de Imagens deram uma noção de como funciona o processar vı́deos e qual
sua complexidade.

10 Continuação do trabalho
Trabalhos futuros sobre este tema serão sempre apreciados e ajudados na
medida do possı́vel.
Há uma enorme quantidade de trabalhos que podem ser desenvolvidos em
cima da plataforma BOINC para determinar sua viabilidade e performance.
Listarei a seguir sugestões de trabalhos que poderão ser desenvolvidos que
são próximos aos desenvolvidos por este:

ˆ Realizar um ajuste fino no servidor e nos clientes BOINC com o objetivo


de obter uma menor espera ao enviar e receber uma tarefa, determi-
nando se problemas que eram inviáveis tornam-se viáveis.

ˆ Realizar mais estudos de caso em cima do BOINC utilizando-se a lin-


guagem Python, com problemas que possuem entradas menores, mas
que sua computação demore um tempo razoável.

ˆ Comparar a performance de programas feitos para grade BOINC utilizando-


se a linguagem C/C++ com programas feitos em linguagens dinâmicas.

ˆ Explorar o uso do BOINC na realização de testes automatizados de


software e deploy contı́nuo.

30
11 Agradecimentos
Este trabalho foi concluı́do graça à ajuda de diversas pessoas. Gostaria de
agradecer à minha famı́lia e namorada pelo apoio proporcionado durante o
decorrer do trabalho, incentivando em momentos difı́ceis.
Também gostaria de agradecer outras pessoas que contribuı́ram direta-
mente para o trabalho. Primeiramente agradeço meu orientador, Roberto Hi-
rata Jr., que foi sempre muito presente durante todo o trabalho, contribuindo
com problemas teóricos e processuais. O professor Alfredo Goldman que co-
orientou contribuiu para a parte de testes e infraestrutura, prontificando-se
a resolver problemas burocráticos em relação ao CEC.
Uma ajuda essencial no começo do trabalho foi do ex-aluno Rodrigo Flo-
res, que contribuiu contando as suas experiências obtidas no seu trabalho de
conclusão de curso que possuı́a um tema relativamente próximo ao desenvol-
vido por este trabalho.
Agradeço também os administradores do CEC, Jânio e Gislaine, por sem-
pre prontificarem a resolver problemas técnicos relativos à infraestrutura do
CEC. E ao administrador da rede Vision, Rodrigo Pimentel, por ajudar tam-
bém na infraestrutura da rede Vision.

31

Você também pode gostar