1.1. Motivação

Propaganda
Faltam seis coisas no relatório:
1. Resultados obtidos (motivos óbvios)
2. Listagem do código fonte (para manter o arquivo pequeno)
3. Figuras (para manter o arquivo pequeno - já estão prontas!)
4. Formatação (índice, numeração de páginas etc.)
5. Organizar e completar a bibliografia (tá uma zona!)
6. Escolher um nome para a danada da ferramenta!
Todos esses itens podem ser facilmente “consertados”. O principal é que parte
escrita esteja boa. Se esse for o caso, podemos complementar o relatório e entregar uma
versão definitiva segunda-feira ou terça-feira, fazendo as alterações necessárias e
enchendo de fru-fru...
QUANTO VALE O SHOW?!
RESUMO
Atualmente a Internet é um dos meios mais rápidos, práticos e baratos de
disseminação de conhecimento. Pessoas do mundo inteiro usam o computador para se
comunicar e pesquisar sobre assuntos de seu interesse. Pensando nessas pessoas,
desenvolvemos nosso projeto, que consiste de dois módulos fundamentais.
O primeiro módulo tem a finalidade de auxiliar em pesquisas comuns usando a
Internet. Ele atua como um filtro que elimina referências a páginas não existentes ou que
o conteúdo não seja adequado aos objetivos do usuário. Serve para que ele poupe o seu
tempo, e obtenha mais sucesso do que se fizesse uma busca usando ferramentas de busca
num browser qualquer. Ele possui ainda um recurso auxiliar, que lhe permite criar
automaticamente novas listas de palavras relacionadas com qualquer assunto e dessa
forma auxilia o usuário, que precisará usar menos do seu bom senso na hora de escolher
palavras para uma nova busca.
O segundo módulo facilita a vida do usuário de programas de e-mail, pois permite
que este organize suas mensagens numa hierarquia de pastas, através da análise do
conteúdo de cada mensagem. Isto é muito útil devido ao grande aumento de mensagens
eletrônicas que circulam pela rede diariamente (muitas delas conhecidas como spam ou
então por mala direta). O usuário comum é bombardeado por mensagens que não são de
seu interesse, algumas delas possuindo conteúdo impróprio e às vezes até mesmo
pornográfico. Através deste módulo, o usuário terá um maior controle sobre as
mensagens que recebe.
1.
Introdução
1.1. Motivação
1.2. Objetivos
1.3. Resumo do trabalho
1.4. Contribuições
1.5. Organização
2. Revisão bibliográfica
2.1. Terminologia utilizada
2.2. Abordagens possíveis
2.3. O problema e a solução adotada
3. A ferramenta XXX
3.1. Módulo de busca na Internet
3.2. Módulo de e-mails
3.3. Escolha dos parâmetros utilizados
3.4. Decisões de projeto
3.5. Método de codificação
3.6. Linguagem utilizada
3.7. Implementação
4. Utilização da ferramenta
5. Resultados obtidos
6. Conclusão e trabalhos futuros
7. Referências bibliográficas
8. Apêndice
1. Introdução
1.1. Motivação
A Internet foi criada inicialmente pelo exército americano, que na época estava
interessado em criar uma rede que fosse capaz de continuar operando mesmo que parte de
suas conexões deixassem de funcionar (chamada na época pelo nome de Arpanet). Com o
passar dos anos, universidades americanas tiveram interesse em integrar a rede. Mais
tarde ainda, foi a vez da iniciativa privada. Atualmente, bilhões de pessoas têm acesso a
rede, totalizando uma quase infinidade de páginas de conteúdo disponíveis para seus
usuários.
Esse crescimento justificou o aparecimento de ferramentas de busca para facilitar a
vida do usuário comum, interessado apenas em fazer uma procura por determinado
assunto. Essas ferramentas são na verdade sites que possuem grandes bancos de dados,
contendo referências para inúmeras páginas, que vão sendo cadastradas com o passar do
tempo. Cada página cadastrada possui um conjunto de palavras-chaves, que serão usadas
para retornar o endereço (URL) da mesma, quando um usuário fizer uma busca usando
uma destas palavras.
Uma vez cadastrada, a referência da página pode permanecer no banco de dados por
um longo tempo, dependendo da política adotada pelo banco. Esse cadastro é na maior
parte das vezes feito pelo usuário que está interessado em disponibilizar o conteúdo de
sua página na rede.
Passado algum tempo, a página é reeditada por seu dono, e seu conteúdo é
modificado. O conjunto de palavras-chaves que foi cadastrado na ferramenta na ocasião
fica desatualizado. Dessa forma, buscas futuras que forem feitas usando estas palavras
retornarão um endereço a mais na relação de páginas encontradas, sendo que esta página
não é mais interessante para a pessoa que faz a pesquisa na ferramenta. Isto também
acontece quando a página não se encontra mais no endereço ao qual foi cadastrada,
caracterizando um “broken link”.
Apesar do surgimento de mecanismos como as ferramentas de busca, cada vez mais
a Internet cresce de tamanho. O usuário comum, perde cada vez mais do seu curto tempo
livre, para pesquisar algum assunto. Ele acaba por ser sobrecarregado com informações
que não lhe interessam. Isso hoje em dia é quase inadmissível, pois no corre-corre do
dia-a-dia e na pressão e concorrência do mundo contemporâneo, fica mais difícil arranjar
tempo para esse tipo de pesquisa, geralmente longa e em muitos casos infrutífera.
Em conseqüência disso, a sociedade científica é cada vez mais pressionada a
inventar novos meios e métodos para restringir buscas na rede. Algumas promessas têm
sido técnicas de Data Mining [x1], o desenvolvimento de agentes inteligentes (Intelligent
Agents) usando técnicas de aprendizagem de contextos [x2], ambos atuando em uma base
de dados textual.
Enquanto algumas dessas opções não se tornam comercialmente disponíveis,
outros esforços vão sendo feitos para obter uma solução para este grande problema. Uma
das principais motivações de nosso projeto final é disponibilizar ao usuário comum uma
interface que lhe permita fazer uma pesquisa na Internet, rodando em “background”.
Dessa forma, o usuário destinaria seu tempo a tarefas mais úteis, enquanto o programa faz
a filtragem de inúmeras páginas que não seriam de seu interesse. Mais tarde, com a
pesquisa terminada, ele só teria o trabalho de observar um menor número de páginas, não
perdendo horas e horas do seu precioso tempo.
1.2. Objetivos
Tornar a busca de informações na grande rede mundial de computadores mais
dinâmica e eficiente, poupando principalmente o tempo do usuário, que atualmente é tão
precioso. Além disso, reduzir a frustração gerada por buscas infrutíferas, repletas de
contextos inadequados à intenção inicial do usuário.
Devido ao grande volume de mensagens eletrônicas que um usuário recebe, que
tende só a aumentar com o passar do tempo, surge a necessidade de um mecanismo mais
inteligente para gerência e controle de e-mails.
1.3. Resumo do trabalho
Durante a nossa vida como usuários de microcomputadores e em especial da
Internet, sentíamos falta de uma ferramenta de busca que pudesse nos retornar um
número menor e mais interessante de páginas quando executávamos uma busca.
Precisávamos de um filtro mais inteligente, que pudesse refinar os resultados da busca. O
mesmo podemos dizer dos diversos programas de e-mail que conhecemos. Ficávamos
profundamente incomodados ao receber diversos e-mails que não nos interessavam e não
ter como verificar tal fato sem lê-los, ou simplesmente não ter como dividir melhor as
mensagens em diversas pastas por um meio mais eficiente do que meramente baseados no
endereço eletrônico de quem nos enviou a mensagem. Por isso resolvemos abordar em
nosso projeto final justamente esses dois temas, uma ferramenta de busca e um
gerenciador de e-mails que sejam capazes de gerar melhores resultados para os muitos
usuários da grande rede mundial de computadores.
Temas simples, mas que confiamos que possam ser úteis para os diversos usuários
comuns ou científicos da Internet, assim como o foi para nós a ponto de ser motivação
para o nosso projeto final de curso.
1.4. Contribuições
O nosso projeto apresenta uma ferramenta que se propõe a resolver os problemas
mencionados anteriormente. No módulo de nossa ferramenta destinado a busca na
Internet, criamos uma camada de software no cliente capaz de receber conteúdo de
páginas que foram referenciadas por uma determinada ferramenta de busca, cujos
parâmetros são alteráveis para gerar diferentes resultados de acordo com as necessidades.
Além disso o programa é capaz de filtrar as páginas resultantes da busca, usando um
método que criamos especificamente para este fim.
O módulo de nossa ferramenta destinado ao gerenciamento de mensagens
eletrônicas implementa uma forma bem simples e prática de manter uma hierarquia por
intermédio de palavras-chaves que são buscadas nos diversos campos das mensagens.
Para isso, compomos duas camadas: uma implementa um protocolo “pop” para
recebimento de e-mails do servidor e a outra é o programa de e-mail em si. Em ambas
tivemos que partir do zero.
1.5. Organização
Os próximos capítulos do relatório estão divididos da seguinte forma: o capítulo 2 é
uma revisão bibliográfica, onde pode-se ler a respeito da terminologia usada no relatório.
Ainda no capítulo 2, são apresentadas as abordagens possíveis para se chegar aos
objetivos do projeto, suas vantagens e desvantagens e a solução adotada no projeto. O
capítulo 3 contém uma análise mais profunda da ferramenta desenvolvida, com a
descrição detalhada de seus dois módulos, o motivo de cada parâmetro adotado e algumas
decisões que tiveram que ser tomadas no decorrer do desenvolvimento do projeto. Além
disso, o método de codificação adotado, a linguagem de programação utilizada e as
estruturas usadas na implementação da ferramenta também são apresentados no capítulo
3. No capítulo 4 há uma descrição sucinta de como a ferramenta XXX deve ser utilizada.
No capítulo 5 são apresentados os resultados obtidos através dos testes experimentais
realizados com a ferramenta. As conclusões sobre o projeto e idéias para trabalhos futuros
são apresentadas no capítulo 6. O capítulo 7 contém todas as referências bibliográficas
utilizadas no projeto. Por fim, no apêndice, capítulo 8, está listado o código fonte do
programa.
2. Revisão bibliográfica
2.1. Terminologia utilizada
A linguagem de programação JAVA
Terminologia usada tanto para referenciar a linguagem de programação quanto a
plataforma de desenvolvimento.
A linguagem de programação JAVA é uma linguagem de alto nível que pode ser
caracterizada por ser simples, independente de arquitetura, orientada a objetos, portável,
distribuída, interpretada, robusta, dinâmica, segura e que suporta threads [x9].
Um código fonte feito em JAVA é compilado uma única vez, quando ocorre a
criação dos “bytecodes” JAVA. Esse código gerado é independente de plataforma, ou
melhor, será interpretado (Figura x1) em plataformas diferentes por um programa
chamado de máquina virtual (JVM), cuja implementação varia de plataforma para
plataforma. Dessa forma, tais “bytecodes” podem ser interpretados em sistemas
operacionais diferentes, o que caracteriza sua portabilidade, já que não é necessário
recompilá-los de máquina para máquina (Figura x2).
Figura x1
Figura x2
Por ser um ambiente independente de plataforma, um programa feito em JAVA
tende a ser mais lento que um feito em código nativo, que é compilado unicamente para
uma determinada plataforma. Entretanto, com a melhoria gradual dos compiladores, a
performance do programa feito em JAVA está tendendo a ser cada vez mais parecida com
a de um programa em código nativo, sem comprometer a portabilidade que se queria
manter.
Internet
A Internet é uma coleção muito grande de documentos heterogêneos. Páginas da
Internet são documentos típicos distintos em bancos de dados tradicionais. As páginas
podem ser ativas (por exemplo, animações, JAVA), podem ser automaticamente geradas
em tempo real (por exemplo, preços de estoque atual) e podem conter multimídia (por
exemplo, som, vídeo). Os autores de páginas da Internet têm conhecimentos, culturas e
objetivos bem diversos.
A Internet cresceu rapidamente desde seu início em dezembro de 1969. A Internet
representa um progresso significante na recuperação e disseminação de informações e
para o avanço da educação. Com a introdução de ferramentas de busca, tais como
“AltaVista”
(www.altavista.com),
(www.excite.com),
“HotBot”
“Infoseek”
(www.hotbot.com),
(www.infoseek.com),
“Google”
“Excite”
(www.google.com),
“Lycos” (www.lycos.com) e “Northern Light” (www.nlsearch.com), a Internet pode ser
vista como uma enciclopédia de busca de 15 bilhões de palavras [x10].
Ferramentas de busca
Serviço oferecido por servidores na Internet, que mantém um banco de dados de
referências de inúmeras páginas que são cadastradas diariamente. Pode-se fazer uma
pesquisa nesse banco de dados, através da entrada de palavras feita pelo usuário numa
página hipertexto.
As maiores companhias de ferramentas de busca freqüentemente clamam que
podem indexar quase a Internet inteira, a medida que esta cresce. Entretanto, a Internet é
uma fonte de informação distribuída, dinâmica e que cresce rapidamente, apresentando
dificuldades para tecnologias tradicionais de recuperação de informação. Sistemas
tradicionais de recuperação de informação foram projetados para diferentes ambientes e
têm sido tipicamente usados para indexar uma coleção estática de documentos
diretamente acessíveis.
A figura 1 mostra a arquitetura de ferramentas de busca típicas. A informação
desejada pelo usuário é transformada em uma consulta. A consulta é aplicada a um banco
de dados local de páginas da Internet e os resultados são ordenados e mostrados ao
usuário.
FIGURA 1
As ferramentas de busca percorrem a Internet, baixando e indexando páginas para
permitir a busca em textos inteiros. Existem muitas ferramentas de busca de propósito
geral, infelizmente nenhuma delas chega perto de indexar toda a Internet. Existem
também milhares de serviços de busca especializados que indexam conteúdo específico
ou sites específicos. A grande variabilidade dos serviços de busca disponíveis levou ao
surgimento de ferramentas de metabusca.
Ferramentas de metabusca
Uma ferramenta de metabusca provê uma interface única para múltiplas
ferramentas de busca e combina os resultados em uma única lista unificada.
Ferramentas de metabusca podem ter grande dificuldade em determinar
documentos úteis, devido a variabilidade e carência de informação conhecida sobre as
ferramentas de busca individualmente. Por exemplo, se uma ferramenta de busca retorna
muitos resultados irrelevantes, uma ferramenta de metabusca pode não ter como evitar
esses resultados. Algumas ferramentas de metabusca populares incluem MetaCrawler
(www.metacrawler.com) e SavvySearch (www.savvysearch.com).
A figura 2 mostra a arquitetura de uma ferramenta de metabusca típica. Uma
ferramenta de metabusca não tem um banco de dados local e confia em outras fontes
(outras ferramentas de busca), como é mostrado na figura. Os resultados retornados pelas
outras fontes são combinados e então mostrados ao usuário.
FIGURA 2 MODIFICADA
Outras definições
URL (Uniform Resource Locator): Localizador Uniforme de Recursos, denominação
usada para representar um endereço de documento na Internet.
Broken link: termo usado para uma URL que não é válida, ou seja, o documento não
existe mais naquele endereço.
HTML (HyperText Markup Language): código de linguagem para veicular textos e
imagens na Internet (documento hipertexto), linguagem usada para escrever páginas na
Internet.
Tags: comandos de html.
Home page: página pessoal na Internet, documento hipertexto na Internet dedicado a um
certo tema, a uma empresa ou a uma certa pessoa.
Bandwidth: largura de banda, quantidade máxima de informação que pode trafegar
através de um canal de transmissão.
API (Application Programming Interface): nome dado para uma coleção de componentes
prontos para uso, ou seja, é uma biblioteca com várias classes.
Time out: tempo onde o computador tenta se conectar a um dispositivo ou a um outro
computador distante mas não consegue. Neste projeto é o tempo limite que nosso
programa tem para receber uma página de um servidor qualquer, sendo que quando este
limite é atingido, o programa desiste da página.
Background: termo utilizado para indicar que determinado programa roda sem precisar
da interação com o usuário, ou então roda em menor prioridade que outros programas.
2.2. Abordagens possíveis
Dado a que a cobertura de qualquer uma das ferramentas de busca é limitada, o
meio mais simples de melhorar a cobertura de ferramentas de busca na Internet é
combinar os resultados de múltiplas ferramentas, como é feito com ferramentas de
metabusca tais como “MetaCrawler” (www.metacrawler.com).
Outra alternativa é combinar fontes de informação disponíveis tais como as
ferramentas de busca maiores com busca “online” automatizada. Um exemplo é o
Internet “softbot” [x11]. O “softbot” transforma consultas em metas e usa um algoritmo
de “planning” [x12] para gerar uma seqüência de ações a fim de satisfazer a meta. O
“planner” tem extenso conhecimento das fontes de informação que ele acessa. Um
“softbot” de sucesso é o serviço AHOY! [x13], que localiza “home pages”. Em um estudo
onde foram baixadas “home pages” de 582 pesquisadores, o AHOY! localizou mais
páginas do que o “MetaCrawler” (que localizou mais “home pages” que o “HotBot” ou
“AltaVista”), o que melhorou muito a precisão [x14].
Outra possibilidade para melhorar a busca para grupos específicos de usuários é a
criação de uma ferramenta de busca projetada para manter atualizados os índices das
páginas que são importantes para tais grupos. “Crawlers” focalizados [x15] auxiliam na
busca e recuperação de dados somente no subconjunto da Internet que pertence a um
específico tópico de relevância. O “crawler” focalizado ideal recupera o conjunto mínimo
de páginas relevantes, enquanto simultaneamente atravessa o número mínimo de
documentos irrelevantes na Internet. “Crawlers” focalizados são bem adequados para
gerar eficientemente índices para ferramentas de busca especializadas, onde há
“bandwidth” e espaço limitados. Devido aos recursos limitados usados por um bom
“crawler” focalizado, usuários já usam implementações pessoais para PC. “Crawlers”
focalizados simples podem se tornar o método de escolha para usuários fazerem buscas
compreensíveis de assuntos na web. Embora promissor, a tecnologia que suporta
“crawling” focalizado ainda está engatinhando. O maior problema em “crawling”
focalizado é atribuir maior prioridade a rotas de busca que fornecem documentos
altamente relevantes. Na ausência de uma estratégia de atribuição de prioridade
confiável, “crawlers” focalizados sofrem com a habilidade limitada de sacrificar a
recuperação de documentos menos importantes com o intuito de conseguir uma melhor
performance geral. Em particular, os “crawlers” existentes ainda não possuem estratégias
de aprendizado onde documentos relevantes são encontrados seguindo páginas
irrelevantes.
Usando ferramentas de busca, uma forma de aumentar o número de resultados
relevantes a uma específica necessidade é fazer modificações na consulta. Existem três
tipos de modificações na consulta usadas: utilização de opções específicas da ferramenta
de busca, adicionar termos ao início da consulta ou adicionar termos ao final da consulta
[x16]. Além disso, mais de uma consulta modificada pode ser feita a uma dada ferramenta
de busca.
2.3. O problema e a solução adotada
O tamanho da Internet publicamente indexável provavelmente já ultrapassou um
bilhão de documentos [x17] e continua crescendo, não mostrando sinal de que irá se
estabilizar. O conteúdo dinâmico na Internet está também crescendo, com assuntos
sensíveis ao tempo, tais como notícias, dados financeiros, entretenimento e catálogos que
se tornaram largamente disseminados através da rede. As ferramentas de busca estão
aumentando cada vez mais seus esforços para tentar manter seus índices atualizados, mas
até mesmo usando sistemas magníficos, tais como o “Scooter” do “AltaVista” [x18], que
pesquisa dez milhões de páginas por dia, não se consegue sucesso nessa tarefa.
É por isso que as ferramentas de busca podem retornar (e freqüentemente retornam)
documentos que não contém os termos de consulta. Este comportamento pode ocorrer por
vários motivos:

