<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Jonathan Saggau&apos;s Blog</title>
    <link rel="alternate" type="text/html" href="http://www.jonathansaggau.com/blog/" />
    <link rel="self" type="application/atom+xml" href="http://www.jonathansaggau.com/blog/atom.xml" />
   <id>tag:www.jonathansaggau.com,2008:/blog//1</id>
    <link rel="service.post" type="application/atom+xml" href="http://www.jonathansaggau.com/blog/mt-atom.cgi/weblog/blog_id=1" title="Jonathan Saggau's Blog" />
    <updated>2008-07-05T06:20:28Z</updated>
    <subtitle>This Vehicle Powered by 100% Pure Clean-Burning Caffeine</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.2</generator>
 
<entry>
    <title>Ouch</title>
    <link rel="alternate" type="text/html" href="http://www.jonathansaggau.com/blog/2008/07/ouch.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jonathansaggau.com/blog/mt-atom.cgi/weblog/blog_id=1/entry_id=126" title="Ouch" />
    <id>tag:www.jonathansaggau.com,2008:/blog//1.126</id>
    
    <published>2008-07-05T06:20:26Z</published>
    <updated>2008-07-05T06:20:28Z</updated>
    
    <summary></summary>
    <author>
        <name>jonmarimba</name>
        
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.jonathansaggau.com/blog/">
        <![CDATA[<img src="http://www.jonathansaggau.com/blog//MacMallMS.jpg" alt="MacMallMS.jpg" border="0" width="967" height="182" />]]>
        
    </content>
</entry>
<entry>
    <title>WWDC 2008 Keynote: New iPhone</title>
    <link rel="alternate" type="text/html" href="http://www.jonathansaggau.com/blog/2008/06/wwdc_2008_keynote_new_iphone.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jonathansaggau.com/blog/mt-atom.cgi/weblog/blog_id=1/entry_id=125" title="WWDC 2008 Keynote: New iPhone" />
    <id>tag:www.jonathansaggau.com,2008:/blog//1.125</id>
    
    <published>2008-06-09T19:33:38Z</published>
    <updated>2008-06-09T19:47:06Z</updated>
    
    <summary>&quot;iPhone 3G&quot; and less expensive. S.P.J: &quot;We&apos;re gonna take it to the next level.&quot; Black Plastic, same display. Flush headphone Jack (about time). Better audio. Update: webkit in Iphone 3G is 36% faster than other 3G phones&apos; browsers. Update: GPS!!...</summary>
    <author>
        <name>jonmarimba</name>
        
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.jonathansaggau.com/blog/">
        <![CDATA["iPhone 3G" and less expensive.  S.P.J: "We're gonna take it to the next level."  
<br />

Black Plastic, same display.  Flush headphone Jack (about time).  Better audio.  
<br />
<br />
Update: webkit in Iphone 3G is 36% faster than other 3G phones' browsers.
<br />
Update: GPS!!
<br />
UPdate: Available in 70 countries.  Put any miles on the Gulfstream lately?
<br />
Update: 8Gig Sells for $199.  Um.  Boom?!
<br />
Update: Rolls out July 11.  Take a week off.  ]]>
        
    </content>
