Scripting e desenvolvimento
                     ágil de aplicações
                    Java EE com Jython
                                    Luciano Ramalho         Rafael Nunes
                               ramalho@turing.com.br   rafael@yaw.com.br
                                           @luciano          @rafanunes
Wednesday, December 21, 2011
Exemplo: relógio Java Swing
                               # coding: utf-8
                               from javax.swing import *
                               from java.awt import Font
                               from 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))
     Função                            self.contentPane.add(self.mostrador)
                                       self.pack()

    callback                           self.visible = True


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

                               if __name__=='__main__':
                                   rel = Relogio()
                                   rel.start()
Wednesday, December 21, 2011
Exemplo: relógio Java Swing
                from jrelogio import Relogio
                rel = Relogio()
                rel.start()

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

                print rel.mostrador.text

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




Wednesday, December 21, 2011
é

Wednesday, December 21, 2011
Sobre Python
             Linguagem 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-8
          import sys
          import urllib
          import 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='+busca
          resposta = urllib.urlopen(url).read()
          documento = json.loads(resposta)
          resultados = documento['results']
          for resultado in resultados:
              print u'%(from_user)s: %(text)sn' % resultado
          print '%s resuldados exibidos' % len(resultados)




Wednesday, December 21, 2011
Exemplo: planilha
        class 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
YouTube
Wednesday, December 21, 2011
Wednesday, December 21, 2011
                               Globo.com usa Django
Mozilla Firefox Add-Ons
Wednesday, December 21, 2011
Dropbox
Wednesday, December 21, 2011
Google App Engine
Wednesday, December 21, 2011
The Foundry, NUKE
Wednesday, December 21, 2011
Industrial Light & Magic
Wednesday, December 21, 2011
Autodesk Maya
Wednesday, December 21, 2011
Invesalius
Wednesday, December 21, 2011
FBI e CIA
Wednesday, December 21, 2011
brasil.gov.br
Wednesday, 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 + b
                               Traceback (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 + b
             Traceback (most recent call last):
               File "<stdin>", line 1, in <module>
             TypeError: cannot concatenate 'str' and 'int' objects




Wednesday, December 21, 2011
Características 3
              Orientada 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-only
       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

                               >>> bolas = ItemPedido('bola', 3.1, 10)
                               >>> bolas.descr
                               'bola'
                               >>> bolas.total
                               31.0
                               >>> bolas.total = 30
                               Traceback (most recent call last):
                                  ...
                               AttributeError: can't set attribute
Wednesday, December 21, 2011
Exemplo: property read-write
                               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


Wednesday, December 21, 2011
>>> bolas = ItemPedido('bola', 3.1, 10)
   Propriedade             >>> bolas.descr
                           'bola'
   (exemplo 2)             >>> bolas.total
                           31.0
                           >>> bolas.qtd = -3
                           Traceback (most recent call last):
class ItemPedido(object):    ...
                           ValueError: quantidade < 1
    def __init__(self, descr, pr_unit, qtd):
        self.descr = descr >>> duendes = ItemPedido('duende', 999, 0)
                           Traceback (most recent call last):
        self.pr_unit = pr_unit
        self.qtd = qtd       ...
                           ValueError: quantidade < 1
         @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
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 EE
            Jython é 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 privado
               import java.lang.reflect.Field;
                                                                                         Java
               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 {
                                                                                        Python
               !     ! ! String tavaEscondido = (String) campoPrivado.get(oSecreto);
               !     ! ! System.out.println("oSecreto.escondido = " + tavaEscondido);
               !     ! }
               !     ! catch (IllegalAccessException e) {
                                         import ObjetoSecreto
               !     ! ! // esta exceção nao acontece porque fizemos setAcessible(true)
               !     ! ! System.err.println(e); = ObjetoSecreto('senha super secreta')
                                         oSecreto
               !     ! }!                campoPrivado = ObjetoSecreto.getDeclaredField('escondido')
               !     }                   campoPrivado.setAccessible(True) # arrombamos a porta
               }                        print 'oSecreto.escondido =', campoPrivado.get(oSecreto)

Wednesday, December 21, 2011
Acesso a atributo privado 2
       import ObjetoSecreto

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

                       from java.lang.reflect import Modifier               listar
                       import ObjetoSecreto
                                                                          todos os
                                                                          atributos
                       oSecreto = ObjetoSecreto('senha super secreta')
                       campos = ObjetoSecreto.getDeclaredFields()
                       for campo in campos:
                           # so campos privados!
                                                                          privados
                           if Modifier.isPrivate(campo.getModifiers()):
                               print campo
                               campo.setAccessible(True) # arrombamos a porta
                               print 't', campo.getName(), '=', campo.get(oSecreto)




Wednesday, December 21, 2011
Exemplo: relógio Java Swing
   Java bean                   from javax.swing import *
                               from java.awt import Font
   setter                      from time import strftime

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

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

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

                               Timer(100, tic).start()
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
Academia
     Python
     Globalcode
              A partir de janeiro
              de 2012 em SP
              112h de aula
              do básico ao
              avançado em
              3,5 meses



Wednesday, December 21, 2011