A tecnologia de recuperação de informação usada pela ferramenta pode não requerer
exatidão em relação aos termos da consulta, podendo retornar documentos com
palavras relacionadas.

Os documentos podem não existir mais.

Os documentos podem ainda existir, mas podem ter mudado e não contém mais os
termos da consulta.
Como conseqüência disso, quando faz uma busca na Internet, um usuário pode ser
afogado por milhares de resultados gerados por uma ferramenta de busca, pouco dos
quais são úteis.
Para sanar esse problema, desenvolvemos um filtro capaz de verificar a validade
dos resultados obtidos, através da busca em cada página pelos termos da consulta e por
palavras adicionais que ajudam a identificar o contexto associado. Uma vez que esse
problema foi resolvido, voltamos nossa atenção para o problema da cobertura das
ferramentas de busca.
As coberturas das maiores ferramentas de busca da Internet foram analisadas,
fornecendo alguns resultados surpreendentes. A cobertura de qualquer ferramenta é
significantemente limitada: nenhuma ferramenta indexa mais que um terço da Internet
indexável. A cobertura de seis ferramentas investigadas varia em ordem de magnitude e
combinando os resultados das seis ferramentas forneceu cerca de 3,5 vezes mais
documentos na média quando comparado com os resultados de uma única ferramenta
[x18].
Sendo assim, decidimos implementar uma ferramenta de metabusca que se
utilizasse de mais de uma ferramenta de busca para obter seus resultados. Foi então que
nos deparamos com outro problema: quantas ferramentas de busca utilizar e, o que é mais
importante, quais?
O que se percebe usando a maioria das ferramentas de busca mais famosas é que
elas indexam aproximadamente os mesmos documentos e que elas indexam uma porção
relativamente grande da Internet.
FIGURA (TABELA)
Assumimos que as ferramentas de busca não obtêm amostras da Internet
independentemente quando elas escolhem páginas para indexar. Cada ferramenta de
busca permite que usuários registrem suas páginas na ferramenta e é razoável assumir que
muitos usuários registram suas páginas em muitas das ferramentas. Portanto, as páginas
indexadas por cada ferramenta serão parcialmente dependentes. Uma segunda fonte de
dependência estatística entre a amostragem feita por cada ferramenta vem do fato de que
ferramentas de busca são tipicamente induzidas a indexar as páginas mais populares.
É razoável esperar que as ferramentas maiores tenham menor dependência porque
elas podem indexar mais páginas além das que os usuários registram e podem indexar
uma quantidade maior das páginas menos populares da web.
Foi por causa dessa dependência existente entre as ferramentas de busca que
optamos por utilizar apenas duas delas em nosso projeto: o AltaVista e o Google. A
escolha do AltaVista foi feita baseada em seu tamanho, pois atualmente ela é uma das
ferramentas de busca com maior cobertura da Internet. O Google foi escolhido devido ao
fato de que é uma ferramenta de busca voltada em grande parte para o meio científico.
Com relação à possibilidade de fazer mudanças na consulta do usuário, deixamos
essa opção nas mãos do próprio usuário, que com nossa ferramenta pode gerar listas de
palavras relacionas aos termos de sua consulta, podendo incrementar sua busca com uma
ou mais palavras sugeridas, se assim desejar.
Quanto aos problemas que o módulo de e-mail se propõe a solucionar, a definição
de pastas e subpastas com palavras-chaves associadas a elas é a abordagem que parece
mais simples e sensata, resolvendo os problemas de forma satisfatória. Uma das únicas
coisas que tivemos que decidir foi o que seria feito caso uma mensagem contivesse
palavras-chaves associadas a mais de uma pasta. Decidimos que a mensagem deveria ser
replicada, para evitar que ela fosse encaminhada à pasta menos adequada.
A possibilidade de realizar o processamento das mensagens no servidor foi
cogitada. Isso evitaria o fluxo de mensagens inúteis para o cliente, mas implicaria em
alterar o programa de redistribuição de e-mails que o servidor utiliza (impraticável de ser
implementado).
3. A ferramenta XXX
Implementamos nossa ferramenta em dois módulos. O primeiro módulo é utilizado
para que o usuário possa fazer uma busca na Internet de forma mais eficiente e rápida e o
segundo módulo permite que o usuário processe e-mails de forma mais eficiente,
descartando mensagens indesejáveis.
3.1. Módulo de busca na Internet
No momento em que for fazer uma busca, o usuário escolhe uma lista de palavras
que representa um assunto do qual se trata a busca. Dessa lista de palavras seleciona-se
um grupo de palavras obrigatórias e um grupo de palavras opcionais na busca. As
palavras obrigatórias são palavras que devem necessariamente aparecer nas páginas
resultantes da busca. As palavras opcionais podem aparecer no resultado da busca ou não,
sendo que a quantidade de palavras opcionais que devem aparecer nas páginas resultantes
é determinada por um parâmetro fornecido pelo usuário.
Depois de determinadas as palavras obrigatórias, as palavras opcionais e a
quantidade de palavras opcionais que devem aparecer no resultado, o apertar de um
simples botão dá início ao processo de busca.
Com as palavras obrigatórias, montam-se as URLs das páginas que seriam geradas
pelas ferramentas de busca selecionadas, caso fossem usadas numa busca usando um
browser. Tais páginas contêm as listas de endereços fornecidas pelas ferramentas de
busca. Tendo essas páginas em mãos, elas devem ser analisadas a fim de se obter uma
lista contendo apenas as URLs das páginas que supostamente são resultados da busca.
Com cada uma das URLs dessa lista, baixa-se a página da Internet correspondente e então
é feita uma busca pelas palavras obrigatórias e opcionais. Se a página contiver todas as
palavras obrigatórias e pelo menos a quantidade especificada de palavras opcionais então
ela é considerada boa e gravada em disco (uma versão contendo somente texto, sem
imagens). Caso a página não atenda às condições ela é imediatamente descartada. Uma
página também pode ser descartada por “time out”, ou se for um “broken link”, ou se seu
tamanho exceder um determinado limite pré-estabelecido. O descarte por “broken link” é
obviamente necessário, pois a página na realidade não existe mais. O descarte por “time
out” é necessário para evitar que um servidor que não responde prenda o processamento
eternamente, fazendo o programa travar. O descarte por tamanho da página existe para
evitar que se perca tempo baixando uma página de tamanho exorbitante e que não tenha
conteúdo que valha o sacrifício. Em geral, páginas de hipertexto não ocupam muito
espaço, de modo que se alguma ocupar mais que um tamanho determinado, então
provavelmente trata-se de um banco de informações e não tem especificidade sobre o
assunto que se busca, tornando a página descartável.
Tendo uma lista de páginas já processadas e aceitas, o programa cria uma página
em hipertexto contendo todos os links para as páginas úteis e para suas cópias, que são
mantidas localmente. Com essa página, o usuário pode acessar as cópias das páginas até
mesmo off-line e se alguma delas contiver algum link para outro texto, arquivo ou figura
que mereça ser verificado, o usuário pode se utilizar do endereço real da página.
A vantagem de se utilizar este módulo é que numa pesquisa comum na Internet, o
usuário precisaria estar o tempo todo interagindo com o browser, decidindo quais páginas
são úteis a ele ou não. Usando o módulo de busca, essa tarefa é delegada ao computador
que estiver executando o programa. Não é necessária a interação do usuário durante o
processo. Cabe ao mesmo apenas definir os parâmetros da busca e esperar pelos
resultados gerados.
Para auxiliar na utilização do módulo de busca, foi desenvolvido um criador
automático de assunto que tem como finalidade definir um conjunto de palavras que
possam ter relação com assunto determinado pelo usuário.
Para utilizar o criador automático de assunto, o usuário entra com as palavras
determinantes de um novo assunto e aperta o botão “Criar Assunto”. Após alguns
minutos, o programa exibe a lista de palavras associadas ao assunto. As palavras que na
realidade não corresponderem ao assunto especificado podem ser retiradas do conjunto.
As palavras que não definem nenhum tipo de assunto em especial (pronomes,
conjunções, etc.) podem ser acrescentadas ao dicionário de palavras comuns, para que
não apareçam mais em uma utilização posterior do programa. Então o usuário salva o
assunto criado para que possa ser usado em uma busca.
Após o usuário determinar uma ou mais palavras que definam o assunto, o
programa gera uma lista de URLs de páginas relacionadas a essas palavras. Em seguida o
conteúdo de cada uma das URLs é baixado. Como se tratam de documentos hipertexto
(.html) é necessário que sejam extraídos os “tags” para que estes não influenciem na lista
de palavras a ser gerado. Também são eliminados todos os caracteres não alfanuméricos,
restando apenas uma seqüência de palavras separadas por espaço em branco. Essa
seqüência de palavras é então quebrada, alimentando uma lista de palavras. Cada palavra
é buscada no dicionário de palavras comuns. Caso seja encontrada, significa que se trata
de uma palavra que não define nenhum tipo de assunto (preposições, artigos, etc.) e
portanto não deve figurar entre as palavras resultantes. Caso contrário, se a palavra já
apareceu antes em alguma outra página, sua freqüência anterior é incrementada, senão
sua freqüência é igual a 1.
Ao final do processamento de todas as palavras de todas as páginas, separam-se
todas as palavras com freqüência maior ou igual a 50% do número de páginas analisadas.
Tais palavras são apresentadas ao usuário como sugestões de palavras que possam fazer
parte do assunto por ele definido.
O criador automático de assunto tem a vantagem de retirar do usuário o encargo de
pensar em palavras associadas a um assunto que possam ser usadas numa busca na
Internet.
3.2. Módulo de e-mails
Este módulo do programa tem como objetivo organizar os e-mails recebidos em
pastas e subpastas de acordo com as palavras-chaves associadas a elas.
Para receber mensagens e automaticamente armazená-las nas pastas adequadas
basta apertar o botão “Receber e-mails”. Para se criar uma nova pasta deve ser escolhido
um conjunto de palavras-chaves que a identifique. Cada uma das palavras-chaves não
pode já estar associada a uma outra pasta e deve ser escolhida pelo menos uma
palavra-chave. Para criar uma subpasta o procedimento é o mesmo, mas o conjunto de
palavras-chaves escolhidas deve ser subconjunto do conjunto de palavras-chaves da pasta
que contém a subpasta.
As mensagens são copiadas do servidor de e-mail e depois cada uma delas é
encaminhada à sua pasta correspondente. Para saber se uma mensagem deve entrar numa
determinada pasta, pega-se o conjunto de palavras-chaves associado a pasta e faz-se uma
busca na mensagem. Cada uma das palavras-chaves é procurada nos diversos campos da
mensagem (“from”, “to”, “subject”, “date” e “body”). Caso pelo menos uma seja
encontrada, a mensagem deve entrar na pasta (esquema “ou”). Se houver subpasta,
deve-se verificar se a mensagem deve entrar em uma delas, caso contrário a mensagem
permanece onde está. O método de busca utilizado para saber em que pasta a mensagem
deve ser armazenada é o de busca em profundidade. Caso a mensagem não contenha
nenhuma das palavras-chaves de nenhuma pasta, ela é armazenada na pasta “Inbox”.
As vantagens deste módulo da ferramenta são:

Facilita a priorização na leitura dos e-mails.

Permite que se tenha um melhor controle das mensagens.

Permite que se crie uma pasta “lixo” que, com um conjunto de palavras-chaves
adequado, separa as mensagens indesejáveis das demais.

Permite que se criem pastas para um ou mais remetentes específicos.

Permite que se criem pastas sobre assuntos e subpastas sobre tópicos determinados.

Permite que se criem pastas para mensagem recebidas numa determinada data.

Elimina a necessidade de várias contas de e-mail com finalidades diferentes.
3.3. Escolha dos parâmetros utilizados
No módulo de busca, na criação automática de um novo assunto, um dos
parâmetros utilizados é a quantidade de vezes que uma palavra deve aparecer para ser
considerada parte do assunto que está sendo criado. A princípio essa quantidade foi
definida com valor de 50% do número de páginas analisadas (valor experimental com
resultados satisfatórios), considerando-se que se uma palavra aparece em mais da metade
das páginas em uma busca, provavelmente ela tem relação com o assunto do qual se trata
a busca.
Outro parâmetro importante é o número de links por ferramenta, que determina a
quantidade limite de links úteis (processados e validados) que uma ferramenta pode
guardar.
Houve necessidade de adicionar outros parâmetros de corte. Um deles, que é o
número de caracteres por página html, foi necessário devido ao excessivo tamanho de
determinadas páginas. Outro parâmetro criado foi o limite de tempo para transmissão de
determinada página html. Em alguns casos o módulo ficava esperando o servidor retornar
uma página, travando o processo. Um dos motivos que nos forçou a não utilizar “threads”
independentes para cada página a ser transmitida foi que a estrutura de dados
compartilhada entre as “threads” só podia ser acessada por uma única “thread” em
determinado momento. Dessa forma as “threads” entrariam numa fila de espera tendo
quase a mesma performance caso fosse um processo único, senão pior devido a troca de
contextos entre as “threads”.
O número mínimo de palavras opcionais que uma página deve ter é um parâmetro
escolhido pelo usuário na criação de uma lista de assunto. Uma página é considerada
válida e útil caso ela tenha um número de palavras opcionais presentes no texto maior ou
igual ao parâmetro pré-estabelecido.
3.4. Decisões de projeto
Escolha dos algoritmos:
No módulo de e-mail foi implementado o método de busca em profundidade para
facilitar o encaminhamento das mensagens, uma vez que o conjunto de palavras-chaves
de uma subpasta é subconjunto do conjunto de palavras-chaves da pasta que a contém.
No módulo de busca fizemos uma pesquisa em algumas bibliotecas de classes do
JAVA, e descobrimos que uma delas implementa o algoritmo Boyer-Moore para busca de
palavras em texto [x4]. Sua performance era rápida o suficiente e ficamos satisfeitos com
a escolha.
Na criação automática de assunto o algoritmo para buscar uma palavra no
dicionário de palavras comuns foi a busca binária, tendo como chave o valor comparativo
entre caracteres alfanuméricos (string). Optamos porque era rápida a sua implementação
e obtivemos resultados satisfatórios.
Necessidade de uso de ferramentas de busca como base:
Havia limitações de projeto. Tendo em vista, que não dispúnhamos de um banco de
dados textual, muito menos de referências para páginas, assim como as ferramentas de
busca o possuem, fomos obrigados a adicionar uma camada a mais de processamento.
Não era possível para nós termos acesso direto ao banco, e acabamos, por falta de
recursos, tendo que adotar essa escolha de projeto. De qualquer maneira, outras
abordagens na literatura se utilizam de métodos baseados em metabusca como o nosso,
para tornar buscas mais eficientes.
Escolha das ferramentas de busca (AltaVista e Google):
Em nossa opinião porque são as ferramentas de busca mais usadas da Internet, uma
pelos usuários comuns e outra pelo meio científico. Dessa forma optamos por elas para
criarmos um protótipo do módulo de busca. A idéia em si é simples e pode ser aplicada
futuramente para outras ferramentas.
Decisão de não implementar técnicas de “data mining” no cliente:
Toda e qualquer técnica de “data mining” deve ser feita na base de origem dos
dados ou melhor, quando feita, é feita no servidor. Além disso, essas técnicas são usadas
para grande volume de dados e não é interessante para o cliente manter dados depois de
suas buscas, já que seria um banco muito pequeno para ser usado como base em buscas
futuras, sem falar que o usuário teria que manter esses dados em disco, o que seria
inviável na prática, sem falar que se o servidor já faz o “data mining”, porque fazer isso
no cliente de novo, se a diferença de um para outro será mínima, retornando praticamente
o mesmo número de páginas.
3.5. Método de codificação
A única política por nós utilizada de relevante importância foi o uso da Orientação a
Objetos como metodologia de modelagem do projeto.
O encapsulamento permitiu uma maior abstração e uma melhor visão do problema,
e também permitiu que programadores diferentes trabalhassem em códigos distintos,
evitando possíveis dependências entre os módulos, já que um podia contar com o serviço
de uma classe que outro estava fazendo sem precisar necessariamente saber como ela
estava sendo implementada.
A programação orientada a objetos difere da programação estruturada tradicional
principalmente porque ela coloca os dados e operações pertinentes a eles em uma simples
estrutura de dados. Em programação estruturada, os dados e operações nos dados são
separados e essa metodologia requer que sejam enviadas estruturas de dados a
procedimentos e funções para operar nelas. A programação orientada a objetos resolve
muitos dos problemas inerentes a esse projeto porque os atributos e operações são parte
da mesma entidade. Isso modela melhor o mundo real, onde todos os objetos tem ambos,
atributos e atividades, associados a eles.
3.6. Linguagem utilizada
Por ser uma linguagem totalmente orientada a objetos (não permite programação
estruturada), a linguagem JAVA nos leva naturalmente a programar usando orientação a
objetos. Dessa forma, o código fica modularizado, permitindo assim um reuso futuro.
Essa peculiaridade reduziu em muito o tempo gasto para a codificação do programa, já
que utilizamos as mesmas classes em diversas partes do programa. Isso nos permitiu uma
maior concentração em outros pontos importantes do projeto.
Nosso objetivo é que o nosso projeto final possa contribuir para o maior número de
pessoas e com o crescimento do sistema operacional Unix no meio empresarial, e sua
forte presença no meio acadêmico, sendo usadas quaisquer uma de seus variantes, por
exemplo o Solaris da Sun e o Linux para arquitetura PC, resolvemos utilizar como
linguagem de programação o JAVA para tirarmos proveito de uma das suas principais
características, ou seja, a portabilidade, isto é, podemos rodar um programa em JAVA sob
qualquer ambiente (Windows [x5], Linux [x6], Solaris [x7], MacOS [x8] etc.), usando
uma máquina virtual (JVM- Java Virtual Machine) da própria plataforma sem precisar
compilar código (afinal de contas JAVA é interpretado pela própria máquina virtual; não
precisando ser compilado em uma nova arquitetura que venha a ser usado) atingindo
assim o objetivo de que o nosso projeto possa ser útil para diversas pessoas, tanto no meio
acadêmico, empresarial e até mesmo doméstico.
3.7. Implementação
Classes utilizadas:

