Jython no JavaOne Latin America 2011

Post on 13-Jan-2015

993 views 2 download

description

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

Transcript of Jython no JavaOne Latin America 2011

Scripting e desenvolvimento ágil de aplicações

Java EE com JythonLuciano Ramalho

ramalho@turing.com.br

@luciano

Rafael Nunes

rafael@yaw.com.br

@rafanunesWednesday, December 21, 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

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

é

Wednesday, December 21, 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

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

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

Quem usa Python?

Wednesday, December 21, 2011

Wednesday, December 21, 2011

Wednesday, December 21, 2011

Wednesday, December 21, 2011

Wednesday, December 21, 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

YouTubeWednesday, December 21, 2011

Globo.com usa DjangoWednesday, December 21, 2011

Mozilla Firefox Add-OnsWednesday, December 21, 2011

DropboxWednesday, December 21, 2011

Google App EngineWednesday, December 21, 2011

The Foundry, NUKEWednesday, December 21, 2011

Industrial Light & MagicWednesday, December 21, 2011

Autodesk MayaWednesday, December 21, 2011

InvesaliusWednesday, December 21, 2011

FBI e CIAWednesday, December 21, 2011

brasil.gov.brWednesday, December 21, 2011

Projetos Open Source

Wednesday, December 21, 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

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

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

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

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

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

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

Jython falando com Java

Wednesday, December 21, 2011

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

Oracle WebLogic

IBM WebSphere

Wednesday, December 21, 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

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

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

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

Onde aprender mais

jython.org

Jython book livre (CC)

python.org

python.org.br

Google Groups: python-brasil

Wednesday, December 21, 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