<?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/"
	xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
>

<channel>
	<title>willnorris.com &#187; Will Norris</title>
	<atom:link href="http://willnorris.com/author/willnorris/feed" rel="self" type="application/rss+xml" />
	<link>http://willnorris.com</link>
	<description>there&#039;s more to life than this</description>
	<lastBuildDate>Tue, 15 May 2012 21:57:32 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4-beta3-20574</generator>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license>
		<item>
		<title>Google+ Profile Link Chrome Extension</title>
		<link>http://willnorris.com/2012/02/google-profile-link-chrome-extension</link>
		<comments>http://willnorris.com/2012/02/google-profile-link-chrome-extension#comments</comments>
		<pubDate>Sun, 05 Feb 2012 04:41:21 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=958</guid>
		<description><![CDATA[One of the goals I set for myself this quarter was to get more familiar with the various development platforms that we support at Google. I use a number of Chrome extensions on a regular basis, and I&#8217;ve built a simple &#8220;Hello World&#8221; style extension before, but never anything that was all that useful. So [...]]]></description>
			<content:encoded><![CDATA[<p>One of the goals I set for myself this quarter was to get more familiar with the various development platforms that we support at Google.  I use a number of Chrome extensions on a regular basis, and I&#8217;ve built a simple &#8220;Hello World&#8221; style extension before, but never anything that was all that useful.  So over the last few weekends I built a simple extension called <a href="https://chrome.google.com/webstore/detail/godamdbajiipofehfhedfbebdflpdemn">+Profile Link</a> that tries to detect and identify the Google+ profile for the page you&#8217;re currently viewing.</p>

<p>The extension is itself is pretty straightforward and tries to address a problem I&#8217;ve run into quite a few times.  I&#8217;ll come across an interesting blogger or website via Hacker News or wherever, and want to add them to my circles on Google+.  But first I actually have to <em>find</em> them on Google+.  If I&#8217;m lucky, they have a visible link or Google+ badge somewhere on the site and I can just that.  But some sites (like my own, currently) have only a non-visible link to the associated Google+ profile.  This non-visible link is really all Google needs to power <a href="http://support.google.com/webmasters/bin/answer.py?hl=en&amp;answer=1408986">author information in search results</a> or <a href="http://support.google.com/plus/bin/answer.py?hl=en&amp;answer=1711199">direct connect</a>, but doesn&#8217;t do much for visitors to a site.  And even with a visible link or badge, the design of some sites are so cluttered that the link may be difficult to find.</p>

<p><img src="http://willnorris.com/wordpress-content/uploads/2012/02/willnorris.com-profile-link.png" alt="screenshot of profile link on willnorris.com" width="458" height="274" class="aligncenter" /></p>

<p>The +Profile Link extension scans pages as you browse the web looking for links to a Google+ profile.  This can be a visible <code>&lt;a&gt;</code> or non-visible <code>&lt;link&gt;</code> element with a <code>rel</code> value of &#8216;me&#8217;, &#8216;author&#8217;, or &#8216;publisher&#8217;, or a <a href="https://developers.google.com/+/plugins/badge/">Google+ badge</a>.  When it detects a link, a small icon appears in the Chrome address bar.  When clicked, a popup window displays some basic profile data pulled from the public <a href="https://developers.google.com/+/api/">Google+ API</a>, including a link to the full profile where you can add the person to your circles.  I&#8217;ve toyed with adding a <a href="https://developers.google.com/+/plugins/badge/">Google+ badge</a> directly in the popup, but just haven&#8217;t been happy with the way it looks so far&#8230; that should be coming in the future.</p>

<p>But what about sites that don&#8217;t link to their Google+ profile at all?  My goal with this plugin was to try and find the associated Google+ profile with a very high degree of certainty, so there&#8217;s only so much you can do.  One experimental feature I added (which can be activated in the extension&#8217;s options page) is to use the <a href="http://code.google.com/apis/socialgraph/">Social Graph API</a> to find the Google+ profile for a URL.  This actually works pretty well for the very small percentage of people that have <code>rel="me"</code> links setup on their site.  For example, this would allow the address bar icon to be displayed even on a user&#8217;s Twitter profile page as seen here for Tantek.</p>

<p><img src="http://willnorris.com/wordpress-content/uploads/2012/02/twitter.com-profile-link.png" alt="screenshot of profile link on twitter.com" width="458" height="274" class="aligncenter" /></p>

<p>Unfortunately, the Social Graph API was <a href="http://googleblog.blogspot.com/2012/01/renewing-old-resolutions-for-new-year.html">recently deprecated</a> and announced that it will be retired on April 20, 2012.  If I can find an alternative solution by then I&#8217;ll migrate over, otherwise I&#8217;ll likely remove this feature.  It&#8217;s not entirely practical anyway, since it fires off an API lookup for <strong>every</strong> URL you visit.  This has both performance and potential privacy implications, so I&#8217;m not sure that I&#8217;d recommend that people leave it running all the time.  It does provide a nice proof of concept, though.</p>

<p>I&#8217;m sure there are plenty of best practices I didn&#8217;t follow, but I&#8217;m generally pretty happy with how it all turned out.  It demonstrates quite a few of the basic functions of a Chrome extension, including:</p>

<ul>
<li><a href="http://code.google.com/chrome/extensions/background_pages.html">background pages</a></li>
<li><a href="http://code.google.com/chrome/extensions/content_scripts.html">content scripts</a></li>
<li><a href="http://code.google.com/chrome/extensions/pageAction.html">page actions</a> with a popup window</li>
<li>a very simple <a href="http://code.google.com/chrome/extensions/options.html">options page</a></li>
<li>light use of the <a href="http://code.google.com/chrome/extensions/tabs.html">tabs</a> and <a href="http://code.google.com/chrome/extensions/windows.html">windows</a> APIs</li>
<li><a href="http://code.google.com/chrome/extensions/messaging.html">message passing</a> between the content script, popup window, and background page</li>
<li>calling remote APIs like the Google+ and Social Graph APIs.  Here, I actually just used jQuery to do a JSONP request rather than doing a true <a href="http://code.google.com/chrome/extensions/xhr.html">cross-origin XMLHttpRequest</a></li>
<li>unit tests for much of the code using <a href="http://docs.jquery.com/QUnit">QUnit</a></li>
</ul>

<p>The whole extension is released under the Apache 2.0 license, so hopefully it will be a useful example to a few folks.  You can find the extension itself in the <a href="https://chrome.google.com/webstore/detail/godamdbajiipofehfhedfbebdflpdemn">Chrome Web Store</a> and the source code on GitHub at <a href="https://github.com/willnorris/plus-profile-link">willnorris/plus-profile-link</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2012/02/google-profile-link-chrome-extension/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Outsourcing comments to Google+</title>
		<link>http://willnorris.com/2011/09/outsourcing-comments-to-google</link>
		<comments>http://willnorris.com/2011/09/outsourcing-comments-to-google#comments</comments>
		<pubDate>Thu, 15 Sep 2011 21:42:14 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[google-plus]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=929</guid>
		<description><![CDATA[A few weeks ago I quietly (or not so quietly, as it were) disabled comments on my blog. It was something I&#8217;d been considering for a while, and I finally resolved to do it after talking with Shane Becker at IndieWebCamp back in June. Shane takes the stance that his site should be about him [...]]]></description>
			<content:encoded><![CDATA[<p>A few weeks ago I quietly (or <a href="https://twitter.com/andrewwatson/status/101351332602060800">not</a> <a href="https://twitter.com/ChrisSaad/status/101351327149473792">so</a> <a href="https://twitter.com/willnorris/status/101351800992575488">quietly</a>, as it were) disabled comments on my blog.  It was something I&#8217;d been considering for a while, and I finally resolved to do it after talking with <a href="http://iamshane.com/">Shane Becker</a> at <a href="http://indiewebcamp.com/">IndieWebCamp</a> back in June.  Shane takes the stance that his site should be about him and his content.  If you want to comment or respond, you&#8217;re welcome to do so&#8230; just find your own place to publish it (like your own blog, perhaps).</p>

<p>I&#8217;m not interested in building a community or a personal brand, so I really don&#8217;t care about capturing engagement here on my site.  I do value a lot of the comments I get however, so I&#8217;m not looking to cut things off entirely.  Instead, I&#8217;ve decided to outsource my comments to Google+.</p>

<p>Today <a href="http://googleplusplatform.blogspot.com/">we announced</a> the launch of the Google+ API, starting with read access to public data.  Using the new API together with the <a href="http://developers.google.com/+/plugins/+1button/">+1 button</a>, I&#8217;ve added support to my <a href="https://github.com/willnorris/wordpress-snowflake">snowflake</a> to share my posts to Google+, and then to easily direct conversations from my blog to there.  It allows me to keep my own home on the web dedicated to just my content, and at the same time leverage the great community that has formed around Google+.</p>

<p>Please <a href="https://github.com/willnorris/wordpress-snowflake">try it out</a> yourself, and let me know how it works for you.  This was the work of a single evening, so I&#8217;m sure I&#8217;ll enhance it over time.  Please <a href="https://github.com/willnorris/wordpress-snowflake/issues">file any bugs</a> or feature requests you have.</p>

<p><a href="https://github.com/willnorris/wordpress-snowflake">https://github.com/willnorris/wordpress-snowflake</a></p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2011/09/outsourcing-comments-to-google/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Launching the Google+ Platform</title>
		<link>http://willnorris.com/2011/09/launching-the-google-platform</link>
		<comments>http://willnorris.com/2011/09/launching-the-google-platform#comments</comments>
		<pubDate>Thu, 15 Sep 2011 18:31:51 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=932</guid>
		<description><![CDATA[A couple of months ago, I mentioned how excited I was to reveal to family and friends what I&#8217;ve been working on at Google for the last year or so, Google+. Well, that was only partly true. What I&#8217;ve really been working on is the Google+ Platform, which we are finally starting to roll out [...]]]></description>
			<content:encoded><![CDATA[<p><img src="//willnorris.com/wordpress-content/uploads/2011/09/plusplatform.jpeg" alt="Google+ Platform" width="250" height="200" class="alignright" style="float:right" /></p>

<p>A couple of months ago, <a href="http://willnorris.com/2011/06/google-plus">I mentioned</a> how excited I was to reveal to family and friends what I&#8217;ve been working on at Google for the last year or so, <a href="http://www.google.com/+/">Google+</a>.  Well, that was only partly true.  What I&#8217;ve really been working on is the <a href="http://developers.google.com/+/">Google+ Platform</a>, which we are finally starting to roll out today.</p>

<p>In many respects, <a href="http://googleplusplatform.blogspot.com/">today&#8217;s announcement</a> is perhaps more exciting for myself and the team than it will be for some of you.  The surface that we are launching today is small, just three methods focused on reading public data.  That&#8217;s what we&#8217;re starting with.  You won&#8217;t find the ability to post into the stream or +1 a post, or the ability to access a user&#8217;s circles.  But what you <em>will</em> find is a small taste of what we&#8217;ve been working on for a long time.  You&#8217;ll find a clean and simple API that should feel very natural because it follows RESTful designs and uses JSON data formats.  You&#8217;ll find an API that uses industry standards like OAuth 2.0 and that is based on open formats like <a href="http://activitystrea.ms/">Activity Streams</a> and <a href="http://portablecontacts.net/">Portable Contacts</a>.  You&#8217;ll find well-written <a href="http://developers.google.com/+/">documentation</a> with in-line code samples and an in-line API explorer so you can play with every method, all hosted on our new <a href="http://developers.google.com/readme">Google Developers</a> site that will redefine what it means to be Google developer.  You&#8217;ll find an API that is relatively small, but one that is the start of something very, very big.</p>

<p>This is perhaps the most important project I&#8217;ve worked on in my professional life, and I&#8217;m incredibly proud of what we are beginning today.  I&#8217;m excited to see what people will build with the API, and I&#8217;ll be sharing some of my own Google+ projects very soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2011/09/launching-the-google-platform/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Excited to finally be able to talk to family and friends about what I&#8217;ve been working on</title>
		<link>http://willnorris.com/2011/06/google-plus</link>
		<comments>http://willnorris.com/2011/06/google-plus#comments</comments>
		<pubDate>Tue, 28 Jun 2011 19:39:20 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=927</guid>
		<description><![CDATA[Excited to finally be able to talk to family and friends about what I&#8217;ve been working on: http://googleblog.blogspot.com/2011/06/introducing-google-project-real-life.html]]></description>
			<content:encoded><![CDATA[<p>Excited to finally be able to talk to family and friends about what I&#8217;ve been working on: <a href="http://googleblog.blogspot.com/2011/06/introducing-google-project-real-life.html">http://googleblog.blogspot.com/2011/06/introducing-google-project-real-life.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2011/06/google-plus/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Post Once, Syndicate Everywhere #pose #indieweb</title>
		<link>http://willnorris.com/2011/06/post-once-syndicate-everywhere-pose-indieweb</link>
		<comments>http://willnorris.com/2011/06/post-once-syndicate-everywhere-pose-indieweb#comments</comments>
		<pubDate>Mon, 27 Jun 2011 02:20:58 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=925</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2011/06/post-once-syndicate-everywhere-pose-indieweb/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>First Post Using Snowflake</title>
		<link>http://willnorris.com/2011/06/922</link>
		<comments>http://willnorris.com/2011/06/922#comments</comments>
		<pubDate>Sun, 26 Jun 2011 23:58:39 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=922</guid>
		<description><![CDATA[first post using snowflake, my new WordPress plugin for syndicating personal published content #indieweb]]></description>
			<content:encoded><![CDATA[<p>first post using snowflake, my new WordPress plugin for syndicating personal published content #indieweb</p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2011/06/922/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Git is the next Unix</title>
		<link>http://willnorris.com/2011/03/git-is-the-next-unix</link>
		<comments>http://willnorris.com/2011/03/git-is-the-next-unix#comments</comments>
		<pubDate>Mon, 14 Mar 2011 05:06:45 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=920</guid>
		<description><![CDATA[Avery Pennarun in 2008: With git, we&#8217;ve invented a new world where revision history, checksums, and branches don&#8217;t make your filesystem slower: they make it faster. They don&#8217;t make your data bigger: they make it smaller. They don&#8217;t risk your data integrity; they guarantee integrity. They don&#8217;t centralize your data in a big database; they [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://apenwarr.ca/log/?m=200801#31">Avery Pennarun</a> in 2008:</p>

<blockquote>
  <p>With git, we&#8217;ve invented a new world where revision history, checksums, and branches don&#8217;t make your filesystem slower: they make it <strong>faster</strong>. They don&#8217;t make your data bigger: they make it <strong>smaller</strong>. They don&#8217;t risk your data integrity; they <strong>guarantee integrity</strong>. They don&#8217;t centralize your data in a big database; they <strong>distribute</strong> it peer to peer.</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2011/03/git-is-the-next-unix/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hum – A Personal URL shortener for WordPress</title>
		<link>http://willnorris.com/2011/01/hum-personal-url-shortener-wordpress</link>
		<comments>http://willnorris.com/2011/01/hum-personal-url-shortener-wordpress#comments</comments>
		<pubDate>Thu, 27 Jan 2011 17:02:46 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=918</guid>
		<description><![CDATA[While I haven&#8217;t had much time over the last year or so to spend actually writing code for DiSo, I&#8217;ve been really interested in the new direction Tantek has been taking things with his DiSo 2.0 concepts. Many of the early efforts in DiSo were focused just on how to move social data around the [...]]]></description>
			<content:encoded><![CDATA[<p>While I haven&#8217;t had much time over the last year or so to spend actually writing code for <a href="http://diso-project.org/">DiSo</a>, I&#8217;ve been really interested in the new direction <a href="http://tantek.com/">Tantek</a> has been taking things with his <a href="http://tantek.com/2010/034/t2/diso-2-personal-domains-shortener-hatom-push-relmeauth">DiSo 2.0</a> concepts.  Many of the early efforts in DiSo were focused just on how to move social data around the web (data formats, protocols, authentication mechanisms, etc).  Tantek is taking a slightly different approach to this by first emphasizing the importance of data ownership.  It&#8217;s not enough to simply pull in a <strong>copy</strong> of your content from social networks into your local repository.  In order to truly own your data, the <strong>original</strong> should be on your site, and then copies pushed <em>out</em> to whatever social networks, with links pointing back to the original where appropriate.  It may sound like a purely academic distinction, but it&#8217;s the difference between <a href="http://nomoresharecropping.org/2010/12/no-more-sharecropping/">sharecropping and homesteading</a>.</p>

<p>So just to prove that I don&#8217;t actually spend all of my time in the belly of the <a href="http://www.google.com/">beast</a>, I&#8217;m happy to announce a new project I&#8217;ve been working on – Hum.  It&#8217;s a personal URL shortener for WordPress, inspired by <a href="http://ttk.me/w/Whistle">Whistle</a>.  It&#8217;s important to note that this is not a traditional URL shortener like <a href="http://bit.ly/">bit.ly</a> or <a href="http://goo.gl/">goo.gl</a> that is designed for creating links to any arbitrary site on the web.  Instead, a personal URL shortener is intended to link to your own content&#8230; your blog posts, your status updates, your photos.  When pushing content from your site out to social networks, you often need the ability to link back to the original.  Thanks to Twitter this means short URLs, and following DiSo principles, this means controlling those URLs.  A URL shortener may not be sexy, but it&#8217;s necessary infrastructure for DiSo 2.0.</p>

<p>Hum is like Whistle in a lot of ways.  It&#8217;s designed to be run on a personal domain.  It use <a href="http://ttk.me/w/NewBase60">NewBase60</a> encodings to keep the URLs both short and human readable.  And it uses the same content-type <a href="http://ttk.me/w/Whistle#design">partitioning</a> of the URL space.  The key difference is in the use of database keys.  One of the design principles of Whistle is to have algorithmically reversible URLs.  That means that anyone who knows the algorithm can convert the short URL back to the fully expanded form without actually having to make an HTTP request.  It also means that you don&#8217;t need any kind of datastore to lookup the mapping.  You can easily store everything in flat files.  This results in a more stable and overall faster system.  But because we&#8217;re building on WordPress, which is tied to a database anyway, there wasn&#8217;t as much of a benefit in avoiding the use of database keys in the short URLs.</p>

<h2>How it Works</h2>

<p>Hum is actually pretty simple.  It&#8217;s very lightweight and currently uses no data storage of its own, as there are no configuration options.  It registers a few URL patterns like <code>/b/*</code> and then handles any requests to those paths.  For example, the short URL for this blog post is <a href="http://wjn.me/b/FJ">http://wjn.me/b/FJ</a>.  It also hooks into the built-in WordPress shortlink functionality to expose these new shortlinks in the metadata for each page.</p>

<p>Doing nothing else, this should give you reasonably short URLs, depending on your domain name.  But the real value comes when you couple it with a personal short domain, and it&#8217;s incredibly simple to do.  Buy a short domain, and set it to redirect to your primary domain.  I did this by putting the following in my <code>.htaccess</code> for my short domain:</p>

<pre><code>RewriteEngine On
RewriteBase /
RewriteRule (.*) http://willnorris.com/$1 [L,R=permanent]
</code></pre>

<p>Then you want to tell Hum that you have a short domain that it should use for generating URLs.  To do that, add something like the following to your theme&#8217;s <code>functions.php</code> file:</p>

<pre><code>add_filter('hum_shortlink_base', create_function('', 'return "http://wjn.me/";'));
</code></pre>

<p>And that&#8217;s it.  You now have simple short URLs for all of your WordPress content.  Hum includes additional hooks to make it very easy to link to offsite content, which I&#8217;ll hopefully cover in a future post.  In the meantime, <a href="https://github.com/willnorris/wordpress-hum">read the source</a>&#8230; it&#8217;s pretty well documented.</p>

<p>This is only the first step in what I&#8217;d like to build for a WordPress implementation of DiSo 2.0, but a necessary one.  If you&#8217;re interested in this, please contact me.  You should also consider coming to <a href="http://plancast.com/p/3cos/indiewebcamp">IndieWebCamp</a> in Portand, Oregon where we&#8217;ll be discussing this stuff for a full weekend.</p>

<p>Download Hum on GitHub: <a href="https://github.com/willnorris/wordpress-hum">https://github.com/willnorris/wordpress-hum</a><br />
Also on WordPress Extend: <a href="http://wordpress.org/extend/plugins/hum/">http://wordpress.org/extend/plugins/hum/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2011/01/hum-personal-url-shortener-wordpress/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Cached Commons</title>
		<link>http://willnorris.com/2010/10/cached-commons</link>
		<comments>http://willnorris.com/2010/10/cached-commons#comments</comments>
		<pubDate>Sat, 16 Oct 2010 04:38:59 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[cached commons]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=915</guid>
		<description><![CDATA[I&#8217;ve been working on rebuilding the theme for my site as I find a free hour or two every now and then. Eventually I&#8217;d like to do a new design, but for now I&#8217;m just working on rewriting the code itself. That will be a post for another day, but one of my focuses is [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working on rebuilding the theme for my site as I find a free hour or two every now and then.  Eventually I&#8217;d like to do a new design, but for now I&#8217;m just working on rewriting the code itself.  That will be a post for another day, but one of my focuses is to make things leaner and faster.  One of the ways I&#8217;m looking to do that is by offloading as much as I can, using things like the <a href="http://code.google.com/apis/libraries/">Google Libraries API</a> to load jQuery from a CDN.  I&#8217;ve also been thinking about using <a href="http://www.modernizr.com/">Modernizr</a>, though it <a href="http://code.google.com/p/google-ajax-apis/issues/detail?id=299">has not yet been added</a> to the Google CDN (or any other CDN that I can find).  I did however find a very interesting project tonight that is trying to address this kind of problem.</p>

<p><a href="http://cachedcommons.org/">Cached Commons</a> was <a href="http://viatropos.com/blog/github-as-a-cdn/">setup by</a> Lance Pollard earlier this summer to provide a common repository of popular (and some not-quite-as-popular) javascript and CSS libraries.  This is a great idea, and one I&#8217;m a little surprised hasn&#8217;t been done before, at least not quite like this.  I do have a few random thoughts and concerns though that struck me as I debated whether or not to use Cached Commons&#8217; hosted version of Modernizr:</p>

<ol>
<li><p>I don&#8217;t know Lance Pollard.  I&#8217;ve never heard of him before, and I have no real reason to trust him.  Looking at his website and GitHub profile, he seems to be very active in the open source (and specifically ruby) community, which is a big credit.  By relying on his hosted version of any of these libraries, I&#8217;m taking a risk that he could change the hosted files and do some nefarious things to my site.  I have absolutely no reason to believe that he would, but it&#8217;s always possible.  I don&#8217;t really have this worry with Google.</p></li>
<li><p>What happens if Lance loses interest in maintaining this project, or gets too busy to keep things up to date?  Again, not something I worry about with a company like Google.  Now in reality this isn&#8217;t really an issue for a number of reasons.  First of all, it&#8217;s not likely that I would absolutely <strong>need</strong> the latest version of a given library sooner than Lance would get around to adding it to Cached Commons.  And because all of his work is being done in the open, especially being hosted in GitHub, I or anyone else could make a complete copy of all his work in a matter of minutes and maintain it ourselves.</p></li>
<li><p>Cached Commons is powered by <a href="http://pages.github.com/">GitHub pages</a>, which is certainly faster than pulling the files directly out of the git repository as Lance <a href="http://viatropos.com/blog/github-as-a-cdn/#gotchas">points out</a>.  However, I&#8217;m pretty sure it&#8217;s not actually a CDN in the traditional sense, so it&#8217;s not as likely to have the same speed or reliability over time.  That being said, I have no reason to believe that GitHub would be any less reliable than my own site, which is hosted with <a href="http://www.joyent.com/">Joyent</a>.</p></li>
<li><p>One of the biggest benefits of using javascript libraries from the Google Libraries API has nothing to do with the speed at which the data can download, but rather the fact that it may not need to be downloaded at all.  As more and more sites begin to use the same exact copy of a particular library, the higher the likelihood that a given user will already have the file in their browser cache.  So if a user has visited <strong>any</strong> site in the last year or so that uses the Google Library API to host jQuery for example, there&#8217;s a decent chance that it won&#8217;t need to be downloaded again and your site will load all that much faster.  This is really more in reply to Lance&#8217;s <a href="http://viatropos.com/blog/github-as-a-cdn/#comment-78181598">comment</a> about jQuery loading faster from Cached Commons than from Google&#8230; it&#8217;s about more than just transfer speed.  But for things like Modernizr that aren&#8217;t included on the Google CDN at all, Cached Commons is certainly a good potential alternative.</p></li>
<li><p>Another important principal when trying to optimize speed is to serve static content from a <a href="http://code.google.com/speed/page-speed/docs/request.html#ServeFromCookielessDomain">cookie-less domain</a>.  Cached Commons is not cookie-less because Lance uses Google Analytics on the site.  Of course, the only way that a user would have a cookie set for Cached Commons is if they had visited the site directly, which for most users will be pretty unlikely.  However, it is something to consider.  This could be addressed by using different hostnames for the website and the file repository, but at this stage it&#8217;s probably not worth the effort.</p></li>
<li><p>Finally, I&#8217;m very curious how the folks at GitHub feel about this project.  I&#8217;m sure they didn&#8217;t exactly intend for GitHub pages to serve as a blind file server for the world, but then again, maybe this is the kind of project they had in mind&#8230; GitHub pages is certainly optimized for hosting static files.  But it&#8217;s still not quite the same as Google committing to support their Library API, and designing the service for exactly that purpose.  GitHub is, without a doubt, one of my favorite services in recent years, and I certainly wouldn&#8217;t want to abuse that service in any way.</p></li>
</ol>

<p>In the end, I&#8217;ll quite likely use Cached Commons for hosting various libraries like Modernizr&#8230; you have to find a balance in all these things, and the ease of just linking off to them is quite attractive.  I&#8217;d love to see GitHub actually work with Lance and make this a real service that they offer similar to <a href="http://gems.github.com/">GitHub RubyGems</a> (and others?).  All in all, the work Lance has done on this is great&#8230; I&#8217;ve been wanting something like this for a long time, and am very pleased with what he&#8217;s come up with.</p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2010/10/cached-commons/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Going to Google</title>
		<link>http://willnorris.com/2010/01/going-to-google</link>
		<comments>http://willnorris.com/2010/01/going-to-google#comments</comments>
		<pubDate>Tue, 26 Jan 2010 16:11:49 +0000</pubDate>
		<dc:creator>Will Norris</dc:creator>
				<category><![CDATA[identity]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[personal]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA["social web"]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[life]]></category>
		<category><![CDATA[openid]]></category>

		<guid isPermaLink="false">http://willnorris.com/?p=903</guid>
		<description><![CDATA[I&#8217;m happy to announce today that I&#8217;ve accepted a job at Google, working on the newly formed Social Web team. I will be joining fellow new-hires Joseph Smarr and Chris Messina, as well as a host of other incredibly talented engineers, in contributing to the emerging standards and growing developer community in this space. Instead [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m happy to announce today that I&#8217;ve accepted a job at Google, working on the newly formed Social Web team.  I will be joining fellow new-hires <a href="http://josephsmarr.com/2009/12/18/joseph-smarr-has-new-work-info…/">Joseph Smarr</a> and <a href="http://factoryjoe.com/blog/2010/01/07/happy-birthday-to-me-im-joining-google/">Chris Messina</a>, as well as a host of other incredibly talented engineers, in contributing to the emerging standards and growing developer community in this space.</p>

<p>Instead of the long contemplative post on how this move is the next logical step in a career of working in Identity Management, I&#8217;ll keep it short.  I start work next Monday, February 1st, and I&#8217;m a bit pre-occupied this week with getting moved from Portland, Oregon down to Half Moon Bay, California.</p>

<p>I expect great things from our team in 2010, and so should you.</p>
]]></content:encoded>
			<wfw:commentRss>http://willnorris.com/2010/01/going-to-google/feed</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
	</channel>
</rss>