HtmRipper.java  classe que processa uma página html gerada por uma ferramenta
de busca, retornando URLs de páginas referentes a busca executada.

HTM.java  classe que encapsula o protocolo HTTP (Hypertext Transfer Protocol).
Responsável pela transmissão de uma página html, retornando seu conteúdo.

PastaEmails.java  classe que define uma pasta no módulo e-mail

FerramentaString.java  responsável pela geração de um conjunto de caracteres
alfanumérico (mais conhecido como String) que será usado para chamar o programa
CGI que roda no servidor da ferramenta de busca. O resultado será um objeto da
classe HTM, contendo referências da busca que foi feita.

GeradorListaHttp.java  classe principal do módulo de busca. Ela coordena o
processo de transmissão de todas as páginas geradas pela busca. Ao final de sua
execução, ou melhor, ao final da busca, grava em disco todas as páginas que foram
úteis e cria um arquivo de índice (index.html).

StringBusca.java  classe que implementa a busca de palavras em um texto.

RemovedorTags.java  Remove tags de um documento hipertexto. Usado pela
instância da classe CriadorAssunto, para evitar que palavras contidas nesses tags
influenciem no resultado, adicionando palavras inúteis (que fazem parte das tags).

ListaAssunto.java  classe que mantém um grupo de palavras , associadas a
determinado assunto, que o usuário cria. Essas palavras podem estar guardadas como
simples (não é usada na busca, mas permanece na lista para futuro uso), obrigatórias e
opcionais.

