<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-us"><title>Officially Lucky link blog feed. By Clint Ecker</title><link href="http://blog.clintecker.com/" rel="alternate" /><id>http://blog.clintecker.com/</id><updated>2008-07-14T00:42:05Z</updated><author><name>Clint Ecker</name><email>me@clintecker.com</email></author><subtitle>Links that Clint Ecker finds interesting, noteworthy, or just plain cool.  Django, Python, Programming, Web 2.0, The Social Graph, Fashion, Chicago. A whole mix of stuff.</subtitle><category term="Flickr" /><category term="Twitter" /><category term="Google Reader" /><category term="Last.FM" /><category term="Facebook Shared Items" /><link rel="self" href="http://feeds.feedburner.com/OfficiallyLuckyLinkBlogFeedByClintEcker" type="application/atom+xml" /><entry><title>I&amp;#8217;m now an iPhone owner :) (Torres Talking)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/lYbXT1kmuXc/cns!FBABF8E542F5D5DB!13172.entry" rel="alternate" /><updated>2008-07-14T00:42:05Z</updated><id>http://mike.spaces.live.com/Blog/cns!FBABF8E542F5D5DB!13172.entry</id><summary type="html">
&lt;p&gt;&lt;a href="http://mike.spaces.live.com/blog/cns!FBABF8E542F5D5DB!7871.entry"&gt;I swore off the iPhone for at least a year&lt;/a&gt; when it was first announced.&amp;#160; I had good reasons (to me at least).&amp;#160; To recap: &lt;ol&gt; &lt;li&gt;I couldn&amp;#8217;t synchronize with Exchange over the air &lt;strong&gt;(ADDRESSED)&lt;/strong&gt; &lt;li&gt;Couldn&amp;#8217;t swap the battery out for a better one &lt;li&gt;The EDGE network was/is so slow to be unusable &lt;strong&gt;(ADDRESSED)&lt;/strong&gt; &lt;li&gt;It was a closed platform &lt;strong&gt;(ADDRESSED)&lt;/strong&gt; &lt;li&gt;It was ridiculously, insanely expensive &lt;strong&gt;(ADDRESSED)&lt;/strong&gt; &lt;li&gt;It was a v1 from a company that&amp;#8217;s never built a phone before &lt;strong&gt;(ADDRESSED)&lt;/strong&gt; &lt;li&gt;Typing on something without feedback won&amp;#8217;t work &lt;li&gt;I didn&amp;#8217;t want a phone that could get scratched easily &lt;li&gt;Functionally, it didn&amp;#8217;t do more than my current phone &lt;strong&gt;(ADDRESSED)&lt;/strong&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;I compromised on a few of these things &amp;#8211; but Apple addressed the important ones.&amp;#160; So I ended up waiting in line for 2.5 hours (I think it was actually more like 3!) yesterday morning to get one.&amp;#160; I don&amp;#8217;t even know where to start with this thing, I dig it so much; it&amp;#8217;s easily the most excited I&amp;#8217;ve been for a toy since I got my first PalmPilot in 1997 (the thing that started this addiction). &lt;p&gt;I likely won&amp;#8217;t be writing too much about my iPhone though, for a few reasons: 1) I don&amp;#8217;t want to gush, and I will end up gushing 2) I&amp;#8217;m not blogging that much anyway - even though the iPhone is inspiring me to, 3) It&amp;#8217;s been covered to death, 4) Anything I write can&amp;#8217;t do justice to this little marvel. &lt;p&gt; &lt;p&gt; &lt;p&gt; &lt;p&gt; &lt;p&gt; &lt;p&gt; &lt;p&gt; &lt;p&gt; &lt;p&gt; &lt;p&gt; &lt;p&gt; &lt;p&gt; &lt;p&gt; &lt;p&gt; &lt;p&gt; &lt;p&gt; &lt;p&gt; &lt;p&gt;So, just in case anyone cares, I now have an iPhone (syncing it with Windows Vista and Exchange Server of course).&amp;#160; Using it is like having a magic wand ;)&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-311882085617510949&amp;amp;page=RSS%3a+I%e2%80%99m+now+an+iPhone+owner+%3a)&amp;amp;referrer=" width="1px" height="1px" border="0" alt="" /&gt;&lt;img alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=mike.spaces.live.com&amp;amp;GT1=mike" /&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/lYbXT1kmuXc" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://mike.spaces.live.com/Blog/cns!FBABF8E542F5D5DB!13172.entry</feedburner:origLink></entry><entry><title>Macenstein | Developers furious over App Store &amp;#8220;Line Cutting&amp;#8221; (macenstein.com)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/5DsGihYZBV4/1494" rel="alternate" /><updated>2008-07-13T21:40:16Z</updated><id>http://macenstein.com/default/archives/1494</id><summary type="html">
&lt;blockquote class="notation"&gt;&lt;strong&gt;Clint:&lt;/strong&gt;

These Jirbo guys are jerks&lt;/blockquote&gt;
There&amp;#8217;s a bit of bad blood brewing between developers of iPhone Apps these days. It seems several different companies have renamed their iPhone games to begin with either a space, a quotation mark, or some other symbol so that they appear first in the list of 197 games on the iPhone portal to the App Store.
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/5DsGihYZBV4" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://macenstein.com/default/archives/1494</feedburner:origLink></entry><entry><title>django-pagination - Google Code (code.google.com)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/MZDYvRfiRJQ/" rel="alternate" /><updated>2008-07-13T21:17:48Z</updated><id>http://code.google.com/p/django-pagination/</id><summary type="html">

