Minicurso Web Services com PHP



Documentos relacionados
UNIVERSIDADE. Sistemas Distribuídos

SOAP. Web Services & SOAP. Tecnologias de Middleware 2004/2005. Simple Object Access Protocol. Simple Object Access Protocol SOAP

Web services. Um web service é qualquer software que está disponível através da Internet através de uma interface XML.

Programação para Internet Avançada. 4. Web Services. Nuno Miguel Gil Fonseca

Introdução Serviços Web WSDL SOAP UDDI Ferramentas. Serviços Web. (Web Services) Emerson Ribeiro de Mello

Universidade Federal de Juiz de Fora Ciência da Computação Sistemas Distribuídos Professor Ciro Barbosa

Web Services. Integração de aplicações na Web. Sistemas Distribuídos

Kassius Vargas Prestes

UFG - Instituto de Informática

Serviços Web: Arquitetura

INTEGRAÇÃO DE APLICAÇÕES UTILIZANDO WEB SERVICE 1. Kellen Kristine Perazzoli 2 ; Manassés Ribeiro 3

Introdução ao PHP. Prof. Késsia Marchi

Web Services. (Introdução)

Sistemas Distribuídos

Serviços Web: Introdução

Introdução a Web Services

Web Services. Autor: Rômulo Rosa Furtado

3 Serviços na Web (Web services)

18/04/2006 Micropagamento F2b Web Services Web rev 00

Um Processo para Desenvolvimento de Aplicações Web Baseado em Serviços. Autores: Fábio Zaupa, Itana Gimenes, Don Cowan, Paulo Alencar e Carlos Lucena

Manual de Integração. Tecnologia: WebServices SOAP XML. Área: CDC. Produto: CDC Pessoa Física NFE (RFB) Versão: 1.0. Autor: Angelo Bestetti Junior

Introdução ao Modelos de Duas Camadas Cliente Servidor

PROGRAMAÇÃO SERVIDOR WEBSERVICES EM SISTEMAS WEB. Prof. Dr. Daniel Caetano

A Figura... mostra a arquitetura técnica de serviços na Web

Web Services: Metodologias de Desenvolvimento Carlos J. Feijó Lopes José Carlos Ramalho Fevereiro de 2004

Cálculo Remoto de Preços e Prazos de Encomendas

Integração de sistemas utilizando Web Services do tipo REST

Criação de um Web Services em.net

Service Oriented Architecture SOA

Criação de um Web Services em.net

SOA Introdução. SOA Visão Departamental das Organizações

Manual de Integração. Tecnologia: WebServices SOAP XML. Área: CDC. Produto: CDC Estendida (Física) Versão: 1.0. Autor: Angelo Bestetti Junior

REST Um Estilo de Arquitetura de Sistemas Distribuídos

DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0

AULA 4 VISÃO BÁSICA DE CLASSES EM PHP

SOA. Service Oriented Architecture. Maxmiliano Franco Braga

COMPARANDO APLICAÇÃO WEB SERVICE REST E SOAP

Cálculo Remoto de Preços e Prazos de Encomendas

Comunicando através da rede

Arquitetura de Redes: Camadas de Protocolos (Parte I) Prof. Eduardo

Adriano Reine Bueno Rafael Barros Silva

Desenvolvendo uma Arquitetura de Componentes Orientada a Serviço SCA

Lista de Revisão. 3. Analise a afirmativa a seguir como verdadeira ou falsa e justifique.

CONCEITOS INICIAIS. Agenda A diferença entre páginas Web, Home Page e apresentação Web;

UNIVERSIDADE. Sistemas Distribuídos

Internet e protocolos web. A Internet é uma rede descentralizada de recursos computacionais. Topologia tem de fornecer caminhos alternativos

Redes de Computadores

REST. Caio Nakashima

INT-9: Implementing ESB Processes with OpenEdge and Sonic David Cleary

Web Services: Metodologias de Desenvolvimento

Sistemas Distribuídos Arquiteturas Middlewares

Programação Cliente em Sistemas Web


Desenvolvimento de Aplicações Web. Prof. José Eduardo A. de O. Teixeira / j.edu@vqv.com.br

Documento de Análise e Projeto VideoSystem

Guia rápido de uso de Web Services do NFS-e Easy