Principal.java  classe de interface. Uma instância dela representa a tela principal do
módulo de busca.

IntVector.java  classe que estende (herança de objetos) a classe Vector da
biblioteca JAVA.UTIL. Usada para guardar inteiros.

FrameEdLista.java  classe de interface, que representa a tela de edição do assunto
do módulo busca.

OrderedVector.java  classe que estende a classe Vector, que mantém seus objetos
(cada uma das células guarda um objeto) ordenados pelo valor numérico de uma
string, que foi o tipo de objeto que resolvemos usar para guardar nesse vetor. Usada
para serialização do objeto ListaAssunto criado pelo usuário (processo de
armazenamento, vulgarmente conhecido como persistência, onde se guarda um
objeto em disco, para uso posterior.)

CriadorAssunto.java  classe que cria um assunto (grupo de palavras) através do
resultado de uma busca qualquer, usando palavras que foram freqüentemente
encontradas nas páginas html.

Arvore.java  classe que faz a representação da estrutura de pastas no módulo
e-mail.

Serializador.java  classe cuja instância serializa objetos em disco.

AvaliadorPagina.java  responsável por definir se uma página hipertexto é útil ou
não, em função das palavras obrigatórias, opcionais e o número mínimo e distinto (só
conta uma aparição de palavra por página) de ocorrências das palavras opcionais,
independendo da combinação.

