<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>percious.com &#187; Agile</title>
	<atom:link href="http://percious.com/blog/archives/category/agile/feed" rel="self" type="application/rss+xml" />
	<link>http://percious.com/blog</link>
	<description>pythonic musings of a mountaineer</description>
	<lastBuildDate>Fri, 19 Nov 2010 22:50:38 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Sprint Organization: But can we do more?</title>
		<link>http://percious.com/blog/archives/62</link>
		<comments>http://percious.com/blog/archives/62#comments</comments>
		<pubDate>Wed, 14 Oct 2009 06:43:31 +0000</pubDate>
		<dc:creator>percious</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Sprint]]></category>
		<category><![CDATA[Turbogears]]></category>

		<guid isPermaLink="false">http://percious.com/blog/?p=62</guid>
		<description><![CDATA[ 
The ultimate sprint incentive would be for companies to put up a bounty to fix bugs, or otherwise provide support for an open source project.  This is the toughest thing to sell I think, but if Google can do it, why can’t other organizations?  I have seen this attempted in the past with mixed [...]]]></description>
			<content:encoded><![CDATA[<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"><span style="letter-spacing: 0.0px;"> </span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"><span style="letter-spacing: 0.0px;">The ultimate sprint incentive would be for companies to put up a bounty to fix bugs, or otherwise provide support for an open source project.  This is the toughest thing to sell I think, but if Google <a href="http://code.google.com/opensource/ghop/2007-8/"><span style="text-decoration: underline;">can</span></a> do <a href="http://code.google.com/soc/"><span style="text-decoration: underline;">it</span></a>, why can’t other organizations?  I have seen this attempted in the past with <a href="http://trac.turbogears.org/query?keywords=~develix&amp;order=priority"><span style="text-decoration: underline;">mixed</span></a> results.  I think it was a half baked idea, and that we can do better than that.  The challenge is metrics, and making sure that everyone gets their fair share.  I mean, at that point, sprinting becomes payment for work done, the sprinters are just hired guns for a weekend.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"><img class="reflect alignright" src="http://farm2.static.flickr.com/1376/1254095605_11be07b3de.jpg" alt="Autograph by kugelfish." width="217" height="300" /><span style="letter-spacing: 0.0px;"> </span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"><span style="letter-spacing: 0.0px;">I think the challenge has been, and will always be metrics.  How do you measure the work and who did it, and how much is each thing done worth?  I think the sprint organizer is the greatest asset in this situation.  He usually has the best idea about what needs to be done, what has been done, and ultimately who did what quantity/quality of work.  So you can use him as your metric definer.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"><span style="letter-spacing: 0.0px;"> </span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"><span style="letter-spacing: 0.0px;">My idea is this:  A sponsoring company provides the OSS organization with a certain amount of money, and what they would like to see achieved in an organized sprint.  This money is given to the organization as a donation regardless of the outcome of the sprint.  The donation may also be given to the organization with no stipulation of task, but the sprint organizer must choose a topic of interest in order to guide the sprint.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"><span style="letter-spacing: 0.0px;"> </span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"><span style="letter-spacing: 0.0px;">The sprinters all agree to a set method for dissemination of funding provided by the sponsoring organization.  My suggestion would be to split all of the funding equally, but in a capitalist nation, it is hard to justify giving the same funding for a person who did a little work on a piece of documentation vs. someone who spent 40 hours putting together a full tutorial.  Another method would be to allow the sprint organizer to disseminate the funding as he sees fit, but the sprinters would have to agree to this before work is started.  The work would have to be completed by a certain deadline to obtain the funding, because project organizers do not have time to track down who did what 4 months after the fact, it’s just not practical.  Finishing a week after a weekend sprint seems reasonable to me.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"><span style="letter-spacing: 0.0px;"> </span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"><span style="letter-spacing: 0.0px;">I am sure to see lots of comments about these ideas because when money gets involved, everyone gets uppity. (one of the great ideas behind OSS is that there is no money paid for the actual software)</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"><span style="letter-spacing: 0.0px;"> </span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"><span style="letter-spacing: 0.0px;">So, there exists possibilities for setting up a sort of Round-up style sprint.  The goal is to provide sprinters incentive for providing bug fixes, or even to document a part of the code that is otherwise hard to get anyone to document.  I would love to open a discussion about this topic, as I see it as a completely different business model when it comes to software development.</span></p>
<p style="font: normal normal normal 12px/normal Helvetica; min-height: 14px; margin: 0px;"><img class="alignleft" src="http://www.ideachampions.com/weblogs/google-logo.jpg" alt="google-logo.jpg" width="270" height="108" /><span style="letter-spacing: 0.0px;"> </span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"><span style="letter-spacing: 0.0px;">But you have to ask yourself, “What’s in it for the company?”  Well, first I think you have to ask yourself why Google has been running programs where they pay for OSS development, no questions asked, for 5 years now.  But here are some insights while you ponder that.  The easiest reason to understand is that the sponsoring company has some bugs in OSS software they use that they need fixed, and a team of experts can fix them in a weekend, or their staff can submit bug fixes, go through the rigamarole of OSS contribution, and things get done in months.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"><span style="letter-spacing: 0.0px;"> </span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"><span style="letter-spacing: 0.0px;">The next less obvious reason for a company to provide funding for a sprint is that they are using OSS software that could use a little help in the documentation department.  By paying for documentation, they are getting a cut-rate deal on the experts that usually created the software providing documentation for those things that may be crucial to their business’s success.  This also reduces their dependency on any one employee who may have in-depth knowledge on a particular software package.  By ensuring the OSS software that the company uses is well documented, the company ensures that the intellectual know-how for that piece of software remains with the project, not with the employee that may <a href="http://livepage.apple.com/"><span style="text-decoration: underline;">leave</span></a> at some later date.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"><span style="letter-spacing: 0.0px;"> </span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"><span style="letter-spacing: 0.0px;">The last simple reason I can think for a company to sponsor OSS is for recruiting reasons.  Typically the people involved in the sprinting process are the ones that know the most about it.  It is also be a chance to evaluate an employees enthusiasm for work in general.  Those who are sprinters are more likely to work well with others and stay with projects for the long haul, in my experience.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"><span style="letter-spacing: 0.0px;"> </span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"><span style="letter-spacing: 0.0px;">If software development is described as herding cats, gathering and directing sprinters is like herding <em>stray</em> cats.  I once had a stray cat visit me when I was in my potato-tuna days, and I gave it some of my tuna, because it looked in worse shape than was I.  And you know what, that cat always returned for the tuna.  Now, I’m not much of a cat person (current cat count: zero) but I think that if software developers are truly analogous to cats, they might show up at your door once, but it’s much easier to get them to come and visit regularly if you give them some tuna once in a while.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://percious.com/blog/archives/62/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Pycon 2009</title>
		<link>http://percious.com/blog/archives/27</link>
		<comments>http://percious.com/blog/archives/27#comments</comments>
		<pubDate>Wed, 04 Feb 2009 23:33:42 +0000</pubDate>
		<dc:creator>percious</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[SQLAlchemy]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Sprint]]></category>
		<category><![CDATA[Sprox]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[Turbogears]]></category>
		<category><![CDATA[grok]]></category>
		<category><![CDATA[nose]]></category>
		<category><![CDATA[nosetests]]></category>
		<category><![CDATA[pycon]]></category>
		<category><![CDATA[tg2]]></category>
		<category><![CDATA[toscawidgets]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://percious.com/blog/archives/27</guid>
		<description><![CDATA[
So, Pycon registration has been up for a few days, I will be speaking both on and off-podium (read: open space) and providing assistance to and presenting tutorials.  Here is a run down of what I am planning in case you wanted a little bit more in-depth information.
Tutorials:
Turbogears2 Beginner and Intermediate:
I will be assisting Mark [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://us.pycon.org/common/img/logo-sitemasthead.gif" height="120" width="328" /></p>
<p>So, Pycon registration has been up for a few days, I will be speaking both on and off-podium (read: open space) and providing assistance to and presenting tutorials.  Here is a run down of what I am planning in case you wanted a little bit more in-depth information.</p>
<p><em>Tutorials:</em></p>
<p><strong>Turbogears2 <a href="http://us.pycon.org/2009/tutorials/schedule/1AM5">Beginner</a> and <a href="http://us.pycon.org/2009/tutorials/schedule/1PM5">Intermediate</a></strong>:</p>
<p>I will be assisting <a href="http://compoundthinking.com/blog/">Mark Ramm</a> by giving individuals help installing and using the new TurboGears2 framework.  Mark is an experienced tutorial presenter, an expert in the technology, and in general a fun character to spend a few hours with.  When you leave his tutorials you should expect to have a working version of TG2 on your machine, along with an understanding of Model, View, and Controller paradigms.  Middleware, Forms, and REST will also be covered.  One note, if you are getting started with TG2, it&#8217;s best to have it installed and running if you plan to attend only the Intermediate Section.  We will not be going over installation in the second-half.</p>
<p><a href="http://us.pycon.org/2009/tutorials/schedule/2AM3"> </a><strong><a href="http://us.pycon.org/2009/tutorials/schedule/2AM3">Toscawidgets: Test Driven Modular Ajax</a>:</strong></p>
<p>I am presenting this tutorial which will describe how to use the valuable Toscawidgets package to create web content.  If you are currently use WSGI technology, and are interested in creating reusable, modular web content, this is a perfect way to get started.  I will show you how to configure TW middleware to work with pylons (which is applicable to other frameworks like repoze.bfg, paste, or even plone/Grok).  I will then describe how you might use this middleware to generate web forms.  The last few hours of class will be devoted to using the JavaScript utilities of TW to create an Ajaxified website, and test it using YUITest.</p>
<p><a href="http://us.pycon.org/2009/tutorials/schedule/2PM5"><strong>The Big F&#8217;ing Tutorial: Development Using the <tt class="docutils literal"><span class="pre">repoze.bfg</span></tt> Web Framework</strong></a></p>
<p>I will assist/present with <a href="http://blog.repoze.org/">Chris McDonough</a> about this up-and-coming framework who&#8217;s goals are to utilize bits of the zope 3 framework, wsgi, and new technologies to make a lighting-fast web server.  Those of you who are familiar with Zope technologies may be interested to find how nicely some of the familiar bits of zope are integrated with wsgi with repoze.bfg.</p>
<p><em> Presentations:</em><span style="display: inline-table" id="proposal_link_92"><span style="display: table-cell; padding-left: 5px"></span></span></p>
<p><strong><span style="display: inline-table" id="proposal_link_92"><span style="display: table-cell; padding-left: 5px">Using Sphinx and Doctests to provide Robust Documentation</span></span></strong></p>
<p>This is a 1/2 hour slot which describes how you can integrate tested documentation with your source code&#8230; with sanity!  I go over a quick install of <a href="http://sphinx.pocoo.org/">Sphinx</a>, and use some screencasts to demenstrate how to add, run, and display doctests using it.</p>
<p><strong>Open Space:<span style="display: table-cell; padding-left: 5px">Agile Development with<a href="http://www.sqlalchemy.org"> SQLAlchemy</a> and Python Testing Tools</span></strong></p>
<p>I really enjoy giving this talk, and even though it was not accepted as a formal talk, I will find a venue by way of Open Space to express my knowledge of Testing, SA, and Nose.  I have given this talk a few times now, and it&#8217;s fairly polished.  My presentation, while on some dry topics, won&#8217;t put you to sleep.  Carefully prepared screencasts and photograph-punctuated slides makes the 45 minutes breeze by.  Questioneers/Hecklers welcome!</p>
<p><em> Sprint Topics</em></p>
<p>I want to spend some time with the Dispatch of TG2, and probably push Sprox further a bit.  If you are just starting with TG, please feel free to contribute.  Sprinting is a great way to learn a lot from the experts in the domain.  We usually do a meet-greet-install the night before the sprints.  Oh, and I&#8217;ve been known to provide refreshments to all of our sprinting hordes (read: FREE BEER).</p>
<p>So, I hope to see all of you there!  If you see me in the hall, feel free to introduce yourself and tell me what you are using Python for!</p>
]]></content:encoded>
			<wfw:commentRss>http://percious.com/blog/archives/27/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>SQLAlchemy Migrate Process Hiccups</title>
		<link>http://percious.com/blog/archives/24</link>
		<comments>http://percious.com/blog/archives/24#comments</comments>
		<pubDate>Fri, 05 Dec 2008 22:15:03 +0000</pubDate>
		<dc:creator>percious</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[SQLAlchemy]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[migrate]]></category>
		<category><![CDATA[pylons]]></category>
		<category><![CDATA[sqlalchemy-migrate]]></category>

		<guid isPermaLink="false">http://www.percious.com/blog/archives/24</guid>
		<description><![CDATA[So, I&#8217;ve done migration processes for two medium-large database schemas (50-100 tables) and I have found what I believe to be a disconnect in the process of migrating and a database and developing a database application.

The Problem
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
Here is the problem in general.  I am sorry it is so long winded, but it&#8217;s hard to see [...]]]></description>
			<content:encoded><![CDATA[<p><font class="fixed_width" face="Courier, Monospaced">So, I&#8217;ve done migration processes for two medium-large database schemas (50-100 tables) and I have found what I believe to be a disconnect in the process of migrating and a database and developing a database application.</font></p>
<p><font class="fixed_width" face="Courier, Monospaced"><br />
</font><font class="fixed_width" face="Courier, Monospaced">The Problem<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
Here is the problem in general.  I am sorry it is so long winded, but it&#8217;s hard to see what is going on without this full expression.</font></p>
<p><font class="fixed_width" face="Courier, Monospaced">You create a schema, and use that schema to create a database.  Maybe<br />
you are using Pylons, and using setup-app to create the schema. Everyone is happy in schema land, and then someone realizes you need to make a change, and maybe even more changes in the future.  You decide to use migrate, because hell, migrate will make things easier. So, you write the migration, modify your model code and everything is honky dory.  Clients are happy, your developer feels like he has a maintainable codebase.  Your project begins to grow.  Awesome. </font></p>
<p><font class="fixed_width" face="Courier, Monospaced">Not Awesome.  Your second developer needs a development environment. You give them your model, they setup-app it and they are ready to go. While they are plugging along, you realize you need a new migrate, so you create it, and upgrade your development version of the database, which is now at migration 2.  The production also goes off without a hitch, it&#8217;s now on 2.<br />
</font></p>
<p><font class="fixed_width" face="Courier, Monospaced">What about your new development buddy?  When he ran migrate_version, he set his database up to version 0.  So, migrate will try to do 0-&gt;1 and then 1-&gt;2, but 0-&gt;1 will fail because his database is already at version 1 even though his version table says its 0.  Now he is in pain, and re-creates his entire database to get moving, and the whole cycle starts over again, although he can work&#8230; until you do the next migration.<br />
</font></p>
<p><font class="fixed_width" face="Courier, Monospaced">This is not ideal, and I have been struggling with it at one of my clients.  In that situation, I am the developer buddy, bopping in from time to time to lend a hand.  I spend probably 5% of my time getting up and running, where if their migration system was somehow linked to their database model, I could be synchronized, and actually use it for a development tool, rather than a dusty old production tool. </font></p>
<p><font class="fixed_width" face="Courier, Monospaced">Solution 1<br />
&#8212;&#8212;&#8212;&#8212;&#8212;<br />
So, I came up with my own solution, and have talked to a close friend about an alternative solution.  I&#8217;d like to discuss both of them as they pertain to migrate, in the hopes that we can improve migrate, and  re-connect the development environment with the production one.<br />
</font></p>
<p><font class="fixed_width" face="Courier, Monospaced">My solution is to connect the model base code to the migration version.  The way I accomplish this is to add a version.py file at the root of my model code, which has, incredibly, the version of the migration changeset that matches this model definition.  I also have a custom database creation script which creates a migrate_version table and fills it with a record of the correct version number.  Now I can svn up, and migrate up and everyone is happy. The problem with this method is that I have to maintain a damn file with the version number, and not go insane doing it.  Since my model contains 3 different database schemas in it, that means I have to maintain 3 variables in my version.py .  Personally, I don&#8217;t mind this, but I had to write more documentation than the amount in this post to make certain that my predecessors (or me in 6 months) can figure out what the heck is going on.<br />
</font></p>
<p><font class="fixed_width" face="Courier, Monospaced">Solution 2<br />
&#8212;&#8212;&#8212;&#8212;&#8211;<br />
The second solution, which Mark came up with, is to preserve the initial model.  Then, you do all of the migrations to bring you up to the current codebase.  This does not require any version file tracking, and if your migrations add boilerplate entries, you don&#8217;t have to record them in a second place. I think solution 2 is reasonable, but could be more time consuming to execute (which is probably not really a problem with everyone&#8217;s 2ghz machines these days).  The problems I see are that the boilerplate entries you make for production may a not be the same as you make for development.  This makes testing a bit harder if they differ. I also feel that solution 2 is more prone to problems, simply because there are a lot more cranks to turn to get a development database.<br />
</font></p>
<p><font class="fixed_width" face="Courier, Monospaced">How can migrate help<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
The way to provide solution 1 to the problem in migrate would be to allow the developer to connect his migrations to his model code, and allow migrate some level of control over the &#8220;versions&#8221; module in the model code.  So, when you do a migrate commit, you are also saying that the model code supports this version of migration.  It will probably only take me  a few hours to make this happen.  We then create an easy way to create the migrate_version table by importing something.  This way you can have a custom createdb script that also creates the migrate_version table.  Perhaps we could even provide a reasonable createdb template. </font></p>
<p><font class="fixed_width" face="Courier, Monospaced">Solution 2 only requires us to provide a custom creation script.  For this we will have to preserve the initial schema (schema 0) and then upgrade.  We could probably also include a template instead of a script so that you can manage boilerplate on your own. </font></p>
<p><font class="fixed_width" face="Courier, Monospaced">My own conclusions<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
I lean more towards solution 1, mostly because I feel that it will provide for easier boilerplating, because you will have access to your whole model at once, instead of bits and pieces of your model as it moves from one version the next.  I also think the boilerplate for dev. is likely to be a lot different than that of prod for most folks, and I feel like solution 1 offers an easier way of handling it.  It also seems like solution 1 is much more efficient, because you don&#8217;t have to go and re-do all of that migration work, you have already arrived at the correct-for-now solution. </font></p>
<p><font class="fixed_width" face="Courier, Monospaced">If you made it this far congratulations!  Now, go grab a cup of coffee, stretch your arms, come back and tell me what you think.</font></p>
]]></content:encoded>
			<wfw:commentRss>http://percious.com/blog/archives/24/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Plonecon Recap</title>
		<link>http://percious.com/blog/archives/21</link>
		<comments>http://percious.com/blog/archives/21#comments</comments>
		<pubDate>Mon, 13 Oct 2008 17:14:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[SQLAlchemy]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Sprint]]></category>
		<category><![CDATA[Turbogears]]></category>

		<guid isPermaLink="false">http://www.percious.com/blog/?p=21</guid>
		<description><![CDATA[Last week I attended Plonecon in Washington D.C.  We use Plone quite a bit at NREL, and I  wanted to come up to speed on the state of the art, and see if I could find some folks to collaborate with on the Scientific Data Management front.   I was not only surprised by the number [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I attended Plonecon in Washington D.C.  We use Plone quite a bit at NREL, and I  wanted to<img src="http://www.percious.com/static/images/blog/ploneconf-300.png" alt="ploneconf" align="right" height="225" width="300" /> come up to speed on the state of the art, and see if I could find some folks to collaborate with on the Scientific Data Management front.   I was not only surprised by the number of people in attendance, but also by the progress being made in forefront of Plone development.</p>
<p>Of course, one of the big news items was what is known in the community as the &#8220;Plone tax&#8221;, which is a reference to the 30+ seconds it takes to start Plone.  It was announced that this has been reduced to 6 seconds, which in my mind is still too much, but I am glad they are making progress in this area.  [edit] I believe the speedups were achieved in the trunk of plone, not for 3.2.   Plone 3.2 is supposed to be all eggs, which I think is a great benefit to the community.  I have already been using Plone in this manner with <a href="http://www.repoze.org">Repoze</a>, which packaged Plone as an egg a few months ago.</p>
<p>I was impressed by the changes to the user interface which were proposed by Alexander Limi in his talk on the future of Plone&#8217;s user experience.  It looks like portlet/viewlet terminology is being supplanted with the term &#8220;widget&#8221; which I think is more standard in the web design world. I think the new user interface is more intuitive, simplifying the page down to those components which will be most important, while still making available all of the functionality of Plone.</p>
<p>I was also impressed with Kapil Thangavelu&#8217;s content mirror.  While I don&#8217;t think his project which takes Plone content and injects it into an sql database will be immediately useful to me, I think it offers a nice path for someone who wants to convert their Zope/Plone site over to an relational-database based site.  It also provides a nice bridge for someone who wants to use existing relational database tools to mine data penned up within a zope database.</p>
<p>Coming from a TG background,  I was of course interested in Repoze.  Chris McDonough gave a compelling talk on repoze, specifically repoze.bfg and what is motivation was for creating yet another framework. We ran a BOF together, and had quite a bit of response.  I demo&#8217;d using Toscawidgets within Plone (running on repoze.plone).</p>
<p>Craig Swank and I also demo&#8217;d one of our repoze.plone application for a group of people interested in laboratory informatics systems.  I started up a google <a href="http://groups.google.com/group/plone-lims" title="Plone-lims Google Group">group</a> for this, and I sincerely hope that our small community can find a way to collaborate efforts in order to increase our productivity in a way only OSS can.</p>
]]></content:encoded>
			<wfw:commentRss>http://percious.com/blog/archives/21/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Open Source Software and Production Engineering</title>
		<link>http://percious.com/blog/archives/20</link>
		<comments>http://percious.com/blog/archives/20#comments</comments>
		<pubDate>Sun, 28 Sep 2008 05:47:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[Turbogears]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Agile Development]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Maintainabilty]]></category>
		<category><![CDATA[Production Engineering]]></category>
		<category><![CDATA[Test Driven Development]]></category>
		<category><![CDATA[toscawidgets]]></category>
		<category><![CDATA[Yahoo]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://www.percious.com/blog/?p=20</guid>
		<description><![CDATA[In the past I have struggled with the fact that some of the OSS code that I write wraps other&#8217;s work, creating an evil dependency which is not easily rectified.  I am then bound by the wrapee&#8217;s software release schedule, as are those who choose to use my software.  Yes, I&#8217;m talking about ToscaWidgets.I wanted [...]]]></description>
			<content:encoded><![CDATA[<p>In the past I have struggled with the fact that some of the OSS code that I write wraps other&#8217;s work, creating an evil dependency which is not easily rectified.  I am then bound by the wrapee&#8217;s software release schedule, as are those who choose to use my software.  Yes, I&#8217;m talking about ToscaWidgets.I wanted to break free from this paradigm, and I have taken initial steps in my ToscaWidget wrapper for Yahoo YUI.  Here comes a huge block of code, but don&#8217;t let it scare you, I will explain the problem it intends to solve:<span class="Apple-style-span" style="font-family: Times; line-height: normal"> </span></p>
<pre class="code"><span class="Apple-style-span" style="white-space: pre">
class YUILinkMixin(Link):
    params = {'basename': '(string) basename for the given file.  if you want yuitest-min.js, the base is yuitest/yuitest',
              'suffix': '(string) "", min, beta-min, or beta.  Default is "min"',
              'version': '(string) select the yui version you would like to use. Default version is: '+__YUI_VERSION__,
              'external': '(boolean) default:False True if you would like to grab the file from YAHOO! instead of locally',
              'yui_url_base':'The base url for fetching the YUI library externally',
    }

    version = __YUI_VERSION__
    external = __DEFAULT_LINK_IS_EXTERNAL__
    yui_url_base = __YUI_URL_BASE__
    modname = "tw.yui"
    extension = 'js'
    default_suffix = __DEFAULT_SUFFIX__
    _suffix = ''

    def __init__(self, *args, **kw):
        super(Link, self).__init__(*args, **kw)
        if not self.is_external:
            modname = self.modname or self.__module__
            self.webdir, self.dirname, self.link = registry.register(
                modname, self.filename
                )
        if 'suffix' in kw:
            self.suffix = kw['suffix']
        else:
            self.suffix = self.default_suffix

    def _get_suffix(self):
        if self._suffix == '':
            return ''
        return '-'+self._suffix

    def _set_suffix(self, value):
        self._suffix = value

    suffix = property(_get_suffix, _set_suffix)

    @property
    def external_link(self):
        link = '/'.join((self.yui_url_base, self.version, 'build', self.basename+self.suffix+'.'+self.extension))
        #xxx:check for existance of this resource and choose -min -min-beta -debug or no suffix as alternatives.
        return link

    def _get_link(self):
        if self.is_external:
            return self.external_link
        return tw.framework.url(self._link or '')

    def _set_link(self, link):
        self._link = link

    link = property(_get_link, _set_link)

    def abspath(self, filename):
        return os.sep.join((os.path.dirname(__file__), filename))

    def try_filename(self, filename):
        abspath = self.abspath(filename)
        if os.path.exists(abspath):
            return filename
        return False

    @property
    def filename(self):
        #make basename windows/qnix compat
        basename = self.basename.replace('/', os.sep)
        basename = self.basename.replace('\\', os.sep)

        basename = os.sep.join(('static', self.version, 'build', basename))
        #try the default
        filename =  basename+self.suffix+'.'+self.extension
        if self.try_filename(filename):
            return filename

        #try '' if the default suffix is min
        if self.default_suffix == '':
            filename =  basename+self.suffix+'.'+self.extension
            if self.try_filename(filename):
                return filename

        #try min if the default suffix is ''
        if self.default_suffix == 'min':
            filename =  basename+'.'+self.extension
            if self.try_filename(filename):
                return filename

        #try debug
        filename =  basename+'-debug'+'.'+self.extension
        if self.try_filename(filename):
            return filename

        #try beta-min
        filename =  basename+'-beta-min'+'.'+self.extension
        if self.try_filename(filename):
            return filename

        #try beta
        filename =  basename+'-beta'+'.'+self.extension
        if self.try_filename(filename):
            return filename

        #try beta-debug
        filename =  basename+'-beta-debug'+'.'+self.extension
        if self.try_filename(filename):
            return filename
        return None

    @property
    def is_external(self):
        return self.external

class YUIJSLink(JSLink, YUILinkMixin):
    pass

class YUICSSLink(YUILinkMixin, CSSLink):
    extension = 'css'
 </span></pre>
<pre><span class="Apple-style-span" style="font-family: Georgia; font-size: 16px; line-height: 20px; white-space: normal">So, the question is, how does using this code differ from using direct links to the YUI library, or using the ubiquitous JSLink Widget provided by ToscaWidgets, which is found in just about every other tw.js_wrapper available?</span></pre>
<pre><span class="Apple-style-span" style="font-family: Georgia; font-size: 16px; line-height: 20px; white-space: normal">1) Testabliltiy - First and foremost, I wanted a way to test a new version of the library with my JS code to see if it would work, without having to change the wrapper at all.  A bit of a monkey-patch, but if you change the version of YUI that is fetched by altering one variable in the tw.yui library before doing subsequent imports.  If the current version is not available in the widget library, you can point it directly at yui's online library.  Run your tests, see what breaks, fix it, and you are now compatible with the new library.</span></pre>
<pre><span class="Apple-style-span" style="font-family: Georgia; font-size: 16px; line-height: 20px; white-space: normal">2) Debugability - Synchronous with Testability, you can also set a flag for tw.yui to include all of the debug versions of the yui modules so you can dig down into the code using firebug if need be. (The default is minified)</span></pre>
<pre><span class="Apple-style-span" style="font-family: Georgia; font-size: 16px; line-height: 20px; white-space: normal">3) Compatibility - Since you now can control what version of YUI you want to use, you can retro-fit an older project with Toscawidgets by downgrading the version of YUI that tw.yui is using.  You can also try out the newest version of YUI that may tw.yui is not yet using, and with the exception of new modules that have not been integrated into tw.yui, it should still work.</span></pre>
<pre><span class="Apple-style-span" style="font-family: Georgia; font-size: 16px; line-height: 20px; white-space: normal">4) Maintainability - Since we now have the ability to swap versions, the maintainers of tw.yui can keep multiple versions of yui in the library, and deprecate them as they see fit.  This provides maintainability, as you would expect to see deprecation warnings about your WSGI Application's use of an out-of-date JS library.  This helps the whole process of knowing what libraries are current to what version, which can be a real bear, given all of the things we all must keep track of.</span></pre>
<pre><span class="Apple-style-span" style="font-family: Georgia; font-size: 16px; line-height: 20px; white-space: normal">5) Producibility - The bottom line always comes down to whether or not you can pipe your development software up to production level efficiently.  (Is the code producible).  With the ability to test compatibility, and drop down to different versions of dependent libraries when compatibility is a concern, you will be able to keep all that works on your production server working, while bringing up new or updated functionality incrementally.  Keep in mind that the above code demonstrates the ability for system-level defaults of the javascript link widgets to be overridden for any particular widget instantiation.</span></pre>
<pre><span class="Apple-style-span" style="font-family: Georgia; font-size: 16px; line-height: 20px; white-space: normal">These 5 items I call Production Engineering.  Basically, Production Engineering is developing a process which allows you to integrate working development code into your stead-fast production site, and allow you to back out software which may have mistakes.  A good software engineer realizes that people make mistakes, and there needs to be a way to buy some time so those mistakes can be fixed.  I believe that YUILinkMixin is a step in this direction, and I hope to extend it in the future to provide an even more robust toolset in line with Production Engineering.The complete source code for tw.yui is available at www.toscawidgets.org/hg .</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://percious.com/blog/archives/20/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Busy times with OSS</title>
		<link>http://percious.com/blog/archives/16</link>
		<comments>http://percious.com/blog/archives/16#comments</comments>
		<pubDate>Sat, 26 Jul 2008 05:01:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[DBSprockets]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Turbogears]]></category>
		<category><![CDATA[nose]]></category>
		<category><![CDATA[nosetests]]></category>
		<category><![CDATA[basketweaver]]></category>
		<category><![CDATA[documentations]]></category>
		<category><![CDATA[rum]]></category>
		<category><![CDATA[sphinx]]></category>
		<category><![CDATA[tg2]]></category>

		<guid isPermaLink="false">http://www.percious.com/blog/?p=16</guid>
		<description><![CDATA[I&#8217;ve not posted to this blog in over a month, mainly because I have been busy.  Busy is a good thing I think.  I have been helping clearwired get their newest web application off the ground, working on a number of screencasts, helping Mark with the latest batches of TG2 releases, learning about [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve not posted to this blog in over a month, mainly because I have been busy.  Busy is a good thing I think.  I have been helping <a href="http://www.clearwired.com">clearwired</a> get their newest web application off the ground, working on a number of <a href="http://showmedo.com/videos/?author=8039" title="Screencasts on Virtualenv, Nose, TG2 and more!">screencasts</a>, helping Mark with the latest batches of TG2 releases, learning about new and interesting OSS Python projects.</p>
<p ><img src="http://www.percious.com/static/images/blog/sphinx.png" alt="sphinx logo" hspace="5" vspace="5" width="165" height="114" align="right" /> One of the more interesting things I have started to use with some frequency is Sphinx.  Sphinx is a documentation system whichallows you to create webpages (among other things) with .rst files.  It also grabs directly from your modules and inserts your docstrings (including your doctests.) It is great to have code which is not only documented, but also tested using nose. Look for a screencast from me in the near future on this one.</p>
<p>Two of the recent <a href="http://showmedo.com/videos/?author=8039">screencasts</a> I have written show how to use virtualenv, PasteScript, and Nose.  I go through a ground-up example showing how to create a virtualenv, a project package, and finally how to test that package and provide robustness with code coverage.  The final screencast is about how to install TG2, which has become much easier in the advent of TG2&#8217;s first alpha release. </p>
<p><img src="http://www.percious.com/static/images/blog/gear_mountains.jpg" alt="mountain gears" hspace="5" vspace="5" width="140"align="left" /> TG2 is actually nearing it&#8217;s second alpha release.  I think This is the best release yet.  I spent some time moving DBSprockets to pep-8 compliance, and the two things TG2 depends on (tg.ext.silverplate and tgcrud) are now both using the newest release of DBSprockets.  I also released <a href="http://pypi.python.org/pypi/basketweaver/">basketweaver</a> which allows you to create a simple local pypi made of static HTML files.  Special thanks to Chris McDonough, who wrote the makeindex.py script.  All I did was to fixed it up a little, and package using PasteScript, and provide a console_script for easy usage.</p>
<p><img src="http://www.percious.com/static/images/blog/rum.png" alt="rum screenshot" hspace="5" vspace="5" width="200"align="right" /></p>
<p>Along with Sphinx, I have been trying to wrap my head around <a href="http://rumdemo.toscawidgets.org/">Rum</a>, which is a new project to generate forms from database schema, much like DBSprockets.  Although the internals of the system are somewhat mystifying, the API is squeaky clean, and in my mind what DBSprockets was eventually planned to be.  The great news is that Alberto has done such a good job laying the groundwork for Rum I should be able to jump right in and apply lessons learned from DBSprockets.  At this point it is safe to say that I will continue to maintain DBSprockets for bug fixes, but that the internals of it are going to be converted over to using Rum, before being deprecated altogether. DBSprockets had a great run, but it is time to move on and move forward with a superior design which promises to integrate so many WSGI technologies.</p>
]]></content:encoded>
			<wfw:commentRss>http://percious.com/blog/archives/16/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My Blog&#8217;s Wordle</title>
		<link>http://percious.com/blog/archives/14</link>
		<comments>http://percious.com/blog/archives/14#comments</comments>
		<pubDate>Tue, 17 Jun 2008 18:17:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[DBSprockets]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Sprint]]></category>
		<category><![CDATA[Turbogears]]></category>
		<category><![CDATA[TwTools]]></category>
		<category><![CDATA[grok]]></category>

		<guid isPermaLink="false">http://www.percious.com/blog/?p=14</guid>
		<description><![CDATA[
http://wordle.net/
]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.percious.com/static/images/wordle.png" alt="wordle" width="500" /></p>
<p>http://wordle.net/</p>
]]></content:encoded>
			<wfw:commentRss>http://percious.com/blog/archives/14/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Namespacing with Setuptools</title>
		<link>http://percious.com/blog/archives/13</link>
		<comments>http://percious.com/blog/archives/13#comments</comments>
		<pubDate>Mon, 16 Jun 2008 16:38:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[DBSprockets]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Turbogears]]></category>

		<guid isPermaLink="false">http://www.percious.com/blog/?p=13</guid>
		<description><![CDATA[Lately I am finding that it is worthwhile to separate projects into their own packages, but since they are all in the same domain, I want to have them share elements for importing purposes.  Enter namespacing, which I believe is a little-used feature of setuptools that people should take a serious look at.
What is [...]]]></description>
			<content:encoded><![CDATA[<p>Lately I am finding that it is worthwhile to separate projects into their own packages, but since they are all in the same domain, I want to have them share elements for importing purposes.  Enter namespacing, which I believe is a little-used feature of setuptools that people should take a serious look at.</p>
<p>What is namspacing?  Well, if you are familiar with creating packages, you know that often times they share similar traits, which means it would be nice to have sort of a global package where they all reside, but then you would not be able to install the components of said package independently.  Lets say we have a solar system package, and inside it are elements for each planet.  You might import from them like this:</p>
<p>from solarsystem.earth import echosystem</p>
<p>from solarsystem.venus import atmosphere</p>
<p>But what if you didn&#8217;t want to package simulations of  all the planets, because sometimes you just want to install one or two of them at a time.  Namespacing gives you a way of creating packages which are related to each other, but do not clash.</p>
<p>First off, you are going to need setuptools if you don&#8217;t already have it.  Download the script <a href="http://www.google.com/url?sa=t&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fpeak.telecommunity.com%2Fdist%2Fez_setup.py&amp;ei=045WSJrCD6jkigHp86H8Ag&amp;usg=AFQjCNEG20rl-huMGkxe6GzkQEfD9L3Yxg&amp;sig2=cetluhbRbBNBXCyp71db5Q">here</a> and run it with python.  This will install the ubiquitous setuptools package which contains easy_install.</p>
<p>The easiest way I have found to create a namespace package is to use zopeskel, which provides a basic_namespace template for your project.  First, we easy_install zopeskel:</p>
<p>easy_install zopeskel</p>
<p>Now we can list the templates that paster provides.  <a href="http://pythonpaste.org/">Paster</a> is a tool which provides a developer with an easy way to create templates for packages, as well as other useful utilities for python file management.  (Paster is automatically installed by zopeskel)</p>
<p>$ paster create &#8211;list-templates<br />
Available templates:<br />
archetype:          A Plone project that uses Archetypes<br />
basic_namespace:    A project with a namespace package<br />
basic_package:      A basic setuptools-enabled package<br />
basic_zope:         A Zope project<br />
nested_namespace:   A project with two nested namespaces.<br />
paste_deploy:       A web application deployed through paste.deploy<br />
plone:              A Plone project<br />
plone2.5_buildout:  A buildout for Plone 2.5 projects<br />
plone2.5_theme:     A Theme for Plone 2.5<br />
plone2_theme:       A Theme Product for Plone 2.1 &amp; Plone 2.5<br />
plone3_buildout:    A buildout for Plone 3 projects<br />
plone3_portlet:     A Plone 3 portlet<br />
plone3_theme:       A Theme for Plone 3.0<br />
plone_app:          A Plone App project<br />
plone_hosting:      Plone hosting: buildout with ZEO and any Plone version<br />
plone_pas:          A Plone PAS project<br />
recipe:             A recipe project for zc.buildout<br />
silva_buildout:     A buildout for Silva projects<br />
At the top of the list is basic_namespace, which we will be using.   For example, lets make a solarsystem.mars package:</p>
<p>paster create -t basic_namespace solarsystem.mars</p>
<p>Paster will then prompt you with a series of questions, of which the first two are the most important:</p>
<p>Selected and implied templates:<br />
ZopeSkel#basic_namespace  A project with a namespace package</p>
<p>Variables:<br />
egg:      solarsystem.mars<br />
package:  solarsystemmars<br />
project:  solarsystem.mars<br />
Enter namespace_package (Namespace package (like plone)) ['plone']: solarsystem<br />
Enter package (The package contained namespace package (like example)) ['example']: mars</p>
<p>After you answer the rest of the questions, it will create a directory structure that looks something like:</p>
<p>solarsystem.mars/<br />
|&#8211; README.txt<br />
|&#8211; docs<br />
|   `&#8211; HISTORY.txt<br />
|&#8211; setup.cfg<br />
|&#8211; setup.py<br />
|&#8211; solarsystem<br />
|   |&#8211; __init__.py<br />
|   `&#8211; mars<br />
|       `&#8211; __init__.py<br />
|&#8211; solarsystem.mars.egg-info<br />
|   |&#8211; PKG-INFO<br />
|   |&#8211; SOURCES.txt<br />
|   |&#8211; dependency_links.txt<br />
|   |&#8211; entry_points.txt<br />
|   |&#8211; namespace_packages.txt<br />
|   |&#8211; not-zip-safe<br />
|   |&#8211; paster_plugins.txt<br />
|   |&#8211; requires.txt<br />
|   `&#8211; top_level.txt<br />
`&#8211; zopeskel.txt</p>
<p>At which point, you are ready to create a development install of your project.  Simply change to the directory:</p>
<p>cd solarsystem.mars</p>
<p>and:</p>
<p>python setup.py develop</p>
<p>Code for your new module would go in the solarsystem/mars/ folder, inside the new package.  Any python you have installed this new package will<br />
now be able to:</p>
<p>import solarsystem.mars</p>
<p>Namespacing is a great way to organize your work into digestible morsels, which can be installed one by one as needed by your perspective users.  It is a great way to take advantage of all of the tools which have been created to make distribution and versioning easier.</p>
]]></content:encoded>
			<wfw:commentRss>http://percious.com/blog/archives/13/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sprints, Vacation, Refreshment</title>
		<link>http://percious.com/blog/archives/12</link>
		<comments>http://percious.com/blog/archives/12#comments</comments>
		<pubDate>Thu, 05 Jun 2008 17:04:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[DBSprockets]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Sprint]]></category>
		<category><![CDATA[Turbogears]]></category>
		<category><![CDATA[SilverPlate Demo site SilverPlate Demo site]]></category>

		<guid isPermaLink="false">http://www.percious.com/blog/?p=12</guid>
		<description><![CDATA[ It&#8217;s been a while since I have blogged for a few reasons.  One, I took a vacation.  No work, open source or otherwise for 11 days.  I barely even checked my email.  One thing that is great about living in Colorado: I don&#8217;t have to go anywhere on vacation, and [...]]]></description>
			<content:encoded><![CDATA[<p> It&#8217;s been a while since I have blogged for a few reasons.  One, I took a vacation.  No work, open source or otherwise for 11 days.  I barely even checked my email.  One thing that is great about living in Colorado: I don&#8217;t have to go anywhere on vacation, and my family will come to me!  I took my sister up the First Flatiron, my dad fishing in Cheeseman Canyon, and all of us took a nice stroll through Chautauqua Park.  We ate out almost every night and enjoyed catching up since I have moved 2000 miles away.</p>
<p>Previous to that, I managed to win a skirmish in the framework war at work, and spent an obscene amount of time (on and off the clock) bringing my first production-level  TG2 site.  This was a really fun project because my coworker and I were given the reigns and let loose on implementation.  In 3 hours we had a working TG2 site with data in an EXT grid, with database schema expressed as a tree.  In 3 weeks we had a complete reporting system (using EXT) with object-based security.  We were also able to implement a file upload manager, and a select shuttle (for assigning groups to secure objects) thanks to the help of Sanjiv Singh, my GSoC protege.   Thanks to all of you who have helped myself, and TG2 get off the ground.</p>
<p>One of the reasons I was so absent from the OSS community was that I was trying to wrap my head around what was going on with the EXT licensing, which changed under my feet as I was developing our in house app.  The move from LGPL to GPL/Commercial was a shock to the community, and in my opinion based primarily on one person&#8217;s greed.  My personal choice is to finish up whatever EXT support I have to do for our in-house application, and never look back at it again.  I will be moving on to <a href="http://dojotoolkit.org">Dojo,</a> and have advised my GSoC students and other people involved with TurboGears to do the same.</p>
<p><img src="http://tgtools.googlecode.com/svn/wiki/silvershots/index.png" alt="SilverPlate Demo site " align="left" border="1" height="172" hspace="5" vspace="5" width="369" />Now that I am back from vacation/new project hell, I have been able to release a new module for TurboGears, tg.ext.silverplate, which is a plugin for TG2 providing User Management and Profile pages which are customizable.  This all fits under the TGTools domain, which has become a home for tg.ext.repoze.who (Authentication for TG2) and tg.ext.geo (An upcoming library for Geographical support in TG2).  If you get a chance, you might want to check out the new <a href="http://code.google.com/p/tgtools/" title="TGTools website">TGTools</a> googlecode site.</p>
<p>I also did a new release of tg.ext.repoze.who, which provides authentication/authorization to TG2.  The only functionality I as able to contribute was a change to the name-spacing, as well as a full test of it&#8217;s functionality.  Right now I am working on an LDAP bridge which will allow your TG2 site to authenticate against LDAP, and then dump you into the TurboGears Domain for all of the authorization stuff (groups, permissions, etc.)  I should have this completed in a few days.  Most of the work for tg.ext.repoze.who was done at the last world-wide WSGI-Turbogears sprint.  It looks like TG is going to do a release in a few days.</p>
<p>This weekend I am headed to ABQ for some sprinting with <a href="http://www.clearwired.com">clearwired</a> on their next-generation web application.  I am hoping this time around TG2 is mature enough in their eyes to take advantage of everything it has to offer, since they have currently chosen to work simply with Pylons as a framework.  Either way, I will be working with some of the best people in the business, and we should be able to push TG foreward one way or another.</p>
]]></content:encoded>
			<wfw:commentRss>http://percious.com/blog/archives/12/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shell History</title>
		<link>http://percious.com/blog/archives/11</link>
		<comments>http://percious.com/blog/archives/11#comments</comments>
		<pubDate>Fri, 11 Apr 2008 00:39:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Turbogears]]></category>

		<guid isPermaLink="false">http://www.percious.com/blog/?p=11</guid>
		<description><![CDATA[$ history&#124;awk &#8216;{a[$2]++ } END{for(i in a){print a[i] &#8221; &#8221; i}}&#8217; &#124;sort -rn&#124;head
241 nosetests
97 ls
85 cd
20 svn
15 python
7 vi
7 rm
5 easy_install
4 pylint
3 history&#124;awk
]]></description>
			<content:encoded><![CDATA[<p>$ history|awk &#8216;{a[$2]++ } END{for(i in a){print a[i] &#8221; &#8221; i}}&#8217; |sort -rn|head<br />
241 nosetests<br />
97 ls<br />
85 cd<br />
20 svn<br />
15 python<br />
7 vi<br />
7 rm<br />
5 easy_install<br />
4 pylint<br />
3 history|awk</p>
]]></content:encoded>
			<wfw:commentRss>http://percious.com/blog/archives/11/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