&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/MZDYvRfiRJQ" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://code.google.com/p/django-pagination/</feedburner:origLink></entry><entry><title>DjangoCon Officially Announced (Empty Thoughts - Home)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/HcEs1Kz_jVs/djangocon-officially-announced" rel="alternate" /><updated>2008-07-13T21:15:17Z</updated><id>http://blog.michaeltrier.com/2008/7/13/djangocon-officially-announced</id><summary type="html">
&lt;p&gt;There&amp;#8217;s been &lt;a href="http://blog.howiworkdaily.com/post/2008/jul/7/callcast-jacob-kaplan-moss-and-djangocon-2008/"&gt;lots of discussion&lt;/a&gt; and &lt;a href="http://simonwillison.net/2008/Jul/13/twitter/"&gt;hints&lt;/a&gt; over the past several days about a forthcoming Django based conference called DjangoCon.  The &lt;a href="http://www.djangoproject.com/weblog/2008/jul/13/djangocon/"&gt;official announcement&lt;/a&gt; was just released.  I&amp;#8217;ve always been fond of small intimate group settings and this one will certainly be that with only 200 attendees allowed to participate.  I only hope that I get one of the coveted spots.&lt;/p&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/HcEs1Kz_jVs" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://blog.michaeltrier.com/2008/7/13/djangocon-officially-announced</feedburner:origLink></entry><entry><title>MobileMe doesn&amp;#8217;t push from Mac to Me.com and handheld devices (JeffCroft.com: Latest bookmarks)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/9iVUVnIdnqs/" rel="alternate" /><updated>2008-07-13T20:37:55Z</updated><id>http://jeffcroft.com/links/2008/jul/13/mobileme-doesnt-push-from-mac-to-mecom-and-handheld-devices/</id><summary type="html">
&lt;img src="http://ma.gnolia.com/bookmarks/zucofuz/thumbnail" /&gt;
&lt;p&gt;Turns out, MobileMe doesn&amp;#8217;t &amp;#8220;push&amp;#8221; changes to calendars and contacts made on your Mac to the Me.com web apps and your handheld devices. From an &lt;a href="javascript:void(0);" title="class=&amp;quot;caps&amp;quot;&amp;gt;TS1155&amp;lt;/span&amp;gt;"&gt;Apple Knowledgebase article&lt;/a&gt;:
&lt;/p&gt;
&lt;blockquote class="notation"&gt;&lt;p&gt;Changes made on your computer will be synced to the MobileMe &amp;#8220;cloud&amp;#8221; once every 15 minutes (or every hour in Mac &lt;span&gt;OS&lt;/span&gt; X 10.4.11).
&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;Changes to calendars and contacts made on Me.com or on your iPhone &lt;em&gt;will&lt;/em&gt; be pushed to your Mac immediately, but the reverse is not true. Strange. From Apple&amp;#8217;s &lt;a href="http://www.apple.com/mobileme/features/"&gt;MobileMe features&lt;/a&gt; page:
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;MobileMe stores all your email, contacts, and calendars in the cloud and pushes them down to your iPhone, iPod touch, &lt;em&gt;&lt;/em&gt;Mac, and &lt;span&gt;PC&lt;/span&gt;. When you make a change on one device, the cloud updates the others. Push happens automatically, instantly, and continuously. You don&amp;#8217;t have to wait for it&lt;em&gt;&lt;/em&gt; or remember to do anything &amp;#8212; such as docking your iPhone and syncing manually &amp;#8212; to stay up to date
&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;Emphasis mine. For many people, including me, a 15 minute sync time is probably just fine in real-world usage. But, it definitely seems contrary to how the service was promoted and demoed at the &lt;span&gt;WWDC&lt;/span&gt; keynote, and I can definitely understand why so many people are complaining about it on the MacRumors forums and across the Internet. This sort of reeks of deception.
&lt;/p&gt;
&lt;p&gt;A couple things worth pointing out about this, for those wondering why it&amp;#8217;s a big deal:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
     It&amp;#8217;s an especially big deal for laptop users, who are prone to opening their laptop, adding a calendar event or contact, and then closing it again. If MobileMe really &amp;#8220;pushed&amp;#8221; from Mac to the cloud, then this behavior would be fine &amp;#8212; the update has already made it to the cloud by the time the laptop is closed. If a user has to sit there, laptop open, for at least 15 minutes, to ensure the sync takes place, that sucks.
 &lt;/li&gt;
&lt;li&gt;
     MobileMe isn&amp;#8217;t all about the iPhone. It&amp;#8217;s &lt;em&gt;supposed&lt;/em&gt; to keep &lt;em&gt;all&lt;/em&gt; your devices instantly in sync, including multiple Macs. Someone who doesn&amp;#8217;t have an iPhone but has two Macs might want to keep their laptop in sync with their desktop. The old .Mac did this at a 15 minute interval, and MobileMe was promoted as an improvement that made the sync near-instantaneous. In reality, for this user, MobileMac is not an improvement at all &amp;#8212; and that also&amp;#160;sucks.
 &lt;/li&gt;
