integração de aplicações em
DESCRIPTION
Luis Eduardo BorgesTRANSCRIPT
![Page 1: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/1.jpg)
Integração de aplicações em
Luiz Eduardo Borgeshttp://ark4n.wordpress.com/
![Page 2: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/2.jpg)
Sumário
● Integração de aplicações
● Aplicações distribuídas
● Camada de comunicação
● Formatos de dados
● Aplicações externas
![Page 3: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/3.jpg)
Integração de aplicações (tradicional)
Ambiente que requer muita administração
para se manter organizado.
Funções disponíveis para as aplicações.
Dados e regras de negócio precisam estar em um SGBD
para garantir a integridade e sigilo.
AplicaçãoA
AplicaçãoB
Bibliotecas
Dados
![Page 4: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/4.jpg)
Integração através de middleware
AplicaçãoA
AplicaçãoB
Regras de negócio podem ficar em componentes.
Middleware
Funções disponíveis para
todas as aplicações.
Dados
O ambiente requer muita padronização
para se manter organizado.
![Page 5: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/5.jpg)
Middleware
● É uma camada de software que conecta componentes ou aplicações, tendo como o objetivo a interoperabilidade.
● Várias opções:
– ZOPE (Z Object Publishing Environment)– WSGI (Web Server Gateway Interface)
– Twisted
– Muitos outros● O próprio Python pode ser encarado como um
middleware.
![Page 6: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/6.jpg)
Aplicações distribuídas
Arquiteturas:
● Computacional
● De recursos
● De aplicação ou híbrida
![Page 7: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/7.jpg)
Modelo computacional
A B
C D
O servidor distribui as requisições e centraliza os
resultados.
Os outros nós (workers) recebem as tarefas e
calculam os resultados.
![Page 8: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/8.jpg)
Modelo de recursos
A B
C D E F
G HOs servidores recebem as requisições e devolvem os
resultados.
Os clientes enviam as requisições e recebem
os resultados.
![Page 9: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/9.jpg)
Modelo híbrido ou de aplicação
A B
C D
A aplicação se confunde com a infraestrutura, provendo os
recursos.
Cada nó pode atuar como servidor e cliente, inclusive
ao mesmo tempo.
![Page 10: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/10.jpg)
Modelos (comparação)
Escalabilidade
Complexidade
Tolerância a falhas
Exemplo
PrincipalAplicação
Computacional
Média
Baixa
Média
SETI@home
Processamento memória
Recursos
Alta
Média
Alta
Servidores Web
Infra
Híbrido
Alta
Alta
Alta
P2P
Arquivos
![Page 11: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/11.jpg)
Aplicações distribuídas (requisito I)
A B
C D
Primeiro requisito: definir a forma de comunicação
entre os nós.
![Page 12: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/12.jpg)
Aplicações distribuídas (requisito II)
A B
C D
Segundo requisito: manter os metadados sobre os
nós, usuários, arquivos e outros recursos.
![Page 13: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/13.jpg)
Aplicações distribuídas (requisito III)
A B
C D
Terceiro requisito: fazer o monitoramento e
controle dos componentes do sistema.
![Page 14: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/14.jpg)
Aplicações distribuídas (requisito IV)
A B
C D
Quarto requisito: manter a segurança (sigilo, integridade e disponibilidade) dos dados e
sistemas envolvidos.
![Page 15: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/15.jpg)
Camada de comunicação
Rede
Máquina
Aplicação
Framework
Máquina
Aplicação
Framework
A camada torna transparente os protocolos de
rede.
![Page 16: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/16.jpg)
Camadas de comunicação em Python
● PYRO
● XML-RPC
● Socket
![Page 17: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/17.jpg)
PYRO (Python Remote Objects)
Implementa:
● Um protocolo que permite a execução remota via TCP/IP de métodos de um objeto.
● Envio de estruturas de dados “serializáveis” como parâmetros.
● Servidor de nomes que facilita a localização automática dos métodos.
● Validadores para verificar as credenciais do cliente.
![Page 18: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/18.jpg)
PYRO (servidor)
import numpyimport Pyro.core
class Dist(Pyro.core.ObjBase): def fft(self, l): return numpy.fft.fft(l)
# Inicia a thread do servidorPyro.core.initServer()
# Cria o servidordaemon = Pyro.core.Daemon()
# Publica o objetouri = daemon.connect(Dist(),'dist')
# Coloca o servidor em estado operacionaldaemon.requestLoop()
Classe do objeto que será publicado na rede pelo PYRO.
Método que calcula a transformada de Fourier.
![Page 19: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/19.jpg)
PYRO (cliente)
# -*- coding: utf-8 -*-
import numpyimport Pyro.core
# Dados de testedados = numpy.random.rand(100)
# Cria um objeto local para acessar o objeto remotoproxy = Pyro.core.getProxyForURI('PYROLOC://127.0.0.1/dist')
# Evoca um método do objeto distribuídoprint proxy.fft(dados)
![Page 20: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/20.jpg)
XML-RPC
Implementa:
● Protocolo de execução remota de procedimentos.
● Transferências de dados em XML usando HTTP ou HTTPS (criptografado) como protocolo de transporte.
● Suporte a tipos básicos: inteiro, ponto flutuante, texto, ...
![Page 21: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/21.jpg)
XML-RPC (servidor)
import numpyfrom SimpleXMLRPCServer import SimpleXMLRPCServer
# Cria um servidorserver = SimpleXMLRPCServer(('localhost', 8888))server.register_introspection_functions()
def fft(l):
return [ float(x) for x in numpy.fft.fft(l) ]
server.register_function(fft)
# Inicia o loop do servidorserver.serve_forever()
Conversão para tipos que o XML-RPC aceita.
![Page 22: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/22.jpg)
XML-RPC (cliente)
import numpyimport xmlrpclib
# Dados de testedados = [ float(x) for x in numpy.random.rand(100) ]
server = xmlrpclib.Server("http://localhost:8888")
# Evoca o procedimento remotoprint server.fft(dados)
Conversão para tipos que o XML-RPC aceita.
![Page 23: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/23.jpg)
Socket
Implementa:
● Acesso de baixo nível a biblioteca de sockets que disponível em praticamente qualquer sistema operacional atual.
● Conexões ponto a ponto vai TCP/IP.
![Page 24: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/24.jpg)
Socket (servidor I)
import cPickleimport socketimport threadingimport numpy
class Server(threading.Thread):
def __init__(self, skt): self.skt = skt threading.Thread.__init__ (self)
def run(self): # Recebe os dados rec = self.skt.recv(5000) # Calcula o resultado ff = numpy.fft.fft(cPickle.loads(rec)) # Retorna a resposta self.skt.send(cPickle.dumps(ff))
Continua...
Classe que implementa as threads para o servidor.
Método que é executado na thread.
Dados foram serializados no cliente.
![Page 25: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/25.jpg)
Socket (servidor II)
# cria um socket INET STREAMserver = socket.socket( socket.AF_INET, socket.SOCK_STREAM)
# Associa o socket a uma porta na interface de redeserver.bind((socket.gethostname(), 8000))
# Passa a "ouvir" a portaserver.listen(5)
while True: # aceita acesso externo (skt, addr) = server.accept() svr =Server(skt) svr.start()
![Page 26: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/26.jpg)
Socket (cliente)
import cPickleimport socketimport numpy
# Dadosdados = numpy.random.rand(100)
# cria um socket INET STREAMsvr = socket.socket( socket.AF_INET, socket.SOCK_STREAM)
# Conecta na interface de redesvr.connect((socket.gethostname(), 8000))svr.send(cPickle.dumps(dados))
# Recebe a respostarec = svr.recv(5000)print cPickle.loads(rec)
Os resultados foram serializados no servidor.
![Page 27: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/27.jpg)
Comunicação (comparação)
Performance
Portabilidade
Escalabilidade
Complexidade
Dependências
PYRO
Alta
Baixa
Alta
Baixa
Média
XML-RPC
Baixa
Alta
Baixa
Média
Baixa
Socket
Alta
Alta
Depende da aplicação
Alta
Baixa
![Page 28: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/28.jpg)
YAML (YAML Ain't a Markup Language)
Implementa:
● Formato de serialização de dados para texto, amigável para humanos.
● Representação de dados através de combinações de listas, dicionários e escalares.
● Convenções de sintaxe similares as linguagens dinâmicas, com forte influência do Python.
● Um superset do JSON (JavaScript Object Notation).
![Page 29: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/29.jpg)
YAML (exemplo)
- Artista: King Crimson Faixas: - Starless - Frature - Red - Lizard- Artista: Genesis Faixas: - Supper's Ready - In The Cage - The Lamia
[{'Artista': 'King Crimson', 'Faixas': ['Starless', 'Frature', 'Red', 'Lizard']}, {'Artista': 'Genesis', 'Faixas': ["Supper's Ready", 'In The Cage', 'The Lamia']}]
Estrutura Python
Documento YAML
![Page 30: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/30.jpg)
Formatos (comparação)
Performance
Portabilidade
Escalabilidade
Complexidade
Dependências
YAML / JSON
Média
Alta
Média
Baixa
Média
XML
Baixa
Alta
Alta
Média
Baixa
(c)Pickle
Alta
Baixa
Alta
Baixa
Baixa
![Page 31: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/31.jpg)
Aplicações externas
Aplicações “pythônicas”:
● BrOffice.org
● Blender
● GIMP
● Inkscape
● PostgreSQL
![Page 32: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/32.jpg)
BrOffice.org
Implementa:
● Suporte ao Python como linguagem de macro, permitindo a automatização de tarefas e a construção de extensões (add ons).
● Serviço para atender conexões, através de uma API chamada UNO (Universal Network Objects).
![Page 33: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/33.jpg)
BrOffice.org (serviço)
Interpretador
Aplicação
PyUNO BrOffice.org
Aceita conexões remotas via
named pipes ou sockets.
Python UNO Bridge
![Page 34: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/34.jpg)
BrOffice.org (exemplo I)
# -*- coding: latin1 -*-
# Para iniciar o BrOffice.org como servidor:# swriter.exe -headless# "-accept=pipe,name=py;urp;StarOffice.ServiceManager"
import osimport unofrom com.sun.star.beans import PropertyValue
# Dados...mus = [('Artista', 'Faixa'), ('King Crimson', 'Starless'), ('Yes', 'Siberian Khatru'), ('Led Zeppellin', 'No Quarter'), ('Genesis', 'Supper\'s Ready')]
rows = len(mus)cols = len(mus[0])
Continua...
![Page 35: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/35.jpg)
BrOffice.org (exemplo II)
# Inicio do "Boiler Plate"...
# Contexto de componente localloc = uno.getComponentContext()
# Para resolver URLsres = loc.ServiceManager.createInstanceWithContext( 'com.sun.star.bridge.UnoUrlResolver', loc)
# Contexto para a URLcon = res.resolve('uno:pipe,name=py;urp;StarOffice.ComponentContext')
# Documento correntedesktop = con.ServiceManager.createInstanceWithContext( 'com.sun.star.frame.Desktop', con)
# Fim do "Boiler Plate"...
Continua...
![Page 36: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/36.jpg)
BrOffice.org (exemplo III)
# Cria um documento novo no Writerdoc = desktop.loadComponentFromURL('private:factory/swriter', '_blank', 0, ())
# Cursor de textocursor = doc.Text.createTextCursor()
# Muda propriedadescursor.setPropertyValue('CharFontName', 'Verdana')cursor.setPropertyValue('CharHeight', 20)cursor.setPropertyValue('CharWeight', 180)doc.Text.insertString(cursor, 'Músicas favoritas\n', 0)
# Cria tabelatab = doc.createInstance('com.sun.star.text.TextTable')tab.initialize(rows, cols)doc.Text.insertTextContent(cursor, tab, 0)
Continua...
Texto inserido
![Page 37: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/37.jpg)
BrOffice.org (exemplo IV)
# Preenche a tabelafor row in xrange(rows): for col in xrange(cols): cel = chr(ord('A') + col) + str(row + 1) tab.getCellByName(cel).setString(mus[row][col])
# Propriedades para exportar o documentoprops = []p = PropertyValue()p.Name = 'Overwrite'p.Value = True # Sobrescreve o documento anteriorprops.append(p)
p = PropertyValue()p.Name = 'FilterName'p.Value = 'writer_pdf_Export' # Writer para PDFprops.append(p)
Continua...
Tabela
![Page 38: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/38.jpg)
BrOffice.org (exemplo V)
# URL de destinourl = uno.systemPathToFileUrl(os.path.abspath('musicas.pdf'))
# Salva o documento como PDFdoc.storeToURL(url, tuple(props))
# Fecha o documentodoc.close(True)
Arquivo de saída
![Page 39: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/39.jpg)
Referências
PYRO:
● http://pyro.sourceforge.net/
Socket Programming HOWTO:
● http://www.amk.ca/python/howto/sockets/
YAML Cookbook:
● http://yaml4r.sourceforge.net/cookbook/
Python – OpenOffice.org Wiki:
● http://wiki.services.openoffice.org/wiki/Python
![Page 40: Integração de aplicações em](https://reader031.vdocuments.site/reader031/viewer/2022020717/555a711bd8b42a972b8b4f9e/html5/thumbnails/40.jpg)
Integração de aplicações em
Luiz Eduardo Borgeshttp://ark4n.wordpress.com/
Fim