<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7697377865612767142</id><updated>2012-05-22T08:53:31.685-05:00</updated><category term='technology'/><category term='amara'/><category term='finance'/><category term='javascript'/><category term='lilypond'/><category term='clojure'/><category term='news'/><category term='aapl'/><category term='jeos'/><category term='njug'/><category term='maven'/><category term='github'/><category term='real estate'/><category term='spring integration'/><category term='conference'/><category term='brkb'/><category term='toolbox'/><category term='grails'/><category term='git'/><category term='python'/><category term='spring'/><category term='review'/><category term='hardware'/><category term='linux'/><category term='scala'/><category term='pinball'/><category term='java'/><category term='releases'/><category term='eiul'/><category term='vmware'/><category term='spring extensions'/><category term='pondjumpers'/><category term='aop'/><category term='spring security'/><category term='mythtv'/><category term='book'/><category term='sopa'/><category term='oracle'/><category term='c'/><category term='springone'/><category term='patents'/><category term='movie'/><category term='wikipedia'/><category term='hard'/><category term='software'/><category term='spring python'/><category term='ssl'/><category term='gd'/><category term='plugins'/><category term='jython'/><category term='pythontestingcookbook'/><category term='cvx'/><category term='compiler'/><title type='text'>Greetings Programs</title><subtitle type='html'>&lt;b&gt;Greetings Programs&lt;/b&gt;&lt;br&gt;
&lt;small&gt;Searching the universe of software development for answers&lt;/small&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/-/spring+python'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/search/label/spring%20python'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/-/spring+python/-/spring+python?start-index=26&amp;max-results=25'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>26</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-8072016119340438620</id><published>2011-12-21T19:44:00.000-06:00</published><updated>2011-12-21T19:44:01.741-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><title type='text'>Spring Python 1.1.1, 1.2.1, and 1.3.0.RC1 are released</title><content type='html'>See my official blog entry at&amp;nbsp;&lt;a href="http://blog.springsource.org/2011/12/20/spring-python-1-1-1-1-2-1-and-1-3-0-rc1-are-released/"&gt;http://blog.springsource.org/2011/12/20/spring-python-1-1-1-1-2-1-and-1-3-0-rc1-are-released/&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-8072016119340438620?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/8072016119340438620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2011/12/spring-python-111-121-and-130rc1-are.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/8072016119340438620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/8072016119340438620'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2011/12/spring-python-111-121-and-130rc1-are.html' title='Spring Python 1.1.1, 1.2.1, and 1.3.0.RC1 are released'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-6751753145232812842</id><published>2011-07-13T07:42:00.001-05:00</published><updated>2011-07-24T15:21:18.301-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><title type='text'>Sorry Planet Python</title><content type='html'>I just moved all the blogs I wrote about &lt;a href="http://springpython.webfactional.com/"&gt;Spring Python&lt;/a&gt; over here, and asked Michael Foord to update Planet Python's feed to point hear instead. I forgot that it would probably repost everything. Well I guess it's kind of like an extra media blitz. &lt;br /&gt;&lt;br /&gt;Just so you are up to date:&lt;br /&gt;- Spring Python is at release 1.2.0.Final&lt;br /&gt;- We support Python 2.6+ (but not 3+ yet)&lt;br /&gt;- Visit Packt Publishing's website and you can order a copy of my book, &lt;b&gt;Spring Python 1.1&lt;/b&gt;, of which probably everything works. It just doesn't show the newer features. &lt;br /&gt;&lt;br /&gt;For more project details, forums, or documentation, visit &lt;a href="http://springpython.webfactional.com/"&gt;http://springpython.webfactional.com&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-6751753145232812842?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/6751753145232812842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2011/07/sorry-planet-python.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/6751753145232812842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/6751753145232812842'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2011/07/sorry-planet-python.html' title='Sorry Planet Python'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-7638930628162607192</id><published>2010-05-11T04:35:00.000-05:00</published><updated>2011-07-12T10:42:29.188-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='releases'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>Spring Python 1.1.0 released</title><content type='html'>The final release of Spring Python 1.1.0 is out. Spring Python takes the concepts of Spring and applies them to the &lt;a href="http://python.org"&gt;Python&lt;/a&gt;. This includes functionality like dependency injection, aspect oriented programming, data access, transaction management, security, remoting, and even python-to-java-to-python communication through JMS.&lt;br/&gt;&lt;br/&gt;Spring Python has been growing since 2006 and was the first &lt;a href="http://www.springsource.org/extensions"&gt;Spring Extension&lt;/a&gt; to go live. The project thrives with&lt;a href="http://forum.springsource.org/forumdisplay.php?f=45"&gt; community involvement&lt;/a&gt;. The biggest thanks go to our fellow committers: Dariusz Suchojad and Sven Wilhelm. You can also follow postings at &lt;a href="http://twitter.com/springpython"&gt;http://twitter.com/springpython&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;There is also a &lt;a href="https://www.packtpub.com/create-powerful-versatile-spring-python-1-1-applications/book"&gt;Spring Python 1.1 book&lt;/a&gt; to help both Java and Python coders alike come to grips with the functionality offered by Spring Python. It covers all the major functional pieces of Spring Python (except the JMS part which is very new) and includes two case studies with lots of code and high level diagrams.&lt;br/&gt;&lt;br/&gt;The following is a list of issues worked during this major release:&lt;br/&gt;&lt;h2 style="font-size: 1.8em; padding: 0px; margin: 0px;"&gt;Bug&lt;/h2&gt;&lt;br/&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 2em; padding: 0px;"&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-99"&gt;SESPRINGPYTHONPY-99&lt;/a&gt;] - PyroServiceExporter daemon shutting down abruptly in Python 2.6&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-100"&gt;SESPRINGPYTHONPY-100&lt;/a&gt;] - SpringWiki's non-XML configuration doesn't match the XML app context&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-107"&gt;SESPRINGPYTHONPY-107&lt;/a&gt;] - Iterating over set configurations in the container not handled properly.&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-113"&gt;SESPRINGPYTHONPY-113&lt;/a&gt;] - Break dependency of ApplicationContext on Pyro&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-129"&gt;SESPRINGPYTHONPY-129&lt;/a&gt;] - Add springpython.jms to setup.py's list of packages&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-130"&gt;SESPRINGPYTHONPY-130&lt;/a&gt;] - Discovered that trying to access SecurityContextHolder information was broken inside&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-101"&gt;SESPRINGPYTHONPY-101&lt;/a&gt;] - Incorrect imports and a password typo in "Data Access" docs CherryPy app&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;h2 style="font-size: 1.8em; padding: 0px; margin: 0px;"&gt;Improvement&lt;/h2&gt;&lt;br/&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 2em; padding: 0px;"&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-98"&gt;SESPRINGPYTHONPY-98&lt;/a&gt;] - Migrate modules based on amara to ElementTree&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-106"&gt;SESPRINGPYTHONPY-106&lt;/a&gt;] - Add TRACE logging level&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-111"&gt;SESPRINGPYTHONPY-111&lt;/a&gt;] - Move InitializingObject from springpython.factory to springpython.&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-114"&gt;SESPRINGPYTHONPY-114&lt;/a&gt;] - Move amara import statement inside XML-based parsers, move pyyaml inside YamlConfig&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-119"&gt;SESPRINGPYTHONPY-119&lt;/a&gt;] - List all external dependencies in the ref docs&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-126"&gt;SESPRINGPYTHONPY-126&lt;/a&gt;] - Update the documentation to use v. 1.1 XMLConfig XSD schema&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-133"&gt;SESPRINGPYTHONPY-133&lt;/a&gt;] - Add support for SSL JMS w/ WebSphereMQ&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-136"&gt;SESPRINGPYTHONPY-136&lt;/a&gt;] - Stop using Amazon's S3 browse site, and replace it with SpringSource's&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-102"&gt;SESPRINGPYTHONPY-102&lt;/a&gt;] - Patch to make top-level build.py OS-independent&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-136"&gt;SESPRINGPYTHONPY-136&lt;/a&gt;] - Stop using Amazon's S3 browse site, and replace it with SpringSource's&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;h2 style="font-size: 1.8em; padding: 0px; margin: 0px;"&gt;New Feature&lt;/h2&gt;&lt;br/&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 2em; padding: 0px;"&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-12"&gt;SESPRINGPYTHONPY-12&lt;/a&gt;] - Investigate creating JmsTemplate&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-97"&gt;SESPRINGPYTHONPY-97&lt;/a&gt;] - Create a YAML-based IoC configuration parser&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-105"&gt;SESPRINGPYTHONPY-105&lt;/a&gt;] - Add DisposableObject&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-108"&gt;SESPRINGPYTHONPY-108&lt;/a&gt;] - Add lazy_init as option to @Object&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-121"&gt;SESPRINGPYTHONPY-121&lt;/a&gt;] - Add LDAP support to security module (CPython)&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-127"&gt;SESPRINGPYTHONPY-127&lt;/a&gt;] - Implement abstract objects&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-132"&gt;SESPRINGPYTHONPY-132&lt;/a&gt;] - Add JMS SimpleMessageListenerContainer&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-95"&gt;SESPRINGPYTHONPY-95&lt;/a&gt;] - Add dictionary support to DatabaseTemplate queries&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-103"&gt;SESPRINGPYTHONPY-103&lt;/a&gt;] - SQLServerConnectionFactory&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;h2 style="font-size: 1.8em; padding: 0px; margin: 0px;"&gt;Refactoring&lt;/h2&gt;&lt;br/&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 2em; padding: 0px;"&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-128"&gt;SESPRINGPYTHONPY-128&lt;/a&gt;] - Cleanup CherryPy-specific classes, dependencies and overall hierarchy&lt;/li&gt;&lt;br/&gt;	&lt;li style="padding: 0px; margin: 0px;"&gt;[&lt;a style="cursor: pointer; text-decoration: none; color: #003300;" href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-137"&gt;SESPRINGPYTHONPY-137&lt;/a&gt;] - get_last_traceback duplicates existing functionality&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-7638930628162607192?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/7638930628162607192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2010/05/spring-python-110-released.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/7638930628162607192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/7638930628162607192'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2010/05/spring-python-110-released.html' title='Spring Python 1.1.0 released'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-3539289010204382750</id><published>2010-04-23T10:12:00.002-05:00</published><updated>2011-07-15T12:12:46.350-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><title type='text'>There is no better time write than now</title><content type='html'>&lt;div class="posterous_autopost"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-uWE8ZRFfXnQ/TiB0NGB9vZI/AAAAAAAAAC8/eAo1VKsKykQ/s1600/IMG_0002.jpg.scaled1000.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-uWE8ZRFfXnQ/TiB0NGB9vZI/AAAAAAAAAC8/eAo1VKsKykQ/s320/IMG_0002.jpg.scaled1000.jpg" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;I just handed our keys and garage door opener to the title company. Doing this while writing a book highlights how easy it is in this day and Internet age to really work from a laptop. As stressful as these last couple of days have been, I'm glad I decided to write. If you want to write, I encourage you to do the same!      &lt;br /&gt;&lt;div style="font-size: 10px;"&gt;&lt;a href="http://posterous.com/"&gt;Posted via web&lt;/a&gt;   from &lt;a href="http://springpythonbook.com/there-is-no-better-time-write-than-now"&gt;Spring Python Book&lt;/a&gt;  &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-3539289010204382750?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/3539289010204382750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2010/04/there-is-no-better-time-write-than-now.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/3539289010204382750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/3539289010204382750'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2010/04/there-is-no-better-time-write-than-now.html' title='There is no better time write than now'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-uWE8ZRFfXnQ/TiB0NGB9vZI/AAAAAAAAAC8/eAo1VKsKykQ/s72-c/IMG_0002.jpg.scaled1000.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-5709839306770730785</id><published>2010-04-07T06:17:00.000-05:00</published><updated>2011-07-12T10:42:29.189-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='releases'/><title type='text'>Spring Python 1.1.0.RC1 released</title><content type='html'>&lt;div&gt;&lt;br/&gt;&lt;br/&gt;See &lt;a href="http://www.springsource.org/node/2490"&gt;http://www.springsource.org/node/2490&lt;/a&gt; for the official notice.&lt;br/&gt;&lt;br/&gt;Spring Python takes the concepts of &lt;a href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/"&gt;the Spring Framework&lt;/a&gt; and applies them to Python. This includes features like dependency injection, aop, remoting, data access, transactions, and security, all with a non-invasiveness style.&lt;br/&gt;&lt;br/&gt;This is the first release candidate for version 1.1. We are quickly approaching final release. You can read more detail with the online documentation (see official notice for more links, as well as the sidebars of this blog). You can also pre-order your copy of the &lt;a href="https://www.packtpub.com/create-powerful-versatile-spring-python-1-1-applications/book"&gt;Spring Python 1.1 from Packt Publishing&lt;/a&gt;, due for release in June 2010.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Improvement&lt;/strong&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-136"&gt;SESPRINGPYTHONPY-136&lt;/a&gt;] - Stop using Amazon's S3 browse site, and replace it with SpringSource's&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-5709839306770730785?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/5709839306770730785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2010/04/spring-python-110rc1-released.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/5709839306770730785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/5709839306770730785'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2010/04/spring-python-110rc1-released.html' title='Spring Python 1.1.0.RC1 released'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-7667360011792803062</id><published>2010-04-02T04:51:00.000-05:00</published><updated>2011-07-12T10:42:29.189-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='releases'/><title type='text'>Spring Python 1.1.0.M2 is released</title><content type='html'>See &lt;a href="http://www.springsource.org/node/2489"&gt;http://www.springsource.org/node/2489&lt;/a&gt; for the official notice.&lt;br/&gt;&lt;br/&gt;Spring Python takes the concepts of &lt;a href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/"&gt;the Spring Framework&lt;/a&gt; and applies them to Python. This includes features like dependency injection, aop, remoting, data access, transactions, and security, all with a non-invasiveness style.&lt;br/&gt;&lt;br/&gt;This is the last planned milestone for version 1.1. We are quickly approaching final release. You can read more detail with the online documentation (see official notice for more links, as well as the sidebars of this blog). You can also pre-order your copy of the &lt;a href="https://www.packtpub.com/create-powerful-versatile-spring-python-1-1-applications/book"&gt;Spring Python 1.1 from Packt Publishing&lt;/a&gt;, due for release in June 2010.&lt;br/&gt;&lt;h1&gt;Release Notes&lt;/h1&gt;&lt;br/&gt;&lt;h2&gt;Bug&lt;/h2&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-99"&gt;SESPRINGPYTHONPY-99&lt;/a&gt;] -         PyroServiceExporter daemon shutting down abruptly in Python 2.6&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-100"&gt;SESPRINGPYTHONPY-100&lt;/a&gt;] -         SpringWiki's non-XML configuration doesn't match the XML app context&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-107"&gt;SESPRINGPYTHONPY-107&lt;/a&gt;] -         Iterating over set configurations in the container not handled properly.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-113"&gt;SESPRINGPYTHONPY-113&lt;/a&gt;] -         Break dependency of ApplicationContext on Pyro&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-129"&gt;SESPRINGPYTHONPY-129&lt;/a&gt;] -         Add springpython.jms to setup.py's list of packages&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-130"&gt;SESPRINGPYTHONPY-130&lt;/a&gt;] -         Discovered that trying to access SecurityContextHolder information was broken inside CherryPy app&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;h2&gt;Improvement&lt;/h2&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-98"&gt;SESPRINGPYTHONPY-98&lt;/a&gt;] -         Migrate modules based on amara to ElementTree&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-106"&gt;SESPRINGPYTHONPY-106&lt;/a&gt;] -         Add TRACE logging level&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-111"&gt;SESPRINGPYTHONPY-111&lt;/a&gt;] -         Move InitializingObject from springpython.factory to springpython.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-114"&gt;SESPRINGPYTHONPY-114&lt;/a&gt;] -         Move amara import statement inside XML-based parsers, move pyyaml inside YamlConfig&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-119"&gt;SESPRINGPYTHONPY-119&lt;/a&gt;] -         List all external dependencies in the ref docs&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-126"&gt;SESPRINGPYTHONPY-126&lt;/a&gt;] -         Update the documentation to use v. 1.1 XMLConfig XSD schema&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-133"&gt;SESPRINGPYTHONPY-133&lt;/a&gt;] -         Add support for SSL JMS w/ WebSphereMQ&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-136"&gt;SESPRINGPYTHONPY-136&lt;/a&gt;] -         Disable attempts to access s3browse since it no longer exists&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;h2&gt;New Feature&lt;/h2&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-12"&gt;SESPRINGPYTHONPY-12&lt;/a&gt;] -         Investigate creating JmsTemplate&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-97"&gt;SESPRINGPYTHONPY-97&lt;/a&gt;] -         Create a YAML-based IoC configuration parser&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-105"&gt;SESPRINGPYTHONPY-105&lt;/a&gt;] -         Add DisposableObject&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-108"&gt;SESPRINGPYTHONPY-108&lt;/a&gt;] -         Add lazy_init as option to @Object&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-121"&gt;SESPRINGPYTHONPY-121&lt;/a&gt;] -         Add LDAP support to security module (CPython)&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-127"&gt;SESPRINGPYTHONPY-127&lt;/a&gt;] -         Implement abstract objects&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-132"&gt;SESPRINGPYTHONPY-132&lt;/a&gt;] -         Add JMS SimpleMessageListenerContainer&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;h2&gt;Refactoring&lt;/h2&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-128"&gt;SESPRINGPYTHONPY-128&lt;/a&gt;] -         Cleanup CherryPy-specific classes, dependencies and overall hierarchy&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="https://jira.springsource.org/browse/SESPRINGPYTHONPY-137"&gt;SESPRINGPYTHONPY-137&lt;/a&gt;] -         get_last_traceback duplicates existing functionality&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-7667360011792803062?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/7667360011792803062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2010/04/spring-python-110m2-is-released.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/7667360011792803062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/7667360011792803062'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2010/04/spring-python-110m2-is-released.html' title='Spring Python 1.1.0.M2 is released'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-6844686700114764887</id><published>2010-02-03T10:04:00.000-06:00</published><updated>2011-07-12T10:42:29.190-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>Pre-order your copy of Spring Python 1.1 book today!</title><content type='html'>&lt;a href="http://www.packtpub.com/create-powerful-versatile-spring-python-1-1-applications/book"&gt;&lt;img src="https://www.packtpub.com/images/100x123/1849510660.png" alt="Spring Python 1.1" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.packtpub.com/create-powerful-versatile-spring-python-1-1-applications/book"&gt;Pre-order your copy of the Spring Python book!&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;"Create powerful and versatile Spring Python applications using pragmatic libraries and useful abstractions&lt;br/&gt;	&lt;li&gt;Maximize the use of Spring features in Python and develop impressive Spring Python applications&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Explore the versatility of Spring Python by integrating it with frameworks, libraries, and tools&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Discover the non-intrusive Spring way of wiring together Python components&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Packed with hands-on-examples, case studies, and clear explanations for better understanding"&lt;/li&gt;&lt;br/&gt;Visit the Packt Publishing site for more details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-6844686700114764887?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/6844686700114764887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2010/02/pre-order-your-copy-of-spring-python-11.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/6844686700114764887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/6844686700114764887'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2010/02/pre-order-your-copy-of-spring-python-11.html' title='Pre-order your copy of Spring Python 1.1 book today!'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-1531551267759143765</id><published>2010-01-22T08:15:00.000-06:00</published><updated>2011-07-12T10:42:29.190-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='releases'/><title type='text'>Spring Python 1.1.0.M1 Released</title><content type='html'>See &lt;a href="http://www.springsource.org/node/2282"&gt;http://www.springsource.org/node/2282&lt;/a&gt; for the official announcement.&lt;br/&gt;&lt;br/&gt;I chatted with Mark Pollack earlier this week and asked if we wouldn't mind me taking over. He said no problem, and I was able to get keys later to push releases up to SpringSource's S3 site.&lt;br/&gt;&lt;br/&gt;This release is first milestone in our new 1.1 baseline. More features, improvements, and enhancements will be coming out with the next milestone, as we work towards getting this released.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-1531551267759143765?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/1531551267759143765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2010/01/spring-python-110m1-released.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/1531551267759143765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/1531551267759143765'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2010/01/spring-python-110m1-released.html' title='Spring Python 1.1.0.M1 Released'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-1017992946550383248</id><published>2009-12-12T07:05:00.000-06:00</published><updated>2011-07-12T10:42:29.190-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>I'm going to work for SpringSource</title><content type='html'>Starting January 11th, I'm going to be working for &lt;a href="http://www.springsource.com/"&gt;SpringSource&lt;/a&gt;. I told my daughter and look what she had to say!&lt;br/&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://blog.springpython.webfactional.com/wp-content/uploads/2009/12/DSC05391.JPG"&gt;&lt;img class="size-full wp-image-294 aligncenter" title="Audrey_heart_spring" src="http://blog.springpython.webfactional.com/wp-content/uploads/2009/12/DSC05391.JPG" alt="Audrey_heart_spring" width="336" height="448" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: left;"&gt;I'm glad she approves.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: left;"&gt;No, they didn't hire me to work on Spring Python. That is still in my spare time. Hopefully, I can become sponsor and not have to bug Mark Pollack.&lt;/p&gt;&lt;br/&gt;&lt;p style="text-align: left;"&gt;Anyway, my first assignment will involve working on integration between tcServer and some of SpringSource's management products. I can't wait!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-1017992946550383248?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/1017992946550383248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2009/12/i-going-to-work-for-springsource.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/1017992946550383248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/1017992946550383248'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2009/12/i-going-to-work-for-springsource.html' title='I&amp;#39;m going to work for SpringSource'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-2760040924981602818</id><published>2009-10-15T08:59:00.000-05:00</published><updated>2011-07-12T10:42:29.191-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='jython'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>See how Spring Python works with Jython</title><content type='html'>I recently completed a patch that replaces the &lt;a href="http://www.xml3k.org/Amara"&gt;amara library&lt;/a&gt; with python's default &lt;a href="http://docs.python.org/library/xml.etree.elementtree.html"&gt;elementTree library&lt;/a&gt;. As much as I like amara's API, its C-extension basis was unacceptable. I just merged the patch into the trunk, and verified it works with &lt;a href="http://jython.org/"&gt;Jython&lt;/a&gt; 2.5.1.FINAL. When Spring Python's 1.1.0.M2 release comes out, we will be Jython-compatible.&lt;br/&gt;&lt;br/&gt;With this change, there were only a couple of tweaks to the rest of Spring Python.&lt;br/&gt;&lt;br/&gt;What does this mean? How about looking at some code to see how we can start with a Java app, and migrate things over to Python. To kick this off, let's start with an uber-contrived example Java app: a wiki engine. The wiki engine calls into a data access layer in order to look up some statistics on the site.&lt;br/&gt;&lt;pre lang="java"&gt;public interface DataAccess {&lt;br/&gt;&lt;br/&gt;        public void statistics();&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;public class MySqlDataAccess implements DataAccess {&lt;br/&gt;&lt;br/&gt;        public void statistics() {&lt;br/&gt;                System.out.println("MySQL: You are calling for some statistics.");&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;public class WikiService {&lt;br/&gt;&lt;br/&gt;        private DataAccess dataAccess;&lt;br/&gt;&lt;br/&gt;        public DataAccess getDataAccess() {&lt;br/&gt;                return this.dataAccess;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        public void setDataAccess(DataAccess dataAccess) {&lt;br/&gt;                this.dataAccess = dataAccess;&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        public void calculateWikiStats() {&lt;br/&gt;                System.out.println("You are passing through a pure Java WikiService...");&lt;br/&gt;                dataAccess.statistics();&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;}&lt;/pre&gt;&lt;br/&gt;Let's assume this is a Spring app. That means we need an XML application context. Let's create one and call it &lt;strong&gt;javaBeans.xml&lt;/strong&gt;.&lt;br/&gt;&lt;pre lang="xml" escaped="true"&gt;&lt;br/&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br/&gt;&lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br/&gt;       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br/&gt;       xsi:schemaLocation="http://www.springframework.org/schema/beans&lt;br/&gt;           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"&gt;&lt;br/&gt;&lt;br/&gt;        &lt;bean id="dataAccess" class="MySqlDataAccess"/&gt;&lt;br/&gt;&lt;br/&gt;        &lt;bean id="wikiService" class="WikiService"&gt;&lt;br/&gt;                &lt;property name="dataAccess" ref="dataAccess"/&gt;&lt;br/&gt;        &lt;/bean&gt;&lt;br/&gt;&lt;br/&gt;&lt;/beans&gt;&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;&lt;br/&gt;We can start up our pure java app along with its context by writing jython script &lt;strong&gt;javabeans.py&lt;/strong&gt;. It uses Spring Python's &lt;a href="http://springpython.webfactional.com/1.1.x/reference/html/objects.html#objects-config-springjava"&gt;SpringJavaConfig parser&lt;/a&gt;.&lt;br/&gt;&lt;pre lang="python"&gt;if __name__ == "__main__":&lt;br/&gt;    from springpython.context import ApplicationContext&lt;br/&gt;    from springpython.config import SpringJavaConfig&lt;br/&gt;    ctx = ApplicationContext(SpringJavaConfig("javaBeans.xml"))&lt;br/&gt;    service = ctx.get_object("wikiService")&lt;br/&gt;    service.calculateWikiStats()&lt;/pre&gt;&lt;br/&gt;We just need to compile the java code, and then run our script using jython.&lt;br/&gt;&lt;pre lang="bash"&gt;gregturn@startrek:~$ javac *.java&lt;br/&gt;gregturn@startrek:~$ jython javabeans.py&lt;br/&gt;You are passing through a pure Java WikiService...&lt;br/&gt;MySQL: You are calling for some statistics.&lt;br/&gt;gregturn@startrek:~$&lt;/pre&gt;&lt;br/&gt;Okay, we're off to a good start. We have tapped a running java system.  For our next step, let's write a pure python version of the data access code and put it into &lt;strong&gt;Py.py&lt;/strong&gt;.&lt;br/&gt;&lt;pre lang="python"&gt;import DataAccess&lt;br/&gt;&lt;br/&gt;class MySqlDataAccess(DataAccess):&lt;br/&gt;    def statistics(self):&lt;br/&gt;        print "PyMySQL: You are calling for some statistics."&lt;br/&gt;&lt;br/&gt;class StubDataAccess(DataAccess):&lt;br/&gt;    def statistics(self):&lt;br/&gt;        print "PyStub: You are calling for some statistics."&lt;/pre&gt;&lt;br/&gt;Now, to really crank things up a bit, let's migrate from the Spring Java XML configuration over to Spring Python's &lt;a href="http://springpython.webfactional.com/1.1.x/reference/html/objects.html#objects-config-object"&gt;pure Python container&lt;/a&gt;.&lt;br/&gt;&lt;pre lang="python"&gt;from springpython.config import PythonConfig, Object&lt;br/&gt;from Py import MySqlDataAccess&lt;br/&gt;import WikiService&lt;br/&gt;&lt;br/&gt;class WikiProductionAppConfig(PythonConfig):&lt;br/&gt;    def __init__(self):&lt;br/&gt;        PythonConfig.__init__(self)&lt;br/&gt;&lt;br/&gt;    @Object&lt;br/&gt;    def data_access(self):&lt;br/&gt;        return MySqlDataAccess()&lt;br/&gt;&lt;br/&gt;    @Object&lt;br/&gt;    def wiki_service(self):&lt;br/&gt;        results = WikiService()&lt;br/&gt;        results.dataAccess = self.data_access()&lt;br/&gt;        return results&lt;br/&gt;&lt;br/&gt;if __name__ == "__main__":&lt;br/&gt;    from springpython.context import ApplicationContext&lt;br/&gt;    ctx = ApplicationContext(WikiProductionAppConfig())&lt;br/&gt;    service = ctx.get_object("wiki_service")&lt;br/&gt;    service.calculateWikiStats()&lt;/pre&gt;&lt;br/&gt;The top half of our &lt;strong&gt;mixed.py&lt;/strong&gt; script contains an IoC container, except there is no XML whatsoever. Instead, its raw python. You can see how we are also using our python version of &lt;strong&gt;MySqlDataAccess&lt;/strong&gt;.&lt;br/&gt;&lt;pre lang="bash"&gt;gregturn@startrek:~$ jython mixed.py&lt;br/&gt;You are passing through a pure Java WikiService...&lt;br/&gt;PyMySQL: You are calling for some statistics.&lt;br/&gt;gregturn@startrek:~$&lt;/pre&gt;&lt;br/&gt;This shows that we are still using the pure java &lt;strong&gt;WikiService &lt;/strong&gt;class, and it calls into our pure python &lt;strong&gt;MySqlDataAccess&lt;/strong&gt;.&lt;br/&gt;&lt;br/&gt;Another useful feature that Spring Python provides is easy access to &lt;a href="http://pyro.sourceforge.net/"&gt;Pyro&lt;/a&gt;, the Python Remote Objects library. This library is for making RPC calls from Python-to-Python. Spring Python makes it easy to link clients and services together with Pyro.&lt;br/&gt;&lt;br/&gt;First, let's take our wiki service, and export it with a server script.&lt;br/&gt;&lt;pre lang="python"&gt;&lt;br/&gt;from springpython.config import PythonConfig, Object&lt;br/&gt;from springpython.remoting.pyro import *&lt;br/&gt;&lt;br/&gt;from Py import MySqlDataAccess&lt;br/&gt;import WikiService&lt;br/&gt;&lt;br/&gt;class WikiProductionAppConfig(PythonConfig):&lt;br/&gt;    def __init__(self):&lt;br/&gt;        PythonConfig.__init__(self)&lt;br/&gt;&lt;br/&gt;    @Object&lt;br/&gt;    def data_access(self):&lt;br/&gt;        return MySqlDataAccess()&lt;br/&gt;&lt;br/&gt;    @Object&lt;br/&gt;    def wiki_service(self):&lt;br/&gt;        results = WikiService()&lt;br/&gt;        results.dataAccess = self.data_access()&lt;br/&gt;        return results&lt;br/&gt;&lt;br/&gt;    @Object&lt;br/&gt;    def exported_wiki_service(self):&lt;br/&gt;        return PyroServiceExporter(service=self.wiki_service(), service_name="wiki", service_port=9000)&lt;br/&gt;&lt;br/&gt;if __name__ == "__main__":&lt;br/&gt;    from springpython.context import ApplicationContext&lt;br/&gt;    print "Starting up exported WikiService..."&lt;br/&gt;    ctx = ApplicationContext(WikiProductionAppConfig())&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;&lt;br/&gt;We made some slight tweaks to the IoC container by adding &lt;strong&gt;exported_wiki_service&lt;/strong&gt;. It targets &lt;strong&gt;wiki_service&lt;/strong&gt;, and links it with a name and port to expose it as a Pyro service. Spring Python by default will instantiate every object, so in this case, it creates the PyroProxyExporter. Because this isn't the caller, we don't need to fetch anything from the context.&lt;br/&gt;&lt;br/&gt;Next, let's code a client to call our service.&lt;br/&gt;&lt;br/&gt;&lt;pre lang="python"&gt;&lt;br/&gt;from springpython.config import PythonConfig, Object&lt;br/&gt;from springpython.remoting.pyro import *&lt;br/&gt;&lt;br/&gt;class WikiProductionAppConfig(PythonConfig):&lt;br/&gt;    def __init__(self):&lt;br/&gt;        PythonConfig.__init__(self)&lt;br/&gt;&lt;br/&gt;    @Object&lt;br/&gt;    def wiki_service(self):&lt;br/&gt;        results = PyroProxyFactory()&lt;br/&gt;        results.service_url="PYROLOC://localhost:9000/wiki"&lt;br/&gt;        return results&lt;br/&gt;&lt;br/&gt;if __name__ == "__main__":&lt;br/&gt;    from springpython.context import ApplicationContext&lt;br/&gt;    ctx = ApplicationContext(WikiProductionAppConfig())&lt;br/&gt;    service = ctx.get_object("wiki_service")&lt;br/&gt;    service.calculateWikiStats()&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;&lt;br/&gt;Now, let's start up the server.&lt;br/&gt;&lt;br/&gt;&lt;pre lang="bash"&gt;&lt;br/&gt;gregturn@startrek:~$ jython mixed_with_pyro_server.py &amp;&lt;br/&gt;[1] 4953&lt;br/&gt;Starting up exported WikiService...&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;&lt;br/&gt;The script is backgrounded, because it is running a Pyro daemon advertising our service. Now, let's launch the client script.&lt;br/&gt;&lt;pre lang="bash"&gt;&lt;br/&gt;gregturn@startrek:~$ jython mixed_with_pyro_client.py&lt;br/&gt;You are passing through a pure Java WikiService...&lt;br/&gt;PyMySQL: You are calling for some statistics.&lt;br/&gt;gregturn@startrek:~$&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;&lt;br/&gt;As you can see, our client makes remote to the exported WikiService, which happens to be a pure java service. The java service then calls our python version of MySqlDataAccess to do its statistics call. This goes to show how easy Spring Python makes it mix and match Java and Python.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-2760040924981602818?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/2760040924981602818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2009/10/see-how-spring-python-works-with-jython.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/2760040924981602818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/2760040924981602818'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2009/10/see-how-spring-python-works-with-jython.html' title='See how Spring Python works with Jython'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-6663152498311869681</id><published>2009-09-24T03:22:00.000-05:00</published><updated>2011-07-12T10:42:29.191-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Welcome Sven Wilhelm!</title><content type='html'>I wanted to introduce another team member: Sven Wilhelm. We just granted him commit privileges this week. Sven has been using Spring Python as a core piece of his team's system. He has been doing a bit of work on making Spring Python work with Jython (which I'm VERY interested in!), as well as working on a Spring Python Ldap module. With Sven on the team, we will be able to make these parts available to you as well.&lt;br/&gt;&lt;br/&gt;Sven, thanks for joining the Spring Python team!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-6663152498311869681?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/6663152498311869681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2009/09/welcome-sven-wilhelm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/6663152498311869681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/6663152498311869681'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2009/09/welcome-sven-wilhelm.html' title='Welcome Sven Wilhelm!'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-7006186952643194005</id><published>2009-09-15T11:29:00.000-05:00</published><updated>2011-07-12T10:42:29.192-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Welcome Dariusz Suchojad</title><content type='html'>I want to welcome our newest team member: Dariusz Suchojad. He has coded several patches in the past, including support for SQLServer. You will notice his name in the credits at the top of the reference docs (&lt;a href="http://springpython.webfactional.com/1.1.x/reference/html/index.html"&gt;http://springpython.webfactional.com/1.1.x/reference/html/index.html&lt;/a&gt;). I submitted a request today that he be given commit rights to Spring Python's code base.&lt;br/&gt;&lt;br/&gt;He is working on some new Spring Python features as well. Dariusz, thanks for joining Spring Python!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-7006186952643194005?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/7006186952643194005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2009/09/welcome-dariusz-suchojad.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/7006186952643194005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/7006186952643194005'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2009/09/welcome-dariusz-suchojad.html' title='Welcome Dariusz Suchojad'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-1590239144752796804</id><published>2009-08-18T04:05:00.000-05:00</published><updated>2011-07-12T10:42:29.192-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Spring Python's website gets a major upgrade</title><content type='html'>I recently upgraded Spring Python's project page from being a &lt;a href="http://oldsite.springpython.webfactional.com/"&gt;statically generated maven-based&lt;/a&gt; website to a dynamic &lt;a href="http://springpython.webfactional.com/"&gt;drupal-based CMS&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-1590239144752796804?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/1590239144752796804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2009/08/spring-python-website-gets-major.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/1590239144752796804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/1590239144752796804'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2009/08/spring-python-website-gets-major.html' title='Spring Python&amp;#39;s website gets a major upgrade'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-636881366141213431</id><published>2009-08-10T11:34:00.000-05:00</published><updated>2011-07-12T10:42:29.192-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>VMware set to buy SpringSource</title><content type='html'>Rod Johnson posted a blog entry today that is also sweeping the twitterverse, indicating that they &lt;a href="http://blog.springsource.com/2009/08/10/springsource-chapter-two/"&gt;"have signed a definitive agreement with VMware, who will acquire SpringSource"&lt;/a&gt;. It says that the Spring Framework software will remain as free as ever. That should be the case, and I haven't seen reason to doubt SpringSource would do anything differently.&lt;br/&gt;&lt;br/&gt;Considering SpringSource has been at play using venture capital to grow its business and enter markets, this should definitely be a sign of success. A lot of startup companies get venture capital, but die off through the fact that no bigger company seeks them. This is definitely the opposite. The way I see it, SpringSource has succeeded by getting acquired by a well known company. One thing is keen in the article: both SpringSource and VMware have their eyes on the cloud computing market. And given their successful record, I think they can do pretty well.&lt;br/&gt;&lt;br/&gt;I don't know what VMware thinks about python, but I sure will keep me ears open. This project isn't slowing down!&lt;br/&gt;&lt;br/&gt;UPDATE: Acquisition is complete. Read all about it at &lt;a href="http://www.vmware.com/company/news/releases/springsource-close.html"&gt;http://www.vmware.com/company/news/releases/springsource-close.html&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-636881366141213431?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/636881366141213431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2009/08/vmware-set-to-buy-springsource.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/636881366141213431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/636881366141213431'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2009/08/vmware-set-to-buy-springsource.html' title='VMware set to buy SpringSource'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-2236585535902603149</id><published>2009-07-02T16:17:00.000-05:00</published><updated>2011-07-12T10:42:29.193-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='aop'/><category scheme='http://www.blogger.com/atom/ns#' term='movie'/><title type='text'>Ever seen two robots discuss AOP in python?</title><content type='html'>I couldn't resist using &lt;a href="http://www.xtranormal.com/"&gt;this website to put together a little movie&lt;/a&gt;. What is better than a couple of robots discussing aspect oriented programming in python? (This was based on my earlier post &lt;a href="http://blog.springpython.webfactional.com/2009/03/23/the-case-for-aop-in-python/"&gt;The Case forAOP in Python&lt;/a&gt;)&lt;br/&gt;&lt;br/&gt;&lt;object width="480" height="390"&gt;&lt;param name="movie" value="http://www.xtranormal.com/players/jwplayer.swf"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;param name="flashvars"value="height=390&amp;width=480&amp;file=http://newvideos.xtranormal.com/standard/56824444-674d-11de-8382-003048d6740d_9_standard_medium-flv.flv&amp;image=http://newvideos.xtranormal.com/standard/56824444-674d-11de-8382-003048d6740d_9_standard_poster.jpg&amp;link=http://www.xtranormal.com/watch?e=20090702183743953&amp;searchbar=false&amp;autostart=false"/&gt;&lt;embed src="http://www.xtranormal.com/players/jwplayer.swf" width="480" height="390" allowscriptaccess="always" allowfullscreen="true" flashvars="height=390&amp;width=480&amp;file=http://newvideos.xtranormal.com/standard/56824444-674d-11de-8382-003048d6740d_9_standard_medium-flv.flv&amp;image=http://newvideos.xtranormal.com/standard/56824444-674d-11de-8382-003048d6740d_9_standard_poster.jpg&amp;link=http://www.xtranormal.com/watch?e=20090702183743953&amp;searchbar=false&amp;autostart=false"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;object width="480" height="390"&gt;&lt;param name="movie" value="http://www.xtranormal.com/players/embedded-xnl-stats.swf"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.xtranormal.com/players/embedded-xnl-stats.swf" width="1" height="1" allowscriptaccess="always"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br/&gt;&lt;br/&gt;Okay, maybe its a little stiff, but you have to admit that putting this together on a web page is pretty cool!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-2236585535902603149?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/2236585535902603149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2009/07/ever-seen-two-robots-discuss-aop-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/2236585535902603149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/2236585535902603149'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2009/07/ever-seen-two-robots-discuss-aop-in.html' title='Ever seen two robots discuss AOP in python?'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-7211776117701319765</id><published>2009-07-01T16:33:00.000-05:00</published><updated>2011-07-12T10:42:29.193-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='releases'/><title type='text'>Spring Python makes final 1.0.0 release</title><content type='html'>Please read the &lt;a href="http://www.springsource.org/node/1676"&gt;official press release from SpringSource&lt;/a&gt; about this historic release of Spring Python. Please visit http://www.springsource.com/download/community in order to download a copy. NOTE: Spring Python has now been relocated to the top level, instead of being inside &lt;strong&gt;EXT&lt;/strong&gt;.&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;It's the first Spring Extension to reach live status and also progress to a stable 1.0.0 final release.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;The trunk has been updated to allow work on next major release 1.1 to begin. This means we aren't through, but just getting started.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Another branch has been created to support backporting critical fixes into the 1.0 baseline, meaning it will have the same type of strong support as other SpringSource projects.&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;This demonstrates that Spring Python has a nicely honed development process, committed to providing stable APIs, while also focusing on new and innovative changes. While we have worked hard since the start of this project back in 2006, we still lots of ideas and have plenty more work to do.&lt;br/&gt;&lt;br/&gt;I wish to thank Mark Pollack, the current sponsor of Spring Python and code geek that developed &lt;a href="http://springframework.net/"&gt;Spring .NET&lt;/a&gt;, for coming on board quickly, and supporting me in every way possible to get this release wrapped up and pushed out for everyone to use. I also want to thank &lt;a href="http://russmiles.com"&gt;Russ Miles&lt;/a&gt;, former SpringSource consultant, who has supported me for over the past year with encouragement and feedback. I also thank the community for its valuable comments, questions, and suggestions that has helped steer this project in a positive direction.&lt;br/&gt;&lt;br/&gt;Key changes used to this release include:&lt;br/&gt;&lt;h2&gt;Improvement&lt;/h2&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="http://jira.springsource.org/browse/SESPRINGPYTHONPY-96"&gt;SESPRINGPYTHONPY-96&lt;/a&gt;] - When making builds, use "." as separator between version and tag; support python 2.4/2.5/2.6&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;h2&gt;Task&lt;/h2&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="http://jira.springsource.org/browse/SESPRINGPYTHONPY-56"&gt;SESPRINGPYTHONPY-56&lt;/a&gt;] - Assess impact of python's deprecation of md5 and sha modules to spring python's security segment&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-7211776117701319765?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/7211776117701319765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2009/07/spring-python-makes-final-100-release.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/7211776117701319765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/7211776117701319765'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2009/07/spring-python-makes-final-100-release.html' title='Spring Python makes final 1.0.0 release'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-5039437172828320921</id><published>2009-06-11T04:10:00.000-05:00</published><updated>2011-07-12T10:42:29.194-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Is Spring Python a framework or a library?</title><content type='html'>I was tracking some comments, and recently noticed a &lt;a href="http://listas.aditel.org/archivos/python-es/2009-June/024859.html"&gt;thread of discussion&lt;/a&gt; (&lt;a href="http://translate.google.com/translate?prev=hp&amp;amp;hl=en&amp;amp;js=n&amp;amp;u=http%3A%2F%2Flistas.aditel.org%2Farchivos%2Fpython-es%2F2009-June%2F024859.html&amp;amp;sl=es&amp;amp;tl=en&amp;amp;history_state0="&gt;in English&lt;/a&gt;) on a python mailing list. This is a follow-up to someone else posting about his discovery of Spring Python through the &lt;a href="http://www.springsource.org/node/1482"&gt;news announcement&lt;/a&gt; from SpringSource. (I appreciated that the person also caught on to my article &lt;a href="http://blog.springpython.webfactional.com/2009/03/23/the-case-for-aop-in-python/"&gt;defending the usage of AOP in python&lt;/a&gt;.)&lt;br/&gt;&lt;br/&gt;They concluded their response by indicating:&lt;br/&gt;&lt;blockquote&gt;Aunque para convencerme de usarlo todavía le falta compararse con otros frameworks de python.&lt;/blockquote&gt;&lt;br/&gt;(Run this through Google Translate if you need to.) Apparently, this person, while slightly impressed that I wasn't coding in horrible java paradigms, didn't see enough to use this instead of &lt;em&gt;&lt;strong&gt;other python frameworks&lt;/strong&gt;&lt;/em&gt;.  I knew that he was comparing it to other python &lt;em&gt;&lt;strong&gt;web &lt;/strong&gt;&lt;/em&gt;frameworks.&lt;br/&gt;&lt;h1&gt;History Lesson&lt;/h1&gt;&lt;br/&gt;I started thinking about the basis of all this, and realized a little bit of a history lesson is in order. Anybody who has ever heard of Spring, knows it by its full name, The Spring Framework. This should help illuminate why Spring is referred to as a framework, and why Spring Python is often thought of as a framework itself.&lt;br/&gt;&lt;br/&gt;Starting around 1999, the first EJB spec came out. This was the technology everyone in the java industry started using, and people were throwing together any and all java web apps using EJBs. It caused a resurgance in the value of java, and arguably catapulted java into the enterprise space. EJBs promised much. The application servers that would run your EJB-based app had many features, like transactions, security, failover, messaging, and web services to name a few. All you had to do was extend a &lt;em&gt;&lt;strong&gt;few &lt;/strong&gt;&lt;/em&gt;interfaces, write a &lt;em&gt;&lt;strong&gt;few &lt;/strong&gt;&lt;/em&gt;configuration files, and do a &lt;em&gt;&lt;strong&gt;little &lt;/strong&gt;&lt;/em&gt;configuration to the app server.&lt;br/&gt;&lt;br/&gt;Well, that was how it was &lt;em&gt;&lt;strong&gt;supposed &lt;/strong&gt;&lt;/em&gt;to be, right? The truth was, EJB apps required &lt;em&gt;&lt;strong&gt;lots &lt;/strong&gt;&lt;/em&gt;of XML file configuration. Each container had deviations, so your app tended to be container-specific. People usually had too many services turned on, and unit testing was next to impossible. You couldn't test your app outside the container, so turn around time to see your changes was a nightmare. That is what generated the flurry of frameworks, like Struts, to help make EJB app development simpler. By extending these framework's classes, you had a little bit less to extend, less to write, and less to configure. But you still had to do it anyway. And that turn around time to test your app? No better. And you had to make your &lt;strong&gt;WHOLE &lt;/strong&gt;app do this. There was no such thing as, "Part of my app is using Struts, another part is using Wicket."&lt;br/&gt;&lt;br/&gt;Then in 2002, Rod Johnson, a java software consultant, wrote a book &lt;a href="http://www.amazon.com/Expert-One-Design-Development-Programmer/dp/0764543857"&gt;Expert One-on-One J2EE Development without EJB&lt;/a&gt;. When Rod's book hit the shelves, the message he was sending was completely unorthodox. He showed tactics of code development that quickly made these container-based services obsolete. You didn't have to extend anyone's classes. And...you didn't have to adopt any framework lock-stock-and-barrel. Instead, your app could be 99% based on POJOs. The code he was writing for examples in the book was very pragmatic, and was just like the other frameworks, only it was a framework based on POJOs. Another consultant approached Rod about releasing that software as an open source project, and thus was born &lt;strong&gt;The Spring Framework&lt;/strong&gt;.&lt;br/&gt;&lt;br/&gt;This code, while acting similar in output as other frameworks, had a peculiar difference: it did not require actually extending anybody's classes. In fact, you could write your code 99% framework-free, and &lt;em&gt;&lt;strong&gt;Rod &amp;amp; Co. encouraged this&lt;/strong&gt;&lt;/em&gt;.&lt;br/&gt;&lt;h1&gt;"So...is Spring a framework or a library?"&lt;/h1&gt;&lt;br/&gt;I argue: &lt;em&gt;&lt;strong&gt;both!&lt;/strong&gt;&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;Considering that a library is a set of functions and classes you download and install in your software development toolbox, Spring fits this perfectly. It was inspired by the need to overcome the lethargic development process of the EJB spec. Not only did they improve over EJB's way of doing things, they also enhanced JDBC, JDNI, JMX, and other things.&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;Ben Alex decided to develop a Security library based on the pragmatic concepts behind Spring, which has since become the most widely adopted security solution for java.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Mark Pollack was also watching Spring cut through the java industry and coded a similar solution for C#/.NET and called it Spring .NET.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;...and the list goes on of other widely adopted libraries/tools developed for the java industry based on Spring's approach to solving problems&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;So, yes, Spring is a library. &lt;strong&gt;But it is ALSO a framework&lt;/strong&gt;, in that its original intention was to faciliate building enterprise-grade web applications inside EJB containers. They simply showed that the servlet container was enough. In fact, many shops started fresh adopted the concept of using Apache Tomcat or Jetty as the servlet container, which has been challening the commerical app server market. Combined with the fact that your app could run inside and outside an EJB container, and also be easily JUnit-tested without the slow make-deploy cycle made it a hit.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;And...its NOT a framework!&lt;/strong&gt;&lt;br/&gt;&lt;h1&gt;"But, you just SAID Spring is a framework!"&lt;/h1&gt;&lt;br/&gt;Yeah, I know I did, but many people interpret framework as code meant to be extended. Spring doesn't require this. It may accomplish the same end result as these other EJB frameworks, but through simpler means. I know this first hand, because I have developed thick Java client apps using Swing. No EJB container to be found! And yet, I have found Spring provided much leverage and functionality. I didn't have to extend anything. Okay...I had a unique situation involving security where I needed to extend a Spring Security interface, but 99% of my code doesn't do that. And that's the point.&lt;br/&gt;&lt;h1&gt;"Enough Java already! I thought this was a Python blog!"&lt;/h1&gt;&lt;br/&gt;Okay, if you're still reading, it means you are really a cross technology buff. Or maybe you just read blogs instead of &lt;a href="http://xkcd.com/303/"&gt;sword fighting while waiting while waiting for your code to compile&lt;/a&gt;. Otherwise, you freaked that I spent so much time talking about Java, XML, EJBS, and fled the scene. Well, I'm a polyglot programmer. I use all kinds of stuff: C/C++, Java, Python, Tcl/Tk/Expect, PERL, bash/csh, jython, scala, groovy, clojure, anything! Actually, I had never heard the term until I saw Russ's Skills Matter presentation where he presented himself as an "self professed, unapologetic, polyglot programmer". But I immediately connected with it.&lt;br/&gt;&lt;br/&gt;Anyway, the point I'm trying to make is that the concepts Rod presented are of incredible value. Its not the fact that he was working in Java, but instead the idea that pragmatism is valuable. Instead of always resting comfortably against specs, we need to always be on the lookout for places and paradigms where we are wasting countless cycles in coding and re-coding the same thing. I contend that repetition is one of the top ranking source of bugs, if not the highest.&lt;br/&gt;&lt;h1&gt;I believe Spring Python is a library&lt;/h1&gt;&lt;br/&gt;My first entry into the world of Spring was through their fabulous &lt;a href="http://static.springsource.org/spring/docs/3.0.x/reference/html/jdbc.html#jdbc-JdbcTemplate"&gt;JdbcTemplate&lt;/a&gt;. Writing SQL queries without leaking cursors and connections was of high important to me. When I decided to code  a carputer application, I picked Python because reading &lt;a href="http://diveintopython.org/"&gt;Dive Into Python&lt;/a&gt; had sold me on the beauty of it. However, I quickly realized I was missing my lean-and-mean JdbcTemplate. I started coding a &lt;a href="http://springpython.webfactional.com/reference/html/dao.html"&gt;DatabaseTemplate &lt;/a&gt;to help me, and realized I was starting to do something just like Rod. Well, I decided then and there to share my &lt;strong&gt;&lt;em&gt;library &lt;/em&gt;&lt;/strong&gt;with anyone who was interested. Hope it helps you like it has helped me.&lt;br/&gt;&lt;blockquote&gt;I think, and it's not a mockery, that the Java world is rather a framework type of environment which leads usually to have as many frameworks as you have developers for the very reason I described above. Python has also its share of frameworks but the language is flexible enough to encourage libraries. I *strongly* believe that Python Spring[&lt;em&gt;sic&lt;/em&gt;] has both functionalities that could be attractive to many developers while having the chance of doing so as a library rather than a framework. --Sylvain while &lt;a href="http://forum.springsource.org/showpost.php?p=195707&amp;amp;postcount=2"&gt;commenting about Spring Python w/CherryPy 3&lt;/a&gt;&lt;/blockquote&gt;&lt;br/&gt;And that's why I call it &lt;strong&gt;Spring Python&lt;/strong&gt;. It takes the &lt;strong&gt;cool concepts of Spring&lt;/strong&gt;, and write them in a &lt;strong&gt;slick-and-quick, pythonic library&lt;/strong&gt;. And yes, it is a library.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-5039437172828320921?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/5039437172828320921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2009/06/is-spring-python-framework-or-library.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/5039437172828320921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/5039437172828320921'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2009/06/is-spring-python-framework-or-library.html' title='Is Spring Python a framework or a library?'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-1984995461720633415</id><published>2009-06-04T04:20:00.000-05:00</published><updated>2011-07-12T10:42:29.194-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wikipedia'/><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><title type='text'>Is Spring Python notable enough to keep its wikipedia article?</title><content type='html'>Spring Python has had a &lt;a href="http://en.wikipedia.org/wiki/Spring_Python"&gt;wikipedia article&lt;/a&gt; for some time. I know, I wrote it. Today, someone has &lt;a href="http://en.wikipedia.org/wiki/Wikipedia:Articles_for_deletion/Spring_Python"&gt;proposed deleting the article&lt;/a&gt;, citing that  the it doesn't establish its notability. I encourage anyone interested to put in their $0.02. However, please do NOT go rabid. Whether you think this fits wikipedia's criteria for an individual article or not, please put in your opinion backed up by links to resources, while following wikipedia's guide for article deletion (as show on the site).&lt;br/&gt;&lt;br/&gt;Please vote your conscience. What am I trying to say? If you think Spring Python is good, but doesn't fit their criteria of an article, go ahead and vote it down. If you think this project has something unique and distinct, then vote it up. (Can anyone say unobtrusive AOP?) A key factor is that there is about 7 days before they will make a decision of which way to go, so if you're going to vote, please vote soon.&lt;br/&gt;&lt;br/&gt;Personally, I would like to keep the article. But it's not the end of the world if its deleted, because &lt;a href="http://blog.springpython.webfactional.com"&gt;this blog&lt;/a&gt;, the &lt;a href="http://springpython.webfactional.com/"&gt;official website&lt;/a&gt;, and our &lt;a href="http://springpython.webfactional.com/source-repository.html"&gt;source code repository&lt;/a&gt; are the heart and sole of this project. Whatever your opinion is, if you only express it here on this blog, it won't influence the vote on whether or not to delete this article.&lt;br/&gt;&lt;br/&gt;Thanks everyone,&lt;br/&gt;&lt;br/&gt;Greg Turnquist, Spring Python project lead&lt;br/&gt;&lt;h2&gt;UPDATE:&lt;/h2&gt;&lt;br/&gt;The wikipedia article has been deleted.&lt;br/&gt;&lt;br/&gt;00:05, 18 June 2009 &lt;a title="User:Cirt" href="http://en.wikipedia.org/wiki/User:Cirt"&gt;Cirt&lt;/a&gt; &lt;span&gt;(&lt;a title="User talk:Cirt" href="http://en.wikipedia.org/wiki/User_talk:Cirt"&gt;talk&lt;/a&gt; | &lt;a title="Special:Contributions/Cirt" href="http://en.wikipedia.org/wiki/Special:Contributions/Cirt"&gt;contribs&lt;/a&gt;)&lt;/span&gt; deleted "&lt;a title="Spring Python (page does not exist)" href="http://en.wikipedia.org/w/index.php?title=Spring_Python&amp;amp;action=edit&amp;amp;redlink=1"&gt;Spring Python&lt;/a&gt;" ‎ &lt;span&gt;(&lt;a title="Wikipedia:Articles for deletion/Spring Python" href="http://en.wikipedia.org/wiki/Wikipedia:Articles_for_deletion/Spring_Python"&gt;Wikipedia:Articles for deletion/Spring Python&lt;/a&gt;)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-1984995461720633415?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/1984995461720633415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2009/06/is-spring-python-notable-enough-to-keep.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/1984995461720633415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/1984995461720633415'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2009/06/is-spring-python-notable-enough-to-keep.html' title='Is Spring Python notable enough to keep its wikipedia article?'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-2308775707078345513</id><published>2009-06-03T08:44:00.000-05:00</published><updated>2011-07-12T10:42:29.194-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='releases'/><title type='text'>Spring Python 1.0.0 (RC2) is released</title><content type='html'>&lt;h3&gt;What is Spring Python?&lt;/h3&gt;&lt;br/&gt;For those of you new to this project, Spring Python takes the concepts implemented by the Spring Framework (Java), and applies them to Python. This provides a powerful library of functionality to help you get back to writing the code that makes you money. You can visit Spring Python's &lt;a href="http://springpython.webfactional.com/"&gt;official web page&lt;/a&gt;, or &lt;a href="http://www.springsource.com/download/community?project=Spring%20Extensions"&gt;skip right to the downloads&lt;/a&gt;.&lt;br/&gt;&lt;h3&gt;You're Late!&lt;/h3&gt;&lt;br/&gt;Yes, we're a tad late. Okay, we're really late, but in case you fell off the planet, SpringSource &lt;a href="http://www.russmiles.com/home/2009/5/21/its-not-you-its-me-really-a-fond-farewell-to-my-friends-at-s.html" target="_blank"&gt;lost a valuable member of its team, Russ Miles&lt;/a&gt;, who was also the sponsor for this project. There were other high priority things happening, so considering this is an extension, it took a little longer than usual to get to making a release. Which brings me to my next point. I want to welcome &lt;a href="http://blog.springsource.com/author/mpollack/" target="_blank"&gt;Mark Pollack&lt;/a&gt; as the new sponsor for this extension. He is the code geek that developed &lt;a href="http://www.springframework.net/" target="_blank"&gt;Spring .NET&lt;/a&gt;. I have had the benefit of meeting him at least year's SpringOne Americas conference and attending his presentation, and we have also corresponded over email and IM.&lt;br/&gt;&lt;h3&gt;So what's in this release?&lt;/h3&gt;&lt;br/&gt;You can scroll down to see the release notes. There actually isn't much change in the code. We are trying to freeze things into a stable API. However, one thing not listed was a key problem we had to solve with &lt;strong&gt;coily&lt;/strong&gt;. coily is the command-line tool that let's you download Spring Python plugins. Coily was having trouble handling data hosted on the S3 servers used to stage these downloads, so I had to fix it. It now offers you the correct name.&lt;br/&gt;&lt;br/&gt;When you query this version to see what plugins are available, you should see this:&lt;br/&gt;&lt;pre lang="csh"&gt;$ ./coily --list-available-plugins&lt;br/&gt;Coily v1.0.0 - the command-line management tool for Spring Python&lt;br/&gt;===============================================================================&lt;br/&gt;Copyright 2006-2008 SpringSource (http://springsource.com), All Rights Reserved&lt;br/&gt;Licensed under the Apache License, Version 2.0&lt;br/&gt;&lt;br/&gt;Available plugins:&lt;br/&gt;        gen-cherrypy-app        springpython-plugin-gen-cherrypy-app-1.0.0-RC1.tar.gz   2009-01-22 18:08&lt;br/&gt;        gen-cherrypy-app        springpython-plugin-gen-cherrypy-app-1.0.0-RC2.tar.gz   2009-06-03 18:23&lt;/pre&gt;&lt;br/&gt;You may be seeing two copies listed here, but when you try to install, it will grab RC2's version.&lt;br/&gt;&lt;h3&gt;Release Notes&lt;/h3&gt;&lt;br/&gt;Release Notes - SX Spring Python - Version 1.0.0-RC2&lt;br/&gt;&lt;h3&gt;Improvement&lt;/h3&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="http://jira.springsource.org/browse/SESPRINGPYTHONPY-92"&gt;SESPRINGPYTHONPY-92&lt;/a&gt;] -         Show more examples of using pure python IoC configuration&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;h3&gt;Task&lt;/h3&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="http://jira.springsource.org/browse/SESPRINGPYTHONPY-90"&gt;SESPRINGPYTHONPY-90&lt;/a&gt;] -         Update trove categorization from Beta to Production/Stable&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;[&lt;a href="http://jira.springsource.org/browse/SESPRINGPYTHONPY-91"&gt;SESPRINGPYTHONPY-91&lt;/a&gt;] -         Create minimal documentation for Hessian remoting&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;h3&gt;What is coming next?&lt;/h3&gt;&lt;br/&gt;Well, I have been in contact with a company in Germany that is using Spring Python as a key piece of their software solution. They have even granted me access to view their code base. It is exciting seeing them in action, especially since they are writing some extensions to Spring Python and also experimenting with using it inside Jython.&lt;br/&gt;&lt;br/&gt;What does this boil down to? Community feedback is a key ingredient to finding out what features need to be added, modified and improved.  Through IM and email, we have already identified some mods to &lt;strong&gt;DatabaseTemplate&lt;/strong&gt; supporting &lt;a href="http://jira.springframework.org/browse/SESPRINGPYTHONPY-95"&gt;convention-over-configuration&lt;/a&gt;, and have already coded a &lt;strong&gt;SimpleRowMapper&lt;/strong&gt;. If your POPO's attributes match the column names of a query, you &lt;strong&gt;don't&lt;/strong&gt; need to create a custom RowMapper. Instead, plug-in this one, and it will link them together, without requiring you to extend any of Spring Python's classes.&lt;br/&gt;&lt;pre lang="python" line="1"&gt;self.databaseTemplate.query(&lt;br/&gt;                            "select name, category from animal",&lt;br/&gt;                            rowhandler=SimpleRowMapper(testSupportClasses.Animal))&lt;/pre&gt;&lt;br/&gt;&lt;strong&gt;SimpleRowMapper &lt;/strong&gt;only needs a class name. It will instantiate one of these classes for each row, and then populates the &lt;strong&gt;name &lt;/strong&gt;and &lt;strong&gt;category &lt;/strong&gt;attributes with the results of the query.&lt;br/&gt;&lt;br/&gt;There is also a DictionaryRowMapper, which returns a list of dictionaries, instead of tuples. The key point is that convention-over-configuration has become an accepted way to rapidly write essential code without getting caught up the details, and Spring Python embraces this concept.&lt;br/&gt;&lt;br/&gt;There is just one wrinkle to make this work: the API used in RowMapper has a slight change (we added metadata as an optional attribute). Since 1.0 is a frozen API, and we are trying to get to a final release, Sven and I agreed to put this change into Spring Python v1.1, so for now, you can only get it from our source repository. Stay tuned for updates!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-2308775707078345513?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/2308775707078345513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2009/06/spring-python-100-rc2-is-released.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/2308775707078345513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/2308775707078345513'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2009/06/spring-python-100-rc2-is-released.html' title='Spring Python 1.0.0 (RC2) is released'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-2065881787546087108</id><published>2009-04-28T02:13:00.000-05:00</published><updated>2011-07-12T10:42:29.195-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='springone'/><title type='text'>SpringOne Europe - Wish I Could Be There</title><content type='html'>Well, I was able to make it to the SpringOne Americas conference back in December 2008. And I knew I would hunger to be at the &lt;a href="http://europe.springone.com/europe-2009"&gt;SpringOne Europe conference&lt;/a&gt; this year. This time, though, since I got into &lt;a href="http://twitter.com/gregturn"&gt;twitter&lt;/a&gt;, I have been able to keep my thumb on the pulse by watching &lt;a href="http://search.twitter.com/search?q=%23springone"&gt;twitter on the #springone channel&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;It makes me feel almost like I'm there.&lt;br/&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;So far, I have been tracking Ben Alex's &lt;a href="http://blog.zepag.org/2007/06/spring-one-day3-roo.html"&gt;Spring ROO framework&lt;/a&gt;.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Oracle = "A tax on old Java technology" - Rod Johnson (overheard on twitter)&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;SpringSource Tool Suite will be free for all developers.&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;br/&gt;Okay, I'm not going to give you everything (and I don't KNOW everything). If you can make it to a SpringOne conference, trust me...it's awesome. However, if not, then at least follow along twitter for some of the bits.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-2065881787546087108?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/2065881787546087108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2009/04/springone-europe-wish-i-could-be-there.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/2065881787546087108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/2065881787546087108'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2009/04/springone-europe-wish-i-could-be-there.html' title='SpringOne Europe - Wish I Could Be There'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-1547635817934491716</id><published>2009-03-23T05:20:00.000-05:00</published><updated>2011-07-12T10:42:29.195-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='aop'/><title type='text'>The case for AOP in Python</title><content type='html'>There are many articles out there about AOP and python, and consequently, several AOP solutions for python are offered. The spectrum is broad, ranging from "python doesn't need AOP" to "python has enough language features to do AOP without framework code" to "AOP works great with python" to "AOP is just another thing built for static languages someone is trying to bolt onto python".&lt;br/&gt;&lt;br/&gt;&lt;a href="http://mail.python.org/pipermail/python-list/2004-April/259863.html"&gt;Someone made a good point back in 2004 on a python mailing list&lt;/a&gt; that AOP is a paradigm, not a specific framework, and that if we are going to argue against AOP in python, then it opens the door to arguing over OOP, and in turn, probably every paradigm that we know. Are you ready to throw out python classes and do everything functionally?&lt;br/&gt;&lt;br/&gt;When Jim Moore gave his SpringSource presentation at my company a few weeks ago, he gave an excellent description of AOP: its a way to get the computer to help you drop in functionality where its needed, with minimal effort on your part.&lt;br/&gt;&lt;br/&gt;Way back in the stone ages, we wrote programs based on how the CPU thinks: one line of code translates directly to one line of CPU instruction. As programs got bigger and bigger, we exceeded the ability to track a whole program. We needed to trim things down into smaller bites, so we could focus on one piece of logic at a time. Someone came up with the idea of combining a class of functionality based on data, and thus OOP was born. New programming paradigm; however, the CPUs are still pretty much the same. Did we worry about this? Of course! There were scores of debates on the merit of OOP. We had the compilers able to translate OOP into sequences of instructions, and just built OOP-aware tools to give us the right visibility. When the next generation of developers arrived, OOP was nothing new, and it has become a part of history.&lt;br/&gt;&lt;br/&gt;AOP is another way to avoid DRY (don't repeat yourself). As we write more sophisticated applications, we still find areas where the same riff of code needs to be sprinkled in several places. If we needed to update the code, we don't want to edit it in 95 different places, and unfortunately, OOP can't solve everything, considering its vertical-nature. We have already built compilers than can convert our OOP/AOP/structural programs into a sequence of steps for the CPU to execute. We just need the tools to help us maintain the right perspective. And...we need to wait for the next generation of developers to arrive to cement it into history. In my opinion, writing off AOP as "only needed by java developers" is akin to burying your head in the sand.&lt;br/&gt;&lt;br/&gt;It is true that different languages have differing levels on how easily they can support the AOP paradigm. I agree that python is very adept, which is part of the reason that it took less time for me to implement an AOP solution than it possibly took to implement the Java-based one. I would generalize that other dynamic languages are probably quick as well for that.&lt;br/&gt;&lt;br/&gt;Python has shown in many articles, that &lt;a href="http://www.ibm.com/developerworks/linux/library/l-pymeta.html"&gt;metaclass programming&lt;/a&gt;, &lt;a href="http://stackoverflow.com/questions/286958/any-aop-support-library-for-python"&gt;using decorators&lt;/a&gt;, and some of the &lt;a href="http://livingcode.org/2009/02/24/aspect-oriented-python"&gt;new python 2.5/2.6/3.0 constructs help as well&lt;/a&gt;. It depends on what you are doing. If you are in complete control of all source code, you have more options. Metaclass programming is possible, as are decorators.&lt;br/&gt;&lt;br/&gt;Sometimes, you don't control all the parts. You can read a whole thread, where a &lt;a href="http://forum.springframework.org/showthread.php?t=62965"&gt;Spring Python newbie wanted to add a simple interceptor to an existing library&lt;/a&gt;, and trace a certain operation. Spring Python's AOP module makes this very easy, because it works after the fact. Metaclass programming and usage of decorators would be very hard, unless you were willing to touch the library's actual code. One key aspect that Spring Python seeks is to be non-obtrusive. Some of the other AOP libraries for python tend to require edits to the code itself.&lt;br/&gt;&lt;br/&gt;Regardless of which library you use, the ability to easily intercept code and in turn add functionality based on a controlled pattern is nothing new. We needed OOP to accomplish this in some areas. We need AOP in others. And knowing how to utilize the full extension of a language sums it up. We need the ability to apply functionality at the right time, in the right place, without repeating ourselves.&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming"&gt;http://en.wikipedia.org/wiki/Aspect-oriented_programming&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://springpython.webfactional.com/reference/html/aop.html"&gt;http://springpython.webfactional.com/reference/html/aop.html&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="https://fisheye.springframework.org/browse/se-springpython-py/trunk/springpython/src/springpython/aop"&gt;https://fisheye.springframework.org/browse/se-springpython-py/trunk/springpython/src/springpython/aop&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-1547635817934491716?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/1547635817934491716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2009/03/case-for-aop-in-python.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/1547635817934491716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/1547635817934491716'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2009/03/case-for-aop-in-python.html' title='The case for AOP in Python'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-2368422044545309790</id><published>2009-02-09T03:10:00.000-06:00</published><updated>2011-07-12T10:42:29.196-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Spring Python's blog site moved to Wordpress</title><content type='html'>I was enjoying running the blog site with b2evolution, but decided to spend the last few days switching over to wordpress. It has been pretty much smooth sailing. I was really happy to find that someone had already ported the theme to wordpress. Basically, the only thing I sacrificed were the user comments. It was just too much effort, and not enough talk threads to manage. I have been digging through plugins, and already have OpenID working. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-2368422044545309790?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/2368422044545309790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2009/02/spring-python-blog-site-moved-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/2368422044545309790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/2368422044545309790'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2009/02/spring-python-blog-site-moved-to.html' title='Spring Python&amp;#39;s blog site moved to Wordpress'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-5955411891907972835</id><published>2009-02-01T02:17:00.000-06:00</published><updated>2011-07-12T10:42:29.196-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Why use Spring Python and not just plain python?</title><content type='html'>I have bumped into articles and &lt;a href="http://translate.google.com/translate?prev=hp&amp;amp;hl=en&amp;amp;u=http%3A%2F%2Fwww.python-forum.de%2Ftopic-17579.html&amp;amp;sl=de&amp;amp;tl=en"&gt;forum postings&lt;/a&gt;, &lt;a href="http://www.dennis-kempin.de/python/dependency-injection-in-python/"&gt;blog entries&lt;/a&gt;, &lt;a href="http://www.traceback.org/2008/09/08/ann-snake-guice-preview-a-dependency-injection-framework/"&gt;other blog entries&lt;/a&gt;, and &lt;a href="http://www.traceback.org/2009/01/01/article-help-dependency-injection-in-python/"&gt;yet more blog entries&lt;/a&gt;. In fact, while writing this blog entry, someone posed the question "&lt;a href="http://forum.springframework.org/showthread.php?t=66660"&gt;what is the aim of Spring Python?&lt;/a&gt;" (Click and see my answer.) There are a diverse range of view points, and many in disagreement about the viability of DI in python.&lt;br/&gt;&lt;br/&gt;Many of these opinions raise a good question. Why do you need some complicated thing like Spring Python when you could be using pure python to do your job? I was very impressed with Jamis' article &lt;a href="http://weblog.jamisbuck.org/2008/11/9/legos-play-doh-and-programming"&gt;LEGOs, Play-Doh, and Programming&lt;/a&gt;. The core question is, why use complicated Java idioms that can be easily and dynamically expressed in pure ruby? I value this article because it encourages me to recheck my assumptions and ideas. It doesn't matter how good your solution is. If you built it on a platform of invalid, unwise, or ridiculous assumptions, you probably aren't going anywhere fast.&lt;br/&gt;&lt;h3&gt;So, what ARE my assumptions?&lt;/h3&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;Being able to apply extra services to my code without touching the code is good.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Being able to inject test dummies into my code without editing my code is good.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Simplifying and reducing code volume is good.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Using fancy tricks that are hard to read the next day is bad.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Using Problem A's solution for Problem B without analysis is dumb.&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;I want to compare this against what some people may think my assumptions are.&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;XML is the way to configure everything.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Java's solutions are perfect for Python.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Dependency Injection should be used for every problem.&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;Let's look at this in closer detail. Hopefully, I can show some insight into places where I think Spring Python can help, and other places it would be overkill to use it. Nothing works everywhere, right?&lt;br/&gt;&lt;h3&gt;Being able to apply extra services to my code without touching the code is good - &lt;em&gt;True&lt;/em&gt;&lt;/h3&gt;&lt;br/&gt;The first couple of things I can think of are transactions and security. These are functions, that when you implement them by hand, are a pain in the neck! You keep writing the same boilerplate plumbing code wrapping logical blocks, and you have to do it right every time, or you may find yourself in a big hole.&lt;br/&gt;&lt;br/&gt;Sure, any part of your code not working correctly is an issue. But this isn't YOUR code we are talking about. This is simply a layer of protection you are trying to wrap around code to make it safe. There isn't a whole lot of logic in transactions or security, just simple, copy-and-pasted stuff you need. And we know what risk we are at when copy-and-paste starts happening.&lt;br/&gt;&lt;br/&gt;That is the definite code smell that AOP is needed. Spring Python provides an AOP solution. You can write any type of advice you need. But considering how prevalant transactions and security are, we went ahead and coded a flexible, pythonic way to do it.&lt;br/&gt;&lt;br/&gt;But don't forget. The premise is that this is applied without modifying your working code or your calling code. If only we could have something that sat between the business code and the "main" function that calls the code, which managed instantiation of dependencies, and which we could modify with no impact.....you mean, like an IoC container?&lt;br/&gt;&lt;br/&gt;I know what you're thinking. "Oh no! Not that XML stuff! I want to stick to python." Who said you have to use XML? You can code your transactions &lt;a href="http://springpython.webfactional.com/reference/html/transaction.html#transaction-at-transactional"&gt;simply using python decorators and a pure python container&lt;/a&gt;. XML is only provided to help people coming from Java-land migrate to Python. Some people like XML. Some people don't. Its a choice, not a requirement.&lt;br/&gt;&lt;br/&gt;I know there is something else to consider. If I'm using TDD and I am spotting the places where I need to make changes, why can't I just make the changes right then and there? If there is only one time and one place where you are injecting your AOP advice, you are probably right. It is when you need to apply one piece of advice in multiple places where you start doing the copy-and-paste routine. And when you need to add more advice, and repeat this whole process over again where things get costly. Instead, one refactoring to expose that service as an injection point, and you can easily adjust things in the future.&lt;br/&gt;&lt;h3&gt;Being able to inject test dummies into my code without editing my code is good - &lt;em&gt;True&lt;/em&gt;&lt;/h3&gt;&lt;br/&gt;Testability of dynamic code is key. We preach that dynamic typing works, provided you adequately test your code. If you remember anything from your computer engineering courses in college, the more components you have, the greater the number of permutations of state. Being able to isolate functionality is the way to increase confidence in test cases, and that means we need to be able to replace production dependencies with test doubles.&lt;br/&gt;&lt;br/&gt;It is easy to get caught up in the "I want to inject everything" hype. Don't! Instead, only inject key things. TDD will expose what test doubles you want to inject, and thus what parts need to be wired by IoC. If your application is small enough, you may not need any at all. And that's alright! Perhaps you start off, and all you need to inject is a database test double. Assuming you have defined &lt;strong&gt;MyApp&lt;/strong&gt; and &lt;strong&gt;DataAccess&lt;/strong&gt;, your container definition can be as simple as:&lt;br/&gt;&lt;pre lang="python"&gt;class MyAppContext(PythonConfig):&lt;br/&gt;    def __init__(self):&lt;br/&gt;        super(MyAppContext, self).__init__()&lt;br/&gt;&lt;br/&gt;    @Object&lt;br/&gt;    def my_app(self):&lt;br/&gt;        return MyApp(self.data_access())&lt;br/&gt;&lt;br/&gt;    @Object&lt;br/&gt;    def data_access(self):&lt;br/&gt;        return MyDataAccess()&lt;/pre&gt;&lt;br/&gt;For your test case, you just need an alternative:&lt;br/&gt;&lt;pre lang="python"&gt;class MyTestableAppContext(MyAppContext):&lt;br/&gt;    def __init__(self):&lt;br/&gt;        super(MyTestableAppContext, self).__init__()&lt;br/&gt;&lt;br/&gt;    @Object&lt;br/&gt;    def data_access(self):&lt;br/&gt;        return DataAccessStub()&lt;/pre&gt;&lt;br/&gt;How hard was that? You just extend your existing container, overriding a key injection point, and poof! You're there with a nicely isolated, testable version of your code! I don't know about you, but that is arguably a DSL, written in pure python.&lt;br/&gt;&lt;h3&gt;Simplifying and reducing code volume is good - &lt;em&gt;True&lt;/em&gt;&lt;/h3&gt;&lt;br/&gt;I mentioned transactions earlier. Let's look at an &lt;strong&gt;ugly example of some code with transactions&lt;/strong&gt;:&lt;br/&gt;&lt;pre lang="python"&gt;class Bank:&lt;br/&gt;    def __init__(self):&lt;br/&gt;        self.factory = factory.MySQLConnectionFactory("springpython", "springpython", "localhost", "springpython")&lt;br/&gt;        self.dt = DatabaseTemplate(self.factory)&lt;br/&gt;&lt;br/&gt;    def balance(self, account_num):&lt;br/&gt;        results = self.dt.query_for_list("select BALANCE from ACCOUNT where ACCOUNT_NUM = %s", (account_num,))&lt;br/&gt;        if len(results) != 1:&lt;br/&gt;            raise InvalidBankAccount("There were %s accounts that matched %s." % (len(results), account_num))&lt;br/&gt;        return results[0][0]&lt;br/&gt;&lt;br/&gt;    def withdraw(self, amount, source_account_num):&lt;br/&gt;        if self.balance(source_account_num) &amp;lt; amount:&lt;br/&gt;            raise InsufficientFunds("Account %s did not have enough funds to transfer %s" % (source_account_num, amount))&lt;br/&gt;        self.dt.execute("update ACCOUNT set BALANCE = BALANCE - %s where ACCOUNT_NUM = %s", (amount, source_account_num))&lt;br/&gt;&lt;br/&gt;    def deposit(self, amount, target_account_num):&lt;br/&gt;        self.balance(target_account_num) # Implicitly testing for valid account number&lt;br/&gt;        self.dt.execute("update ACCOUNT set BALANCE = BALANCE + %s where ACCOUNT_NUM = %s", (amount, target_account_num))&lt;br/&gt;&lt;br/&gt;    def transfer(self, transfer_amount, source_account_num, target_account_num):&lt;br/&gt;        try:&lt;br/&gt;            cursor = self.factory.getConnection().cursor() # DB-2.0 API spec says that creating a cursor implicitly starts a transaction&lt;br/&gt;            self.withdraw(transfer_amount, source_account_num)&lt;br/&gt;            self.deposit(transfer_amount, target_account_num)&lt;br/&gt;            self.factory.getConnection().commit()&lt;br/&gt;            cursor.close() # There wasn't anything in this cursor, but it is good to close an opened cursor&lt;br/&gt;        except InvalidBankAccount, InsufficientFunds:&lt;br/&gt;            self.factory.getConnection().rollback()&lt;/pre&gt;&lt;br/&gt;If you can rip out that plumbing code, your code becomes cleaner, easier to read, and easier to maintain. The following shows the code where you don't have to explicitly manage the transaction. Instead, it is declared using a python decorator.&lt;br/&gt;&lt;pre lang="python"&gt;class Bank:&lt;br/&gt;    def __init__(self):&lt;br/&gt;        self.factory = factory.MySQLConnectionFactory("springpython", "springpython", "localhost", "springpython")&lt;br/&gt;        self.dt = DatabaseTemplate(self.factory)&lt;br/&gt;&lt;br/&gt;    def balance(self, account_num):&lt;br/&gt;        results = self.dt.query_for_list("select BALANCE from ACCOUNT where ACCOUNT_NUM = %s", (account_num,))&lt;br/&gt;        if len(results) != 1:&lt;br/&gt;            raise InvalidBankAccount("There were %s accounts that matched %s." % (len(results), account_num))&lt;br/&gt;        return results[0][0]&lt;br/&gt;&lt;br/&gt;    def withdraw(self, amount, source_account_num):&lt;br/&gt;        if self.balance(source_account_num) &amp;lt; amount:&lt;br/&gt;            raise InsufficientFunds("Account %s did not have enough funds to transfer %s" % (source_account_num, amount))&lt;br/&gt;        self.dt.execute("update ACCOUNT set BALANCE = BALANCE - %s where ACCOUNT_NUM = %s", (amount, source_account_num))&lt;br/&gt;&lt;br/&gt;    def deposit(self, amount, target_account_num):&lt;br/&gt;        self.balance(target_account_num) # Implicitly testing for valid account number&lt;br/&gt;        self.dt.execute("update ACCOUNT set BALANCE = BALANCE + %s where ACCOUNT_NUM = %s", (amount, target_account_num))&lt;br/&gt;&lt;br/&gt;    @transactional(["PROPAGATION_REQUIRED"])&lt;br/&gt;    def transfer(self, transfer_amount, source_account_num, target_account_num):&lt;br/&gt;        self.withdraw(transfer_amount, source_account_num)&lt;br/&gt;        self.deposit(transfer_amount, target_account_num)&lt;/pre&gt;&lt;br/&gt;If you focus your attention on the &lt;strong&gt;transfer&lt;/strong&gt; method, you should notice an improvement in readability. At first, maybe it doesn't like much. But try to visualize cleaning up a whole slew of transactional blocks of code you have to maintain, and the benefits starts to add up.&lt;br/&gt;&lt;br/&gt;Also, I don't know if you noticed, but the &lt;strong&gt;withdraw&lt;/strong&gt; and &lt;strong&gt;deposit&lt;/strong&gt; operations &lt;em&gt;aren't safe enough&lt;/em&gt; to be part of the public API. They need to be transactional as well. So why aren't they? Well, I wanted this to be an apples-to-apples comparison. You can't just blindly wrap the first sample of deposit with a transaction, because the transfer function may have already started a transaction. You need to test to see if you are already part of a transactions.&lt;br/&gt;&lt;br/&gt;Guess what: @transactional handles this for you. The second example is easy. &lt;strong&gt;Just put @transactional in front of withdraw and deposit and you are done.&lt;/strong&gt; The PROPAGATION_REQUIRED tag indicates a transaction will be started if one doesn't already exist. Doing this with the first example would have required hand-written code to track whether you were in or out of transactions.&lt;br/&gt;&lt;pre lang="python"&gt;class Bank:&lt;br/&gt;    def __init__(self):&lt;br/&gt;        self.factory = factory.MySQLConnectionFactory("springpython", "springpython", "localhost", "springpython")&lt;br/&gt;        self.dt = DatabaseTemplate(self.factory)&lt;br/&gt;&lt;br/&gt;    def balance(self, account_num):&lt;br/&gt;        results = self.dt.query_for_list("select BALANCE from ACCOUNT where ACCOUNT_NUM = %s", (account_num,))&lt;br/&gt;        if len(results) != 1:&lt;br/&gt;            raise InvalidBankAccount("There were %s accounts that matched %s." % (len(results), account_num))&lt;br/&gt;        return results[0][0]&lt;br/&gt;&lt;br/&gt;    @transactional(["PROPAGATION_REQUIRED"])&lt;br/&gt;    def withdraw(self, amount, source_account_num):&lt;br/&gt;        if self.balance(source_account_num) &amp;lt; amount:&lt;br/&gt;            raise InsufficientFunds("Account %s did not have enough funds to transfer %s" % (source_account_num, amount))&lt;br/&gt;        self.dt.execute("update ACCOUNT set BALANCE = BALANCE - %s where ACCOUNT_NUM = %s", (amount, source_account_num))&lt;br/&gt;&lt;br/&gt;    @transactional(["PROPAGATION_REQUIRED"])&lt;br/&gt;    def deposit(self, amount, target_account_num):&lt;br/&gt;        self.balance(target_account_num) # Implicitly testing for valid account number&lt;br/&gt;        self.dt.execute("update ACCOUNT set BALANCE = BALANCE + %s where ACCOUNT_NUM = %s", (amount, target_account_num))&lt;br/&gt;&lt;br/&gt;    @transactional(["PROPAGATION_REQUIRED"])&lt;br/&gt;    def transfer(self, transfer_amount, source_account_num, target_account_num):&lt;br/&gt;        self.withdraw(transfer_amount, source_account_num)&lt;br/&gt;        self.deposit(transfer_amount, target_account_num)&lt;/pre&gt;&lt;br/&gt;To tell you the truth, writing functional code &lt;strong&gt;I can maintain&lt;/strong&gt; is my #1 goal in software development. I have inherited many projects that were impossible to read. They worked, but because they were so poorly done, I couldn't enhance or improve them, and thus began the refactor/rewrite.&lt;br/&gt;&lt;h3 class="bTitle"&gt;Using fancy tricks that are hard to read the next day is bad - &lt;em&gt;True&lt;/em&gt;&lt;/h3&gt;&lt;br/&gt;Only use Spring Python if you need it. And only use what you need. If you really need to mark up transactions in your code, this is perfect. But if your tool doesn't need that protection, forget about it! If your tool needs rigorous testing, utilize the IoC container to inject test doubles. But if you are writing a simple admin tool, then perhaps you don't need any IoC at all. Same goes for all the features.&lt;br/&gt;&lt;br/&gt;If you need IoC and you are used to reading XML-configured app contexts (perhaps because you used to write Java code a lot), then you can easily utilize the functionality of Spring Python. But if you have been a pythonista since day one, forget about it! Use the pure python, decorator based container, and don't waste one minute on XML.&lt;br/&gt;&lt;h3 class="bTitle"&gt;Using Problem A's solution for Problem B without analysis is dumb - &lt;em&gt;True&lt;/em&gt;&lt;/h3&gt;&lt;br/&gt;Just because an AOP transactional interceptor was what you needed for Problem A, doesn't mean you need it for Problem B. And don't assume that your strategy of IoC injection points for Problem A will map cleanly to Problem B. Again, &lt;strong&gt;TDD should help you expose the injection points&lt;/strong&gt;. I can't possibly predict where you need to inject dependencies. That is what software analysis is for.&lt;br/&gt;&lt;br/&gt;Anyone can pick up and use a library. But using it for your needs (and not mine) is where judgment calls come in. Your experience in using tools to solve problems is needed to figure out what parts of Spring Python will serve your needs.&lt;br/&gt;&lt;h3 class="bTitle"&gt;XML is the way to configure everything - &lt;em&gt;False&lt;/em&gt;&lt;/h3&gt;&lt;br/&gt;This is a false assumption, and unfortunately an oft repeated one. Notice that there was no XML to be found in my samples? I stuck with pure python, using what I argue is similar to a DSL. Consider writing your code to have some fluent APIs, and the pure python IoC container can easily and efficiently wire your application together as needed. I have also done my best to update documentation to show configuring things either way. Whether or not the documentation is up-to-date, please remember, you can ALWAYS stick with pure python.&lt;br/&gt;&lt;h3 class="bTitle"&gt;Java's solutions are perfect for Python - &lt;em&gt;False&lt;/em&gt;&lt;/h3&gt;&lt;br/&gt;I already wrote how &lt;a href="http://blog.springpython.webfactional.com/index.php/2008/11/23/spring-python-isn-t-a-simple-port-of-the"&gt;Spring Python is not just a simple port&lt;/a&gt;. The idea is to &lt;strong&gt;grab higher level concepts&lt;/strong&gt; that transcend languages, and &lt;strong&gt;see where they apply&lt;/strong&gt;. Some perceive this as grabbing Java's solutions and dropping them into Python. It's not. I know a dozen or so computer languages (C, C++, Tcl, tk, expect, PERL, java, python, csh, bash, Forte 4GL, and more), and some problems I find occur no matter where I go. Some carry a similar solution, some don't. The key factor is, many of these problems need a solution that looks similar from 10,000 feet, but when you look deeper, the details are very different. That is what Spring Python strives for: solving some of the same high level concepts, where the high level perspective looks similar, but the details use the power and idioms of python. If you perceive one of my ideas as being out-of-whack, please &lt;a href="http://forum.springframework.org/forumdisplay.php?f=45"&gt;drop me a comment&lt;/a&gt;, and I will be happy to discuss it.&lt;br/&gt;&lt;h3 class="bTitle"&gt;Dependency Injection should be used for every problem - &lt;em&gt;False&lt;/em&gt;&lt;/h3&gt;&lt;br/&gt;You need look no further than at &lt;a href="https://fisheye.springframework.org/browse/se-springpython-py/tags/springpython-release-1.0.0-RC1/src/plugins/coily?r=460"&gt;coily, our command line tool&lt;/a&gt;, to see that some solutions &lt;strong&gt;don't require any Spring Python&lt;/strong&gt;. Instead, good ole' raw python does the trick. Use Spring Python sparingly, and when it improves your efficiency, NOT just for the sake of using. This is the type of critical judgment you should apply to any library you utilize. Use what you need to solve your TDD test cases, and when they pass STOP! Move away from the keyboard. You are done.&lt;br/&gt;&lt;h3 class="bTitle"&gt;Conclusion&lt;/h3&gt;&lt;br/&gt;I will say I have presented at least a minimal case that I'm not really using Java idioms, but instead solving higher level problems. People may assume I am reusing the idioms considering my library was inspired by one written in Java. But you really need to peel back the layers and see what is happening. This is true for any library you use. Look at the &lt;a href="http://springpython.webfactional.com/reference/html/index.html"&gt;documentation we provide&lt;/a&gt; and &lt;a href="https://fisheye.springframework.org/browse/se-springpython-py"&gt;inspect the source code&lt;/a&gt;, and see if you can spot any anonymous inner classes, or getter &amp;amp; setters. You won't find them. Instead, you find anonymous functions, python iterators, usage of standard python libraries, etc, and what I consider a slim-and-trim library of functionality. And on top of that, lots of documentation on how to use it along with a solid &lt;a href="http://forum.springframework.org/forumdisplay.php?f=45"&gt;forum of support&lt;/a&gt;. Makes it more than just a random recipe posted somewhere, and subject to discovery by google.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-5955411891907972835?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/5955411891907972835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2009/02/why-use-spring-python-and-not-just.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/5955411891907972835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/5955411891907972835'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2009/02/why-use-spring-python-and-not-just.html' title='Why use Spring Python and not just plain python?'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-3642021333330803469</id><published>2009-01-22T00:27:00.000-06:00</published><updated>2011-07-12T10:42:29.196-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='releases'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Spring Python 1.0.0 (RC1) is finally here!</title><content type='html'>&lt;p&gt;This is an exciting day. The first, production-ready version of Spring Python is finally here. Version 1.0.0-RC1 is out. You can download from the &lt;a href="http://www.springsource.com/download/community?project=Spring%20Extensions"&gt;official site&lt;/a&gt;, but if you are having trouble, you can &lt;a href="http://s3browse.com/explore/dist.springframework.org/release/EXT/se-springpython-py/"&gt;go directly to S3&lt;/a&gt;, and grab 1.0.0-RC1. Please visit the official website at &lt;a href="http://springpython.webfactional.com"&gt;http://springpython.webfactional.com&lt;/a&gt;, where you will find links to up-to-date documentation, support options, and anything else you might need. Please click here to &lt;a href="https://fisheye.springframework.org/browse/se-springpython-py/tags/springpython-release-1.0.0-RC1/dependencies"&gt;check for any dependencies&lt;/a&gt; you may be missing, so you can in turn download and install them.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Be sure to grab:&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;  &lt;li&gt;springpython-1.0.0-RC1.tar.gz&lt;/li&gt;&lt;br/&gt;  &lt;li&gt;springpython-samples-1.0.0-RC1.tar.gz&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;You DON'T have to install the springpython-gen-cherrypy-plugins!!! See later section for the reason why.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;h3&gt;What is Spring Python?&lt;/h3&gt;&lt;br/&gt;&lt;p&gt;For those of you new to this project, Spring Python takes the concepts implemented by the Spring Framework (Java), and applies them to Python. This provides a powerful library of functionality to help you get back to writing the code that makes you money.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;h3&gt;A little history&lt;/h3&gt;&lt;br/&gt;&lt;p&gt;I have been working since October 2006 on this project, and it feels good to make this release. What do we mean by "production-ready?" The APIs are frozen until the next major release, so you have a stable platform to work against. This is a Release Candidate, meaning if there are critical errors, please report them so we can fix and release, until we reach general availability (GA).&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;I want to personally thank the many people who have helped make this release possible, including: &lt;strong&gt;Russ Miles&lt;/strong&gt;, &lt;strong&gt;Sylvain Hellegouarch&lt;/strong&gt;, and &lt;strong&gt;Dennis Mendelson&lt;/strong&gt;. Also, a big thanks to SpringSource for hosting this project. And I also want to thank the Spring Python community that has posted questions, comments, patches, and ideas. BTW, &lt;a href="http://www.linkedin.com/in/ucheogbuji"&gt;Uche&lt;/a&gt;, your &lt;a href="http://uche.ogbuji.net:8080/uche.ogbuji.net/tech/4Suite/amara/"&gt;amara toolkit&lt;/a&gt; really saved the day in XML parsing!&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;h3&gt;Release Notes&lt;/h3&gt;&lt;br/&gt;&lt;p&gt;Release Notes - Spring Python - Version 1.0.0-RC1&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;** Bug&lt;br/&gt;    * [SESPRINGPYTHONPY-87] - Fix object.html documentation to use proper import for ApplicationContext&lt;br/&gt;    * [SESPRINGPYTHONPY-88] - Fix PyroServiceExporter so that it has configurable host/port settings (w/defaults)&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;** Improvement&lt;br/&gt;&lt;br/&gt;    * [SESPRINGPYTHONPY-62] - Add XML configuration documentation to reference documents.&lt;br/&gt;    * [SESPRINGPYTHONPY-84] - Generate digital signatures for uploaded items automatically&lt;br/&gt;    * [SESPRINGPYTHONPY-89] - Repair springpython.context.ObjectPostProcessor to work more like BeanPostProcessor&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;** New Feature&lt;br/&gt;    * [SESPRINGPYTHONPY-83] - Create a command-line utility with a plug-in system that can perform useful tasks&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;h3&gt;Spring Python has a command-line tool with plugins!&lt;/h3&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;While we have been working on many key features over the life cycle of this project, the biggest feature in this release is our &lt;a href="http://springpython.webfactional.com/reference/html/plugins.html"&gt;command-line/plug-in system&lt;/a&gt;. During the SpringOne Americas conference, I was blown away by &lt;a href="http://graemerocher.blogspot.com/"&gt;Graeme Rocher's&lt;/a&gt; demo of &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt;, where he built a twitter clone app in 40 minutes. A key part was his command-line grails tool.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Before I left that presentation, my mind was already racing in how to build a similar tool to help Spring Python developers. I realized I needed a pluggable solution, so that many different plugins could be created, whether by me or the community. During a few of the other presentations I attended, I was coding a simple solution that would support version control of plugins, being able to download and install from an official source, having some command-line help, and being able to install/uninstall/reinstall. To go along with this, I cooked up one plugin, gen-cherrpy-app, that creates a skeleton CherryPy web application with an IoC container configured with basic components, including security.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;To use this tool, just download and install the main Spring Python package. After installing, you should find &lt;strong&gt;coily&lt;/strong&gt; installed on your path. To get started, see what coily has to offer.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;code&gt;% coily --help&lt;/code&gt;&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;You should get something like this:&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;code&gt;Coily - the command-line management tool for Spring Python&lt;br/&gt;==========================================================&lt;br/&gt;Copyright 2006-2008 SpringSource (http://springsource.com), All Rights Reserved&lt;br/&gt;Licensed under the Apache License, Version 2.0&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Usage: coily [command]&lt;br/&gt;&lt;br/&gt;        --help                          print this help message&lt;br/&gt;        --list-installed-plugins        list currently installed plugins&lt;br/&gt;        --list-available-plugins        list plugins available for download&lt;br/&gt;        --install-plugin [name]         install coily plugin&lt;br/&gt;        --uninstall-plugin [name]       uninstall coily plugin&lt;br/&gt;&lt;br/&gt;        --reinstall-plugin [name]       reinstall coily plugin&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/code&gt;&lt;strong&gt;coily&lt;/strong&gt; will create a local &lt;strong&gt;~/.springpython&lt;/strong&gt; directory, which contains all installed plugins, on a per-user basis. Currently, there is one official plugin which is used to help you create a CherryPy application. However, the opportunities are endless. Grails has plugins to create apps, modify existing apps, and so on. We can grow in a similar fashion.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Remember when I said you don't have to install springpython-gen-cherrypy-app? Guess what. coily will grab it for you. You don't have to install all the plugins. You can pick and choose what you want. At this stage, we don't have an upgrade feature. But if you reinstall, it should do the trick.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;h3&gt;Plugin Explosion&lt;/h3&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;One issue Grails is having to deal with is their &lt;a href="http://grails.org/Plugins"&gt;explosion of plugins&lt;/a&gt;. They have a lot, and only a subset are managed by the core Grails team. Others were developed by the community. This is definitely a good thing, because it reflects widespread adoption of Grails. However, anyone new to the project cannot discern the status of each plugin, and be able to decipher the stable ones from the bleeding edge ones. This is where Spring Extensions comes into play!&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://www.springsource.org/extensions"&gt;Spring Extensions&lt;/a&gt; is the official incubator process SpringSource has developed to manage new software development. Each extension has its own life cycle, forum, and tracked issues. Spring Python is an extension, and currently it contains one plugin. New plugins can fit into one of three possibilities:&lt;/p&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;  &lt;li&gt;Become an official part of Spring Python, meaning it is managed by the Spring Python team.&lt;/li&gt;&lt;br/&gt;  &lt;li&gt;Become a separate, official Spring Extension, meaning it is not part of the official Spring Python release, but instead, has its own life cycle of releases, and potentially different leader and team.&lt;/li&gt;&lt;br/&gt;  &lt;li&gt;Be managed outside the entire SpringSource system.&lt;/li&gt;&lt;br/&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;p&gt;All three of these choices are good. They each offer a way to extend Spring Python in a usable way. Maybe you want to start an extension, but want to tip toe a little before diving in. Great! That is how lots of open source projects start. Later on, perhaps your plugin is becoming popular, and you would like to make it more official. A Spring Extension gets branded as officially supported by SpringSource. The amount of support varies, meaning as a minimum you get access to tools and some web space. Perhaps someday, if it becomes really popular, it can potentially join the SpringSource software portfolio. Or...not. No promises are made!&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;h3&gt;What else have you got?&lt;/h3&gt;&lt;br/&gt;&lt;p&gt;Enough about plugins. What else is there, you ask?&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;  &lt;li&gt;Inversion of Control - a container which supports several formats, allows you to wire your python application together simply and effectively.&lt;/li&gt;&lt;br/&gt;  &lt;li&gt;Aspect Oriented Programming - add extra services to existing code without changing APIs.&lt;/li&gt;&lt;br/&gt;  &lt;li&gt;Data Access - DatabaseTemplate is a very useful abstraction to make writing database calls easier. This isn't an ORM, but makes it easy to write pure SQL operations.&lt;/li&gt;&lt;br/&gt;&lt;br/&gt;  &lt;li&gt;Transaction Management - while database calls are useful for any small, medium, or large application, transactions are the bread and butter of enterprise apps. This makes it easy to wrap business logic in transactions, whether or not it is the data access layer.&lt;/li&gt;&lt;br/&gt;  &lt;li&gt;Security - using AOP, this is another powerful layer to add on. It is based on the architecture of Spring Security, meaning it is just as flexible and powerful, whether you are building a web app or a desktop client.&lt;/li&gt;&lt;br/&gt;  &lt;li&gt;Remoting - RPCs are the building blocks for distributed apps. Most enterprise apps need to grow beyond the limits of a single server at some stage.&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Each of these features, when orchestrated together, makes it easy to build enterprise-grade applications. IoC provides the indirection that allows you to convert a simple, one-machine, client-server app into a multi-node, security layered, scaled application with transactional protection. And everything is POPO-based.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;h3&gt;What are POPOs?&lt;/h3&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Spring Java works hard to make sure it support POJO-based solutions. POJOs are plain old java objects. The idea is you don't have to extend the frameworks classes. Instead, you can retool code you already wrote with minimal effort. Spring Python takes this same concept to Python by using POPOs, or plain old Python objects.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;There are useful utility classes you can extend, but you don't have to in order to use this collection of libraries. And that's the point! You only use what you need, when you need it. The choice is yours.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;h3&gt;Join us at LinkedIn&lt;/h3&gt;&lt;br/&gt;&lt;p&gt;Please come and join us at the &lt;a href="http://www.linkedin.com/groups?gid=1525237"&gt;Spring Python group on LinkedIn&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;h3&gt;What else is coming?&lt;/h3&gt;&lt;br/&gt;&lt;p&gt;Whew! It has been some hard work to get to here. But by no means are we done. There is plenty more to do to make Spring Python better. A lot of the work done has been foundational.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Spring Python's security module has a strong architecture in place. Now, we can start coding authentication providers to support things like LDAP, X.509, SecurId, two-factor authentication. Plenty of places to go there!&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Remoting currently supports Pyro (Python Remote Objects) and some basic Hesssian. But there are many other remoting protocols. We have the foundation in place to code more service exporters in order to integrate with other technologies.&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;There are plenty of places to go from here. And we aren't slowing down!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-3642021333330803469?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/3642021333330803469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2009/01/spring-python-100-rc1-is-finally-here.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/3642021333330803469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/3642021333330803469'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2009/01/spring-python-100-rc1-is-finally-here.html' title='Spring Python 1.0.0 (RC1) is finally here!'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7697377865612767142.post-510744738380953161</id><published>2009-01-21T22:00:00.000-06:00</published><updated>2011-07-12T10:42:29.197-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring python'/><category scheme='http://www.blogger.com/atom/ns#' term='springone'/><title type='text'>Missed SpringOne Americas conference?</title><content type='html'>&lt;a rel="attachment wp-att-37" href="http://blog.springpython.webfactional.com/2009/01/22/missed-springone-americas-conference/intro_to_spring_python_turnquist/"&gt;&lt;/a&gt;&lt;a href="http://blog.springpython.webfactional.com/downloads/intro_to_spring_python_turnquist.pdf"&gt;Intro_to_Spring_Python_Turnquist&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;In case you missed my presentation &lt;strong&gt;Introduction to Spring Python&lt;/strong&gt;, here is the slide show I presented.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7697377865612767142-510744738380953161?l=greg-turnquist.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greg-turnquist.blogspot.com/feeds/510744738380953161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://greg-turnquist.blogspot.com/2009/01/missed-springone-americas-conference.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/510744738380953161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7697377865612767142/posts/default/510744738380953161'/><link rel='alternate' type='text/html' href='http://greg-turnquist.blogspot.com/2009/01/missed-springone-americas-conference.html' title='Missed SpringOne Americas conference?'/><author><name>Greg L. Turnquist</name><uri>http://www.blogger.com/profile/08171029090321889292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/-Oeiwxje0Gn8/TgHOTqJVhiI/AAAAAAAAAAw/6UPazmnm_b0/s220/P1010817_700k.JPG'/></author><thr:total>0</thr:total></entry></feed>
