jython no javaone latin america 2011

40
Scripting e desenvolvimento ágil de aplicações Java EE com Jython Luciano Ramalho [email protected] @luciano Rafael Nunes [email protected] @rafanunes Wednesday, December 21, 2011

Upload: luciano-ramalho

Post on 13-Jan-2015

992 views

Category:

Technology


2 download

DESCRIPTION

Apresentação sobre Jython, Python em Java, feita no JavaOne Latin America 2011 em São Paulo

TRANSCRIPT

Page 1: Jython no JavaOne Latin America 2011

Scripting e desenvolvimento ágil de aplicações

Java EE com JythonLuciano Ramalho

[email protected]

@luciano

Rafael Nunes

[email protected]

@rafanunesWednesday, December 21, 2011

Page 2: Jython no JavaOne Latin America 2011

Exemplo: relógio Java Swing# coding: utf-8from javax.swing import *from java.awt import Fontfrom time import strftime

class Relogio(JFrame): def __init__(self): JFrame.__init__(self, u'TicTac', defaultCloseOperation = JFrame.DISPOSE_ON_CLOSE) self.mostrador = JLabel('00:00:00', font=Font('Sanserif',Font.BOLD, 70)) self.contentPane.add(self.mostrador) self.pack() self.visible = True

def start(self): def tic(evento): agora = strftime('%H:%M:%S') if self.mostrador.text != agora: self.mostrador.text = agora Timer(100, tic).start()

if __name__=='__main__': rel = Relogio() rel.start()

Funçãocallback

comolistener

Wednesday, December 21, 2011

Page 3: Jython no JavaOne Latin America 2011

Exemplo: relógio Java Swing

from jrelogio import Relogiorel = Relogio()rel.start()

from java.awt import *rel.mostrador.foreground = Color.RED

print rel.mostrador.text

from time import sleepwhile True: if rel.mostrador.text.endswith('0'): print 'PING', rel.mostrador.text sleep(1)

Wednesday, December 21, 2011

Page 4: Jython no JavaOne Latin America 2011

é

Wednesday, December 21, 2011

Page 5: Jython no JavaOne Latin America 2011

Sobre PythonLinguagem de uso geral

Web, desktop, redes, computação gráfica e científica

Multi-plataforma

Linux, Windows, Mac, Unix, Nokia S-60...

Amplo suporte de fornecedores de TI

Google, IBM, Oracle, Microsoft, RedHat, Amazon...

Sintaxe simples e clara mas muito expressiva

Aprendizagem rápida, produtividade em dias

Wednesday, December 21, 2011

Page 6: Jython no JavaOne Latin America 2011

Exemplo: cliente Twitter# coding: utf-8import sysimport urllibimport simplejson as json

if len(sys.argv) == 2: busca = sys.argv[1]else: print 'Informe o texto da busca: %s "texto"' % __file__ sys.exit(1)

url = 'http://search.twitter.com/search.json?q='+buscaresposta = urllib.urlopen(url).read()documento = json.loads(resposta)resultados = documento['results']for resultado in resultados: print u'%(from_user)s: %(text)s\n' % resultadoprint '%s resuldados exibidos' % len(resultados)

Wednesday, December 21, 2011

Page 7: Jython no JavaOne Latin America 2011

Exemplo: planilhaclass Planilha: _cels = {} def __init__(self, **funcs): self._funcs = funcs def __setitem__(self, chave, formula): self._cels[chave] = formula def formula(self, chave): return self._cels[chave] def __getitem__(self, chave ): return eval(self._cels[chave], self._funcs, self)

>>> from math import pi, sin>>> from planilha import Planilha>>> p = Planilha(sin=sin, pi=pi)>>> p['a1'] = '.5'>>> p['a2'] = 'pi'>>> p['b1'] = 'a1*a2'>>> p['b2'] = 'sin(b1)'>>> p['b2']1.0

Wednesday, December 21, 2011

Page 8: Jython no JavaOne Latin America 2011

Quem usa Python?

Wednesday, December 21, 2011

Page 9: Jython no JavaOne Latin America 2011

Wednesday, December 21, 2011

Page 10: Jython no JavaOne Latin America 2011

Wednesday, December 21, 2011

Page 11: Jython no JavaOne Latin America 2011

Wednesday, December 21, 2011

Page 12: Jython no JavaOne Latin America 2011