INTEGRAÇÃO DE TÉCNICAS DE SISTEMAS DISTRIBUÍDOS APLICADA AO DESENVOLVIMENTO DE UM AMBIENTE PARA O JOGO DE XADREZ

Nota Fiscal Paulista. Manual para Envio de Arquivo de Cupons Fiscais via Webservice GOVERNO DO ESTADO DE SÃO PAULO

Wireshark. Captura de Protocolos da camada de aplicação. Maicon de Vargas Pereira

2 Conceitos relativos a Web services e sua composição

Engenharia de Requisitos Estudo de Caso

Capítulo 7 CAMADA DE TRANSPORTE

Sistemas Distribuídos. Professora: Ana Paula Couto DCC 064

Programação para Internet I

Conceitos de extensões Joomla!

Consultas SQL por XML-RPC no WordPress José Antonio Meira da Rocha

Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões. Prof. MSc. Hugo Souza

Conceitos de Ajax Exemplos de uso do Ajax no braço, muitos exemplos, muito código (HTML, CSS, JavaScript, PHP, XML, JSON)

Prática da Disciplina de Sistemas Distribuídos Serviços Web IFMA DAI Professor Mauro Lopes C. Silva

BC CORREIO SISTEMA DE CORREIO ELETRÔNICO DO BANCO CENTRAL DO BRASIL. Manual do Web Service

Protocolos de Redes Revisão para AV I

Laboratório de Computação VI JAVA IDL. Fabricio Aparecido Breve

3. Explique o motivo pelo qual os protocolos UDP e TCP acrescentam a informação das portas (TSAP) de origem e de destino em seu cabeçalho.

1.264 Lição 11. Fundamentos da Web

UltraCard Manual de integração via WebService Página 1/13. UltraCard. Manual de integração via WebService. Versão 2.5

Desenvolvimento Cliente-Servidor 1

5 Estudo de caso: utilizando o sistema para requisição de material

Java para Desenvolvimento Web

QUESTINAMENTOS AO EDITAL DE CONCORRÊNCIA 01/2013

CRIAÇÃO DE SITES (AULA 1)

Como funciona a plataforma Superlógica? - Livro 4 de 4. Como funciona a interface de integração? Como você poderá complementar o sistema?

4. Qual seria o impacto da escolha de uma chave que possua letras repetidas em uma cifra de transposição?

Programação Web Prof. Wladimir

Uma aplicação distribuída

Manual Técnico de Utilização do Web Service de Administração do Código de Segurança do Contribuinte - CSC

ITBI ONLINE MANUAL DE INTEGRAÇÃO

Service Oriented Architecture (SOA)

2 Geração Dinâmica de Conteúdo e Templates de Composição

Sistema Protocolo Integrado Manual de Integração ao Web Service

Sistemas Distribuídos. Professora: Ana Paula Couto DCC 064

Conhecendo um pouco mais o servidor Apache TomCat

DESENVOLVENDO APLICAÇÃO UTILIZANDO JAVA SERVER FACES

J820. Testes de interface Web com. HttpUnit. argonavis.com.br. Helder da Rocha

Transcrição:

Minicurso Vinícius Costa de Souza viniciuscs@unisinos.br http://www.inf.unisinos.br/~vinicius julho de 2005

Apresentações Nome Conhecimentos sobre Web Services Conhecimentos sobre PHP Expectativas referentes ao curso Vinícius Costa de Souza - Julho de 2005 / 2

Programa Introdução Web Services O que são? Arquitetura Tecnologias XML WSDL SOAP UDDI XML-RPC NuSOAP PEAR SOAP REST PHP Extension Vinícius Costa de Souza - Julho de 2005 / 3

Introdução Por que surgiram os Web Services? Reutilização Disponibilidade Interoperabilidade 3.300 projetos em 2002 15,2 milhões de dólares até 2007 Vinícius Costa de Souza - Julho de 2005 / 4

O que são? Web Services Web Services são componentes de software que independem de implementação ou de plataforma e podem ser descritos, publicados e invocados sobre uma rede através de mensagens padrão XML. Vinícius Costa de Souza - Julho de 2005 / 5