</entry>
<entry>
    <title>WWDC 2008 Keynote: Mobileme == me.com</title>
    <link rel="alternate" type="text/html" href="http://www.jonathansaggau.com/blog/2008/06/wwdc_2008_keynote_mobileme_mec.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jonathansaggau.com/blog/mt-atom.cgi/weblog/blog_id=1/entry_id=124" title="WWDC 2008 Keynote: Mobileme == me.com" />
    <id>tag:www.jonathansaggau.com,2008:/blog//1.124</id>
    
    <published>2008-06-09T19:21:17Z</published>
    <updated>2008-06-09T19:28:26Z</updated>
    
    <summary>New Service &quot;Exchange for the rest of us.&quot; Push email, contacts, calendars &quot;in the cloud.&quot; Like .mac with Leopard server distributed voodoo ++ push. Works with iPhone, iCal, Outlook, and has a web client. Also includes iDisk tech (sort of...</summary>
    <author>
        <name>jonmarimba</name>
        
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.jonathansaggau.com/blog/">
        New Service &quot;Exchange for the rest of us.&quot;  Push email, contacts, calendars &quot;in the cloud.&quot;  Like .mac with  Leopard server distributed voodoo ++ push.  Works with iPhone, iCal, Outlook, and has a web client.

Also includes iDisk tech (sort of a finder for the web).

Apple is heading for the cloud.  For real this time.  So it appears.

Update: replaces .mac
        
    </content>
</entry>
<entry>
    <title>WWDC 2008 Keynote: Background processes in iPhone... sort of.</title>
    <link rel="alternate" type="text/html" href="http://www.jonathansaggau.com/blog/2008/06/background_processes_in_iphone.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jonathansaggau.com/blog/mt-atom.cgi/weblog/blog_id=1/entry_id=123" title="WWDC 2008 Keynote: Background processes in iPhone... sort of." />
    <id>tag:www.jonathansaggau.com,2008:/blog//1.123</id>
    
    <published>2008-06-09T19:05:00Z</published>
    <updated>2008-06-09T19:08:17Z</updated>
    
    <summary>Nice. Push Notification Service. Your third party server can send to Apple&apos;s push server, which keeps a persistent connection to your phone: badges (say... how many messages are waiting in application), Alert sounds, Custom textual alerts. Not a bad solution....</summary>
    <author>
        <name>jonmarimba</name>
        
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.jonathansaggau.com/blog/">
        Nice.  Push Notification Service.  

Your third party server can send to Apple&apos;s push server, which keeps a persistent connection to your phone: badges (say... how many messages are waiting in application), Alert sounds, Custom textual alerts.

Not a bad solution.


        
    </content>
</entry>
<entry>
    <title>WWDC 2008 Keynote: Code demo?</title>
    <link rel="alternate" type="text/html" href="http://www.jonathansaggau.com/blog/2008/06/code_demo_in_the_keynote.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jonathansaggau.com/blog/mt-atom.cgi/weblog/blog_id=1/entry_id=122" title="WWDC 2008 Keynote: Code demo?" />
    <id>tag:www.jonathansaggau.com,2008:/blog//1.122</id>
    
    <published>2008-06-09T18:21:26Z</published>
    <updated>2008-06-09T19:08:39Z</updated>
    
    <summary>Seriously? Um. What? Show me, like, something. It&apos;s so easy! We&apos;ll just drag these 200 lines of code in here......</summary>
    <author>
        <name>jonmarimba</name>
        
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.jonathansaggau.com/blog/">
        Seriously?  Um.  What?  Show me, like, something.  It&apos;s so easy!  We&apos;ll just drag these 200 lines of code in here...
        
    </content>
</entry>
<entry>
    <title>American Express Business Downloads</title>
    <link rel="alternate" type="text/html" href="http://www.jonathansaggau.com/blog/2008/04/american_express_business_down.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jonathansaggau.com/blog/mt-atom.cgi/weblog/blog_id=1/entry_id=121" title="American Express Business Downloads" />
    <id>tag:www.jonathansaggau.com,2008:/blog//1.121</id>
    
    <published>2008-04-13T16:04:43Z</published>
    <updated>2008-04-13T16:04:58Z</updated>
    
    <summary>Note to self-- To download large numbers of transactions, use the custom reporting feature with a date range. You can get up to 24 months prior to today, which I a lot more than the date range available through the...</summary>
    <author>
        <name>jonmarimba</name>
        
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.jonathansaggau.com/blog/">
        Note to self-- To download large numbers of transactions, use the custom reporting feature with a date range.  You can get up to 24 months prior to today, which I a lot more than the date range available through the regular transaction download feature.
        
    </content>
</entry>
<entry>
    <title>Always - on Print Preview</title>
    <link rel="alternate" type="text/html" href="http://www.jonathansaggau.com/blog/2007/12/always_on_print_preview.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jonathansaggau.com/blog/mt-atom.cgi/weblog/blog_id=1/entry_id=120" title="Always - on Print Preview" />
    <id>tag:www.jonathansaggau.com,2007:/blog//1.120</id>
    
    <published>2007-12-09T07:41:37Z</published>
    <updated>2007-12-09T07:50:18Z</updated>
    
    <summary>Some software is, in my experience, not quite WYSIWYG when it comes to the final printed output so I have gotten into the habit of viewing a PDF in preview before I actually send a document to my printer. This...</summary>
    <author>
        <name>jonmarimba</name>
        
    </author>
            <category term="Strange habits" />
            <category term="Stupid Nerd Tricks" />
            <category term="Technology Love" />
    
    <content type="html" xml:lang="en" xml:base="http://www.jonathansaggau.com/blog/">
        <![CDATA[<p>Some software is, in my experience, not quite WYSIWYG when it comes to the final printed output so I have gotten into the habit of viewing a PDF in preview before I actually send a document to my printer.  This has saved many trees.</p>

<p>Apple makes it fairly easy to do this.  Just command-P and click on the weird-looking PDF button to get the drop down menu to select "Open PDF In Preview."</p>

<p><img src="http://www.jonathansaggau.com/blog//images/preview.jpg" border="0" height="254" width="252" alt="preview.jpg" align="" /></p>

<p>I would like to see most every print job automatically open in preview without needing to take my hands off of the keyboard.  One can make this happen with a little bit of effort, some help from Folder Actions, and a little piece of free third-party software.  Here's how I do it.</p>

<p>First, download and install Cups PDF per the instructions on its <a href="http://www.codepoetry.net/projects/cups-pdf-for-mosx">home page</a>.  This will create a printer and driver that dumps a pdf file into <i>~/Desktop/cups-pdf/</i>.  Set your default printer to CUPS-PDF.  </p>

<p>Next, you will setup a folder action on the <i>~/Desktop/cups-pdf/</i> to open each file that gets dumped in there in preview.  I keep my folder actions scripts in <i>~/Desktop/Folder\ Actions/</i>, so I put the following applescript (derived from a similar script that ships with Leopard) there.  </p>

<pre>  
(*
add - new item alert

<p>This Folder Action handler is triggered whenever items are added to the attached folder.<br />
The script will display an alert containing the number of items added and offering the user<br />
the option to reveal the added items in Finder.</p>

<p>Copyright &copy; 2002&#8211;2007 Apple Inc.</p>

<p>You may incorporate this Apple sample code into your program(s) without<br />
restriction.  This Apple sample code has been provided "AS IS" and the<br />
responsibility for its operation is yours.  You are not permitted to<br />
redistribute this Apple sample code as "Apple sample code" after having<br />
made changes.  If you're going to redistribute the code, we require<br />
that you make it clear that the code was descended from Apple sample<br />
code, but that you've made changes.<br />
*)</p>

<p>property dialog_timeout : 5 -- set the amount of time before dialogs auto-answer.</p>

<p>on adding folder items to this_folder after receiving added_items<br />
	try<br />
		tell application "Finder"<br />
			--get the name of the folder<br />
			set the folder_name to the name of this_folder<br />
		end tell<br />
		<br />
		-- find out how many new items have been placed in the folder<br />
		set the item_count to the number of items in the added_items<br />
		--create the alert string<br />
		set alert_message to ("Folder Actions Alert:" & return & return) as Unicode text<br />
		if the item_count is greater than 1 then<br />
			set alert_message to alert_message & (the item_count as text) & " new items have "<br />
		else<br />
			set alert_message to alert_message & "One new item has "<br />
		end if<br />
		set alert_message to alert_message & "been placed in folder " & &laquo;data utxt201C&raquo; & the folder_name & &laquo;data utxt201D&raquo; & "."<br />
		set the alert_message to (the alert_message & return & return & "Would you like to view the added items?")<br />
		<br />
		display dialog the alert_message buttons {"Yes", "No"} default button 1 with icon 1 giving up after dialog_timeout<br />
		set the user_choice to the button returned of the result<br />
		<br />
		if user_choice is "Yes" then<br />
			tell application "Preview"<br />
				--fire it up<br />
				activate<br />
				--open the items<br />
				open the added_items<br />
			end tell<br />
		end if<br />
	end try<br />
end adding folder items to</p>

</pre>

<p>Ctrl (or right) click the cups-pdf folder, Enable Folder Actions, then Configure Folder Actions via the contextual menues seen below.</p>

<p><br />
<img src="http://www.jonathansaggau.com/blog//images/EnableFolderActions.jpg" border="0" height="350" width="509" alt="EnableFolderActions.jpg" align="" />  </p>

<p>When you select "Configure Folder Actions" you'll set the script that runs every time a new file is added to that folder to the one above.</p>

<p><img src="http://www.jonathansaggau.com/blog//images/folderActions.jpg" border="0" height="202" width="731" alt="folderActions.jpg" align="" /></p>

<p><br />
Now every time you hit command - P to print in a application, you'll hit enter to print to your default CUPS-PDF printer, which will write a PDF to the cups-pdf folder on your desktop.  The folder action will then pop-up this window (for five seconds).</p>

<p><img src="http://www.jonathansaggau.com/blog//images/PreviewMe.jpg" border="0" height="209" width="360" alt="PreviewMe.jpg" align="" /></p>

<p><br />
All you have to do is hit enter.</p>

<p>So!  Every time I print I hit command - P, enter, wait a sec, enter.  Instant preview.</p>]]>
        
    </content>
</entry>
<entry>
    <title>Poking around in others&apos; software is sometimes useful (and thanks to Zorn)</title>
    <link rel="alternate" type="text/html" href="http://www.jonathansaggau.com/blog/2007/12/poking_around_in_others_softwa.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jonathansaggau.com/blog/mt-atom.cgi/weblog/blog_id=1/entry_id=119" title="Poking around in others' software is sometimes useful (and thanks to Zorn)" />
    <id>tag:www.jonathansaggau.com,2007:/blog//1.119</id>
    
    <published>2007-12-03T18:09:39Z</published>
    <updated>2007-12-09T03:28:42Z</updated>
    
    <summary>I need an NSNumberFormatter subclass for a PyObjC project I&apos;m working on that reformats an NSNumber to hours:minutes:seconds. Thinking I&apos;ve seen this before (and kind of hoping that there was some voodoo I was missing somewhere to make this simple),...</summary>
    <author>
        <name>jonmarimba</name>
        
    </author>
            <category term="Cocoa" />
            <category term="Cocoa" />
            <category term="Python" />
            <category term="Technology Love" />
    
    <content type="html" xml:lang="en" xml:base="http://www.jonathansaggau.com/blog/">
        <![CDATA[I need an <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNumberFormatter_Class/Reference/Reference.html">NSNumberFormatter</a> subclass for a PyObjC project I'm working on that reformats an NSNumber to hours:minutes:seconds.  Thinking I've seen this before (and kind of hoping that there was some voodoo I was missing somewhere to make this simple), I decided to poke around in applications that deal with time.  After a little head-scratching, I was reminded of that most useful time-tracking and invoicing application I've grown to love called <a href="http://clickablebliss.com/billable">Billable</a> (Zorn!).  On <a href="http://clickablebliss.com/images/billable_1.2_screenshots/time_based_service.png">this screenshot</a> (from the Clickable Bliss site) we see a field labeled "Time Spent:" with a "Start" button next to it.  Thinking to myself, "I want that formatter!" I fired up <a href="http://www.fscript.org/">F-Script Anywhere</a>, injected it into Billable and dug down until I was the class name for the formatter.  

<img src="http://www.jonathansaggau.com/blog//CBTimeLengthFormatter.jpg" alt="CBTimeLengthFormatter.jpg" border="0" width="1115" height="240" />

Time to <a href="http://www.google.com/search?q=CBTimeLengthFormatter">pray to google</a>.  Ah!  Zorn!  You beautiful helpful coding-type person.  You've pasted it for us.  Thank you!

Now all that is left is to pythonify it.  (I made a few modifications to the behavior, but it's the same general idea)

<pre>
#
#  CBTimeLengthFormatter.py
#  PuppyTracker
#
#  Created by Jonathan Saggau on 12/3/07.
#  Copyright (c) 2007 __MyCompanyName__. All rights reserved.


from Foundation import *
from math import floor

#modified from http://paste.lisp.org/display/21854
class CBTimeLengthFormatter(NSNumberFormatter):

    def stringForObjectValue_(self, anObject):
        if (not (anObject.isKindOfClass_(NSNumber))):
            return(None)
            
        if (anObject.intValue() <= 0):
            return("00:00:00")
        intval = int(floor(anObject))
        
        hours = intval / (60*60)
        minutes = (intval - (hours * 60 * 60)) / 60
        seconds = intval - (minutes * 60) - (hours * 60 * 60)
        string = "%02i:%02i:%02i" %((hours), (minutes), (seconds))
        return(string)
    
    def getObjectValue_forString_errorDescription_(self, objVal, inString, err):
        """Take a string like "00:00:00" and turns it into a NSNumber and returns YES
           Also able to handle 10:10 (as 10 minutes, 10 seconds) and 10 (as 10 seconds)"""
        
        string = NSString.stringWithString_(inString)
        
        #catch for nil or empty string
        if (string == None or string.isEqualToString_("")):
            return True, 0, None
        
        stringList = string.split(":")
        #make seconds first, instead of hours
        stringList.reverse()
        
        #turn each into an integer, filtering out empty strings
        try:
            stringList = [int(each) for each in stringList if each is not u'']
            
        #if we can't make any part of this into an int, bail
        except ValueError, e:
            return False, 0, None
        
        #make sure we have Seconds, Hours, Minutes by padding the list with zeros
        #in case we have (say) Seconds, Hours only
        while ( len(stringList) < 3):
            stringList.append(0)
        
                        #sec            #min               #hour
        timeInSeconds = stringList[0] + stringList[1]*60 + stringList[2]*60*60
        return True, timeInSeconds, None

</pre>]]>
        
    </content>
</entry>
<entry>
    <title>Likely in store.  Likely?  WTF?</title>
    <link rel="alternate" type="text/html" href="http://www.jonathansaggau.com/blog/2007/11/likely_in_store_likely_wtf.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jonathansaggau.com/blog/mt-atom.cgi/weblog/blog_id=1/entry_id=118" title="Likely in store.  Likely?  WTF?" />
    <id>tag:www.jonathansaggau.com,2007:/blog//1.118</id>
    
    <published>2007-11-26T23:05:09Z</published>
    <updated>2007-12-03T18:44:40Z</updated>
    
    <summary>So I went to Borders on Wall street today, thinking &quot;hey, let&apos;s have a look at Fake Steve&apos;s book.&quot; I go to their little search engine kiosk, punch in the title and see &quot;Humor&quot; under section and &quot;Likely in store&quot;...</summary>
    <author>
        <name>jonmarimba</name>
        
    </author>
            <category term="Technology Hate" />
            <category term="Troublesome Noise" />
    
    <content type="html" xml:lang="en" xml:base="http://www.jonathansaggau.com/blog/">
        <![CDATA[So I went to Borders on Wall street today, thinking "hey, let's have a look at Fake Steve's book."  I go to their little search engine kiosk, punch in the title and see "Humor" under section and "Likely in store" under availability.  Hmmm.  Ok.  So the kiosk isn't hooked into their inventory.  Fair enough, as a friend of mine likes to say.  I go to the little help desk and ask "where's humor?" (they didn't get the joke...It was a dumb joke).  I head in the direction of the pointing and grunting.  I seek.  I do not find.  I approach another help desk, this one nearer to the section in question.  I follow the nice Borders "associate" (when did we stop using "employee" and "clerk," by the way?) over to the section I was just examining, where she proceeds to look for Fake Steve's book on the same shelf I was.  Apparently, alphabetical order is still alphabetical order.  Glad I'm not crazy.  "Let me go ask if anybody has seen it," she says.  "Um.  Okay," I reply.  Now I don't think that I'm expecting miracles.  I just want to know if they have a certain book.  After about five minutes the (ahem) "associate" comes back with a "I don't think we have it, but we can order it for you."  ...to which I reply (admittedly snidely) "If I had wanted to order it, I would have done so from the comfort of my own home from Amazon.  Thanks for looking."  
<br /><br />
I have questions.  Why do the Borders associates clearly have no access to inventory numbers?  Why could she not tell me "we have two copies."  I can understand having difficulty <em>finding</em> a specific volume, what with the abundance of end caps and special tables in the book stores these days.  How hard is it to track inventory?  Isn't that what those neat shiny computer doodads they have scattered all over the store are supposed to be good at?  Grrrrr.  
<br /><br />
Shipley!  Make a distributed version of <a href="http://www.delicious-monster.com/">Delicious Library</a> or something.  These people need help.]]>
        
    </content>
</entry>
<entry>
    <title>Living with multiple Macs</title>
    <link rel="alternate" type="text/html" href="http://www.jonathansaggau.com/blog/2007/11/living_with_multiple_macs.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jonathansaggau.com/blog/mt-atom.cgi/weblog/blog_id=1/entry_id=117" title="Living with multiple Macs" />
    <id>tag:www.jonathansaggau.com,2007:/blog//1.117</id>
    
    <published>2007-11-25T04:38:56Z</published>
    <updated>2007-12-03T18:45:06Z</updated>
    
    <summary>I have three machines running os X: My Macbook Pro for travelin&apos; to them clients; it lives wherever I am. My iMac for writing code on a big screen; it lives on my desk My Mini for watching movies, listening...</summary>
    <author>
        <name>jonmarimba</name>
        
    </author>
            <category term="Technology Love" />
    
    <content type="html" xml:lang="en" xml:base="http://www.jonathansaggau.com/blog/">
        <![CDATA[I have three machines running os X: <br />
 <UL>
<LI>My Macbook Pro for travelin' to them clients; it lives wherever I am. <br />
<LI>My iMac for writing code on a big screen; it lives on my desk <br />
<LI>My Mini for watching movies, listening to music, serving web pages, serving mail, serving my calendars; it lives in my <a href="http://www.middleatlantic.com/">Middle Atlantic</a> rack (highly recommended rack manufacturer, by the way.  Nice stuff.)<br />
 </UL>

Synchronizing my data (especially my home directly) has recently become much more important to me.  I've been spending rather more time physically at clients and can't afford the "I think I edited that on the desktop machine, which is turned off at home" problem.  For code, this is handled quite nicely by subversion, but I also need a simple way to synchronize my home directories between my laptop and my desktop.  (I don't so much care about the contents of my home directory in my server because I don't really produce content there).  My friend<a href="http://www.oreillynet.com/pub/au/3039"> Noah Gift</a>, who really is a gift to my world would tell you to <a href="http://www.oreillynet.com/pub/a/mac/2007/07/18/discover-the-power-of-open-directory-part-3.html">use nfs </a> and apple's offline synchronization to do this for you.  This is fancy and fine voodoo, and something I used to do way back when I used Linux primarily (gasp) but I didn't really want to serve my home directory from a central location.  <a href="http://kitenet.net/~joey/svnhome/">Version controlled home</a> is also overkill for me and dealing with conflicting files in svn can be a bit of a pain (yes, Hal, I thought about your suggestion as well).  I really want my laptop to act kind of like my iPhone.  I want to come home, plug in, deal with a few conflicts if and only if I care at that point, and sync without having to also think.

<br />

What is need is a simple directory synchronizer.  Ok.  Shouldn't be hard to find, right?  Wrong.  Every (payware, even) GUI file synchronizer I've tried has ended in the spinning beachball of death.  Grumble Grumble.  Ok again.  Time to slide off into command-line utilities.  I thought maybe I would use git instead of svn, but I don't want to use git (yet).  I'm resistant to use anything designed for version control for this purpose and I'm too lazy to learn yet another one, even though git is supposed to be very fast at resolving differences between trees.  Maybe later.  <a href="http://www.youtube.com/watch?v=4XpnKHJAok8">Sorry Linus</a>.  

<br />

Enter a little-known synchronizing tool called <a href="http://www.cis.upenn.edu/~bcpierce/unison/">Unison</a>.  I Love this software.
<br />
From the Unison site: <br />
      <UL>
        <LI> Unison runs on both Windows and many flavors of Unix (Solaris, Linux, 
          OS X, etc.) systems. Moreover, Unison works <EM>across</EM> platforms, 
          allowing you to synchronize a Windows laptop with a Unix server, for 
          example. 
        <LI>Unlike simple mirroring or backup utilities, Unison can deal with 
          updates to <i>both</i> replicas of a distributed directory structure. 
          Updates that do not conflict are propagated automatically. Conflicting 
          updates are detected and displayed. 
        <LI>Unlike a distributed filesystem, Unison is a user-level program: there 
          is no need to modify the kernel or to have superuser privileges on either 
          host. 
        <LI>Unison works between any pair of machines connected to the internet, 
          communicating over either a direct socket link or tunneling over an 
          encrypted ssh connection. It is careful 
          with network bandwidth, and runs well over slow links such as PPP connections. 
          Transfers of small updates to large files are optimized using a compression 
          protocol similar to rsync. 
        <LI>Unison is resilient to failure. It is careful to leave the replicas 
          and its own private structures in a sensible state at all times, even 
          in case of abnormal termination or communication failures. 
        <LI>Unison has a clear and precise specification. 
        <LI>Unison is free; full source code is available under the GNU Public 
          License. 
      </UL>
In other words, exactly what I need.  :) Good instructions for setting it up for this purpose are available on the <a href="http://www.linuxjournal.com/article/7712">Linux Journal</a> site.  It's easy to keep it from synchronizing certain directories (I leave ~/Library and ~/svnCheckouts alone, for example) and it's easy to keep it from synchronizing certain file types as well (.DS_Store, .Spotlight*, .Trashes, etc.).  If I reorganize my entire home folder on the train, that reorganization is mirrored on the desktop.  No muss.  No fuss.  No "svn move."
<br />
So!  When I come home, I shutdown my laptop (it's usually sleeping in my bag), restart holding the T key, which turns it into a very expensive external drive, connect a firewire 800 cable between it and my desktop and synchronize.  Happy me.]]>
        
    </content>
</entry>
<entry>
    <title>No more Finder, no more Dock</title>
    <link rel="alternate" type="text/html" href="http://www.jonathansaggau.com/blog/2007/11/no_more_finder_no_more_dock.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jonathansaggau.com/blog/mt-atom.cgi/weblog/blog_id=1/entry_id=116" title="No more Finder, no more Dock" />
    <id>tag:www.jonathansaggau.com,2007:/blog//1.116</id>
    
    <published>2007-11-25T03:24:19Z</published>
    <updated>2007-12-03T18:45:35Z</updated>
    
    <summary>I don&apos;t use the either anymore. I find the Terminal sufficient for most large-scale file movings (especially with the help of tree). Path Finder is where I live to browse my filesystem. Launching applications (also searching the web and making...</summary>
    <author>
        <name>jonmarimba</name>
        
    </author>
            <category term="Technology Hate" />
            <category term="Technology Love" />
    
    <content type="html" xml:lang="en" xml:base="http://www.jonathansaggau.com/blog/">
        <![CDATA[I don't use the either anymore.  
<br />
I find the Terminal sufficient for most large-scale file movings (especially with the help of <a href="http://mama.indstate.edu/users/ice/tree/">tree</a>).  <a href="http://www.cocoatech.com">Path Finder </a>is where I live to browse my filesystem.  Launching applications (also searching the web and making coffee) belongs to <a href="http://www.blacktree.com/">Quicksilver</a>, which was recently <a href="http://code.google.com/p/blacktree-alchemy/">open-sourced</a>!
 <br />
FYI: tree compiles on OSX Leopard if you make the following very small changes to tree.c:

<pre>
--- ./tree-1.5.1.1/tree.c
+++ ./tree-1.5.1.1JS/tree.c
@@ -17,7 +17,7 @@
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

-#include <features.h>
+//#include <features.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
@@ -182,7 +182,7 @@
#ifdef CYGWIN
extern int MB_CUR_MAX;
#else
-extern size_t MB_CUR_MAX;
+extern int __mb_cur_max;
#endif

int main(int argc, char **argv)
</pre>]]>
        
    </content>
</entry>
<entry>
    <title>More Leopard calDAV fun. Migration!</title>
    <link rel="alternate" type="text/html" href="http://www.jonathansaggau.com/blog/2007/11/more_leopard_caldav_fun_migrat.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jonathansaggau.com/blog/mt-atom.cgi/weblog/blog_id=1/entry_id=115" title="More Leopard calDAV fun. Migration!" />
    <id>tag:www.jonathansaggau.com,2007:/blog//1.115</id>
    
    <published>2007-11-12T02:04:51Z</published>
    <updated>2007-11-12T02:04:59Z</updated>
    
    <summary>As you know from my last post, I have lots and lots of calendars. It used to be much much worse. Sharing calendars between my three Macs before Leopard server was a pain in the ass. Sure, you could put...</summary>
    <author>
        <name>jonmarimba</name>
        
    </author>
            <category term="Stupid Nerd Tricks" />
            <category term="Technology Hate" />
            <category term="Technology Love" />
    
    <content type="html" xml:lang="en" xml:base="http://www.jonathansaggau.com/blog/">
        <![CDATA[<p>As you know from my last post, I have lots and lots of calendars.  It used to be much much worse.  Sharing calendars between my three Macs before Leopard server was a pain in the ass.  Sure, you could put a calendar on a regular DAV server and subscribe to that calendar on your other machines, but you could not write to that calendar from any machine other than that which created it initially.  All subscribed machines were read-only.  What does this mean to me?  You know about my 14 calendars, right?  Triple it.  That's right.  I used to have 42 calendars on each of my 3 machines.  14 calendars to which I could write and 28 to which I was subscribed so I could read any appointments from my other two machines.  What a mess.</p>

<p>Leopard calendar server has brought me back to a debatably sane 14 calendars.  But how does one migrate all of those calendars spread across multiple machines onto the shiny new calDAV server?  Like so:</p>

<p>1.  Subscribe to your shiny new calDAV server (under the Accounts tab) in iCal preferences.<br />
2.  Create a new calendar on your calDAV server through iCal (File Menu -> new Calendar -> your server)  for each of your 14 calendars.<br />
3.  Create a *.ics file from your old calendar by:<br />
      a.  Selecting the calendars you want to export by using the export functionality in iCal (File Menu -> Export) on each of your machines or...<br />
      b.  Mounting your DAV server and downloading all of 'em at once (assuming you're keeping your calendars on a DAV server now, which I was, this method is a lot easier for obvious reasons)...<br />
4.  Select the calendar from the source list (one residing on your new calDAV server) and import the *.ics files you wish to store in the new calendar (File Menu -> import).</p>

<p>Your appointments are now on your calDAV server and will show up on all of your subscribed machines fully editable from all.</p>]]>
        
    </content>
</entry>
<entry>
    <title>More Leopard calDAV fun.  Moving appointments between calendars from different sources.</title>
    <link rel="alternate" type="text/html" href="http://www.jonathansaggau.com/blog/2007/11/more_leopard_caldav_fun_moving.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jonathansaggau.com/blog/mt-atom.cgi/weblog/blog_id=1/entry_id=114" title="More Leopard calDAV fun.  Moving appointments between calendars from different sources." />
    <id>tag:www.jonathansaggau.com,2007:/blog//1.114</id>
    
    <published>2007-11-12T01:37:19Z</published>
    <updated>2007-11-12T03:04:11Z</updated>
    
    <summary>I&apos;m scheduled to within an inch of my life, so there is no surprise that I have 14 calendars in iCal right now. I have calendars for billable hours vs. non-billable hours. I have calendars on my calDAV server that...</summary>
    <author>
        <name>jonmarimba</name>
        
    </author>
            <category term="Stupid Nerd Tricks" />
            <category term="Technology Hate" />
    
    <content type="html" xml:lang="en" xml:base="http://www.jonathansaggau.com/blog/">
        <![CDATA[<p>I'm scheduled to within an inch of my life, so there is no surprise that I have 14 calendars in iCal right now.  I have calendars for billable hours vs. non-billable hours.  I have calendars on my calDAV server that I share with clients, some under a different username than others, and some that I use to synchronize personal calendars across multiple machines, and yet another that I share with my assistant.  (Hi Christina!)  I have calendars coming out my ears from various sources.</p>

<p>Very often, I'll place an appointment in one calendar and later wish to move it to another.  Perhaps I'll have a tentative appointment with a client, so I'll put that in my non-billable calendar.  When that appointment happens, perhaps I'll put that into my billable calendar.  Unfortunately, my billable calender is under a different username on my calDAV server than my billable calendar (one of them I share, the other I do not).  Normally, when I want to move an appointment from one calendar to another I right/ctrl-click  the appointment and select the calendar I want to move it to.  Unfortunately, the only calendars listed in that contextual menu are those under the same user account as the appointment I'm trying to move.  Bummer.</p>

<p>The workaround: </p>

<p>1.  Select the appointment you would like to move.<br />
2.  Use your favorite method of getting it to the clipboard (I use command-X to cut)<br />
3.  Select the <em>calendar</em> from the source list to which you would like to move the appointment<br />
4.  Paste (command - v for me)</p>

<p>All appointment data when cut or copied is retained when pasted into the other calendar.  </p>

<p>Wouldn't it be nice to have ALL of your calendars in the contextual menu? Radar: 5593635</p>]]>
        
    </content>
</entry>
<entry>
    <title>Leopard server, calDAV, and Mozilla Sunbird</title>
    <link rel="alternate" type="text/html" href="http://www.jonathansaggau.com/blog/2007/11/leopard_server_caldav_and_mozi.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jonathansaggau.com/blog/mt-atom.cgi/weblog/blog_id=1/entry_id=113" title="Leopard server, calDAV, and Mozilla Sunbird" />
    <id>tag:www.jonathansaggau.com,2007:/blog//1.113</id>
    
    <published>2007-11-07T03:30:13Z</published>
    <updated>2007-11-07T07:39:12Z</updated>
    
    <summary>For those wishing to use Mozilla Sunbird with the calDAV server that comes with Leopard, it&apos;s not setup in Sunbird in (quite) the same way as it is in iCal. Let&apos;s say you have the calDAV Account URL working in...</summary>
    <author>
        <name>jonmarimba</name>
        
    </author>
            <category term="Stupid Nerd Tricks" />
            <category term="Technology Love" />
    
    <content type="html" xml:lang="en" xml:base="http://www.jonathansaggau.com/blog/">
        <![CDATA[<p>For those wishing to use <a href="http://www.mozilla.org/projects/calendar/sunbird/">Mozilla Sunbird</a> with the <a href="http://ietf.osafoundation.org/caldav/index.html">calDAV</a> server that <a href="http://trac.macosforge.org/projects/calendarserver">comes with Leopard</a>, it's not setup in Sunbird in (quite) the same way as it is in iCal.  </p>

<p>Let's say you have the calDAV Account URL working in ical (which will subscribe you to all of your calendars) and its URL is <pre> https://somedomain.com:8443/principals/users/username/ </pre></p>

<p>In Sunbird, you'll have to subscribe to the your calendars individually.  Every calDAV user I've setup so far in Leopard server has been given a default calendar called simply "calendar", which you can subscribed to from Sunbird at <pre>https://somedomain.com:8443/calendars/users/username/calendar/</pre>  Easy enough.  However, if you add a new calendar in iCal, it will create a calendar named with a <a href="http://en.wikipedia.org/wiki/UUID">UUID</a>.  In order to figure out what that UUID is, it's easiest to just mount the calDAV in the finder (Command - K) at <pre>https://somedomain.com:8443/calendars/users/username/</pre> You'll see several directories in there:  calendar, dropbox, oubox, notifications, etc.  The one that looks like a UUID (for example, 037D3206-9C1D-4C6C-8E54-B3E3CAF90ABF) is the directory you'll want to subscribe to in Sunbird.  In the example above, you would subscribe to <pre>https://somedomain.com:8443/calendars/users/username/037D3206-9C1D-4C6C-8E54-B3E3CAF90ABF/</pre> </p>]]>
        
    </content>
</entry>
<entry>
    <title>Yeah, it breathes</title>
    <link rel="alternate" type="text/html" href="http://www.jonathansaggau.com/blog/2007/10/yeah_it_breathes.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.jonathansaggau.com/blog/mt-atom.cgi/weblog/blog_id=1/entry_id=112" title="Yeah, it breathes" />
    <id>tag:www.jonathansaggau.com,2007:/blog//1.112</id>
    
    <published>2007-10-27T04:58:45Z</published>
    <updated>2007-12-03T18:45:51Z</updated>
    
    <summary>Wow. Alex.SpeechVoice is creepy. Apple&apos;s latest &quot;read your email to you&quot; speech synthesizer breathes (!) before it (he?) starts speaking. It&apos;s also, by far, the largest file in my installation of Leopard. See? Update: The software generating the view above...</summary>
    <author>
        <name>jonmarimba</name>
        
    </author>
            <category term="Technology Hate" />
            <category term="Technology Love" />
    
    <content type="html" xml:lang="en" xml:base="http://www.jonathansaggau.com/blog/">
        <![CDATA[Wow.  Alex.SpeechVoice is creepy.  Apple's latest "read your email to you" speech synthesizer breathes (!) before it (he?) starts speaking.  It's also, by far, the largest file in my installation of Leopard.
<br /><br />

See?
<br /><br />

<img src="http://www.jonathansaggau.com/blog//images/LepprSpace.jpg" border="0" height="504" width="645" alt="LepprSpace.jpg" align="center" />
<br /><br />
Update:
<br /><br />
The software generating the view above is called <a href="http://grandperspectiv.sourceforge.net/">GrandPerspective</a> and I love it.  Thanks to DeRay for emailing me about this.]]>
        
    </content>
</entry>

</feed> 