Wednesday, December 21, 2011

Page 13: Jython no JavaOne Latin America 2011

Áreas de aplicação

desenvolvimento Web

computação gráfica

administração de sistemas

integração de sistemas (glue language)

computação científica

games

Wednesday, December 21, 2011

Page 14: Jython no JavaOne Latin America 2011

YouTubeWednesday, December 21, 2011

Page 15: Jython no JavaOne Latin America 2011

Globo.com usa DjangoWednesday, December 21, 2011

Page 16: Jython no JavaOne Latin America 2011

Mozilla Firefox Add-OnsWednesday, December 21, 2011

Page 17: Jython no JavaOne Latin America 2011

DropboxWednesday, December 21, 2011

Page 18: Jython no JavaOne Latin America 2011

Google App EngineWednesday, December 21, 2011

Page 19: Jython no JavaOne Latin America 2011

The Foundry, NUKEWednesday, December 21, 2011

Page 20: Jython no JavaOne Latin America 2011

Industrial Light & MagicWednesday, December 21, 2011

Page 21: Jython no JavaOne Latin America 2011

Autodesk MayaWednesday, December 21, 2011

Page 22: Jython no JavaOne Latin America 2011

InvesaliusWednesday, December 21, 2011

Page 23: Jython no JavaOne Latin America 2011

FBI e CIAWednesday, December 21, 2011

Page 24: Jython no JavaOne Latin America 2011

brasil.gov.brWednesday, December 21, 2011

Page 25: Jython no JavaOne Latin America 2011

Projetos Open Source

Wednesday, December 21, 2011

Page 26: Jython no JavaOne Latin America 2011

Características

Não obriga a declarar variáveis, mas obriga a inicializar

>>> a = 10>>> c = a + bTraceback (most recent call last): File "<stdin>", line 1, in <module>NameError: name 'b' is not defined

Wednesday, December 21, 2011

Page 27: Jython no JavaOne Latin America 2011

Características 2

Tipagem dinâmica forte, obriga conversões explícitas

>>> a = '9'>>> b = 10>>> c = a + bTraceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: cannot concatenate 'str' and 'int' objects

Wednesday, December 21, 2011

Page 28: Jython no JavaOne Latin America 2011

Características 3Orientada a objetos, mas não obriga a criar classes

Suporta sobrecarga de operadores e herança múltipla

Usa exceções, mas não obriga a declarar ou tratar

Usa namespaces, módulos e pacotes

Compilada para bytecode

Suporte nativo a properties

Wednesday, December 21, 2011

Page 29: Jython no JavaOne Latin America 2011

Exemplo: property read-onlyclass ItemPedido(object): def __init__(self, descr, pr_unit, qtd): self.descr = descr self.pr_unit = pr_unit self.qtd = qtd

@property def total(self): return self.pr_unit * self.qtd

>>> bolas = ItemPedido('bola', 3.1, 10)>>> bolas.descr'bola'>>> bolas.total31.0>>> bolas.total = 30Traceback (most recent call last): ...AttributeError: can't set attribute

Wednesday, December 21, 2011

Page 30: Jython no JavaOne Latin America 2011

Exemplo: property read-writeclass ItemPedido(object): def __init__(self, descr, pr_unit, qtd): self.descr = descr self.pr_unit = pr_unit self.qtd = qtd

@property def total(self): return self.pr_unit * self.qtd

@property def qtd(self): return self.__qtd

@qtd.setter def qtd(self, valor): if valor < 1: raise ValueError('quantidade < 1') else: self.__qtd = valor

Wednesday, December 21, 2011

Page 31: Jython no JavaOne Latin America 2011

Propriedade(exemplo 2)

class ItemPedido(object): def __init__(self, descr, pr_unit, qtd): self.descr = descr self.pr_unit = pr_unit self.qtd = qtd

@property def total(self): return self.pr_unit * self.qtd

@property def qtd(self): return self.__qtd

@qtd.setter def qtd(self, valor): if valor < 1: raise ValueError('quantidade < 1') else: self.__qtd = valor

>>> bolas = ItemPedido('bola', 3.1, 10)>>> bolas.descr'bola'>>> bolas.total31.0>>> bolas.qtd = -3Traceback (most recent call last): ...ValueError: quantidade < 1>>> duendes = ItemPedido('duende', 999, 0)Traceback (most recent call last): ...ValueError: quantidade < 1