Arquitetura Web Services Registro de Serviços Descriçã o do serviço encontrar publicar cliente Solicitante de Serviços interagir Provedor de Serviços serviço Descrição do serviço Vinícius Costa de Souza - Julho de 2005 / 6

Tecnologias Web Services Vinícius Costa de Souza - Julho de 2005 / 7

XML Tecnologias No contexto de Web Services, a XML não é apenas utilizada como formato para troca de mensagens, mas também como a forma através da qual os serviços são definidos Permite superar as limitações do HTML Possibilita criar qualquer número de elementos (tags) com significado associado às informações Vinícius Costa de Souza - Julho de 2005 / 8

XML Tecnologias Através de XML esquemas é possível validar as informações separadamente e descrever os atributos e características dos dados Duas partes só podem trocar informações em XML e entender os elementos da mesma forma se compartilharem uma mesma definição sobre quais e como os elementos podem ser utilizados Vinícius Costa de Souza - Julho de 2005 / 9

WSDL Tecnologias A WSDL é a linguagem padrão XML utilizada para descrever interfaces de Web Services A WSDL é dividida em três elementos principais: definições de tipo de dados - determinam a estrutura e o conteúdo das mensagens. operações abstratas - determinam as operações possíveis protocolos de ligação - determinam as formas de transmissão das mensagens pela rede até os destinatários Vinícius Costa de Souza - Julho de 2005 / 10

WSDL Tecnologias Camadas de descrição dos serviços Vinícius Costa de Souza - Julho de 2005 / 11

SOAP Tecnologias O SOAP é um protocolo para troca de informações em ambiente descentralizado e distribuído que permite comunicação entre aplicações de forma simples e completamente independente de sistema operacional, linguagem de programação ou plataforma A comunicação é realizada através de trocas de mensagens, transmitidas em formato XML, incluindo os parâmetros usados na chamada, bem como os dados de resultados. Também pode ser utilizado para invocar, publicar e localizar Web Services no registro UDDI Vinícius Costa de Souza - Julho de 2005 / 12

SOAP Tecnologias O SOAP pode ser utilizado em combinação com uma variedade de outros protocolos, como HTTP, SMTP, FTP, dentre outros. Também suporta Remote Procedure Call O modelo de dados SOAP oferece definições para tipos de dados como string, integer, float, double e date Vinícius Costa de Souza - Julho de 2005 / 13

SOAP Tecnologias Um pacote SOAP possui as seguintes partes: Envelope: define o início e o fim das mensagens, quem poderá tratá-las e se o tratamento é obrigatório ou opcional Cabeçalho: contém atributos opcionais das mensagens Corpo: contém os dados em XML Anexo: consiste de um ou mais documentos anexados a mensagem principal RPC: define como o modelo RPC (Remote Procedure call) interage com o SOAP, com o objetivo de invocar procedimentos em um sistema remoto. Codificação: define como representar dados simples e complexos a serem transmitidos nas mensagens Vinícius Costa de Souza - Julho de 2005 / 14

SOAP Tecnologias Envelope, Cabeçalho e Corpo das mensagens SOAP Vinícius Costa de Souza - Julho de 2005 / 15

SOAP Tecnologias Invocação do serviço utilizando SOAP Vinícius Costa de Souza - Julho de 2005 / 16

UDDI Tecnologias Para que um serviço seja utilizado é necessário que o cliente consiga localizá-lo, e esta localização pode ser feita através do UDDI, que é uma especificação técnica para descrever, descobrir e integrar Web Services Para isso, existe um registro global público, chamado UDDI business registry, no qual toda a informação está disponível para consultas em geral. Entretanto, um registro privado pode adicionar controle de segurança para proteger os dados e prevenir acessos não autorizados Vinícius Costa de Souza - Julho de 2005 / 17

UDDI Tecnologias UDDI utilizado para descobrir um Web Service Vinícius Costa de Souza - Julho de 2005 / 18

Possibilidades XML-RPC NuSOAP PEAR SOAP REST SOAP Extension Vinícius Costa de Souza - Julho de 2005 / 19

XML-RPC Remote Procedure Calls RPC são utilizadas para estabelecer e facilitar transações entre dois sistemas remotos XML-RPC é uma implementação de RPC que possibilita o transporte de dados em XML entre dois servidores utilizando o protocolo HTTP XML-RPC tollkit disponível em: http://sourceforge.net/projects/phpxmlrpc Versão 1.1.1 de 30/06/2005 Vinícius Costa de Souza - Julho de 2005 / 20