PalavrasComuns.java  classe que implementa o dicionário de palavras comuns, no
módulo e-mail.

FrameEmails.java  classe de interface. Sua instância é a tela principal do módulo
e-mail.

MensagemReceiver.java  classe que encapsula o protocolo pop3, para recepção de
e-mails de um servidor pop.

ArvoreModel.java  classe que define um modelo para estrutura de árvore.

ArvoreCellRenderer.java  classe que desenha a estrutura de árvore num contexto
gráfico.

FrameNovaPasta.java  classe de interface, para criação de nova pasta de e-mail.

FrameAssuntoMagico.java  classe de interface. Tela principal do criador de
assunto.

Email.java  classe que define uma estrutura a ser utilizada para guardar e-mails.

FrameNovaSubpasta.java  classe de interface, para criação de nova subpasta de
e-mail.

DialogMelhorado.java  classe de interface, que herda da classe Dialog, da
biblioteca AWT (Abstract Window Toolkit, API de classes de interface gráficas,
reconhecidas por sua portabilidade, podendo ser interpretadas em todas as máquinas
virtuais Java que rodam em diferentes plataformas ou sistemas operacionais). Na
verdade, esta classe serve para gerar mensagens para o usuário, numa janela,
retornando o resultado para o programa, o que a classe pai não fazia.