Wednesday, December 21, 2011

Page 32: Jython no JavaOne Latin America 2011

Implementações

CPython: o interpretador python padrão, implementando em C

pré-instalado na maioria dos Linux e no OSX

Jython: implementado em Java, roda sobre a JVM

IronPython: implementado em C#, roda sobre .net CLR

PyPy: implementado em Python, compilação JIT

Wednesday, December 21, 2011

Page 33: Jython no JavaOne Latin America 2011

Jython falando com Java

Wednesday, December 21, 2011

Page 34: Jython no JavaOne Latin America 2011

Jython no ambiente Java EEJython é a principal linguagem de scripting suportada e documentada nos produtos:

Oracle WebLogic

IBM WebSphere

Wednesday, December 21, 2011

Page 35: Jython no JavaOne Latin America 2011

Introspecção e Reflexão

Uma classe Java com dois atributos privados

public class ObjetoSecreto {

! private String escondido = "";! private String oculto = "dado ultra secreto";

! public ObjetoSecreto(String texto) {! ! this.escondido = texto;! }}

Wednesday, December 21, 2011

Page 36: Jython no JavaOne Latin America 2011

Acesso a atributo privadoimport java.lang.reflect.Field;

public class AcessaPrivado {

! public static void main(String[] args) {! ! ObjetoSecreto oSecreto = new ObjetoSecreto("senha super secreta");! ! Field campoPrivado = null;! ! try {! ! ! campoPrivado = ObjetoSecreto.class.getDeclaredField("escondido");! ! }! ! catch (NoSuchFieldException e) {! ! ! System.err.println(e);! ! ! System.exit(1);! ! }! ! campoPrivado.setAccessible(true); // arrombamos a porta! ! try {! ! ! String tavaEscondido = (String) campoPrivado.get(oSecreto);! ! ! System.out.println("oSecreto.escondido = " + tavaEscondido);! ! }! ! catch (IllegalAccessException e) { ! ! ! // esta exceção nao acontece porque fizemos setAcessible(true)! ! ! System.err.println(e);! ! }!! }}

import ObjetoSecreto

oSecreto = ObjetoSecreto('senha super secreta')campoPrivado = ObjetoSecreto.getDeclaredField('escondido')campoPrivado.setAccessible(True) # arrombamos a portaprint 'oSecreto.escondido =', campoPrivado.get(oSecreto)

Java

Python

Wednesday, December 21, 2011

Page 37: Jython no JavaOne Latin America 2011

Acesso a atributo privado 2import ObjetoSecreto

oSecreto = ObjetoSecreto('senha super secreta')campoPrivado = ObjetoSecreto.getDeclaredField('escondido')campoPrivado.setAccessible(True) # arrombamos a portaprint 'oSecreto.escondido =', campoPrivado.get(oSecreto)

from java.lang.reflect import Modifierimport ObjetoSecreto

oSecreto = ObjetoSecreto('senha super secreta')campos = ObjetoSecreto.getDeclaredFields()for campo in campos: # so campos privados! if Modifier.isPrivate(campo.getModifiers()): print campo campo.setAccessible(True) # arrombamos a porta print '\t', campo.getName(), '=', campo.get(oSecreto)

listar todos os atributos privados

Wednesday, December 21, 2011

Page 38: Jython no JavaOne Latin America 2011

Exemplo: relógio Java Swing

from javax.swing import *from java.awt import Fontfrom time import strftime

frame = JFrame(u'Relógio', defaultCloseOperation = JFrame.EXIT_ON_CLOSE)

rel = JLabel('00:00:00', font=Font('Sanserif',Font.BOLD,70))frame.contentPane.add(rel)frame.pack()frame.visible = True

def tic(evento): agora = strftime('%H:%M:%S') if rel.text != agora: rel.text = agora

Timer(100, tic).start()

Java beansetteracionadonoconstrutore setteracionadocomoproperty

Wednesday, December 21, 2011

Page 39: Jython no JavaOne Latin America 2011

Onde aprender mais

jython.org

Jython book livre (CC)

python.org

python.org.br

Google Groups: python-brasil

Wednesday, December 21, 2011

Page 40: Jython no JavaOne Latin America 2011

AcademiaPythonGlobalcode

A partir de janeiro de 2012 em SP

112h de aula

do básico aoavançado em 3,5 meses

Wednesday, December 21, 2011