<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bill Higgins&#039; Blog</title>
	<atom:link href="http://billhiggins.us/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://billhiggins.us/blog</link>
	<description></description>
	<lastBuildDate>Fri, 05 Mar 2010 17:56:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Audible DRM issue</title>
		<link>http://billhiggins.us/blog/2010/03/05/audible-drm-issue/</link>
		<comments>http://billhiggins.us/blog/2010/03/05/audible-drm-issue/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 17:49:20 +0000</pubDate>
		<dc:creator>Bill Higgins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://billhiggins.us/blog/?p=144</guid>
		<description><![CDATA[I hit a very annoying issue using Audible.com on my Mac with iTunes and my iPhone. I thought I&#8217;d document it in case others hit it.
Setting the Stage
I got a MacBook Pro in early 2009. I buy audiobooks from Audible.com and store them in iTunes. From iTunes I sync the audiobooks to my iPhone so [...]]]></description>
			<content:encoded><![CDATA[<p>I hit a very annoying issue using Audible.com on my Mac with iTunes and my iPhone. I thought I&#8217;d document it in case others hit it.</p>
<p><strong>Setting the Stage</strong></p>
<p>I got a <a href="http://www.apple.com/macbookpro/">MacBook Pro</a> in early 2009. I buy audiobooks from <a href="http://audible.com/">Audible.com</a> and store them in <a href="http://www.apple.com/itunes/">iTunes</a>. From iTunes I sync the audiobooks to my <a href="http://www.apple.com/iphone/">iPhone</a> so that I can listen to them while driving, cleaning, etc. The audiobooks are <a href="http://en.wikipedia.org/wiki/Digital_rights_management">DRM</a>-protected (urgh), so the first time you try to play an audiobook in iTunes it asks you to enter your Audible user ID and password. It then validates your Audible user ID and password and verifies that you have purchased the audiobook file. Once you have authorized your Audible.com account in iTunes, you never have to enter your Audible.com user ID and password again. Also, once you have authorized your Audible.com account in iTunes, you can sync audiobooks to your iPhone.</p>
<p><strong>The Symptoms</strong></p>
<p>Recently <a href="http://www.ibm.com/">IBM</a> got me a new 2010 MacBook Pro for work (thanks IBM) so I gave my 2009 MacBook Pro to my wife. So that I wouldn&#8217;t have to set everything up from scratch, I backed up my entire 2009 MacBook Pro to an external drive using <a href="http://www.apple.com/macosx/what-is-macosx/time-machine.html">Time Machine</a> and then restored this configuration onto the new MacBook Pro. After a couple of hours of data transfer both ways, my new MacBook Pro was a clone of my old MacBook Pro, or so I thought.</p>
<p>Unfortunately I realized quickly that something was wrong with my Audible.com audiobooks. The first symptom was that none of my Audible.com Audiobooks were on my iPhone. I tried to play one in iTunes and it asked me to authorize my Audible.com account. This was a surprise because I would have expected the Time Machine backup / restore to have made this unnecessary (since my iTunes configuration was already authorized), so I typed in my Audible.com user ID and password, hit sync, and sure enough the ebooks synced successfully to my iPhone.</p>
<p>Later that week I noticed that the audiobooks had disappeared from my iPhone again!</p>
<p><strong>The Bug</strong></p>
<p>To make a long story short (too late), after some experimentation and support discussion with Audible.com, I discovered the following steps to reproduce the problem.</p>
<ol>
<li>Start iTunes</li>
<li>Double-click an Audible.com audiobook</li>
<li>iTunes prompts you to authorize your computer for your Audible account by asking you to enter your Audible.com user ID and password</li>
<li>Enter Audible.com user ID and password and successfully authorize</li>
<li>Sync iPhone</li>
<li>Audiobooks copy successfully</li>
<li>Close and re-open iTunes</li>
<li>Sync iPhone</li>
<li>Books are deleted from iPhone</li>
</ol>
<p>Basically anytime I closed iTunes, my Audible authorization was lost. This indicated that authorization was succeeding but was not being persisted to disk. I sent the steps to reproduce to Audible customer support.</p>
<p><strong>The Solution</strong></p>
<p>As I suspected, it was a persistence problem. The Audible support person pointed me to the file <code>/Library/Preferences/com.audible.data.plist</code> (<a href="http://en.wikipedia.org/wiki/Property_list">a Mac property list file</a>) where (apparently) the Audible / iTunes code persists your Audible authorization information (I peaked in the file and it contained a single &#8216;data&#8217; property whose value was 4 KB of encrypted something or other). Interestingly, even though I&#8217;d at this point authorized my Audible account in iTunes many times this week, the file&#8217;s date stamp was from last year, indicating the file wasn&#8217;t getting updated and thus my authorization went *poof* whenever I closed the iTunes application and its process died.</p>
<p>The Audible customer support rep first suggested to check the file&#8217;s permissions to make sure that my user account was authorized to modify the file. No problems there &#8211; I had read/write access to the file. Her second suggestion was simply to close iTunes, delete the Audible property file, open iTunes and reauthorize the computer. I did this and sure enough when I reauthorized the computer, a new property file was created with the current time as the timestamp and I was able to close and re-open iTunes without having to re-authorize.</p>
<p><strong>Lessons Reiterated</strong></p>
<p>This experience reinforces two software principles I already believed.</p>
<ul>
<li>DRM sucks ass</li>
<li>Data persistence is hard</li>
</ul>
<p><strong>Solution Proposal</strong></p>
<p>I sent the following suggestion to the Audible.com support person:</p>
<p style="padding-left: 30px;">Thank you &lt;redacted&gt;. It&#8217;s working now.</p>
<p style="padding-left: 30px;">FYI, it was not a permissions issue &#8211; the permissions were correct. I had to delete the com.audible.data.plist file and restart iTunes / reauthorize Audible to create a new version of the file.</p>
<p style="padding-left: 30px;">I suspect this is related to my restore from Time Machine on to a new computer. I would suggest your engineers who work on the Mac iTunes integration test this case:</p>
<p style="padding-left: 30px;">1. On a Mac, authorize to read Audible content via iTunes</p>
<p style="padding-left: 30px;">2. Backup a Mac onto Time Machine</p>
<p style="padding-left: 30px;">3. Restore from Time Machine onto a new Mac</p>
<p style="padding-left: 30px;">4. Attempt to play Audible content</p>
<p style="padding-left: 30px;">I&#8217;m not sure what the ideal behavior is (e.g. just working or requiring a single authorization of the new machine) but I know what should not happen is what happened to me <img src='http://billhiggins.us/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p style="padding-left: 30px;">Thanks again for your help.</p>
<p style="padding-left: 30px;">- Bill</p>
]]></content:encoded>
			<wfw:commentRss>http://billhiggins.us/blog/2010/03/05/audible-drm-issue/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AppleScript to resize Safari for recording a YouTube HD video</title>
		<link>http://billhiggins.us/blog/2010/02/28/script-to-resize-safari-for-recording-a-youtube-hd-video/</link>
		<comments>http://billhiggins.us/blog/2010/02/28/script-to-resize-safari-for-recording-a-youtube-hd-video/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 01:39:21 +0000</pubDate>
		<dc:creator>Bill Higgins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[applescript]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://billhiggins.us/blog/?p=137</guid>
		<description><![CDATA[Occasionally I need to produce YouTube HD videos showing me doing something in a web browser. Up &#8217;till now I&#8217;ve had to painfully, manually resize the browser window to 1280&#215;720 so that the video didn&#8217;t get unnaturally shrunk or expanded by my screencast rendering software. Tonight I figured out a way to automatically resize my [...]]]></description>
			<content:encoded><![CDATA[<p>Occasionally I need to produce <a href="http://youtube.com/">YouTube</a> <a href="http://en.wikipedia.org/wiki/High-definition_video">HD</a> videos showing me doing something in a web browser. Up &#8217;till now I&#8217;ve had to painfully, manually resize the browser window to 1280&#215;720 so that the video didn&#8217;t get unnaturally shrunk or expanded by my screencast rendering software. Tonight I figured out a way to automatically resize my browser window to the exact dimensions using <a href="http://www.macosxautomation.com/applescript/">AppleScript</a>.</p>
<p>Here is the magical incantation:</p>
<p style="padding-left: 30px;"><strong>tell</strong> <em><span style="color: #0000ff;">application</span></em> &#8220;Safari&#8221;</p>
<p style="padding-left: 60px;"><strong><span style="color: #0000ff;">activate</span><br />
<span style="font-weight: normal;"><strong>set</strong> <strong>the</strong> <span style="color: #800080;">bounds</span> <strong>of</strong> <strong>the</strong> <strong>first</strong> <em><span style="color: #0000ff;">window</span></em> <strong>to</strong> {0, 0, 1280, 720}</span></strong></p>
<p style="padding-left: 30px;"><strong><span style="font-weight: normal;"><strong>end</strong> <strong>tell</strong></span></strong></p>
<p>Run this application in AppleScript Editor (<code>/Applications/Utilities/AppleScript Editor</code>) and your browser will be the perfect size for recording movies. You can save the script to a folder for later reuse.</p>
]]></content:encoded>
			<wfw:commentRss>http://billhiggins.us/blog/2010/02/28/script-to-resize-safari-for-recording-a-youtube-hd-video/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Jazz extensibility evolution</title>
		<link>http://billhiggins.us/blog/2010/01/03/jazz-extensibility-evolution/</link>
		<comments>http://billhiggins.us/blog/2010/01/03/jazz-extensibility-evolution/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 00:43:20 +0000</pubDate>
		<dc:creator>Bill Higgins</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[jazz]]></category>

		<guid isPermaLink="false">http://billhiggins.us/blog/?p=128</guid>
		<description><![CDATA[Shortly before winter vacation, an IBM colleague contacted me to learn more about how extensibility &#8211; particularly web UI extensibility &#8211; works in the IBM Rational Jazz Platform on which I work. After typing up my response I thought it might be interesting to a broader audience so I&#8217;ve reposted it here (with some minor [...]]]></description>
			<content:encoded><![CDATA[<p>Shortly before winter vacation, an IBM colleague contacted me to learn more about how extensibility &#8211; particularly web UI extensibility &#8211; works in <a href="http://jazz.net/">the IBM Rational Jazz Platform</a> on which I work. After typing up my response I thought it might be interesting to a broader audience so I&#8217;ve reposted it here (with some minor tweaks for clarity). Note that some but not all of the links below require <a href="https://jazz.net/pub/user/register.jsp">Jazz.net registration</a> (sorry).</p>
<p>&#8212;&#8211;</p>
<p>Hi &lt;redacted&gt;,</p>
<p>You are correct that as of <a href="http://jazz.net/projects/jazz-foundation">Jazz Foundation</a> 1.0.x (shipped this year), one contributes &#8220;viewlets&#8221; (a Jazz-specific widget mechanism comparable to OpenSocial Gadgets and iWidgets) to Jazz Dashboards via a server-side Eclipse extension point.</p>
<p>However, the Jazz extensibility story is more complex than OSGi bundles and Eclipse extension points. I will explain this below, with the assumption that you are interested.</p>
<h3>Original Extensibility Mechanism Based on Bundles and Extension-points</h3>
<p>When we first started the Jazz server work in 2005 we made a design decision that the Jazz server would be based on Java/OSGi and you contribute capabilities to the server by adding additional OSGi bundles. I&#8217;m guessing you&#8217;re very familiar with this architecture; it&#8217;s of course very similar to the Eclipse workbench except instead of contributing actions and views (e.g. to implement a Java IDE) you contributed web services and data definitions (e.g. to implement a bug tracking system). We went so far as to enable this style of programming for Dojo-based Ajax code so that developers could add &#8220;web bundles&#8221; and have the Jazz Web UI framework discover and surface their web capabilities in the Jazz Web UI. The Dashboard viewlets are one example of an extension-point-based extension. There are other extensions also enabled by extension-points (as in Eclipse, this extensibility model is open-ended).</p>
<h3>Shift Towards a RESTful Architecture</h3>
<p>Around 2007 we came to the conclusion that the &#8220;extend the server&#8221; model wouldn&#8217;t enable us to achieve our broad goal of &#8220;enabling integration of heterogenous tools across the software lifecycle&#8221;. There were several blocking problems with this architecture. I will list a few below:</p>
<p>We came to the conclusion that the RPC style service APIs were too fragile over time and would make it difficult to allow for independent upgrades of different tools in an environment containing many tools.</p>
<p>We could only support a narrow range of technologies (i.e. OSGi-ified Java and JavaScript code built on top of our server architecture). This limitation is readily apparent when you compare it to something like OpenSocial Gadgets or iWidget where you need only specify a gadget/widget URL to achieve integration.</p>
<p>This caused us to take a step back and ultimately decided to use the REST architectural style to achieve integration across tools. For instance this year we enabled several integrations between our Requirements Composer, Team Concert, and Quality Manager products using RESTful protocols and APIs. For an example of these integrations, see <a href="http://jazz.net/library/video/319">this video on Jazz.net</a> that demonstrates how we use REST and Discovery to drive linking and &#8220;picker&#8221; integration between two tools.</p>
<h3>Implications of RESTful Architecture on Extensibility Model</h3>
<p>The shift to the RESTful architecture left a gap w/r/t extensibility. I.e. how do we meet extensibility needs if we can&#8217;t assume a homogeneous OSGi/Java/JavaScript-based programming model? The solution we came up with was something that we generically call &#8220;<a href="https://jazz.net/wiki/bin/view/Main/RootServicesSpec">Discovery</a>&#8221; (an overloaded term, I know). Basically each tool in a Jazz environment has a single &#8220;root services&#8221; document that describes the basic capabilities of the tool and has pointers to other documents that contain more details about a specific service. You configure tools to know about each others&#8217; service documents, and from there they can discover and (if appropriate) consume each others&#8217; capabilities using spec&#8217;d protocols (as opposed to physically installing code from Tool A within Tool B&#8217;s environment).</p>
<p>For instance, we have a &#8220;viewlet provider&#8221; service type that announces that the tool in question has viewlets that can be embedded in Dashboards. Here&#8217;s an example of how it works:</p>
<ul>
<li>Tool A has Jazz Dashboards capabilities</li>
<li>Tool B claims to be a &#8220;viewlet provider&#8221;</li>
<li>Tool A is configured to connect to Tool B (this includes specifying Tool B&#8217;s root URL and configuring an OAuth consumer / provider relationship)</li>
<li>Tool A is now able to host Tool B&#8217;s viewlets in its Dashboards</li>
</ul>
<p>The interesting thing about this is that Tool A and Tool B could be implemented in wildly different ways&#8230; e.g. OSGi/Java vs. PHP.</p>
<p>* As an aside, we are currently working to deprecate Jazz Viewlets and adding the ability to host iWidgets and OpenSocial gadgets in Jazz Dashboards. This is in plan for 2010.</p>
<h3>Going Foward</h3>
<p>Even though we have moved to a REST-centric architecture, OSGi and Extension Points are still important, but less so than they used to be. We will continue to ship and use the OSGi and Extension Point-based Ajax frameworks and building blocks for the near future, but our major development investments and the <a href="https://jazz.net/wiki/bin/view/Reference">Jazz SDK</a>&#8217;s focus will only assume fundamental web technologies like HTTP, HTML, JavaScript, and CSS and provide optional higher-level frameworks around emerging web standards like OAuth and OpenSocial.</p>
<p>I hope this was useful for you.</p>
<p>- Bill</p>
]]></content:encoded>
			<wfw:commentRss>http://billhiggins.us/blog/2010/01/03/jazz-extensibility-evolution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Knuth on email</title>
		<link>http://billhiggins.us/blog/2009/12/19/knuth-on-email/</link>
		<comments>http://billhiggins.us/blog/2009/12/19/knuth-on-email/#comments</comments>
		<pubDate>Sat, 19 Dec 2009 16:42:37 +0000</pubDate>
		<dc:creator>Bill Higgins</dc:creator>
				<category><![CDATA[qotd]]></category>

		<guid isPermaLink="false">http://billhiggins.us/blog/?p=124</guid>
		<description><![CDATA[Don Knuth: Email is a wonderful thing for people whose role in life is to be on top of things. But not for me; my role is to be on the bottom of things.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www-cs-faculty.stanford.edu/~uno/email.html">Don Knuth</a>: Email is a wonderful thing for people whose role in life is to be on top of things. But not for me; my role is to be on the bottom of things.</p>
]]></content:encoded>
			<wfw:commentRss>http://billhiggins.us/blog/2009/12/19/knuth-on-email/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ebook love</title>
		<link>http://billhiggins.us/blog/2009/08/17/ebook-love/</link>
		<comments>http://billhiggins.us/blog/2009/08/17/ebook-love/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 06:20:38 +0000</pubDate>
		<dc:creator>Bill Higgins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://billhiggins.us/weblog/?p=118</guid>
		<description><![CDATA[I used to read a lot of tech books, like a an hour or two a day. Several years, several promotions, two kids, and one deteriorating eye later, I realized I wasn&#8217;t reading much anymore. The combination of work commutes / Audible.com / iPod helped me keep up with novels and non-techy non-fiction, but I [...]]]></description>
			<content:encoded><![CDATA[<p>I used to read a lot of tech books, like a an hour or two a day. Several years, several promotions, two kids, and one deteriorating eye later, I realized I wasn&#8217;t reading much anymore. The combination of work commutes / <a href="http://audible.com/">Audible.com</a> / iPod helped me keep up with novels and non-techy non-fiction, but I still had trouble keeping up with tech books.</p>
<p>Luckily, tech publishers are starting to publish more and more <a href="http://en.wikipedia.org/wiki/Ebook">ebooks</a>. Here&#8217;s some of the good and bad points of reading tech ebooks.</p>
<p><strong>Tech Ebooks: The Good</strong></p>
<ul>
<li>My <a href="http://www.apple.com/macbookpro/">Macbook Pro</a>&#8217;s <a href="http://www.youtube.com/watch?v=_VeAOK8Rxoo">multi-touch trackpad</a> makes it very easy to zoom and scroll so I end up with huge font that I can read without glasses from several feet away.</li>
<li>I can carry all of my ebooks on both my computer and iPhone.</li>
<li>Publishers like <a href="http://oreilly.com/ebooks/">O&#8217;Reilly</a> and <a href="http://pragprog.com/frequently-asked-questions/ebooks">Pragprog</a> have relatively mature ebook stories; DRM-free, mobile integration, and available in both computer-friendly (<a href="http://en.wikipedia.org/wiki/Portable_Document_Format">PDF</a>) and mobile-friendly (<a href="http://en.wikipedia.org/wiki/EPUB">EPUB</a>) versions and notification for free updates of new printings.</li>
<li>I can quickly search across all ebook content using <a href="http://en.wikipedia.org/wiki/Spotlight_(software)">Spotlight</a> and quickly open ebooks using <a href="http://quicksilver.en.softonic.com/mac">Quicksilver</a> and <a href="http://en.wikipedia.org/wiki/Preview_(software)">Preview</a>.</li>
<li>They&#8217;re significantly less expensive than their dead tree counterparts and you can acquire them instantly vs. a trip to the bookstore or, more likely, a two day wait for an <a href="http://www.amazon.com/gp/prime/signup/textbooks.html">Amazon Prime</a> delivery.</li>
<li>Using <a href="http://www.getdropbox.com/">Dropbox</a> you can easily replicate your ebooks across all of your computers while easily staying under Dropbox&#8217;s 2GB free account max.</li>
</ul>
<p><strong>Tech Ebooks: The Bad</strong></p>
<ul>
<li>Can&#8217;t (ethically) lend to friends; can&#8217;t give away when done with a book.</li>
<li>I have a <a href="http://www.amazon.com/Kindle-Amazons-Original-Wireless-generation/dp/B000FI73MA">1st gen Kindle</a> I never use. While I love the selection, price, and integration with Amazon.com, I hate the hardware design, the user experience, the $@#! <a href="http://en.wikipedia.org/wiki/Digital_rights_management">DRM</a>, and the fact that I can&#8217;t (easily/legally) view the books on my computer. Don&#8217;t buy a Kindle.</li>
<li>The selection of ebooks is relatively small vs. all books I&#8217;d want to buy. For instance, no <a href="http://us.penguingroup.com/nf/Book/BookDisplay/0,,9780140139969,00.html">How Buildings Learn</a> ebook (though I&#8217;ve sent the publisher an email on this).</li>
<li>Many ebook-selling publishers still insist on using DRM. This is stupid. As the argument goes, honest people like me will gladly pay for quality IP and a good user experience. DRM-selling publishers: please learn from O&#8217;Reilly and Pragprog.</li>
<li>You need a different account for each publisher. Luckily password management apps like <a href="http://www.keepassx.org/">KeePassX</a> simplify this, but it&#8217;s still a pain.</li>
</ul>
<p><strong>Tech Ebooks I&#8217;ve Recently Bought</strong></p>
<p>Now, for your reading pleasure, are the ebooks I&#8217;ve bought in the past few months (<span style="color: #ff0000;">updated 25 Oct. 2009</span>).</p>
<ul>
<li><a href="http://pragprog.com/titles/rails3/agile-web-development-with-rails-third-edition">Agile Web Development with Rails, 3E</a></li>
<li><a href="http://oreilly.com/catalog/9780596007652/">Ambient Findability</a></li>
<li><a href="http://oreilly.com/catalog/9780596526788/">bash Cookbook</a></li>
<li><a href="http://pragprog.com/titles/rdbcd/behind-closed-doors">Behind Closed Doors: Secrets of Great Management</a></li>
<li><a href="http://oreilly.com/catalog/9780596005955/">Classic Shell Scripting</a></li>
<li><a href="http://www.informit.com/store/product.aspx?isbn=0136083226">Clean Code</a></li>
<li><a href="http://oreilly.com/catalog/9780596156367/">Cloud Application Architectures</a></li>
<li><a href="http://www.informit.com/store/product.aspx?isbn=0132357267">Core Java Vol 1 8E</a></li>
<li><a href="http://www.informit.com/store/product.aspx?isbn=0321700740">Design Patterns</a></li>
<li><a href="http://oreilly.com/catalog/9780596516253/">Designing Web Interfaces</a></li>
<li><a href="http://oreilly.com/catalog/9780596528102/">Designing Web Navigation</a></li>
<li><a href="http://www.informit.com/store/product.aspx?isbn=0132345285">Effective Java 2E</a></li>
<li><a href="http://oreilly.com/catalog/9780596529307/">High Performance Web Sites</a></li>
<li><a href="http://www.informit.com/store/product.aspx?isbn=0321657527">How to Break Web Software</a></li>
<li><a href="http://oreilly.com/catalog/9781565925090">HTTP The Definitive Guide</a></li>
<li><a href="http://oreilly.com/catalog/9780596157593/">iWork 09 The Missing Manual</a></li>
<li><a href="http://oreilly.com/catalog/9780596517748/">JavaScript: The Good Parts</a></li>
<li><a href="http://oreilly.com/catalog/9780596101992/">JavaScript the Definitive Guide 5E</a></li>
<li><a href="http://oreilly.com/catalog/9780596007683/">Just a Geek</a></li>
<li><a href="http://oreilly.com/catalog/9780596520625/">Mac OS X for Unix Geeks 4E</a></li>
<li><a href="http://www.informit.com/store/product.aspx?isbn=0321467957">Mac OS X Internals</a></li>
<li><a href="http://oreilly.com/catalog/9780596153298/">Mac OS X Snow Leopard the Missing Manual</a></li>
<li><a href="http://oreilly.com/catalog/9780596517717/">Making Things Happen</a></li>
<li><a href="http://pragprog.com/titles/jrpm/manage-it">Manage It!</a></li>
<li><a href="http://pragprog.com/titles/rgdojo/mastering-dojo">Mastering Dojo</a></li>
<li><a href="http://oreilly.com/catalog/9780596522971/">Photoshop CS4 The Missing Manual</a></li>
<li><a href="http://pragprog.com/titles/ahptl/pragmatic-thinking-and-learning">Pragmatic Thinking and Learning</a></li>
<li><a href="http://www.informit.com/store/product.aspx?isbn=0321605535">Programming in Objective-C 2.0</a></li>
<li><a href="http://oreilly.com/catalog/9780596009250/">Programming Python 3E</a></li>
<li><a href="http://pragprog.com/titles/ruby3/programming-ruby-1-9">Programming Ruby 1.9</a></li>
<li><a href="http://pragprog.com/titles/mnee/release-it">Release It!</a></li>
<li><a href="http://oreilly.com/catalog/9780596529260/">RESTful Web Services</a></li>
<li><a href="http://www.informit.com/store/product.aspx?isbn=0321617134">Scaling Lean &amp; Agile Development</a></li>
<li><a href="http://www.manning.com/resig/">Secrets of the JavaScript Ninja</a></li>
<li><a href="http://oreilly.com/catalog/9780596522353/">slide:ology</a></li>
<li><a href="http://oreilly.com/catalog/9780596008956/">SSH The Definitive Guide 2E</a></li>
<li><a href="http://www.pragprog.com/titles/textmate/textmate">TextMate</a></li>
<li><a href="http://oreilly.com/catalog/9780596157234/">The Art of Community</a></li>
<li><a href="http://www.informit.com/store/product.aspx?isbn=0131860828">The Design of Things to Come</a></li>
<li><a href="http://oreilly.com/catalog/9780596527051/">The Myths of Innovation</a></li>
<li><a href="http://pragprog.com/titles/cfcar2/the-passionate-programmer">The Passionate Programmer</a></li>
<li><a href="http://oreilly.com/catalog/9780596529260/">The Productive Programmer</a></li>
<li><a href="http://oreilly.com/catalog/9780596516178/">The Ruby Programming Language</a></li>
<li><a href="http://oreilly.com/catalog/9780596802813/">The Twitter Book</a></li>
<li><a href="http://pragprog.com/titles/ktuk/ubuntu-kung-fu">Ubuntu Kung Fu</a></li>
<li><a href="http://oreilly.com/catalog/9780596006891/">Unit Test Frameworks</a></li>
<li><a href="http://oreilly.com/catalog/9780596003302">Unix Power Tools 3E</a></li>
<li><a href="http://oreilly.com/catalog/9780596801601/">Using Google App Engine</a></li>
<li><a href="http://oreilly.com/catalog/9780596529963/">Web 2.0 &#8211; A Strategy Guide</a></li>
<li><a href="http://oreilly.com/catalog/9780596514433/">Web 2.0 Architectures</a></li>
<li><a href="http://oreilly.com/catalog/9780596521264/">XMPP The Definitive Guide</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://billhiggins.us/blog/2009/08/17/ebook-love/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>detecting that you&#039;re in an IFrame</title>
		<link>http://billhiggins.us/blog/2009/04/09/detecting-that-youre-in-an-iframe/</link>
		<comments>http://billhiggins.us/blog/2009/04/09/detecting-that-youre-in-an-iframe/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 13:20:45 +0000</pubDate>
		<dc:creator>Bill Higgins</dc:creator>
				<category><![CDATA[ajax]]></category>

		<guid isPermaLink="false">http://billhiggins.us/weblog/?p=110</guid>
		<description><![CDATA[I hit a JavaScript issue recently that stumped me. I&#8217;m trying to detect if the code I&#8217;m running is in an IFrame or not. It seems like the safest way to determine this would be the following comparison:
if(window !== top) {
   var mode = "frame";
}
&#8216;window&#8217; of course is the global object in which [...]]]></description>
			<content:encoded><![CDATA[<p>I hit a JavaScript issue recently that stumped me. I&#8217;m trying to detect if the code I&#8217;m running is in an IFrame or not. It seems like the safest way to determine this would be the following comparison:</p>
<pre>if(window !== top) {
   var mode = "frame";
}</pre>
<p>&#8216;window&#8217; of course is the global object in which your code is running. If you&#8217;re running in a frame, your window object is actually a child in a window hierarchy. &#8216;top&#8217; refers the to the top-most window in the hierarchy. Therefore if window and top are the same, then you are in a top level page; conversely if they are different, then you are in a frame (or iframe).</p>
<p>This works great on Firefox but on IE, the window !== top expression never evaluates to true. That is, even if you&#8217;re the top window, &#8216;top&#8217; and &#8216;window&#8217; aren&#8217;t considered equal. I&#8217;m not sure why this is. My current fallback code is this:</p>
<pre>try {
    if (top.location.href !== window.location.href) {
        var mode = "frame";
    }
} catch (e) {    
    // if you're in an iframe in a different domain, the top.location check
    // results in a security exception
    mode = "frame";
}</pre>
<p>This code has two problems:</p>
<ol>
<li>There&#8217;s a small possibility that you could have the a frame with the same URL as the outer page. This is very unlikely because there&#8217;s no scenario I know of where you want to nest a page, but it&#8217;s still a latent bug.</li>
<li>You have to deal with the exception in the cross domain case. Not a big deal but unclean.</li>
</ol>
<p>I&#8217;m curious if anyone has a better solution for detecting whether or not you&#8217;re in an IFrame.</p>
]]></content:encoded>
			<wfw:commentRss>http://billhiggins.us/blog/2009/04/09/detecting-that-youre-in-an-iframe/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>frameworks and building blocks</title>
		<link>http://billhiggins.us/blog/2008/10/10/frameworks-and-building-blocks/</link>
		<comments>http://billhiggins.us/blog/2008/10/10/frameworks-and-building-blocks/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 06:38:52 +0000</pubDate>
		<dc:creator>Bill Higgins</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[jazz]]></category>

		<guid isPermaLink="false">http://billhiggins.us/weblog/?p=85</guid>
		<description><![CDATA[Between early 2006 and early this year, my team at IBM Rational and I built a framework for component-based Ajax development for use in the Rational Jazz platform. The framework&#8217;s capabilities aren&#8217;t the focus of this entry, so I&#8217;ll just list some of them briefly:

A nice component model based on OSGi bundles and the Dojo [...]]]></description>
			<content:encoded><![CDATA[<p>Between early 2006 and early this year, my team at IBM Rational and I built a framework for component-based Ajax development for use in the <a title="Rational Jazz :: ibm.com" href="http://www.ibm.com/software/rational/jazz/">Rational Jazz platform</a>. The framework&#8217;s capabilities aren&#8217;t the focus of this entry, so I&#8217;ll just list some of them briefly:</p>
<ul>
<li>A nice component model based on <a title="OSGi Alliance" href="http://www.osgi.org/Main/HomePage">OSGi</a> bundles and the <a title="The Dojo Toolkit" href="http://www.dojotoolkit.org/">Dojo</a> module system</li>
<li>Request-time &#8220;building&#8221; of many fine-grained JavaScript files into monolithic files for faster download based on the introspected relationships between the files &#8211; i.e. no developer effort required for fast code loading other than writing good application code</li>
<li>Making a subset of the Eclipse extension registry available in the web page and queryable via JavaScript APIs modeled off of the <code>org.eclipse.core.runtime</code> extension registry Java APIs, allowing for open-ended extensibility using the Eclipse extensibility model</li>
<li>A simple framework for demarcating UI states that made the back button, history, and page titles work seamlessly within the Ajax page, even when a user gesture resulted in crossing a component boundary (e.g. loading and displaying a new virtual &#8220;page&#8221; from a different component)</li>
<li>Dynamic, transparent loading of missing code in response to a user gesture that required it</li>
</ul>
<p>We did a fairly good job of keeping our Ajax framework decoupled from the rest of the Jazz Platform both for the purpose of design cohesiveness but also to allow for possible future use by teams who weren&#8217;t building full-blown application lifecycle management applications like Jazz SCM or Iteration Planning.</p>
<p>Over time, other IBM teams heard about some of our capabilities and saw the positive results in our <a title="Rational Team Concert" href="http://www.ibm.com/software/awdtools/rtc/">Rational Team Concert</a> web UIs (1) and contacted us to explore whether they could make use of our code in their products. Each conversation went like this:</p>
<ol>
<li>We gave a demo and talk about the capabilities and architecture of the framework</li>
<li>The other team said &#8220;that&#8217;s really nice, that&#8217;s really useful, that would be great to have&#8221;</li>
<li>The other team said &#8220;we&#8217;re not sure we want to live within your framework, we&#8217;ll get back to you&#8221;</li>
<li>The other team didn&#8217;t get back to us</li>
</ol>
<p>Initially this didn&#8217;t really bother me &#8211; after all my job was to deliver the foundation for our Jazz web user interfaces, not to create a general purpose Ajax framework for IBM, but as I&#8217;ve thought about it more over time and seen this anti-pattern from other teams and other frameworks, I&#8217;ve decided that we should make a conscious effort to make our useful functionality available as simple building blocks (in the form of libraries) and then provide frameworks that layer on top of these building blocks.</p>
<p>Let me take a step back and explain what I mean.</p>
<p>A library is a set of reusable functionality where your application uses parts of the library as necessary. For instance, most programming languages have a library for creating and manipulating dates. Frameworks also provide functionality to the application programmer, but instead of the application programmer making simple function calls, the framework runs the show and calls into the application at well defined hook points. For example, GUI frameworks provide ways to wire up code to run in response to users clicking on buttons.</p>
<p>Both the library and the framework provide useful functionality intended to make the application developer more productive. Though it&#8217;s dangerous to make a general statement, it feels to me that the big difference between the two is that frameworks generally provide more power, but require you to make a bigger commitment to the framework&#8217;s way of working, while libraries provide generally less power, but make few (if any) demands about how you structure your application.</p>
<p>What&#8217;s unfortunate is when you&#8217;ve got some useful bit of functionality that could be made available as a simple library but it&#8217;s only available in the context of a framework. This is where we were with our Ajax framework. This stuff is too abstract, so here&#8217;s an analogy: Imagine that you heard about a new refrigerator which provided every feature and characteristic you ever dreamed about having in a refrigerator. The catch however was that you couldn&#8217;t just buy the refrigerator &#8211; you had to move into a house on the other side of town that included the new refrigerator. After about 10 seconds of thought you realize that even though it&#8217;s the fridge of your dreams, you&#8217;re sure as hell not going to move into a new house across town in order to get it. This situation (switching back to software from refrigerators) is shown in the diagram below.</p>
<div id="attachment_120" class="wp-caption alignnone" style="width: 209px"><img class="size-full wp-image-120" title="building-blocks-in-framework" src="http://billhiggins.us/blog/wp-content/uploads/2008/10/building-blocks-in-framework.png" alt="Useful building blocks locked inside a framework" width="199" height="308" /><p class="wp-caption-text">Useful building blocks locked inside a framework</p></div>
<p>My recent realization (which seems obvious in hindsight) is that the useful functionality provided by frameworks and libraries need not be mutually exclusive. For instance, in our Ajax framework&#8217;s dynamic build system, rather than requiring applications to run within our framework to enjoy this capability, we could have created a simple callable library to perform dynamic optimization on a set of files, and then created a framework that simply used this same library. This approach is shown in the diagram below:</p>
<div id="attachment_122" class="wp-caption alignnone" style="width: 433px"><img class="size-full wp-image-122" title="building-blocks-decoupled-from-framework" src="http://billhiggins.us/blog/wp-content/uploads/2008/10/building-blocks-decoupled-from-framework.png" alt="Useful building blocks used by a framework but also available independently of the framework" width="423" height="296" /><p class="wp-caption-text">Useful building blocks used by a framework but also available independently of the framework</p></div>
<p>Over the past month or so we&#8217;ve been refactoring our Ajax framework to extract the useful building blocks into simple callable libraries and making the framework proper smaller by delegating to these libraries. We&#8217;ve done this in the hopes that our code will be useful to other IBM teams but as a result of the exercise, we&#8217;ve gained a deeper knowledge of our software and the software&#8217;s quality has improved as we&#8217;ve decoupled the framework aspects from the building blocks aspects.</p>
<p>Going forward, it&#8217;s my intention that our team will generally start with building blocks first and then consider if we should provide some higher-level framework that uses these building blocks. I only wish we had taken this approach from the beginning but you know, live and learn.</p>
<p><strong>Footnotes</strong></p>
<p>1) You can see our Jazz web UIs built on top of this framework in the development section of <a title="Jazz.net Community Site" href="http://jazz.net/">Jazz.net</a> if you register.</p>
<p><strong>Updates</strong></p>
<p>Changed &#8220;other than writing good code&#8221; to &#8220;other than writing good <em>application</em> code&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://billhiggins.us/blog/2008/10/10/frameworks-and-building-blocks/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>the awkward url-uri terminology dance</title>
		<link>http://billhiggins.us/blog/2008/07/09/the-awkward-url-uri-terminology-dance/</link>
		<comments>http://billhiggins.us/blog/2008/07/09/the-awkward-url-uri-terminology-dance/#comments</comments>
		<pubDate>Wed, 09 Jul 2008 08:45:52 +0000</pubDate>
		<dc:creator>Bill Higgins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[funny]]></category>
		<category><![CDATA[people]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://billhiggins.us/weblog/?p=79</guid>
		<description><![CDATA[As my dear colleagues Simon Johnston and James Branigan have mentioned in various blog posts, on the Jazz project that I work on, we&#8217;ve (finally) fallen in love with the web/REST story. Because of this, we spend a lot of time in technical conversations using the standard REST alphabet soup vocabulary you&#8217;d expect &#8211; HTTP, [...]]]></description>
			<content:encoded><![CDATA[<p>As my dear colleagues Simon Johnston and James Branigan have mentioned in various <a title="James Branigan - A brief history of the Jazz Team Server interface: Our journey from a J2EE server towards a RESTful server :: Jazz Team Blog" href="https://jazz.net/blog/index.php/2008/02/15/a-brief-history-of-the-jazz-server-interface-our-journey-from-a-j2ee-server-towards-a-restful-server/">blog</a> <a title="Simon Johston - Jazz REST Services :: IBM developerWorks blogs" href="http://www.ibm.com/developerworks/blogs/page/johnston?entry=jazz_rest_services">posts</a>, on the Jazz project that I work on, we&#8217;ve (finally) fallen in love with the web/REST story. Because of this, we spend a lot of time in technical conversations using the standard REST alphabet soup vocabulary you&#8217;d expect &#8211; HTTP, XML, JSON, REST, URL, URI, etc.</p>
<p>One funny thing I&#8217;ve noticed is that there&#8217;s a certain conversational dance that goes on when the topic of URLs/URIs come up. For 99.9% of the web developers out there the distinction between &#8220;URL&#8221; and &#8220;URI&#8221; doesn&#8217;t matter, as <a href="http://en.wikipedia.org/wiki/Uniform_Resource_Locator">the Wikipedia entry on URL</a> points out:</p>
<blockquote><p>In popular usage and many technical documents, [URL] is a <a title="Synonym" href="http://en.wikipedia.org/wiki/Synonym">synonym</a> for <a title="Uniform Resource Identifier" href="http://en.wikipedia.org/wiki/Uniform_Resource_Identifier">Uniform Resource Identifier</a> (URI).</p></blockquote>
<p>However, some people who are a bit more pedantic than others care about the distinction (not me!) and tend to use &#8220;URI&#8221; in favor of &#8220;URL&#8221; when talking about REST stuff. People who are a bit new to the REST stuff on the other hand tend to use &#8220;URL&#8221;, since this term&#8217;s a bit older and a bit better known.</p>
<p>I&#8217;ve observed that when a REST newbie talks with one of the REST pedants, the newbie says &#8220;URL&#8221; while the REST dude uses &#8220;URI&#8221;. But as the conversation continues the REST n00b eventually uses &#8220;URI&#8221; &#8211; essentially deferring to and adopting the more knowledgeable person&#8217;s terminology.</p>
<p>I&#8217;ve also observed that when I talk with one of our REST dudes, if I continuously say &#8220;URL&#8221; (usually out of spite &#8211; I&#8217;m KIDDING!), they usually eventually start saying &#8220;URL&#8221;, I think just to bring more harmony to the conversation and because they realize that the distinction isn&#8217;t that important &#8211; probably simple <a href="http://en.wikipedia.org/wiki/Mirroring_(psychology)">mirroring</a> at play.</p>
<p>I think in a future experiment, I will use the opposite term of whatever the other person (newbie or pedant) uses and as soon as they adopt my terminology I&#8217;ll switch back to the other term, and see what happens.</p>
<p>Should be fun.</p>
]]></content:encoded>
			<wfw:commentRss>http://billhiggins.us/blog/2008/07/09/the-awkward-url-uri-terminology-dance/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>from Windows to Ubuntu</title>
		<link>http://billhiggins.us/blog/2008/06/29/from-windows-to-ubuntu/</link>
		<comments>http://billhiggins.us/blog/2008/06/29/from-windows-to-ubuntu/#comments</comments>
		<pubDate>Sun, 29 Jun 2008 15:29:27 +0000</pubDate>
		<dc:creator>Bill Higgins</dc:creator>
				<category><![CDATA[personal]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://billhiggins.us/weblog/?p=78</guid>
		<description><![CDATA[Well, as we mentioned over on the Jazz Team Blog, my Jazz teammates and I just shipped Rational Team Concert 1.0, the first GA product built on the Jazz Platform. More on that later.
Since I&#8217;ve been working on what became Rational Team Concert for the last three years, I&#8217;ve gotten into quite a groove with [...]]]></description>
			<content:encoded><![CDATA[<p>Well, as <a title="Rational Team Concert 1.0 Ships - Jazz Team Blog" href="https://jazz.net/blog/index.php/2008/06/26/rational-team-concert-1-0-ships/">we mentioned over on the Jazz Team Blog</a>, my Jazz teammates and I just shipped <a title="Rational Team Concert page (ibm.com)" href="http://www.ibm.com/software/awdtools/rtc/">Rational Team Concert</a> 1.0, the first GA product built on the <a title="Jazz.net Community Site" href="http://jazz.net/">Jazz</a> Platform. More on that later.</p>
<p>Since I&#8217;ve been working on what became Rational Team Concert for the last three years, I&#8217;ve gotten into quite a groove with regards to the technologies that I use and how I use them. But there were a couple of things I didn&#8217;t like and I promised myself that I&#8217;d fix them once we shipped and I could spare a few days of being less than 100%.</p>
<p>Chief among these &#8220;things I&#8217;d like to change when I have the time&#8221; was my use of <a title="Windows XP @ Wikipedia" href="http://en.wikipedia.org/wiki/Windows_XP">Windows XP</a> as my operating system. For quite a while I was happy to use WinXP &#8211; mainly because I knew how to use it and IBM&#8217;s internal set of applications are optimized for Windows XP users. And when I say &#8220;optimized&#8221; here I mean in the sense of lack of barriers &#8211; available, tested, and supported.</p>
<p>But after the past couple of years as I got more into web development, I started to experience some pain as a WinXP user because it seems like most of the interesting web technologies are optimized for Linux or Mac users, and for Windows users there&#8217;s usually a short appendix in the doc that says &#8220;If you are unfortunate enough to use Windows, the following has been said to work&#8230;&#8221;</p>
<p>So the day after we declared bit freeze on Team Concert, I downloaded a <a title="Ubuntu Home Page" href="http://www.ubuntu.com/">Ubuntu</a> ISO CD image, burned that, backed up my data, then formatted my hard drive and installed Linux.</p>
<p>The remainder of this entry I&#8217;ll write in <a title="Steve O'Grady of Redmonk" href="http://www.redmonk.com/sogrady/">Steve O&#8217;Grady</a> Q&amp;A format so I don&#8217;t have to think in full paragraphs <img src='http://billhiggins.us/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><strong>Q:</strong> How did the installation go?<br />
<strong>A: </strong>It was truly easy. Just insert the CD, restart my Thinkpad, and let the Ubuntu installer do its thing. The last time I tried to install Linux was probably about 5 years ago and I remember it asking me all kinds of questions for which I didn&#8217;t know the answer. I don&#8217;t even recall Ubuntu asking me any questions, and if they did they must have been trivial because I don&#8217;t remember them.</p>
<p><strong>Q: </strong>What was your first impression of the user experience?<br />
<strong>A:</strong> I was really impressed. After installing just rebooted, logged in, and I was in a windowing system which was very easy to understand. The top panel has three simple, logical menus (Applications, Places, System), shortcuts to key programs, then the right side of the top menu has iconographic shortcuts to some important system applications (networking, sound, date time, system control). The bottom panel just lists the open programs and has some other miscellaneous controls related to desktop management (minimize all windows, switch between desktop, etc.)</p>
<p>My biggest takeaway on the window manager user experience is that it seems like they&#8217;ve taken care to strip out as much low-value cruft and redundancy as possible, so that you&#8217;re left with a small set of orthogonal, useful controls.</p>
<p><strong>Q: </strong>Any problems?<br />
<strong>A:</strong> There were two sets of problems: 1) Finding and learning the Linux equivalent for simple Windows programs like Notepad and Paint. 2) Getting IBM stuff to work that was mainly developed and tested for Windows and/or Internet Explorer web browser. To get over these humps I bought a license for VMWare and spent much of my first week within a Windows XP virtual machine. Luckily VMWare&#8217;s networking worked much better than I remember it working, so between VMWare and the Windows XP image with VPN and Lotus Notes, I could get basic things done like work email from home.</p>
<p>Luckily my Jazz colleague Matt Lavin has been using Ubuntu for over a year, so he was able to help me learn how to do some basic but important things like connect my system to the internal Debian package server.</p>
<p>I&#8217;m still having problems using Open Office vs. Microsoft Office. When I modified a Powerpoint file in Open Office, it ended up getting mangled back in Powerpoint. I&#8217;m not sure who&#8217;s fault it was, but it sure was frustrating. I may look into running emulated MS Office on Linux.</p>
<p><strong>Q:</strong> Why Linux instead of a Mac?<br />
<strong>A: </strong>Because I already have an iMac that I use a lot at home and also I have a very nice laptop from work (Thinkpad T60p) so I didn&#8217;t see the point of junking it and spending $3,000 for a new PowerBook.</p>
<p><strong>Update</strong>: Added an additional question and answer below</p>
<p><strong>Q:</strong> IBM provides a standard Linux distribution (Client for eBusiness, or C4eB) based on Redhat Linux. Why did you instead use a custom Ubuntu install?<br />
<strong>A:</strong> Several reasons:</p>
<ol>
<li>I didn’t know such a distribution existed. Though I had been meaning to switch to Linux for quite a while, I never seriously researched it, and the final decision to switch and the actual switch happened over the course of about 3 hours on a random Saturday afternoon. As mentioned before, it was incredibly easy to find, get, and install the latest Ubuntu.</li>
<li>I was influenced by some friends and colleagues in the development community (particularly the web development community) who strongly recommended Ubuntu.</li>
<li>One of my goals is to learn more about Linux, so I don’t mind some of the pain of making things work.</li>
<li>Even if I had known about it, I probably wouldn’t have used it, because in my experience, internal IBM standard distributions install way more software than I actually need, which is understandable since they need to provide a generally useful package for lots of people. I’d rather just install the stuff I need for development and then non-optional &#8220;I work at IBM&#8221; software such as Notes and the AT&amp;T Network Client.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://billhiggins.us/blog/2008/06/29/from-windows-to-ubuntu/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>RIA weekly podcast and errata</title>
		<link>http://billhiggins.us/blog/2008/02/18/ria-weekly-podcast-and-errata/</link>
		<comments>http://billhiggins.us/blog/2008/02/18/ria-weekly-podcast-and-errata/#comments</comments>
		<pubDate>Mon, 18 Feb 2008 19:51:51 +0000</pubDate>
		<dc:creator>Bill Higgins</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[meta]]></category>

		<guid isPermaLink="false">http://billhiggins.us/weblog/2008/02/18/ria-weekly-podcast-and-errata/</guid>
		<description><![CDATA[Last Friday I did an RIA weekly podcast (mp3) with Michael Coté of Redmonk and Ryan Stewart of Adobe. This was a fun and interesting experience. Fun because I like Coté and Ryan a great deal and enjoy talking to them and interesting because of the subject matter and also because it was the first [...]]]></description>
			<content:encoded><![CDATA[<p>Last Friday I did an RIA weekly podcast (<a href="http://media.libsyn.com/media/redmonk/riaweekly007.mp3" title="RIA Weekly Episode #7: Ajax with Jazz, Web-native Interfaces, Power Users in RIA, Blu-ray, iPhone Rumors">mp3</a>) with <a href="http://www.redmonk.com/cote/" title="Coté's weblog: People Over Process">Michael Coté</a> of <a href="http://www.redmonk.com/" title="Redmonk Home Page">Redmonk</a> and <a href="http://blog.digitalbackcountry.com/" title="Ryan Stewart's Weblog: Rich Internet Application Mountaineer">Ryan Stewart</a> of <a href="http://www.adobe.com/" title="Adobe Homepage">Adobe</a>. This was a fun and interesting experience. Fun because I like Coté and Ryan a great deal and enjoy talking to them and interesting because of the subject matter and also because it was the first podcast I&#8217;ve ever done.</p>
<p>There were a few things I said in the podcast for which I&#8217;d like to provide a bit of extra context, because it&#8217;s difficult in the podcast format to provide a great deal of context.</p>
<p><em>Network Transparency and Latency</em></p>
<p>At one point in the podcast, I talk about <a href="http://jazz.net/" title="Jazz.net">Jazz</a>&#8217;s early RPC-style web services and say something along the lines of &#8220;This is great for the Java client developers because they essentially get network transparency, which is awesome except for the latency.&#8221; This is sort of like saying &#8220;Not paying income tax is great, except for the eventual fines and imprisonment.&#8221; RPC-style interfaces that strive to provide network transparency have the unusual problem that they make remote connectivity <em>too easy</em> for developers. The result, which is almost a cliché, is that developers design applications which are way too chatty and which work fine on local area networks (the environment in which they are developed) but fall apart in wide area networks (the environments in which they are deployed). Later, in the clichéd scenario, the developers learn about explicitly designing the &#8220;stuff&#8221; that travels over the wire to provide a good balance between the needs of the application and the realities of the network.</p>
<p>Sometimes you just shouldn&#8217;t make things too easy. Like you shouldn&#8217;t put the car&#8217;s ejector seat button where the toddlers can reach it <img src='http://billhiggins.us/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><em>Why We Didn&#8217;t Consider Flash as the Basis for the Jazz Web UI Infrastructure<br />
</em></p>
<p>At another point, Ryan asked me if we ever considered Flash and I said something along the lines of &#8220;Well we didn&#8217;t select <a href="http://www.adobe.com/products/flash/" title="Flash (Adobe.com)">Flash</a> because it wasn&#8217;t as ubiquitous as the standalone browser&#8221; but after saying this I remember Pat Mueller telling me recently that Flash is the most widely deployed web client technology when you compare it against particular browsers (i.e. browsers in general are more widely deployed than Flash, but Flash is more widely deployed than any particular browser like <a href="http://www.microsoft.com/windows/products/winfamily/ie/default.mspx" title="Internet Explorer: Home Page">Internet Explorer</a> or <a href="http://www.mozilla.com/en-US/firefox/" title="Firefox Home Page">Firefox</a>). So though my memory is a little fuzzy, I believe the reason was that just as a general principle, we didn&#8217;t want any core Web UI application functionality depedning on a particular plug-in; for instance, the user shouldn&#8217;t require Flash to create a bug report. Another factor was that this was early 2006 so Flash was probably not as ubiquitous as it is today. Yet another factor was our later principle that &#8220;look like a normal web page&#8221; and some examples of Flash violate this (i.e. the big box of Flash in the middle of the page, or overly ambitious site welcome screens). But I have to say, my thoughts on Flash have really changed over the past two years, because I&#8217;ve seen some incredibly useful, subtle applications of it. I can&#8217;t think of a particular example, but I know a couple of times some page on Amazon.com had a really cool little visual effect and sure enough when I right-clicked it turned out to be a little Flash app seamlessly embedded in the page. So using Flash in tactical ways where it can provide a powerful but non-jarring user experience is something I would like to explore in the future.</p>
<p><em>Meeting with the WebSphere Application Server Folks</em></p>
<p>At one point early in the interview Coté mentions that we hung out and got drinks in Austin one night and I mentioned that I was down for a meeting with some WebSphere Application Server folks and it was also a good opportunity to meet with Coté which is why I accepted the meeting. Listening to the podcast, I feel bad about how this came out because in reality the WebSphere App Server folks were doing us a favor by taking a day off to review the security architecture of Jazz.net and indeed they pointed out both important security and scalability issues. The missing context is that I <em>hate</em> work travel (I repeat <em>hate</em>) because I have two toddlers and they just grow too much and we miss each other too much when I travel without them. So the only time I travel for work is if I really need to be there in person (like if I&#8217;m speaking at a conference) or if I can accomplish more than one goal with a single trip. If not for the chance to both do the Jazz.net review <em>and</em> meet Coté, who  in my opinion (don&#8217;t blush Coté) is both a cool guy and important industry analyst, I would have probably called in.</p>
<p><em>Innovation vs. Standardization</em></p>
<p>At another point in the podcast, I mention <a href="http://alex.dojotoolkit.org/?p=642" title="Alex Russell: The W3C Cannot Save Us">a blog post</a> by <a href="http://alex.dojotoolkit.org/" title="Alex Russell's Weblog: Continuing Intermittent Incoherency">Alex Russell</a> of <a href="http://dojotoolkit.org/" title="The Dojo Toolkit">Dojo</a> where he talks about standards not saving us and encourages browser vendors to provide non-standard innovative features. I think in the podcast I may have come across as &#8220;standards don&#8217;t matter&#8221;. In fact I think standardization is important to build the applications of today but agree with Alex and that the future won&#8217;t be invented by standards bodies.</p>
<p><em>Finally&#8230;</em></p>
<p>Otherwise I agree with everything I said <img src='http://billhiggins.us/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://billhiggins.us/blog/2008/02/18/ria-weekly-podcast-and-errata/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
<enclosure url="http://media.libsyn.com/media/redmonk/riaweekly007.mp3" length="52021215" type="audio/mpeg" />
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.808 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2010-03-09 22:56:45 -->