Celula.java  classe cuja instância é uma única palavra de uma lista de assunto. Pode
ser simples, obrigatória ou opcional.
4. Utilização da ferramenta
Módulo de busca na Internet
No menu principal, selecione “Lista de Assunto” e depois selecione “Nova”,
“Editar” ou “Criação Automática”.
FIGURA P1
Selecionando “Nova” no submenu, o usuário entra com um grupo de palavras que
deseja buscar e tem a opção de escolher quais dessas palavras ele quer como obrigatórias,
ou seja, que vão ter que estar presentes numa página para que essa seja retornada como
resultado para o usuário e as opcionais, que como o próprio nome diz não precisam estar
obrigatoriamente presentes na página, apenas uma quantidade delas, também
estabelecida pelo usuário.
O usuário também pode determinar em quais ferramentas de busca (AltaVista,
Google, ou até mesmo as duas) a nossa ferramenta deve se basear para executar a busca.
O usuário agora pode gravar as opções por ele escolhidas, o que é feito através do
clique no botão “ok”, que abre uma janela para que seja escolhido o local e nome do
arquivo a ser gravado. Ou pode ainda iniciar a busca, o que é feito pelo botão “Gerar
HTML’s”.
FIGURA P2
Após isso a busca é iniciada por uma das ferramentas escolhidas pelo usuário (ou
até mesmo pelas duas, se for essa a escolha) usando como base aquelas palavras que o
usuário selecionou como obrigatórias. Então a nossa ferramenta de busca pega os
resultados retornados por essas outras ferramentas e utiliza as palavras opcionais como se
fossem um filtro para essas páginas que foram geradas como resultado, da seguinte
maneira: a nossa ferramenta busca a quantidade mínima de palavras opcionais que foi
anteriormente definida pelo usuário nas páginas que foram retornadas como resultado
pelas ferramentas de busca já utilizadas (AltaVista, Google ou ambas). Para que isso
fique claro, vamos a um exemplo: suponhamos que o usuário definiu quatro palavras
como opcionais e escolheu dois para o número mínimo de palavras opcionais que uma
página útil deve conter. Isto quer dizer que, para que a página seja retornada para o
usuário, ela tem que conter além das duas palavras obrigatórias outras duas palavras
opcionais, que podem ser duas palavras opcionais quaisquer, dentre as quatro escolhidas
pelo usuário. Só após isso ela retorna a página como resultado para o usuário, caso esta
seja validada. Ao final do processo, nossa ferramenta cria um arquivo chamado
index.html com todas as páginas encontradas. Esse arquivo pode ser facilmente aberto
pelo usuário no seu browser. Todas as páginas que foram geradas como resultado estão
guardadas na pasta HTML e o usuário pode consultar essas páginas sem figuras, só texto,
ou se quiser visualizar a página como um todo basta usar o endereço da mesma que está
no index.html e acessar a página. Este armazenamento das páginas ocorre durante o
processo de filtragem e portanto é possível verificar as páginas retornadas
individualmente, antes do final do processo.
O usuário também pode alterar as palavras obrigatórias e opcionais, assim como a
quantidade mínima de palavras opcionais que devem estar presentes no documento e qual
ferramenta de busca que deve servir como base, bastando para isso abrir o arquivo por ele
anteriormente gravado, usando a opção “Editar” no submenu de “Lista de Assunto” na
tela principal.
FIGURA P3
Para utilizar a criação automática de assunto, selecione “Criação Automática” no
submenu de “Lista de Assunto”. Entre com uma ou mais palavras que definam o assunto
que se quer criar e então pressione o botão “criar assunto”. Isso dá início ao processo, que
em geral demora alguns minutos e quando termina exibe o resultado na forma de uma
lista de palavras que provavelmente têm relação com aquelas escolhidas pelo usuário.
Palavras que por acaso tenham não estejam de acordo com o contexto desejado podem ser
retiradas usando-se o botão “remover palavra”. Palavras que não especificam nenhum
contexto em especial podem ser adicionadas ao dicionário de palavras comuns
pressionando-se o botão “incluir no dicionário de palavras comuns”. O dicionário de
palavras comuns já conta com uma série de palavras da língua inglesa (artigos, pronomes
etc.). Com a lista de palavras refinada, pressione o botão “salvar” para gravar o assunto
criado. Para utilizar o assunto criado automaticamente, selecione “Editar” no submenu de
“Lista de Assunto” na tela principal, e escolha o arquivo no qual foi gravado.
FIGURA P4
Utilizamos como base o AltaVista e o Google pois são ferramentas muito usadas
para busca na Internet, o AltaVista por usuários comuns e o Google pelo meio científico.
Também utilizamos essas ferramentas como base pois não tínhamos acesso aos seus
respectivos banco de dados. Além de não termos condições, não era nosso objetivo criar
um banco de dados, mas sim criar uma ferramenta de metabusca que tornasse a busca na
Internet mais eficiente.
Módulo de e-mails
Selecione “E-mails” no menu principal, sub-item “Iniciar”.
Em nosso programa de gerenciamento de e-mails, o usuário pode criar pastas (com
o botão “Nova pasta”) e relacionar a elas palavras que servirão para que o programa
direcione os e-mails para essas respectivas pastas. Pode também criar subpastas (com o
botão “Nova subpasta”) e associar a elas uma ou mais palavras relacionadas à pasta a qual
esta pertence. Obviamente o usuário também pode apagar a qualquer momento uma pasta
ou subpasta que não mais lhe interessar, através do botão “Remover pasta”.
Vamos ver agora como se dá o funcionamento do nosso programa: o usuário, já
conectado a Internet, clica no botão “Receber e-mails”. Então, a partir desse momento, o
programa começa a “baixar” os seus e-mails e conforme os vai “baixando” procura no
e-mail as palavras relacionadas com cada pasta. Quando encontra alguma dessas
palavras, direciona o e-mail para a pasta adequada. Se por um acaso não encontrar
nenhuma dessas palavras ele então direciona os e-mails para a pasta “Inbox”.
FIGURA P5
A grande vantagem do nosso programa de e-mail é que ele faz a busca em todos os
campos do e-mail, inclusive no corpo do mesmo. É possível, por exemplo, definir como
palavra relacionada o endereço eletrônico de alguém, que pode ser útil para agrupar todas
as mensagens enviadas por essa pessoa. O usuário pode também criar uma pasta lixo e
colocar como palavras relacionadas palavras que são comuns em diversos e-mails
indesejáveis que ele recebe e perde tempo lendo-os para ter certeza disso. Depois ele só
precisa apagar os e-mails presentes na pasta lixo e pronto: não precisará mais perder
tempo lendo ou até mesmo procurando esses e-mails.
Ou então melhor ainda, pode criar uma pasta urgente, por exemplo, e relacionar a
esta diversas palavras que sejam comuns aos e-mails que ele precisa ler com mais
urgência e não mais precisará perder o seu precioso tempo procurando quais e-mails
precisa responder com mais urgência, pois agora basta ir na pasta urgente e ler os e-mails
que lá estiverem relacionados.
5. Resultados obtidos
(INCLUIR)
6. Conclusão e trabalhos futuros
Embora esse projeto final possa parecer a princípio muito simples, internamente
sua implementação foi trabalhosa e demorada. A fim de fazer um programa portável
tivemos que aprender uma nova linguagem de programação, no caso, JAVA. Como o
JAVA é uma linguagem relativamente recente, a quantidade e qualidade de componentes
disponíveis é muito pequena, o que torna a programação mais trabalhosa, principalmente
no que se refere a interface com o usuário. Como o programa é portável, fomos obrigados
a optar por APIs que pudessem ser interpretadas por diferentes plataformas.
No futuro pretendemos aumentar o número de ferramentas de busca utilizadas,
adicionar mais funcionalidades ao módulo de e-mail e especializar mais ainda o criador
automático de assunto, refinando ainda mais o nosso projeto.
Acreditamos que seria um bom tema para um outro projeto final dar continuidade a
nossa ferramenta. Uma vez que a camada principal básica já foi implementada, aquele
que fosse continuar nosso trabalho poderia lançar mão do reuso das classes já
implementada por nós, podendo focalizar seus esforços em novos objetivos e idéias.
7. Referências bibliográficas
LINDEN, P. van der, 1997, Just Java, tradução Betina de Oliveira, revisão técnica Alvaro
Antunes, São Paulo, Makron Books.
INSTITUTO BRASILEIRO DE PESQUISA EM INFORMÁTICA, 1993, Dominando a
Linguagem C, Rio de Janeiro, IBPI Press.
MLADENIC, D., 1999, Text-learning and related intelligent agents , Ljubljana,
Slovenia, revised version in IEEE Expert special issue on Applications of Intelligent
Information Retrieval.
MILLER, A.R., 1988, “O Conjunto de Caracteres ASCII”. In: Assembly IBM PC:
Técnicas de Programação, São Paulo, EBRAS Ltda., pp. 259-261.
ALLSOP, J., 1987, Cassell's Students' English Grammar, Liverpool, Cassell Publishers
Limited.
GAMMA, E., 2000, Design Patterns, ....
ECKEL, B. , 2000, Thinking in Java (html version), ....
JAVA 2 SDK, Standard Edition Documentation, Version 1.3
JAVA.SUN website.
JAVA SUN Tutorial. A practical guide for programmers.
Science, Volume 280, Number 5360, pp. 98-100, 1998. Copyright © AAAS
Searching the World Wide Web
Steve Lawrence and C. Lee Giles
NEC Research Institute
Os papers
livro OrgDados2 (Boyer-Moore)
livro SO (threads)
livro IA (planning)
(NECESSITA COMPLEMENTAÇÃO E ORGANIZAÇÃO
8. Apêndice
Listagem do Código Fonte
(INCLUIR)
Download