XML-RPC Classes xmlrpc_client clientes xmlrpc_server - servidores xmlrpcmsg requisições ao servidor xmlrpcresp respostas do servidor xmlrpcval encapsula valores para XML-RPC Arquivos xmlrpc.inc xmlrpcs.inc Vinícius Costa de Souza - Julho de 2005 / 21

XML-RPC xmlrpc_server.php <?php?> include ("xmlrpc.inc"); include ("xmlrpcs.inc"); function CalculaICMS ($objeto){ } $valor = $objeto->getparam(0); $valor_escalar = $valor->scalarval(); $valoricms = $valor_escalar * 1.5; return new xmlrpcresp (new xmlrpcval($valoricms, "string")); $servidor = new xmlrpc_server (array("valoricms.calculaicms"=>array("function"=>"calculaicms"))); Vinícius Costa de Souza - Julho de 2005 / 22

XML-RPC xmlrpc_client.php <?php?> include ("xmlrpc.inc"); $valor_nf = "15.000"; $format = new xmlrpcmsg('valoricms.calculaicms', array(new xmlrpcval($valor_nf, "double"))); $client = new xmlrpc_client("xmlrpc_server.php", "localhost", 80); $request = $client->send($format); $resp = $request->value(); echo $value->scalarval(); Vinícius Costa de Souza - Julho de 2005 / 23

Exercícios 1. Baixar as classes XML-RPC http://sourceforge.com 3. Baixar os exemplos xmlrpc_server.php e xmlrpc_client.php em www.inf.unisinos.br/~vinicius e testar. Simular alguns erros com e sem a opção de debug. 5. Criar um Web Service que recebe um nome (string) e retorna como resposta a frase Olá nome!. Vinícius Costa de Souza - Julho de 2005 / 24

PEAR PHP Extension and Application Repository http://pear.php.net Repositório de classes em PHP Licença livre Grande comunidade PEAR SOAP Client/Server for PHP implementação do protocolo SOAP e serviços versão 0.9.1 Beta de 31/05/2005. Vinícius Costa de Souza - Julho de 2005 / 25

PEAR pear-server1.php <?php require_once 'SOAP/Server.php'; $server = new SOAP_Server; class SOAP_Example_Server { var $method_namespace = 'urn:soap_example_server'; } function echostring($inputstring) { return $inputstring; } $soapclass = new SOAP_Example_Server(); $server->addobjectmap($soapclass); $server->service($http_raw_post_data);?> Vinícius Costa de Souza - Julho de 2005 / 26

