<?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, 30 Jul 2010 00:09:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>podcast and discussion with Coté</title>
		<link>http://billhiggins.us/blog/2010/07/29/podcast-and-discussion-with-cote/</link>
		<comments>http://billhiggins.us/blog/2010/07/29/podcast-and-discussion-with-cote/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 00:07:47 +0000</pubDate>
		<dc:creator>Bill Higgins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[friends]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[jazz]]></category>
		<category><![CDATA[cote]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[podcast]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://billhiggins.us/blog/?p=174</guid>
		<description><![CDATA[I had a fun chat today with Coté on his &#8220;make all&#8221; podcast. Here are some of the topics I remember discussing: What&#8217;s important (and what&#8217;s not important) about HTML 5 The increasing ubiquity of JavaScript Java-to-JavaScript translation technologies (e.g. GWT and JDojo) Ajax, RPC, and REST The nirvana of mobile devices plus cloud-based data [...]]]></description>
			<content:encoded><![CDATA[<p>I had a fun chat today with Coté on his <a href="http://www.redmonk.com/cote/2010/07/29/makeall007/">&#8220;make all&#8221; podcast</a>. Here are some of the topics I remember discussing:</p>
<ul>
<li>What&#8217;s important (and what&#8217;s not important) about <a href="http://en.wikipedia.org/wiki/HTML5">HTML 5</a></li>
<li>The increasing ubiquity of JavaScript</li>
<li>Java-to-JavaScript translation technologies (e.g. <a href="http://code.google.com/webtoolkit/">GWT</a> and <a href="https://jazz.net/wiki/bin/view/Main/JDojo">JDojo</a>)</li>
<li>Ajax, RPC, and REST</li>
<li>The nirvana of mobile devices plus cloud-based data</li>
<li>I recommend Nick Carr&#8217;s &#8220;<a href="http://www.theshallowsbook.com/">The Shallows</a>&#8220;</li>
</ul>
<p>Happy listening!</p>
]]></content:encoded>
			<wfw:commentRss>http://billhiggins.us/blog/2010/07/29/podcast-and-discussion-with-cote/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>the iPad and onmouseover</title>
		<link>http://billhiggins.us/blog/2010/04/05/the-ipad-and-onmouseover/</link>
		<comments>http://billhiggins.us/blog/2010/04/05/the-ipad-and-onmouseover/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 04:34:15 +0000</pubDate>
		<dc:creator>Bill Higgins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[ux]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://billhiggins.us/blog/?p=153</guid>
		<description><![CDATA[Update: I&#8217;ve created a test page for this scenario, but I haven&#8217;t had a chance to test it yet on my iPad. In our Jazz UIs, we tend to use &#8220;hover previews&#8221; quite a bit. That is, if you hover over a link, after a second or so it will show a small preview of [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ff0000;">Update</span><span style="color: #ff0000;">: I&#8217;ve created </span><a href="http://billhiggins.us/tests/link-mouseover.html"><span style="color: #ff0000;">a test page</span></a><span style="color: #ff0000;"> for this scenario, but I haven&#8217;t had a chance to test it yet on my iPad.</span></p>
<p>In our <a href="http://jazz.net/">Jazz</a> UIs, we tend to use &#8220;hover previews&#8221; quite a bit. That is, if you hover over a link, after a second or so it will show a small preview of the resource at the other end [1]. <a href="https://jazz.net/wiki/bin/view/Main/WebUIPatternAndStyleGuide">Jazz style guide</a> example below (copyright <a href="http://ibm.com/">IBM</a>).</p>
<p><img class="alignnone size-full wp-image-154" title="Jazz Rich Hover" src="http://billhiggins.us/blog/wp-content/uploads/2010/04/hyperlink-rich-resource-examp.png" alt="" width="539" height="291" /></p>
<p>This was always broken on the <a href="http://www.apple.com/iphone/iphone-3gs/safari.html">iPhone&#8217;s Mobile Safari browser</a> because I couldn&#8217;t figure out how to perform a mouseover action on a mouse-less interface.</p>
<p>I just noticed that the <a href="http://www.apple.com/ipad/">iPad</a> seems to support <a href="http://www.w3schools.com/jsref/event_onmouseover.asp">onmouseover</a>. I <em>believe</em> I&#8217;ve observed the following behavior:</p>
<ul>
<li>If a link has no &#8220;on mouseover&#8221; actions (e.g. hovers), a tap follows to the link.</li>
<li>If a link has an &#8220;onmouseover&#8221; action, a tap activates the onmouseover action and a double-tap follows the link.</li>
</ul>
<p>Obviously this implies that you should provide visual indications to your user whether the links provide onmouseover actions or not. For the Jazz links with hover previews we immediately decorate the link on mouseover (different color, double-underline, with a small chevron) and if the user remains over the link for a second or two we then show the preview.</p>
<p>[1] I realize that onmouseover actions attached to links represent a <a href="http://en.wikipedia.org/wiki/User_experience_design">UX</a> minefield. A page with too many / too aggressive hover actions can feel like an actual minefield!</p>
]]></content:encoded>
			<wfw:commentRss>http://billhiggins.us/blog/2010/04/05/the-ipad-and-onmouseover/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>adding a scripts folder to your path in bash</title>
		<link>http://billhiggins.us/blog/2010/03/26/adding-a-scripts-folder-to-your-path-in-bash/</link>
		<comments>http://billhiggins.us/blog/2010/03/26/adding-a-scripts-folder-to-your-path-in-bash/#comments</comments>
		<pubDate>Sat, 27 Mar 2010 03:02:10 +0000</pubDate>
		<dc:creator>Bill Higgins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[os-x]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://billhiggins.us/blog/?p=149</guid>
		<description><![CDATA[I know this is total n00b stuff but I always forget the particular so I thought I&#8217;d write it down in a blog entry. To add a custom scripts directory to your path, do the following: In your root directory, create a file called .bash_profile.sh with something like the following: if [ -f ~/.bashrc ]; [...]]]></description>
			<content:encoded><![CDATA[<p>I know this is total n00b stuff but I always forget the particular so I thought I&#8217;d write it down in a blog entry.</p>
<p>To add a custom scripts directory to your path, do the following:</p>
<p>In your root directory, create a file called <code>.bash_profile.sh</code> with something like the following:</p>
<pre>if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi</pre>
<p>Then in <code>.bashrc</code>, put something like the following:</p>
<pre>export PATH=$PATH:~/Scripts</pre>
<p>For extra credit, create a softlink from your <a href="https://www.dropbox.com/referrals/NTIyMDU2MjE5">Dropox</a> folder to your scripts folder and you can have the same scripts on all of your computers!</p>
<pre>ln -s ~/Scripts ~/Dropbox/Scripts</pre>
]]></content:encoded>
			<wfw:commentRss>http://billhiggins.us/blog/2010/03/26/adding-a-scripts-folder-to-your-path-in-bash/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<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 [...]]]></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>4</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>&#8216;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>1</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>&#8216;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 [...]]]></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 [...]]]></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>
	</channel>
</rss>

<!-- Dynamic page generated in 0.842 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2010-09-02 20:31:29 -->
