<?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/"
	>

<channel>
	<title>Blue Sky On Mars</title>
	<atom:link href="http://www.blueskyonmars.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.blueskyonmars.com</link>
	<description>Kevin Dangoor on Creating Software Products</description>
	<pubDate>Thu, 02 Jul 2009 15:11:50 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>MichiPUG July meeting tonight! Python in vfx, Impressive, 3.1</title>
		<link>http://www.blueskyonmars.com/2009/07/02/michipug-july-meeting-tonight-python-in-vfx-impressive-31/</link>
		<comments>http://www.blueskyonmars.com/2009/07/02/michipug-july-meeting-tonight-python-in-vfx-impressive-31/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 15:11:40 +0000</pubDate>
		<dc:creator>Kevin Dangoor</dc:creator>
		
		<category><![CDATA[Python]]></category>

		<category><![CDATA[michipug]]></category>

		<guid isPermaLink="false">http://www.blueskyonmars.com/2009/07/02/michipug-july-meeting-tonight-python-in-vfx-impressive-31/</guid>
		<description><![CDATA[The next MichiPUG meeting will be on Thursday, July 2nd at 7PM. Ryan Burns will talk about the Impressive presentation software (which was used at Tuesday&#8217;s Ignite Ann Arbor) and Terry Howald will talk about Python&#8217;s use in scripting visual effects.We may also talk about the Python 3.1 release. 
The meeting will be in downtown [...]]]></description>
			<content:encoded><![CDATA[<p>The next <a href="http://groups.google.com/group/michipug/web/index-2">MichiPUG</a> meeting will be on Thursday, July 2nd at 7PM. Ryan Burns will talk about the Impressive presentation software (which was used at Tuesday&#8217;s Ignite Ann Arbor) and Terry Howald will talk about Python&#8217;s use in scripting visual effects.We may also talk about the Python 3.1 release. </p>
<p>The meeting will be in downtown Ann Arbor at the <a href="http://groups.google.com/group/michipug/web/SRT%20Solutions">SRT Solutions</a> office.</p>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.blueskyonmars.com/2009/07/02/michipug-july-meeting-tonight-python-in-vfx-impressive-31/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MichiPUG: using Python to run reports in Hadoop clusters</title>
		<link>http://www.blueskyonmars.com/2009/06/02/michipug-using-python-to-run-reports-in-hadoop-clusters/</link>
		<comments>http://www.blueskyonmars.com/2009/06/02/michipug-using-python-to-run-reports-in-hadoop-clusters/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 20:01:58 +0000</pubDate>
		<dc:creator>Kevin Dangoor</dc:creator>
		
		<category><![CDATA[Python]]></category>

		<category><![CDATA[michipug]]></category>

		<guid isPermaLink="false">http://www.blueskyonmars.com/2009/06/02/michipug-using-python-to-run-reports-in-hadoop-clusters/</guid>
		<description><![CDATA[Zattoo&#8217;s Marshall Weir will be talking at this week&#8217;s MichiPUG (Thursday evening at 7PM at SRT Solutions in downtown Ann Arbor). In his own words:
I&#8217;ve been working on a python module for running reports in Hadoop. Its sort of a wrapper around the pig data processing language and some smarts for running reports on a [...]]]></description>
			<content:encoded><![CDATA[<p>Zattoo&#8217;s Marshall Weir will be talking at this week&#8217;s MichiPUG (Thursday evening at 7PM at SRT Solutions in downtown Ann Arbor). In his own words:<br />
<blockquote>I&#8217;ve been working on a python module for running reports in Hadoop. Its sort of a wrapper around the pig data processing language and some smarts for running reports on a hadoop cluster and pushing and pulling data to it. It&#8217;s designed primarily to make it easier and more efficient to run complex sets of interdependent reports - I&#8217;ve been using it to do business reporting on our customer behavior at Zattoo.</p></blockquote>
<p>This should be very interesting for folks like me who have never seen Hadoop in action!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blueskyonmars.com/2009/06/02/michipug-using-python-to-run-reports-in-hadoop-clusters/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MacSpeech fails the version number test</title>
		<link>http://www.blueskyonmars.com/2009/05/15/macspeech-fails-the-version-number-test/</link>
		<comments>http://www.blueskyonmars.com/2009/05/15/macspeech-fails-the-version-number-test/#comments</comments>
		<pubDate>Fri, 15 May 2009 12:00:38 +0000</pubDate>
		<dc:creator>Kevin Dangoor</dc:creator>
		
		<category><![CDATA[Product Management]]></category>

		<guid isPermaLink="false">http://www.blueskyonmars.com/2009/05/15/macspeech-fails-the-version-number-test/</guid>
		<description><![CDATA[MacSpeech Dictate 1.5 has just been released. In the process, they made a major product management blunder: they chose the wrong version number. How can you mess up with a version number? Simple: you misalign your own expectations with those of your customers.
MacSpeech Dictate is really the only viable speech recognition software for the Mac [...]]]></description>
			<content:encoded><![CDATA[<p>MacSpeech Dictate 1.5 has just been <a href="http://www.macspeech.com/extensions/forums/topic.php?id=320">released</a>. In the process, they made a major product management blunder: they chose the wrong version number. How can you mess up with a version number? Simple: you misalign your own expectations with those of your customers.</p>
<p>MacSpeech Dictate is really the only viable speech recognition software for the Mac today. Their original iListen project wasn&#8217;t so hot. So, they licensed the Dragon NaturallySpeaking engine and put a Mac UI on top to produce Dictate. The first version that came out was somewhat incomplete, in that there was no way to train the program and improve its accuracy. In October 2008, they released Dictate 1.2 as a free upgrade, adding the training features. In February 2009, Dictate 1.3 added features to make dictation work better with other apps and add some other features. Dictate 1.3 was also a free upgrade.</p>
<p>Now, three months later, they have released Dictate 1.5 as a $55 upgrade. Two of the major features listed are &#8220;better accuracy&#8221; and &#8220;faster performance&#8221;, which I think to many people come across as fixes more than features. Just take a look at the comments <a href="http://www.macspeech.com/extensions/forums/topic.php?id=320">on the forum thread</a>. The Vocabulary Editor is a true new feature, and the &#8220;New Commands&#8221; bit sounds like a minor thing they tossed in.</p>
<p>Based on the feature list they presented, &#8220;1.5&#8243; sounds like the right version number. It doesn&#8217;t seem any greater in scope than 1.2 or 1.3. And yet, for the MacSpeech folks themselves, it probably seems like a long time since 1.0 came out and perhaps they&#8217;re feeling the pinch of the current economy. Certainly, the amount of work they&#8217;ve done on the product between 1.0 and 1.5 is significant. I&#8217;m sure they feel entitled to an additional $55.</p>
<p>Release early, release often is a phrase used a lot in the open source world. For commercial software, however, if you want to offer a paid upgrade, you <i>can&#8217;t</i> follow that rule. By doing relatively quick releases of similar scope, MacSpeech inadvertently set the expectation that 1.5 should be a free upgrade. Had they spent 3-6 more months adding new features and then released it as &#8220;2.0&#8243;, I&#8217;m certain they would have had fewer complaints about the upgrade being a paid upgrade.</p>
<p>As far as I know, MacSpeech Dictate doesn&#8217;t have any strong competition. From that perspective, they could have waited a few months more. It <i>is</i> possible that they&#8217;ve been hit by the economy, though, and couldn&#8217;t wait several more months for the additional revenue. If so, that&#8217;s a tough spot, and I wish them luck. Regardless, I doubt they were expecting this kind of reaction to a new release, and they may not get the kind of revenue they&#8217;re hoping for. HarvidMD in the forum thread:<br />
<blockquote>With upgrade policies like this, I think that I&#8217;ll save my pennies and wait for MacSpeech Dictate 3.0 in about five years so that I&#8217;ll be able to get a voice recognition package that actually performs as advertised.</p></blockquote>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=3784bccd-378a-814c-8a79-5e70491ef456" /></div>
]]></content:encoded>
			<wfw:commentRss>http://www.blueskyonmars.com/2009/05/15/macspeech-fails-the-version-number-test/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MichiPUG May meeting: non-relational DBs</title>
		<link>http://www.blueskyonmars.com/2009/05/05/michipug-may-meeting-non-relational-dbs/</link>
		<comments>http://www.blueskyonmars.com/2009/05/05/michipug-may-meeting-non-relational-dbs/#comments</comments>
		<pubDate>Tue, 05 May 2009 11:23:41 +0000</pubDate>
		<dc:creator>Kevin Dangoor</dc:creator>
		
		<category><![CDATA[Python]]></category>

		<category><![CDATA[michipug]]></category>

		<guid isPermaLink="false">http://www.blueskyonmars.com/?p=2578</guid>
		<description><![CDATA[The next MichiPUG meeting will be on Thursday, May 7th at 7PM. The topic for this week is newfangled non-relational databases (with demos of Couch DB, Mongo DB, Tokyo Cabinet, Persevere, and Redis promised)
via Welcome - Michigan Python Users Group &#124; Google Groups.
As usual, the meeting will be at the SRT Solutions office in downtown [...]]]></description>
			<content:encoded><![CDATA[<p>The next MichiPUG meeting will be on Thursday, May 7th at 7PM. The topic for this week is newfangled non-relational databases (with demos of Couch DB, Mongo DB, Tokyo Cabinet, Persevere, and Redis promised)</p>
<p>via <a href="http://groups.google.com/group/michipug/web/index-2">Welcome - Michigan Python Users Group | Google Groups</a>.</p>
<p>As usual, the meeting will be at the SRT Solutions <a href="http://groups.google.com/group/michipug/web/SRT%20Solutions">office in downtown Ann Arbor</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blueskyonmars.com/2009/05/05/michipug-may-meeting-non-relational-dbs/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JSConf 2009: the best conference you couldn&#8217;t attend!</title>
		<link>http://www.blueskyonmars.com/2009/04/27/jsconf-2009-the-best-conference-you-couldnt-attend/</link>
		<comments>http://www.blueskyonmars.com/2009/04/27/jsconf-2009-the-best-conference-you-couldnt-attend/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 18:17:06 +0000</pubDate>
		<dc:creator>Kevin Dangoor</dc:creator>
		
		<category><![CDATA[JavaScript]]></category>

		<category><![CDATA[jsconf]]></category>

		<guid isPermaLink="false">http://www.blueskyonmars.com/?p=2576</guid>
		<description><![CDATA[(sorry for the lack of links in here. I wrote this on a plane and haven&#8217;t had a chance to do anything else to it&#8230;)
I just returned from JSConf 2009, the first JSConf conference. It was possibly even the first conference to feature JavaScript as a general scripting language in the same vein as Python [...]]]></description>
			<content:encoded><![CDATA[<p>(sorry for the lack of links in here. I wrote this on a plane and haven&#8217;t had a chance to do anything else to it&#8230;)</p>
<p>I just returned from JSConf 2009, the first JSConf conference. It was possibly even the first conference to feature JavaScript as a general scripting language in the same vein as Python or Ruby.</p>
<p>Overall, it was a very good conference. The organizers did a terrific job and paid great attention to detail. The sponsored evening events were an awesome idea and well-executed. (At least, Friday night&#8217;s was, I flew home Saturday evening). It was a relatively small conference at 130 people. I think they can easily have double that number next year, if they want to. But, that would require a change of venue, because the Hotel Palomar&#8217;s meeting rooms were filled almost to overflowing. From talking with Chris Williams on Friday evening, it doesn&#8217;t sound like they&#8217;re interested in changing venues next year, which is a shame because a lot of people will have to miss out on a great conference.</p>
<p>Francisco Tolmasky from 280 North gave the perfect kind of talk to kick things off. I&#8217;ve been following Cappucino&#8217;s development, so I was not surprised in the least with what I saw. But, Francisco is a polished speaker and many people had not seen Apple&#8217;s Interface Builder used to create webapps (via Cappucino&#8217;s nib2cib tool). We didn&#8217;t get a demo of Atlas, which would certainly have wowed this audience.</p>
<p>One thing that pleased a great many people in the audience, myself included, was word that Safari&#8217;s debugger would start looking at a &#8220;displayName&#8221; on functions to determine what name to show in the debugger/profiler. JavaScript has many places where it&#8217;s impossible to guess a reasonable name, and it&#8217;s nice to have a way to give the debugger a hint like this. Let&#8217;s hope we get this in Firebug soon.</p>
<p>Toward the end of the second day, there was a talk about SproutCore, so we had a chance to two different ways to apply the style of Apple&#8217;s Cocoa to building webapps. As with anything, there are tradeoffs. Cappucino builds on Objective-J, which gives you a more concise syntax than straight JavaScript for things like Key Value Observing. If JavaScript today had getters and setters, then this particular benefit of Objective J would go away. For now, though, using SproutCore effectively means calling get* and set* methods to get variable values rather than just looking up the value directly.</p>
<p>There were two presentations on server side JavaScript, a topic that people who know me know that I am currently very into. Nick Campbell showed off the Axiom Stack, which builds on Helma. Axiom is presently AGPL-licensed, which means I won&#8217;t go anywhere near it. But, that&#8217;s just me. On the plus side, Nick has been peripherally following the activity on ServerJS and is quite in tune with our goals. Nick&#8217;s company, by the way, has a unique and useful sounding web marketing-related product coming out soon, so keep an eye on those folks if you&#8217;re a marketer.</p>
<p>The second Track A presentation about server side JS was James Duncan&#8217;s presentation about Joyent&#8217;s Smart platform. I must say that this looks like an excellent offering, and I&#8217;m looking forward to seeing a lot more of it as it hits general availability. The best parallel I can draw is &#8220;App Engine on JavaScript&#8221;, but that doesn&#8217;t really do it justice. They have a key-value store that they will scale transparently for you. No more manual sharding! Just start tossing data in. Of course, that&#8217;s the promise&#8230; and the devil&#8217;s in the details with such things. I came in a bit late to James&#8217; presentation and I forgot to ask him afterwards about their data store&#8217;s indexing capabilities and whether it is eventual-consistency based or more immediate than that.</p>
<p>The Smart platform is SpiderMonkey-based, and they pull some interesting tricks to overcome the lack of a decent stack of libraries for SpiderMonkey. Their web server interface looked very much like Jack, which is a bonus. It would be nice if we can harmonize it with Jack in some fashion. Intriguingly, their web framework, which is apparently based on Sinatra, looks an awful lot like the home grown one that I made for Bespin in Python and then duplicated in JavaScript.</p>
<p>I didn&#8217;t lump my former SitePen colleague Kris Zyp&#8217;s talk in with the other server side JS talks, because Kris was talking a lot more about JS that spans from client to server and using standards such as JSON Path, JSON Query, Persistent JS, and JSON object referencing to move data around seamlessly. Of course, he used Dojo and Persevere as his demo platform, but the ideas he presented can be applied anywhere.</p>
<p>Brian LaRoux&#8217;s talk on PhoneGap was quite interesting and entertaining. Brian&#8217;s talk had a refreshing lack of gravity, while still providing useful content. For one, he mentioned that Dashcode actually offers good tools for making iPhone web apps. He talked about a variety of iPhone-related JS toolkits, and gave a demo of Nitobi&#8217;s iPhone &#8220;stimulator&#8221; which does a better job of representing how an iPhone app will behave than Apple&#8217;s own simulator.</p>
<p>I should note that there were probably 50% fewer bullet points than what I have seen at some other tech conferences I&#8217;ve been to. I think the message is sinking in that bullet points suck (except for actual lists of things).</p>
<p>My Mozilla colleague, John Resig gave a wide-ranging talk about JavaScript performance testing, games and his project of the moment, TestSwarm. TestSwarm looks fantastic and fills a gap: it will provide a way to do cross-browser continuous integration tests. People join the test swarm by opening their browser up to the TestSwarm page, and the server will send them test jobs as they come in. So, for example, a revision gets checked into jQuery, and the TestSwarm server will pull out the tests and send them down the wire to a collection of testers who are using different browsers. The results from all of the browsers will come back and get logged. This tool will be useful for a lot more than just jQuery, and John offered help connecting it up with, say, DOH for Dojo&#8217;s tests.</p>
<p>Another former SitePen colleague, Pete Higgins gave a Dojo roundup at the very end of the conference. I saw half of his talk before I had to go to the airport. There are lots of good things afoot in Dojo-land. The new conditional compilation stuff seems useful for a variety of things. For example, Dojo can be built in a super-slim variety (6K) that loads everything dynamically. Or you can dump all of the IE compatibility stuff. With the Bespin project, we have a plan to ship a variety of packagings, and I can see this being useful for that as well.</p>
<p>Pete&#8217;s Plugd (which he pronounces &#8220;plug-dee&#8221; as opposed to &#8220;plugged&#8221;) project provides a bunch of extra convenient ways to use Dojo and I do hope to see that stuff included in 1.4. Pete says that Plugd will likely add 4K to Dojo&#8217;s gzipped size, but I think it&#8217;s likely worth it.</p>
<p>Malte Ubi likely takes the prize for JSConf attendee who came the longest distance to attend, having flown in all the way from Hamburg, Germany. Malte has been doing some fantastic work on Bespin. Actually, the things he&#8217;s been doing go beyond the realm of fantastic and into &#8220;crazy&#8221;: using Narcissus (JavaScript parser in JavaScript) to read your JavaScript file in a web worker to provide completely client-based outline views and code completion. Awesome.</p>
<p>Malte did a Track B talk on Joose, his JS object system that is built on ideas from Perl&#8217;s Moose. It looks like a very powerful system that provides things like type coercion and traits (called roles here) that you don&#8217;t find in the type systems that typically come with JS toolkits. If I recall correctly, Joose weighs in at about 16K gzipped, so it&#8217;s not a small package.</p>
<p>Nick Carter gave a Track B talk on his JS ORM, JazzRecord It&#8217;s a direct descendant of Rails&#8217; ActiveRecord. It looks like a nice enough package, but seeing his samples made me that much more convinced that Atul is right: SQL does not belong in the browser. The sqlite storage engine may very well, but SQL itself does not. TaffyDB, dojo.data, CouchDB, whatever&#8230; just as long as the principal form of expression, persistence and querying is JS. The needs of a typical web client are very different from the kinds of things to which we apply SQL on the server. And, even then, people are starting to realize that SQL is not the best tool for every job.</p>
<p>I spoke on Track B about ServerJS. I called the session &#8220;a standard library for JavaScript in non-browser contexts&#8221;, or something catchy like that, because it is clear that what we&#8217;re building applies just as much to command line tools and other kinds of non-browser programs as it does to the server side of web apps.</p>
<p>My talk came immediately after James Duncan spoke about dynamic loading of C code into a SpiderMonkey environment. I lamely brought up ctypes as one approach, but dynamic loading of binaries is not my strength. I suggested that James would get useful feedback for his idea on the ServerJS list, given the number of people who are linking C/C++ libraries up with SpiderMonkey and v8.</p>
<p>As for ServerJS itself, I spoke about the project in general and our biggest milestone to date: the &#8220;SecurableModule&#8221;. I had a simple &#8220;math.js&#8221; module with a fibonacci function in it. I picked a lovely O(n^2) function to show the performance difference between Rhino and v8 which is considerable. Since math.js is a &#8220;pure JavaScript&#8221; module, I was able to demo that module being loaded into: Narwhal on Rhino, Narwhal on k7, Persevere, Helma NG (as a Jack app, no less) and GPSEE. I also demonstrated how with Narwhal/Rhino, I could &#8220;forget&#8221; to put a &#8220;var&#8221; in and my variable would not suddenly leak into the global namespace.</p>
<p>I also mentioned that we&#8217;re working on binary objects and files and that Jack (the interface) has good prospects given how proven the technique is in Python and Ruby.</p>
<p>I hope that at JSConf 2010, we&#8217;ll be able to see some significant apps built on a fairly complete platform.</p>
<p>Conference co-organizer Chris Williams thanked me for my endorsement of the conference, saying that I pushed Mozilla over the edge on sponsoring the conference. I had no idea I had such pull :). Anyhow, Mozilla&#8217;s sponsorship apparently had a direct impact on the conference food, which was quite beyond typical conference fare. Thanks to whomever it was at Mozilla who gave the a-ok on this.</p>
<p>As with any conference, the hallway track is among the most important, and I had a good time meeting new people and talking about a range of things. Community-driven conferences do bring in a good collection of people to meet.</p>
<p>I am doubtless leaving people out of this roundup, and I apologize for that. I am sure there are some other JSConf roundups that will provide additional insight. Also, the videos will be showing up online over time, so keep an eye out for that.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blueskyonmars.com/2009/04/27/jsconf-2009-the-best-conference-you-couldnt-attend/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Speaking at JSConf on Saturday at 1:45PM</title>
		<link>http://www.blueskyonmars.com/2009/04/21/speaking-at-jsconf-on-saturday-at-145pm/</link>
		<comments>http://www.blueskyonmars.com/2009/04/21/speaking-at-jsconf-on-saturday-at-145pm/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 13:01:58 +0000</pubDate>
		<dc:creator>Kevin Dangoor</dc:creator>
		
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.blueskyonmars.com/?p=2574</guid>
		<description><![CDATA[JSConf is coming up on Friday, and I&#8217;ll be there. I was too late to get a normal &#8220;track A&#8221; talk in, but I am scheduled in the &#8220;track B&#8221; room for Saturday at 1:45PM to talk about a standard library for JavaScript development outside of the browser. It&#8217;ll be a 30 minute session, and [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.jsconf2009.com/">JSConf</a> is coming up on Friday, and I&#8217;ll be there. I was too late to get a normal &#8220;track A&#8221; talk in, but I am scheduled in the &#8220;track B&#8221; room for Saturday at 1:45PM to talk about a standard library for JavaScript development outside of the browser. It&#8217;ll be a 30 minute session, and I&#8217;m hoping to have some cool stuff to show!</p>
<p>I hope to see you there!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blueskyonmars.com/2009/04/21/speaking-at-jsconf-on-saturday-at-145pm/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Paver 1.0 released!</title>
		<link>http://www.blueskyonmars.com/2009/03/23/paver-10-released/</link>
		<comments>http://www.blueskyonmars.com/2009/03/23/paver-10-released/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 13:10:23 +0000</pubDate>
		<dc:creator>Kevin Dangoor</dc:creator>
		
		<category><![CDATA[Paver]]></category>

		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.blueskyonmars.com/?p=2569</guid>
		<description><![CDATA[At long last, I&#8217;ve released Paver 1.0. Here&#8217;s the announcement that I sent to python-announce:
After months of use in production and about two months of public testing for 1.0, Paver 1.0 has been released. The changes between Paver 0.8.1, the most recent stable release, and 1.0 are quite significant. Paver 1.0 is easier, cleaner, less [...]]]></description>
			<content:encoded><![CDATA[<p>At long last, I&#8217;ve released <a href="http://www.blueskyonmars.com/projects/paver/">Paver</a> 1.0. Here&#8217;s the announcement that I sent to python-announce:</p>
<p>After months of use in production and about two months of public testing for 1.0, Paver 1.0 has been released. The changes between Paver 0.8.1, the most recent stable release, and 1.0 are quite significant. Paver 1.0 is easier, cleaner, less magical and just better all around. The backwards compatibility breaks should be easy enough to work around, are described in DeprecationWarnings and were introduced in 1.0a1 back in January.</p>
<p>Paver&#8217;s home page: http://www.blueskyonmars.com/projects/paver/</p>
<h3>What is Paver?</h3>
<p>Paver is a Python-based software project scripting tool along the lines of Make or Rake. It is not designed to handle the dependency tracking requirements of, for example, a C program. It *is* designed to help out with all of your other repetitive tasks (run documentation<br />
generators, moving files about, downloading things), all with the convenience of Python&#8217;s syntax and massive library of code.</p>
<p>If you&#8217;re developing applications in Python, you get even more&#8230; Most public Python projects use distutils or setuptools to create source tarballs for distribution. (Private projects can take advantage of this, too!) Have you ever wanted to generate the docs before building the source distribution? With Paver, you can, trivially. Here&#8217;s a complete pavement.py::</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;color: #1B0C00;">    <span style="color: #ff7700;font-weight:bold;color: #B83A24;">from</span> paver.<span style="color: black;">easy</span> <span style="color: #ff7700;font-weight:bold;color: #B83A24;">import</span> <span style="color: #66cc66;color: #00E;">*</span>
    <span style="color: #ff7700;font-weight:bold;color: #B83A24;">from</span> paver.<span style="color: black;">setuputils</span> <span style="color: #ff7700;font-weight:bold;color: #B83A24;">import</span> setup
&nbsp;
    setup<span style="color: black;color: #00E;">&#40;</span>
        name=<span style="color: #483d8b;color: #666666;">&quot;MyCoolProject&quot;</span>,
        packages=<span style="color: black;color: #00E;">&#91;</span><span style="color: #483d8b;color: #666666;">'mycool'</span><span style="color: black;color: #00E;">&#93;</span>,
        version=<span style="color: #483d8b;color: #666666;">&quot;1.0&quot;</span>,
        url=<span style="color: #483d8b;color: #666666;">&quot;http://www.blueskyonmars.com/&quot;</span>,
        author=<span style="color: #483d8b;color: #666666;">&quot;Kevin Dangoor&quot;</span>,
        author_email=<span style="color: #483d8b;color: #666666;">&quot;dangoor@gmail.com&quot;</span>
    <span style="color: black;color: #00E;">&#41;</span>
&nbsp;
    @task
    @needs<span style="color: black;color: #00E;">&#40;</span><span style="color: black;color: #00E;">&#91;</span><span style="color: #483d8b;color: #666666;">'html'</span>, <span style="color: #483d8b;color: #666666;">&quot;distutils.command.sdist&quot;</span><span style="color: black;color: #00E;">&#93;</span><span style="color: black;color: #00E;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;color: #B83A24;">def</span> sdist<span style="color: black;color: #00E;">&#40;</span><span style="color: black;color: #00E;">&#41;</span>:
        <span style="color: #483d8b;color: #666666;">&quot;&quot;&quot;Generate docs and source distribution.&quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;color: #B83A24;">pass</span></pre></div></div>

<p>With that pavement file, you can just run &#8220;paver sdist&#8220;, and your docs will be rebuilt automatically before creating the source distribution. It&#8217;s also easy to move the generated docs into some other directory (and, of course, you can tell Paver where your docs are stored, if they&#8217;re not in the default location.)</p>
<h3>Installation</h3>
<p>The easiest way to get Paver is if you have setuptools_ installed.</p>
<pre>easy_install Paver</pre>
<p>Without setuptools, it&#8217;s still pretty easy. Download the Paver .tgz file from <a href="http://pypi.python.org/pypi/Paver/">Paver&#8217;s Cheeseshop page</a>, untar it and run:</p>
<pre>python setup.py install</pre>
<h3>Help and Development</h3>
<p>You can get help from the <a href="http://groups.google.com/group/paver">mailing list</a>.</p>
<p>If you&#8217;d like to help out with Paver, you can check the code out from Googlecode:</p>
<pre>svn checkout http://paver.googlecode.com/svn/trunk/ paver-read-only</pre>
<p>You can also take a look at <a href="http://code.google.com/p/paver/">Paver&#8217;s project page on Googlecode</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blueskyonmars.com/2009/03/23/paver-10-released/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Paver 1.0b1 released</title>
		<link>http://www.blueskyonmars.com/2009/03/13/paver-10b1-released/</link>
		<comments>http://www.blueskyonmars.com/2009/03/13/paver-10b1-released/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 13:15:47 +0000</pubDate>
		<dc:creator>Kevin Dangoor</dc:creator>
		
		<category><![CDATA[Paver]]></category>

		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.blueskyonmars.com/2009/03/13/paver-10b1-released/</guid>
		<description><![CDATA[I&#8217;ve just released Paver 1.0b1. This new release adds a fun little feature. A typical setup.py script looks like this:

from distutils.core import setup
&#160;
setup&#40;name=&#34;Foo&#34;, ...&#41;

With the new version of Paver, you can now rename setup.py to pavement.py (or run paver -f setup.py) and then do:

from paver.setuputils import setup
&#160;
setup&#40;name=&#34;Foo&#34;, ...&#41;

That gets you going quite quickly, doesn&#8217;t it? [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just released Paver 1.0b1. This new release adds a fun little feature. A typical setup.py script looks like this:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;color: #1B0C00;"><span style="color: #ff7700;font-weight:bold;color: #B83A24;">from</span> <span style="color: #dc143c;color: #8FB394;">distutils</span>.<span style="color: black;">core</span> <span style="color: #ff7700;font-weight:bold;color: #B83A24;">import</span> setup
&nbsp;
setup<span style="color: black;color: #00E;">&#40;</span>name=<span style="color: #483d8b;color: #666666;">&quot;Foo&quot;</span>, ...<span style="color: black;color: #00E;">&#41;</span></pre></div></div>

<p>With the new version of Paver, you can now rename setup.py to pavement.py (or run <code>paver -f setup.py</code>) and then do:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;color: #1B0C00;"><span style="color: #ff7700;font-weight:bold;color: #B83A24;">from</span> paver.<span style="color: black;">setuputils</span> <span style="color: #ff7700;font-weight:bold;color: #B83A24;">import</span> setup
&nbsp;
setup<span style="color: black;color: #00E;">&#40;</span>name=<span style="color: #483d8b;color: #666666;">&quot;Foo&quot;</span>, ...<span style="color: black;color: #00E;">&#41;</span></pre></div></div>

<p>That gets you going quite quickly, doesn&#8217;t it? Of course, you&#8217;d likely want to add <code>from paver.easy import *</code> and to start making tasks that take advantage of Paver.</p>
<p>1.0b1 includes some other bug fixes, brings back the call_task function (particularly useful for distutils tasks), and makes the help output more consistent.</p>
<p>There&#8217;s one more bug on my list to fix (the distutils output is not showing up), and then I need to rework the docs for Paver 1.0.</p>
<p><b>Update:</b> It occurred to me a bit later that my example above doesn&#8217;t work, because you need to call install_distutils_tasks to get Paver to pick up all of the distutils/setuptools commands. However, this will be fixed in rc1.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blueskyonmars.com/2009/03/13/paver-10b1-released/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Paver 1.0a3 released</title>
		<link>http://www.blueskyonmars.com/2009/03/06/paver-10a3-released/</link>
		<comments>http://www.blueskyonmars.com/2009/03/06/paver-10a3-released/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 16:14:26 +0000</pubDate>
		<dc:creator>Kevin Dangoor</dc:creator>
		
		<category><![CDATA[Paver]]></category>

		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.blueskyonmars.com/2009/03/06/paver-10a3-released/</guid>
		<description><![CDATA[I have just released Paver 1.0a3. This has some good refinements on the way to 1.0 final and a couple of nice, new features (the &#8220;auto&#8221; task and the &#8220;pushd&#8221; context manager):


Added automatic running of “auto” task. If there’s a task with the name “auto”, it is run automatically. Using this mechanism, you can write [...]]]></description>
			<content:encoded><![CDATA[<p>I have just released <a href="http://www.blueskyonmars.com/projects/paver/">Paver</a> 1.0a3. This has some good refinements on the way to 1.0 final and a couple of nice, new features (the &#8220;auto&#8221; task and the &#8220;pushd&#8221; context manager):
<ul>
<li>
<p class="first">Added automatic running of “auto” task. If there’s a task with the name “auto”, it is run automatically. Using this mechanism, you can write code that sets up the options any way you wish, and without using globals at all (because the auto task can be given options as a parameter).</p>
</li>
<li>
<p class="first">When generating egg_info running “paver”, the full path to the Paver script was getting included in egg-info/SOURCES.txt. This causes installation problems on Windows, at the very least. Paver will now instead place the pavement that is being run in there. This likely has the beneficial side effect of not requiring a MANIFEST.in file just to include the pavement.</p>
</li>
<li>
<p class="first">the options help provided via the cmdopts decorator now appears</p>
</li>
<li>
<p class="first">pavements can now refer to __file__ to get their own filename. You can also just declare pavement_file as an argument to your task function, if you wish.</p>
</li>
<li>
<p class="first">call_pavement now switches directories to the location of the pavement and then switches back when returning</p>
</li>
<li>
<p class="first">if you try to run a function as a task, you’ll now get a more appropriate and descriptive BuildFailure, rather than an AttributeError</p>
</li>
<li>
<p class="first">paver can now again run tasks even when there is no pavement present. any task accessible via paver.easy (which now also includes misctasks) will work.</p>
</li>
<li>
<p class="first">added the pushd context manager (Python 2.5+). This will switch into another directory on the way in and then change back to the old directory on the way out. Suggested by Steve Howe, with the additional suggestion from Juergen Hermann to return the old directory:</p>
<div class="highlight-python">
<div class="highlight">
<pre>&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;pushd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'newdirectory'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;olddirectory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt;    &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="n"&gt;something&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;</pre>
</div></div>
</li>
</ul>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=12d55277-c5e6-4625-8065-ad2bd49c9d26" /></div>
]]></content:encoded>
			<wfw:commentRss>http://www.blueskyonmars.com/2009/03/06/paver-10a3-released/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MichiPUG meeting tomorrow, March 5th</title>
		<link>http://www.blueskyonmars.com/2009/03/04/michipug-meeting-tomorrow-march-5th/</link>
		<comments>http://www.blueskyonmars.com/2009/03/04/michipug-meeting-tomorrow-march-5th/#comments</comments>
		<pubDate>Wed, 04 Mar 2009 12:44:07 +0000</pubDate>
		<dc:creator>Kevin Dangoor</dc:creator>
		
		<category><![CDATA[Python]]></category>

		<category><![CDATA[michipug]]></category>

		<guid isPermaLink="false">http://www.blueskyonmars.com/2009/03/04/michipug-meeting-tomorrow-march-5th/</guid>
		<description><![CDATA[The monthly Michigan Python Users Group (MichiPUG) meeting is coming up tomorrow! This month, we&#8217;re going to do something a little different: sprinting on a project to help out a new coworking space that is being set up in downtown Ann Arbor (see below for the full description from Bob Kuehne).
As usual, the meeting starts [...]]]></description>
			<content:encoded><![CDATA[<p>The monthly <a href="http://groups.google.com/group/michipug/web/index-2">Michigan Python Users Group</a> (MichiPUG) meeting is coming up tomorrow! This month, we&#8217;re going to do something a little different: sprinting on a project to help out a new coworking space that is being set up in downtown Ann Arbor (see below for the full description from Bob Kuehne).</p>
<p>As usual, the meeting starts at 7PM at <a href="http://groups.google.com/group/michipug/web/SRT%20Solutions">SRT Solutions</a>.</p>
<p><a href="http://groups.google.com/group/michipug/browse_thread/thread/6394cacc6e885713">proposal for 03/02/09 - Michigan Python Users Group | Google Groups</a><br />
<blockquote>background:</p>
<p>* a guy named mike kessler is opening a co-working space on main  <br />street, tween washington and huron, in the<br />   old arcadian too space, right next door to (south) vinology. the  <br />space is designed as a place where people<br />   can pop in for a day, hang out, work with other people, get a  <br />permanent desk, host trainings, etc. it&#8217;s<br />   going to be pretty cool.</p>
<p>* as part of that, he needed some sort of door lock/authentication  <br />system. i volunteered to put one<br />   together, and it&#8217;s coming along fine, from the hardware and  <br />software side. it&#8217;s basically a bag of<br />   scripts (python, natch), and some csv files for manager users,  <br />logging, whatever. oh, and a door latch<br />   that gets controlled by the above.</p>
<p>* but from a ui perspective, i know better things could be done, and  <br />this is where you come in.</p>
<p>pug topic/sprint:</p>
<p>* if people are up for it, i&#8217;d like to do three things:<br />* 30m : setup tasks, review / design schema<br />* 60m : split into groups and build an interactive site to do a few  <br />tasks<br />* 30m : each group discuss results, demonstrate (10-15m@) </p></blockquote>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=898ba881-9b89-4b2a-9716-b229dd7cdda1" /></div>
]]></content:encoded>
			<wfw:commentRss>http://www.blueskyonmars.com/2009/03/04/michipug-meeting-tomorrow-march-5th/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.736 seconds -->
<!-- Cached page served by WP-Cache -->