PEAR pear-client1.php <?php require_once 'SOAP/Client.php'; $soapclient = new SOAP_Client('http://localhost/pear-server1.php');?> $result = $soapclient->call('echostringsimple', array('inputstring' => 'this is a test string'), array('namespace' => 'urn:soap_example_server'); Vinícius Costa de Souza - Julho de 2005 / 27

NuSOAP API desenvolvida em PHP Permite a criação de clientes e servidores Possui suporte embutido a WSDL. Instalação simplificada servidor Web com suporte a PHP biblioteca de classes nusoap.php http://sourceforge.ner/projects/nusoap A última versão estável é a 0.7.0 de 3/6/2005 Vinícius Costa de Souza - Julho de 2005 / 28

NuSOAP (exemplo 1 Hello World) nusoap_server1.php <?php // inclusão do arquivo de classes NuSOAP require_once('nusoap.php'); // criação de uma instância do servidor $server = new soap_server; // registro do método $server->register('hello'); // definição do método como uma função do PHP function hello($name) { return 'Hello '.$name; }?> // requisição para uso do serviço $HTTP_RAW_POST_DATA = isset($http_raw_post_data)? $HTTP_RAW_POST_DATA : ''; $server->service($http_raw_post_data); Vinícius Costa de Souza - Julho de 2005 / 29

NuSOAP (exemplo 1 Hello World) nusoap_client1.php <?php // inclusão do arquivo de classes NuSOAP require_once('nusoap.php'); // criação de uma instância do cliente $client = new soapclient('http://localhost/server1.php'); // chamada do método SOAP $result = $client->call('hello',array('v SDSL'));?> // exibe o resultado print_r($result); Vinícius Costa de Souza - Julho de 2005 / 30

NuSOAP (exemplo 2 - debug) nusoap_client2.php <?php require_once('nusoap.php'); $client = new soapclient('http://localhost/server1.php'); // verifica se ocorreu erro na criação do objeto $err = $client->geterror(); if ($err){ echo "<h2>erro no construtor</h2><pre>".$err."</pre>"; } // chamada do método SOAP $result = $client->call('hello',array('v SDSL')); // verifica se ocorreu falha na chamada do método if ($client->fault){ echo "<h2>falha</h2><pre>"; print_r($result); echo "</pre>"; Vinícius Costa de Souza - Julho de 2005 / 31

NuSOAP (exemplo 2 - debug) }else{ // verifica se ocorreu erro na execução do método $err = $client->geterror(); if ($err){ echo "<h2>erro</h2><pre>".$err."</pre>"; }else{ // exibe o resultado echo "<h2>result</h2><pre>".print_r($result)."</pre>"; } } // exibe a requisição e a resposta echo '<h2>requisição</h2>'; echo '<pre>'.htmlspecialchars($client->request).'</pre>'; echo '<h2>resposta</h2>'; echo '<pre>'.htmlspecialchars($client->response).'</pre>';?> // Exibe mensagens para debug echo '<h2>debug</h2>'; echo '<pre>'.htmlspecialchars($client->debug_str).'</pre>' Vinícius Costa de Souza - Julho de 2005 / 32

NuSOAP (exemplo 2 - debug) Requisição POST server1.php HTTP/1.0 User-Agent: NuSOAP/0.6.7 (1.75) Host: localhost Content-Type: text/xml; charset=iso-8859-1 SOAPAction: "" Authorization: Basic dmluawnpdxm6dw5pc2lub3m= Content-Length: 538 <?xml version="1.0" encoding="iso-8859-1"?> <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:si="http://soapinterop.org/xsd"> <SOAP-ENV:Body> <ns1:hello xmlns:ns1="http://testuri.org"> <soapval xsi:type="xsd:string">iii SDSL</soapVal> </ns1:hello> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Vinícius Costa de Souza - Julho de 2005 / 33

NuSOAP (exemplo 3 - WSDL) server2.php <?php require_once('nusoap.php'); $server = new soap_server; // inicializa o suporte a WSDL $server->configurewsdl('server2','urn:server2'); $server->wsdl->schematargetnamespace = 'urn:server2'; // registra o método a ser oferecido $server->register('hello', //nome do método array('name' => 'xsd:string'), //parâmetros de entrada array('return' => 'xsd:string'), //parâmetros de saída 'urn:server2', //namespace 'urn:server2#hello', //soapaction 'rpc', //style 'encoded', //use 'Says hello to the caller' //documentação do WS );... Vinícius Costa de Souza - Julho de 2005 / 34

Vinícius Costa de Souza - Julho de 2005 / 35

Exercícios 1. Baixar as classes do NuSOAP http://sourceforge.net Baixar e testar os três exemplos apresentados http://www.inf.unisinos.br/~vinicius 2. Alterar o nusoap-server2.php para que o mesmo forneça um novo serviço além do hello. Este novo serviço deve ser chamado de Media e deve receber como parâmetros de entrada dois números reais (num1 e num2) e retornar como saída um parâmetro (resultado), que deve ser o resultado do cálculo da média entre os dois números. 3. Criar um cliente para acessar o novo serviço implementado Vinícius Costa de Souza - Julho de 2005 / 36

Exercícios 1. Criar um cliente para acessar um Web Service disponibilizado pela Amazon.com através da API NuSOAP O web service disponibilizado pela Amazon (http: //soap.amazon.com) permite a realização de consultas em sua base de dados. Dessa forma, podemos incluir fomulários para pesquisas na Amazon em nossos próprios sites. Vinícius Costa de Souza - Julho de 2005 / 37

Dicas 1. URL para acesso ao serviço da Amazon.com http://soap.amazon.com/schemas3/amazonwebservices.wsdl 2. Parâmetros a serem passados 'keyword' => $palavra, 'page' => $pagina, 'mode' => 'books', 'tag' => 'melonfire-20', 'sort' => '+pmrank', 'type' => 'lite', 'devtag' => 'YOUR-TOKEN-HERE 5. Array Details 'Url 'ImageUrlSmall' 'ProductName 'Authors 'OurPrice' 3. Nome do método a ser chamado KeywordSearchRequest 4. Retorno $result['details']; $result['totalresults']; Vinícius Costa de Souza - Julho de 2005 / 38

REST O REST difere bastante do SOAP e do XML-RPC. não é um padrão não existem classes pré-construídas não exige nenhuma extensão especial ou biblioteca de classes O protocolo HTTP faz o envio e recebimento de mensagens padrão XML. uso de métodos padrão HTTP como o GET, POST e PUT para enviar e recuperar dados XML. Necessário utilizar ferramentas como PHP DOM, SAX, ou também XSL para fazer o parsing. Vinícius Costa de Souza - Julho de 2005 / 39

REST rest-server.php <?php // obtém o valor do parâmetro passado. $amount = $_GET["amount"]; // efetua o cálculo do imposto $taxcalc = $amount*0.15;?> // monta o XML de resposta echo "<?xml version=\"1.0\"?>"; echo "<taxinfo>"; echo "<result>".$taxcalc."</result>"; echo "</taxinfo>"; Vinícius Costa de Souza - Julho de 2005 / 40

REST rest-client.php <?php $rs = "http://localhost/rest-server.php"; $qs = ""; $param = array('amount' => "15.00"); foreach($param as $key=>$value){ $qs = $qs."$key=".urlencode($value)."&"; } $url = "$rs?$qs"; $xml = file_get_contents($url);?> echo $xml; Vinícius Costa de Souza - Julho de 2005 / 41

SOAP Extension A extensão SOAP do PHP 5 é a primeira implementação do protocolo SOAP para PHP em C Possui algumas vantagens em relação a outras implementações escritas em PHP, sendo a principal delas a velocidade. Essa extensão, ainda definida como experimental, pode ser utilizada para implementar servidores e clientes SOAP com suporte a SOAP 1.1, SOAP 1.2 e WSDL 1.1. Possui uma série de funções pré-definidas Vinícius Costa de Souza - Julho de 2005 / 42

SOAP Extension soap-server1.php <?php //criação de uma instância do servidor $server = new SoapServer(null, array('uri' => "http://localhost/ws/")); //definição do serviço function helloworld($name) { return "Hello ".$name; } //registro do serviço $server->addfunction("helloworld"); //chamada do método para atender as requisição do serviço $server->handle();?> Vinícius Costa de Souza - Julho de 2005 / 43

SOAP Extension soap-client1.php <?php // criação de uma instância do cliente $client = new SoapClient(null, array( 'location' => 'http://localhost/ws/soap-server1.php', 'uri' => 'http://localhost/ws/', 'trace' => 1); // chamada do serviço SOAP $result = $client->helloworld('vinícius');?> // verifica erros na execução do serviço e exibe o resultado if (is_soap_fault($result)){ trigger_error("soap Fault: (faultcode: {$result->faultcode}, faultstring: {$result->faulstring})", E_ERROR); }else{ print_r($result); } Vinícius Costa de Souza - Julho de 2005 / 44

Exercício 1. Implementar e testar o exemplo Vinícius Costa de Souza - Julho de 2005 / 45

Referências http://www.w3.org/2002/ws/ W3C - Web Services Activity http://sourceforge.net/projects/nusoap/ NuSOAP project page http://www.xmlrpc.com Site oficial do XML-RPC http://pear.php.net/package/soap SOAP Package http://br.php.net/manual/pt_br/ref.soap.php Site oficial do PHP http://www.w3.org/tr/soap/ SOAP http://www.w3.org/tr/wsdl WSDL http://www.w3.org/xml/ XML http://www.uddi.org/ Vinícius Costa de Souza - Julho de 2005 / 46

OBRIGADO! Vinícius Costa de Souza viniciuscs@unisinos.br www.inf.unsinos.br/~vinicius São Leopoldo, julho de 2005 Vinícius Costa de Souza - Julho de 2005 / 47