&lt;/ol&gt;
&lt;a href="http://www.macrumors.com/2008/07/13/mobilemes-push-services-detailed-no-mac-to-mobile-me-push/"&gt;Visit site&lt;/a&gt; (http://www.macrumors.com/2008/07/13/mobilemes-push-services-detailed-no-mac-to-mobile-me-push/)
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/9iVUVnIdnqs" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://jeffcroft.com/links/2008/jul/13/mobileme-doesnt-push-from-mac-to-mecom-and-handheld-devices/</feedburner:origLink></entry><entry><title>DjangoCon 2008 (The Django weblog)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/YocTlwTnc0s/" rel="alternate" /><updated>2008-07-13T19:48:00Z</updated><id>http://www.djangoproject.com/weblog/2008/jul/13/djangocon/</id><summary type="html">
&lt;p&gt;
&lt;i&gt;
For the past year or so, people have been asking for us to hold a conference all about Django. Putting together a conference is an imense amount of work, so it took us a while to get the ball rolling. However, over the past couple of months we've found a few good volunteers who've taken on the task of planning a "DjangoCon," and now the dream is a reality!
&lt;/i&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;i&gt;
For the details, I'll turn this space over to Robert Lofthouse, the conference chair:
&lt;/i&gt;
&lt;/p&gt;

&lt;p&gt;
I am pleased to announce that DjangoCon will be held on the 6th and 7th of September, 2008 at the Google headquarters in Mountain View. This will tie in with the 1.0 release of Django, and so we'll be also having a 1.0 release party on Saturday September 6th.
&lt;/p&gt;

&lt;p&gt;
All the details including a schedule of speakers will be made available when we launch the conference website on Friday. Space will be limited to about 200 attendees, so we'll be releasing tickets in batches to give everyone a chance to come to the conference. Admission will be &lt;strong&gt;free&lt;/strong&gt;, but we'll be asking for an optional donation to the &lt;a href="http://www.djangoproject.com/foundation/"&gt;Django Software Foundation&lt;/a&gt; to help cover our costs.
&lt;/p&gt;

&lt;p&gt;
Thanks to everyone who has been helping out, and also thanks to Google for working so hard to get everything done!
&lt;/p&gt;

&lt;p&gt;
I look forward to seeing those that can make it! It's going to rock!
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&amp;#8212; Robert Lofthouse, Conference Chair&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/YocTlwTnc0s" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://www.djangoproject.com/weblog/2008/jul/13/djangocon/</feedburner:origLink></entry><entry><title>Monkeypatching For Humans (Coding Horror)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/nw_xl6o39fo/001151.html" rel="alternate" /><updated>2008-07-13T15:00:53Z</updated><id>http://www.codinghorror.com/blog/archives/001151.html</id><summary type="html">
&lt;blockquote class="notation"&gt;&lt;strong&gt;Clint:&lt;/strong&gt;

Can you not subclass the String class in other languages?&lt;/blockquote&gt;
&lt;p&gt;
Although &lt;a href="http://www.codinghorror.com/blog/archives/000634.html"&gt;I love strings&lt;/a&gt;, sometimes the &lt;code&gt;String&lt;/code&gt; class can break your heart. For example, in C#, there is no &lt;code&gt;String.Left()&lt;/code&gt; function. Fair enough; we can roll up our sleeves and write our own function lickety-split:
&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;pre&gt;public static string Left(string s, int len)
{
    if (len == 0 || s.Length == 0)
        return &amp;quot;&amp;quot;;
    else if (s.Length &amp;lt;= len)
        return s;
    else
        return s.Substring(0, len);
}
&lt;/pre&gt;
&lt;p&gt;
And call it like so:
&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;pre&gt;var s = "Supercalifragilisticexpialidocious";
s = Left(s, 5);
&lt;/pre&gt;
&lt;p&gt;
Fairly painless, right?
&lt;/p&gt;&lt;p&gt;
But with the advent of C# 3.0, there's an even better way -- &lt;a href="http://msdn.microsoft.com/en-us/library/bb383977.aspx"&gt;extension methods&lt;/a&gt;. With an extension method, we "extend" the &lt;code&gt;String&lt;/code&gt; to add the missing function. The code is fairly similar; I'll highlight the changed parts in red.
&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;pre&gt;public static string Left(&lt;font color="red"&gt;this&lt;/font&gt; string s, int len)
{
    if (len == 0 || s.Length == 0)
        return &amp;quot;&amp;quot;;
    else if (s.Length &amp;lt;= len)
        return s;
    else
        return s.Substring(0, len);
}
&lt;/pre&gt;
&lt;p&gt;
And now we can call it &lt;b&gt;as if this very method existed on the String class as shipped&lt;/b&gt;:
&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;pre&gt;var s = "Supercalifragilisticexpialidocious";
s = &lt;font color="red"&gt;s.Left(5);&lt;/font&gt;
&lt;/pre&gt;
&lt;p&gt;
Pretty slick. It's difficult not to fall in love with extension methods, as they allow you to mold classes into exactly what you think they should be. This is fairly innocuous in C#, as &lt;b&gt;extension methods only allow you to add new functionality to classes&lt;/b&gt;, not override, remove, or replace anything.
&lt;/p&gt;&lt;p&gt;
But imagine if you &lt;i&gt;could&lt;/i&gt;.
&lt;/p&gt;&lt;p&gt;
Well, that's exactly how it is in other, more dynamic languages such as Javascript, Python, Perl, and Ruby. Something as prosaic as C# extensions is old hat to these folks. In those languages, &lt;i&gt;you could redefine everything in the &lt;code&gt;String&lt;/code&gt; class if you wanted to&lt;/i&gt;. This is commonly known in dynamic language circles as &lt;a href="http://en.wikipedia.org/wiki/Monkey_patch"&gt;monkeypatching&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
&lt;img alt="monkey patching" src="http://www.codinghorror.com/blog/images/monkey-patching.jpg" width="512" height="354" border="0" /&gt;
&lt;/p&gt;&lt;p&gt;
If the idea of monkeypatching scares you a little, it probably should. Can you imagine debugging code where the &lt;code&gt;String&lt;/code&gt; class had subtly different behaviors from the &lt;code&gt;String&lt;/code&gt; you've learned to use? Monkeypatching &lt;a href="http://avdi.org/devblog/2008/02/23/why-monkeypatching-is-destroying-ruby/"&gt;can be incredibly dangerous in the wrong hands&lt;/a&gt;, as Avdi Grimm notes:
&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;blockquote&gt;
Monkey patching is the new black [in the Ruby community].  It's what all the hip kids are doing.  To the point that smart, experienced hackers reach for a monkey patch as their tool of first resort, even when a simpler, more traditional solution is possible.
&lt;p&gt;
I don't believe this situation to be sustainable.  Where I work, &lt;b&gt;we are already seeing subtle, difficult-to-debug problems crop up as the result of monkey patching in plugins.&lt;/b&gt; Patches interact in unpredictable, combinatoric ways.  And by their nature, bugs caused by monkey patches  are more difficult to track down than those introduced by more traditional classes and methods.  As just one example: on one project, it was a known caveat that we could not rely on class inheritable attributes as provided by ActiveSupport.  No one knew why.  Every Model we wrote had to use awkward workarounds.  Eventually we tracked it down in a plugin that generated admin consoles.  It was overwriting &lt;code&gt;Class.inherited()&lt;/code&gt;.  It took us months to find this out.
&lt;/p&gt;&lt;p&gt;
This is just going to get worse if we don't do something about it.  And the "something" is going to have to be a cultural shift, not a technical fix.  I believe it is time for experienced Ruby programmers to wean ourselves off of monkey patching, and start demonstrating more robust techniques.
&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;
Try to imagine a world where &lt;b&gt;every programmer you know is a wannabe language designer, bent on molding the language to their whims&lt;/b&gt;. When I close my eyes and imagine it, I have a vision of the apocalypse, a perfect, pitch-black storm of utterly incomprhensible, pathologically difficult to debug code.
&lt;/p&gt;&lt;p&gt;
I was just looking at random PHP plugin code the other day, and it was, frankly, crap. But that's because &lt;i&gt;most code is crap&lt;/i&gt;. &lt;a href="http://www.codinghorror.com/blog/archives/000099.html"&gt;Including my own&lt;/a&gt;. It is, sadly, the statistical norm. That's why &lt;a href="http://www.codinghorror.com/blog/archives/000824.html"&gt;sites like The Daily WTF&lt;/a&gt; are guaranteed to have more material than they can possibly ever publish for the next millennia. (Note to self: invest in this website). I can only imagine what that PHP plugin code would have looked like, had its developer been granted the ability to redefine fundamental PHP keywords and classes at will. These are the sort of thoughts that drive me to drink &lt;a href="http://www.amazon.com/dp/B000NY30P0/?tag=codinghorror-20"&gt;Bawls&lt;/a&gt;. And that stuff is disgusting.
&lt;/p&gt;&lt;p&gt;
You might say that PHP, sans the fundamental dynamic language ability to monkeypatch, is &lt;a href="http://weblog.raganwald.com/2006/10/are-we-blub-programmers.html"&gt;just another crappy Blub language&lt;/a&gt;. But there's also a ton of &lt;a href="http://www.codinghorror.com/blog/archives/001119.html"&gt;incredibly useful PHP code out there&lt;/a&gt;. So it seems to me that the ability to monkeypatch doesn't stop people from producing a huge volume of useful code, even in a kind of.. horrible language. Some of it is even good!
&lt;/p&gt;&lt;p&gt;
While I acknowledge the power and utility of dynamic language monkeypatching, I know enough about programmers -- myself &lt;i&gt;absolutely&lt;/i&gt; included -- to know the vast majority of us have absolutely no business whatsoever re-designing a programming language. There's a reason some of the &lt;a href="http://en.wikipedia.org/wiki/Anders_Hejlsberg"&gt;most&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/John_McCarthy_%28computer_scientist%29"&gt;deeply&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Dennis_Ritchie"&gt;respected&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Guido_van_Rossum"&gt;computer&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Niklaus_Wirth"&gt;scientists&lt;/a&gt; in the world end up as language designers.
&lt;/p&gt;&lt;p&gt;
Perhaps then, given the risks, &lt;b&gt;monkeypatching should mean reaching for the meta-hammer as infrequently as humanly possible&lt;/b&gt;. This is a position that Avdi himself espouses &lt;a href="http://weblog.raganwald.com/2008/02/1100inject.html#8589089242300871488"&gt;in a followup comment&lt;/a&gt;:
&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;blockquote&gt;
I'm afraid a lot of people have missed the actual meat of my argument -- that dynamic extension of classes is currently overused in Ruby, in ways that are:
&lt;p&gt;
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Needless - another technique (such as a mixin, or locally extending individual objects) would have worked as well or better.
&lt;/li&gt;&lt;li&gt;Overcomplicated - the use of a monkey patch actually created more work for the author.
&lt;/li&gt;&lt;li&gt;Fragile - the solution is tightly bound to third-party internals, reducing the usefulness of the plugin or gem because it is prone to breakage.
&lt;/li&gt;&lt;li&gt;Excessively wide in scope - by hardcoding extensions to core classes, the author takes the choice to scope the change out of the plugin/gem user's hands, further limiting utility.
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
My point is that there are alternatives - often alternatives which are actually easier to implement and will make your plugin or gem more useful to the user.
&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;
While I enjoy the additive nature of C# extensions, even those are enough to make me a little nervous, as mild as they are. Full-blown dynamic language monkeypatching goes even further; it might even be the ultimate expression of programming power. Is there anything more pure and godlike than &lt;b&gt;programming your own programming language?&lt;/b&gt;
&lt;/p&gt;&lt;p&gt;
But if wielding that power doesn't scare and humble you a little, too, then maybe you should leave the monkeypatching to the &lt;a href="http://www.paulgraham.com/langdes.html"&gt;really smart monkeys&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
[advertisement] Read the largest case study ever published about lightweight peer code review in &lt;i&gt;&lt;a href="http://smartbearsoftware.com/codecollab-code-review-book.php?howheard=Coding+Horror+Blog+3" rel="nofollow"&gt;Best Kept Secrets of Peer Code Review&lt;/a&gt;&lt;/i&gt;.  Free book, free shipping.
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/nw_xl6o39fo" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://www.codinghorror.com/blog/archives/001151.html</feedburner:origLink></entry><entry><title>Premium *Rock Band 2* Drum Kit Surfaces: &amp;quot;Badass&amp;quot; Is The Word You're Looking (Gizmodo)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/yaY8Nmbo8ik/premium-rock-band-2-drum-kit-surfaces-badass-is-the-word-youre-looking-for" rel="alternate" /><updated>2008-07-13T05:51:15Z</updated><id>http://feeds.gawker.com/~r/gizmodo/full/~3/333296853/premium-rock-band-2-drum-kit-surfaces-badass-is-the-word-youre-looking-for</id><summary type="html">
&lt;blockquote class="notation"&gt;Shared by  Herschell / Special*Dark 

Liana sez:  With a drumkit like THAT... who the hell would even want to touch that old guitar.  lol.&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="http://kotaku.com/assets/images/kotaku/2008/07/iondrums.jpg" /&gt;I play &lt;em&gt;Rock Band&lt;/em&gt; like a champ, and when I'm with my crew I'm usually on drums. I'm a drummer, and I love playing them, and the included drum controller always seemed just fine to me. &lt;a href="http://kotaku.com/234234/link.php"&gt;Kotaku&lt;/a&gt; found this photo of the premium &lt;em&gt;Rock Band 2&lt;/em&gt; kit and I've decided I must have it. &lt;b&gt;UPDATE:&lt;/b&gt; OK, so this kit doesn't ship with &lt;em&gt;Rock Band 2&lt;/em&gt;, it's an $300 optional purchase. [&lt;a href="http://kotaku.com/5024520/first-look-at-rock-band-2s-premium-drum-kit"&gt;Kotaku&lt;/a&gt;]&lt;/p&gt; &lt;p&gt;&lt;img src="http://kotaku.com/assets/images/kotaku/2008/07/iondrums2.jpg" /&gt;&lt;br /&gt; Instead of just four heads, the badass looking kit gives you four heads, hi hat, crash, and ride cymbals. This kit, which will come with &lt;em&gt;Rock Band 2&lt;/em&gt; certainly beats the &lt;em&gt;Guitar Hero: World Tour&lt;/em&gt; offering, but it also signals something unusual: the start of a music games arms war. I hope they bring it hard.&lt;/p&gt; &lt;br /&gt;
&lt;img alt="" src="http://www.pheedo.com/img.phdo?i=52fc77263140c79cb9fbb8d893096dd6" border="0" height="1" width="1" /&gt;
&lt;img src="http://www.pheedo.com/feeds/tracker.php?i=52fc77263140c79cb9fbb8d893096dd6" alt="" border="0" height="1" width="1" /&gt;
&lt;p&gt;&lt;a href="http://feeds.gawker.com/%7Ea/gizmodo/full?a=3B8toV"&gt;&lt;img src="http://feeds.gawker.com/%7Ea/gizmodo/full?i=3B8toV" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div&gt;
&lt;a href="http://feeds.gawker.com/%7Ef/gizmodo/full?a=N281gJ"&gt;&lt;img src="http://feeds.gawker.com/%7Ef/gizmodo/full?i=N281gJ" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.gawker.com/%7Ef/gizmodo/full?a=TLFKyJ"&gt;&lt;img src="http://feeds.gawker.com/%7Ef/gizmodo/full?i=TLFKyJ" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.gawker.com/%7Ef/gizmodo/full?a=e5FO2j"&gt;&lt;img src="http://feeds.gawker.com/%7Ef/gizmodo/full?i=e5FO2j" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.gawker.com/%7Ef/gizmodo/full?a=79Ya9j"&gt;&lt;img src="http://feeds.gawker.com/%7Ef/gizmodo/full?i=79Ya9j" border="0" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.gawker.com/%7Er/gizmodo/full/%7E4/333296853" height="1" width="1" /&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/yaY8Nmbo8ik" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://feeds.gawker.com/%7Er/gizmodo/full/%7E3/333296853/premium-rock-band-2-drum-kit-surfaces-badass-is-the-word-youre-looking-for</feedburner:origLink></entry><entry><title>Protocol buffers: the early reviews are in (dive into mark)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/LpQwQXVlCqQ/protobuf" rel="alternate" /><updated>2008-07-13T04:19:40Z</updated><id>http://diveintomark.org/archives/2008/07/12/protobuf</id><summary type="html">
&lt;p&gt;Google (my current employer) has finally &lt;a href="http://google-opensource.blogspot.com/2008/07/protocol-buffers-googles-data.html"&gt;open sourced protocol buffers&lt;/a&gt;, the data interchange format we use for internal server-to-server communication.  The blogosphere&amp;#8217;s response?  &amp;#8220;&lt;a href="http://www.oreillynet.com/xml/blog/2008/07/google_hates_xml.html?CMP=OTC-TY3388567169&amp;amp;ATT=Google+hates+XML"&gt;No wireless&lt;/a&gt;.  &lt;a href="http://blogs.tedneward.com/CommentView,guid,98ba2332-0f84-4697-b165-87ee357309cb.aspx"&gt;Less space than a Nomad&lt;/a&gt;.  &lt;a href="http://steve.vinoski.net/blog/2008/07/11/protocol-buffers-no-big-deal/"&gt;Lame&lt;/a&gt;.&amp;#8221;&lt;/p&gt;

&lt;p&gt;Aaaaanyway&amp;#8230;&lt;/p&gt;

&lt;p&gt;Protocol buffers are &amp;#8220;&lt;a href="http://c2.com/cgi/wiki?JustIsaDangerousWord"&gt;just&lt;/a&gt;&amp;#8221; cross-platform data structures.  &lt;a href="http://www.coriolinus.net/2008/07/08/protocol-buffers/"&gt;All you have to write is the schema&lt;/a&gt; (a &lt;code&gt;.proto&lt;/code&gt; file), then generate bindings in &lt;a href="http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html"&gt;C++&lt;/a&gt;, &lt;a href="http://code.google.com/apis/protocolbuffers/docs/javatutorial.html"&gt;Java&lt;/a&gt;, or &lt;a href="http://code.google.com/apis/protocolbuffers/docs/pythontutorial.html"&gt;Python&lt;/a&gt;.  (Or &lt;a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/protocol-buffers-0.0.5"&gt;Haskell&lt;/a&gt;.  Or &lt;a href="http://groups.google.com/group/protobuf-perl"&gt;Perl&lt;/a&gt;.)  The &lt;code&gt;.proto&lt;/code&gt; file is &lt;a href="http://www.betanews.com/article/Google_releases_its_data_encoding_format_to_compete_with_XML/1215530589"&gt;just a schema&lt;/a&gt;; it doesn&amp;#8217;t contain any data except default values.  All getting and setting is done in code.  The serialized over-the-wire format is designed to minimize network traffic, and deserialization (especially in C++) is designed to maximize performance.  I can&amp;#8217;t begin to describe how much effort Google spends maximizing performance at every level.  We would tear down our data centers and rewire them with &lt;a href="http://news.cnet.com/8301-17938_105-9967991-1.html"&gt;$500 ethernet cables&lt;/a&gt; if you could prove that it would reduce latency by 1%.&lt;/p&gt;

&lt;p&gt;Besides being blindingly fast, protocol buffers have lots of neat features.  &lt;a href="http://scottkirkwood.blogspot.com/2008/07/google-opensources-protocol-buffers.html"&gt;A zero-size &lt;acronym&gt;PB&lt;/acronym&gt; returns default values&lt;/a&gt;.  &lt;a href="http://zunger.livejournal.com/164024.html"&gt;You can nest &lt;acronym&gt;PB&lt;/acronym&gt;s inside each other&lt;/a&gt;.  And most importantly, &lt;acronym&gt;PB&lt;/acronym&gt;s are &lt;a href="http://news.ycombinator.com/item?id=239445"&gt;both backward and forward compatible&lt;/a&gt;, which means you can &lt;a href="http://www.mattcutts.com/blog/google-releases-protocol-buffers/"&gt;upgrade servers gradually&lt;/a&gt; and they can still talk to each other in the interim.  (When you have as many machines as Google has, it&amp;#8217;s always the interim somewhere.)&lt;/p&gt;

&lt;p&gt;Comparisons to other data formats was, I suppose, inevitable.  &lt;a href="http://www.thenewsbeforethenews.com/2008/07/10/everything-old-is-new-again/"&gt;Old-timers may remember &lt;acronym&gt;ASN.1&lt;/acronym&gt;&lt;/a&gt; or &lt;a href="http://tech.slashdot.org/tech/08/07/08/201245.shtml"&gt;&lt;acronym&gt;IIOP&lt;/acronym&gt;&lt;/a&gt;.  Kids these days seem to &lt;a href="http://www.webmasterworld.com/xml/3693285.htm"&gt;compare everything to &lt;acronym&gt;XML&lt;/acronym&gt;&lt;/a&gt; or &lt;a href="http://www.freshblurbs.com/google-protocol-buffers-good-bad-and-ugly"&gt;&lt;acronym&gt;JSON&lt;/acronym&gt;&lt;/a&gt;.  They&amp;#8217;re actually closer to Facebook&amp;#8217;s &lt;a href="http://stuartsierra.com/2008/07/10/thrift-vs-protocol-buffers"&gt;Thrift&lt;/a&gt; (&lt;a href="http://news.ycombinator.com/item?id=239276"&gt;written by ex-Googlers&lt;/a&gt;) or &lt;a href="http://www.25hoursaday.com/weblog/CommentView.aspx?guid=898f56ef-0439-4100-90da-08701be03c13"&gt;SQL Server&amp;#8217;s &lt;acronym&gt;TDS&lt;/acronym&gt;&lt;/a&gt;.  Protocol buffers won&amp;#8217;t &lt;a href="http://zimboe.wordpress.com/2008/07/10/farewell-xml/"&gt;kill &lt;acronym&gt;XML&lt;/acronym&gt;&lt;/a&gt; (no matter how much &lt;a href="http://www.sharms.org/blog/?p=168"&gt;you wish they would&lt;/a&gt;), nor will they replace &lt;acronym&gt;JSON&lt;/acronym&gt;, &lt;acronym&gt;ASN.1&lt;/acronym&gt;, or &lt;a title="the world's first and only implementation of RFC 1149" href="http://www.blug.linux.no/rfc1149/"&gt;carrier pigeon&lt;/a&gt;.  But they&amp;#8217;re simple and they&amp;#8217;re fast and &lt;a href="http://www.webmonkey.com/blog/Google_s_Open_Source_Protocol_Buffers_Offer_Scalability__Speed"&gt;they scale like crazy&lt;/a&gt;, and that&amp;#8217;s the way Google likes it.&lt;/p&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/LpQwQXVlCqQ" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://diveintomark.org/archives/2008/07/12/protobuf</feedburner:origLink></entry><entry><title>Zooey Deschanel Web Gallery: Click image to close this window (FFFFOUND! / EVERYONE)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/GXV3LPYXrEM/089a4b3ef8e2abbadb6ece30e443831487cc533f" rel="alternate" /><updated>2008-07-13T01:02:34Z</updated><id>http://ffffound.com/image/089a4b3ef8e2abbadb6ece30e443831487cc533f</id><summary type="html">
&lt;p&gt;&lt;a href="http://ffffound.com/image/089a4b3ef8e2abbadb6ece30e443831487cc533f"&gt;&lt;img src="http://img.ffffound.com/static-data/assets/6/089a4b3ef8e2abbadb6ece30e443831487cc533f_m.jpg" alt="4ie85eb.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;via &lt;a href="http://zooey-deschanel.us/gallery/displayimage.php?pid=7528&amp;amp;fullsize=1"&gt;http://zooey-deschanel.us/gallery/displayimage.php?pid=7528&amp;amp;fullsize=1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/GXV3LPYXrEM" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://ffffound.com/image/089a4b3ef8e2abbadb6ece30e443831487cc533f</feedburner:origLink></entry><entry><title>ignore the code&amp;#160;&amp;#187;&amp;#160;iPhone, third-party applications and Settings.app (ignorethecode.net)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/Svt3_PftEi0/" rel="alternate" /><updated>2008-07-13T00:15:58Z</updated><id>http://ignorethecode.net/blog/2008/07/12/iphone-third-party-settings/</id><summary type="html">
&lt;p&gt;Apple should either update Settings.app to support the features developers need, or change its HIG, telling devs not to put settings into Settings.app, but to keep them in their applications.&lt;/p&gt;&lt;p&gt;If Apple decides to update Settings.app, applications should turn preferences which users want to change regularly - such as whether the user sees completed items or just available actions - into &amp;#8220;regular&amp;#8221; application features accessible outside the application&amp;#8217;s preferences.&lt;/p&gt;&lt;p&gt;Either way, the current situation is confusing, as it is never clear where a particular application&amp;#8217;s settings can be found.&lt;/p&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/Svt3_PftEi0" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://ignorethecode.net/blog/2008/07/12/iphone-third-party-settings/</feedburner:origLink></entry><entry><title>Thrift vs. Protocol Buffers - Digital Digressions by Stuart Sierra (stuartsierra.com)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/Z4MGG4vLwHI/thrift-vs-protocol-buffers" rel="alternate" /><updated>2008-07-13T00:00:19Z</updated><id>http://stuartsierra.com/2008/07/10/thrift-vs-protocol-buffers</id><summary type="html">
&lt;p&gt;Overall, I think Thrift wins on features and Protocol Buffers win on&lt;br /&gt;documentation.  Implementation-wise, they&amp;#8217;re quite similar.  Both use&lt;br /&gt;integer tags to identify fields, so you can add and remove fields&lt;br /&gt;without breaking existing code.  Protocol Buffers support&lt;br /&gt;variable-width encoding of integers, which saves a few bytes.  (Thrift&lt;br /&gt;has an experimental output format with variable-width ints.)&lt;/p&gt;&lt;p&gt;The major difference is that Thrift provides a full client/server RPC&lt;br /&gt;implementation, whereas Protocol Buffers only generate stubs to use in&lt;br /&gt;your own RPC system.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Update July 12, 2008:&lt;/strong&gt; I haven&amp;#8217;t tested for speed, but from a cursory examination it seems that, at the binary level, Thrift and Protocol Buffers are very similar.  I think Thrift will develop a more coherent community now that it&amp;#8217;s under Apache incubation.  It just moved to a new &lt;a href="http://incubator.apache.org/thrift/"&gt;web site&lt;/a&gt; and &lt;a href="http://incubator.apache.org/thrift/mailing_lists.html"&gt;mailing list&lt;/a&gt;, and the &lt;a href="http://issues.apache.org/jira/browse/THRIFT"&gt;issue tracker&lt;/a&gt; is active.&lt;/p&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/Z4MGG4vLwHI" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://stuartsierra.com/2008/07/10/thrift-vs-protocol-buffers</feedburner:origLink></entry><entry><title>Friendfeed view source (Bill de hOra)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/d2VONuRrrjg/" rel="alternate" /><updated>2008-07-12T22:30:05Z</updated><id>http://www.dehora.net/journal/2008/07/12/friendfeed-view-source/</id><summary type="html">
&lt;p&gt;&lt;a href="http://friendfeed.com/"&gt;Friendfeed&lt;/a&gt; - nice service. I pulled this Atom Entry out of &lt;a href="http://friendfeed.com/dehora"&gt;my Friendfeed&lt;/a&gt; &lt;a href="http://friendfeed.com/dehora?format=atom"&gt;feed&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&amp;lt;entry&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;title type=&amp;quot;text&amp;quot;&amp;gt;Free as in electricity (via Blog)&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;updated&amp;gt;2008-07-12T15:33:12Z&amp;lt;/updated&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;published&amp;gt;2008-07-12T15:33:12Z&amp;lt;/published&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;id&amp;gt;tag:friendfeed.com,2007:1d0c3524-1c88-d01e-5864-21953bef1ca1&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;link href=&amp;quot;http://www.dehora.net/journal/2008/07/12/free-as-in-electricity/&amp;quot; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; rel=&amp;quot;alternate&amp;quot; type=&amp;quot;text/html&amp;quot;/&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;content type=&amp;quot;xhtml&amp;quot; xml:base=&amp;quot;http://friendfeed.com/&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;div xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; style=&amp;quot;font-size:10pt;font-family:Arial,sans-serif;color:#222222&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ...&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/content&amp;gt;&lt;br /&gt;&amp;lt;/entry&amp;gt;&lt;/p&gt;
&lt;p&gt;Here's the original Entry from &lt;a href="http://www.dehora.net/journal/atom.xml"&gt;my feed&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&amp;lt;entry&amp;gt;&lt;br /&gt;&amp;#160; &amp;lt;id&amp;gt;http://id.dehora.net/entry/2008/07/12/ea18ed947f5ba3e06ff02528f7e6b150&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;#160; &amp;lt;title&amp;gt;Free as in electricity&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;#160; &amp;lt;updated&amp;gt;2008-07-12T15:59:34Z&amp;lt;/updated&amp;gt;&lt;br /&gt;&amp;#160; &amp;lt;author&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;name&amp;gt;Bill de h&amp;#211;ra&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160; &amp;lt;/author&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160; &amp;lt;link href=&amp;quot;http://www.dehora.net/journal/2008/07/12/free-as-in-electricity/&amp;quot; rel=&amp;quot;alternate&amp;quot;&amp;gt;&amp;lt;/link&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160; &amp;lt;content type=&amp;quot;html&amp;quot;&amp;gt;&amp;amp;lt;p&amp;amp;gt; ... &amp;amp;lt;/p&amp;amp;gt; &amp;lt;/content&amp;gt;&lt;br /&gt;&amp;lt;/entry&amp;gt;&lt;/p&gt;
&lt;p&gt;Some observations:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;The Friendfeed updated value happened a few minutes before mine did. It doesn't seem to be a multiple of anything, so let's assume it's a clock skew. What's interesting there is that Friendfeed's Entry could show up after mine in an aggregated feed.&lt;/li&gt;&lt;li&gt;The Friendfeed Entry doesn't have an author element. The enclosing feed did have one, and the author is "Friendfeed", which means the author of that Entry is "Friendfeed", not me. I guess that makes sense. Or maybe it doesn't.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Friendfeed added their own id. It's a Tag URI that has a uuid embedded. This makes me think their backend is decentralised or at least has the potential to be. The date part of the tag appears to be hardcoded to 2007.&lt;/li&gt;&lt;li&gt;Friendfeed munged the original title with a suffix. They added a type of text/html as well. I wonder if that was derived or assumed. And I wonder what would happen if the source type was set to say, xhtml. In any case what's nice about my use of Atom here is that Atom Text constructs have well-defined escaping rules - unlike RSS2.0, there's no need to second guess the upstream provider (unless it's borken).&lt;/li&gt;&lt;li&gt;&amp;#160;Friendfeed have copied the link@rel=alternate across. They've added a type of text/html. Again I wonder if that was derived or assumed. It would be interesting to have a JSON alternate.&lt;/li&gt;&lt;li&gt;Friendfeed have written out their own content. That's fine; what's notable is not providing a summary of the original. Or maybe that's because I don't server summaries, just full content.&lt;/li&gt;&lt;li&gt;Friendfeed use xml:base. It would be interesting to see if what would happen if relative URLs were in the source title, which seems to have been copied into their content.&lt;/li&gt;&lt;li&gt;Friendfeed are not proxying or rewriting upstream links. A naive system would do something like that for tracking reasons, and eventually melt down under load. The only interesting redirect walling they perform is to route the "link to this entry option" on the site back to their &lt;a href="http://friendfeed.com/e/1d0c3524-1c88-d01e-5864-21953bef1ca1/Free-as-in-electricity/"&gt;permalink&lt;/a&gt; and not &lt;a href="http://www.dehora.net/journal/2008/07/12/free-as-in-electricity/"&gt;mine&lt;/a&gt;. The slug for the permalink is the same as the uuid in the tag URI.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;But for a syndication wonk, by far the most interesting thing is that Friendfeed aren't using the &lt;a href="http://tools.ietf.org/html/rfc4287#section-4.2.11"&gt;Atom source element&lt;/a&gt;. The feed could have looked like this:&lt;br /&gt;&lt;br /&gt;&amp;lt;entry&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;title type=&amp;quot;text&amp;quot;&amp;gt;Free as in electricity (via Blog)&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;updated&amp;gt;2008-07-12T15:33:12Z&amp;lt;/updated&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;published&amp;gt;2008-07-12T15:33:12Z&amp;lt;/published&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;id&amp;gt;tag:friendfeed.com,2007:1d0c3524-1c88-d01e-5864-21953bef1ca1&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;link href=&amp;quot;http://www.dehora.net/journal/2008/07/12/free-as-in-electricity/&amp;quot; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; rel=&amp;quot;alternate&amp;quot; type=&amp;quot;text/html&amp;quot;/&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;content type=&amp;quot;xhtml&amp;quot; xml:base=&amp;quot;http://friendfeed.com/&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;div xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; style=&amp;quot;font-size:10pt;font-family:Arial,sans-serif;color:#222222&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ...&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/content&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;source&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160;&amp;#160; &amp;lt;id&amp;gt;http://id.dehora.net/entry/2008/07/12/ea18ed947f5ba3e06ff02528f7e6b150&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;updated&amp;gt;2008-07-12T15:59:34Z&amp;lt;/updated&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160;&amp;#160; &amp;#160; &amp;lt;link href=&amp;quot;http://www.dehora.net/journal/2008/07/12/free-as-in-electricity/&amp;quot; rel=&amp;quot;alternate&amp;quot; /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/source&amp;gt;&lt;br /&gt;&amp;lt;/entry&amp;gt;&lt;br /&gt;&lt;br /&gt;Not many people seem to use Atom source. It can contain the whole original entry, but the most useful parts to pass along are the id and the updated elements. Why? Well, aggregators and clients can immediately pick those out, tell you if &lt;a href="http://www.youtube.com/watch?v=9PoGqGusvQo"&gt;you've smelt what the Friendfeed is cooking&lt;/a&gt; and mark it as read. In this particular case the fact that Friendfeed's outer updated date is ahead of the source might confuse some code, depending on the implementation logic. Possibly they should consider treating updated as an offset to the original Entry timestamp. It might not be precise relative to a particular server/system but globally it will be more accurate and the &lt;a href="http://en.wikipedia.org/wiki/Lamport_timestamps"&gt;partial ordering would be preserved&lt;/a&gt;. You could also put the source author in there as well ;)&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/d2VONuRrrjg" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://www.dehora.net/journal/2008/07/12/friendfeed-view-source/</feedburner:origLink></entry><entry><title>django-app-plugins - Google Code (code.google.com)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/ks0LG1V3Ooc/" rel="alternate" /><updated>2008-07-12T17:16:08Z</updated><id>http://code.google.com/p/django-app-plugins/</id><summary type="html">
&lt;p&gt;Allow 3rd party apps to dynamically insert template inclusions into your apps at pre-defined plugin points. Similar to how Eclipse manages plugins via contributors. &lt;/p&gt;&lt;p&gt;You could think of this as the reverse of the {% block %} or {% include %} tags. &lt;/p&gt;&lt;p&gt;templates/myapp/foo.html: {% load app_plugins %} {% plugin_point "foo" %} &lt;/p&gt;&lt;p&gt;templates/otherapp/plugins/foo.html: Anything you want... &lt;/p&gt;&lt;p&gt;templates/thirdapp/plugins/foo.html: yet another plugin... &lt;/p&gt;&lt;p&gt;foo.html is rendered as: Anything you want... yet another plugin...&lt;/p&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/ks0LG1V3Ooc" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://code.google.com/p/django-app-plugins/</feedburner:origLink></entry><entry><title>django-timezones - Google Code (code.google.com)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/kgViyiTvmvc/" rel="alternate" /><updated>2008-07-12T17:15:56Z</updated><id>http://code.google.com/p/django-timezones/</id><summary type="html">
&lt;div&gt;&lt;p&gt;A Django reusable app to deal with timezone localization for users. &lt;/p&gt; &lt;/div&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/kgViyiTvmvc" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://code.google.com/p/django-timezones/</feedburner:origLink></entry><entry><title>django-email-confirmation - Google Code (code.google.com)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/44ljTKQ-lrw/" rel="alternate" /><updated>2008-07-12T17:15:45Z</updated><id>http://code.google.com/p/django-email-confirmation/</id><summary type="html">
&lt;h1&gt;&lt;a&gt;django-email-confirmation&lt;/a&gt;&lt;/h1&gt;&lt;a&gt;&lt;p&gt;This simple app is for cases where you don't want to require an email address to signup on your website but you do still want to ask for an email address and be able to confirm it for use in optional parts of your website.&lt;/p&gt;&lt;/a&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/44ljTKQ-lrw" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://code.google.com/p/django-email-confirmation/</feedburner:origLink></entry><entry><title>django-mailer - Google Code (code.google.com)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/1UKH1rPut1g/" rel="alternate" /><updated>2008-07-12T17:15:34Z</updated><id>http://code.google.com/p/django-mailer/</id><summary type="html">
&lt;h1&gt;&lt;a&gt;django-mailer&lt;/a&gt;&lt;/h1&gt;&lt;a&gt;&lt;p&gt;A reusable Django app for queuing and throttling of email sending, scheduled sending, consolidation of multiple notifications into single emails and logging of mail failures.&lt;/p&gt;&lt;/a&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/1UKH1rPut1g" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://code.google.com/p/django-mailer/</feedburner:origLink></entry><entry><title>django-robots - Google Code (code.google.com)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/ZMjaKzSndMo/" rel="alternate" /><updated>2008-07-12T17:14:43Z</updated><id>http://code.google.com/p/django-robots/</id><summary type="html">
&lt;p&gt;&lt;/p&gt;&lt;p&gt;The robots exclusion application consists of two database models which are tied together with a m2m relationship: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Rules &lt;/li&gt;&lt;li&gt;URLs&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/ZMjaKzSndMo" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://code.google.com/p/django-robots/</feedburner:origLink></entry><entry><title>Cloud27 - A Social Network (Empty Thoughts - Home)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/TjWn6wx-3Kc/cloud27-a-social-network" rel="alternate" /><updated>2008-07-12T16:26:47Z</updated><id>http://blog.michaeltrier.com/2008/7/12/cloud27-a-social-network</id><summary type="html">
&lt;p&gt;This morning I got my first glimpse of what will become &lt;a href="http://cloud27.com/"&gt;Cloud27&lt;/a&gt;, featuring a sporty design by &lt;a href="http://www.20seven.org/"&gt;Greg Newman&lt;/a&gt;, and I already like what I see. Cloud27 is a new social network based on &lt;a href="http://pinax.hotcluboffrance.com/"&gt;Pinax&lt;/a&gt;, a Django reference application for reusable applications.&lt;/p&gt;


	&lt;p&gt;So if there&amp;#8217;s Pinax, why Cloud27?  Well Pinax is where all development and new ideas happen.  Pinax is project intended to provide a starting point for websites.  Cloud27 will actually be focussed on building out on the base of Pinax and expanding it into a kick-ass social network application.&lt;/p&gt;


	&lt;p&gt;To find out a whole lot more about reusable applications and Pinax, I highly recommend a listen to &lt;a href="http://blog.michaeltrier.com/2008/6/2/this-week-in-django-24-2008-06-01"&gt;This Week in Django 24&lt;/a&gt;, featuring Pinax / Cloud27 founder &lt;a href="http://jtauber.com/"&gt;James Tauber&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;ll be keeping an eye on Cloud27.&lt;/p&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/TjWn6wx-3Kc" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://blog.michaeltrier.com/2008/7/12/cloud27-a-social-network</feedburner:origLink></entry><entry><title>Two New Great Books (Empty Thoughts - Home)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/BmU-PB42a9w/two-new-great-books" rel="alternate" /><updated>2008-07-12T16:06:33Z</updated><id>http://blog.michaeltrier.com/2008/7/12/two-new-great-books</id><summary type="html">
&lt;div&gt;&lt;img src="http://blog.michaeltrier.com/assets/2008/7/12/sqlalchemy.jpg" height="120" width="120" /&gt;&lt;/div&gt;&lt;div&gt;
There seems to be a plethora of Python related books coming out these days.  I just stumbled across two interesting ones.  First up is &lt;a href="http://www.amazon.com/Essential-SQLAlchemy-Rick-Copeland/dp/0596516142"&gt;Essential SQLAlchemy&lt;/a&gt;.  I desperately want this book but I&amp;#8217;m tired of paper books.  It&amp;#8217;s available on Safari Online, but I don&amp;#8217;t have that.  I&amp;#8217;d really like to see a Kindle version.  I&amp;#8217;ll probably end up buying the paper, because it looks to be very exciting.
&lt;/div&gt;

&lt;div&gt;
&lt;img src="http://blog.michaeltrier.com/assets/2008/7/12/pylons.jpg" height="120" width="120" /&gt;&lt;/div&gt;
&lt;div&gt;
Secondly is &lt;a href="http://www.amazon.com/Definitive-Guide-Pylons/dp/1590599349"&gt;The Definitive Guide to Pylons&lt;/a&gt;.  This book is offered as a &lt;a href="http://pylonsbook.com/"&gt;free beta book&lt;/a&gt;, but will also be available for purchase through Apress.  I&amp;#8217;ve skimmed the contents but plan to spend some time with it in the coming week.  I&amp;#8217;m really interested in the Deployment chapter, so I&amp;#8217;ll probably start there first.  
&lt;/div&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/BmU-PB42a9w" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://blog.michaeltrier.com/2008/7/12/two-new-great-books</feedburner:origLink></entry><entry><title>Say it ain&amp;#8217;t so, Mike! (BuzzMachine)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/XICS-y0zCxY/" rel="alternate" /><updated>2008-07-12T15:42:30Z</updated><id>http://www.buzzmachine.com/2008/07/12/say-it-aint-so-mike/</id><summary type="html">
&lt;blockquote class="notation"&gt;&lt;strong&gt;Clint:&lt;/strong&gt;

Ha ha ha ha ha&lt;/blockquote&gt;
&lt;p&gt;Kara &lt;a href="http://kara.allthingsd.com/20080711/paidcontents-rafat-ali-speaks-so-heres-whos-next/"&gt;Swisher says&lt;/a&gt; that Techcrunch and AOL are in acquisition talks. Oh, no. AOL is where things go to die.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/buzzmachine?a=c6QFsP"&gt;&lt;img src="http://feeds.feedburner.com/~a/buzzmachine?i=c6QFsP" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/XICS-y0zCxY" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://www.buzzmachine.com/2008/07/12/say-it-aint-so-mike/</feedburner:origLink></entry><entry><title>Dave Johnson: My personal iPhone3G debacle (Ryan Irelan)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/q8fiWNkDyik/" rel="alternate" /><updated>2008-07-12T15:41:40Z</updated><id>http://feeds.feedburner.com/~r/irelan-becoming/~3/333536728/</id><summary type="html">
&lt;blockquote class="notation"&gt;&lt;strong&gt;Clint:&lt;/strong&gt;

They just swiped our CC, threw the iPhones in a bag and told us to activate them ourselves at home&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://rollerweblogger.org/roller/entry/my_personal_iphone3g_debacle"&gt;Dave Johnson: My personal iPhone3G debacle&lt;/a&gt; - &amp;#8220;2:55PM Cheers erupt as the customer who was 1st in line at 8AM finally gets activated.&amp;#8221; Wow.
&lt;/p&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~f/irelan-becoming?a=hGiMbJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/irelan-becoming?i=hGiMbJ" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/irelan-becoming?a=vClPCJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/irelan-becoming?i=vClPCJ" border="0" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/irelan-becoming/~4/333536728" height="1" width="1" /&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/q8fiWNkDyik" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://feeds.feedburner.com/%7Er/irelan-becoming/%7E3/333536728/</feedburner:origLink></entry><entry><title>Caught up in the iPhone 3G fever (sbdc)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/ugSnAOKojQo/" rel="alternate" /><updated>2008-07-12T14:35:33Z</updated><id>http://blog.seanbonner.com/2008/07/12/caught-up-in-the-iphone-3g-fever/</id><summary type="html">
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/ugSnAOKojQo" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://blog.seanbonner.com/2008/07/12/caught-up-in-the-iphone-3g-fever/</feedburner:origLink></entry><entry><title>iPhone Settings (Michael Tsai's Weblog)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/ghbm4liBCrU/" rel="alternate" /><updated>2008-07-12T14:05:12Z</updated><id>http://mjtsai.com/blog/2008/07/12/iphone-settings/</id><summary type="html">
&lt;p&gt;&lt;a href="http://blog.omnigroup.com/2008/07/10/omnifocus-for-iphone-arrives/#comment-64962"&gt;Ken Case&lt;/a&gt; (via &lt;a href="http://ignorethecode.net/blog/2008/07/12/iphone-third-party-settings/"&gt;Lukas Mathis&lt;/a&gt;):&lt;/p&gt;
&lt;blockquote class="notation"&gt;&lt;p&gt;Settings which appear in the built-in Settings application can&amp;#8217;t have any code associated with them, they can only use standard controls which store data in a few limited data types. We wanted to provide the ability to copy synchronization settings from a Mac on your local Wi-Fi network, which involves code&amp;#8212;making it impossible to put our settings in the global Settings application.&lt;/p&gt;
&lt;p&gt;The above point makes this moot, obviously, but in general another important factor to consider is whether the user might change a setting more than once or whether it&amp;#8217;s really just a one-time configuration. If you&amp;#8217;re talking about something like Mail settings, it&amp;#8217;s pretty much fire and forget&amp;#8212;but in OmniFocus&amp;#8217; case, the user might want to quickly switch between looking at all their completed items and then switch back to looking at just their available actions, and they wouldn&amp;#8217;t want to have to relaunch OmniFocus each time they did this.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;It&amp;#8217;s not clear to me why Apple wants applications to use Settings, except that it reduces the need for a button in the application. It&amp;#8217;s a pain to have to quit an application to change a setting, and it&amp;#8217;s not always clear what&amp;#8217;s a setting and what&amp;#8217;s application data. I&amp;#8217;ve only changed the locations in the Weather application maybe half a dozen times in the past year, yet I&amp;#8217;m happy with them being in the application rather than in Settings.&lt;/p&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/ghbm4liBCrU" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://mjtsai.com/blog/2008/07/12/iphone-settings/</feedburner:origLink></entry><entry><title>Worst Fears Ease, for Now, on Mortgage Giants&amp;#8217; Fate -... (kung fu grippe)</title><link href="http://feedproxy.google.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~3/nj8xkO0EayU/41998407" rel="alternate" /><updated>2008-07-12T14:00:00Z</updated><id>http://www.kungfugrippe.com/post/41998407</id><summary type="html">
&lt;img src="http://media.tumblr.com/34GrgyzUsbbu51dzXG9p3Kle_500.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.nytimes.com/2008/07/12/business/12fannie.html?hp"&gt;&lt;strong&gt;Worst Fears Ease, for Now, on Mortgage Giants&amp;#8217; Fate - NYTimes.com&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you aren&amp;#8217;t worried about how dangerously fucked the economy and infrastructure of this country are, you&amp;#8217;re either not paying attention or you already have a plan for offing yourself.&lt;/p&gt;
&lt;p&gt;Shared from Google Reader&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/OfficiallyLuckyLinkBlogFeedByClintEcker/~4/nj8xkO0EayU" height="1" width="1"/&gt;</summary><category term="Google Reader" /><feedburner:origLink>http://www.kungfugrippe.com/post/41998407</feedburner:origLink></entry></feed>
