Jython: Python para la plataforma Java (EL2009)
Upcoming SlideShare
Loading in...5
×
 

Jython: Python para la plataforma Java (EL2009)

on

  • 3,905 views

 

Statistics

Views

Total Views
3,905
Views on SlideShare
3,100
Embed Views
805

Actions

Likes
0
Downloads
48
Comments
0

6 Embeds 805

http://blog.continuum.cl 671
http://blog.leosoto.com 127
http://www.slideshare.net 4
http://continuum.cl 1
http://www.linkedin.com 1
http://techblog.leosoto.com 1

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Jython: Python para la plataforma Java (EL2009) Jython: Python para la plataforma Java (EL2009) Presentation Transcript

  • Python para la Plataforma Java Leo Soto M. Encuentro Linux 2009
  • http://www.flickr.com/photos/ferruiz/4036373874/
  • Python para la plataforma Java
  • http://www.flickr.com/photos/lab2112/457187539/
  • ¿Plataforma Java sin Java?
  • Plataforma Java con Java más Python, Ruby, Scala, Groovy...
  • ¿Por qué Python?
  • “Python is an experiment in how much freedom programmers need...”
  • “...Too much freedom and nobody can read another's code; too little and expressiveness is endangered” - Guido van Rossum, 1996
  • Python Dinámico, flexible, extremadamente legible
  • Jython Dinámico, flexible, extremadamente legible En una plataforma ubicua, sólida
  • http://www.flickr.com/photos/mushon/282287572/
  • Status de Jython http://www.flickr.com/photos/digital-noise/3650559857/
  • 2.5.1
  • Full compatibilidad con CPython
  • web2py etree nose setuptools virtualenv
  • OK
  • ¿Pero qué puedo hacer con Jython hoy?
  • GUIs
  • Demo con Swing
  • De Java a Jython
  • final JFrame frame = new JFrame("HelloSwing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300,300);
  • frame = JFrame("HelloSwing") frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) frame.setSize(300,300)
  • frame = JFrame("HelloSwing", defaultCloseOperation=JFrame.EXIT_ON_CLOSE, size=(300, 300))
  • Container content = frame.getContentPane(); content.setLayout(new FlowLayout());
  • content = frame.getContentPane(); content.setLayout(new FlowLayout());
  • content = frame.contentPane content.setLayout(new FlowLayout());
  • content = frame.contentPane content.setLayout(FlowLayout());
  • content = frame.contentPane content.layout = FlowLayout()
  • JButton botonSaludar = new JButton("Saludar"); JButton botonDespedir = new JButton("Despedirse"); botonSaludar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(frame, "Hola!"); } }); botonDespedir.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(frame, "Chao!"); frame.dispose(); } }); content.add(botonSaludar); content.add(botonDespedir);
  • def saludar(event): JOptionPane.showMessageDialog(frame, "Hola!") def despedir(event): JOptionPane.showMessageDialog(frame, "Chao!") frame.dispose() content.add(JButton("Saludar", actionPerformed=saludar)) content.add(JButton("Despedirse", actionPerformed=despedir))
  • Otra demo con Swing (Si es que tenemos acceso a internet)
  • Créditos: Frank Wierzbicki
  • Web
  • Demo con Django
  • Y sólo por diversión...
  • ### View #!/usr/bin/env python from django import http """ from django.template import Template, Context WSW - the World's Shittiest Wiki. """ def wsw(request, title): import re title = urllib.unquote_plus(title) if title else "Home" import urllib p, created = Page.objects.get_or_create(title=title) from django.conf import settings form = PageForm(instance=p) if request.method == "POST": ### Config form = PageForm(request.POST, instance=p) settings.configure( form.save() DEBUG = True, return http.HttpResponseRedirect(request.get_full_path()) DATABASE_ENGINE = "doj.backends.zxjdbc.postgresql", else: DATABASE_NAME = "wsw", form = PageForm(instance=p) DATABASE_USER = "wsw", t = Template("""<h1>{{ p.title }}</h1><ul>{% for p in DATABASE_PASSWORD = "wsw", allpages %}<li><a href="{{ p }}">{{ p }}</a></li>{% endfor %} ROOT_URLCONF = __name__) </ul><form action="{{ request.get_full_path }}" method="POST"> <p>{{ form.content }}</p><input type="submit"></form>""") ### Model wikiwords = re.findall( from django.db import models '[A-Z][a-z]+[A-Z][a-z]+(?:[A-Z][a-z]+)*', p.content) allpages = [ class Page(models.Model): page.title for page in Page.objects.order_by('title')] title = models.CharField(max_length=300, allpages.extend( primary_key=True) word for word in wikiwords if word not in allpages) content = models.TextField() return http.HttpResponse(t.render(Context(locals()))) class Meta: ### Main app_label = "wsw" if __name__ == '__main__': from django.core import management ### URLs from django.db import connection from django.conf.urls.defaults import * from django.core.management.color import no_style cursor = connection.cursor() urlpatterns = patterns(__name__, ('(.*)', 'wsw')) statements, _ = connection.creation.sql_create_model( Page, no_style()) ### Form try: from django.forms import ModelForm for sql in statements: cursor.execute(sql) class PageForm(ModelForm): connection.connection.commit() class Meta: except: model = Page pass fields = ['content'] management.call_command('runserver')
  • Créditos: Jacob Kaplan-Moss
  • Testing http://www.flickr.com/photos/emotionaltoothpaste/26034597/
  • DocTests
  • def factorial(n): It must also not be ridiculously large: """Return the factorial of n, an >>> factorial(1e100) exact integer >= 0. Traceback (most recent call last): ... If the result is small enough to OverflowError: n too large fit in an int, return an int. """ Else return a long. import math >>> [factorial(n) if not n >= 0: ... for n in range(6)] raise ValueError("n must be >= 0") [1, 1, 2, 6, 24, 120] if math.floor(n) != n: >>> [factorial(long(n)) raise ValueError( ... for n in range(6)] "n must be exact integer") [1, 1, 2, 6, 24, 120] if n+1 == n: # catch a value like 1e300 >>> factorial(30) raise OverflowError("n too large") 265252859812191058636308480000000L result = 1 >>> factorial(30L) factor = 2 265252859812191058636308480000000L while factor <= n: >>> factorial(-1) result *= factor Traceback (most recent call last): factor += 1 ... return result ValueError: n must be >= 0 Factorials of floats are OK, but the float must be an exact integer: >>> factorial(30.1) Traceback (most recent call last): ... ValueError: n must be exact integer >>> factorial(30.0) 265252859812191058636308480000000L
  • Demo: DocTests + HtmlUnit
  • Demo: DocTests + HtmlUnit ¿Ah?
  • ¡Tests de Integración para web apps!
  • Oh, para eso tenemos Selenium, ¿no?
  • Ejecutar en el browser tarda muuuuucho http://www.flickr.com/photos/tambako/498552755/
  • Run headless...
  • Run headless... ...con HtmlUnit!
  • Demo: DocTests + HtmlUnit
  • Más Testing http://www.flickr.com/photos/emotionaltoothpaste/26034597/
  • ¿Por cierto, quien más usa Jython?
  • EADS http://www.flickr.com/photos/nguyendai/694158734/
  • Lockheed Martin http://www.flickr.com/photos/rcsj/2504022678/
  • ¿Y dónde puedo aprender más?
  • jythonbook.com
  • jythonbook.com
  • ¡Gracias! Contacto: @leosoto http://blog.leosoto.com
  • ¿Preguntas? Contacto: @leosoto http://blog.leosoto.com