<?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>rexmere.com &#187; Development</title>
	<atom:link href="http://rexmere.com/category/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://rexmere.com</link>
	<description>Technical Arcana, Software Ephemera and Miscellaneous Bits. Keith R. Fieldhouse proprietor.</description>
	<lastBuildDate>Wed, 18 Mar 2009 00:36:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Installing different Python environments on Mac OS Leopard</title>
		<link>http://rexmere.com/2009/03/17/installing-different-python-environments-on-mac-os-leopard/</link>
		<comments>http://rexmere.com/2009/03/17/installing-different-python-environments-on-mac-os-leopard/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 00:36:17 +0000</pubDate>
		<dc:creator>Keith Fieldhouse</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Macintosh]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://rexmere.com/?p=86</guid>
		<description><![CDATA[This link at jessenoller.com is an excellent reference on setting up multiple Python installs on Mac OS Leopard and using virtualenv to create bespoke working environments for various Python packages:
jessenoller.com - So you want to use python on the mac?
]]></description>
			<content:encoded><![CDATA[<p>This link at <a href="http://jessenoller.com/">jessenoller.com</a> is an excellent reference on setting up multiple Python installs on Mac OS Leopard and using <a href="http://pypi.python.org/pypi/virtualenv">virtualenv</a> to create bespoke working environments for various Python packages:</p>
<p><a href="http://jessenoller.com/2009/03/16/so-you-want-to-use-python-on-the-mac/">jessenoller.com - So you want to use python on the mac?</a></p>
]]></content:encoded>
			<wfw:commentRss>http://rexmere.com/2009/03/17/installing-different-python-environments-on-mac-os-leopard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cappuccino and CherryPy, Part II</title>
		<link>http://rexmere.com/2008/12/21/cappuccino-and-cherrypy-part-ii/</link>
		<comments>http://rexmere.com/2008/12/21/cappuccino-and-cherrypy-part-ii/#comments</comments>
		<pubDate>Sun, 21 Dec 2008 18:32:59 +0000</pubDate>
		<dc:creator>Keith Fieldhouse</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[development python cherrypy cappuccino]]></category>

		<guid isPermaLink="false">http://rexmere.com/?p=80</guid>
		<description><![CDATA[I'm in the process of blogging my experiences using the Cappuccino JavaScript framework and CherryPy, a Python web application project.  The first post can be found here.
Cappuccino is designed to provide an application-like interface inside a web browser.   As a result, when you're building a Cappuccino application, instead of the server providing [...]]]></description>
			<content:encoded><![CDATA[<p><em>I'm in the process of blogging my experiences using the Cappuccino JavaScript framework and CherryPy, a Python web application project.  <a href="http://rexmere.com/2008/12/20/cappuccino-and-cherrypy/">The first post</a> can be found here.</em></p>
<p>Cappuccino is designed to provide an application-like interface inside a web browser.   As a result, when you're building a Cappuccino application, instead of the server providing a sequence of pages to view, the server is providing data (usually using JSON) that the Cappuccino application running in the browser retrieves and displays.   For all practical purposes, using Cappuccino is very like old-fashioned client server programming with the client written in Objective-J and the server, in this case, written in Python.</p>
<p>In this post we'll focus on changing the Cappuccino "Hello World" application so that it retrieves it's message from the server using JSON.  No, it's not a particularly exiting application but it has the virtue of being simple and fundamental:  Once it's possible to act on JSON data from the server, the rest is just details.</p>
<p>First, we'll change the client side Objective-J code.  We need to add the following two lines to the end applicationDidFinishLauching: method of our AppController in AppController.j</p>
<pre class="objc">&nbsp;
    var request = <span style="color: #002200;">&#91;</span>CPURLRequest requestWithURL:<span style="color: #666666;">&quot;getLabel&quot;</span><span style="color: #002200;">&#93;</span>;
    var connection = <span style="color: #002200;">&#91;</span>CPURLConnection connectionWithRequest:request delegate:self<span style="color: #002200;">&#93;</span>;
&nbsp;</pre>
<p>The first line creates a <a href="http://cappuccino.org/learn/documentation/class_c_p_u_r_l_request.html">CPURLRequest</a> for the "getLabel" URL from the server.   The second line actually makes the connection to the server using that request object.  Like it's inspiration, Cocoa, Cappuccino makes heavy use of the delegate pattern.  In this case we pass our AppController object as the delegate for the <a href="http://cappuccino.org/learn/documentation/class_c_p_u_r_l_connection.html">CPURLConnection</a>.  There are two methods that the CPURLConnection may call on the delegate.   We'll add those next:</p>
<pre class="objc">&nbsp;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #002200;">&#41;</span>connection:<span style="color: #002200;">&#40;</span>CPURLConnection<span style="color: #002200;">&#41;</span> connection didReceiveData:<span style="color: #002200;">&#40;</span>CPString<span style="color: #002200;">&#41;</span>data
<span style="color: #002200;">&#123;</span>
    var result = CPJSObjectCreateWithJSON<span style="color: #002200;">&#40;</span>data<span style="color: #002200;">&#41;</span>;
    <span style="color: #002200;">&#91;</span>label setStringValue:result.label<span style="color: #002200;">&#93;</span>
<span style="color: #002200;">&#125;</span>
&nbsp;
- <span style="color: #002200;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #002200;">&#41;</span>connection:<span style="color: #002200;">&#40;</span>CPURLConnection<span style="color: #002200;">&#41;</span>connection didFailWithError:<span style="color: #002200;">&#40;</span>CPString<span style="color: #002200;">&#41;</span>error
<span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>label setStringValue:@<span style="color: #666666;">&quot;Label Did Fail With Error&quot;</span><span style="color: #002200;">&#93;</span>
<span style="color: #002200;">&#125;</span>
&nbsp;</pre>
<p>The method "connection:didReceiveData:" is called with the original connection object (useful to distinguish between multiple pending connections) and the data that the server provided.  The "connection:didFailWithError" is called if the connection failed for some reason.</p>
<p>For now, we'll simply change the label when the connection completes.  If the connection fails, we'll note that.   If the connection does receive data, we'll use that data to change the label.  To do this, we use a CPJSObjectCreateWithJSON(data) object.  Once we've done that, we can retrieve the "label" attribute of the result and display it.</p>
<p>There's one other thing that we need to do on the client side for all of this to work.  In the original AppController.j, the label object is a local variable.  Since other methods of our AppController object need to access that object, we need to make it an instance object.   We do this by adding the following line to the "@implementation AppController" stanza in AppController.j:</p>
<pre lange="objc">
CPTextField label;
</pre>
<p>We also need to remove the "var" qualifier from the first appearance of the label variable in "applicationDidFinishLaunching:"</p>
<p>The server side is even simpler.  We simply need to add a method that will respond to the "getLabel" request that the client will make.  We do this by adding a "getLabel"<br />
method to the root CherryPy object:</p>
<pre class="python">&nbsp;
    @cherrypy.<span style="color: black;">expose</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> getLabel<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        data = <span style="color: black;">&#123;</span><span style="color: #483d8b;">&quot;label&quot;</span>:<span style="color: #483d8b;">&quot;Server Hello&quot;</span> <span style="color: black;">&#125;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> simplejson.<span style="color: black;">dumps</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
&nbsp;</pre>
<p>In that method, we'll create the Python dictionary that we'll return.  It has one attribute/key "label" which we'll set to the string "Server Hello".  Then we use the Python simplejson to convert that object to a JSON string which we return.  </p>
<p>We've seen that it's fairly easy to communicate between the Cappuccino client and the CherryPy server.  Next we'll start looking at building a somewhat more elaborate client application based on data returned from the server.</p>
]]></content:encoded>
			<wfw:commentRss>http://rexmere.com/2008/12/21/cappuccino-and-cherrypy-part-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cappuccino and CherryPy</title>
		<link>http://rexmere.com/2008/12/20/cappuccino-and-cherrypy/</link>
		<comments>http://rexmere.com/2008/12/20/cappuccino-and-cherrypy/#comments</comments>
		<pubDate>Sat, 20 Dec 2008 23:54:10 +0000</pubDate>
		<dc:creator>Keith Fieldhouse</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Macintosh]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[development python cherrypy cappuccino]]></category>

		<guid isPermaLink="false">http://rexmere.com/?p=72</guid>
		<description><![CDATA[Cappuccino is a JavaScript toolkit for building application like experiences on the web.  It's developed (and used) by the folks who produced 280 Slides, a rather amazing presentation package for the web.
I've been doing a fair bit of of Mac development and have come to appreciate the syntax of Objective-C.  One of the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://cappuccino.org/">Cappuccino</a> is a JavaScript toolkit for building application like experiences on the web.  It's developed (and used) by the folks who produced <a href="http://280slides.com/">280 Slides</a>, a rather amazing presentation package for the web.</p>
<p>I've been doing a fair bit of of Mac development and have come to appreciate the syntax of Objective-C.  One of the more interesting aspects of Cappuccino is that it has created a new dialect of JavaScript that they call Objective-J.  <a href="http://cappuccino.org/discuss/2008/12/08/on-leaky-abstractions-and-objective-j/">This blog post</a> explains some of the motivations they had for doing this.  In any event, I decided that I'd like to give Cappuccino a spin.</p>
<p>My "go to" language for server back ends is <a href="http://www.python.org">Python</a>.   I also like <a href="http://www.cherrypy.org/">CherryPy</a>, a Python server framework that makes it easy to attach Python code to web requests.  Since Cappuccino is designed to make it easy to build an application inside a browser window, the back end mostly needs to be able to serve up <a href="http://www.json.org/">JSON</a> data for the Cappuccino application to present.  CherryPy makes this fairly easy.</p>
<p>To get started, I downloaded the the Cappuccino "<a href="http://cappuccino.org/download/">Starter Package</a>".  Inside that zip file is a "NewApplication" directory.  I copied that directory as a directory called "static" in the my Application directory.  If you open the supplied index.html, you are presented with a very basic "Hello World" application written in Cappuccino.  In order to to build the application I have in mind though, I want that index.html to come from my CherryPy server so that the Cappuccino application can easily request information.  </p>
<p>To do this, I configured my CherryPy application to server the contents of my Application/static directory.   This is readily accomplished by creating a CherryPy configuration file cherrycappuccino.ini:</p>
<pre class="ini">&nbsp;
<span style="color: #000066; font-weight:bold;"><span style="">&#91;</span>global<span style="">&#93;</span></span>
tools.staticdir.<span style="color: #000099;">root </span>= <span style="color: #933;">&quot;/Users/keith/Projects/CherryCappuccino/Application&quot;</span>
&nbsp;
<span style="color: #000066; font-weight:bold;"><span style="">&#91;</span>/<span style="">&#93;</span></span>
tools.staticdir.<span style="color: #000099;">on </span>=<span style="color: #660066;"> True</span>
tools.staticdir.<span style="color: #000099;">dir </span>= <span style="color: #933;">&quot;static&quot;</span>
&nbsp;</pre>
<p>This tells CherryPy to server the contents of my "static" directory statically.  </p>
<p>What remains is the Python code that builds the CherryPy application.    At this point it's quite simple.  We create one object that's mounted on the root of the CherryPy server.   It's index method simply returns the contents of the index.html file in the static directory (there might be other ways to accomplish this but this was expedient.  Here's the Python code from cherrycappuccino.py in my Application directory:</p>
<pre class="python">&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> cherrypy
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> CherryCappuccino:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">indexText</span> = <span style="color: #008000;">None</span>
&nbsp;
    @cherrypy.<span style="color: black;">expose</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> index<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">indexText</span>:
            indexFileName = <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">dirname</span><span style="color: black;">&#40;</span>__file__<span style="color: black;">&#41;</span>,<span style="color: #483d8b;">&quot;static&quot;</span>,<span style="color: #483d8b;">&quot;index.html&quot;</span><span style="color: black;">&#41;</span>
            indexFile = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>indexFileName<span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">indexText</span> = indexFile.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">indexText</span>
&nbsp;
cherrypy.<span style="color: black;">quickstart</span><span style="color: black;">&#40;</span>CherryCappuccino<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>,<span style="color: #483d8b;">'/'</span>,<span style="color: #483d8b;">&quot;cherrycappuccino.ini&quot;</span><span style="color: black;">&#41;</span>
&nbsp;</pre>
<p>This reads the cherrycappuccino.ini file to configure the application and starts the server with our single application object.    Starting the server with "python cherrycappuccino.py" sets up the server that can be browsed to at http://localhost:8080.</p>
<p>In a future post, I'll show how to configure the Cappuccino view based on data returned from the server.</p>
]]></content:encoded>
			<wfw:commentRss>http://rexmere.com/2008/12/20/cappuccino-and-cherrypy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Mercurial for Mac OS X Development</title>
		<link>http://rexmere.com/2008/08/05/using-mercurial-for-mac-os-x-development/</link>
		<comments>http://rexmere.com/2008/08/05/using-mercurial-for-mac-os-x-development/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 00:12:46 +0000</pubDate>
		<dc:creator>Keith Fieldhouse</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Macintosh]]></category>

		<guid isPermaLink="false">http://rexmere.com/2008/08/05/using-mercurial-for-mac-os-x-development/</guid>
		<description><![CDATA[As a budding Mac developer, one of the things that I've had to sort out is which source code version control system I want to use.  I first started using version control with RCS some 25 years ago.  I've introduced version control or better version control at several of the jobs I've had. [...]]]></description>
			<content:encoded><![CDATA[<p>As a budding Mac developer, one of the things that I've had to sort out is which source code version control system I want to use.  I first started using version control with <a href="http://www.gnu.org/software/rcs/">RCS</a> some 25 years ago.  I've introduced version control or better version control at several of the jobs I've had.  Heck, I've even published an <a href="http://www.linux.com/articles/45381">article</a> on using version control.  Most recently I've used <a href="http://www.perforce.com/">Perforce</a> at an installation with a few thousand fellow developers.</p>
<p>Which is to say that while my eyes will still glaze over during a discussion of the relative merits of different delta storage mechanisms, I know enough to know why the latest crop of distributed version control (DVCS) systems are interesting and that I wanted to use one of the "big three" (<a href="http://git.or.cz/">Git</a>,  <a href="http://www.selenic.com/mercurial/wiki/">Mercurial</a>, <a href="http://bazaar-vcs.org/">Bazaar</a>).</p>
<p>I didn't bother trying Git.  Mostly because cross platform support (especially Windows support) didn't seem to be "job 1" (or "job 2" or even "job 3 or 4") with the developers (understandable given Git's history but not as useful to me -- sooner or later all projects cross platforms it seems).  Besides, both Mercurial and Bazaar are largely written in Python which I use extensively and that made them interesting to me.  Given that all three are used extensively for large projects, whimsical winnowing criteria like this feel safe enough.</p>
<p>I started out with Bazaar, largely because at the time it was easier to find a non-Fink, non-MacPorts installer for it.  It was pretty easy to set up and use and the benefits of it's distributed nature were readily apparent -- my favorite productivity trick is to take my laptop somewhere without a net connection and trivially easy branching and versioning while offline were a breath of fresh air to a Perforce expatriot.</p>
<p>But.  I've switched to Mercurial.   Mercurial now has a non-Fink, non-MacPorts installer as well (maybe it always has).  And it has "hg serve".    The "hg serve" command starts an ad-hoc web server that you can browse to locally or over a network to get a quick graphical view of your repository.  It comes built-in with  Mercurial and it works anywhere Mercurial works.   Nothing else to install,  no half baked GUI clients, just a good, easy to use GUI.  It's not a particularly functional UI (you don't use it to check things in for example) but it provides the thing I want most from a VCS UI: the ability to quickly and easy browse through my repository and look at differences between revisions of code.  I keep my own code and any third party code I use under source control and the ability to easily look at revisions (color hilighted, full context etc.) is an important aspect of code archeology.   Life's too damn short to spend it looking at raw diffs in a terminal window.</p>
<p>So that's why I decided to give Mercurial a try.   I wound up sticking with it (at least so far) becuase it was relatively easy to find information (mostly on the Mercurial wiki) on how to use Mercurial on a Mac, in particular it turned out to be very easy to confgure Mercurial to use FileMerge for diffs and, more importantly, merges  (I've never been very good at textual merges with the "&gt;&gt;&gt;&gt;" token markers).</p>
<p>Beyond that, using "bzr" or "hg" commands is largely the same with some minor translation required.  In the end, though, it was just easier to make Mercurial dovetail with my Mac and my style quickly and with very little fuss.</p>
<p>The rest of this post will describe how I've set up Mercurial.  It's quite possible that all of the following can be done with Bazaar and Git just as easily.  I'm putting it here so that it will hopefully will save some one who wants to try Mercurial on the Mac some time.</p>
<p>Once you've installed the <a href="http://mercurial.berkwood.com/">lastest version of Mercurial </a>on your Mac you'll want to configure it.  You'll do this by creating and editing an ~/.hgrc file.  Here are the contents of mine:</p>
<blockquote><p>[ui]<br />
username = Keith Fieldhouse &lt;keith@rex...&gt;</p>
<p>[extensions]<br />
hgext.extdiff =</p>
<p>[extdiff]<br />
cmd.opendiff = opendiff-w</p>
<p>[merge-tools]<br />
filemerge.executable = opendiff-w<br />
filemerge.args = $local $other -ancestor $base -merge $output</p></blockquote>
<p>The "username" in the [ui] section simply provides a nice username to label changes in your repository with.  the "hgext.extdiff =" line simply turns on the "External Diff" extension.  While it's labeled an "extension", it comes as part of the Mercurial distribution.  The "cmd.opendiff" line tells Mercurial to run the opendiff-w script (see below) when the "hg opendiff" command is used.   Simillarly, the commands under [merge-tools] tells Mercurial how to run the same opendiff-w script when it wants to allow you to do a merge.</p>
<p>The opendiff-w script simply runs opendiff (the command line command that starts FileMerge) through a pipe so that it will wait until FileMerge has exited before returning from the command which is the behavior that Mercurial expects from the diff and merge tools.   My copy of opendiff-w is kept in /usr/local/bin and looks like this:</p>
<blockquote><p>#!/bin/sh<br />
opendiff "$@" | cat</p></blockquote>
<p>Note that all of the above works after installing the Mac OS X version of Mercurial.  No further software is required (well, beyond the Mac developer tools themselves).  Most of this information can be found at the Mercurial Wiki.  <a href="http://www.selenic.com/mercurial/wiki/index.cgi/ExtdiffExtension?highlight=%28FileMerge%29">This page</a> and <a href="http://www.selenic.com/mercurial/wiki/index.cgi/MergeProgram?highlight=%28FileMerge%29">this page</a> describe using FileMerge as a diff tool and a merge tool respectively.</p>
<p><strong>Update</strong>:  For completeness, here is the ".hgignore" file that I typically use:</p>
<blockquote><p>syntax: glob</p>
<p>.DS_Store<br />
*.swp<br />
*~.nib</p>
<p>build</p>
<p>*.pbxuser<br />
*.perspective<br />
*.perspectivev3</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://rexmere.com/2008/08/05/using-mercurial-for-mac-os-x-development/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Perforce</title>
		<link>http://rexmere.com/2007/09/06/perforce/</link>
		<comments>http://rexmere.com/2007/09/06/perforce/#comments</comments>
		<pubDate>Thu, 06 Sep 2007 19:40:08 +0000</pubDate>
		<dc:creator>Keith Fieldhouse</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://rexmere.com/2007/09/06/perforce/</guid>
		<description><![CDATA[I've been using the Perforce version control system since somewhere around 1999.  That's when one of the engineers at the startup I was a part of suggested that we consider this new VCS system he read about instead of the (oh the horror) Visual Source Safe solution we had inherited from the company we [...]]]></description>
			<content:encoded><![CDATA[<p>I've been using the <a href="http://www.perforce.com">Perforce</a> version control system since somewhere around 1999.  That's when one of the engineers at the startup I was a part of suggested that we consider this new VCS system he read about instead of the (oh the horror) Visual Source Safe solution we had inherited from the company we spun out of.</p>
<p>At the time, merge oriented version control was new to us (our experience had been with lock oriented version control).  Perforce the company did (and still does) and excellent job of explaining its technology and the strong philisophical underpinnings behind the design choices they made.    That, coupled with excellent support duing the eval period (and afterwords) reasonable pricing and very solid software made it easy for us to switch to Perforce -- a decision we never regreted.</p>
<p>Four years ago when I joined a small company that was still using <a href="http://www.nongnu.org/cvs/">CVS</a> it was remarkably easy to help effect a fairly seamless change to Perforce for much of the same reasons.</p>
<p>These days, though, I look a bit longingly at the distributed version control systems like <a href="http://darcs.net/">darcs</a>, <a href="http://www.selenic.com/mercurial/wiki/">mercurial</a>, <a href="http://git.or.cz/">git</a> and <a href="http://bazaar-vcs.org/">bazaar</a>.  To my mind, based somewhat limited experimentation, these distributed systems provide a certain "nimbleness" to the working envionment that dynamic languages provide.  In a way, they are to Perforce what Python and Ruby are to Java (though that's an analogy that'd probably break down fairly quickly).</p>
<p>What I wonder is this.  If some company with the same "sensible, reliable" style that Peforce had 10 years ago (and still has) delivered a distributed version control system that was as solid, fast and reliable as Perforce, with the same level of documentation and support would Perforce be in trouble?    I have to think they would, though the "sensible" part of that proposal is probably less likely than the technical part.  Perforce is s company that essentially does one thing, and one thing very well.  I admire them for that.    But their product hasn't really changed meaningfully in the 8 years that I've been using it, which I think exposes them to some risk.</p>
<p>Which gets me to my wish.  The biggest problem with Perforce is that despite several workarounds, it's a pain in the neck to use if you don't have a live reliable connection to the central depot.  For remote work, which I do a fair bit of, this means that I either always have my VPN fired up (with the associated cheerful tromping of my typical network environment) or I use one of those less than satisfactory workarounds.  And If I happen to be in a cabin on a lake in Maine with no Internet connectivity at all, I'm really out of luck.</p>
<p>I want to be able to take a Perforce client and treat it as (or export it to) a distributed VCS work space.  That means that I'd be able to maintain a revision history within my client that's independent of the main repository.  That allows me to setup up checkpoints before some risky bug fixing maneuver.  I want to be able to push and pull my workspace to colleagues.  This allows me to easily set up collaborative efforts or shared bug hunts easily with messing with a lot of repositories.  Then, when I've pulled all the merges I want into my initial workspace, I want  to be able to commit it back to the Perforce depot.    I'd be willing to live with a system where I can only peer with workspaces that were pulled from my initial workspace (dealing with the merge paths that could result from peer merging and then submission from multiple work spaces is too twisty for my head).</p>
<p>I know there a few foo2p4 and p42foo scripts out there that attempt to provide something like what I've described.  But none of them seem to be quite ready for prime time (yet) and besides, I want a supported, rock solid solution.</p>
<p>If Perforce doesn't provide something like that, I think someone else will.</p>
]]></content:encoded>
			<wfw:commentRss>http://rexmere.com/2007/09/06/perforce/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>More on PyObjC</title>
		<link>http://rexmere.com/2007/07/02/more-on-pyobjc/</link>
		<comments>http://rexmere.com/2007/07/02/more-on-pyobjc/#comments</comments>
		<pubDate>Tue, 03 Jul 2007 00:55:20 +0000</pubDate>
		<dc:creator>Keith Fieldhouse</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Macintosh]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://rexmere.com/2007/07/02/more-on-pyobjc/</guid>
		<description><![CDATA[Related to my last post.  This web page at developer.apple.com details the steps to take to work with PyObjC and XCode.  It's also a bit of an endorsement of Python development for the Mac.
]]></description>
			<content:encoded><![CDATA[<p>Related to my last post.  This <a href="http://developer.apple.com/cocoa/pyobjc.html">web page</a> at developer.apple.com details the steps to take to work with <a href="http://pyobjc.sourceforge.net/">PyObjC</a> and XCode.  It's also a bit of an endorsement of Python development for the Mac.</p>
]]></content:encoded>
			<wfw:commentRss>http://rexmere.com/2007/07/02/more-on-pyobjc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac Development with Python</title>
		<link>http://rexmere.com/2007/06/22/mac-development-with-python/</link>
		<comments>http://rexmere.com/2007/06/22/mac-development-with-python/#comments</comments>
		<pubDate>Fri, 22 Jun 2007 15:11:31 +0000</pubDate>
		<dc:creator>Keith Fieldhouse</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Macintosh]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://rexmere.com/2007/06/22/mac-development-with-python/</guid>
		<description><![CDATA[Now that I have a MacBook, naturally enough my attention turns to developing for it.  My language of choice these days is Python for a variety of reasons I won't go into now.  I'm interested to see that there's fairly broad support for developing Cocoa based applications with python using PyObjC as a [...]]]></description>
			<content:encoded><![CDATA[<p>Now that I have a MacBook, naturally enough my attention turns to developing for it.  My language of choice these days is Python for a variety of reasons I won't go into now.  I'm interested to see that there's fairly broad support for developing Cocoa based applications with python using <a href="http://pyobjc.sourceforge.net/">PyObjC</a> as a bridge.  This <a href="http://developer.apple.com/business/macmarket/checkout.html">article</a> seems to suggest that it's possible to build commercial quality apps with these tools.This will deserve some exploration...</p>
]]></content:encoded>
			<wfw:commentRss>http://rexmere.com/2007/06/22/mac-development-with-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Efficient Syntax</title>
		<link>http://rexmere.com/2007/05/19/efficient-syntax/</link>
		<comments>http://rexmere.com/2007/05/19/efficient-syntax/#comments</comments>
		<pubDate>Sat, 19 May 2007 21:23:05 +0000</pubDate>
		<dc:creator>Keith Fieldhouse</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://rexmere.com/2007/05/19/efficient-syntax/</guid>
		<description><![CDATA[My day job is pretty interesting On some projects, over the course of fixing one bug or adding one feature I may write or modify code written in C++, Java, Python and Lua. If our code generator is involved, you can add Perl to that mix. None of those languages is used trivially so I [...]]]></description>
			<content:encoded><![CDATA[<p>My day job is pretty interesting On some projects, over the course of fixing one bug or adding one feature I may write or modify code written in C++, Java, Python and Lua. If our code generator is involved, you can add Perl to that mix. None of those languages is used trivially so I get a good chance to use them all "in anger".I'm not much of a language zealot though I'll admit to a strong fondness for Python and I no longer write C++/C code "for fun".Often the debate between languages these days focuses on dynamic vs. static typing. I can understand that, duck typing in particular can be awfully handy especially if you're trying to deal with an impedance mismatch between client code and pre-existing libraries. On the other hand, my sense of getting it right when I'm refactoring Java code is higher. Test coverage can be spotty on occasion especially for GUI code but the compiler sees all.Which is a long way around to get to <a href="http://www.scala-lang.org/">Scala</a>. Scala is statically typed, compiled language targeting the Java VM. While it has numerous other features that make it interesting, its significantly more efficient syntax is the reason that I'm downloading it to experiment with.That said, I do find myself drawn to the simple efficiency of a language like Python. I've had occasion to move a bunch of Java code to Python. The design was fairly good and the process was a simple translation. The reduction in code length was quite dramatic. The translation process consisted almost entirely of deleting unneeded lines of code. When I'm writing Java code (with heavy use of Eclipse tools) the process goes fast but the result just feels cluttered. There's simply more to look at when trying to understand the code. C++ and Java are really noisy languages.<p>Technorati Tags: <a href="http://technorati.com/tag/Scala" rel="tag"> Scala</a>, <a href="http://technorati.com/tag/Java" rel="tag"> Java</a>, <a href="http://technorati.com/tag/Python" rel="tag"> Python </a></p>
]]></content:encoded>
			<wfw:commentRss>http://rexmere.com/2007/05/19/efficient-syntax/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Xubuntu</title>
		<link>http://rexmere.com/2006/07/25/xubuntu/</link>
		<comments>http://rexmere.com/2006/07/25/xubuntu/#comments</comments>
		<pubDate>Tue, 25 Jul 2006 12:17:28 +0000</pubDate>
		<dc:creator>Keith Fieldhouse</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://rexmere.com/2006/07/25/xubuntu/</guid>
		<description><![CDATA[While the primary Ubuntu distribution gets most of the attention, I just installed the XFce based Xubuntu on an older (circa 2001) Sony Vaio.   Suddenly, I have a much snappier laptop with a very nicely integrated UI.  All of the Dapper Drake goodness (I was actually able to install with my wireless [...]]]></description>
			<content:encoded><![CDATA[<p>While the primary <a href="http://www.ubuntulinux.org">Ubuntu </a>distribution gets most of the attention, I just installed the <a href="http://www.xfce.org/">XFce </a>based <a href="http://www.xubuntu.org/">Xubuntu </a>on an older (circa 2001) Sony Vaio.   Suddenly, I have a much snappier laptop with a very nicely integrated UI.  All of the Dapper Drake goodness (I was actually able to <em>install </em>with my wireless card and hibernate <em>works</em>) is there but with a little less <q>heft</q> in the UI.<p>Technorati Tags: <a href="http://technorati.com/tag/Ubuntu" rel="tag"> Ubuntu</a>, <a href="http://technorati.com/tag/Xubuntu" rel="tag"> Xubuntu</a>, <a href="http://technorati.com/tag/XFce" rel="tag"> XFce</a>, <a href="http://technorati.com/tag/Linux" rel="tag"> Linux </a></p>
]]></content:encoded>
			<wfw:commentRss>http://rexmere.com/2006/07/25/xubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Whisker Browser</title>
		<link>http://rexmere.com/2006/06/10/the-whisker-browser/</link>
		<comments>http://rexmere.com/2006/06/10/the-whisker-browser/#comments</comments>
		<pubDate>Sat, 10 Jun 2006 22:27:30 +0000</pubDate>
		<dc:creator>Keith Fieldhouse</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Smalltalk]]></category>

		<guid isPermaLink="false">http://rexmere.com/2006/06/10/the-whisker-browser/</guid>
		<description><![CDATA[One of things it seems that people have some trouble getting used to when getting into Smalltalk development is the use of the browser (leave aside for the moment getting used image based development in general).  I've seen a number of comments about the difficulty of seeing only one method at a time and [...]]]></description>
			<content:encoded><![CDATA[<p>One of things it seems that people have some trouble getting used to when getting into Smalltalk development is the use of the browser (leave aside for the moment getting used image based development in general).  I've seen a number of comments about the difficulty of seeing only one method at a time and not being able to scroll around an entire class.For myself, I actually prefer browser based development (I learned C++ programming writing MacApp applications and using MacBrowse).  I find that my style is improved by the focusing ability of the browser's method editor.That said, the best of both worlds, in my opinion is the Whisker browser.  Essentially what the Whisker browser does is create a dynamic stack of all of the methods you've selected in the method editing pane.  It's as if Emacs split the window and automatically scrolled to the next method you've expressed an interest in.It's this behavior I miss most when I leave a Smalltalk image to go work in, for example, Eclipse.  Naturally enough, someone could write a plugin to Eclipse to emulate the behavior.  But until then...<p>Technorati Tags: <a href="http://technorati.com/tag/Smalltalk" rel="tag"> Smalltalk</a>, <a href="http://technorati.com/tag/WhiskerBrowser" rel="tag"> WhiskerBrowser</a>, <a href="http://technorati.com/tag/Squeak" rel="tag"> Squeak</a>, <a href="http://technorati.com/tag/Eclipse" rel="tag"> Eclipse </a></p>
]]></content:encoded>
			<wfw:commentRss>http://rexmere.com/2006/06/10/the-whisker-browser/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
