<?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>Laughing Meme &#187; calendaring</title>
	<atom:link href="http://laughingmeme.org/tag/calendaring/feed/" rel="self" type="application/rss+xml" />
	<link>http://laughingmeme.org</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Mon, 02 Apr 2012 20:12:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>A literary appreciation of the Olson/Zoneinfo/tz database</title>
		<link>http://laughingmeme.org/2009/10/25/a-literary-appreciation-of-the-olsonzoneinfotz-database/</link>
		<comments>http://laughingmeme.org/2009/10/25/a-literary-appreciation-of-the-olsonzoneinfotz-database/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 22:28:08 +0000</pubDate>
		<dc:creator>Kellan</dc:creator>
				<category><![CDATA[Aside]]></category>
		<category><![CDATA[calendaring]]></category>
		<category><![CDATA[olson]]></category>
		<category><![CDATA[timezone]]></category>
		<category><![CDATA[udell]]></category>

		<guid isPermaLink="false">http://laughingmeme.org/?p=4334</guid>
		<description><![CDATA[I&#8217;m a card carrying member of the Olson fan club, but it&#8217;s still great reading see Jon&#8217;s love note. ADO has a posse. (actually I only have 5 posts tagged olson, while I have 7 posts tagged udell )]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m a card carrying member of the Olson fan club, but it&#8217;s still great reading see Jon&#8217;s love note. <acronym title="Arthur David Olson">ADO</acronym> has a posse.  (actually I only have 5 posts tagged <a href="http://laughingmeme.org/tag/olson/">olson</a>, while I have 7 posts tagged <a href="http://laughingmeme.org/tag/udell/">udell</a> )</p>
<p><a href='http://blog.jonudell.net/2009/10/23/a-literary-appreciation-of-the-olsonzoneinfotz-database/'>http://blog.jonudell.net/2009/10/23/a-literary-appreciation-of-the-olsonzoneinfotz-database/</a></p>]]></content:encoded>
			<wfw:commentRss>http://laughingmeme.org/2009/10/25/a-literary-appreciation-of-the-olsonzoneinfotz-database/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blizzard calendaring, and email. Next: spreadsheets!</title>
		<link>http://laughingmeme.org/2008/10/15/blizzard-calendaring-and-email-next-spreadsheets/</link>
		<comments>http://laughingmeme.org/2008/10/15/blizzard-calendaring-and-email-next-spreadsheets/#comments</comments>
		<pubDate>Wed, 15 Oct 2008 14:14:11 +0000</pubDate>
		<dc:creator>Kellan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[calendaring]]></category>
		<category><![CDATA[warcraft]]></category>
		<category><![CDATA[wow]]></category>

		<guid isPermaLink="false">http://laughingmeme.org/2008/10/15/blizzard-calendaring-and-email-next-spreadsheets/</guid>
		<description><![CDATA[And in calendaring/scheduling news&#8230;., originally uploaded by kellan. Been a while since we&#8217;ve had any calendaring/scheduling news here on LM. So I&#8217;m fulfilling my calendaring dork credentials by pointing out that with a certain glee, that Blizzard just rolled out a calendaring engine to 15 million people yesterday. Pictured here with their proprietary mail system, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/kellan/2943786557/" title="photo sharing"><img src="http://farm4.static.flickr.com/3246/2943786557_89bce71b5f.jpg" class="flickr-photo" alt="" /></a></p>

<p><span class="flickr-caption"><a href="http://www.flickr.com/photos/kellan/2943786557/">And in calendaring/scheduling news&#8230;.</a>, originally uploaded by <a href="http://www.flickr.com/people/kellan/">kellan</a>.</span>
</div></p>

<p>Been a while since we&#8217;ve had any <a href="http://laughingmeme.org/tag/calendaring/">calendaring/scheduling</a> news here on <a href="http://laughingmeme.org">LM</a>.  So I&#8217;m fulfilling my calendaring dork credentials by pointing out that with a certain glee, that Blizzard just rolled out a <a href="http://www.worldofwarcraft.com/info/basics/calendar.xml">calendaring engine</a> to 15 million people yesterday. </p>

<p>Pictured here with their proprietary mail system, Blizzard is well on its way to building a full PIM/productivity suite for an alternate universe.</p>
]]></content:encoded>
			<wfw:commentRss>http://laughingmeme.org/2008/10/15/blizzard-calendaring-and-email-next-spreadsheets/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Spike in CalDAV job searches</title>
		<link>http://laughingmeme.org/2008/08/16/spike-in-caldav-job-searches/</link>
		<comments>http://laughingmeme.org/2008/08/16/spike-in-caldav-job-searches/#comments</comments>
		<pubDate>Sat, 16 Aug 2008 21:28:24 +0000</pubDate>
		<dc:creator>Kellan</dc:creator>
				<category><![CDATA[Aside]]></category>
		<category><![CDATA[caldav]]></category>
		<category><![CDATA[calendaring]]></category>
		<category><![CDATA[jobs]]></category>
		<category><![CDATA[resume]]></category>

		<guid isPermaLink="false">http://laughingmeme.org/?p=3968</guid>
		<description><![CDATA[I&#8217;m seeing an interesting spike in folks looking for resumes with CalDAV on them, 37 queries for &#8220;caldav inurl:resume&#8221; in the last week. (and I should probably take it off mine as the state of the art has progressed while I&#8217;ve been away)]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m seeing an interesting spike in folks looking for resumes with CalDAV on them, 37 queries for &#8220;caldav inurl:resume&#8221; in the last week.  (and I should probably take it off mine as the state of the art has progressed while I&#8217;ve been away)</p>
<p><a href='http://www.google.com/search?q=caldav+inurl%3Aresume'>http://www.google.com/search?q=caldav+inurl%3Aresume</a></p>]]></content:encoded>
			<wfw:commentRss>http://laughingmeme.org/2008/08/16/spike-in-caldav-job-searches/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RFC 4791, or CalDAV to its friends</title>
		<link>http://laughingmeme.org/2008/07/29/rfc-4791-or-caldav-to-its-friends/</link>
		<comments>http://laughingmeme.org/2008/07/29/rfc-4791-or-caldav-to-its-friends/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 13:39:46 +0000</pubDate>
		<dc:creator>Kellan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[4791]]></category>
		<category><![CDATA[caldav]]></category>
		<category><![CDATA[calendaring]]></category>
		<category><![CDATA[gcal]]></category>
		<category><![CDATA[zimbra]]></category>

		<guid isPermaLink="false">http://laughingmeme.org/?p=3932</guid>
		<description><![CDATA[CalDAV is now available from Google Calendar and Zimbra. At times I&#8217;ve been CalDAV&#8217;s biggest fan. A calendaring protocol which finally stopped actively pretending the Web didn&#8217;t exist (I&#8217;m looking at you IETF CalSch WG)! But it does seem like its been a hard slog to implement. Keeping my fingers crossed for the future. (pointed [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ietf.osafoundation.org/caldav/">CalDAV</a> is now available from <a href="http://www.google.com/support/calendar/bin/answer.py?answer=99358">Google Calendar</a> and <a href="http://www.hawkwings.net/2008/01/17/zimbra-gets-friendly-with-safari-30-iphone/">Zimbra</a>.  </p>

<p>At times I&#8217;ve <a href="http://laughingmeme.org/?s=caldav">been CalDAV&#8217;s biggest fan</a>. A calendaring protocol which <strong>finally</strong> stopped actively pretending the Web didn&#8217;t exist (I&#8217;m looking at you IETF CalSch WG)! But it does seem like its been a hard slog to implement.  Keeping my fingers crossed for the future.</p>

<p>(pointed out to me that merely because <strong>I</strong> found out about Zimbra&#8217;s CalDAV support last week at OSCON, doesn&#8217;t mean it hasn&#8217;t been available since January, mea culpa)</p>
]]></content:encoded>
			<wfw:commentRss>http://laughingmeme.org/2008/07/29/rfc-4791-or-caldav-to-its-friends/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hypertable looks really interesting from everything I&#8217;ve read but &#8230;</title>
		<link>http://laughingmeme.org/2008/04/20/hypertable-looks-really-interesting-from-everything-ive-read-but/</link>
		<comments>http://laughingmeme.org/2008/04/20/hypertable-looks-really-interesting-from-everything-ive-read-but/#comments</comments>
		<pubDate>Sun, 20 Apr 2008 19:41:21 +0000</pubDate>
		<dc:creator>Kellan</dc:creator>
				<category><![CDATA[Aside]]></category>
		<category><![CDATA[bigtable]]></category>
		<category><![CDATA[calendaring]]></category>
		<category><![CDATA[dist]]></category>
		<category><![CDATA[fluffy clouds]]></category>
		<category><![CDATA[hypertable]]></category>
		<category><![CDATA[zvents]]></category>

		<guid isPermaLink="false">http://laughingmeme.org/?p=3806</guid>
		<description><![CDATA[&#8230; I can&#8217;t get over this nagging question, &#8220;Why does Zvents need a distributed, sparse matrix, versioned datastore?&#8221; I don&#8217;t track the calendaring space as much as I used to, and sometimes innovation is self justifying, but I&#8217;d feel a lot better about the project if I knew that answer.]]></description>
			<content:encoded><![CDATA[<p>&#8230; I can&#8217;t get over this nagging question, &#8220;Why does <a href="http://zvents.com">Zvents</a> need a distributed, sparse matrix, versioned datastore?&#8221;  I don&#8217;t track the calendaring space as much as I used to, and sometimes innovation is self justifying, but I&#8217;d feel a lot better about the project if I knew that answer.</p>
<p><a href='http://hypertable.org/'>http://hypertable.org/</a></p>]]></content:encoded>
			<wfw:commentRss>http://laughingmeme.org/2008/04/20/hypertable-looks-really-interesting-from-everything-ive-read-but/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How do I create a Thunderbird message filter for an attachment type?</title>
		<link>http://laughingmeme.org/2007/10/12/how-do-i-create-a-thunderbird-message-filter-for-an-attachment-type/</link>
		<comments>http://laughingmeme.org/2007/10/12/how-do-i-create-a-thunderbird-message-filter-for-an-attachment-type/#comments</comments>
		<pubDate>Fri, 12 Oct 2007 17:55:06 +0000</pubDate>
		<dc:creator>Kellan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[calendaring]]></category>
		<category><![CDATA[ical]]></category>
		<category><![CDATA[ics]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[thunderbird]]></category>

		<guid isPermaLink="false">http://laughingmeme.org/2007/10/12/how-do-i-create-a-thunderbird-message-filter-for-an-attachment-type/</guid>
		<description><![CDATA[I want to create a rule in Thunderbird that forwards every email I recieve that has an .ics attachment (aka meeting requests) to an abitrary address. And I can&#8217;t figure out how to do it. Help me Lazy Web! You&#8217;re my only hope.]]></description>
			<content:encoded><![CDATA[<p>I want to create a rule in Thunderbird that forwards every email I recieve that has an .ics attachment (aka meeting requests) to an abitrary address.</p>

<p>And I can&#8217;t figure out how to do it.</p>

<p>Help me Lazy Web! You&#8217;re my only hope.</p>
]]></content:encoded>
			<wfw:commentRss>http://laughingmeme.org/2007/10/12/how-do-i-create-a-thunderbird-message-filter-for-an-attachment-type/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>OSCON session planner is up.</title>
		<link>http://laughingmeme.org/2007/07/21/oscon-session-planner-is-up/</link>
		<comments>http://laughingmeme.org/2007/07/21/oscon-session-planner-is-up/#comments</comments>
		<pubDate>Sat, 21 Jul 2007 17:55:45 +0000</pubDate>
		<dc:creator>Kellan</dc:creator>
				<category><![CDATA[Aside]]></category>
		<category><![CDATA[calendaring]]></category>
		<category><![CDATA[conferences]]></category>
		<category><![CDATA[icalico]]></category>
		<category><![CDATA[oreilly]]></category>
		<category><![CDATA[oscon]]></category>

		<guid isPermaLink="false">http://laughingmeme.org/2007/07/21/oscon-session-planner-is-up/</guid>
		<description><![CDATA[Latest instance of icalico. Won&#8217;t be in Portland this year, you all have a great time without me.]]></description>
			<content:encoded><![CDATA[<p>Latest instance of icalico.  Won&#8217;t be in Portland this year, you all have a great time without me.</p>
<p><a href='http://oscon07.icalico.org/'>http://oscon07.icalico.org/</a></p>]]></content:encoded>
			<wfw:commentRss>http://laughingmeme.org/2007/07/21/oscon-session-planner-is-up/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>FOO: Crowdvine, iCalico, Pathable, a Study in Collusion</title>
		<link>http://laughingmeme.org/2007/07/11/foo-crowdvine-icalico-pathable-a-study-in-collusion/</link>
		<comments>http://laughingmeme.org/2007/07/11/foo-crowdvine-icalico-pathable-a-study-in-collusion/#comments</comments>
		<pubDate>Thu, 12 Jul 2007 05:10:36 +0000</pubDate>
		<dc:creator>Kellan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[calendaring]]></category>
		<category><![CDATA[casual privacy]]></category>
		<category><![CDATA[collaboration]]></category>
		<category><![CDATA[collusion]]></category>
		<category><![CDATA[conferences]]></category>
		<category><![CDATA[crowdvine]]></category>
		<category><![CDATA[foo]]></category>
		<category><![CDATA[icalico]]></category>
		<category><![CDATA[oauth]]></category>
		<category><![CDATA[tony stubblebine]]></category>
		<category><![CDATA[web services]]></category>
		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://laughingmeme.org/2007/07/11/foo-crowdvine-icalico-pathable-a-study-in-collusion/</guid>
		<description><![CDATA[I didn&#8217;t make it to FOO this year, but I did send software in my stead, and its nice to hear that folks liked it. We slaved iCalico to Crowdvine to add a social networking layer, a network that was walked, mapped, and color coded by the Pathable folks. Tony has a nice report back [...]]]></description>
			<content:encoded><![CDATA[<p>I didn&#8217;t make it to FOO this year, but I did send software in my stead, and its nice to hear that folks liked it.</p>

<p>We slaved <a href="http://www.google.com/search?q=icalico">iCalico</a> to <a href="http://crowdvine.com">Crowdvine</a> to add a social networking layer, a network that was walked, mapped, and color coded by the <a href="http://pathable.com/">Pathable</a> folks.</p>

<p>Tony has a nice <a href="http://www.stubbleblog.com/archives/2007/07/social_conferen.html">report back on it</a>, as does <a href="http://wagglelabs.com/2007/7/6/waggle-labs-at-foo-camp">Shelly from Pathable</a> (6 weeks aka a couple of late nights).  And Scott Berkun (who owes me a copy of &#8220;Art of Project Management&#8221;!) said <a href="http://www.scottberkun.com/blog/2007/more-social-software-crowdvine-pathable/">super nice things</a>.</p>

<h3>Collusion Patterns</h3>

<p>So how do you do that &#8212; stitch together 3 different sites to provide a unified experience?  Visions of APIs, Internet scale SSO, and messaging layers spring to mind.  Or more likely hash and slash patches, jury rigged shunts, juggled install directories.  </p>

<p>We did the dumb easy thing, and I&#8217;m surprised more people don&#8217;t do it.  </p>

<ol>
<li><p>Crowdvine.com sets a cookie <code>collusion</code>.  This cookie contains the data we needed to display the logged in view of iCalico. (you&#8217;re nickname and optional your URL).  In addition it contained a md5 hash of the concatted data, plus sekret known only to Tony and myself.  </p></li>
<li><p>If we find the cookie <code>collusion</code>, we load the described user from the database, or create it on the fly behind the scenes.</p></li>
<li><p>There is no step 3.</p></li>
</ol>

<p>Amazingly useful, trivially simple, ultimately flexible.  Niche sites are great, but you need techniques for stitching them together before they can realize their potential as pieces of an ecosystem.   I don&#8217;t necessarily <strong>expect</strong> to see this kind of integration become more common, but I think it would be great if it did. (and in the name of transparency disposable apps are <strong>huge</strong> enablers, disposable sites/apps is another pattern I&#8217;m puzzled we don&#8217;t see more of &#8212; its as if we more inclined to converse bits then landfill)</p>

<p><strong>update:</strong> Whoops, it was pointed out there was a step 3, or rather a step 1.5: use CNAMEs to point to individual components on sub-domains.</p>
]]></content:encoded>
			<wfw:commentRss>http://laughingmeme.org/2007/07/11/foo-crowdvine-icalico-pathable-a-study-in-collusion/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>edd: Launching Expectnation</title>
		<link>http://laughingmeme.org/2007/06/01/edd-launching-expectnation/</link>
		<comments>http://laughingmeme.org/2007/06/01/edd-launching-expectnation/#comments</comments>
		<pubDate>Fri, 01 Jun 2007 17:51:52 +0000</pubDate>
		<dc:creator>Kellan</dc:creator>
				<category><![CDATA[Aside]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[calendaring]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://laughingmeme.org/2007/06/01/edd-launching-expectnation/</guid>
		<description><![CDATA[Edd officially launched his conference calendaring app! Congrats! (tho if you came to Xtech you already know it pretty well)]]></description>
			<content:encoded><![CDATA[<p>Edd officially launched his conference calendaring app! Congrats! (tho if you came to Xtech you already know it pretty well)</p>
<p><a href='http://times.usefulinc.com/2007/06/01-expectnation'>http://times.usefulinc.com/2007/06/01-expectnation</a></p>]]></content:encoded>
			<wfw:commentRss>http://laughingmeme.org/2007/06/01/edd-launching-expectnation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Looking at PHP5&#8242;s DateTime and DateTimeZone</title>
		<link>http://laughingmeme.org/2007/02/27/looking-at-php5s-datetime-and-datetimezone/</link>
		<comments>http://laughingmeme.org/2007/02/27/looking-at-php5s-datetime-and-datetimezone/#comments</comments>
		<pubDate>Wed, 28 Feb 2007 00:47:09 +0000</pubDate>
		<dc:creator>Kellan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[calendaring]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[datetime]]></category>
		<category><![CDATA[Longer]]></category>
		<category><![CDATA[olson]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[timezone]]></category>

		<guid isPermaLink="false">http://laughingmeme.org/2007/02/27/looking-at-php5s-datetime-and-datetimezone/</guid>
		<description><![CDATA[Looking over the PHP5.2 changelog I noticed that somewhere along the way PHP5 seems to have picked up a provocatively named pair of classes, DateTime and DateTimeZone. There is something fundamentally brash, brazen even, to releasing a class named DateTime. As a calendar geek I imagine upon seeing &#8220;new DateTime()&#8221; I feel something akin to [...]]]></description>
			<content:encoded><![CDATA[<p>Looking over the <a href="http://www.php.net/ChangeLog-5.php">PHP5.2 changelog</a> I noticed that somewhere along the way PHP5 seems to have picked up a provocatively named pair of classes, DateTime and DateTimeZone.  </p>

<p>There is something fundamentally brash, brazen even, to releasing a class named DateTime.  As a calendar geek I imagine upon seeing &#8220;new DateTime()&#8221; I feel something akin to what an old thespian feels when they see a company putting on a production of the Scottish play &#8212; it&#8217;s a decidedly mixed emotion.  But I&#8217;m going to bump my way through learning how to use this new DateTime lib, bringing <strong>all my preconceptions</strong> about how it should work.  The odds of this being interesting to you is probably nil unless you&#8217;re in one or two very small cliques, feel free to read on, or browse away.</p>

<p>I&#8217;m primarily working in PHP4 right now, so my first step was to grab a copy of <a href="http://www.mamp.info/en/home.php">MAMP 1.5b</a> getting me a nice PHP5.2 sandbox to play with.</p>

<p>The new objects are <a href="http://www.php.net/manual/en/ref.datetime.php">documented here</a>, apparently there are functional equivalents for each of the object methods, and they use the <a href="http://pecl.php.net/package/timezonedb/">PECL timezomedb</a>.  </p>

<p>Hey!  timezonedb!  First fence cleared!  A timezone database compiled into a native format based on Olson is the <em>one true solution</em>, and I can update it independently, the most recent release being based on 2007b.  Sweet.  </p>

<p><a href="http://php.net/manual/en/function.date-create.php">Constructor</a> takes an initialization string that it passes to <a href="http://php.net/manual/en/function.strtotime.php">strtotime()</a>, and an optional DateTimeZone obj.  Defaults to &#8220;now&#8221;</p>

<pre><code>$date = new DateTime();
echo $date . "\n";
&gt; Object of class DateTime could not be converted to string 
</code></pre>

<p>Oops, no <code>__toString()</code> method defined.  You&#8217;ll need to use the <code>format()</code> instance method.  If you end up using the DateTime objects, you&#8217;ll be seeing a lot of <code>format()</code>, more on that in a bit.  </p>

<p><code>format()</code> uses the <a href="http://php.net/manual/en/function.date.php">date() formatting strings</a> (not the <code>strftime</code> format strings).  Also takes a number of useful constants, most usefully your pal and mine RFC3339 (aka W3CDTF aka Dublin Core/Atom date format).</p>

<pre><code>echo $date-&gt;format(DATE_RFC3339) . "\n";
&gt; 2007-02-22T15:23:47-05:00
</code></pre>

<p>Note: thats a constant, if you pass in the string &#8216;DATE_RFC3339&#8242;, and you&#8217;ll get odd looking results.</p>

<p>Here we can see the default constructor sets both the time and a timezone &#8212; correctly, for the moment, identifying my timezone as <code>America/New_York</code>.   That&#8217;s somewhat contentious behaviour, some people will tell you that dates with unspecified timezones should either be in UTC or be &#8220;floating&#8221;, divorced from any timezone.  Why?  At least in part because across platforms and boxes timezone guessing is going to be non-deterministic &#8212; the script that worked when you ran it locally on your Mac laptop in New York, might fail on your ISP&#8217;s servers.  You get a hint of this reading over the timezone guessing rules on <a href="http://php.net/date_default_timezone_get"><code>date_default_timezone_get</code></a>.  There is also the fact that I&#8217;m currently moving at about 400mph and will be in a different timezone real soon now.  However you can set the default to something reasonable in a script, or in the php.ini.  (consider this my recommendation)</p>

<pre><code>date_default_timezone_set('UTC');
$date = new DateTime();
echo $date-&gt;format(DATE_RFC3339);
&gt; 2007-02-22T20:44:49+00:00
</code></pre>

<p>Yay, that worked.  Okay, but lets display that datetime in the local timezone.  (after all the <em>point</em> of this entire exercise will be the ability to work painlessly in multiple timezones).</p>

<pre><code>$date-&gt;setTimezone('America/New_York');
&gt; DateTime::setTimezone() expects parameter 1 to be DateTimeZone
</code></pre>

<p>Siiiigh.  Not smart enough to cast strings into TimeZone objects (holds true for the constructor as well, so no <code>new DateTime('now', 'UTC'))</code>.  Now its time to learn how to use DateTimeZone.</p>

<h3>Working with DateTimeZone, All Hail Olson</h3>

<p>I mentioned briefly earlier that PHP is now shipping with an extension timezonedb, which is a compiled version of the <a href="http://en.wikipedia.org/wiki/Zoneinfo">Olson database</a>.  The Olson database is a massive, largely volunteer effort to catalog the various timezones both in use, and those that have been in the past.  Time is a political issue, <a href="http://laughingmeme.org/2005/04/04/daylight-saving-sucks-war-time/">particularly day light savings</a>, and as such the rules governing it are arbitrary, whimsical, and subject to frequent change.  (p.s. gotten a panicked memo yet about new daylight savings compliance for March 11th?  No?  Where did you say you worked?)</p>

<p>Note: Olson also uses a longer form of the zone names then we usually see in the U.S., this is to combat ambiguity.  See <a href="http://www.php.net/manual/en/timezones.php">Appendix H</a> for a list of timezone names, including some <a href="http://www.php.net/manual/en/timezones.others.php">handy shortcuts</a>.</p>

<pre><code>$tz = new DateTimeZone('America/New_York');
$date-&gt;setTimezone($tz);
echo $date-&gt;format(DATE_RFC3339) . "\n";
&gt; 2007-02-22T16:02:55-05:00
</code></pre>

<p>This is starting to get long winded, but, hey, PHP5 supports object dereferencing on returns.  Maybe this will work.</p>

<pre><code>echo $date-&gt;setTimezone($tz)-&gt;format(DATE_RFC3339) . "\n";
&gt;  Call to a member function format() on a non-object
</code></pre>

<p>Nope. Oh well.</p>

<h3>Date vs Datetime?</h3>

<p>Say I&#8217;ve got a nice platonic date, say November 11th.  There is no time element associated with this, so timezones are kind of irrelevant.  I mean Nov. 11th <em>starts</em> at different times through out the world, but Nov. 11th is universal. (as long as you&#8217;re using the same version of Gregorian as most of the rest of us)  Ideally this date would float above timezone issues, but that isn&#8217;t how PHP does it, 2007-11-11 is treated internally as midnight on the 11th, which is certainly simpler, but disappointing.  You can prove this like so:</p>

<pre><code>$date = new DateTime('2007-11-11');
$date-&gt;setTimeZone($tz);
echo $date-&gt;format(DATE_RFC3339) . "\n";
&gt; 2007-11-10T19:00:00-05:00
</code></pre>

<p>The other useful DateTimeZone method is getOffest() </p>

<pre><code>echo $tz-&gt;getOffset($date); 
&gt; -18000
</code></pre>

<h3>Daylight Saving, March 11th, and Why Programmers Are a Grouchy Lot</h3>

<p>Note: <code>getOffset</code>, which returns a timezone&#8217;s offset in seconds from UTC, takes a DateTime obj because offsets can be date sensitive due to daylight savings.  Really without daylight saving this stuff would all be pretty straightforward.    Let&#8217;s test to make sure the offsets are correct at the boundary.</p>

<pre><code>echo $tz_nyc-&gt;getOffset(new DateTime('2007-03-11 1:00')) . "\n";
echo $tz_nyc-&gt;getOffset(new DateTime('2007-03-11 2:00')) . "\n";
&gt; -18000
&gt; -14400

(-18000/(60*60) == -5 hours) 
(-14400/(60*60) == -4 hours) 
</code></pre>

<p><strong>Yay!</strong> They got the memo about <a href="http://en.wikipedia.org/wiki/Energy_Policy_Act_of_2005">U.S. Energy Policy Act of 2005</a>.</p>

<h3>The Basics:  Accessors and Mutators</h3>

<p>So what are some other basic desires?</p>

<p>Get epoch seconds!  Except for their kind of limited range epoch seconds are great, and have helped a generation of programmers put off worrying about timezones as long as possible.  They&#8217;re also the backbone of PHP&#8217;s traditional date/time methods.</p>

<p>Alas, there isn&#8217;t an accessor method for getting epoch seconds, you&#8217;ll have to use <code>format()</code>. </p>

<p>In fact DateTime doesn&#8217;t expose <strong>any</strong> of the accessors you&#8217;d expect, so you&#8217;ll be using <code>format</code> a <strong>lot</strong> if you want to access pieces of your date. (for you know, display purposes, or manipulation, or building queries, or pretty much doing anything you&#8217;d want to do with a date)</p>

<p>examples of the <code>format()</code> as all purpose accessor pattern:</p>

<pre><code>epoch:  $date-&gt;format('U'); // 1173596400
year:   $date-&gt;format('Y'); // 2007
month:  $date-&gt;format('n'); // 3
day:    $date-&gt;format('j'); // 11
dow:    $date-&gt;format('l'); // Sunday
</code></pre>

<p>&#8230; etc &#8230;</p>

<p>So now you have accessors for the full range of <a href="http://php.net/manual/en/function.date.php">date() formatting strings</a>.  You just have to jump through a hope.</p>

<p>Pretty much the only accessor is <code>getTimezone()</code></p>

<pre><code>echo $date-&gt;getTimeZone();   // hope springs eternal!
&gt; Object of class DateTimeZone could not be converted to string
echo $date-&gt;getTimeZone()-&gt;getName() . "\n";
&gt; America/New_York
</code></pre>

<h3>Mutators</h3>

<p>Speaking of accessors, DateTime is a little sparse on mutators as well: <code>setTime()</code>, <code>setDate()</code>, and the mysteriously named <code>setISODate()</code>.</p>

<pre><code>$date-&gt;setDate('2007', '1', '1')-&gt;format(DATE_RFC3339);  // who am I kidding?
&gt; Call to a member function format() on a non-object 
$date-&gt; setDate('2007', '1', '1');
echo $date-&gt;format(DATE_RFC3339) . "\n";
&gt; 2007-01-01T02:00:00-05:00
</code></pre>

<p>Now what if I want to set just the day?</p>

<p>Maybe</p>

<pre><code>$date-&gt; setDate(null, null, '11');
echo $date-&gt;format(DATE_RFC3339) . "\n";
&gt; -001-12-11T02:00:00-05:00
</code></pre>

<p>Nope.  </p>

<p>Instead you&#8217;ll need to pull out the year and month (using our <code>format()</code> accessors) and pass those back in just to set the day.</p>

<pre><code>$date-&gt; setDate('2007', '1', '1');   // jan 1.  
$date-&gt;setDate($date-&gt;format('Y'), $date-&gt;format('n'), 11);
echo $date-&gt;format(DATE_RFC3339) . "\n"; 
</code></pre>

<p>Clunky.  </p>

<p><code>setTime()</code> works the same, but for time.  </p>

<p>e.g. Setting just the minutes, 33 minutes past, but keep hours, and seconds constant:</p>

<pre><code>$date-&gt;setTime($date-&gt;format('G'), 33, $date-&gt;format('s'));
echo $date-&gt;format(DATE_RFC3339) . "\n"; 
&gt; 2007-01-11T02:33:00-05:00
</code></pre>

<p>So what is an ISODate?  I&#8217;m unclear, and so is PHP&#8217;s documentation.  The docs show the call signature taking a $year, $week, and optional $day, while the description talks about $year, $month, $day.  Looking at the code looks like $week is the proper call, $month is cut and paste error from <code>setDate()</code>.  So I guess this is a method for setting day by the &#8220;week of the year&#8221; a concept more popular in Europe then in the US.  Not sure what ISO has to do with it.   So what is our current week of the year?</p>

<pre><code>echo $date-&gt;format('N') . "\n";  // 'N' is new in 5.1.0
&gt; 4 
</code></pre>

<p>Jan 11th was in the 4th week of the 2007?  Go figure.  </p>

<pre><code>$date-&gt;setISODate(2007, 4, 5);  // fifth day of the 4th week?
echo $date-&gt;format(DATE_RFC3339) . "\n";
&gt; 2007-01-26T02:33:00-05:00
</code></pre>

<p>Um.  You know what?  You&#8217;re on your own with <code>setISODate</code>, sorry.</p>

<h3>Date Math: Adding and Subtracting Deltas aka $date->modify($str)</h3>

<p>PHP5 for better or worse has very limited operator overloading, so no $dt1 + $dt2 * $dt3 / $dt4.  Instead the primary method for doing math is <code>modify()</code></p>

<p>Thankfully PHP&#8217;s <code>strtotime()</code> method is a gem, and one of the things it handles is relative dates.  <code>strtotime()</code> + relative dates is the secret to doing math with PHP5&#8242;s DateTime.</p>

<p>Lets get a basic date to start with:</p>

<pre><code>$date = new DateTime('today');
echo $date-&gt;format(DATE_RFC3339) . "\n";
&gt; 2007-02-22T00:00:00+00:00
</code></pre>

<p><strong>Note:</strong> <code>modify()</code> is destructive. It changes the original datetime object (as the name suggests).  You&#8217;ll need to jump through some hopes to keep a copy of your original date.  More later.</p>

<p>Add/subtract N days:</p>

<pre><code>foreach (range(1,10) as $n) {
   $date-&gt;modify("+1 days");
   echo $date-&gt;format("Y-m-d") . "\n";
}

&gt; 2007-02-23
&gt; 2007-02-24
&gt; 2007-02-25
&gt; 2007-02-26
&gt; 2007-02-27
&gt; 2007-02-28
&gt; 2007-03-01
&gt; 2007-03-02
&gt; 2007-03-03
&gt; 2007-03-04

$date-&gt;modify("-10 days");
echo $date-&gt;format("Y-m-d") . "\n";

&gt; 2007-02-22

$date-&gt;modify("-1 month");
echo $date-&gt;format("Y-m-d") . "\n";
&gt; 2007-01-22
// or alternately
$date-&gt;modify("1 month ago");
echo $date-&gt;format("Y-m-d") . "\n";
&gt; 2006-12-22
</code></pre>

<h3>Cloning DateTime objects to work around <code>modify</code></h3>

<p>Of course you <strong>usually</strong> want to keep the original when doing date math, so <code>modify()</code>&#8216;s lack of idempotentce is annoying.  Lets say I&#8217;m building a SQL query to select events happening in the next 7 days.</p>

<p>In an <strong>ideal</strong> world the code would like this:</p>

<pre><code>$start = new DateTime('today');
$end = $start + 7;
echo "select between " . $start-&gt;format('Y-m-d') . " and " . $end-&gt;format('Y-m-d') . "\n";
</code></pre>

<p>The above of course is just a pipe dream.  But wouldn&#8217;t it be nice?</p>

<p>I&#8217;d settle for:</p>

<pre><code>$end = $start-&gt;calc("+7 days");
</code></pre>

<p>Or even:</p>

<pre><code>$end = $start-&gt;clone-&gt;modify('+7 days');
</code></pre>

<p>None of the above examples remotely work.  </p>

<p>Instead use:</p>

<pre><code>$start = new DateTime('today');
$end = clone $start;
$end-&gt;modify('7 days 3 minutes 42 seconds ago');
</code></pre>

<p>Now format our SQL query for our example:</p>

<pre><code>echo "select between " . $start-&gt;format(DATE_RFC3339) . " and " . $end-&gt;format(DATE_RFC3339) . "\n";
&gt; select between 2007-02-22T00:00:00+00:00 and 2007-02-14T23:56:18+00:00
</code></pre>

<p>Awkward, but it gets the job done.</p>

<p>At least the relative date format is super flexible and expressive.  As far as I know the closest thing to documentation is from the <a href="http://www.gnu.org/software/tar/manual/html_node/tar_109.html">GNU tar manual on date input formats</a>. (just like CVS)  Btw. if you ever want nightmares, take a look at the <code>scan</code> method in PHP&#8217;s parse_date.c and be thankful that isn&#8217;t your job to maintain <img src='http://laughingmeme.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<h3>Date Math: Comparison and Differences</h3>

<p>Beyond adding deltas (&#8220;+7 days&#8221;), the other common date math is comparing two datetimes, to find out which is more recent, and getting the difference between them.  DateTime supports no methods for comparing two datetimes.  The simplest solution for doing comparison is to compare epoch seconds.</p>

<p><strong>Note:</strong>  This method only works for dates that can be represented by epoch seconds. PHP uses a signed int for epoch seconds, so the range is limited by the size of the max int on your platform.  Generally you get approximately 138 years, 1901 to 2038.  There are other schemes besides epoch seconds for mapping dates to an easily comparable number; <a href="http://en.wikipedia.org/wiki/Julian_day">MJDs</a>, and <a href="http://cr.yp.to/proto/utctai.html">Tai time</a> being two.  See also <em>Rheingold &amp; Dershowitz 1997</em></p>

<pre><code>$d1 = new DateTime("today");
$d2 = new DateTime("tomorrow");
if ($d1-&gt;format('U') &lt; $d2-&gt;format('U')) {
   echo "true\n";
} 
&gt; true
</code></pre>

<p>If you&#8217;re going to be comparing a large number of dates you might consider a memoization technique like the <a href="http://en.wikipedia.org/wiki/Schwartzian_transform">Schwartzian transform</a>.</p>

<p>We can get the difference in seconds using the same hack of casting to epochs.</p>

<pre><code>echo $d2-&gt;format('U') - $d1-&gt;format('U') . "\n";
&gt; 86400
</code></pre>

<p>Ideally we&#8217;d then divide the difference seconds to get the difference in hours, days, weeks, or months.  However the following naive solution <strong>won&#8217;t</strong> work.  </p>

<pre><code>$diff / (60*60*24);  // calculate difference in days, **BADLY**
</code></pre>

<p>Why not?  Because days don&#8217;t always have 24 hours.  Sometimes they have 23 hours, sometimes they have 25.  Daylight saving strikes again.  (If you want to be even more pedantic, minutes are also not 60 seconds long, sometimes they&#8217;re 61 seconds long if we have a leap second)</p>

<p>Basically you need to break yourself of thinking of datetime units as being fungible.  You can&#8217;t simply calculate minutes from seconds, or days from hours.  Just like you can&#8217;t divide days by 30 to get an accurate number of months.  There are solutions, but they&#8217;re a bit beyond this blog post.</p>

<h3>new DateTime from Epoch Seconds</h3>

<p>So, <strong>non-fungible</strong>, remember that.</p>

<p>But sometimes you&#8217;ve cast DateTimes down to epochs to do math.  And then you&#8217;ll want to cast back to a DateTime.  </p>

<p>Alas DateTime doesn&#8217;t have a constructor that takes an epoch, and passing a epoch to the default constructor will throw an exception, rather you want:</p>

<pre><code>$from_epoch = new DateTime(date('c', '-568080000'));
echo $from_epoch-&gt;format('Y-m-d') . "\n";
&gt; 1952-01-01   // expected result
</code></pre>

<h3>Conclusions</h3>

<p>DateTime/DateTimeZone get timezones right, and for solving that hard problem they deserve all possibles accolades.  </p>

<p>The rest of the API however is kind of simplistic, awkward to work with, and verbose.</p>

<p>Single most useful change: have DateTime methods actually return the object making it possible to use a slightly more abbreviated calls.</p>

<p>I had thought about writing up a few more recipes, like nth dow of the month, and such.  But we were coming in for descent, and it was time to be done.  Might happen in the future.  </p>

<p>Also if anyone has any power to <strong>enhance</strong> the DateTime object, I hope some of the above can act as a road map for a more expressive and powerful core library.  Or ping me, happy to chat.</p>
]]></content:encoded>
			<wfw:commentRss>http://laughingmeme.org/2007/02/27/looking-at-php5s-datetime-and-datetimezone/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>&#8220;Building an application on top of Google Calendar</title>
		<link>http://laughingmeme.org/2006/12/01/building-an-application-on-top-of-google-calendar/</link>
		<comments>http://laughingmeme.org/2006/12/01/building-an-application-on-top-of-google-calendar/#comments</comments>
		<pubDate>Fri, 01 Dec 2006 22:21:00 +0000</pubDate>
		<dc:creator>Kellan</dc:creator>
				<category><![CDATA[Aside]]></category>
		<category><![CDATA[calendaring]]></category>
		<category><![CDATA[gcal]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://lm.quxx.info/?p=3527</guid>
		<description><![CDATA[like building a house during an earthquake&#8221;. hmmmm.]]></description>
			<content:encoded><![CDATA[<p>like building a house during an earthquake&#8221;.   hmmmm.</p>
<p><a href='http://blog.spanningsync.com/2006/11/building_a_hous.html'>http://blog.spanningsync.com/2006/11/building_a_hous.html</a></p>]]></content:encoded>
			<wfw:commentRss>http://laughingmeme.org/2006/12/01/building-an-application-on-top-of-google-calendar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Code: google-rfc-2445 recurrences</title>
		<link>http://laughingmeme.org/2006/10/25/google-code-google-rfc-2445-recurrences/</link>
		<comments>http://laughingmeme.org/2006/10/25/google-code-google-rfc-2445-recurrences/#comments</comments>
		<pubDate>Wed, 25 Oct 2006 16:33:00 +0000</pubDate>
		<dc:creator>Kellan</dc:creator>
				<category><![CDATA[Aside]]></category>
		<category><![CDATA[calendaring]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[ical]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[recurrence]]></category>

		<guid isPermaLink="false">http://lm.quxx.info/?p=3506</guid>
		<description><![CDATA[Google Calendar&#8217;s implementation of RFC 2445 repeating events. Apache 2.0 license. Java.]]></description>
			<content:encoded><![CDATA[<p>Google Calendar&#8217;s implementation of RFC 2445 repeating events.  Apache 2.0 license.  Java.</p>
<p><a href='http://code.google.com/p/google-rfc-2445/'>http://code.google.com/p/google-rfc-2445/</a></p>]]></content:encoded>
			<wfw:commentRss>http://laughingmeme.org/2006/10/25/google-code-google-rfc-2445-recurrences/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HubLog: Last.fm events calendar</title>
		<link>http://laughingmeme.org/2006/10/23/hublog-lastfm-events-calendar/</link>
		<comments>http://laughingmeme.org/2006/10/23/hublog-lastfm-events-calendar/#comments</comments>
		<pubDate>Mon, 23 Oct 2006 19:22:00 +0000</pubDate>
		<dc:creator>Kellan</dc:creator>
				<category><![CDATA[Aside]]></category>
		<category><![CDATA[calendaring]]></category>
		<category><![CDATA[collaboration]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[last.fm]]></category>
		<category><![CDATA[music]]></category>

		<guid isPermaLink="false">http://lm.quxx.info/?p=3505</guid>
		<description><![CDATA[Obvious, but good to see they finally did it. Premium service only though.]]></description>
			<content:encoded><![CDATA[<p>Obvious, but good to see they finally did it.  Premium service only though.  </p>
<p><a href='http://hublog.hubmed.org/archives/001413.html'>http://hublog.hubmed.org/archives/001413.html</a></p>]]></content:encoded>
			<wfw:commentRss>http://laughingmeme.org/2006/10/23/hublog-lastfm-events-calendar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Help Please &#8211; OSCal Needs a Name!</title>
		<link>http://laughingmeme.org/2006/09/06/help-please-oscal-needs-a-name/</link>
		<comments>http://laughingmeme.org/2006/09/06/help-please-oscal-needs-a-name/#comments</comments>
		<pubDate>Wed, 06 Sep 2006 21:48:00 +0000</pubDate>
		<dc:creator>Kellan</dc:creator>
				<category><![CDATA[calendaring]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[naming]]></category>
		<category><![CDATA[oscal]]></category>

		<guid isPermaLink="false">http://lm.quxx.info/?p=3462</guid>
		<description><![CDATA[OSCal needs a name. I never liked OSCal, but I couldn&#8217;t argue with the late night logic of &#8220;OScal &#8211; the OSCON Calendar&#8221; on the grounds of simplicity. And I might be talked into &#8220;OSCal &#8211; the EuroOSCON calendar&#8221;, but we all draw the line at &#8220;OSCal &#8211; the RailsConf Europe calendar&#8221;. Plus we&#8217;ll be [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://oscal.quxx.info/">OSCal</a> needs a name.  </p>

<p>I never liked OSCal, but I couldn&#8217;t argue with the late night logic of &#8220;OScal &#8211; the OSCON Calendar&#8221; on the grounds of simplicity.   And I might be talked into &#8220;OSCal &#8211; the <a href="http://conferences.oreillynet.com/euos2006/">EuroOSCON</a> calendar&#8221;, but we all draw the line at   &#8220;OSCal &#8211; the <a href="http://europe.railsconf.org/">RailsConf Europe</a> calendar&#8221;.  </p>

<p>Plus we&#8217;ll be open sourcing it as soon as <a href="http://anarchogeek.com">Rabble</a> or I get a free moment, at which point the name gets really silly.  </p>

<p>So, um, help?  <strong>Good names needed.</strong> (not to mention short domains)</p>

<h3>Rhymes with Orange?</h3>

<p>Concepts I&#8217;ve been playing with: conference, event, calendar, social, schedule, discovery, interests, open, network, mob, triage,  simple. </p>

<h3>ONU &#8211; OSCal is Not Unix?</h3>

<p>Best I came up with was &#8220;decafe&#8221; for &#8220;decentralized calendar for events&#8221;, which had potential except nobody likes decafe (and <a href="http://decafbad.com">decafbad.com</a> was already taken).   </p>

<p>Not that I suggest you limit your creativity to the rather unfortunate geek tendency towards acronyms, short, pronounceable, and easy to understand when read over a loud speaker at the front of a echoing conference hall.  </p>

<p>We need you, you&#8217;re our only hope.</p>

<p>(On a related note, I found that a .info domain name caused confusion and consternation among the presumably top percentile net savvy crowd at OSCON)</p>
]]></content:encoded>
			<wfw:commentRss>http://laughingmeme.org/2006/09/06/help-please-oscal-needs-a-name/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby Quiz &#8211; DayRange (#92)</title>
		<link>http://laughingmeme.org/2006/08/25/ruby-quiz-dayrange-92/</link>
		<comments>http://laughingmeme.org/2006/08/25/ruby-quiz-dayrange-92/#comments</comments>
		<pubDate>Fri, 25 Aug 2006 21:29:00 +0000</pubDate>
		<dc:creator>Kellan</dc:creator>
				<category><![CDATA[Aside]]></category>
		<category><![CDATA[calendaring]]></category>
		<category><![CDATA[nlp]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://lm.quxx.info/?p=3455</guid>
		<description><![CDATA[Intertesting date parsing Ruby Quiz]]></description>
			<content:encoded><![CDATA[<p>Intertesting date parsing Ruby Quiz</p>
<p><a href='http://www.rubyquiz.com/quiz92.html'>http://www.rubyquiz.com/quiz92.html</a></p>]]></content:encoded>
			<wfw:commentRss>http://laughingmeme.org/2006/08/25/ruby-quiz-dayrange-92/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mobile Calendaring</title>
		<link>http://laughingmeme.org/2006/08/10/mobile-calendaring/</link>
		<comments>http://laughingmeme.org/2006/08/10/mobile-calendaring/#comments</comments>
		<pubDate>Thu, 10 Aug 2006 22:38:00 +0000</pubDate>
		<dc:creator>Kellan</dc:creator>
				<category><![CDATA[mobile]]></category>
		<category><![CDATA[30boxes]]></category>
		<category><![CDATA[calendaring]]></category>
		<category><![CDATA[sync]]></category>
		<category><![CDATA[upcoming]]></category>

		<guid isPermaLink="false">http://lm.quxx.info/?p=3433</guid>
		<description><![CDATA[Aaron&#8217;s released upcalendar, the latest barrage in his Web2.0 on S60 campaign. And 30Boxes has m.boxes.com. Got to say the mobile page for OSCAL (now defunct as its smart enough to only show upcoming events), was by far my favorite part of the app. Turns out mobile is sexy, useful, and fun but not all [...]]]></description>
			<content:encoded><![CDATA[<p>Aaron&#8217;s released <a href="http://www.aaronland.info/weblog/2006/08/04/zebra/#upcalendar">upcalendar</a>, the latest barrage in his Web2.0 on S60 campaign.  </p>

<p>And 30Boxes has <a href="http://30boxes.com/blog/index.php/2006/08/09/30boxes-mobile-m30boxescom/">m.boxes.com</a>.</p>

<p>Got to say the <a href="http://oscal.quxx.info/m">mobile page</a> for OSCAL (now defunct as its smart enough to only show upcoming events), was by far my favorite part of the app.</p>

<p>Turns out mobile is sexy, useful, and fun but not all that hard.  Who knew?</p>

<p>All of which goes back to my an idea I&#8217;ve been kicking around for a bit, sync is dead (which is good because sync is hard), instead we&#8217;ve got remote services, local caching, and change propagation. (which is largely understood) All the interesting work right now is on the tension between the client and the server.</p>
]]></content:encoded>
			<wfw:commentRss>http://laughingmeme.org/2006/08/10/mobile-calendaring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Boxes and Arrows Event Calendar</title>
		<link>http://laughingmeme.org/2006/08/08/boxes-and-arrows-event-calendar/</link>
		<comments>http://laughingmeme.org/2006/08/08/boxes-and-arrows-event-calendar/#comments</comments>
		<pubDate>Tue, 08 Aug 2006 19:27:00 +0000</pubDate>
		<dc:creator>Kellan</dc:creator>
				<category><![CDATA[Aside]]></category>
		<category><![CDATA[calendar]]></category>
		<category><![CDATA[calendaring]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[ia]]></category>
		<category><![CDATA[inspiration]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://lm.quxx.info/?p=3427</guid>
		<description><![CDATA[Attractive calendar of &#8220;interesting web-related events&#8221;. In Rails.]]></description>
			<content:encoded><![CDATA[<p>Attractive calendar of &#8220;interesting web-related events&#8221;.  In Rails.</p>
<p><a href='http://events.boxesandarrows.com/events'>http://events.boxesandarrows.com/events</a></p>]]></content:encoded>
			<wfw:commentRss>http://laughingmeme.org/2006/08/08/boxes-and-arrows-event-calendar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Collaboration, an open source CalDav from Apple</title>
		<link>http://laughingmeme.org/2006/08/08/collaboration-an-open-source-caldav-from-apple/</link>
		<comments>http://laughingmeme.org/2006/08/08/collaboration-an-open-source-caldav-from-apple/#comments</comments>
		<pubDate>Tue, 08 Aug 2006 19:01:00 +0000</pubDate>
		<dc:creator>Kellan</dc:creator>
				<category><![CDATA[apple]]></category>
		<category><![CDATA[caldav]]></category>
		<category><![CDATA[calendaring]]></category>
		<category><![CDATA[collaboration]]></category>

		<guid isPermaLink="false">http://lm.quxx.info/?p=3426</guid>
		<description><![CDATA[I missed it, I&#8217;d even seen the inimitable Wilfredo on the lists and it went right by me, but I ran into Nat last night at Buzz&#8217;s WWDC party, and he rather riveted my attention (as I think he knew he would), that iCalServer announced yesterday? Turns out its an open source CalDav server, written [...]]]></description>
			<content:encoded><![CDATA[<p>I missed it, I&#8217;d even seen the inimitable <a href="http://www.wsanchez.net/blog/">Wilfredo</a> on the lists and it went right by me, but I ran into <a href="http://bumppo.net/">Nat</a> last night at <a href="http://upcoming.org/event/93479/">Buzz&#8217;s WWDC party</a>, and he rather riveted my attention (as I think he knew he would), that <a href="http://www.apple.com/server/macosx/leopard/icalserver.html">iCalServer</a> announced yesterday?  Turns out its an <a href="http://collaboration.macosforge.org/">open source CalDav server</a>, written in Python (<a href="http://twistedmatrix.com/trac/">Twisted</a>), Apache 2.0 license, with great unit test coverage.  (which bodes well for the trial by fire known as interop)</p>

<p>Btw. <a href="http://collaboration.macosforge.org/">Collaboration&#8217;s homepage</a> seems to be a <a href="http://trac.edgewall.org/">Trac</a> install which is sputtering, and crying. Under load?</p>

<p><strong>update:</strong> Um, and how long as <a href="http://www.google.com/search?q=%22c.+daboo%22">Cyrus Daboo</a> been signing his emails &#8220;Apple Software Engineer&#8221;?  Yup, I was asleep.</p>

<p><strong>update 2:</strong> wsz <a href="http://www.wsanchez.net/blog/2006/08/darwin_calendar_server.html">confirms trac unhappiness (and my Twisted inside observation)</a>, I guess I just got in in time, if you email me, I&#8217;ll send you a tarball of the src.</p>
]]></content:encoded>
			<wfw:commentRss>http://laughingmeme.org/2006/08/08/collaboration-an-open-source-caldav-from-apple/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Social Scheduling for OSCON</title>
		<link>http://laughingmeme.org/2006/07/25/social-scheduling-for-oscon/</link>
		<comments>http://laughingmeme.org/2006/07/25/social-scheduling-for-oscon/#comments</comments>
		<pubDate>Wed, 26 Jul 2006 07:07:00 +0000</pubDate>
		<dc:creator>Kellan</dc:creator>
				<category><![CDATA[calendaring]]></category>
		<category><![CDATA[oscal]]></category>
		<category><![CDATA[oscon]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[social]]></category>

		<guid isPermaLink="false">http://lm.quxx.info/?p=3405</guid>
		<description><![CDATA[It started as a random idea on the train on Friday, but didn&#8217;t become real until yesterday afternoon (aka the first day of OSCON) when Rabble and I sat down at Stumptown and banged out a new scheduling app. OSCAL is a tool for building a list of talks you&#8217;re interested in going to, and [...]]]></description>
			<content:encoded><![CDATA[<p>It started as a random idea on the train on Friday, but didn&#8217;t become real until yesterday afternoon (aka the first day of <a href="http://conferences.oreillynet.com/os2006/">OSCON</a>) when <a href="http://anarchogeek.com">Rabble</a> and I <a href="http://anarchogeek.com/articles/2006/07/25/hacking-up-an-oscon-calendar-oscal">sat down</a> at <a href="http://www.stumptowncoffee.com/">Stumptown</a> and banged out a new scheduling app.</p>

<p><a href="http://oscal.quxx.info/">OSCAL</a> is a tool for building a list of talks you&#8217;re interested in going to, and discovering what talks others are going to.  Its a tag-enabled, all social, calendaring app, written in Rails, in about 6 hours.  Take it for a spin, we like it.</p>

<p>Version 2.0 may or may not come out sometime tonight, with search, comments, user submitted events, and SMS notifications.</p>

<p>Version 2.0 or not though, the app worked, <em>I&#8217;m</em> much more excited about tomorrows sessions, and as you can see <a href="http://oscal.quxx.info/list/kellan">deeply divided about what to attend</a></p>
]]></content:encoded>
			<wfw:commentRss>http://laughingmeme.org/2006/07/25/social-scheduling-for-oscon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;The Lovendar is a calendar aggregator specifically designed for families.</title>
		<link>http://laughingmeme.org/2006/05/09/the-lovendar-is-a-calendar-aggregator-specifically-designed-for-families/</link>
		<comments>http://laughingmeme.org/2006/05/09/the-lovendar-is-a-calendar-aggregator-specifically-designed-for-families/#comments</comments>
		<pubDate>Wed, 10 May 2006 00:54:00 +0000</pubDate>
		<dc:creator>Kellan</dc:creator>
				<category><![CDATA[Aside]]></category>
		<category><![CDATA[calendaring]]></category>
		<category><![CDATA[creative]]></category>
		<category><![CDATA[mashup]]></category>

		<guid isPermaLink="false">http://lm.quxx.info/?p=3354</guid>
		<description><![CDATA[It includes the stuff you don&#8217;t normally put into your calendar, but you really should.&#8221; Nice!]]></description>
			<content:encoded><![CDATA[<p>It includes the stuff you don&#8217;t normally put into your calendar, but you really should.&#8221;  Nice!</p>
<p><a href='http://mashpit.pbwiki.com/TheLovendar'>http://mashpit.pbwiki.com/TheLovendar</a></p>]]></content:encoded>
			<wfw:commentRss>http://laughingmeme.org/2006/05/09/the-lovendar-is-a-calendar-aggregator-specifically-designed-for-families/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