Jython no JavaOne Latin America 2011

  • 1.
    Scripting e desenvolvimento ágil de aplicações Java EE com Jython Luciano Ramalho Rafael Nunes ramalho@turing.com.br rafael@yaw.com.br @luciano @rafanunes Wednesday, December 21, 2011
  • 2.
    Exemplo: relógio JavaSwing # coding: utf-8 from javax.swing import * from java.awt import Font from 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)) Função self.contentPane.add(self.mostrador) self.pack() callback self.visible = True como def start(self): def tic(evento): agora = strftime('%H:%M:%S') listener if self.mostrador.text != agora: self.mostrador.text = agora Timer(100, tic).start() if __name__=='__main__': rel = Relogio() rel.start() Wednesday, December 21, 2011
  • 3.
    Exemplo: relógio JavaSwing from jrelogio import Relogio rel = Relogio() rel.start() from java.awt import * rel.mostrador.foreground = Color.RED print rel.mostrador.text from time import sleep while True: if rel.mostrador.text.endswith('0'): print 'PING', rel.mostrador.text sleep(1) Wednesday, December 21, 2011
  • 4.
  • 5.
    Sobre Python Linguagem 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
  • 6.
    Exemplo: cliente Twitter # coding: utf-8 import sys import urllib import 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='+busca resposta = urllib.urlopen(url).read() documento = json.loads(resposta) resultados = documento['results'] for resultado in resultados: print u'%(from_user)s: %(text)sn' % resultado print '%s resuldados exibidos' % len(resultados) Wednesday, December 21, 2011
  • 7.
    Exemplo: planilha class 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
  • 8.
    Quem usa Python? Wednesday,December 21, 2011
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
    Á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
  • 14.
  • 15.
    Wednesday, December 21,2011 Globo.com usa Django
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
    Industrial Light &Magic Wednesday, December 21, 2011
  • 21.
  • 22.
  • 23.
    FBI e CIA Wednesday,December 21, 2011
  • 24.
  • 25.
  • 26.
    Características Não obriga a declarar variáveis, mas obriga a inicializar >>> a = 10 >>> c = a + b Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'b' is not defined Wednesday, December 21, 2011
  • 27.
    Características 2 Tipagem dinâmica forte, obriga conversões explícitas >>> a = '9' >>> b = 10 >>> c = a + b Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate 'str' and 'int' objects Wednesday, December 21, 2011
  • 28.
    Características 3 Orientada 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
  • 29.
    Exemplo: property read-only 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 >>> bolas = ItemPedido('bola', 3.1, 10) >>> bolas.descr 'bola' >>> bolas.total 31.0 >>> bolas.total = 30 Traceback (most recent call last): ... AttributeError: can't set attribute Wednesday, December 21, 2011
  • 30.
    Exemplo: property read-write 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 Wednesday, December 21, 2011
  • 31.
    >>> bolas =ItemPedido('bola', 3.1, 10) Propriedade >>> bolas.descr 'bola' (exemplo 2) >>> bolas.total 31.0 >>> bolas.qtd = -3 Traceback (most recent call last): class ItemPedido(object): ... ValueError: quantidade < 1 def __init__(self, descr, pr_unit, qtd): self.descr = descr >>> duendes = ItemPedido('duende', 999, 0) Traceback (most recent call last): self.pr_unit = pr_unit self.qtd = qtd ... ValueError: quantidade < 1 @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
  • 32.
    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
  • 33.
    Jython falando comJava Wednesday, December 21, 2011
  • 34.
    Jython no ambienteJava EE Jython é a principal linguagem de scripting suportada e documentada nos produtos: Oracle WebLogic IBM WebSphere Wednesday, December 21, 2011
  • 35.
    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
  • 36.
    Acesso a atributoprivado import java.lang.reflect.Field; Java 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 { Python ! ! ! String tavaEscondido = (String) campoPrivado.get(oSecreto); ! ! ! System.out.println("oSecreto.escondido = " + tavaEscondido); ! ! } ! ! catch (IllegalAccessException e) { import ObjetoSecreto ! ! ! // esta exceção nao acontece porque fizemos setAcessible(true) ! ! ! System.err.println(e); = ObjetoSecreto('senha super secreta') oSecreto ! ! }! campoPrivado = ObjetoSecreto.getDeclaredField('escondido') ! } campoPrivado.setAccessible(True) # arrombamos a porta } print 'oSecreto.escondido =', campoPrivado.get(oSecreto) Wednesday, December 21, 2011
  • 37.
    Acesso a atributoprivado 2 import ObjetoSecreto oSecreto = ObjetoSecreto('senha super secreta') campoPrivado = ObjetoSecreto.getDeclaredField('escondido') campoPrivado.setAccessible(True) # arrombamos a porta print 'oSecreto.escondido =', campoPrivado.get(oSecreto) from java.lang.reflect import Modifier listar import ObjetoSecreto todos os atributos oSecreto = ObjetoSecreto('senha super secreta') campos = ObjetoSecreto.getDeclaredFields() for campo in campos: # so campos privados! privados if Modifier.isPrivate(campo.getModifiers()): print campo campo.setAccessible(True) # arrombamos a porta print 't', campo.getName(), '=', campo.get(oSecreto) Wednesday, December 21, 2011
  • 38.
    Exemplo: relógio JavaSwing Java bean from javax.swing import * from java.awt import Font setter from time import strftime acionado frame = JFrame(u'Relógio', no defaultCloseOperation = JFrame.EXIT_ON_CLOSE) construtor rel = JLabel('00:00:00', font=Font('Sanserif',Font.BOLD,70)) e frame.contentPane.add(rel) frame.pack() setter frame.visible = True acionado def tic(evento): como agora = strftime('%H:%M:%S') if rel.text != agora: property rel.text = agora Timer(100, tic).start() Wednesday, December 21, 2011
  • 39.
    Onde aprender mais jython.org Jython book livre (CC) python.org python.org.br Google Groups: python-brasil Wednesday, December 21, 2011
  • 40.
    Academia Python Globalcode A partir de janeiro de 2012 em SP 112h de aula do básico ao avançado em 3,5 meses Wednesday, December 21, 2011