<?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>Compound Thinking &#187; TurboGears</title>
	<atom:link href="http://compoundthinking.com/blog/index.php/category/programming/python/turbogears/feed/" rel="self" type="application/rss+xml" />
	<link>http://compoundthinking.com/blog</link>
	<description>Thinking about programming in new ways</description>
	<lastBuildDate>Mon, 26 Jul 2010 17:28:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>The tech of the new SourceForge</title>
		<link>http://compoundthinking.com/blog/index.php/2010/07/26/the-tech-of-the-new-sourceforge/</link>
		<comments>http://compoundthinking.com/blog/index.php/2010/07/26/the-tech-of-the-new-sourceforge/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 17:28:06 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Project Management]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=839</guid>
		<description><![CDATA[Last week I blogged about the new SourceForge.net and one of the first questions I got was when are we going to &#8220;lift the covers&#8221; and show off our new tech. There&#8217;s definitely more to come in terms of releases and code, but I thought it&#8217;d be worthwhile to start with a quick run through [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I blogged about the new <a href="http://sourceforge.net/p/">SourceForge.net</a> and one of the first questions I got was when are we going to &#8220;lift the covers&#8221; and show off our new tech.  </p>
<p>There&#8217;s definitely more to come in terms of releases and code, but I thought it&#8217;d be worthwhile to start with a quick run through of the tech stack and a bit of a description of what we&#8217;re doing. </p>
<p>Our first rule for libraries and tools on the new forge, was that we needed to use open source everywhere.   Partly this is just because having the freedom to look at the code and modify it where we need fixes, makes it&#8217;s the easiest and best way to develop software.   Partly it&#8217;s because we&#8217;re an open source code hosting platform, and we want to use what we promote.   But perhaps most importantly, it means that we&#8217;re not prevented from sharing our work with others, or from inviting others to work with us in the future. </p>
<p>At the same time we had a company wide decision to standardize on the technology stack that we&#8217;d used in the &#8220;<a href="http://compoundthinking.com/blog/index.php/2009/07/16/turbogears-on-sourceforge/">consume&#8221; project</a> last year.  So, we&#8217;re using:</p>
<ul>
<li>Python,</li>
<li>TurboGears,</li>
<li>MongoDB, </li>
<li>and AMQP (RabbitMQ).</li>
</ul>
<p>The combination of these means that we have:</p>
<ul>
<li>a huge number of libraries available to us, </li>
<li>a web framework that we can turn into a plugin framework for projects and the tools they want, </li>
<li> a schema-free database that lets us easily version documents to keep history on wiki pages, tickets, and other &#8220;artifacts&#8221; within the new forge</li>
<li> a scalable system for handling asynchronous tasks, and propagating update notifications</li>
</ul>
<p>The choice to use Python has been particularly valuable, since there are (literally) dozens of libraries that we were able to use to help us with everything from encrypted cookie sessions, and mongodb drivers, to markdown text processing, and syntax highlighting.</p>
<p>We&#8217;re still in the early days and have a lot more to do, but the goal is an open extensible, system that supports open source projects, and ultimately encourages more people do download and use a wider variety of open source applications. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2010/07/26/the-tech-of-the-new-sourceforge/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A peek at a new Sourceforge.net</title>
		<link>http://compoundthinking.com/blog/index.php/2010/07/13/a-peak-at-a-new-sourceforge-net/</link>
		<comments>http://compoundthinking.com/blog/index.php/2010/07/13/a-peak-at-a-new-sourceforge-net/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 16:37:55 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[SE Michigan Tech]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=817</guid>
		<description><![CDATA[So, I&#8217;ve been working on sf.net in various ways for about a year now. http://sourceforge.net/p/. It&#8217;s written in Python using modern open source tools, from RabbitMQ, and MongoDB, to Git and Mercurial. And we are committed to making this the most open forge possible. We&#8217;re committed, to open processes, open code, and perhaps most importantly [...]]]></description>
			<content:encoded><![CDATA[<p>So, I&#8217;ve been working on sf.net in various ways for about a year now.<br />
<a href="http://sourceforge.net/p/">http://sourceforge.net/p/</a>.  It&#8217;s written in Python using modern open source tools, from RabbitMQ, and MongoDB, to Git and Mercurial.   And we are committed to making this the most open forge possible.  We&#8217;re committed, to open processes, open code, and perhaps most importantly open data.<br />
<a href="https://sourceforge.net/p/mramm/todo/"><img src="http://compoundthinking.com/blog/wp-content/uploads/2010/07/tickets.jpg" alt="" title="tickets" width="400" height="315" align='right' /></a></p>
<p>The first thing we did was create some new pages for downloads.  Recently we releases <a href="http://sourceforge.net/downloads">a new service</a> designed just for open source project leaders who want to use <a href="sf.net/directory">sf.net</a> as a directory and downloads service. </p>
<p>But, we&#8217;re also aware that one of the most important services we provide is project hosting.  For the last several months a small group of us have been trying to bring sourceforge.net&#8217;s tools into 2010.  And now we&#8217;re releasing an  early preview of those new developer/community tools:</p>
<p>We have a long way still to go, but every long journey begins with a single step, and today&#8217;s step is allowing you to try the new forge, to create new projects at: </p>
<p><a href="https://sourceforge.net/register">https://sourceforge.net/register</a></p>
<p>Where you can go to get a new project, with our new tracker, wiki, git, svn, and other tools.   Projects can have subprojects, and links to other tools hosted off site, along with the many features that sf.net brings (free web hosting, hosted apps, etc). </p>
<p><strong>But, why do all this?</strong></p>
<p><em>In 1999 SourceForge was cool. </em> </p>
<p>It provided all the tools that an open source project needed to get going, from cvs hosting, to bug tracking, and e-mail list support.</p>
<p>They pioneered free free software project hosting, and helped to transform the software development culture from one which barely new about free software or open source, to one where nearly everybody I know uses open license software. Oh sure, some of them might not know it, but they have it on their phones, in their TVs, their wireless routers &#8212; not to mention all the websites they use everyday that run on open source. </p>
<p><strong>But, time passed.</strong></p>
<p>More alternatives came out, more projects (including my own) started self hosting, and the landscape of open source software development changed.   SourceForge.net took a long time coming out with support for new tools like svn, and then git.   </p>
<p>Still, SourceForge has a special place in my heart.  Partly it&#8217;s nostalgia, I suppose, but I still think: </p>
<ul>
<li>  the core mission is still right</li>
<li>  and there is still a real need</li>
</ul>
<p>We (Open Source developers) still need tools like git, mercurial, and svn hosting.  We still need bug trackers and mailing lists.   And in a meeting of other open source project leaders last fall, nearly every single one of them identified the time wasted integrating and administering these tools as one of their most important frustrations.</p>
<p><strong>Not enough&#8230;</strong></p>
<p>But, for many sourceforge.net and other free project hosting services were just not good enough, they weren&#8217;t scriptable, the weren&#8217;t extensible, their data wasn&#8217;t portable, and so they felt like they had to take on that cost. </p>
<p>And I fundamentally believe that open source projects live an die by communication, and that sourceforge.net can do something new by integrating the various kinds of &#8220;conversations&#8221; that happen around the project.  We can integrate mailing lists and forums, we can integrate SCM and ticket trackers, etc.   </p>
<p><strong>New and improved</strong></p>
<p>So, a couple of us have been quietly working on something new.  The new forge is designed around a few core ideas: </p>
<ul>
<li>   that data should be portable (every project gets their own database, which they can take with them if they want), </li>
<li>   that the open source community ought to be able to extend and enhance the tools they need, </li>
<li>   that integrating and cross linking the various kinds of conversations that open source projects need to have ought to be easier.</li>
</ul>
<p>So, what we&#8217;re announcing today is more of a commitment to getting there on all these things, and a commitment to the &#8220;release early, release often&#8221; project management strategy.    </p>
<p>So, expect us to take your feedback and make things better.   Expect us to release lots of small fixes, and expect a few places where things are broken/incomplete because we value feedback more than polish at this point. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2010/07/13/a-peak-at-a-new-sourceforge-net/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Premature optimization</title>
		<link>http://compoundthinking.com/blog/index.php/2009/12/17/premature-optimization/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/12/17/premature-optimization/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 04:43:44 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Lean IT]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[TurboGears]]></category>
		<category><![CDATA[writing]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=290</guid>
		<description><![CDATA[We all know it&#8217;s bad. But, programming for performance in reasonable ways is good. So, what&#8217;s the difference? Sometimes we think we know that a piece of code is important so we spend some time optimizing it. And in the end it&#8217;s less clear, and less maintainable, and it turns out that our bottlenecks are [...]]]></description>
			<content:encoded><![CDATA[<p>We all know it&#8217;s bad.  But, programming for performance in reasonable ways is good.   So, what&#8217;s the difference?  </p>
<p>Sometimes we think we know that a piece of code is important so we spend some time optimizing it.  And in the end it&#8217;s less clear, and less maintainable, and it turns out that our bottlenecks are all elsewhere. </p>
<p>But, sometimes we do know where bottlenecks are going to be, we&#8217;ve learned from experience, and we know what needs to be done.   </p>
<p>We know that architecture determines performance, and architecture isn&#8217;t easily bolted on at the end of the project.   </p>
<p>So we have a conundrum.   We shouldn&#8217;t optimize yet because we don&#8217;t know where the bottlenecks will be.   We shouldn&#8217;t wait to optimize because we can&#8217;t easily retrofit a good architecture on a complex system. </p>
<p>Some of the conundrum is only apparent &#8212; there&#8217;s a difference between architectural problems that need to be set up front, and the kind of low level micro-optimization that obscures more than it helps.    But, sometimes these conflicts are real &#8212; how do I know if I need a multi-process multi-consumer queue system for PDF generation before we build the system and benchmark it?   If you don&#8217;t need it, that kind of extra architectural complexity just obscures the bit of code that actually solves the problem.  </p>
<p><strong>Solving the problem by going meta</strong></p>
<p>Perhaps the problem really is that we&#8217;re dumb and optimize the wrong things at the wrong time.   The solution to that problem is to get less dumb.   Which means that we ought to spend time  optimizing &#8220;learning&#8221;, both within our project processes, and across projects. </p>
<p>Codifying this learning is what the <a href="http://www.amazon.com/gp/product/0321127420?tag=pragmaticsyst-20">Patterns of Enterprise Application Architecture</a> book was all about.  </p>
<p>And I think it&#8217;s great as far as it goes, and if you haven&#8217;t read it you should <a href="http://www.amazon.com/gp/product/0321127420?tag=pragmaticsyst-20">buy it now</a>. </p>
<p>But there are a lot of patterns that I can identify from my last half dozen projects that aren&#8217;t covered in PoEAA, so it would be great to see a next generation of books and blog posts that cover the modern architectural trade-offs that you have to make, something that covers some of the paterns of the web.</p>
<p>Scalability via in HTTP, etags, caching, and load balancing (the whole RESTful services argument), networked async processing patterns, etc.    Scaling to the public web levels requires a whole different set of architectural principles than scaling to the old &#8220;enterprise&#8221; levels did, and that knowledge seems very much in flux. </p>
<p>It would be great if it also provided some advice for those of us who&#8217;ve moved into what Neil Ford has called the world of the Polyglot Programmer, patterns for coordinating activities across language barriers in a sensible way.   That&#8217;s part of the nature of modern web systems too. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/12/17/premature-optimization/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How do we expand Open Source?</title>
		<link>http://compoundthinking.com/blog/index.php/2009/12/14/how-do-we-expand-open-source/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/12/14/how-do-we-expand-open-source/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 03:56:43 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=741</guid>
		<description><![CDATA[So, one thing which keeps comming up in a bunch of different areas of my life is how we can expand the ethic of Open Source development. People want TurboGears to do more than it does, they want other open source projects to grow, they want new open source projects in specific areas, and they [...]]]></description>
			<content:encoded><![CDATA[<p>So, one thing which keeps comming up in a bunch of different areas of my life is how we can expand the <strong>ethic</strong> of Open Source development.   </p>
<p>People want TurboGears to do more than it does, they want other open source projects to grow, they want new open source projects in specific areas, and they want <em>Open Source like activity</em> in other professions like nursing or construction. </p>
<p>I definitely don&#8217;t have the answers.   But I&#8217;ve had this conversation with a lot of folks over the last couple of months, and some of them had some great ideas.</p>
<p>So, in the spirit of opening up a larger conversation about these issues, here are a couple of thoughts distilled from all those conversations. </p>
<p><strong>Institutionalizing Open Source Values</strong></p>
<p>It is of course <em>possible</em> to create cultural institutions around which money can be channeled into Open Source development.  </p>
<p>And all the legal mechanisms needed to structure those institutions in the right way are available today.   </p>
<p>But the trick it seems is to create the institutions in such a way that money is delivered in <strong>small enough amounts that individuals remain in control</strong>.   Money is powerfully persuasive, but one of the keys to the current success of open source is that collective action is always purely voluntary.   </p>
<p>But at the same time the money needs to come in <strong>large enough amounts to make a difference.</strong>   People need to be able to support lives and families on the work they do advancing various projects.   To the extent that this is reliable income, we can remove competing priorities, and developers will be able to devote themselves more fully to projects that advance the common good. </p>
<p>So, the key to making all of this work is going to be the &#8220;bureaucracies&#8221; we create to manage the flow of money.   They need to be tuned properly to the nature of the work, stable enough to provide a level of personal security, and perhaps above all they need to be financially transparent. </p>
<p>Creating the right kinds of organizational structures will help us channel the right amounts of money to the right people, and creating the wrong kinds will create perverse incentives that pollute the whole system.</p>
<p>Most of what&#8217;s been happening so far in this direction are ecosystems of companies built around open source offerings.  This has worked pretty well, but it&#8217;s clear that there can be conflicts of interest, and the nature of commercial ownership leaves even the best run companies vulnerable to sudden changes (acquisition of small open source companies by huge proprietary competitors is already a fact of life). </p>
<p>But, what seems more interesting to me at this point is the number of foundations that are being are created for popular projects or groups of popular projects, etc.</p>
<p>These institutions will continue to grow, but they have the potential to change the way projects are run, so I expect a lot of fits and starts as we mature.   </p>
<p><strong>Open Source for other Professions</strong></p>
<p>With that thought in mind perhaps lawyers, doctors, and other professions already have a form of the Open Source ethic, which has grown up around large institutions, and functions to spread knowledge and advance the state of the art of those groups.  These institutions work to create new knowledge, train practitioners, and they seem to work pretty well.  </p>
<p>If you haven&#8217;t caught on already I think it might be fair to say that this sub-section of these professions is called &#8220;academics.&#8221;  ;) </p>
<p>Of course the university system isn&#8217;t perfect, and it&#8217;s taken hundreds of years to evolve to it&#8217;s current state, but I think it does provide some insight into how we might evolve larger institutional presences around open source, not in the next few years, but in the next few decades. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/12/14/how-do-we-expand-open-source/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python Template languages (Part 1 &#8212; Django)</title>
		<link>http://compoundthinking.com/blog/index.php/2009/12/09/python-template-languages-part-1-django/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/12/09/python-template-languages-part-1-django/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 08:59:33 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=273</guid>
		<description><![CDATA[I&#8217;ve been thinking a lot about template engines in Python recently. Partly because sourceforge.net&#8217;s new python code needed to choose a template language, and there were some questions about why we would choose one over the others. But beyond that In the past few weeks used Genshi, Mako, Jinja, Django Templates, and Cheetah, and have [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been thinking a lot about template engines in Python recently.  Partly because sourceforge.net&#8217;s new python code needed to choose a template language, and there were some questions about why we would choose one over the others.  </p>
<p>But beyond that   In the past few weeks used <a href="http://genshi.edgewall.org/">Genshi</a>, <a href="http://www.makotemplates.org/">Mako</a>, <a href="http://jinja.pocoo.org/2/documentation/">Jinja</a>, Django Templates, and <a href="http://pypi.python.org/pypi/Cheetah/1.0">Cheetah</a>, and have been looking at, but not yet using out <a href="http://pypi.python.org/pypi/chameleon.genshi">chameleon.genshi</a>.  </p>
<p>I figure all this promiscuous template library usage means that I should put my thoughts down somewhere.  There are advantages and disadvantages of all these libraries, but I think that the choices are pretty clear once you know your constraints. </p>
<p>I&#8217;m not going to commit to covering them all in depth, but I&#8217;m going to try to put my thoughts about them down over the next few days.   </p>
<p>For today let&#8217;s talk about the pros and cons of <strong>Django Templates.</strong>  This is another post that has been developed over the last year or so, where typed stuff up while working on <a href="http://fossfor.us">fossfor.us</a>.   </p>
<p>Django made making fossfor.us easy in lots of ways.   Want threaded comments? Add the existing app in a  couple hours &#8212; Done!   Want OpenID? Again add an app &#8212; Done!</p>
<p>But it also had frustrations, and one of the biggest for me was the template language.   </p>
<p><span id="more-273"></span></p>
<p><strong>First the good</strong></p>
<p>Django templates operate in a sandboxed environment.   This is good because it limits the ways that designers can blow-up your web-app. In fact this seems to be an underlying design decision of the Django framework.   It&#8217;s the reason accessing non-existent variables just returns empty strings, because as the Djanogo book tells me &#8220;you wouldn&#8217;t want a designer to be able to take down your website with a typo.&#8221;</p>
<p>I can respect that, and I definitely see the benefits of sandboxing template code, particularly in places where end-users might be allowed to edit templates.  </p>
<p><strong>Easy to learn, and easy to use</strong><br />
They also provide a <a href="http://docs.djangoproject.com/en/dev/topics/templates/">very simple</a> syntax, that&#8217;s very well documented.   This makes it easy for designers to figure out.   </p>
<p>All of this is good. </p>
<p><strong>But there are some negatives </strong></p>
<p>Django developers seem to love them, but I feel like there are some significant drawbacks to using django templates. </p>
<p><strong>Not trivial to use outside of django.</strong></p>
<p>You can do it, but it&#8217;s not easy, and you end up with a lot of Django loaded that you don&#8217;t need.    Fortunately there&#8217;s Jinja which is somewhat Django template like, but which isn&#8217;t at all dependent on Django itself.   So, if you&#8217;re not using Django, I think it&#8217;s sane to recommend that you use Jinja templates.    And tomorrow I&#8217;ll blog more about why I think that Jinja is just a better version of Django templates. </p>
<p><strong>Won&#8217;t let you follow the fail early philosophy of development</strong></p>
<p>When you use Django Templates in Django, I have two major issues.   THe first is the decision to always treat undefined variables as variables that contain an empty string.   Generally <a href="http://en.wikipedia.org/wiki/Fail-fast">&#8220;fail fast&#8221;</a> is a good engineering principle, because it&#8217;s helps you find problems sooner, and makes debugging much easier.   </p>
<p>Of course the Django guys are smart, and the knew about this so they planned for it.   </p>
<p><strong>Well sort-of</strong>, apparently it&#8217;s easy enough to make invalid variables return something other than an empty string by setting the <code>TEMPLATE_STRING_IF_INVALID</code> config variable to something else, which gets displayed if you access an undefined variable in a template (say you make a typo.  And this does makes it easier to find template errorsmore  quickly. </p>
<p><em>But it&#8217;s not really &#8220;failing fast.&#8221; </em> </p>
<p>I want an all out failure, not a<em> small</em> difference in the rendered page. </p>
<p>With that said, this as faar as it goes, I think it is good.  <code>TEMPLATE_STRING_IF_INVALID</code> should be a configuraiton option, (though perhaps with a better name) and people should turn it on in development and off in production.  Pylons does this with it&#8217;s <code>c</code> variable, and I think it&#8217;s very helpful. </p>
<p>But what I want is the exception, not just some random other text inserted, so then I looked into what it would take to force django template rendering to stop silently suppressing exceptions, and it&#8217;s not that hard on first glance.  </p>
<p>The template renderer depends on a special attribute <code>silent_variable_failure</code> being set to <code>True</code> on the exception, so all we would have to do is just disable this checking when the <code>fail_fast</code> config value was set to <code>True</code> and we&#8217;d be good to go.   </p>
<p><strong>Seemed like a good idea, but in reality &#8212; not so good. </strong></p>
<p>Django&#8217;s admin will totally break if you do such a thing, and it turns out that even setting the TEMPLATE_STRING_IF_INVALID parameter makes these pages render quite badly.   </p>
<p>I ultimately found this tidbit in the Django Template Docs: </p>
<blockquote><p>While TEMPLATE_STRING_IF_INVALID can be a useful debugging tool, it is a bad idea to turn it on as a &#8216;development default&#8217;.</p>
<p>Many templates, including those in the Admin site, rely upon the silence of the template system when a non-existent variable is encountered. If you assign a value other than &#8221; to TEMPLATE_STRING_IF_INVALID, you will experience rendering problems with these templates and sites.</p>
<p>Generally, TEMPLATE_STRING_IF_INVALID should only be enabled in order to debug a specific template problem, then cleared once debugging is complete</p></blockquote>
<p>Oops, that&#8217;s exactly what I don&#8217;t want.   In practice this was not as bad as I thought it would be, but it was not good, and it made my life harder because the time between making a typo in a template and finding the problem increased, which also increased the dificulty of finding the cause of the problem. </p>
<p><strong>My other frustration with Django Templates</strong></p>
<p>Beyond that, the fact that Django template sandboxing excludes all expressions pushes lots and lots of work into filters and up into the &#8220;views&#8221; which other frameworks call &#8220;controllers&#8221; and means that django views mix <strong>presentation</strong> and <strong>action</strong> logic even more than is common in other MVC like web frameworks (Rails, Pylons, TurboGears, etc.).</p>
<p>Having a full featured experssion language like <strong>python</strong> in templates has been very useful to me in capturing presentation logic <strong>in the template</strong>. </p>
<p>And at the same time creating anything like a &#8220;<strong><a href="http://jinja.pocoo.org/2/documentation/templates#macros">macro</a></strong>&#8221; or a &#8220;<strong><a href="http://genshi.edgewall.org/wiki/Documentation/xml-templates.html#id4">template function</a></strong>&#8221; (a bit of reusable template code) requires some <a href="http://docs.djangoproject.com/en/dev/howto/custom-template-tags/">slightly complicated</a> python gymnastics.  </p>
<p>I&#8217;m certainly no MVC purist, but I think that in the new post web-2.0 world where applications have HTLM frontends, rich javascript front-ends, and even flex/silverlight clients, it makes a lot of sense to keep presentation logic out of the &#8220;view/controller&#8221; and let that focus on handling HTTP requests, and marshaling the data required by whatever presentation technology (html, html+javascript, flex, rich-client + JSON, or whatever) you happen to use.  </p>
<p>And I really want to be able to have code-reuse in templates without jumping through hoops.   That&#8217;s part of what a template language is <strong>for</strong>, so I really don&#8217;t like giving it up. </p>
<p><strong>Conclusion</strong></p>
<p>With all of that said, if the benifits of Django (reusable apps mainly) are important to your project, you should use Django, and if you are using Django you <strong>absolutely should</strong> use Dango Templates.    They aren&#8217;t bad really.   It&#8217;s just that I&#8217;m used to the other options that do it better.</p>
<p>So, ultimately if you&#8217;re not already using Django, I think you should consider one of the other options, as I think they all do better on template code reuse, and allowing fail fast behavior. </p>
<p><strong>More Soon</strong></p>
<p>Tomorrow I&#8217;ll try to write a bit more about Jinja, but I think <a href="http://lucumr.pocoo.org/2008/9/16/why-jinja-is-not-django-and-why-django-should-have-a-look-at-it">this post</a> pretty much sumarizes why I think that Django Template users outside Django proper should really just use <a href="http://jinja.pocoo.org/2/documentation/">Jinja2</a>. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/12/09/python-template-languages-part-1-django/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Things I&#8217;ve learned about Time Management</title>
		<link>http://compoundthinking.com/blog/index.php/2009/12/01/things-ive-learned-about-time-management/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/12/01/things-ive-learned-about-time-management/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 14:41:42 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Personal Productivity]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[System Administration]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=613</guid>
		<description><![CDATA[It&#8217;s easy enough to say that you don&#8217;t have enough time, but the reality is that time is the medium in which we live. Complaining you don&#8217;t have enough time very much like a fish complaining that he doesn&#8217;t have enough water. So, rather than complaining about the amount of time I have, I&#8217;ve been [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s easy enough to say that you don&#8217;t have enough time, but the reality is that time is the medium in which we live.   Complaining  you don&#8217;t have enough time very much like a fish complaining that he doesn&#8217;t have enough water.   So, rather than complaining about the amount of time I have, I&#8217;ve been learning to think about my time management issues differently. </p>
<p><strong>Where David Allen lead me wrong</strong></p>
<p>The first insight I had is that Getting Things Done (GTD) has steared me wrong.   This is hard to say because I think it&#8217;s a great book with a lot of great insights.   In particular the strong admonition to get everything you need to do down on paper has changed the way I live and think.   That list includes all the major and minor commitments I&#8217;ve made, and having it out of my head and in a system that I trust reduced my stress levels imensely.  </p>
<p>But I found that I still have a lot of stress. And I found that I was still thrashing back and forth between projects without making the kind of decisive progress on any of them that I wanted to.   </p>
<p><strong>Why wasn&#8217;t the GTD process enough?</strong></p>
<p>Because, as I eventually learned the GTD &#8220;inbox processing&#8221; strategy as described in the book is broken.  You are supposed to choose between three options for each input: do it, deligate it, or defer it.   But really there&#8217;s a key fourth option that is the really important one if you&#8217;re life is anything like mine.  </p>
<p>What is that  all important forth option?</p>
<ul>
<li><strong>Don&#8217;t do it.</strong>  Say no.   Avoid adding another commitment to your list.</li>
</ul>
<p><strong>Wait, there&#8217;s <em>science</em> behind this!</strong></p>
<p>This is really critical because like any queue that&#8217;s processed by a limited resource (in this case my time and attention) filling it too full actually causes the system to break down.  This process of breakdown even has a technical name that feels exactly right, it&#8217;s called &#8220;<a href="http://en.wikipedia.org/wiki/Thrash_(computer_science)">thrashing</a>.&#8221;  </p>
<p>Every programmer and computer user knows what this is like.  Open too many apps at once, and your machine grinds to a halt, data keeps getting swapped out to disk and the rate at which the machine can process information goes down exponentially. </p>
<p>Ok, so know I knew the name for my problem.   Naming it is good, but it&#8217;s not the solution. </p>
<p><strong>So, how do I stop thrashing about and get stuff done? </strong></p>
<p>At some point, i&#8217;m not exactly sure where, I had a realization that in life, just like a manufacturing line, or a software resource issue, there are two keys to preventing thrashing.   </p>
<ol>
<li> Avoid too much multitasking.   A system spends time switching between tasks and is less efficent when time-windows for work are too small, and task-switching happens too often.</li>
<li>When multiple commitments are being made that require real-time or near real-time responses, you have to keep the task-switching window short enough that high-priority tasks can be scheduled immediately.  This, of course, creates a tension with the first principle which suggests larger time windows between task-switching.</li>
</ol>
<p>This is where Getting Things Done&#8217;s todo list system provided me with a <strong>lot</strong> of help. It helped me reduce my task-switching costs, and that&#8217;s allowed me to get a better balance on these two pressures.  </p>
<p><strong>Letting the work FLOW</strong></p>
<p>I think there&#8217;s a very clear analogy with what happened at Toyota in the early days.   Manufacturers had die presses which took a long time to change, so they would run them for a long time.  This was great in that it helped keep the machine working and limited the downtime.   But it also meant that there were long delays in the system since the switching time and the time for the long runs added up.    Toyota decided that since they couldn&#8217;t afford more machines, they needed to figure out ways to reduce the cost of switching, which reduced total cycle time, made them more responsive to bugs (quality problems) and helped them to get more done in less time.  </p>
<p>Reducing the cost of switching made it possible for the system to run differently, rather than batching up lots of work and pushing it through, it Toyota discovered that you could pull what you needed through the system just in time.  This same thing works for time management, when you aren&#8217;t overloaded you can be more responsive to today&#8217;s needs, and you avoid the inevitable mismatches that come with long delays between request and response. </p>
<p><strong>What happens when there&#8217;s still too much to do? </strong></p>
<p>But, to come back to my main point, <strong>even when you&#8217;ve done everything you can do to reduce the task-switching costs, you still can have significant thrashing problems</strong> when the resource (that&#8217;s you or me) gets overscheduled.   </p>
<p>Most projects I&#8217;ve worked on ended up in this situation at some point, where working harder stopped producing results because of schedule pressure and resource contention.   </p>
<p><strong>This is why saying no is a critical skill.</strong> </p>
<p>If you limit the commitments you make, you can provide rapid turn around on the commitements you do make, and everything runs much more smoothly because you&#8217;re thrashing less, and wasting less time on task switching. </p>
<p>Beyond the basics, I&#8217;ve discovered that one really critical notion is to have enough slack in your system to handle emergencies.  If you schedule the system full, any high-priority, high-urgency task that enters the system can break the whole process.</p>
<p><strong>Without <em>slack</em> in the system emergencies snowball&#8230;</strong></p>
<p>I know this from experience, as I&#8217;ve had my share of emergencies in the last couple of years, and when there was slack in the system things settled down quickly, and when there wasn&#8217;t I ended up with new emergencies caused by the first emergency delaying things just a little bit too much.  </p>
<p>So, when you are tempted to take on another commitment, think about what would happen to your life if you had to take a week off to deal with a death in the family, or to help a sick relative.  If you don&#8217;t see any path to recovery, perhaps you&#8217;re over-scheduling your most important resource &#8212; you.  </p>
<p><strong>When No, really means Yes</strong></p>
<p>In the end I discovered the biggest irony of time management: it&#8217;s only when you say  <strong>No</strong> to some things, that you have the ability to say <strong>Yes</strong>, and make real commitments.   </p>
<p>When you say no to helping a friend move, or to visiting family, or whatever feels valuable to you you <strong>will</strong> feel terrible.   But, if you don&#8217;t say no sometimes to at least some of these things, you&#8217;ll end up not being able to do any of those things anyway, because you&#8217;re always behind and never quite able to fulfill the commitments you make. </p>
<p>I learned the hard way, hopefully you don&#8217;t have to ;) </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/12/01/things-ive-learned-about-time-management/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Coupling Django Style</title>
		<link>http://compoundthinking.com/blog/index.php/2009/11/28/coupling-django-style/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/11/28/coupling-django-style/#comments</comments>
		<pubDate>Sat, 28 Nov 2009 17:32:24 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=349</guid>
		<description><![CDATA[I wrote the first draft of this a long time ago, and I skipped it because tempers seemed high in some places. It seems like things have calmed down, and I think the points are still 100% relevant. For those reading this remember, I&#8217;ve used Django to build things like http://fossfor.us and I have done [...]]]></description>
			<content:encoded><![CDATA[<p>I wrote the first draft of this a long time ago, and I skipped it because tempers seemed high in some places.   It seems like things have calmed down, and  I think the points are still 100% relevant.  </p>
<p>For those reading this remember, I&#8217;ve used Django to build things like http://fossfor.us and I have done enough Django surgery to know what I&#8217;m talking about. </p>
<p>Django Developers have said, over and over again: </p>
<blockquote><p>Django is tightly integrated and loosely coupled.</p></blockquote>
<p>On the face of it, this statement is paradoxical (more techncally, it sounds like an <a href="http://en.wikipedia.org/wiki/Antinomy">antinomy</a> to me) coupling and integration are generally seen as ends on a spectrum. Perhaps the Django catchphrase is more than just marketing speak, and actually means something.  </p>
<p>If so perhaps they are thinking that they are <em>more loosely coupled</em> than some, and <em>more tightly integrated</em> than others.   I suppose you could put opinionated frameworks like Ruby on Rails on one end, and free-form frameworks like Pylons on the other, and Django sits somewhere in between.    </p>
<p>But even that seems an oversimplification, Rails is a huge community and Rails users have lots of options, there are alternative template engines galore, and many other components have plugins which replace or seriously modify their behavior. </p>
<p>Lest you think I&#8217;m manufacturing this from the air, here&#8217;s a quote from a django proponent discussing the idea of loose coupling in Django: </p>
<blockquote><p>Developers coming from Ruby on Rails or other extremely opinionated frameworks may be used to following their framework&#8217;s best practices to avoid fighting against a framework which feels that it knows your project better than you do, but with Django you&#8217;ll be back in the driver&#8217;s seat.</p></blockquote>
<p>&#8211; Will Larson o<a href="http://lethain.com/entry/2008/jul/22/an-introduction-to-django-s-loose-coupling/">n &#8220;loose coupling&#8221;</a> in django</p>
<p>I think this is only true, if it&#8217;s true, by degree.   It&#8217;s easier to do radical surgery to the framework in Django than it is in Struts, though I&#8217;m not all that convinced that Rails is harder to change than Django.   But really, that&#8217;s beside the point.  The fact of the matter is that framework surgery is much harder to do in Django than Pylons, and I think that&#8217;s not a wild claim, but a verifiable fact. </p>
<blockquote><p>I wouldn&#8217;t recommend decoupling from the Django ORM without an <strong>extremely compelling</strong> reason. It is the most coupled of all the subparts of Django, and certainly not trivial to replace.</p></blockquote>
<p>&#8211; <a href="http://lethain.com/entry/2008/jul/23/replacing-django-s-orm-with-sqlalchemy/">Will Larson on using SQLAlchemy with Django</a> (emphasis added)</p>
<p>Using SQLAlchemy in Django is not really hard (but at the same time it&#8217;s not all that easy either).  But, it&#8217;s the kind of thing you wouldn&#8217;t want to do unless you really had a good reason.   </p>
<p>Why? Because there are an awful lot of Django components that are &#8220;tightly integrated&#8221; with the django ORM.   </p>
<p>But before everybody gets too mad at me, let me turn it around, and say that I think:</p>
<ul>
<li><strong>it is not a bad thing to value integration above coupling. </strong></li>
</ul>
<p>Another Quote from Will&#8217;s blog, shows that he&#8217;s aware that loose coupling isn&#8217;t the single core value of Django: </p>
<blockquote><p>Django places value on loose coupling, but it isn&#8217;t the sole design principle either.</p></blockquote>
<p>&#8211; Will Larson (in a comment <a href="http://lethain.com/entry/2008/jul/22/replacing-django-s-template-language-with-jinja2/">here</a>)</p>
<p>I would say that even more strongly: </p>
<p><strong>Django should not place loose coupling above developer productivity.</strong></p>
<p>Adrian made a good point after my talk by suggesting that developers need to <em>get things done</em>, and to make sites that work <em>now</em> &#8212; not create software that is perfect by some abstract standard of design.  </p>
<p>And I do think that some of the helpers that depend on the Django ORM are <a href="http://compoundthinking.com/blog/index.php/2008/02/13/site-components-in-django-and-tg2/">significant productivity wins</a>.   And, removing the django ORM dependency in all of them would be both very hard, and totally not worth it. </p>
<p>&#8220;Tightly Integrated&#8221; has value, and sometimes that value trumps &#8220;Loosely Coupled.&#8221;   Zope is pretty tightly integrated into the ZODB.   Many TurboGears 2 plugins are going to be pretty tightly integrated into SQLALchemy.   Others will not, and I have encouraged some folks to rewrite their TG2 plugins to make them into pure WSGI apps that <em>don&#8217;t depend on TG2 at all</em>.   Determining what exactly you will depend on, and how tightly you will be coupled to that dependency requires thought, and ultimately has consequences. </p>
<p>I&#8217;m hard on the Django folks here because I think the &#8220;tightly integrated/loosely coupled&#8221; buzz phrase <em>is actually detrimental to understanding</em> how the trade-off&#8217;s work. </p>
<p>And there are trade-offs and those trade-offs mean that there isn&#8217;t and will never be one perfect web-framework which somehow magically isn&#8217;t subject to the down-side of any of the constraints and design trade-offs that we all have to deal with every day. </p>
<p>Which brings me to the other major point I tried to make in <a href="http://www.youtube.com/watch?v=fipFKyW2FA4">my talk about django</a>.   Encapsulation, orthogality, or loose coupling is to some extent enforced by package boundaries.  It&#8217;s not so much that you can&#8217;t be tightly coupled to the internals of an outside package, but that it feels wrong.   And it feels wrong because when you start making libraries you start defining public interfaces, and making decisions about what&#8217;s internal and what&#8217;s external.   And that makes monkeying with the internals feel icky.   But if everything is all in one package, it&#8217;s a lot easier and less &#8216;icky&#8221; feeling to just grab some internal bit and do what you need to, since less thought has been given to what&#8217;s public and what&#8217;s private. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/11/28/coupling-django-style/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Serving Developers *and* Users at SourceForge</title>
		<link>http://compoundthinking.com/blog/index.php/2009/07/18/serving-developers-and-users-at-sourceforge/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/07/18/serving-developers-and-users-at-sourceforge/#comments</comments>
		<pubDate>Sat, 18 Jul 2009 01:50:20 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=703</guid>
		<description><![CDATA[My last post might have left some folks thinking that we&#8217;ve been focused entirely on &#8220;end user&#8221; experience at SourceForge and have been ignoring the developer side of the equasion, if that&#8217;s you, and you&#8217;ve felt a bit left out, there&#8217;s very good news. In the 7 months since I&#8217;ve been here, there have been [...]]]></description>
			<content:encoded><![CDATA[<p>My <a href="http://compoundthinking.com/blog/index.php/2009/07/16/turbogears-on-sourceforge/">last post</a> might have left some folks thinking that we&#8217;ve been focused entirely on &#8220;end user&#8221; experience at SourceForge and have been ignoring the developer side of the equasion, if that&#8217;s you, and you&#8217;ve felt a bit left out, there&#8217;s very good news.   In the 7 months since I&#8217;ve been here, there have been a significant number of developer focused changes at sf.net, and there are more coming before OSCON. </p>
<p><strong>Hosted Apps</strong></p>
<p>One of the biggest changes is the new <a href="http://sourceforge.net/apps/trac/sourceforge/wiki/Hosted%20Apps">Hosted Apps</a> system.   We&#8217;re an Open Source hosting company, and we want to provide some of the best tools available for Open Source developers, so it only makes sense to use Open Source tools to do it.   So, we now provide two dozen applications that you can install and use to help develop and manage your project, including trac, mediawiki, dotproject, a microbloging system, phpbb forums, an app for brainstorming ideas, and <a href="http://sourceforge.net/apps/trac/sourceforge/wiki/Hosted%20Apps">lots more</a>.<br />
<a href="http://sourceforge.net/apps/trac/sourceforge/wiki/Hosted%20Apps"><img src="http://compoundthinking.com/blog/wp-content/uploads/2009/07/trac_sourceforge-300x276.jpg" alt="trac hosted on sourceforge" title="trac hosted on sourceforge" width="300" height="276" align="right"/></a></p>
<p>From the perspective of an open source project maintainer, I think the best part of this is that I don&#8217;t have to manage them, do upgrades, backups, or worry about downtime &#8212; there are other people responsible for all that. </p>
<p><strong>Have it your way</strong></p>
<p>Part of the plan here is to make SourceForge more modular, and to let project managers use the tools that make sense for them and for their project.  I think we&#8217;re the only open source hosting solution that provides svn, git, hg, bzr, and cvs source repositories.  And with Trac, you&#8217;ve definitely got a far more full featured bug tracker than is available in most other open source project hosting.</p>
<p>One of the other advantages is that if you want new features in SourceForge, there&#8217;s now a clear and obvious way to do it.   For example if you want some new ticket tracking feature you can add that feature to Trac, and once there&#8217;s a new release, it&#8217;ll be added to your sf.net project for free. </p>
<p><strong>How the Consume side fits in</strong></p>
<p>If you saw <a href="http://compoundthinking.com/blog/index.php/2009/07/16/turbogears-on-sourceforge/">yesterday&#8217;s post,</a> you&#8217;ll remember this diagram.<br />
<a href="http://compoundthinking.com/blog/wp-content/uploads/2009/07/sfconsume.png"><img src="http://compoundthinking.com/blog/wp-content/uploads/2009/07/sfconsume.png" alt="sfconsume" title="sfconsume" width="554" height="554" class="alignnone size-full wp-image-695" /></a></p>
<p> We&#8217;ve created the summary page based on the idea that projects have data in various places, in SourceForge developed apps, in hosted apps, on freshmeat, and out on the web in various places.   In fact, all the the data on the sf.net project summary pages and download pages is fetched from the existing php apps via feeds and public API&#8217;s.   </p>
<p>We still have lots of work to do, but all of this means that we&#8217;re changing the way SourceForge works to serve our developers better.   We&#8217;re giving up on the assumption that we can provide the one right set of tools for all open source projects, and we&#8217;re also trying to leverage and improve existing open source solutions rather than reinvent the wheel.   </p>
<p>To be fair, lots of this stuff wasn&#8217;t available when sourceforge got started, so back then we had to do some inventing, but the open solutions have passed us in lots of areas, and we&#8217;re taking advantage of that. </p>
<p><strong>Developers need users too</strong></p>
<p>And that brings us full circle, we want to grow project communities.   In the end this means serving two sets of people well, and it means bringing those two communities together, serving developers means they get the tools they need to make better software, and serving downloaders and end users means the overall community grows.   But the real growth happens when the line between developer and user begins to blur, with non-developers triaging bugs, writing documentation, doing translations, and sometimes even becoming developers themselves.</p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/07/18/serving-developers-and-users-at-sourceforge/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>TurboGears 2.0.1 now available on pypi</title>
		<link>http://compoundthinking.com/blog/index.php/2009/06/22/turbogears-201-now-available-on-pypi/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/06/22/turbogears-201-now-available-on-pypi/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 20:21:32 +0000</pubDate>
		<dc:creator>Florent Aide</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=672</guid>
		<description><![CDATA[Since the beginning (nearly) of TurboGears 2.x development we use a private index to store all our dependencies and point people to it for installation. This was nice because it helped us control our dependency tree and make sure installation of our unstable software was as easy as possible. Since we had released a stable [...]]]></description>
			<content:encoded><![CDATA[<p>Since the beginning (nearly) of TurboGears 2.x development we use a <a title="TurboGears 2 private index" href="http://www.turbogears.org/2.0/downloads/2.0.1/" target="_blank">private index</a> to store all our dependencies and <a title="Install docs" href="http://www.turbogears.org/2.0/docs/main/DownloadInstall.html#install-turbogears-2" target="_blank">point people to it for installation</a>. This was nice because it helped us control our dependency tree and make sure installation of our unstable software was as easy as possible.</p>
<p>Since we had released a stable 2.0 version, followed by a 2.0.1 bugfix, we really were lacking a real pypi install mechanism. This is now a thing of the past! You can install a full blown TurboGears2 environment in one simple command:</p>
<p>easy_install tg.devtools</p>
<p>and this will fetch everything using normal lookups from the pypi. I hope this will help people out there.</p>
<p>At the same time I&#8217;d like to ask for help in that domain: If you are using TurboGears2 and find out that some dependency that needs compilation is not found in a compiled state (either on <a title="PYthon Package Index" href="http://pypi.python.org/pypi" target="_blank">pypi</a> or on <a title="TurboGears 2.0.1 index page" href="http://www.turbogears.org/2.0/downloads/2.0.1/" target="_blank">our index</a>), please help us:</p>
<ol>
<li>By sending a compiled version of the egg to me (florent aide, you&#8217;ll find me on the mailing list easily)</li>
<li>By pointing us the missing dependency (send a mail in the <a title="TurboGears Mailing List" href="http://groups.google.com/group/turbogears" target="_blank">turbogears</a> or <a title="TurboGears-Trunk Mailing List" href="http://groups.google.com/group/turbogears-trunk" target="_blank">turbogears-trunk</a> mailing list)</li>
<li>Or even better: try to become a maintainer for the specific dependency, that you know will always be missing for your architecture, and let us know about that great news. The whole open source community will become better, your karma (the real one, not the one you can admire on <a title="My false Karma" href="http://www.ohloh.net/accounts/faide" target="_blank">ohloh</a>) will bump-up and you&#8217;ll be forever remembered on <a title="not!" href="http://starwars.com/databank/location/endor/index.html" target="_blank">endor</a>.</li>
</ol>
<p>Now this leaves us with one more thing to do: finish <a title="Next TG website powered by TG" href="http://beta.turbogears.org/" target="_blank">the web site for turbogears that is currently in a poor state</a>. If you would like to help us on the <a title="TurboGears website engine" href="http://bitbucket.org/faide/turbogearsorg/overview/" target="_blank">engine</a>, please let us know in the mailing lists or via private message. If you want to help-out with content, please let us know also and we&#8217;ll be more than glad to give you an editor account and some directions to get some content online in this new website.</p>
<p>Cheers all,</p>
<p>Florent.</p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/06/22/turbogears-201-now-available-on-pypi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TurboGears 2.0 presentation video</title>
		<link>http://compoundthinking.com/blog/index.php/2009/06/15/turbogears-20-presentation-video/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/06/15/turbogears-20-presentation-video/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 08:29:50 +0000</pubDate>
		<dc:creator>Florent Aide</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=668</guid>
		<description><![CDATA[In the last post I said we presented TurboGears 2.0 at the Pycon FR event. We have received the video feeds from the organization. This is a French presentation, sorry for the non-french speakers. As a reminder the code of application we presented is available on bitbucket.]]></description>
			<content:encoded><![CDATA[<p>In the last post I said we presented TurboGears 2.0 at the Pycon FR event. We have received the <a title="TurboGears 2.0 presentation - French" href="http://video.pycon.fr/videos/free/63/" target="_blank">video feeds</a> from the organization. This is a French presentation, sorry for the non-french speakers.</p>
<p>As a reminder the code of application we presented is <a title="TGdo - TurboGears 2.0 demo application" href="http://bitbucket.org/zaf/tgdo/" target="_blank">available on bitbucket</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/06/15/turbogears-20-presentation-video/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>TurboGears 1.x to Turbogears 2.0</title>
		<link>http://compoundthinking.com/blog/index.php/2009/06/12/turbogears-1x-to-turbogears-20/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/06/12/turbogears-1x-to-turbogears-20/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 10:50:56 +0000</pubDate>
		<dc:creator>Florent Aide</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=651</guid>
		<description><![CDATA[Two weeks ago we (Jonathan Schemoul, Thomas Zaffran and me) animated a TurboGears 2.0 presentation (in french) and workshop at PyconFR 2009. PyconFR is an annual French Python event organized  by the AFPY. The presention was separated in two phases. The first part covered an history of the project and a technical overview. The second [...]]]></description>
			<content:encoded><![CDATA[<p>Two weeks ago we (<a href="http://www.linkedin.com/pub/jonathan-schemoul/2/603/b92" target="_blank">Jonathan Schemoul</a>, <a href="http://www.linkedin.com/pub/thomas-zaffran/5/377/951" target="_blank">Thomas Zaffran</a> and <a href="http://www.linkedin.com/in/florentaide" target="_blank">me</a>) animated a <a title="French: PyconFR 2009 - TurboGears 2.0 Presentation" href="http://compoundthinking.com/blog/wp-content/uploads/2009/06/pycon-tg.pdf">TurboGears 2.0 presentation (in french)</a> and workshop at <a title="Pycon FR 2009" href="http://fr.pycon.org/" target="_blank">PyconFR</a> 2009. PyconFR is an annual French Python event organized  by the <a href="http://www.afpy.org" target="_blank">AFPY</a>.</p>
<p>The presention was separated in two phases. The first part covered an history of the project and a technical overview. The second part was a live coding session during which we created a <a title="TODO list in TurboGears 2.0 - repository" href="http://bitbucket.org/zaf/tgdo/" target="_blank">small todolist application</a> to show-off the new TurboGears 2.0 features.</p>
<p><img class="alignnone" style="width: auto;" src="http://compoundthinking.com/blog/wp-content/uploads/2009/06/tgjon1.jpg" alt="Jon is hacking on turbogears 2" width="490" height="304" /></p>
<p>At the end of this presentation, one of the attendees came to us and gave us a nice remark that I would like to share with you here: &#8220;I did not remark any changes in TG2 since my TG1 days, did you change something?&#8221;</p>
<p>This was a pleasant surprise to me. This means one thing: we changed the whole underlying layers, rewrote authentication and authorization, switched tgwidgets with ToscaWidgets, based our Framework on Pylons instead of CherryPy &#8212; and yet this person, looking at the controller&#8217;s code of our todolist application felt &#8220;at home like if it was a TurboGears 1.0 application&#8221;.</p>
<p>As we already stated, we want to ease-out the tg1&#8211;&gt;tg2 transitions as much as possible. We know there is some room for improvement in that quarter! But since we (core devs) have live and running tg1 applications out there the itch is already there and we&#8217;ll make sure to scratch it.</p>
<p>As an example, <a title="Paris Envies" href="http://www.parisenvies.com/" target="_blank">Paris Envies</a> is a TurboGears 1.1 application, coming from an 1.0 background, using Genshi, SQLObject and TGWidgets. And I know for sure that Jon has a real incentive to move to TG2 and get SO support for it :)</p>
<p>Stay tuned people, TurboGears is live and well!</p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/06/12/turbogears-1x-to-turbogears-20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TurboGears 2.0 Final</title>
		<link>http://compoundthinking.com/blog/index.php/2009/05/27/639/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/05/27/639/#comments</comments>
		<pubDate>Wed, 27 May 2009 18:21:29 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=639</guid>
		<description><![CDATA[The long wait is finally over! I am happy to announce the release of TurboGears 2.0 final. This release is the product of a lot of work by the whole TurboGears team, and we&#8217;re very happy to have a final stable release. TurboGears 2.0 final includes all kinds of goodies for those making web applications, [...]]]></description>
			<content:encoded><![CDATA[<p>The long wait is finally over!</p>
<p>I am happy to announce the release of TurboGears 2.0 final. This release is the product of a lot of work by the whole TurboGears team, and we&#8217;re very happy to have a final stable release. TurboGears 2.0 final includes all kinds of goodies for those making web applications, from one of the most powerful and flexible Object Relational Mappers available in any language, to a powerful and flexible template system. But just as important as the quality of the parts, is the out-of-the-box integration to help get you started quickly:</p>
<ul>
<li>We have quickstart template that helps get you going quickly with everything you need: from sample templates, to sample controllers and tests.</li>
<li>We have an extensible user/groups/permission system that you can easily configure into your app when quickstarting a project.</li>
<li>We have zero config needed support for development database backed by SQLite.</li>
<li>We have a working admin system for editing your database while your app is in development.</li>
<li>Our admin system is extensible and reusable as a component of your application.</li>
</ul>
<p>There&#8217;s lots more. But equally important, we don&#8217;t think that out of the box defaults should be constraints on our users. So, a trivial configuration change lets you use DB2, or Oracle, or SQLServer, and everything we&#8217;ve wired up for you is easy enough to customize or replace. For example, we support configs for three major python template engines out of the box, and you can easily make your own render function to handle anything else you want.</p>
<p>One of the goals of TurboGears 2 is to use standard python components, that are valuable in all kinds of other contexts, so you are not tied into one monolythic system. Learning SQLAlchemy can help you write command line tools, GUI apps, web-services that don&#8217;t use a framework; Genshi is valuable when generating all kinds of xml data for interchange between systems; the beaker is a great caching system that&#8217;s valuable in all kind of web contexts, etc.</p>
<p>TurboGears 2 final is just now comming out, but it&#8217;s already in production use at places like ShootQ, RedHat? (for a large set of Fedora infrastructure projects) and many other places. And we&#8217;re already looking forward to a few more high profile TG2 deployments in the next few weeks.</p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/05/27/639/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Working at SourceForge</title>
		<link>http://compoundthinking.com/blog/index.php/2009/04/09/working-at-sourceforge/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/04/09/working-at-sourceforge/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 14:20:53 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Lean IT]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=621</guid>
		<description><![CDATA[I&#8217;ve been at SourceForge for a couple of months now, it&#8217;s been great, the work is surprisingly fun and rewarding. There&#8217;s a local office, and so I actually get to g and hang out with smart people whenever I want. I can still work from home, but having someplace to go in to has been [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been at SourceForge for a couple of months now, it&#8217;s been great, the work is surprisingly fun and rewarding.   There&#8217;s a local office, and so I actually get to g and hang out with smart people whenever I want.  I can still work from home, but having someplace to go in to has been a refreshing change. </p>
<p>I haven&#8217;t gotten to know many people outside the engineering team in Dexter, but they are great guys. </p>
<p>There&#8217;s lots of good stuff happening here, support for bazar, mercurial, git, trac, and other options on SourceForge itself, improved feeds, and other API&#8217;s for getting at SF data, etc.   But I&#8217;m only peripherally  aware of all that at the moment because I was hired to work on &#8220;totally new stuff&#8221; which is written in Python. </p>
<p><strong>What I&#8217;m working on</strong></p>
<p>Our first new project is a site called <a href="http://fossfor.us">FossFor.Us</a>, and it was the vision for this site, and the team that is working on this and other new stuff, that sold me on the coming to work for Sourceforge.     It&#8217;s written in Django, and it&#8217;s been my first really large Django project, and while the experience has been pretty positive, there have been a number of things that have renewed my commitment to TurboGears development &#8212; but that&#8217;s a blog post for another day.  </p>
<p>The backstory to the FossFor.Us site is that open source project hosting providers (Sourceforge and it&#8217;s recent competitors) have traditionally been pulled in two very different directions by  two very different sets of users: </p>
<ul>
<li>developers of open source software</li>
<li>and people who just want to<em use software to do stuff</em>.</em></li>
</ul>
<p>And that tension has held us back in the past, we have to serve everybody with the same portal, and it ends up not serving either community as well as it should.   But since developers are the most vocal users, it&#8217;s been the second class of user that&#8217;s been most neglected.</p>
<p><a href="http://fossfor.us"><img src="http://compoundthinking.com/blog/wp-content/uploads/2009/04/foss_blog_image.jpg" alt="foss_blog_image" title="foss_blog_image" width="400" height="229" /></a></p>
<p>These people are just looking to get things done, and don&#8217;t care about the &#8220;project&#8221; part of open source software, they are, at least at first, only interested in the &#8220;product.&#8221;   In many ways the Free and Open Source Software community has not served these people well. </p>
<p><a href="http://fossfor.us">Fossfor.us</a> is in it&#8217;s first incarnation an attempt to create a window on the free software world, that&#8217;s just about finding and using software.   But in a larger sense it&#8217;s an attempt to help us as a community to connect with potential users better. </p>
<p><strong>I think connecting FOSS geeks and users is  actually <em>important</em><br />
</strong></p>
<p>It&#8217;s important because people aren&#8217;t aware that there are free options, and are paying for software they can&#8217;t afford.   There&#8217;s a prototypical user (based on a real person) that we talk about a lot, who&#8217;s a single mom, has an old laptop, and struggles week to week to pay her bills, but who bought Photoshop, because &#8220;that&#8217;s how you edit photos.&#8221;    Her family could have used that money to more productive ends, but because she needed to edit photos, and didn&#8217;t know about the free alternatives all those opportunities are just lost.    </p>
<p>Of course the same thing is true of small business owners, who could use free software to reduce their &#8220;overhead&#8221; costs, and actually spend money on creating things people love.   Free software has the potential to lubricate the wheels of the economy, encourage entrepreneurial activity, and enrich people&#8217;s lives.    </p>
<p>All of this is to say I think <a href="http://fossfor.us">fossfor.us</a> is a way to serve the world by making the product of all the open source developer&#8217;s labor more easily available and more accessible to real people.   And when my mom actually used it to find some software a couple weeks ago, I knew we&#8217;d done something right.</p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/04/09/working-at-sourceforge/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Turbogears 2.0 RC1 Release</title>
		<link>http://compoundthinking.com/blog/index.php/2009/03/29/turbogears-20-rc1-release/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/03/29/turbogears-20-rc1-release/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 18:46:43 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TurboGears]]></category>
		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=619</guid>
		<description><![CDATA[I missed the boat by a few days here, but I posted up the first Release Candidate for TG2 earlier this week before pycon. And given the interest in the sprints, it&#8217;s very likely that we&#8217;ll have a 2.0 final release avalable by the end of next week.]]></description>
			<content:encoded><![CDATA[<p>I missed the boat by a few days here, but I posted up the first Release Candidate for TG2 earlier this week before pycon.   And given the interest in the sprints, it&#8217;s very likely that we&#8217;ll have a 2.0 final release avalable by the end of next week. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/03/29/turbogears-20-rc1-release/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>TurboGears 2 Beta 6 released</title>
		<link>http://compoundthinking.com/blog/index.php/2009/02/27/turbogears-2-beta-6-released/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/02/27/turbogears-2-beta-6-released/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 02:07:03 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=609</guid>
		<description><![CDATA[TurboGears 2.0 beta 6 comes with lots of fixes, and a total feature freeze in preparation for the first Release Candidate. From here on out to 2.0, we&#8217;ll only be doing bugfixes and improving our Docs. Speaking of Docs, Beta 6 comes on the heals of this last weekend&#8217;s doc sprint, so it already comes [...]]]></description>
			<content:encoded><![CDATA[<p>TurboGears 2.0 beta 6 comes with lots of fixes, and a total feature freeze in preparation for the first Release Candidate. From here on out to 2.0, we&#8217;ll only be doing bugfixes and improving our Docs. Speaking of Docs, Beta 6 comes on the heals of this last weekend&#8217;s doc sprint, so it already comes with new and improved documentation.</p>
<p>One thing which you should be aware of in Beta 6 is that after you install tg.devtools and quickstart a new application you have to do  python setup.py develop  on your quickstarted app because some of the dependencies for the app are not installed until that time. This allows you to remove optional dependencies from your application if you&#8217;re not using them.</p>
<p>Jorge Vargas has <a href="http://www.turbogears.org/2.0/docs/main/DownloadInstall.html">completely rewritten</a> the Install doc.   Anita has done great work on <a href="http://www.turbogears.org/2.0/docs/main/Wiki20/wiki20.html">the Wiki 20 doc</a>, which is providing an ever improving introduction to TG2. </p>
<p>Christoph Zwerschke has update the <a href="http://www.turbogears.org/2.0/docs/main/ToscaWidgets/forms.html">ToscaWidgets</a> forms doc, Chris Perkins has documented the <a href="http://www.turbogears.org/2.0/docs/main/RestControllers.html">new RestController stuff</a> which simplifies common Create, Read, Update, and Delete operations. And I  created an<a href="http://www.turbogears.org/2.0/docs/main/RequestFlow.html"> overview of the TurboGears 2 stack</a>.  There are also new docs on the<a href="http://www.turbogears.org/2.0/docs/main/Templates/Alternative.html"> alternative template engines</a>. </p>
<p>And of course there were also many, many smaller updates spread across the TG2 docs.</p>
<p>We are nowhere near where we want to be with the TG2 docs, but they are shaping up quite nicely.  And we&#8217;re getting very close to the final release.   </p>
<p>It&#8217;s been a great ride, and I&#8217;m already looking forward to some of the <a href="http://trac.turbogears.org/query?status=new&#038;status=assigned&#038;status=reopened&#038;milestone=2.0rc1">great things in store</a> for 2.1. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/02/27/turbogears-2-beta-6-released/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
