<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.0.3" -->
<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/"
	>

<channel>
	<title>Blogature</title>
	<link>http://blog.thinkature.com</link>
	<description>Designing Thinkature; web application and company.</description>
	<pubDate>Fri, 29 Dec 2006 06:04:41 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.3</generator>
	<language>en</language>
			<item>
		<title>Odd mouse handling with transparent objects under Internet Explorer 7</title>
		<link>http://blog.thinkature.com/index.php/2006/12/29/odd-mouse-handling-with-transparent-objects-under-internet-explorer-7/</link>
		<comments>http://blog.thinkature.com/index.php/2006/12/29/odd-mouse-handling-with-transparent-objects-under-internet-explorer-7/#comments</comments>
		<pubDate>Fri, 29 Dec 2006 06:04:41 +0000</pubDate>
		<dc:creator>Jon</dc:creator>
		
	<category>JavaScript</category>
	<category>InternetExplorer</category>
	<category>Bugs</category>
		<guid isPermaLink="false">http://blog.thinkature.com/index.php/2006/12/29/odd-mouse-handling-with-transparent-objects-under-internet-explorer-7/</guid>
		<description><![CDATA[Yes, folks, it&#8217;s going to be another one of those posts.
We discovered as soon as we (and our users) got their hands on Internet Explorer 7 that freehand drawing in Thinkature was misbehaving.  In particular, we learned that it was only possible to start a drawing in IE7 if the cursor were positioned on [...]]]></description>
			<content:encoded><![CDATA[<p>Yes, folks, it&#8217;s going to be another one of <em>those</em> posts.</p>
<p>We discovered as soon as we (and our users) got their hands on Internet Explorer 7 that freehand drawing in <a title="Thinkature" href="http://thinkature.com/">Thinkature</a> was misbehaving.  In particular, we learned that it was only possible to start a drawing in IE7 if the cursor were positioned on top of some other object in the workspace.  After the drawing got started (that is, after the initial mousedown event had been handled), everything worked great.</p>
<p>This, naturally enough, caused some wailing and gnashing of teeth.  It turns out that the problem <strike>stems</strike> stemmed from a bug in how IE7 handles JavaScript mouse events (click, mousedown, mouseup, etc.) on transparent/invisible objects.  On a blank page, objects with a CSS &#8216;background-color&#8217; property set to &#8216;transparent&#8217; or not set at all will not be able to receive mouse events.  If that were the entirety of the issue, though, this wouldn&#8217;t be a very interesting problem (at least as far as IE bugs go).</p>
<p>Needless to say, there&#8217;s a twist.  If there&#8217;s a non-transparent object below the transparent object, the transparent object becomes clickable within the bounding box of the object below it.  Here&#8217;s a diagram to illustrate the idea:</p>
<div style="text-align: center"><img alt="Diagram of clickable area" id="image33" src="http://blog.thinkature.com/wp-content/uploads/2006/12/clickable-area.png" /></div>
<p>In the diagram above the transparent object <strong>will</strong> respond to mouse events, but only if those events occur over the red box underneath the transparent image.  But wait!  There&#8217;s another catch!  Suppose the non-transparent object underneath the transparent object is actually an image (i.e. an img tag).  Will the transparent object respond to mouse events over the image?  Nope!  This only works if the non-transparent object is an opaque (or at least not totally transparent) DOM object that is not an image.</p>
<p>And there&#8217;s one more exciting twist to cover.  Suppose you assigned a background color to the formerly transparent object, but set its opacity to zero.  In IE7, a colored-but-zero-opacity object will receive mouse events just fine.  If my memory serves me correctly (and it may not), mouse events <strong>won&#8217;t</strong> reach a zero-opacity object in basically any other browser on the planet.  The fix for IE7, then, breaks all other browsers.  And so the saga continues.</p>
<p>The moral of today&#8217;s story?  If you need to handle JavaScript mouse events directed at a transparent object under IE7, you&#8217;ll need to make it transparent by (a) assigning it a solid background color and then (b) setting its opacity to zero.  Setting &#8216;background-color: transparent;&#8217; will <strong>not</strong> work, but the zero-opacity solution may break mouse events in other browsers, so you&#8217;ll need to implement some degree of browser detection to make things happy.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://blog.thinkature.com/index.php/2006/12/29/odd-mouse-handling-with-transparent-objects-under-internet-explorer-7/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Jon interviewed by Yahoo!</title>
		<link>http://blog.thinkature.com/index.php/2006/12/14/jon-interviewed-by-yahoo/</link>
		<comments>http://blog.thinkature.com/index.php/2006/12/14/jon-interviewed-by-yahoo/#comments</comments>
		<pubDate>Fri, 15 Dec 2006 02:19:05 +0000</pubDate>
		<dc:creator>Jon</dc:creator>
		
	<category>Web</category>
	<category>JavaScript</category>
	<category>Yahoo</category>
	<category>YUI</category>
		<guid isPermaLink="false">http://blog.thinkature.com/index.php/2006/12/14/jon-interviewed-by-yahoo/</guid>
		<description><![CDATA[I had the privilege of speaking with Eric Miraglia of Yahoo! earlier this week, and they&#8217;ve just posted the interview on the Yahoo! User Interface Blog.  Eric works with the Presentation Platform Engineering team, which produces the Most Excellent(tm) YUI Library and Design Pattern Library.  We use YUI extensively throughout the Thinkature application [...]]]></description>
			<content:encoded><![CDATA[<p>I had the privilege of speaking with Eric Miraglia of Yahoo! earlier this week, and they&#8217;ve just <a title="Screencast: Jon Chambers of Thinkature on Developing with YUI" href="http://yuiblog.com/blog/2006/12/14/thinkature-screencast/">posted the interview</a> on the <a title="Yahoo! User Interface Blog" href="http://yuiblog.com/blog/">Yahoo! User Interface Blog</a>.  Eric works with the Presentation Platform Engineering team, which produces the Most Excellent(tm) <a title="Yahoo! UI library (YUI)" href="http://developer.yahoo.com/yui/">YUI Library</a> and <a title="Yahoo! Design Pattern Library" href="http://developer.yahoo.com/ypatterns/">Design Pattern Library</a>.  We use YUI extensively throughout the <a title="Thinkature" href="http://thinkature.com/">Thinkature</a> application and web site, and I have only nice things to say about it (and I&#8217;ll say them in a future post).  I also have to say that I&#8217;m totally flattered to be included in the ranks of people interviewed by the YUI team, a list comprised of many of the rock stars of modern web development.</p>
<p>The video is available on the YUI blog, and there&#8217;s also <a title="High-resolution interview video" href="http://yuiblog.com/assets/thinkature.mov">a high-res version</a> available courtesy of Yahoo!; we hope you enjoy it!
</p>
]]></content:encoded>
			<wfw:commentRSS>http://blog.thinkature.com/index.php/2006/12/14/jon-interviewed-by-yahoo/feed/</wfw:commentRSS>
<enclosure url='http://yuiblog.com/assets/thinkature.mov' length='7713317' type='video/quicktime'/>
		</item>
		<item>
		<title>Flash-to-JavaScript communication with a streaming HTTP connection in Internet Explorer</title>
		<link>http://blog.thinkature.com/index.php/2006/12/10/flash-to-javascript-communication-with-a-streaming-http-connection-in-internet-explorer/</link>
		<comments>http://blog.thinkature.com/index.php/2006/12/10/flash-to-javascript-communication-with-a-streaming-http-connection-in-internet-explorer/#comments</comments>
		<pubDate>Sun, 10 Dec 2006 22:21:36 +0000</pubDate>
		<dc:creator>Jon</dc:creator>
		
	<category>JavaScript</category>
	<category>Flash</category>
	<category>InternetExplorer</category>
	<category>Bugs</category>
	<category>HTTP</category>
	<category>Streaming</category>
		<guid isPermaLink="false">http://blog.thinkature.com/index.php/2006/12/10/flash-to-javascript-communication-with-a-streaming-http-connection-in-internet-explorer/</guid>
		<description><![CDATA[Whew.  I&#8217;m tempted to come up with a shorter title for this post, but I think &#8220;Flash-to-JavaScript communication with a streaming HTTP connection in Internet Explorer&#8221; appropriately and specifically defines the problem (which I&#8217;m sure people run into all the time).  I digress.
If you&#8217;re interested in the Hot New AJAX Web 2.0 Ethernet [...]]]></description>
			<content:encoded><![CDATA[<p>Whew.  I&#8217;m tempted to come up with a shorter title for this post, but I think &#8220;Flash-to-JavaScript communication with a streaming HTTP connection in Internet Explorer&#8221; appropriately and specifically defines the problem (which I&#8217;m sure people run into <em>all the time</em>).  I digress.</p>
<p>If you&#8217;re interested in the Hot New AJAX Web 2.0 Ethernet Cyber Monorail Page Technology, you&#8217;ve probably heard of using long-lived HTTP connections for server-to-client communication in web applications.  The technique (sometimes called &#8220;Comet&#8221; or &#8220;server-push&#8221;) is based on the idea that browsers will execute complete chunks of JavaScript as they&#8217;re received rather than waiting for the connection to close.  The process begins when a client requests a resource (we&#8217;ll call it /stream).  The server begins to respond to the request, sending along all of the appropriate headers, but then keeps the connection open (as opposed to notifying the client that it&#8217;s done sending content).  As things happen during the application session, the server writes fully-formed <code>script</code> tags to the open connection in order to send notifications to the client.</p>
<p>The advantages to this approach have been <a href="http://alex.dojotoolkit.org/?p=545">discussed in detail</a> elsewhere, but the biggest one (particularly for <a title="Thinkature" href="http://thinkature.com/">Thinkature</a>) is that it&#8217;s a very low-latency way to communicate.  Were it not for the server-to-client stream, the client would have to poll the server at regular intervals to find out if anything new had happened.  The process of polling introduces some inherent latency, and it also adds to overhead through opening and closing connections and complicates synchronization (there&#8217;s no guarantee that messages will arrive in the order you expect them to).</p>
<p>One of the big problems with this approach is that it&#8217;s not yet well-understood.  Strange problems pop up that nobody&#8217;s run into before, and there&#8217;s nowhere to turn for help.  In adding <a href="http://blog.thinkature.com/index.php/2006/12/08/voice-chat-added-to-thinkature/">voice chat</a> to Thinkature, we ran into one of those problems.  Our voice chat client is a small Flash movie that&#8217;s embedded in the Thinkature workspace.  It notifies the workspace of events (user joins voice chat, begins speaking, stops speaking, etc.) via an <a href="http://www.quirksmode.org/js/flash_call.html">ActionScript-to-JavaScript call</a>.  We discovered that whenever the voice chat client sent a message to the workspace server, Internet Explorer (and only IE &#8212; all other browsers were fine) would drop its streaming connection to the server.  This was, obviously, unacceptable.</p>
<p>Flash-to-JavaScript communication works most reliably by calling the ActionScript <code><a title="getURL" href="http://livedocs.macromedia.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?href=00001730.html">getURL</a></code> method with a <code>javascript:</code> link.  After a <strong>lot</strong> of unsuccessful experiments, I hypothesized that IE treats <code>javascript:</code> URLs the same way as links to other pages: by preparing to leave the current page and closing any open connections.  I&#8217;m not sure that&#8217;s strictly true, but I get the feeling that it&#8217;s something along those lines.  In any event, I wondered if sending the JavaScript &#8220;impulse&#8221; to a frame inside the main document would prevent IE from &#8220;navigating away&#8221; from the workspace and dropping the streaming connection.</p>
<p>I created an invisible frame inside of the workspace and began sending ActionScript-to-JavaScript messages to that frame instead of to the main frame.  Instead of calling &#8220;<code>handleEvent(...)</code>&#8220;, for example, I would call &#8220;<code>parent.handleEvent(...)</code>.&#8221;  To my pleasant surprise, it worked.  A diagram of the &#8220;bad&#8221; approach and the &#8220;good&#8221; approach is included below.</p>
<p><img alt="Flash-to-JavaScript communication diagram" id="image28" src="http://blog.thinkature.com/wp-content/uploads/2006/12/communication_diagram.png" /></p>
<p>So, in short, the message here is that sending Flash-to-JavaScript messages directly to the main frame of a streaming application under Internet Explorer causes a loss of stream connectivity.  The workaround we use for Thinkature is to embed a &#8220;dummy&#8221; frame in the main document that routes the messages safely to the main frame.</p>
<p>Again: whew.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://blog.thinkature.com/index.php/2006/12/10/flash-to-javascript-communication-with-a-streaming-http-connection-in-internet-explorer/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Voice chat added to Thinkature!</title>
		<link>http://blog.thinkature.com/index.php/2006/12/08/voice-chat-added-to-thinkature/</link>
		<comments>http://blog.thinkature.com/index.php/2006/12/08/voice-chat-added-to-thinkature/#comments</comments>
		<pubDate>Fri, 08 Dec 2006 16:38:02 +0000</pubDate>
		<dc:creator>Jon</dc:creator>
		
	<category>Technology</category>
		<guid isPermaLink="false">http://blog.thinkature.com/index.php/2006/12/08/voice-chat-added-to-thinkature/</guid>
		<description><![CDATA[We&#8217;re pleased to announce that we&#8217;ve added voice chat to Thinkature!
When you log into a workspace, you&#8217;ll notice a speaker button to the right of the user list.  Click on that button to get at the voice chat controls (join/leave voice chat, adjust microphone settings, etc.).  You&#8217;ll always be able to see who&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;re pleased to announce that we&#8217;ve added voice chat to <a title="Thinkature" href="http://thinkature.com/">Thinkature</a>!</p>
<p>When you log into a workspace, you&#8217;ll notice a speaker button to the right of the user list.  Click on that button to get at the voice chat controls (join/leave voice chat, adjust microphone settings, etc.).  You&#8217;ll always be able to see who&#8217;s talking, but you won&#8217;t be able to hear them (and they won&#8217;t be able to hear you) until you join the voice chat.</p>
<div style="text-align: center"><img id="image24" alt="Voice chat in action" src="http://blog.thinkature.com/wp-content/uploads/2006/12/voice-chat-screenshot.png" /></div>
<p>We&#8217;re really proud of voice chat, and think it&#8217;s a really great way to collaborate.  Unlike other voice chat systems, this one doesn&#8217;t require a ton of bandwidth, it doesn&#8217;t need any special software, and it most certainly doesn&#8217;t require making a long-distance phone call.  Everything runs seamlessly in your web browser.  We&#8217;d love to hear how it&#8217;s working out for you; please don&#8217;t hesitate to leave feedback or ask questions.</p>
<p>Thanks very much!
</p>
]]></content:encoded>
			<wfw:commentRSS>http://blog.thinkature.com/index.php/2006/12/08/voice-chat-added-to-thinkature/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Creators, Consumers, and What&#8217;s &#8220;Right?&#8221;</title>
		<link>http://blog.thinkature.com/index.php/2006/12/03/creators-consumers-and-whats-right/</link>
		<comments>http://blog.thinkature.com/index.php/2006/12/03/creators-consumers-and-whats-right/#comments</comments>
		<pubDate>Sun, 03 Dec 2006 05:03:48 +0000</pubDate>
		<dc:creator>drew</dc:creator>
		
	<category>Design</category>
	<category>Community</category>
		<guid isPermaLink="false">http://blog.thinkature.com/index.php/2006/12/03/creators-consumers-and-whats-right/</guid>
		<description><![CDATA[Part of what characterizes the Web 2.0 era is the close connection  between (and sometimes merging of) creators and consumers. This is part of what makes this era fundamentally different from previous ears. We&#8217;ve seen this all over, but primarily on the web. Blogs turn anyone into writers, and readers are only a comment [...]]]></description>
			<content:encoded><![CDATA[<p>Part of what characterizes the Web 2.0 era is the close connection  between (and sometimes merging of) creators and consumers. This is part of what makes this era fundamentally different from previous ears. We&#8217;ve seen this all over, but primarily on the web. Blogs turn anyone into writers, and readers are only a comment away from interacting with the author. Wikis merge producers and consumers in the creation of written documents. YouTube provided an effective forum for videographers (amateur or otherwise) to spread and get feedback on their work. This effect is visible across media, too. Henry Jenkins has written on this topic in great length in his <a href="http://www.amazon.com/Convergence-Culture-Henry-Jenkins/dp/0814742815">Convergence Culture book</a> (with respect to television and games, among others), and on his generally excellent (if somewhat overwhelming) <a href="http://www.henryjenkins.org/">blog</a>. Suffice to say that in this era, no matter your media, creators and consumers are always in close contact.</p>
<p>Generally, this has demystified the process of production. I&#8217;m always amused to hear Ron Moore of <a href="http://www.scifi.com/battlestar/">Battlestar Galactica</a> and his wife talking more or less directly to fans on the forums on his <a href="http://www.scifi.com/battlestar/downloads/podcast/season03/">podcast</a>. I&#8217;ve learned more about the process of creating a TV show from those podcasts than from any other source. The same is true for web applications - part of what got Jon and I started was a prevailing belief (fueled by reading about other people doing it) that there isn&#8217;t any particular magic to creating a web application. Certainly, there&#8217;s a lot of hard work and inspiration required, but it&#8217;s something that smart/competent people can do without being blessed by, I don&#8217;t know, the King Arthur of web applications. Hopefully we&#8217;ve done our very small part in making web application development appear a little less daunting, too.</p>
<p>The creator/consumer connection has also had a profound effect on how design is practiced. This is a well trodden topic, but one that came to mind over the past few days because of an excellent conversation with a journalist on the topic, <a href="http://www.escapistmagazine.com/issue/72/14">an article in The Escapist</a>, and being heavily involved in the question of new features with Jon.</p>
<p>As a starting point, I want to talk about <a href="http://www.escapistmagazine.com/issue/72/14">The Escapist article</a> and get off my chest what&#8217;s so ridiculous about Massey&#8217;s position. She argues that the hardcore game players that beta test games provide feedback from a position biased by their extensive experience with other games, lack of patience, and desire to create games for themselves. I certainly won&#8217;t contest that - early adopters in any media are a particular subset of an entire market that are not (necessarily) representative of the whole market. I would also agree that slavishly following feedback as it comes in is a bad idea. But Massey takes this one step further, claiming that &#8220;developers must learn to stick to their guns and see their visions through. Half-finished products are always going to inspire hate, and no mater how much it stings, making drastic changes in response to community complaints invites disaster.&#8221;</p>
<p>&#8230; What?</p>
<p>Jon and I will be the first to admit that <a href="http://www.thinkature.com">Thinkature</a> is not a &#8220;finished&#8221; project. There&#8217;s plenty left to do, and it may in fact be only half the application we envision, but that&#8217;s not a reason to &#8220;stick to [our] guns and see [our] visions through.&#8221; Massey is trying to conflate listening to users with &#8220;reactionary design&#8221;. I agree that good design isn&#8217;t about taking a poll among your users and blindly following the results. But I strongly disagree that involving users in the design process any earlier than in the polishing phase is a bad idea.</p>
<p>Good designers have the perspective and maturity to critically consider and integrate feedback. Formal design courses like to talk about this as abstracting tasks to goals and goals to values. For instance, I worked on a mailing list project a few years ago and it quickly became clear after talking to people that subscribing to mailing lists helped satisfy a few desires like &#8220;feeling connected to the community&#8221; and &#8220;showing off what I know&#8221;. A mailing list is just one way that they could fulfill those desires. This level of discussion is independent from conversations about where to put the &#8220;subscribe to list&#8221; button in the interface, but critically important to providing context to design decisions. Most generally, the question designers (should) ask themselves is &#8220;what does this person really want?&#8221; If you follow through on that thought, you might find that they want exactly what they&#8217;re asking for. Sometimes, though, it&#8217;s something else entirely. Maybe what they want is at odds with what your vision is. If that&#8217;s the case, listening to users doesn&#8217;t mean you have to do what they say all the time. Speaking for myself, when I&#8217;m in the consumer role instead of the creator role,  I&#8217;m usually just grateful to have a voice.</p>
<p>That&#8217;s not how Massey feels, though.</p>
<p>She recommends lying to users, more or less. I wanted to cut this quote down, but it&#8217;s just so juicy and ridiculous I had to include this section in full.</p>
<blockquote><p>The nefarious trick for videogame developers is to ignore their community without telling them. It&#8217;s evil, it&#8217;s underhanded, but if you can still fool the hardcore into buying into your brand, so much the better. In order to get them, they need to think they were only this far away from getting their names in the credits.It can be done. The trick is to have smart community relations people. These are people who can rationally use a message board to talk to players. There, they post, they discuss and they explain. They let the community know they&#8217;re reading and that they&#8217;re not wasting their time.</p>
<p>In reality, though, the community better be wasting their time. Community management is public relations when it&#8217;s at its best and cause for reactionary development when it&#8217;s at its worst.</p></blockquote>
<p>Part of a close creator/consumer relationship is about treating the people who appreciate what you&#8217;re creating with the utmost respect. Massey&#8217;s attitude is a relic of another era of software design - one mired in the belief that listening to users means giving up on effective, vision driven design. It has no place in modern ideas about web design, and I sincerely hope that no one takes her seriously on this particular topic. We at <a href="http://www.thinkature.com">Thinkature</a> certainly don&#8217;t.</p>
<p>This was kind of a long and critical post. I originally wanted to talk more about how Jon and I think about design and feedback, but my distaste for Massey&#8217;s article was such that I couldn&#8217;t keep it short. Alas. But fear not! I will have a more positive article soon.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://blog.thinkature.com/index.php/2006/12/03/creators-consumers-and-whats-right/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Cargo Cult Design</title>
		<link>http://blog.thinkature.com/index.php/2006/11/28/cargo-cult-design/</link>
		<comments>http://blog.thinkature.com/index.php/2006/11/28/cargo-cult-design/#comments</comments>
		<pubDate>Tue, 28 Nov 2006 15:36:14 +0000</pubDate>
		<dc:creator>drew</dc:creator>
		
	<category>Design</category>
		<guid isPermaLink="false">http://blog.thinkature.com/index.php/2006/11/28/cargo-cult-design/</guid>
		<description><![CDATA[While staring at http://www.microsoftshitbrick.com (a site not for work or for the turd-phobic), Jon said (of the Zune): &#8220;why do people still think imitating Apple will make them successful too? It&#8217;s like a design cargo cult.&#8221;
Quite so.
Apple has been an incredibly strong force in popularizing design in consumer electronics and beyond, starting with the original [...]]]></description>
			<content:encoded><![CDATA[<p>While staring at <a href="http://www.microsoftshitbrick.com">http://www.microsoftshitbrick.com</a> (a site not for work or for the turd-phobic), Jon said (of the Zune): &#8220;why do people still think imitating Apple will make them successful too? It&#8217;s like a design <a href="http://www.nthposition.com/thelastcargo.php">cargo cult</a>.&#8221;</p>
<p>Quite so.</p>
<p>Apple has been an incredibly strong force in popularizing design in consumer electronics and beyond, starting with the original iMac in 1998. Because good design practices (both in a technical, aesthetic, and business sense) became obvious to the general public coincidentally with Apple becoming successful again, outsiders who didn&#8217;t understand the deeper reasons for Apple&#8217;s success decided that &#8216;design&#8217; was what was going to set them apart too. The problem is, a lot of them didn&#8217;t really get it.</p>
<p>So instead of real design, we got a bizarre imitation of design of which the Zune is just the most recent and spectacular example. Just like islanders famously cleared landing strips and built bamboo radio towers to attract American cargo planes, companies like Microsoft are now imitating the branding (&#8221;<a href="http://www.flickr.com/photos/niallkennedy/301446868/">Hello from Seattle</a>?&#8221; Cute.), building an online store, and adding &#8220;social&#8221; features, expecting that commercial success will follow. I&#8217;m sure someone inside Microsoft said at some point during the design process &#8220;What would Apple do?&#8221; with a straight face. Maybe it even got used as an argument - &#8220;This is the right thing to do because Apple does it.&#8221;</p>
<p>But, of course, this isn&#8217;t how Apple does it (although the prospect of an Apple designer asking &#8220;what would we do?&#8221; is pretty amusing). Apple&#8217;s design process is, as far as I&#8217;ve read, a pretty idiosyncratic thing, but I&#8217;m pretty sure it doesn&#8217;t involve copying single parts of past designs and assuming that they can mish-mash them together to make another successful product. Products and services are holistic beasts that succeed or fail for lots of reasons, not because they look like past successful products.  It&#8217;s easy to mistakenly assume that technical details have shallow roots and can be tweaked without major consequences.  The Zune is evidence of precisely that phenomenon to the extent that it&#8217;s crashing while the iPod isn&#8217;t.</p>
<p>We&#8217;re trying to avoid this cargo cult design process in <a href="http://www.thinkature.com">Thinkature</a>. It can be surprisingly hard at times. A lot of interface design is rooted in copying best practices and taking advantage of interface metaphors that people are already familiar with. Still, it&#8217;s critically important to understand why existing interfaces are good, so you get the details right. Otherwise, you&#8217;re just another islander hoping that drinking afternoon tea and chatting politely about the weather is what made Western Civilization successful.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://blog.thinkature.com/index.php/2006/11/28/cargo-cult-design/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Escaping the JavaScript call stack with setTimeout</title>
		<link>http://blog.thinkature.com/index.php/2006/11/26/escaping-the-javascript-call-stack-with-settimeout/</link>
		<comments>http://blog.thinkature.com/index.php/2006/11/26/escaping-the-javascript-call-stack-with-settimeout/#comments</comments>
		<pubDate>Sun, 26 Nov 2006 04:39:17 +0000</pubDate>
		<dc:creator>Jon</dc:creator>
		
	<category>Technology</category>
	<category>Web</category>
	<category>JavaScript</category>
		<guid isPermaLink="false">http://blog.thinkature.com/index.php/2006/11/26/escaping-the-javascript-call-stack-with-settimeout/</guid>
		<description><![CDATA[Setting up handlers that run after an event has fired is a tricky thing to do in JavaScript.  Suppose you&#8217;re trying to work with text as it&#8217;s being entered by a user.  As a silly example, suppose you wanted to have a &#60;div&#62; mirror the contents of a &#60;textarea&#62;.  You might try [...]]]></description>
			<content:encoded><![CDATA[<p>Setting up handlers that run <strong>after</strong> an event has fired is a tricky thing to do in JavaScript.  Suppose you&#8217;re trying to work with text as it&#8217;s being entered by a user.  As a silly example, suppose you wanted to have a <code>&lt;div&gt;</code> mirror the contents of a <code>&lt;textarea&gt;</code>.  You might try something like this:</p>
<textarea name="code" class="javascript:nocontrols:nogutter" cols="60" rows="10">textarea.onkeypress = function() { outputDiv.innerHTML = textarea.value; };</textarea>
<p>&#8230;but what you&#8217;d find is that the output <code>&lt;div&gt;</code> always lags behind the textarea by one keystroke.  This is actually by design, and not a bug.  The idea is that event handlers should have veto power over the event.  By fiddling with the <code>stopPropagation</code> and <code>preventDefault</code> properties/functions, it&#8217;s possible to prevent the keystroke from being handled by the browser.  It&#8217;s only after all of the handlers for an event have fired &#8212; and none of them have stopped the event &#8212; that the event actually takes effect.</p>
<p>The downside of the give-event-handlers-the-power-to-stop-events design is that it&#8217;s difficult to have a handler take effect after the event has already finished and been &#8220;accepted.&#8221;  In the <code>textarea</code>-to-<code>div</code> mirroring example this isn&#8217;t a huge problem.  There are plenty of workarounds.  It&#8217;s possible, for example, to pull the character code out of the event, append that to the string from the textarea&#8217;s <code>value</code> property, and work from there.  There are cases, though, where that&#8217;s not possible or not practical.</p>
<p>The situation, in a nutshell, is this: because the event doesn&#8217;t take effect until the event-handling call stack opens and closes completely, there&#8217;s no way to work in a post-event environment via conventional event handlers.  Whew.  It&#8217;s not possible (as near as I can tell) to circumvent the closing call stack requirement, so instead we have to work with it &#8212; or around it.</p>
<p>The trick I usually use it to call <code>setTimeout</code> with a delay of 0.  For example, I&#8217;ll do something like this:</p>
<textarea name="code" class="javascript:nocontrols:nogutter" cols="60" rows="10">textarea.onkeypress = function() { setTimeout(function() { outputDiv.innerHTML = textarea.value; }, 0); };</textarea>
<p>What that does is wait for the current call stack to close, then opens a new one in which the &#8220;real&#8221; event handler (<code>outputDiv.innerHTML = textarea.value;</code>) executes.  Because the handler runs after the event-initiated call stack closes, the event has already taken place and <code>textarea.value</code> will be in a post-event state.  Everything will work as originally intended, and the <code>outputDiv</code> will mirror whatever is currently in the <code>textarea</code>, rather than lagging one step behind.</p>
<p>This works because JavaScript is (at least in every implementation I&#8217;ve been able to get my hands on) not implemented as a multi-threaded language.  If the JavaScript engine is busy when it&#8217;s time for something to happen (be it an event handler or a timer), it starts to queue up backlogged tasks rather than executing them in parallel.  Once the current task (defined as the opening and closure of a single call stack) finishes, a new call stack is opened and the next task begins.  (Side note: my test code for this is a mess, but I&#8217;d be happy to clean it up and publish it if there&#8217;s interest).</p>
<p>What happens when we call something using <code>setTimeout</code> with a delay of 0 is that the JavaScript engine notices that it&#8217;s busy (with whatever task called <code>setTimeout</code>) and queues the <code>setTimeout</code> code for execution immediately after the current call stack closes.  In other words, it calls it as soon as possible in its own call stack.</p>
<p>I&#8217;ve found this technique to be useful in a few cases, and I&#8217;m sure there are more.  Here are a handful of the things I use it for:</p>
<ol>
<li>As mentioned above, I&#8217;ll often use <code>setTimeout(..., 0)</code> to set up post-event handlers.</li>
<li>Most browsers are smart enough not to apply DOM changes until a call stack closes.  For example, if a function changed an object&#8217;s color from red to green and then back to red, the browser would be smart enough to realize that there wasn&#8217;t any net change and that it shouldn&#8217;t really do anything.  I&#8217;ve found a few browser bugs, though, where it&#8217;s necessary to &#8220;poke&#8221; the DOM to make things appear correctly (particularly when scrolling with fixed-position elements).  My poking functions change the style one way with one call stack, and then immediately revert the change in another call stack, thereby forcing the browser to redraw the problem element.</li>
<li>Along the same lines, there are some things that can&#8217;t be done in a single call stack.  I&#8217;ve heard arguments that that&#8217;s the case for security reasons, but I don&#8217;t buy it.  As an example, I&#8217;ve had trouble programmatically spawning form fields with content and then focusing/selecting those fields in the same call stack.  Using the <code>setTimeout</code> trick, everything works just fine.</li>
</ol>
<p>There&#8217;s something of a black art to knowing when to use the <code>setTimeout</code> trick.  If you&#8217;ve ever found yourself in a situation where you can make something happen in response to user actions, but can&#8217;t make it happen in code, chances are that you need to escape the call stack somewhere.  As a rule, though, it doesn&#8217;t (shouldn&#8217;t) happen often.  I only use it in three or four places in <a href="http://thinkature.com/">Thinkature</a>, which is a very substantial piece of JavaScript.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://blog.thinkature.com/index.php/2006/11/26/escaping-the-javascript-call-stack-with-settimeout/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Web 2.0 Describes an Era, not a Genre</title>
		<link>http://blog.thinkature.com/index.php/2006/11/20/web-20-describes-an-era-not-a-genre/</link>
		<comments>http://blog.thinkature.com/index.php/2006/11/20/web-20-describes-an-era-not-a-genre/#comments</comments>
		<pubDate>Mon, 20 Nov 2006 06:21:49 +0000</pubDate>
		<dc:creator>drew</dc:creator>
		
	<category>Design</category>
	<category>Technology</category>
	<category>Web</category>
		<guid isPermaLink="false">http://blog.thinkature.com/index.php/2006/11/20/web-20-describes-an-era-not-a-genre/</guid>
		<description><![CDATA[Jon and I were answering some interview questions for an email interview we’re doing with the folks over at VoodooVentures a few days ago. One of their questions was about how we defined Web 2.0 and whether we thought we were a Web 2.0 application. The idea of Web 2.0 has bugged us for a [...]]]></description>
			<content:encoded><![CDATA[<p>Jon and I were answering some interview questions for an email interview we’re doing with the folks over at <a href="http://voodooventures.com/">VoodooVentures</a> a few days ago. One of their questions was about how we defined Web 2.0 and whether we thought we were a Web 2.0 application. The idea of Web 2.0 has bugged us for a long time, but we could never really put our finger on why. Working on the answer for their interview focused our thinking, and I thought I would share what we talked about. You’ll see an abbreviated version of this in our VoodooVentures <a title="interview" href="http://www.voodooventures.com/2006/11/21/thinkaturecom-the-idea-fuel-interview/">interview</a>, but the long version is below.</p>
<p>As far as we’re concerned, Web 2.0 defines an era. When people try to put together functional descriptions of what a Web 2.0 application is, the end result is that they don’t exclude a whole lot of applications developed in the past 3 years. Web 2.0 encompasses too many ideas ranging from usability to social software to business models to specific technologies to really be meaningful. It turns out that most modern web applications include some of these ideas.</p>
<p>This is not to say that the term Web 2.0 is useless. History is frequently divided into temporal segments. In culture and fashion, we commonly talk about 90’s bands, 80’s hairstyles, or Victorian literature. Web 2.0 is just another way of separating the history of web applications.  That’s great - we need those terms to understand the field in which we work.</p>
<p>The other bit of evidence that points towards Web 2.0 being an era term not a genre term is the inevitability of its death. Last week, the <a href="http://www.nytimes.com/2006/11/12/business/12web.html?ex=1320987600&#038;en=a54d6971614edc62&#038;ei=5090&#038;partner=rssuserland&#038;emc=rss">NY Times reported on the future of Web 3.0</a> (which we disagree with, but that’s beside the point) and various articles use the term Web 1.0 disparagingly to imply “old”. It would be crazy to claim that genres have this inevitable march of progress in the way people talk about Web 3.0 coming after Web 2.0. You couldn’t (seriously) claim that rock deterministically lead to grunge which deterministically lead to rap-rock. You can trace inspirations, sure, but that’s not linear “this is better than what came before” progress. Even the name &#8220;Web 2.0&#8243; implies monotonic positive progress by using software versioning as its basic metaphor, which is also an era term.</p>
<p>Somewhat orthogonal to era, we also describe ideas/art/scholarship/music by genre; for instance classical as a genre spans eras. It represents a somewhat different style now (eg Philip Glass) than it did two hundred years ago (eg Beethoven) but still shares some important thematic elements. So what’s always annoyed us is that Web 2.0 is often used as a genre term when it&#8217;s really an era term. It would be silly to ask Smashing Pumpkins if they’re a 90’s band in just the same way it’s silly to ask if Flickr is a Web 2.0 application. Of course they’re both members (and in some ways quintessential members) of their respective eras.</p>
<p>So yes, we are a Web 2.0 application. But not in the way we think most people understand Web 2.0.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://blog.thinkature.com/index.php/2006/11/20/web-20-describes-an-era-not-a-genre/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>The Cost of Adding New Features</title>
		<link>http://blog.thinkature.com/index.php/2006/11/16/the-cost-of-adding-new-features/</link>
		<comments>http://blog.thinkature.com/index.php/2006/11/16/the-cost-of-adding-new-features/#comments</comments>
		<pubDate>Thu, 16 Nov 2006 04:02:36 +0000</pubDate>
		<dc:creator>drew</dc:creator>
		
	<category>Design</category>
	<category>Technology</category>
		<guid isPermaLink="false">http://blog.thinkature.com/index.php/2006/11/16/the-cost-of-adding-new-features/</guid>
		<description><![CDATA[Here’s a conversation Jon and I have a lot: What is the incremental cost to the usability of our application if we add a specific new feature?
We think this is a critically important question when designing an interface. Thinkature is intentionally a really simply application. We offer fewer features than some of our competitors. Strategy, [...]]]></description>
			<content:encoded><![CDATA[<p>Here’s a conversation Jon and I have a lot: What is the incremental cost to the usability of our application if we add a specific new feature?</p>
<p>We think this is a critically important question when designing an interface. Thinkature is intentionally a really simply application. We offer fewer features than some of our competitors. Strategy, MBAs like to quip, is the art of deciding what not to do. Here’s what Thinkature doesn’t do: control line thickness, change fonts, draw hexagons, run filters on images, edit drawings, and draw straight lines. These are just a few of the features we’ve talked about adding and decided not to do so far. Certainly, there are a handful of people who’ve asked for each of those features. If we assume they’re representative we could make some small (but not non-zero) number of people happy by adding them. So why don’t we?</p>
<p>There are lots of reasons why not, but I’d like to focus on the cost of losing simplicity. It’s my basic belief that every feature we add to Thinkature comes with some cost to overall usability. Every added feature makes Thinkature slightly more overwhelming and confusing.</p>
<p>Now, it’s possible to make this cost approach zero. For instance, adding keyboard shortcuts is a nearly zero cost feature add. Adding another menu item to the “workspaces” menu (like export, which has always been destined to end up there eventually) would also be another nearly free feature add because the menu is still really short. But there are plenty of other feature additions that come with some clear cost to overall usability. For instance, if we added another button halo item (say, a copy button) that’s another icon users need to decode. Similarly, if we add a workspace feature like “manage invited users’ permissions,” that interface would need to get more complicated, and people who didn’t need that particular feature might get confused.</p>
<p>Now, I think both of those features are really useful, and both will probably happen, but we always ask ourselves what the incremental cost to the clarity and simplicity of our application will be, and whether the feature is good enough to be worth paying that cost. If you approach new features as not being “free,” you can avoid ending up with an application that looks like Word.</p>
<p>This attitude also changes the way we think about features. When we design new features, we have two jobs: make the feature effective, and make the incremental cost to overall usability as low as possible. Often, doing a good job on one of those questions means you’ve done a good job on the other, but we always try to think about both.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://blog.thinkature.com/index.php/2006/11/16/the-cost-of-adding-new-features/feed/</wfw:commentRSS>
		</item>
		<item>
		<title>Thinkature is hiring!</title>
		<link>http://blog.thinkature.com/index.php/2006/11/11/thinkature-is-hiring/</link>
		<comments>http://blog.thinkature.com/index.php/2006/11/11/thinkature-is-hiring/#comments</comments>
		<pubDate>Sat, 11 Nov 2006 18:21:41 +0000</pubDate>
		<dc:creator>drew</dc:creator>
		
	<category>Business</category>
	<category>Random</category>
		<guid isPermaLink="false">http://blog.thinkature.com/index.php/2006/11/11/thinkature-is-hiring/</guid>
		<description><![CDATA[We&#8217;re currently a two person operation, so we&#8217;re looking for someone (in the Boston area) who wants to get involved at the start of something we believe will be really great. This is an almost-founder like position, so it&#8217;s critical that you&#8217;re really excited about web applications, collaboration, and being involved in decisions about every [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;re currently a two person operation, so we&#8217;re looking for someone (in the Boston area) who wants to get involved at the start of something we believe will be really great. This is an almost-founder like position, so it&#8217;s critical that you&#8217;re really excited about web applications, collaboration, and being involved in decisions about every aspect of a young company. Here are some of the kinds of jobs we hope you could do:</p>
<ul>
<li>Do web design. (the usuals - HTML/CSS)</li>
<li>Hack on the client-side (we use Javascript in ways rarely seen on the web)</li>
<li>Enhance server-side functionality (our custom HTTP server is written in Python)</li>
<li>Test like a fiend on a variety of browser platforms (our current release supports all the major browsers)</li>
<li>Engage in high level design discussions about the direction of the product</li>
<li>Engage in low level design discussions about details of specific features</li>
<li>Develop relationships with potential future user groups</li>
<li>Run pilot deployments with specific user groups</li>
<li>Maintain community relations (writing on our <a href="http://blog.thinkature.com">blog</a>, reading/commenting on others, plus staying involved in our <a href="http://forums.thinkature.com">forum</a> and on our <a href="http://wiki.thinkature.com">wiki</a>)</li>
<li>Help us manage money and other administrative tasks</li>
</ul>
<p>We&#8217;re not expecting candidates to demonstrate experience in all of these areas, but the more of them you can demonstrate experience in, or reasons why you might be good at them, the better. More than anything else, though, we want to hire a smart, passionate, and flexible person.</p>
<p>If you&#8217;re interested, please get in touch with <a href="mailto:drew@thinkature.com">me</a> and we can start a dialogue. Feel free to include whatever supporting materials you think are appropriate for convincing us that you&#8217;d be a good fit.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://blog.thinkature.com/index.php/2006/11/11/thinkature-is-hiring/feed/</wfw:commentRSS>
		</item>
	</channel>
</rss>
