UNIVERSIDADE FEDERAL DO PARANÁ
SETOR DE CIÊNCIAS EXATAS
DEPARTAMENTO DE INFORMÁTICA
BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO
PYGRAPH – Plataforma para execução remota de algoritmos sobre grafos
CURITIBA
2013
RENAN MAZZI LUCIZANO
RICARDO ALEXANDRE SOARES BARBOSA
PYGRAPH – Plataforma para execução remota de algoritmos sobre grafos
Trabalho de graduação apresentado como
requisito parcial à obtenção de grau de
Bacharel em Ciência da Computação.
Orientador: André Luiz Pires Guedes.
Departamento de Informática, UFPR.
CURITIBA
2013
SUMÁRIO
1 INTRODUÇÃO ...................................................................................................................7
1.1 OBJETIVO ............................................................................................................................. 7
2 FUNDAMENTOS TEÓRICOS ................................................................................................9
2.1 PYTHON ............................................................................................................................... 9
2.1.1 Conhecendo a linguagem ............................................................................................. 9
2.1.2 Potencial do Phyton nos Sistemas WEB ..................................................................... 10
2.2 XML.................................................................................................................................... 11
2.3 WebServices ...................................................................................................................... 12
2.4 O Protocolo XML-RPC ........................................................................................................ 14
2.5 Grafos ................................................................................................................................ 15
3 O PYGRAPH .................................................................................................................... 19
3.1 Organização do Sistema .................................................................................................... 20
3.2 Formato Padrão de Entrada e Saída ............................................................................... 22
3.3 Recursos do Sistema ......................................................................................................... 24
3.3.1 Obter Lista de Algoritmos do Servidor ....................................................................... 24
3.3.2 Obter Informações de um Algoritmo Específico ........................................................ 25
3.3.3 Executar um Algoritmo sobre um Grafo .................................................................... 25
3.3.4 Recuperar o Resultado de uma Execução .................................................................. 27
3.3.5 Obter informações de horário local do servidor ........................................................ 27
3.3.6 Outras funções Importantes ...................................................................................... 28
3.4 Cadastrar Novos Algoritmos no Sistema ........................................................................... 29
3.5 Algoritmos implementados no servidor............................................................................ 30
4 CLIENTES ........................................................................................................................ 32
5 CONCLUSÃO ................................................................................................................... 38
6 REFERÊNCIAS .................................................................................................................. 40
LISTA DE FIGURAS
Figura 1 – Arquitetura do sistema ................................................................................................. 8
Figura 2 – Exemplo de código XML ............................................................................................. 12
Figura 3 – Visão geral de um WebService ................................................................................... 13
Figura 4 – Exemplo de um grafo ................................................................................................. 15
Figura 5 – Exemplo de um grafo simples .................................................................................... 16
Figura 6 – Exemplo de um grafo completo ................................................................................. 16
Figura 7 - Exemplo de um grafo vazio ......................................................................................... 17
Figura 8 – Exemplo de um grafo trivial ....................................................................................... 17
Figura 9 - Exemplo de um grafo regular ...................................................................................... 18
Figura 10 – A arquitetura do PYGRAPH ....................................................................................... 19
Figura 11 – Organização do sistema............................................................................................ 20
Figura 12 - Exemplo de XML aceito pelo PYGRAPH .................................................................... 23
Figura 13 – Grafo gerado pelo XML da figura 3.3 ....................................................................... 23
Figura 14 – Cliente PYTHON para solicitar lista de algoritmos do servidor ................................ 32
Figura 15 – Saída padrão após execução do código da figura 4.1 .............................................. 32
Figura 16 - Cliente PYTHON para solicitar informações de um algoritmo do servidor ............... 33
Figura 17 - Saída padrão após execução do código da figura 4.3 ............................................... 33
Figura 18 - Cliente PYTHON para solicitar a execução de um algoritmo no servidor ................. 33
Figura 19 - Cliente PYTHON para solicitar o resultado de uma execução já realizada ............... 34
Figura 20 - Cliente PYTHON para solicitar a execução de múltiplos procedimentos .................. 35
Figura 21 – Exemplo de método no servidor com documentação DOCSTRING ......................... 35
Figura 22 - Cliente PYTHON para solicitar os comentários DOCSTRING dos métodos cadastrados
no servidor .................................................................................................................................. 35
Figura 23 - Saída padrão após execução do código da figura 4.8 ............................................... 36
Figura 24 – Exemplo de código XML a ser convertido pelo GRAPHVIZ ....................................... 36
Figura 25 – Código XML da figura 4.10 convertido para linguagem .DOT .................................. 37
Figura 26 – Grafo resultante da conversão do XML da figura 4.10 pelo GRAPHVIZ ................... 37
LISTA DE TABELAS
Tabela 1 – Especificação para obter lista de algoritmos do servidor .......................................... 24
Tabela 2 – Informações de retorno ao solicitar lista de algoritmos do servidor ........................ 24
Tabela 3 – Especificação para obter informações sobre um algoritmo ...................................... 25
Tabela 4 – Informações de retorno ao solicitar descrição de um algoritmo .............................. 25
Tabela 5 – Especificação para solicitar a execução de um algoritmo ......................................... 26
Tabela 6 – Informações de retorno ao solicitar a execução de um algoritmo............................ 26
Tabela 7 – Especificação para solicitar o resultado de uma execução ....................................... 27
Tabela 8 – Informações de retorno ao solicitar o resultado de uma execução .......................... 27
Tabela 9 – Especificação para solicitar informações do horário local do servidor ..................... 27
Tabela 10 – Informações de retorno ao solicitar o horário local do servidor ............................. 28
7
1 INTRODUÇÃO
Desde o artigo publicado por Leonhard Euler em 1736 acerca do problema das
pontes de Konigsberg, considerado o primeiro resultado da Teoria dos Grafos [14],
este importante ramo da Matemática, que estuda a relação entre os elementos de um
conjunto, tem sido explorado significativamente em todas as áreas do conhecimento.
Atualmente muitos problemas podem ser representados através do grafo, como
a busca pelo menor trajeto entre um conjunto de cidades ou mesmo o roteamento de
pacotes em uma rede de computadores. O fato da maioria desses problemas
possuírem uma motivação algorítmica e em sua maior parte com um alto grau de
complexidade na qual a modelagem através do grafo possa facilitar o seu estudo, faz
crescer cada vez mais o interesse da Ciência da Computação por esta área.
O elevado grau de complexidade que muitas vezes acompanham problemas
envolvendo grafos geralmente evidencia a escassez de recurso local e centralizado
para a busca de uma solução em um tempo viável, tornando a necessidade de
distribuição e paralelização de trabalho quase que uma obrigatoriedade para este
processo. Motivado pelo cenário acima citado, propomos ao longo deste documento a
utilização do conceito de WebService unido à Teoria dos Grafos para colaborar com o
processo de pesquisa e estudos nesta área.
1.1 OBJETIVO
O presente trabalho tem como objetivo descrever a arquitetura e estudar o
desenvolvimento da ferramenta PYGRAPH, capaz de executar remotamente os mais
variados tipos de algoritmos relacionados à Teoria dos Grafos.
O PYGRAPH será desenvolvido utilizando o conceito de WebService, podendo
ser integrado a qualquer sistema já existente de forma prática e rápida independente
da linguagem ou plataforma em que estes sistemas estão implementados.
A Figura 1 ilustra a arquitetura do sistema, auxiliando no entendimento do
PYGRAPH. Em resumo, o cliente faz uma requisição que trafega através da Internet
8
até encontrar o servidor, que em seguida processa a requisição e retorna a mensagem
com o resultado da execução solicitada pelo cliente.
Figura 1 – Arquitetura do sistema
9
2 FUNDAMENTOS TEÓRICOS
2.1 PYTHON
2.1.1 Conhecendo a linguagem
A linguagem de programação Python foi criada por Guido van Rossum no fim
da década de 1980 e meados da década de 1990. É uma linguagem de múltiplos
paradigmas - orientada a objetos e estruturada, interpretada, com tipagem dinâmica e
multiplataforma. Ainda, é considerada de alto nível por se distanciar dos códigos de
máquina e se aproximar da linguagem humana, com um elevado grau de abstração
[15].
Apesar de não ser especificado formalmente em sua totalidade, o Python
possui uma sintaxe bastante clara e concisa capaz de combinar sua biblioteca padrão
com vários frameworks desenvolvidos por terceiros. Pode ser descrita como uma
linguagem muito simples, intuitiva e poderosa, em que prevalece o esforço do
programador sobre o esforço computacional, ou seja, podemos dizer que prioriza a
legibilidade sobre a velocidade de execução.
Atualmente o Python está disponível nas mais diversas plataformas, como o
MacOS, UNIX, Windows e até celulares e tablets. Para sistemas operacionais que não
suportam a linguagem nativamente basta que estes possuam um compilador C
compatível que o Python será gerado a partir do código fonte utilizando um
interpretador (e.g. CPython), escrito em linguagem C. Desta forma, o código fonte será
traduzido pelo interpretador para o formato bytecode, que é multiplataforma e poderá
ser executado e distribuído sem o fonte original [15].
Algumas das vantagens do Python que contribuíram para o triunfo da
linguagem são:
•
Tem uma sintaxe simples e clara que compõe blocos de código
limpos e legíveis, demarcados pela identação Python;
•
Possui uma biblioteca padrão completa que ainda pode ser
combinada com vários frameworks desenvolvidos por terceiros;
10
•
Linguagem com tipagem dinâmica e ao mesmo tempo
fortemente tipada;
•
Disponibiliza o tratamento de exceções;
•
Possui licença livre aprovada pela OSI e compatível com GPL
que prevê que binários possam ser distribuídos sem a
necessidade de fornecer o código fonte junto.
2.1.2 Potencial do Phyton nos Sistemas WEB
A evolução da tecnologia, de um modo geral, no mundo atual aumentou
significativamente o número de computadores ligados à Internet, e consequentemente,
o número de usuários navegando na rede mundial. Tal evolução fez com que a
interação do usuário com as páginas WEB migrasse das solicitações por conteúdos
estáticos para as interações mais completas, onde o usuário fornece informações ao
servidor que, após processá-las, retorna o conteúdo desejado ao usuário. Isto fez com
que a Internet deixasse de ser apenas um grande repositório de informações e
propagandas para abrigar sistemas de informações mais complexos, de um modo
geral. Desde o momento em que os sistemas de informação puderam ser abrigados
na Internet, esta tecnologia passou a otimizar processos e agregar valor aos produtos
de diversas organizações, ao passo que permitiu a sua utilização para realizar
processamento de dados, permitir a conexão à distância, simplificou rotinas
administrativas, entre outras melhorias.
Como os sistemas de informação são escritos em esquemas de códigos fontes
e estes dependem da linguagem de programação a ser utilizada, a escolha de qual
tecnologia a ser utilizada para este desenvolvimento passou a ser um ponto muito
importante do processo. Diversos cenários tendem a influenciar esta decisão, como a
complexidade que a linguagem exige para integração com outros sistemas ou mesmo
a necessidade de mudanças de layout e design de forma rápida e ágil. Em
contrapartida, há quem prefira a segurança e robustez à agilidade acima citada, entre
outros.
Neste cenário, o Python ganha força a cada dia dentro das organizações que
procuram robustez e produtividade, gerando redução no custo da manutenção de
programas e encorajando os mais diversos nichos de desenvolvedores com a sua
11
ampla gama de bibliotecas e módulos prontos que facilitam tarefas como a conexão
com sistemas legados, desenvolvimento de WebServices, construção de protótipos
que facilmente são convertidos em aplicações, etc. Somado a isso, o fato desta
linguagem ser conhecida como clara em termos de legibilidade, ser bastante modular
e possuir código aberto faz com que diversas empresas como a Nokia, Philips ou
mesmo o Google, que a utiliza em muitos projetos internos, encorajem ainda mais o
seu uso.
Além do exposto acima, o desenvolvimento WEB com Python também é
apoiado por diversas plataformas, como o Mod_Python, o Zope, o TurboGears e o
Django [15] que no geral proporcionam um rápido desenvolvimento de aplicações com
alto índice de modularização e reutilização de código.
2.2 XML
O termo XML, do inglês Extensible Markup Language, é uma recomendação
feita pela W3C para gerar linguagens de marcação, assim como o HTML, permitindo a
criação de documentos organizados hierarquicamente com a principal finalidade de
compartilhar informações facilmente através da Internet. Entre as principais vantagens
desta linguagem podemos destacar o fato dela ser extensível e auto documentada, ou
seja, o usuário poderá criar os seus próprios termos de marcação (“tags”) sem violar
as características e definições da linguagem [2].
O XML surgiu na década de 1990, de uma iniciativa do consórcio W3C, com o
intuito de unir a flexibilidade do já consagrado SGML e a simplicidade do HTML,
reunindo alguns princípios como: possibilidade de criar marcadores sem limitações,
simplicidade e legibilidade tanto para humanos como para computadores, possibilitar a
criação de definições para validação da estrutura do documento (como o DTD ou o
XML SCHEMA) além de ser formal e conciso no modo de processar e armazenar as
informações [5].
Desde
o
seu
surgimento,
em
um
ambiente
que
proporciona
aos
desenvolvedores e empresas em geral a possibilidade de criação de diversos formatos
proprietários, a aceitação do XML cresce a cada dia. Atualmente, podemos destacar o
uso desta linguagem de marcação nas seguintes aplicações: transferências de dados
12
entre sistemas de informações, codificação e padronização de documentos e
integração entre sistemas WEB de diferentes plataformas [1].
A Figura 2 apresenta um exemplo simples da sintaxe do XML, onde é possível
reconhecer as principais características da linguagem tais como o conceito de
marcadores, hierarquia e padronização.
Figura 2 – Exemplo de código XML
A simplicidade da sintaxe e o grande poder de portabilidade foram
determinantes na escolha do XML como o padrão de transferência de dados no
sistema proposto por este documento. Veremos como será este uso mais adiante.
2.3 WebServices
A popularização da internet e demais tecnologias tem proporcionado e ao
mesmo tempo gerado uma necessidade cada vez maior de troca de informações entre
as pessoas, empresas e sistemas de informação em geral. Foi neste cenário que
surgiu uma solução chamada de WebService, tecnologia que permite a comunicação
entre sistemas de plataformas distintas fornecendo os mais diversos serviços na rede
global [9].
O surgimento dos serviços via WEB abriu uma grande gama de possibilidades
para os empreendedores e desenvolvedores ao passo que permite a troca de
13
informações entre sistemas de plataformas diferentes [11], escritos em linguagens
distintas que posteriormente serão traduzidas para um formato padrão além de
proporcionar uma comunicação automatizada e ao mesmo tempo segura, pois não
necessita da intervenção humana para ser realizada. No geral, eles não fornecem uma
interface gráfica e sim apenas uma interface de entrada e saída de dados.
Outra característica importante a ser observada com o advento desta
tecnologia é a possibilidade de dividir o sistema em módulos proporcionando uma
forma de computação distribuída, permitindo aos desenvolvedores facilidades de
manutenção e upgrade de tecnologia dentro dos diversos módulos do sistema desde
que cada um respeite o formato padrão de comunicação.
A arquitetura de um WebService é simples, composta por dois personagens: o
produtor de serviços – entidade responsável por desenvolver o serviço em um formato
padrão e registrá-lo na rede através de um URI (Uniform Resource Identifier), ou seja,
um identificador para o recurso recém publicado para que os usuários possam utilizálo; e o consumidor de serviços – responsável por utilizar as ferramentas
disponibilizadas pelo produtor [10]. A dinâmica de funcionamento pode ser observada
na Figura 3:
Figura 3 – Visão geral de um WebService
14
Algumas tecnologias se destacam na arquitetura do WebService, como o
protocolo de transporte de dados, o padrão de formatação de dados e o protocolo de
encapsulamento de dados [9]:
•
Os protocolos de transporte de dados mais utilizados atualmente são o HTTP
para conexões normais e o HTTPS para conexões seguras;
•
O padrão de formatação de dados mais utilizado atualmente é o XML, que
também pode ser substituído por JSON, YAML e Properties, entre outros;
•
O protocolo de encapsulamento mais utilizado atualmente é o SOAP, que
também pode ser substituído por CORBA, XML-RPC, REST, entre outros.
2.4 O Protocolo XML-RPC
O RPC (Remote Procedure Calls) é um protocolo ou tecnologia que permite a
comunicação entre processos possibilitando um programa de computador chamar uma
rotina que será executada em outro espaço de endereçamento, geralmente em um
acesso remoto. Desta forma, o XML-RPC, criado por Dave Winer em 1998, nada mais
é do que o próprio protocolo RPC codificado em XML e utilizando o protocolo HTTP
para transporte de mensagens. Ele é mais enxuto que outras implementações como o
RMI, CORBA ou o SOAP [8], além de ser mais adequado e flexível no tipo de
operações e chamadas de métodos adotadas pelo PYGRAPH.
O funcionamento do XML-RPC é muito simples, nele o cliente envia uma
requisição HTTP codificada em XML ao servidor solicitando a execução de algum
procedimento que após a execução retorna o conteúdo também codificado em XML ao
cliente. Esta sistemática de funcionamento permite que o cliente consuma os recursos
fornecidos pelo servidor sem se preocupar com a tecnologia utilizada na
implementação destes. Por exemplo, podemos ter uma versão do servidor em Java e
do cliente em PHP realizando uma comunicação entre si.
Em cada chamada de execução que o cliente realiza no servidor vários
parâmetros de entrada podem ser enviados, mas apenas um será retornado. No
entanto, os tipos de parâmetros disponíveis permitem que vários valores sejam
aninhados em uma estrutura, fazendo com que a restrição no número de parâmetros
de retorno possa ser superada facilmente.
15
2.5 Grafos
Os grafos podem ser definidos como uma representação entre as relações dos
elementos de dados de um certo conjunto. A definição formal de um grafo G=(V,A) [12]
pode ser observada abaixo:
V - conjunto não vazio de vértices do grafo;
A - conjunto de pares não ordenados a=(x,y), sendo x e y pertencentes a V,
que representam as arestas do grafo.
Representação Gráfica
Tipicamente o grafo é representado como um conjunto de pontos (vértices)
interligados por um conjunto de retas (arestas) [14], como mostra a Figura 4:
Figura 4 – Exemplo de um grafo
16
Alguns tipos especiais de grafos
•
Grafo simples: é um grafo com no máximo uma aresta entre cada par de
vértices distintos e sem a presença de laços, ou seja, arestas que ligam um
vértice a ele mesmo [14]. Este tipo de grafo pode ser não-direcionado, como
mostrado na Figura 5, ou direcionado, em que cada aresta possui um indicador
que representa o seu sentido.
Figura 5 – Exemplo de um grafo simples
•
Grafo completo: é o grafo simples em que, para cada vértice do grafo, existe
uma aresta conectando este vértice a cada um dos demais [14]. A Figura 6
apresenta um exemplo de um grafo completo:
Figura 6 – Exemplo de um grafo completo
17
•
Grafo vazio: é o grafo cujo conjunto de arestas é vazio [14]. A Figura 7
apresenta um exemplo de um grafo vazio:
Figura 7 - Exemplo de um grafo vazio
•
Grafo trivial: é o grafo que possui apenas um vértice e nenhuma aresta [14]. A
Figura 8 apresenta um exemplo de um grafo trivial:
Figura 8 – Exemplo de um grafo trivial
18
•
Grafo regular: é um grafo em que todos os vértices têm o mesmo grau, ou seja,
o número de arestas incidentes para com o vértice, com os laços contados
duas vezes [14]. A Figura 9 apresenta um grafo regular:
Figura 9 - Exemplo de um grafo regular
19
3 O PYGRAPH
Após esta breve introdução de conceitos, estamos aptos a nos aprofundar
ainda mais na arquitetura do sistema proposto por este trabalho, o PYGRAPH.
Em resumo, o sistema trata-se de um WebService desenvolvido em linguagem
PYTHON, comunicação realizada através do protocolo XML-RPC e utilização do
formato XML para padronizar a entrada e saída de dados. O objetivo deste sistema é
viabilizar a execução de algoritmos sobre GRAFOS de forma remota através da WEB
sem que os sistemas clientes precisem preocupar-se com a plataforma ou linguagem
em que o servidor está escrito, preocupando-se apenas em enviar e receber conteúdo
no formato indicado e protocolo estabelecido pelo servidor.
A Figura 10 apresenta uma ilustração das interações geradas com o sistema
PYGRAPH:
Figura 10 – A arquitetura do PYGRAPH
20
3.1 Organização do Sistema
A estrutura de pastas do sistema após a implementação no servidor é
mostrada na Figura 11:
Figura 11 – Organização do sistema
Descrição do conteúdo:
•
SERVER – Diretório responsável por armazenar todos os arquivos necessários
para execução do Webservice.
o server.py – É o arquivo onde o código-fonte do WebService está
localizado, é ele quem inicia o serviço na rede.
o readme.txt – Este arquivo explica como executar o Webservice,
tornando-o apto a receber requisições dos clientes.
o RESULTS – Diretório que irá armazenar os resultados das execuções
realizadas no servidor, todos em formato XML. Este diretório foi
utilizado para fornecer a de persistência de dados ao usuário, que
21
poderá visualizar o resultado de uma execução já realizada a qualquer
momento.
o ALGORITHM – Diretório que irá armazenar todos os algoritmos
cadastrados no servidor.
Algorithmlist.txt – É o arquivo responsável por armazenar o
nome dos algoritmos e os seus respectivos códigos. Este
arquivo funciona apenas como uma lista simples, ele não irá
armazenar qualquer descrição ou código fonte do algoritmo
PASTAS
NOMEADAS
COM
O
IDENTIFICADOR
DO
ALGORITMO (1, 2, 3, etc..) – Diretórios responsáveis por
armazenar todos os dados relativo ao algoritmo em questão,
incluindo
arquivos
executáveis
e
arquivos
de
inclusão
necessários para a execução.
• run.py – É obrigatório e deve ser criado no momento da
adição do algoritmo ao servidor. Este é o arquivo
invocado pelo servidor para execução do algoritmo
selecionado, ele recebe como entrada os parâmetros
especificados e obrigatoriamente exibe o resultado da
execução na saída padrão, que posteriormente será
capturado pelo processo que o invocou. Apesar de ser
desenvolvido em PYTHON, através deste arquivo o
desenvolvedor poderá solicitar a execução de algoritmos
escritos em inúmeras linguagens através da biblioteca
SUBPROCESS, capaz de executar comandos externos
(SHELL).
• info.txt – Este arquivo é obrigatório e deve ser criado no
momento da adição do algoritmo ao servidor. É ele que
irá armazenar a especificação de execução do algoritmo
e uma breve descrição a respeito do mesmo.
• FONTS – Diretório auxiliar que irá armazenar os códigos
fontes do algoritmo a que esta pasta está associada.
22
3.2 Formato
Padrão de Entrada e Saída
O codificador escolhido para padronizar a entrada e saída de dados no
PYGRAPH foi o formato XML, por ser um dos padrões mais difundidos no mundo para
este tipo de uso e possuir vantagens como ser extensível e auto-documentado [6].
O arquivo deve estar formatado de acordo com a seguinte especificação:
Codificação - UTF-8
TAG <data> - todo o conteúdo deve estar dentro deste marcador, que inclusive
poderá abrigar vários grafos de uma só vez.
TAG <graph> - cada marcador como este irá delimitar o conteúdo de um grafo dentro
do arquivo XML.
TAG <node> - cada marcador como este irá delimitar o conteúdo referente a certo
vértice do grafo além de conter as propriedades (atributos) desse vértice, como: cor,
forma, tamanho, entre outros. Os atributos de cada nó podem ser adicionados ou
editados de acordo com as necessidades e especificações do algoritmo que será
executado no servidor.
TAG <edge> - sempre associado ao marcador <node>, ele irá conter as propriedades
(atributos) de uma aresta ligada ao vértice a que este marcador está associado. Note
que apesar de cada aresta estar escrita duas vezes no exemplo da Figura 12 para
facilitar o entendimento da relação entre os vértices, não é necessário escrevê-la em
duplicidade na entrada que será fornecida ao sistema.
TAG <value> - pode estar associado ao marcador <node> ou ao marcador <edge>,
desempenhando as seguintes funções:
•
Quando associado ao marcador <node> - irá armazenar o valor do nó.
•
Quando associado ao marcador <edge> - irá armazenar o valor do nó
adjacente ao nó que o marcador pai está associado.
23
Um exemplo de arquivo XML compatível com a especificação acima pode ser
visto na Figura 12.
Figura 12 - Exemplo de XML aceito pelo PYGRAPH
O XML acima irá gerar o grafo apresentado na Figura 13:
Figura 13 – Grafo gerado pelo XML da figura 3.3
24
Como podemos observar no exemplo da figura 12, o formato XML facilita
bastante a representação de um grafo tornando-se um arquivo de fácil manipulação
pelo computador e de certa forma legível para os seres humanos.
3.3 Recursos do Sistema
A primeira versão do PYGRAPH disponibiliza dentro do seu núcleo (server.py)
as funções descritas a seguir.
3.3.1 Obter Lista de Algoritmos do Servidor
Este recurso tem como objetivo informar ao usuário a lista de nomes e códigos
de todos os algoritmos que estão implementados no servidor. É com este código que o
usuário irá identificar o algoritmo que deseja executar sobre um ou mais grafos
fornecidos como parâmetro.
Método de consumo deste recurso:
Nome do Método
Parâmetros
algorithmList()
Nenhum
Tabela 1 – Especificação para obter lista de algoritmos do servidor
Resposta fornecida pelo servidor:
Retorno
algorithmList
String com o código e o
nome de cada algoritmo
cadastrado no servidor,
separados linha a linha.
Tabela 2 – Informações de retorno ao solicitar lista de algoritmos do servidor
25
3.3.2 Obter Informações de um Algoritmo Específico
Este recurso tem como objetivo informar ao usuário as características de um
algoritmo cadastrado no servidor. Através deste método o usuário irá receber uma
breve descrição além de todas as informações necessárias para solicitar a execução
do mesmo fornecendo os parâmetros corretos.
Método de consumo deste recurso:
Nome do Método
Parâmetros
algorithmInfo()
algorithmId
Número inteiro corresponde ao
identificador do algoritmo.
Tabela 3 – Especificação para obter informações sobre um algoritmo
Resposta fornecida pelo servidor:
Retorno
algorithmDescription
String
com
toda
a
especificação de execução do
algoritmo além de uma breve
descrição a seu respeito.
Tabela 4 – Informações de retorno ao solicitar descrição de um algoritmo
3.3.3 Executar um Algoritmo sobre um Grafo
Este recurso tem como objetivo executar um algoritmo em uma entrada
fornecida pelo cliente.
Este é o método mais importante do sistema e consequentemente quem mais
recebeu atenção durante o processo de desenvolvimento do sistema. Uma das
dificuldades encontradas aqui foi que toda a estrutura de armazenamento e execução
dos algoritmos localizados no servidor precisou ser desenvolvida a parte, ao contrário
de soluções implementadas em outras linguagens como o PHP e framework .NET em
que o servidor de hospedagem fica responsável por criar (ou reconhecer) a estrutura
de pasta dos arquivos dentro do servidor. Outro fator que podemos destacar foi o fato
de termos adotado a facilidade de adição de novos algoritmos como o mais importante
princípio durante o desenvolvimento deste método, algo que em parte foi facilitado
26
pelo método SUBPROCESS do PYTHON e sua função de chamadas de comandos
externos à linguagem, permitindo que novos algoritmos sejam desenvolvidos em
qualquer linguagem compatível com a plataforma em que o sistema está hospedado.
Método de consumo deste recurso:
Nome do Método
Parâmetros
algorithmExecute ()
algorithmId
Número inteiro corresponde ao
identificador do algoritmo a ser
executado.
paramsList
Lista
com
os
parâmetros
necessários para execução do
algoritmo
pelo
servidor
(incluindo o grafo em XML). As
informações a respeito dos
parâmetros necessários podem
ser obtidas através do método
algorithmInfo.
Tabela 5 – Especificação para solicitar a execução de um algoritmo
Resposta fornecida pelo servidor:
Retorno
executionId
Número
inteiro
com
o
identificador da execução que
acabou de ser realizada no
servidor.
executionResult
String com o XML resultante da
execução do algoritmo.
Tabela 6 – Informações de retorno ao solicitar a execução de um algoritmo
27
3.3.4 Recuperar o Resultado de uma Execução
Este recurso tem como objetivo retornar ao cliente o resultado (XML) de uma
execução realizada previamente no servidor. Isto irá criar uma persistência de dados
que pode ser muito interessante em casos como queda da rede durante uma
execução ou caso o usuário deseje acessar o resultado em locais diferentes sem ter
que esperar a execução novamente.
Método de consumo deste recurso:
Nome do Método
Parâmetros
resultReturn()
executionId
Número
inteiro
com
o
identificador de uma execução
realizada previamente.
Tabela 7 – Especificação para solicitar o resultado de uma execução
Resposta fornecida pelo servidor:
Retorno da Função
executionResult
String
contendo
o
XML
correspondente ao resultado
da execução.
Tabela 8 – Informações de retorno ao solicitar o resultado de uma execução
3.3.5 Obter informações de horário local do servidor
Este recurso pode ser utilizado pelos clientes como função auxiliar dentro do
processo de execução de outros algoritmos. Este recurso pode ser utilizado para a
medição de desempenho entre diferentes execuções ou algoritmos, por exemplo.
Método de consumo deste recurso:
Nome do Método
Parâmetros
currentTime ()
Nenhum
Tabela 9 – Especificação para solicitar informações do horário local do servidor
28
Resposta fornecida pelo servidor:
Retorno
timeNow
String contendo a data e hora
local do servidor no formato
DD-MM-YYYY HH:MM:SS
Tabela 10 – Informações de retorno ao solicitar o horário local do servidor
3.3.6 Outras funções Importantes
Algumas outras funções importantes são fornecidas pela própria linguagem em
que o sistema foi desenvolvido em conjunto com o protocolo utilizado para a
comunicação entra o cliente e o servidor. Abaixo listamos algumas destas funções.
Chamada de múltiplos procedimentos
O usuário poderá solicitar a execução de vários algoritmos (ou qualquer outro
método do servidor) de uma só vez recebendo os resultados em apenas uma resposta
do servidor. Isso pode gerar uma série de vantagens como a diminuição da
concorrência e congestionamento do servidor além da diminuição do trafego da rede.
Visualizar DOCSTRING dos métodos
O PYTHON fornece uma espécie de documentação automática dos métodos e
classes. Para utilizar essa função basta que o desenvolvedor do Webservice coloque
os comentários entre uma sequência de três aspas duplas. Para visualizar os
comentários de um método, o usuário responsável pelo sistema cliente deverá utilizar
o comando system.methodeHelp() passando como parâmetro o nome do método.
Visualizar nome de todos os métodos do servidor
O PYTHON também disponibiliza uma função para o cliente obter o nome de
todos os métodos cadastrados no servidor, a system.listMethods(). O retorno da
função será uma lista com o nome de cada método do servidor.
29
3.4 Cadastrar Novos Algoritmos no Sistema
Como dito anteriormente, a facilidade de adição de novos algoritmos ao
servidor
foi
considerado
um
dos
princípios
mais
importantes
durante
o
desenvolvimento do sistema. Vamos agora conhecer como realizar esse processo de
forma simples e rápida.
Para cadastrar um novo algoritmo, o usuário deve ter em mente que o
desenvolvimento pode ser feito em qualquer linguagem de programação desde que o
programa seja executado através da linha de comando SHELL. Desta forma, ele irá
salvar todo o conteúdo necessário dentro do servidor e este conteúdo será invocado
através da linguagem PYTHON.
Descrição do processo por etapas:
•
Abrir o arquivo algorithmList.txt dentro do diretório ALGORITHM;
•
Editar o arquivo criando uma linha ao final do arquivo com o código e nome do
algoritmo, separados por hífen (Ex: 1 – Busca em Largura).
•
Criar uma pasta com o identificador do algoritmo dentro do diretório
ALGORITHM;
•
Dentro da pasta recém criada, criar o arquivo info.txt, responsável por conter as
especificações necessárias para a execução do algoritmo além de uma breve
descrição a respeito do mesmo.
•
Ainda dentro deste mesmo diretório, criar o arquivo run.py que será
responsável por realizar a execução do algoritmo. Este arquivo será invocado
pelo processo servidor recebendo como entrada os parâmetros especificados
no arquivo info.txt e deverá exibir o resultado da execução (XML) na saída
padrão do sistema. Fica totalmente a critério do usuário a escolha da
linguagem de programação em que o sistema será desenvolvido, já que o
arquivo PYTHON poderá executar comandos externos como mostrado no
trecho de código da imagem abaixo:
•
Ainda dentro deste mesmo diretório, criar a pasta FONTS em que deverão ser
armazenados os códigos fontes do algoritmo recém cadastrado no servidor.
30
Após a realização dos passos descritos acima, todos os sistemas clientes serão
capazes de solicitar a execução do novo algoritmo.
3.5 Algoritmos implementados no servidor
Para exemplificar a facilidade de uso do sistema PYGRAPH, foram
disponibilizados dois algoritmos no servidor:
•
Algoritmo de Busca em Largura – É um algoritmo exaustivo de busca em
grafos que após a execução todos os vértices e arestas do grafo terão sido
visitados. O processo de busca tem início no vértice raiz e se expande a todos
os vértices vizinhos, ou seja, vértices com distância 1 do nó raiz.
Posteriormente, o processo de busca irá explorar todos os vizinhos dos
vértices visitados no passo anterior, ou seja, todos os vértices com distância
dois do nó raiz. O processo continua até que o alvo da busca seja encontrado
[19]. Para garantir que um nó não seja visitado mais de uma vez, o algoritmo
utiliza uma estrutura de dados do tipo fila.
Identificação do algoritmo no servidor: 1
Lista de parâmetros de entrada: Vértice de origem, vértice de destino, grafo no
padrão XML estabelecido.
Saída: Identificador da execução e grafo resultante no padrão XML.
•
Algoritmo de Dijkstra – concebido pelo holandês Edsger Dijkstra em 1956, é um
dos mais famosos algoritmos para cálculo da distância mínima entre vértices
de um grafo com arestas de custo não negativo. Semelhante ao algoritmo de
busca em largura, porém com estratégia gulosa, o algoritmo de Dijkstra
considera uma estimativa inicial C de menores caminhos a partir de um vértice
inicial V. A cada passo da execução busca-se nos vizinhos dos vértices
pertencentes a C o que possui menor distância em relação a V, adicionando-o
a C. O processo é repetido até que todos os vértices alcançáveis por V façam
parte do conjunto C [20].
Identificação do algoritmo no servidor: 2
31
Lista de parâmetros de entrada: Vértice de origem, vértice de destino, grafo no
padrão XML estabelecido.
Saída: Identificador da execução e grafo resultante no padrão XML.
32
4 CLIENTES
O sistema cliente é o motivo da existência dos diversos WebServices
publicados na internet já que eles são os responsáveis por consumir os recursos
disponibilizados por cada serviço deste.
Neste tópico iremos apresentar alguns exemplos de sistemas clientes,
desenvolvidos em PYTHON, consumindo alguns dos principais recursos fornecidos
pelo servidor.
Cliente 1:
Função – Obter a lista de algoritmos cadastrados no servidor.
Código fonte:
Figura 14 – Cliente PYTHON para solicitar lista de algoritmos do servidor
Exemplo de saída padrão:
Figura 15 – Saída padrão após execução do código da figura 4.1
33
Cliente 2:
Função – Obter a descrição de algum algoritmo específico cadastrado no
servidor.
Código fonte:
Figura 16 - Cliente PYTHON para solicitar informações de um algoritmo do servidor
Exemplo de saída padrão:
Figura 17 - Saída padrão após execução do código da figura 4.3
Cliente 3:
Função – Solicitar a execução de algum algoritmo cadastrado no servidor.
Código fonte:
Figura 18 - Cliente PYTHON para solicitar a execução de um algoritmo no servidor
34
Exemplo de saída padrão:
A saída do cliente será o arquivo de nome <id da execução> e extensão XML.
Cliente 4:
Função – Resgatar o resultado de alguma execução realizada previamente no
servidor.
Código fonte:
Figura 19 - Cliente PYTHON para solicitar o resultado de uma execução já realizada
Exemplo de saída padrão:
Como no exemplo acima, a saída do cliente será o arquivo de nome <id da execução>
e extensão XML.
Cliente 5:
Função – Realizar vários procedimentos fazendo uma única chamada ao
servidor e recebendo uma única resposta.
35
Código fonte:
Figura 20 - Cliente PYTHON para solicitar a execução de múltiplos procedimentos
Exemplo de saída padrão:
A saída deste cliente será uma lista na variável result com todas as informações
retornadas pelos três procedimentos executados pelo comando multirequest.
Cliente 6:
Função – Obter os comentários de desenvolvimento de um determinado
método.
Código fonte:
Figura 21 – Exemplo de método no servidor com documentação DOCSTRING
Figura 22 - Cliente PYTHON para solicitar os comentários DOCSTRING dos métodos
cadastrados no servidor
36
Exemplo de saída padrão:
Figura 23 - Saída padrão após execução do código da figura 4.8
Ferramenta Auxiliar - GRAPHVIZ:
Função – Como o retorno de todas as execuções de algoritmo realizadas no
servidor possui o formato XML, desenvolvemos nos sistemas clientes uma ferramenta
auxiliar capaz de converter o arquivo de retorno em uma imagem JPEG, facilitando a
conferência do resultado por parte do usuário. Para realizar esta conversão foi
utilizada a ferramenta GRAPHVIZ, que recebe como entrada o arquivo XML convertido
em linguagem .DOT e o transforma na imagem do grafo resultante. Abaixo um
exemplo da utilização desta ferramenta.
A Figura 24 apresenta o XML de entrada:
Figura 24 – Exemplo de código XML a ser convertido pelo GRAPHVIZ
37
A Figura 25 apresenta o arquivo .DOT resultante do XML:
Figura 25 – Código XML da figura 4.10 convertido para linguagem .DOT
A Figura 26 apresenta o resultado final da conversão:
Figura 26 – Grafo resultante da conversão do XML da figura 4.10 pelo GRAPHVIZ
38
5 CONCLUSÃO
Através do desenvolvimento do sistema proposto por este documento, o
PYGRAPH, conseguimos consolidar muitos dos conhecimentos adquiridos ao longo
do curso além de nos deparamos com novos conceitos acerca do desenvolvimento de
ferramentas para WEB.
O Python provou ser uma linguagem muito robusta, de fácil aprendizado e com
um enorme grupo de seguidores ao redor do mundo, capazes de desenvolver e
compartilhar as mais diversas ferramentas proporcionando um desenvolvimento de
aplicações cada vez mais prático e rápido.
Nas pesquisas realizadas para construirmos a arquitetura do sistema, nos
deparamos com a ausência quase completa de ferramentas como esta na Internet,
fato este que nos motivou ainda mais durante o desenvolvimento, pois acreditamos
que a disponibilização de uma ferramenta acesso remoto para execução dos mais
complexos algoritmos da Teoria dos Grafos pode ser de grande valia para os usuários
ao redor de mundo.
Reunimos também algumas sugestões para trabalhos futuros visando ampliar a
estrutura e as funcionalidades do PYGRAPH, como:
•
Validação do XML – Implementar a validação do arquivo de entrada fornecido
pelo usuário implica em economizar a utilização de recursos de forma
desnecessária no servidor, como uma busca por uma solução inexistente em
um XML que está mal formado. A validação também poderia ser empregada na
saída fornecida pelo algoritmo, prevenindo o envio de uma solução incompleta
ao usuário que solicitou a requisição.
•
Remoção do arquivo RUN.py – Adotado como ponto inicial de cada execução
no servidor, a presença obrigatória do arquivo run.py pode ser eliminada
facilmente através da utilização dos comandos SHELL para execução dos
algoritmos. Para isso, basta que no momento de cadastro do algoritmo seja
armazenada a linha de comando necessária para a execução.
•
Servidor Distribuído – Na arquitetura do PYGRAPH é perfeitamente possível
integrar um módulo cliente dentro do Webservice, desta forma podemos criar
um servidor com a função apenas de gerenciar as requisições dos clientes e
39
solicitar a execução dos algoritmos em outros servidores remotos, podendo
fazer também um balanço de carga e diminuindo a carga empregada no
Webservice pela execução de algoritmos locais.
40
6 REFERÊNCIAS
[1] Objectivos e Possíveis Usos do XML. Disponível
em:<http://omundodaprogramacao.com/objectivos-e-possiveis-usos-do-xml/>. Acesso
em: 21 dez. 2012.
[2] Pereira, Ana Paula. O que é XML? Disponível
em:<http://www.tecmundo.com.br/programacao/1762-o-que-e-xml-.htm>. Acesso em:
21 dez. 2012.
[3] Definição conceitual do XML. Disponível
em:<http://www.gta.ufrj.br/grad/00_1/miguel/link5.htm>. Acesso em: 21 dez. 2012.
[4] Significado de XML. Disponível em:<http://www.significados.com.br/xml/>. Acesso
em: 23 dez. 2012.
[5] WIKIPEDIA. XML. Disponível em:<http://pt.wikipedia.org/wiki/XML>. Acesso em: 23
dez. 2012.
[6] Macoratti, José Carlos. XML – Introdução e conceitos básicos. Disponível
em:<http://www.macoratti.net/xml.htm>. Acesso em: 10 jan. 2013.
[7] Python XML-RPC. Disponível em:
<http://wmagician.wordpress.com/2010/07/23/python-xml-rpc/.>. Acesso em: 10 jan.
2013.
[8] Spanhol, Fábio Alexandre. XML-RPC: Tópicos Introdutórios. Disponível
em:<http://www.slideshare.net/_photon_/xmlrpc-13067431>. Acesso em: 16 jan. 2013.
[9] WIKIPEDIA. Web service. Disponível
em:<http://pt.wikipedia.org/wiki/Web_service>. Acesso em: 16 jan. 2013.
[10] Reckziegel, Maurício. Entendendo os WebServices. Disponível
em:<http://imasters.com.br/artigo/4245/web-services/entendendo-os-webservices/>.
Acesso em: 20 jan. 2013.
41
[11] O que é Web Service? Disponível
em:<http://www.oficinadanet.com.br/artigo/447/o_que_e_web_service>. Acesso em:
20 jan. 2013.
[12] WIKIPEDIA. Grafo. Disponível em:<http://pt.wikipedia.org/wiki/Grafo>. Acesso em:
22 jan. 2013.
[13] Conceito Básicos da Teoria de Grafos. Disponível
em:<http://www.inf.ufsc.br/grafos/definicoes/definicao.html>. Acesso em: 25 jan. 2013.
[14] WIKIPEDIA. Teoria dos grafos. Disponível
em:<http://pt.wikipedia.org/wiki/Teoria_dos_grafos>. Acesso em: 25 jan. 2013.
[15] WIKIPEDIA. Python. Disponível em:<http://pt.wikipedia.org/wiki/Python>. Acesso
em: 25 jan. 2013.
[16] WIKIPEDIA. XML-RPC. Disponível em:<http://pt.wikipedia.org/wiki/XML-RPC>.
Acesso em: 10 fev. 2013.
[17] Winer, Dave. XML-RPC Specification. Disponível
em:<http://xmlrpc.scripting.com/spec.html>. Acesso em: 10 fev. 2013.
[18] Garcia, Luís Fernando Fortes. RPC - Remote Procedure Call. Disponível
em:<http://penta.ufrgs.br/rc952/trab1/rpc.html>. Acesso em: 12 fev. 2013.
[19] WIKIPEDIA. Busca em Largura. Disponível
em:<http://pt.wikipedia.org/wiki/Busca_em_largura>. Acesso em: 28 fev. 2013.
[20] WIKIPEDIA. Algoritmo de Dijkstra. Disponível
em:<http://pt.wikipedia.org/wiki/Algoritmo_de_Dijkstra>. Acesso em: 28 fev. 2013.
Download

universidade federal do paraná setor de ciências exatas