<?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>Aza on Design</title>
	<atom:link href="http://www.azarask.in/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.azarask.in/blog</link>
	<description>-- aza &#124; ɐzɐ --</description>
	<lastBuildDate>Tue, 24 Aug 2010 20:50:20 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Firefox Panorama: Tab Candy Evolved</title>
		<link>http://www.azarask.in/blog/post/designing-tab-candy/</link>
		<comments>http://www.azarask.in/blog/post/designing-tab-candy/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 17:15:20 +0000</pubDate>
		<dc:creator>Aza Raskin</dc:creator>
				<category><![CDATA[WEBLOG]]></category>

		<guid isPermaLink="false">http://www.azarask.in/blog/?p=1111</guid>
		<description><![CDATA[
I am happy to announce that Tab Candy is coming to Firefox 4. Starting today, Tab Candy will be called Firefox Panorama and be available as a feature in Firefox betas. Head to the Firefox 4 feature list, or watch the video below, to learn how to organize your tabs into groups and reclaim your [...]


Related posts:<ol><li><a href='http://www.azarask.in/blog/post/tabcandy/' rel='bookmark' title='Permanent Link: Tab Candy: Making Firefox Tabs Sweet'>Tab Candy: Making Firefox Tabs Sweet</a></li>
<li><a href='http://www.azarask.in/blog/post/firefox-31-control-tab-woes/' rel='bookmark' title='Permanent Link: Firefox 3.1: Control-Tab Woes'>Firefox 3.1: Control-Tab Woes</a></li>
<li><a href='http://www.azarask.in/blog/post/firefox-mobile-concept-video/' rel='bookmark' title='Permanent Link: Firefox Mobile Concept Video'>Firefox Mobile Concept Video</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<div class="pics left two"><img src="http://img.skitch.com/20100824-b8wm2m6xsx8p379if87druwau1.png" alt="" /></div>
<p>I am happy to announce that Tab Candy is coming to Firefox 4. Starting today, Tab Candy will be called <i>Firefox Panorama</i> and be available as a feature in Firefox betas. Head to the <a href="http://www.mozilla.com/firefox/beta/features">Firefox 4 feature list</a>, or watch the video below, to learn how to organize your tabs into groups and reclaim your browsing experience from clutter and information overload.</p>
<p><iframe src="http://player.vimeo.com/video/14364400?portrait=0&amp;color=cc6600" width="550" height="364" frameborder="0"></iframe><br />
<span id="more-1111"></span></p>
<p>Like many innovations, the ideas behind Panorama are a mashup of previous work. You can see roots in the <a href="http://www.azarask.in/blog/post/firefox-mobile-concept-video/">Firefox Mobile concept</a>, <a href="http://en.wikipedia.org/wiki/Zooming_user_interface">zooming user interfaces</a>, and <a href="http://en.wikipedia.org/wiki/Virtual_desktop">virtual desktops</a>.</p>
<p>While there are many directions still left to explore (some of which are covered in the Tab Candy <a href="http://vimeo.com/13560319"> announcement video</a>), there is a strong set of design principle that have and will continue to guide development. We&#8217;ve already seen activity from extension authors to extend the capabilities of Panorama, which makes now a perfect time to discuss Panorama&#8217;s design principles.</p>
<p><a href="http://www.mozilla.com/en-US/firefox/beta/"><img src="http://img.skitch.com/20100824-dbkr5e692dwqwyp63d68584cd3.png"/></a></p>
<h2>History and Spec</h2>
<p>It took 7 months to go from sketches to inclusion in Firefox. In a fast moving project, ideas need to be communicated fluidly. Instead of having specs broken into many smaller documents, we used one massive document to house concepts, specifications, and design decisions. Here it is. There&#8217;s a lot to explore in here so enjoy and feel free to ask questions in the comments.</p>
<div class="pic left"/>
<iframe src="http://azarask.in/projects/tabcandy/spec.html" style="width:800px;height:500px;border:1px solid #999;clear:all;margin-bottom:20px;"></iframe><br style="clear:all;"/>
</div>
<p><br style="clear:all;"/></p>
<p>If you want to delve deeper into the inspiration, go back to mid-2008. Below is a concept video for Firefox Mobile that shows a number of the key design principles and concepts that informed the creation of Tab Candy. The second video shows the in-progress design for Panorama from early April.</p>
<div style="width:900px;clear:all;margin-bottom:100px;"><iframe src="http://player.vimeo.com/video/1152218?portrait=0&amp;color=cc6600" width="390" height="235" frameborder="0" style="margin-right:20px"></iframe><iframe src="http://player.vimeo.com/video/14364477?portrait=0&amp;color=cc6600" width="390" height="246" frameborder="0"></iframe></div>
<h1>The Principles of Design</h1>
<p>Within the concept of &#8220;organizing your online tasks&#8221; is a lot room for paradigms, metaphors, and features. We used a set of principles guided by cognitive psychology to create a unified interface we feel is humane and efficient.</p>
<p><b>Harness the power of spatial memory</b>. Spatial memory is what allows you to navigate back to your house from a new resturant, remember how to get to your bed after you turning off the lights, and knowing exactly where something is on your messy desk. Probably stemming from our hunter-gatherer days, spatial memory is universally strong in everyone: we just remember where things are if they don&#8217;t move on us. That&#8217;s why in Panorama we are careful to never mess with your organization and layout — it is always the same even after you restart the browser.</p>
<p>The lack of consistent spatial layout is one of the main usability issues with interfaces like Apple&#8217;s Exposé. Their shifting layout means it confounds our ability to remember where things were. It messes with our heads and forces us to learn and relearn an ever-modifying map. Imagine how hard it would be to navigate if the city you lived in constantly rearranged itself.</p>
<p><b>Seeing is remembering</b>. In the cognitive science community we talk about two modes of accessing long term memory (anything longer than a couple seconds): there is recognition and recall. Recall requires first conjuring up a memory, then checking that it is the right memory, and finally doing something with it, while recognition doesn&#8217;t require that first costly recall step as it is triggered by seeing something. Recognition-based interfaces are generally less taxing and are more preferable than recall-based interfaces.</p>
<p>This implies that an overview of everything is the right approach to letting you group and organize your online life. One click lets you see all of your tabs just the way there were before, letting your brain use recognition rather than recall. Many past proposed tab-grouping designs fail this principal. </p>
<p><b>Minimize required interactivity</b>. In other words, <a href="http://www.youtube.com/watch?v=EuELwq2ThJE">don&#8217;t make me click</a>. This goes hand-in-hand with recognition versus recall. Instead of using stacks or other occlusive group visualizations we invented a new way of grouping, where tabs in a group shrink to accommodate more tabs. This way, tabs stay in the order and rough location you remember whilst always remaining visible.</p>
<p><b>Remove distractions: out of sight, out of mind.</b> This is the corollary to seeing is remembering. We, as humans, are <a href="http://www.azarask.in/blog/post/you-cant-multitask/">bad at multitasking</a>. As practitioners of <a href="http://en.wikipedia.org/wiki/Getting_Things_Done">GTD</a> know, the secret to productivity is removing distractions and focusing. Piles let you visually hide the pages by which you don&#8217;t want to be visually distracted, which strategically requires recall-based memory. When you are in a group, you only see the tabs related to the task at hand, again allowing you to focus. Strategic hiding is key to a mind free of info-guilt.</p>
<p><b>Tangible</b>. A good interface is behaviorally onomatopoeic. Web pages are now physical objects which you can interact with, leading to all sorts of new metaphors for using and sharing the web. For instance, you&#8217;ll soon be able to share a webpage directly, instead of sharing the text representation of the URL for the web page, by dragging it to a friend; and move a tab to your mobile device simply by dropping it onto a representation of your phone.</p>
<p>Also, nothing shouts “sexy!” like a gently stylized physics engine and <a href="http://csel.eng.ohio-state.edu/woods/design/concepts/vis_mo.pdf">visual momentum</a>. Beyond marketing appeal, there is a strong argument that such physicality helps the user build a mental model of the interface, and that interface physics yields consistency. We are wired to track the movement of things and to be able to remember where they’ve gone, as long as they don’t appear and disappear, which doesn’t happen in the real world. Of course, copying every physical metaphors blindly gets you interfaces like the multi-million dollar blunder that was <a href="http://blogs.pcworld.com/techlog/archives/001614.html">Microsoft Bob</a>, so we need to select our metaphors carefully.</p>
<p><b>Speed and Joy</b>. All of the above is moot if the interface doesn&#8217;t feel snappy. Down to the distinctive bounce-styled animation, we&#8217;ve focused on making Panorama be and feel fast. Similarly, in all of our animations and interactions (like how a group runs away if another group is placed on it) we&#8217;ve tried to focus on creating a little bit of whimsy.</p>


<p>Related posts:<ol><li><a href='http://www.azarask.in/blog/post/tabcandy/' rel='bookmark' title='Permanent Link: Tab Candy: Making Firefox Tabs Sweet'>Tab Candy: Making Firefox Tabs Sweet</a></li>
<li><a href='http://www.azarask.in/blog/post/firefox-31-control-tab-woes/' rel='bookmark' title='Permanent Link: Firefox 3.1: Control-Tab Woes'>Firefox 3.1: Control-Tab Woes</a></li>
<li><a href='http://www.azarask.in/blog/post/firefox-mobile-concept-video/' rel='bookmark' title='Permanent Link: Firefox Mobile Concept Video'>Firefox Mobile Concept Video</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.azarask.in/blog/post/designing-tab-candy/feed/</wfw:commentRss>
		<slash:comments>71</slash:comments>
		</item>
		<item>
		<title>Does Google Censor Tiananmen Square? How To Create an Internet Hoax</title>
		<link>http://www.azarask.in/blog/post/does-google-censor-tiananmen-square-how-to-create-an-internet-hoax/</link>
		<comments>http://www.azarask.in/blog/post/does-google-censor-tiananmen-square-how-to-create-an-internet-hoax/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 17:35:33 +0000</pubDate>
		<dc:creator>Aza Raskin</dc:creator>
				<category><![CDATA[WEBLOG]]></category>

		<guid isPermaLink="false">http://www.azarask.in/blog/?p=1075</guid>
		<description><![CDATA[Let me start by saying that, at least in the US, Google does not censor Tiananmen Square. Nor does Bing. Nor Yahoo. But we can make it look like they do. If you don&#8217;t believe me, click here, here, and here.

As you can see, I&#8217;m linking to the real Google domain and the looks and [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>Let me start by saying that, at least in the US, Google does not censor Tiananmen Square. Nor does Bing. Nor Yahoo. But we can make it look like they do. If you don&#8217;t believe me, <a href="http://www.google.com/search?hl=en&#038;q=tian%D0%B0nmen+square+massacre">click here</a>, <a href="http://search.yahoo.com/search?p=tian%D0%B0nmen+square+massacre">here</a>, and <a href="http://www.bing.com/search?q=ti%D0%B0n%D0%B0nm%D0%B5n+square">here</a>.</p>
<p><a href="http://www.google.com/search?hl=en&#038;q=tian%D0%B0nmen+square+massacre"><img src="http://img.skitch.com/20100803-t8g4sfx1yfg3mgymamxbggrjwp.png"/></a></p>
<p>As you can see, I&#8217;m linking to the real Google domain and the looks and acts legitimately. The URL looks normal. You can even change the search, say remove &#8220;massacre&#8221; and Google still doesn&#8217;t find anything. Try it with quotes. Remove square. Still no results. The &#8220;censorship&#8221; certainly feels fairly real, and the hoax would be even harder to detect if if I had said that they were only censoring links from some third party sites.<span id="more-1075"></span></p>
<p>Now try copying and paste the search to a different search engine. Nothing again. It&#8217;s a conspiracy! And look, Digg <a href="http://digg.com/search?s=rеddit">censors searches</a> for their rival Reddit!</p>
<p><a href="http://digg.com/search?s=rеddit" ><img class="frame" src="http://img.skitch.com/20100803-8i8ph9rixb3twmkxga5m87nt34.png"/></a><br />
<br/><br />
Or how about the government forcing videos from Afghanistan <a href="http://www.youtube.com/results?search_query=afghаnistan+rоadside+bomb&#038;aq=f">to be removed from YouTube</a> from within the US?</p>
<p><a href="http://www.youtube.com/results?search_query=afghаnistan+rоadside+bomb&#038;aq=f"><img src="http://img.skitch.com/20100803-cn1fp3gup1bh5wxpgxdb5kpd8u.png" class="frame"/></a></p>
<h3>What&#8217;s going on?</h3>
<p>I&#8217;m using a search query that looks like one thing but is, in fact, another. This particular search query uses unicode characters that look identical or similar to normal characters. In this case, I&#8217;ve replace one of the &#8220;a&#8221;s in Tiananmen with look-a-like character from the Cyrillic alphabet. Nobody uses such a tampered string when writing about Tiananmen Square so Google naturally doesn&#8217;t find any results. Hence, it looks like they are censoring. As long as you don&#8217;t delete the entire query and start again, modifying the query in place will continue returning results that appear &#8220;censored&#8221;.</p>
<p>In effect, this is taking the old phishing trick of <a href="http://en.wikipedia.org/wiki/IDN_homograph_attack">homoglyph attacks</a>—an attack consisting of using confusing look-a-like URLs like paypa1.com with the numeral one replacing the letter ell—and adding a dash of <a href="http://en.wikipedia.org/wiki/Cross-site_scripting">cross-site scripting</a> but where you become the agent of infection: the supposed &#8220;censorship&#8221; may be shocking enough to cause you to forward the link. You can find a list of look-a-like characters <a href="http://en.wikipedia.org/wiki/IDN_homograph_attack">here</a>.</p>
<p>Using this technique you can create viral links showing that Bing <a href="http://www.bing.com/images/search?q=b%D1%80+oil+spill">censors BP oil spill</a> images, or that Techcrunch has <a href="http://techcrunch.com/search/?cx=003873551773381066500%3An5h_ivbx_us&#038;cof=FORID%3A11&#038;ie=UTF-8&#038;q=%D1%80erfect&#038;sa=Search&#038;siteurl=#208">never used the word perfect</a>. With a mischievous eye, these kinds of searches might well cause damage. Someone will figure it out eventually, but probably not before the PR damage is already done.</p>
<p><a href="http://www.bing.com/images/search?q=b%D1%80+oil+spill"><img src="http://img.skitch.com/20100803-qdcdbixjcky6itufmk4gfafm8e.png"></a></p>
<h1>Being #1 In Google. The Easy Way</h1>
<p>Another way to take advantage of this hack is to easily appear to be the first hit for any term in Google.</p>
<p><em>Step 1:</em> Decide on the term you want to own. Say &#8220;Used Cars&#8221;. Now perform the homoglyph substitution. When you search for the tampered phrase, you should get no results.</p>
<p><em>Step 2: </em>Use the tampered phrase on the site you want to appear as #1.</p>
<p><em>Step 3:</em> Make a set of throw-away web sites that mirror your competitors sites that all use the tampered phrase and have them link to the site you want to be #1.</p>
<p><em>Step 4:</em> To prove that you are the most reputable used car site on the web, just link people to the Google search for the tampered phrase. The page will list you at the top for the phrase &#8220;used cars&#8221; with all of your &#8220;competitors&#8221; ranked below you.</p>
<p><em>Step 5:</em> Congrats. You can now control any search engine&#8217;s search page, as long as you provide the link.</p>
<h2>Mirror Character</h2>
<p>I stumbled on this technique through an exploration of the <a href="http://www.unicode.org/reports/tr9/">unicode &#8220;mirror&#8221; character</a>, which reverses the direction of all text after it. Doing a search for &#8220;<a href="http://www.google.com/search?q=%26%238238%3B">&amp;#8238;</a>&#8221; seemingly breaks Google. Going a step further, you can write your queries backwards with the mirror character at its front, making it look normal and also yield no results. When I tried this <a href="http://www.google.com/images?q=%E2%80%AEamabo">particular technique</a> on my Twitter following most of them figured that something strange was going on based on strange interaction experience and odd search results. The unicode homoglyph method does not suffer from these issues.</p>
<p>Search engines could nullify this attack vector by watching for such strange homoglyph characters in the middle of normal words and quietly swap them back.</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.azarask.in/blog/post/does-google-censor-tiananmen-square-how-to-create-an-internet-hoax/feed/</wfw:commentRss>
		<slash:comments>46</slash:comments>
		</item>
		<item>
		<title>Tab Candy: Making Firefox Tabs Sweet</title>
		<link>http://www.azarask.in/blog/post/tabcandy/</link>
		<comments>http://www.azarask.in/blog/post/tabcandy/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 15:26:56 +0000</pubDate>
		<dc:creator>Aza Raskin</dc:creator>
				<category><![CDATA[WEBLOG]]></category>

		<guid isPermaLink="false">http://www.azarask.in/blog/?p=1026</guid>
		<description><![CDATA[
The power of the browser has grown substantially in the last ten years. We now use the Web to multi-task the activities we juggle every day, like vacation plans, purchases, sharing pictures, listening to music, reading email, and writing a blog post.
It&#8217;s hard to keep everything straight with dozens of tabs all crammed into a [...]


Related posts:<ol><li><a href='http://www.azarask.in/blog/post/designing-tab-candy/' rel='bookmark' title='Permanent Link: Firefox Panorama: Tab Candy Evolved'>Firefox Panorama: Tab Candy Evolved</a></li>
<li><a href='http://www.azarask.in/blog/post/firefoxnext-tabs-on-the-side/' rel='bookmark' title='Permanent Link: Firefox.next: Tabs on the side?'>Firefox.next: Tabs on the side?</a></li>
<li><a href='http://www.azarask.in/blog/post/tabs-in-the-awesome-bar/' rel='bookmark' title='Permanent Link: Firefox 3.1 Proposal: Tabs in the Awesome Bar'>Firefox 3.1 Proposal: Tabs in the Awesome Bar</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<div class="pics left two"><img src="http://img.skitch.com/20100723-dx921xgang3ef2hf81p2et8y1f.png" alt="" /></div>
<p>The power of the browser has grown substantially in the last ten years. We now use the Web to multi-task the activities we juggle every day, like vacation plans, purchases, sharing pictures, listening to music, reading email, and writing a blog post.</p>
<p>It&#8217;s hard to keep everything straight with dozens of tabs all crammed into a little strip along the top of your browser. Your tab with a search to find a pizza parlor gets mixed up with your tabs on your favorite band. Often, it&#8217;s easier to open a new tab than to try to find the open tab you already have. Worse, how many of us keep tabs open as reminders of something we want to do or read later? We&#8217;re all suffering from <em>infoguilt</em>.</p>
<p>We need a way to organize browsing, to see all of our tabs at once, and focus on the task at hand. In short, we need a way to  get back control of our online lives.</p>
<p><strong>Enter: Tab Candy.</strong></p>
<p><span id="more-1026"></span></p>
<p>With one keystroke Tab Candy shows an overview of all tabs to allow you to quickly locate and switch between them. Tab Candy also lets you group tabs to organize your work flow. You can create a group for your vacation, work, recipes, games and social sites, however it makes sense to you to group tabs. When you switch to a grouped tab only the relevant tabs are shown in the tab bar, which helps you focus on what you want.</p>
<p><!-- Video for Everybody, Kroc Camen of Camen Design --></p>
<p><span> </span><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="550" height="364" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=13560319&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=cc6600&amp;fullscreen=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="550" height="364" src="http://vimeo.com/moogaloop.swf?clip_id=13560319&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=cc6600&amp;fullscreen=1" allowfullscreen="true"></embed></object></p>
<p class='caption'>Link to the video <a href="http://vimeo.com/13560319">here</a> or download the video <a href="http://people.mozilla.org/~araskin/movies/tabcandy.mov">here</a>.</p>
<p><b>One more thing</b>. Tab Candy is made <i>entirely</i> with HTML, Javascript, and CSS. There is no native code&mdash;just the open Web. That is how powerful the web has become.</p>
<p>Tab Candy is in early development. We&#8217;re at the point where we&#8217;d like more people to try it out and let us know what they <a href="http://feedback.mozillalabs.com/forums/56804-tabcandy">think</a>. There&#8217;s work to be done on some <a href="https://bugzilla.mozilla.org/buglist.cgi?quicksearch=%3Atabcandy">existing bugs</a> and performance issues, and we&#8217;re building a motivated group to attack those issues head-on.</p>
<p><a href="http://bit.ly/5Xkr9h" old="http://bit.ly/ciU6xa"><img src='http://img.skitch.com/20100723-ruibrgg1728ingt52r3ynnyay1.png' alt='Download'/></a></p>
<p class='caption'>This is not an extension. This is a super-early  build of Firefox with Tab Candy enabled.</p>
<h1>A Walkthrough of Tab Candy&#8217;s Features</h1>
<h3>Instant Overview—Never lose a tab again</h3>
<div class="left two pic"><img src="http://img.skitch.com/20100723-t3751uj9epuw6tpqitahppu78c.png" alt="" /></div>
<p>Tap Option-Space on the Mac or Control-Space on Windows to zoom out and see thumbnails of all open tabs. Click on one to zoom back in. It&#8217;s a quick visual way to search for that one tab you need with work research or directions to the restaurant.</p>
<h3>Lightweight Grouping</h3>
<p>Drag two tabs together to create a group to keep related tabs together. You can even name groups for all your videos, research, social sites or whatever you need. If need a group from one tab just click and drag to create one. You can easily rearrange tabs and drag them anywhere inside a group or between groups.</p>
<p>Right now there is no automatic grouping, but it is a feature we are working to deliver.</p>
<h3>Only the Tabs You Want</h3>
<div class="left two pic"><img src="http://img.skitch.com/20100723-8r78hsbs49qt8f9g2h8kj7ayqh.png" alt="" /></div>
<p>When you go to a tab in a group, you&#8217;ll only see the tabs from that group in the tab strip. That means you can focus on the task you are doing. Work tabs stay separate from play tabs. Clean tab bar, clean mind.</p>
<h3>Organize Your Space</h3>
<p>Tab Candy is not just the ability to move tabs around, you can move groups so that they fit your needs. Make the group with your calendar and email bigger so that you can see what&#8217;s new just by zooming out to Tab Candy. Hide the group with distractions in a corner. Keep things to read in a long vertical list. Because Tab Candy is in early development, there are lots of <a href="http://azarask.in/projects/tabcandy/#todo">user experience changes and bugs to fix</a>. We want your <a href="http://feedback.mozillalabs.com/forums/56804-tabcandy">feedback</a>. While Tab Candy is fairly stable, it might still lose your groupings or cause Firefox to operate more slowly.</p>
<h1>Next Steps</h1>
<p>Our current goals are focused on overall and start-up performance, unit tests, code documentation and refactoring. Next, we will focus on user feedback and polishing the user experience.</p>
<p>The Tab Candy team is working to get Tab Candy into nightly development builds of Firefox. You can <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=574217">follow along</a> as we work to improve the code.</p>
<h2>Get Involved</h2>
<p>Start by reading the <a href="https://wiki.mozilla.org/Firefox/Projects/TabCandy/FAQ">Tab Candy FAQ</a>.</p>
<p>* Visit the <a href="http://azarask.in/projects/tabcandy/">project page</a> or the <a href="https://wiki.mozilla.org/Firefox/Projects/TabCandy">project wiki</a><br />
* Give us <a href="http://feedback.mozillalabs.com/forums/56804-tabcandy">feedback</a><br />
* Submit a <a href="https://bugzilla.mozilla.org/enter_bug.cgi?product=Mozilla%20Labs&#038;component=TabCandy">bug report</a> and see what bugs <a href="https://bugzilla.mozilla.org/buglist.cgi?quicksearch=%3Atabcandy">need to be fixed</a><br />
* Grab the <a href="http://azarask.in/projects/tabcandy/#code">source code</a> and get a <a href="https://wiki.mozilla.org/Firefox/Projects/Tabcandy/CodeGuide">walkthrough</a> of the code<br />
* Download a <a href="http://azarask.in/projects/tabcandy/build.php">Tab Candy-enabled build</a></p>


<p>Related posts:<ol><li><a href='http://www.azarask.in/blog/post/designing-tab-candy/' rel='bookmark' title='Permanent Link: Firefox Panorama: Tab Candy Evolved'>Firefox Panorama: Tab Candy Evolved</a></li>
<li><a href='http://www.azarask.in/blog/post/firefoxnext-tabs-on-the-side/' rel='bookmark' title='Permanent Link: Firefox.next: Tabs on the side?'>Firefox.next: Tabs on the side?</a></li>
<li><a href='http://www.azarask.in/blog/post/tabs-in-the-awesome-bar/' rel='bookmark' title='Permanent Link: Firefox 3.1 Proposal: Tabs in the Awesome Bar'>Firefox 3.1 Proposal: Tabs in the Awesome Bar</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.azarask.in/blog/post/tabcandy/feed/</wfw:commentRss>
		<slash:comments>244</slash:comments>
<enclosure url="http://people.mozilla.org/~araskin/movies/tabcandy.mov" length="37828300" type="video/quicktime" />
		</item>
		<item>
		<title>How To Phish, Protect Your Email, and Defeat Copy-And-Paste with CSS</title>
		<link>http://www.azarask.in/blog/post/protecting-email-with-css/</link>
		<comments>http://www.azarask.in/blog/post/protecting-email-with-css/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 07:58:02 +0000</pubDate>
		<dc:creator>Aza Raskin</dc:creator>
				<category><![CDATA[WEBLOG]]></category>

		<guid isPermaLink="false">http://azarask.in/blog/?p=86</guid>
		<description><![CDATA[It&#8217;s not often that you learn something from spam, besides that there are an extraordinary number of generous Nigerians (replete with theme song) and amazing number of variations in the spelling of viagra. Yet, I recently got spam where the offer was written in pristine English: no numbers replacing letters, no images, and no misspellings. [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s not often that you learn something from spam, besides that there are an extraordinary number of generous <a href="http://www.419eater.com/">Nigerians</a> (replete with <a href="http://www.youtube.com/watch?v=D_YjvC4ndzM#t=1m39s">theme song</a>) and amazing number of variations in the spelling of viagra. Yet, I recently got spam where the offer was written in pristine English: no numbers replacing letters, no images, and no misspellings. How had such a brazen piece of spam got through my filters? The answer, it turns out, was some clever CSS that caused the HTML markup to be garbled but its visual rendering to be readable. I&#8217;ll show you how to use this for both good and evil.</p>
<p class="frame"><object width="548" height="276"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=12624821&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=cc6600&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=12624821&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=cc6600&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="503" height="252"></embed></object></p>
<p><span id="more-86"></span></p>
<h2>The Good</h2>
<p>Using CSS to obfuscate HTML can be used to protect your email address in a quick-as-you-type way. No need for unwieldy inline images or arcane Javascript functions. For example, here&#8217;s my email address:<br />
<style>.z,.x,.y{float:right;font-size:.001px;color:transparent;display:inline-block;width:0px;}</style>
<p class="frame" style="padding:10px;">
az<span class="z">SPAM</span>a@mo<span class="z">REMOVE</span>zill<span class="c">a.c</span>om <span style="padding-left:20px" class="caption">This email address cannot be copy and pasted. Try it.</span>
</p>
<p>Notice that it appears to be in normal, selectable text. Don&#8217;t be fooled by appearances. Copy and paste it. You&#8217;ll get the following: <code>azSPAMa@moREMOVEzilla.com</code>, which is easy for a human to fix but difficult for a bot. How does it work? Here&#8217;s the sample code:</p>
<pre class="brush: html; ">

&lt;style&gt;
.z{
  float:right;
  font-size:.001px;
  color:transparent;
  display:inline-block;
  width:0px;
  }
&lt;/style&gt;

...

az&lt;span class=&quot;z&quot;&gt;SPAM&lt;/span&gt;a@mo&lt;span class=&quot;z&quot;&gt;
REMOVETHIS&lt;/span&gt;zill&lt;span class=&quot;y&quot;&gt;a.c&lt;/span&gt;om
</pre>
<p>This takes anything marked with the class <code>z</code> and visually hides it, leaving only the email address rendered as if nothing was amiss. When you go to copy my email address, however, the browser doesn&#8217;t see the garbage text as hidden and so it gets selected along with my email address. This is the same way that your DNA protects itself, by hiding the real information in a huge amount of noise. It would be difficult for a scraper to even know that there was an email address there, let alone implement a program that understands CSS well enough to parse it out: there are a semi-infinite number of ways to use CSS to make text visually disappear. If you wanted to get really tricky, you can add multiple classes to each little span; because CSS cascades and inherits it becomes very hard to know, without just looking at the results, what the text will end up saying.</p>
<p>Foiling spammers with a bit of their own medicine brings a smile to my lips.</p>
<h2>The Bad &amp; Evil</h2>
<p>Besides spammers using this trick to get around your Bayesian spam filters, there are other bad things for which this can be used. This first is for that misguided holy-grail of publishers: copy-protection for their words. A publisher could generate, on the server side, a new random mess of HTML and CSS that would render their text uncopyable. This also has the side-effect of making your pages impossible for search engines to index sensibly; it&#8217;s an easy way to keep your information human-readable but cloaked from Google&#8217;s all-seeing Sauronic eye.</p>
<p>Here&#8217;s a simplified example of how a publisher might use this:</p>
<div class="pic left two">
<p class="caption">Try copying and pasting this. It will only give you garbage. Then look at the source. It&#8217;s pretty unintelligible. Note that this is a quickly-coded example and could be made much harder to reverse engineer.</p>
</div>
<p class="frame" style="padding:10px;"><span class='z'>m</span><span class='o'>T</span><span class='a'>h</span><span class='x'>e</span><span class='z'>I</span><span class='g'>i</span><span class='a'>s</span><span class='x'>m</span><span class='z'>M</span><span class='c'> </span><span class='m'>t</span><span class='y'>r</span><span class='z'>p</span><span class='n'>e</span><span class='p'>x</span><span class='x'>s</span><span class='z'>m</span><span class='c'>t</span><span class='d'> </span><span class='x'>a</span><span class='y'>E</span><span class='c'>i</span><span class='p'>s</span><span class='z'>c</span><span class='y'>y</span><span class='a'> </span><span class='i'>u</span><span class='y'>e</span><span class='x'>x</span><span class='j'>n</span><span class='o'>c</span><span class='x'> </span><span class='x'>n</span><span class='l'>o</span><span class='n'>p</span><span class='y'>i</span><span class='y'>N</span><span class='g'>y</span><span class='l'>a</span><span class='x'>n</span><span class='z'>x</span><span class='a'>b</span><span class='k'>l</span><span class='z'>a</span><span class='z'>i</span><span class='g'>e</span><span class='m'>.</span><span class='z'>v</span><span class='y'>k</span><span class='m'> </span><span class='c'>K</span><span class='x'>n</span><span class='y'>A</span><span class='m'>e</span><span class='e'>i</span><span class='x'>L</span><span class='z'>A</span><span class='h'>t</span><span class='i'>h</span><span class='z'>e</span><span class='x'>v</span><span class='h'> </span><span class='m'>R</span><span class='x'>o</span><span class='z'>a</span><span class='f'>u</span><span class='l'>p</span><span class='x'> </span><span class='z'>z</span><span class='g'>e</span><span class='j'>r</span><span class='y'>a</span><span class='z'>n</span><span class='o'>t</span><span class='m'> </span><span class='y'>d</span><span class='x'>w</span><span class='h'>M</span><span class='o'>u</span><span class='z'>t</span><span class='z'>n</span><span class='g'>r</span><span class='d'>d</span><span class='x'>e</span><span class='z'>.</span><span class='h'>o</span><span class='l'>c</span><span class='z'>&#8216;</span><span class='z'>m</span><span class='h'>h</span><span class='e'> </span><span class='y'>e</span><span class='x'>s</span><span class='b'>w</span><span class='d'>a</span><span class='x'>a</span><span class='x'>I</span><span class='d'>s</span><span class='o'> </span><span class='x'>s</span><span class='y'>v</span><span class='i'>b</span><span class='m'>o</span><span class='y'> </span><span class='y'>L</span><span class='l'>r</span><span class='l'>n</span><span class='y'>s</span><span class='x'>B</span><span class='j'> </span><span class='m'>i</span><span class='y'>n</span><span class='y'>y</span><span class='h'>n</span><span class='n'> </span><span class='x'> </span><span class='x'>.</span><span class='a'>M</span><span class='j'>e</span><span class='y'>h</span><span class='z'>M</span><span class='c'>l</span><span class='g'>b</span><span class='x'>i</span><span class='y'>l</span><span class='m'>o</span><span class='j'>u</span><span class='x'> </span><span class='z'>C</span><span class='d'>r</span><span class='c'>n</span><span class='y'>n</span><span class='y'>a</span><span class='o'>e</span><span class='l'> </span><span class='x'>w</span><span class='x'>G</span><span class='p'>i</span><span class='d'>n</span><span class='y'>e</span><span class='y'>o</span><span class='e'> </span><span class='m'>1</span><span class='z'>g</span><span class='z'>x</span><span class='n'>9</span><span class='f'>3</span><span class='y'> </span><span class='x'>z</span><span class='j'>1</span><span class='b'>.</span><span class='z'>o</span><span class='y'>C</span><span class='h'> </span><span class='o'>A</span><span class='z'>d</span><span class='z'>v</span><span class='h'>t</span><span class='d'> </span><span class='y'>v</span><span class='z'>o</span><span class='e'>t</span><span class='k'>h</span><span class='z'>l</span><span class='x'>a</span><span class='b'>e</span><span class='l'> </span><span class='y'>p</span><span class='x'>B</span><span class='d'>t</span><span class='j'>i</span><span class='y'>a</span><span class='z'>v</span><span class='b'>m</span><span class='g'>e</span><span class='z'>f</span><span class='x'>I</span><span class='k'>,</span><span class='c'> </span><span class='y'>r</span><span class='z'>G</span><span class='k'>h</span><span class='b'>i</span><span class='y'> </span><span class='x'>r</span><span class='g'>s</span><span class='i'> </span><span class='x'>f</span><span class='z'>k</span><span class='p'>f</span><span class='k'>a</span><span class='y'>i</span><span class='x'>z</span><span class='p'>t</span><span class='o'>h</span><span class='x'>s</span><span class='z'>h</span><span class='c'>e</span><span class='p'>r</span><span class='x'>l</span><span class='x'>d</span><span class='g'>,</span><span class='o'> </span><span class='y'>n</span><span class='z'>G</span><span class='a'>K</span><span class='h'>e</span><span class='x'>t</span><span class='x'>x</span><span class='d'>i</span><span class='m'>t</span><span class='y'>a</span><span class='z'>r</span><span class='k'>h</span><span class='i'> </span><span class='x'> </span><span class='y'>M</span><span class='n'>M</span><span class='p'>u</span><span class='y'>o</span><span class='x'>u</span><span class='g'>r</span><span class='k'>d</span><span class='x'>l</span><span class='z'>y</span><span class='p'>o</span><span class='b'>c</span><span class='z'> </span><span class='x'>r</span><span class='a'>h</span><span class='d'>,</span><span class='z'>e</span><span class='z'>s</span><span class='l'> </span><span class='d'>w</span><span class='y'>d</span><span class='z'>k</span><span class='i'>a</span><span class='b'>s</span><span class='x'>l</span><span class='z'>e</span><span class='a'> </span><span class='n'>a</span><span class='y'>v</span><span class='y'>E</span><span class='p'> </span><span class='d'>r</span><span class='x'>r</span><span class='x'>y</span><span class='g'>e</span><span class='p'>g</span><span class='z'>d</span><span class='x'>l</span><span class='l'>i</span><span class='h'>o</span><span class='z'>b</span><span class='x'>l</span><span class='d'>n</span><span class='j'>a</span><span class='x'> </span><span class='z'>m</span><span class='l'>l</span><span class='i'> </span><span class='z'>i</span><span class='x'>F</span><span class='l'>n</span><span class='k'>e</span><span class='x'>l</span><span class='z'>z</span><span class='d'>w</span><span class='c'>s</span><span class='x'>T</span><span class='z'>E</span><span class='i'>p</span><span class='i'>a</span><span class='y'>a</span><span class='y'>q</span><span class='f'>p</span><span class='g'>e</span><span class='z'> </span><span class='x'>a</span><span class='d'>r</span><span class='n'> </span><span class='y'>e</span><span class='y'>o</span><span class='a'>m</span><span class='e'>a</span><span class='x'>e</span><span class='z'>z</span><span class='c'>g</span><span class='d'>n</span><span class='x'>r</span><span class='z'>v</span><span class='c'>a</span><span class='n'>t</span><span class='x'>h</span><span class='z'>b</span><span class='k'>e</span><span class='o'> </span><span class='x'>r</span><span class='x'>o</span><span class='n'>b</span><span class='n'>a</span><span class='y'>B</span><span class='x'>f</span><span class='n'>s</span><span class='h'>e</span><span class='z'>a</span><span class='x'>s</span><span class='h'>d</span><span class='n'> </span><span class='x'>c</span><span class='y'>m</span><span class='p'>o</span><span class='g'>u</span><span class='x'> </span><span class='x'>y</span><span class='d'>t</span><span class='h'> </span><span class='z'>a</span><span class='z'>I</span><span class='j'>o</span><span class='k'>f</span><span class='x'> </span><span class='x'>P</span><span class='i'> </span><span class='e'>M</span><span class='y'>i</span><span class='z'>z</span><span class='h'>e</span><span class='d'>l</span><span class='y'>r</span><span class='x'>w</span><span class='a'>b</span><span class='d'>o</span><span class='z'>p</span><span class='z'>I</span><span class='j'>u</span><span class='g'>r</span><span class='z'>s</span><span class='z'>O</span><span class='f'>n</span><span class='l'>e</span><span class='z'>i</span><span class='x'>h</span><span class='i'> </span><span class='d'>a</span><span class='y'> </span><span class='x'>v</span><span class='c'>n</span><span class='d'>d</span><span class='x'>h</span><span class='x'>O</span><span class='l'> </span><span class='j'>a</span><span class='x'>y</span><span class='y'>N</span><span class='i'>s</span><span class='n'> </span><span class='y'>r</span><span class='y'>I</span><span class='l'>a</span><span class='f'> </span><span class='y'> </span><span class='y'>H</span><span class='i'>r</span><span class='f'>e</span><span class='x'>l</span><span class='x'>.</span><span class='l'>s</span><span class='p'>u</span><span class='z'>o</span><span class='x'>P</span><span class='a'>l</span><span class='f'>t</span><span class='y'>u</span><span class='z'>n</span><span class='m'> </span><span class='l'>t</span><span class='z'>i</span><span class='z'>p</span><span class='c'>h</span><span class='d'>e</span><span class='x'>g</span><span class='z'>t</span><span class='h'> </span><span class='i'>f</span><span class='z'>t</span><span class='y'>n</span><span class='g'>a</span><span class='h'>m</span><span class='x'>e</span><span class='y'>G</span><span class='k'>i</span><span class='h'>l</span><span class='x'>r</span><span class='y'>L</span><span class='k'>y</span><span class='d'> </span><span class='y'>k</span><span class='z'>v</span><span class='m'>w</span><span class='o'>a</span><span class='y'>o</span><span class='x'>z</span><span class='f'>s</span><span class='b'> </span><span class='z'>l</span><span class='z'>M</span><span class='i'>w</span><span class='n'>e</span><span class='z'>d</span><span class='z'>f</span><span class='j'>a</span><span class='d'>l</span><span class='z'>e</span><span class='y'>v</span><span class='a'>t</span><span class='m'>h</span><span class='z'>t</span><span class='z'>M</span><span class='m'>y</span><span class='f'>.</span><span class='x'> </span><span class='y'>n</span><span class='o'> </span><span class='e'>R</span><span class='x'>e</span><span class='x'>e</span><span class='j'>u</span><span class='g'>p</span><span class='x'>e</span><span class='x'>u</span><span class='k'>e</span><span class='d'>r</span><span class='y'>o</span><span class='y'>s</span><span class='c'>t</span><span class='f'> </span><span class='z'> </span><span class='z'>f</span><span class='e'>w</span><span class='c'>a</span><span class='z'> </span><span class='x'>h</span><span class='b'>s</span><span class='i'> </span><span class='x'>o</span><span class='x'>A</span><span class='d'>g</span><span class='m'>r</span><span class='y'>m</span><span class='z'>d</span><span class='d'>o</span><span class='d'>o</span><span class='y'>o</span><span class='y'>m</span><span class='b'>m</span><span class='j'>e</span><span class='x'> </span><span class='y'>E</span><span class='m'>d</span><span class='n'> </span><span class='z'>n</span><span class='y'>p</span><span class='n'>b</span><span class='i'>y</span><span class='z'>u</span><span class='y'>l</span><span class='k'> </span><span class='a'>h</span><span class='z'>i</span><span class='z'>s</span><span class='o'>i</span><span class='g'>s</span><span class='y'> </span><span class='x'>F</span><span class='a'> </span><span class='j'>f</span><span class='y'>h</span><span class='y'>w</span><span class='i'>a</span><span class='p'>t</span><span class='x'>t</span><span class='z'>F</span><span class='i'>h</span><span class='p'>e</span><span class='z'>c</span><span class='x'>H</span><span class='d'>r</span><span class='l'> </span><span class='z'>u</span><span class='x'>z</span><span class='j'>f</span><span class='c'>r</span><span class='x'>d</span><span class='x'>A</span><span class='c'>o</span><span class='i'>m</span><span class='z'>b</span><span class='y'>M</span><span class='i'> </span><span class='k'>a</span><span class='y'> </span><span class='x'>J</span><span class='o'>n</span><span class='l'> </span><span class='z'>e</span><span class='z'>n</span><span class='p'>e</span><span class='b'>a</span><span class='x'>i</span><span class='x'>q</span><span class='i'>r</span><span class='f'>l</span><span class='y'>e</span><span class='x'>O</span><span class='g'>y</span><span class='k'> </span><span class='z'>e</span><span class='x'>M</span><span class='h'>a</span><span class='j'>g</span><span class='x'> </span><span class='z'>z</span><span class='n'>e</span><span class='k'>,</span><span class='x'>y</span><span class='x'>p</span><span class='j'> </span><span class='g'>a</span><span class='x'>p</span><span class='y'>w</span><span class='p'>n</span><span class='b'>d</span><span class='y'>l</span><span class='y'>x</span><span class='o'> </span><span class='h'>w</span><span class='z'>.</span><span class='y'>v</span><span class='n'>e</span><span class='c'>n</span><span class='x'>e</span><span class='z'>s</span><span class='c'>t</span><span class='e'> </span><span class='x'>m</span><span class='z'>s</span><span class='j'>o</span><span class='c'>f</span><span class='y'>r</span><span class='y'>o</span><span class='a'>f</span><span class='g'> </span><span class='x'>s</span><span class='y'>p</span><span class='c'>t</span><span class='m'>o</span><span class='x'>a</span><span class='x'>L</span><span class='d'> </span><span class='o'>s</span><span class='z'>c</span><span class='x'>a</span><span class='i'>t</span><span class='a'>u</span><span class='y'>e</span><span class='x'>u</span><span class='l'>d</span><span class='g'>y</span><span class='x'> </span><span class='y'>b</span><span class='g'> </span><span class='h'>p</span><span class='y'>i</span><span class='y'>G</span><span class='o'>h</span><span class='o'>i</span><span class='x'>n</span><span class='z'>p</span><span class='d'>l</span><span class='n'>o</span><span class='z'>a</span><span class='y'>a</span><span class='n'>s</span><span class='m'>o</span><span class='z'>v</span><span class='y'>q</span><span class='l'>p</span><span class='j'>h</span><span class='x'>n</span><span class='x'>F</span><span class='i'>y</span><span class='m'>,</span><span class='x'>L</span><span class='y'>d</span><span class='i'> </span><span class='o'>p</span><span class='z'>e</span><span class='y'>N</span><span class='p'>o</span><span class='g'>l</span><span class='x'>o</span><span class='x'>t</span><span class='p'>i</span><span class='n'>t</span><span class='x'> </span><span class='y'>M</span><span class='j'>i</span><span class='h'>c</span><span class='y'>a</span><span class='z'>d</span><span class='b'>s</span><span class='n'> </span><span class='y'>d</span><span class='y'>k</span><span class='n'>a</span><span class='n'>n</span><span class='z'>t</span><span class='y'> </span><span class='i'>d</span><span class='e'> </span><span class='x'>e</span><span class='z'>t</span><span class='g'>e</span><span class='j'>c</span><span class='z'>&#8216;</span><span class='y'>L</span><span class='d'>o</span><span class='j'>n</span><span class='y'>e</span><span class='z'>H</span><span class='i'>o</span><span class='a'>m</span><span class='x'>a</span><span class='x'>z</span><span class='o'>i</span><span class='m'>c</span><span class='x'>s</span><span class='z'>a</span><span class='e'>s</span><span class='j'> </span><span class='y'> </span><span class='y'>n</span><span class='n'>a</span><span class='p'>t</span><span class='y'>s</span><span class='y'>p</span><span class='n'> </span><span class='l'>O</span><span class='y'>n</span><span class='x'>y</span><span class='m'>x</span><span class='d'>f</span><span class='x'> </span><span class='y'>.</span><span class='o'>o</span><span class='f'>r</span><span class='y'>h</span><span class='x'>r</span><span class='c'>d</span><span class='g'> </span><span class='x'>i</span><span class='z'>e</span><span class='p'>U</span><span class='p'>n</span><span class='x'> </span><span class='x'>c</span><span class='k'>i</span><span class='m'>v</span><span class='y'>n</span><span class='z'>P</span><span class='d'>e</span><span class='f'>r</span><span class='x'>w</span><span class='x'>k</span><span class='m'>s</span><span class='c'>i</span><span class='y'>e</span><span class='y'>y</span><span class='c'>t</span><span class='j'>y</span><span class='z'>g</span><span class='y'>F</span><span class='n'> </span><span class='k'>i</span><span class='y'> </span><span class='z'>v</span><span class='f'>n</span><span class='m'> </span><span class='z'>o</span><span class='y'>w</span><span class='d'>E</span><span class='l'>n</span><span class='z'>d</span><span class='z'>n</span><span class='n'>g</span><span class='k'>l</span><span class='y'>v</span><span class='y'>c</span><span class='d'>a</span><span class='l'>n</span><span class='z'>l</span><span class='z'>c</span><span class='n'>d</span><span class='d'>.</span><span class='y'>p</span>
</p>
<p>The other evil thing this could be used for is phishing attacks. Sometimes you run across a URL unlinked on a web page. To go there, you copy and paste it into your location bar. In fact, we are often told that the only way to really trust a website&#8217;s location is to put it there yourself. Try copy and pasting this URL into your location bar:</p>
<p class="frame" style="padding:10px;">
http://facebook<span class="z">.com.evil</span>.com<span style="padding-left:20px" class="caption">This URL will phish you if copy-and-pasted into the location bar.</span>
</p>
<p>While you think you copied one url, it directs you to an entirely different, evil URL. While this particular example is easy to detect for pedagogical reasons, you can use all of the standard phishing methods of disguising a URL to make it look more legitimate.</p>
<h2>Brainstorm</h2>
<p>I&#8217;m sure there are other good and bad things you can do with this technique&mdash;these are the ones I came up with in a couple minutes. What are your ideas?</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.azarask.in/blog/post/protecting-email-with-css/feed/</wfw:commentRss>
		<slash:comments>63</slash:comments>
		</item>
		<item>
		<title>Animation with CSS Transitions Made Easy</title>
		<link>http://www.azarask.in/blog/post/animation-css-transitions-jquery-easy/</link>
		<comments>http://www.azarask.in/blog/post/animation-css-transitions-jquery-easy/#comments</comments>
		<pubDate>Fri, 11 Jun 2010 21:21:37 +0000</pubDate>
		<dc:creator>Aza Raskin</dc:creator>
				<category><![CDATA[WEBLOG]]></category>

		<guid isPermaLink="false">http://www.azarask.in/blog/?p=961</guid>
		<description><![CDATA[There are currently two proposed additions to CSS to make animating easier and with better performance: CSS Transitions and CSS Animations. Both are unfortunately named. The later is complicated, overkill, and probably won&#8217;t be supported by non-Webkit browsers, which leaves CSS Transitions as becoming the de-facto way to natively animate on the Web. Besides reducing [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>There are currently two proposed additions to CSS to make animating easier and with better performance: <a href="https://developer.mozilla.org/en/CSS/CSS_transitions">CSS Transitions</a> and <a href="http://dev.w3.org/csswg/css3-animations/">CSS Animations</a>. Both are unfortunately named. The later is complicated, overkill, and probably won&#8217;t be supported by non-Webkit browsers, which leaves CSS Transitions as becoming the de-facto way to natively animate on the Web. Besides reducing power-hungry Javascript-based animation, the declarative CSS Transitions opens the door for hardware acceleration and commercial quality games. iOS devices and Safari already do so for buttery smooth results, and hardware acceleration just might make it into Firefox 4.</p>
<h2>How Do CSS Transitions Work?</h2>
<p>Normally, when you change the value of a CSS property, it changes instantly. With CSS Transitions, they automagically animate over time. Imagine you want to have a rollover indication for links where, on hover, the link changes its background color and jigs up a bit. With CSS Transitions instead of having the effect happen instantly, it can smoothly animated. Here&#8217;s how you&#8217;d do it. </p>
<div class="right one pic">
<p class="caption">You&#8217;ll have to use the -moz and -webkit prefixes for these properties until the CSS transitions <a href="http://www.w3.org/TR/css3-transitions/">specification</a> is finalized.</p>
</div>
<pre class="brush: css; ">

a{
  transition-property: all;
  transition-duration: 350ms;
  transition-timing-function: ease-in-out;
  position: relative;
  background-color: white;
  color: black;
}

a:hover{
  top: -2px
  background-color: black;
  color: white;
}
</pre>
<p><span id="more-961"></span></p>
<p>You can even add an event listener to detect when the transition has finished:</p>
<pre class="brush: js; ">

aLink.addEventListener(&quot;transitionend&quot;, function(){
  console.log(&quot;Transition Done!&quot;);
}, true);
</pre>
<p>Timing functions are defined by the control points for a <a href="http://en.wikipedia.org/wiki/B%C3%A9zier_curve#Cubic_B.C3.A9zier_curves">cubic bezier curve</a> of the form <code>cubic-bezier(x1,y1,x2,y2)</code>. You can see some of the named timing functions and their values below. You can also define your own timing functions:</p>
<p><img src="http://img.skitch.com/20100611-nxm2hk1kyaq4xqn6i3gq9ppuyr.png"/></p>
<pre class="brush: css; ">

/* A more pronounced ease-in-out timing function. */
transition-timing-function: cubic-bezier(0.6, 0, 0.4, 1.0);

/* A timing function which causes a little bounce.
   Note that values above 1 only work in Firefox. */
transition-timing-function: cubic-bezier(0, 0.35, .5, 1.3);
</pre>
<p><br/></p>
<h2>Using CSS Transitions with jQuery</h2>
<p>To use CSS Transitions in practice, you&#8217;ll want some helper functions to handle setting and and unsetting the transition properties, handling completion callback, and stopping animations. Towards that end, I&#8217;ve written a quick jQuery plugin that allows you to do just that (as well as deals with an <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=571344">annoying Firefox bug</a>.)</p>
<p>Using it is simple:
<div class="pic right one">
<p class="caption">Some of the work that&#8217;s <a href="http://www.parkerfox.co.uk/labs/css-webkit-animation-jquery-proof-of-concept.html">come before</a> has assumed that you need to wait for the CSS transition properties to get applied before setting the properties to be animated. This is not the case.</p>
</div>
<pre class="brush: js; ">

// Makes all paragraph elements grow a border and then atrophy away.
$(&quot;p&quot;).animateWithCSS(
  {border: &quot;5px solid #555&quot;}, // CSS properties to animate
  1000,                       // Duration in ms
  &quot;cubic-bezier&quot;,             // The timing function
  function(){                 // Callback
    $(&quot;p&quot;).animateWithCSS({border: &quot;0px&quot;}, 350);
  }
);
</pre>
<p><a href="http://gist.github.com/435054">Get the CSS Transitions jQuery Plugin</a>.</p>
<h2>Demo</h2>
<div class="left pic two">
<p class="caption">You&#8217;ll need a Webkit-based browser or a <a href="http://www.mozilla.org/projects/devpreview/releasenotes/">Firefox alpha</a> to try this out.</p>
</div>
<p><iframe class="frame" style="width:550px; height:300px;" src="http://azarask.in/projects/cssanim"></iframe></p>
<p><a href="http://gist.github.com/435054">Get the CSS Transitions jQuery Plugin</a>.</p>
<h1>Problems with CSS Transitions</h1>
<p><b>Better timing functions.</b> While using a cubic bezier curve is clever&mdash;it packs a lot of variation into just four numbers&mdash;it isn&#8217;t enough. While I was able to create a basic bounce animation, not only does the spec explicitly disallow it, but I can&#8217;t control even the basic parameters of the bounce (like how fast it returns). As John Resig mentioned in a <a href="http://ejohn.org/blog/css-animations-and-javascript/">blog post</a>, it would be nice to supply a custom Javascript timing function (although this might break the ability to do hardware acceleration). A more CSS-like solution might be to allow authors to provide an arbitrary number of control points for a series of linked quadratic or cubic bezier curves (and to not restrict the y-axis points to the 0 to 1 range). That would enable fine-grained control of timing without requiring Javascript.</p>
<p><b>Ability to layer two animations on top of each other.</b> If I&#8217;ve started an animation moving an element to the left, and half-way through want to start animating its opacity at a different rate, things get complicated very quickly. And by complicated, I mean impossible.</p>
<p><b>Ability to register an on step handler.</b> We can currently register a &#8220;transitionend&#8221; event handler. I&#8217;d like to be able to do the same for &#8220;transitionstep&#8221;. This would make CSS Transitions potentially much more versatile&mdash;and allow frameworks to keep innovating on top of the transitions base instead of reverting to pure Javascript animation.</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.azarask.in/blog/post/animation-css-transitions-jquery-easy/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Macintosh Project Genesis and History</title>
		<link>http://www.azarask.in/blog/post/macintosh-project-genesis-and-history-16-feb-1981/</link>
		<comments>http://www.azarask.in/blog/post/macintosh-project-genesis-and-history-16-feb-1981/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 20:28:10 +0000</pubDate>
		<dc:creator>Aza Raskin</dc:creator>
				<category><![CDATA[WEBLOG]]></category>

		<guid isPermaLink="false">http://www.azarask.in/blog/?p=904</guid>
		<description><![CDATA[
I was recently looking at some of my father&#8217;s, Jef Raskin, old documents and came across his February 16, 1981 memo detailing the genesis of the Macintosh. It was written in reaction to Steve Jobs taking over managing hardware development. Reading through it, I was struck by a number of the core principals Apple holds [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<div class="left pic two"><img style="float:right;margin-top:8px;" src="http://img.skitch.com/20100604-q9a9ghdj1cekxwgqt1ntyi1ep8.png"/></div>
<p>I was recently looking at some of my father&#8217;s, <a href="http://en.wikipedia.org/wiki/Jef_Raskin">Jef Raskin</a>, old documents and came across his February 16, 1981 memo detailing the genesis of the Macintosh. It was written in reaction to Steve Jobs taking over managing hardware development. Reading through it, I was struck by a number of the core principals Apple holds now that were set in play three years before the Macintosh was released. Much of this is particularly apropos in understanding Apple&#8217;s culture and why we have the walled-garden experience of the iPhone/iPad and the App Store.</p>
<p>Even better, I found some sometimes-snarky annotated comments Jef made to the memo as part of the <a href="http://www-sul.stanford.edu/mac/index.html">Stanford Computer History project</a>. The annotated memo follows my commentary.</p>
<p><span id="more-904"></span></p>
<h3>Apple Learns to Own the Entire Experience</h3>
<p>We see that Apple was struggling with an explosion of fragmentation with the Apple II: &#8220;<i>it is impossible to write a program on the Apple II or III that will draw a high-resolution circle since the aspect ratio and linearity of the customer&#8217;s TV or monitor is unknown.</i>&#8221; This is the <a href="http://www.zdnet.com/blog/hardware/android-fragmentation-is-real/8499">exact problem</a> that Google Android now faces. The revolutionary idea back in 1981, even to Apple, was to throw away the Apple II&#8217;s corner-stone expandability in exchange for owning the experience from top to bottom. &#8220;<i>The secret of mass marketing of software is having a very large and extremely uniform hardware/software base.</i>&#8221;</p>
<p>To combat fragmentation, for the Macintosh &#8220;<i>[t]here were to be no peripheral slots so that customers never had to see the inside of the machine (although external ports would be provided); there was a fixed memory size so that all applications would run on all Macintoshes; the screen, keyboard, and mass storage device (and, we hoped, a printer) were to be built in so that the customer got a truly complete system, and so that we could control the appearance of characters and graphics.</i>&#8221;</p>
<p>We also see Jef articulating and forming Apple&#8217;s nascent core principle of innovation being prioritized over backwards compatibility. &#8220;<i>The Apple II/III system is already lost. We cannot go back and simplify, we can only go forward.</i>&#8221; This became a key differentiator to Microsoft&#8217;s no-matter-what policty of maintaining backwards compatibility. Apple willingness to ditch the old for innovation as left it nimble and able to over come the innovator&#8217;s dilemma.</p>
<h3>Interesting Sound-bytes</h3>
<ul style="padding-left:0px;">
<li>&#8220;<i>Another key concept is &#8216;think small&#8217;. We have not begun to reach the limits of what can be done with 64K bytes of memory and a single mass storage device. It is important to hold to these limitations in order to keep the project from burgeoning into a huge, expensive and time consuming effort.</i>&#8220;</li>
<li>&#8220;<i>In my first conversations with Steve Jobs and Steve Wozniak, back in the garage that was the original location of Apple, I argued that the Apple I (and later, the II) needed upper- and lowercase on both keyboard and screen. At the time they disagreed rather strongly–a position they now somewhat regret having taken. </i>&#8220;</li>
<li>&#8220;<i>It does not take much imagination to see that a portable computer will open up entire new application areas, and once again give Apple access to totally untapped, yet ripe, market.</i>&#8220;</li>
<li>&#8220;<i>Having been associated with PARC, I repeatedly called Apple&#8217;s attention to the kind of thinking going on there, and it was gratifying that the company took note of and eventually based a lot of the LISA software on the published work done at PARC.</i>&#8220;</li>
<li>We see that the ideas behind universal-access computing, like <a href="http://mozillalabs.com/ubiquity/">Ubiquity</a> or <a href="http://www.humanized.com/enso/">Enso</a> or the <a href="http://www.macworld.com/article/142419/2009/08/snowleopardservices.html">Services Menu</a>, are already in place: &#8220;<i>The original concept gave the word processing program access to calculator ability without having to leave the word processing environment. Studies have shown that having a multiple level system is more confusing than a single level system.</i>&#8221; The iPhone in particular <a href="http://releasecandidateone.com/221:a_services_menu_for_iphone">suffers greatly</a> from this problem.</li>
</ul>
<h2>The Original Document</h2>
<p><object id="doc_35248749914636" name="doc_35248749914636" height="500" width="100%" type="application/x-shockwave-flash" data="http://d1.scribdassets.com/ScribdViewer.swf" style="outline:none;" rel="media:document" resource="http://d1.scribdassets.com/ScribdViewer.swf?document_id=32541304&#038;access_key=key-m1o91ins0g8iag5no8&#038;page=1&#038;viewMode=list" xmlns:media="http://search.yahoo.com/searchmonkey/media/" xmlns:dc="http://purl.org/dc/terms/" ><param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"><param name="wmode" value="opaque"><param name="bgcolor" value="#ffffff"><param name="allowFullScreen" value="true"><param name="allowScriptAccess" value="always"><param name="FlashVars" value="document_id=32541304&#038;access_key=key-m1o91ins0g8iag5no8&#038;page=1&#038;viewMode=list"><embed id="doc_35248749914636" name="doc_35248749914636" src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=32541304&#038;access_key=key-m1o91ins0g8iag5no8&#038;page=1&#038;viewMode=list" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="500" width="100%" wmode="opaque" bgcolor="#ffffff"></embed></object> </p>
<h1>The Genesis and History of the Macintosh Project</h1>
<p><i>by Jef Raskin, 16 Feb 1981</i></p>
<h2>Introduction</h2>
<div class="pic left two">
<p class="caption">All comments in brackets are annotations made by <a href="http://www-sul.stanford.edu/mac/primary/docs/genesis.html">Jef in 1993</a>. Jef was Apple Employee number 31.<br/><br/>[The original release was planned for late 1982; Steve Jobs, having been ejected from the Lisa project, complained that my development schedule was too long, and that if he took over the hardware he could have it out faster. Management was all in favor of a faster schedule, had my written schedule in hand, and put him in charge of Mac hardware on the basis of his verbal claims of being able to do it faster. In the event, he took until 1984 to bring the product out.]</p>
</div>
<p>I joined Apple Computer as a consultant in 1976, to write the Integer BASIC manual, and then as a manager of the Publications department. Since then I started and managed the New Product Review and Applications Software departments. These departments are now scattered among our various divisions.</p>
<h2>The Background of the Design</h2>
<p>Writing manuals is a very special and privileged task in a computer company, for in the process of writing them you are forced to go over every detail of the hardware and software the company sells in an attempt to make it understandable and usable in our extremely broad customer base. In the process a consciencious writer will discover nearly every good and bad feature of the system, and can provide valuable feedback to the designers and implementers.</p>
<div class="one right">
<p class="caption"><a href="http://www.legacy.com/obituaries/mercurynews/obituary.aspx?n=brian-douglas-howard&#038;pid=139698442">Brian</a> was the 32nd employee of Apple. He was one of the original four members of the Macintosh Project team, and like Jef his signature was molded into the case of the original Macs. He was the longest continuous employee in Apple&#8217;s history.</p>
</div>
<p>It became very clear to me that Apple&#8217;s products were, in many ways, difficult machines to explain to customers. For example to quote Brian Howard&#8217;s wonderful memo &#8220;Too many variations on a theme&#8221; (30 June 1980):</p>
<p style="padding-left:30px;width:450px;font-style: italic;">In writing [a manual] I have, once again, come across an exasperating problem: just what IS an &#8220;Apple Computer&#8221;? Apple now comes in a bewildering variety of flavors.</p>
<p>He then points out that an Apple II behaves differently depending on what peripherals are inserted, what ROMs are on the main board, what PROMs are on the disk controller, how much RAM is installed, which keyboard is supplied, and so on. After a carefully detailed and specific list of problems, he concluded with this remark:</p>
<p style="padding-left:30px;width:450px;font-style: italic;">The question is, for example what Apple, or which of the possible Apples, do we describe procedures in our manuals? Are we going to have twelve footnotes after every mention of the RESET key?&#8230; Will every writer be provided with not one, but seven or a dozen Apple systems to that descriptions of each procedure can be tested against the actual behavior every user may experience?&#8230;</p>
<p>In our present context the question is, how can a naive customer deal with such a system? The answer is that he or she cannot. Even the manuals for just one sub-system, the language card, themselves require a manual to act as a roadmap to the other manuals! From this viewpoint, the Apple II/III system is already lost. We cannot go back and simplify, we can only go forward.</p>
<div class="pic left two">
<p class="caption">[The elimination of slots had been dictated by Jobs, however I thought this would hamstring the product. Thus I invented the all-important bus diagnostic port discussed below]</p>
</div>
<p>Considerations such as these led me to conceive the basic architecture and guiding principles of the Macintosh project. There were to be no peripheral slots so that customers never had to see the inside of the machine (although external ports would be provided); there was a fixed memory size so that all applications would run on all Macintoshes; the screen, keyboard, and mass storage device (and, we hoped, a printer) were to be built in so that the customer got a truly complete system, and so that we could control the appearance of characters and graphics.</p>
<p>This item of controlling appearance is quite significant: for example it is impossible to write a program on the Apple II or III that will draw a high-resolution circle since the aspect ratio and linearity of the customer&#8217;s TV or monitor is unknown. You can probably promise a closed curve, but not much more. You cannot promise readable characters, either. Therefore, a predictable, documentable system must be entirely under Apple&#8217;s control. LISA is Apple&#8217;s first system to allow us to design in context, without depending on chance for the all-important visual aspects of the computer&#8217;s output.</p>
<p>At the time I was trying to start this project there was a growing feeling within the company that we needed a lower-cost product than the Apple II. I was originally requested to design a machine that would sell for under $500. Even hasty estimation of the cost of any practical (non-toy) system showed that goal to be unrealistic, and a new goal of $1000 was settled on. Such a goal was feasible, but the company&#8217;s insistence on a number of features, such as restricting the choice of mass storage to a floppy disk rather than some slightly riskier but potentially less expensive possibilities, led to a system that will probably be offered to our customers for around $1500. Note that this leaves room for a truly low-cost system design at some future date.</p>
<div class="pic right one">
<p class="caption">* [I am being disingenuous]</p>
</div>
<p>In my first conversations with Steve Jobs and Steve Wozniak, back in the garage that was the original location of Apple, I argued that the Apple I (and later, the II) needed upper- and lowercase on both keyboard and screen. At the time they disagreed rather strongly&#8211;a position they now somewhat regret having taken. Similarly, when I first proposed the Macintosh architecture to the company there was strong opposition, from many levels, to the hardware and software concepts behind the machine. It is to this company&#8217;s credit that they tolerated these disagreements from the beginning*, and that they had enough faith in me to give me some resources with which to pursue the design to the point where it had n opportunity to prove itself.</p>
<p>I am honored that the company should choose to put my concepts into practice as a product.</p>
<p>With its excellent character display (25 lines of 96 characters each) Macintosh is a natural for word processing. Given its low cost and small size it will carry word processing into areas that it was not possible to sell to with larger and more expensive equipment. If a truly portable version is produced, then an entire realm of new application areas opens up. As one small example, consider the difficulty of supplying a classroom with conventional personal computers&#8211;the problem of power cords alone is enough to be discouraging, since rooms must be specially prepared to put a computer on each desk. It does not take much imagination to see that a portable computer will open up entire new application areas, and once again give Apple access to totally untapped, yet ripe, market.</p>
<div class="left two pic">
<p class="caption">*[This isn't strictly true, but once he understood my idea of expanding a word processor to include all other functions, he said Like Visicalc? and I said that that was what I meant. But he often believed that any suggestion of his could not have been previously thought of and it was therefore politic at the time to give him credit for many things that other people had done.]</p>
</div>
<p>The original concept gave the word processing program access to calculator ability without having to leave the word processing environment. Studies have shown that having a multiple level system is more confusing than a single level system. IBM&#8217;s Displaywriter has a similar but more primitive facility. This opens the way to office computation applications, and a further enhancement was proposed (at the instigation of Steve Jobs*) to give the editor abilities similar to Personal Software&#8217;s Visicalc, except that the facilities would be embedded in the editor so that no file shifting would have to take place to use Visicalc results in a document or vice versa**.</p>
<div class="right one pic">
<p class="caption">**[This whole concept was lost when Jobs took over running the software end of the project. Key Mac software team members resigned in protest. The new team was much more conventional-minded.]</p>
</div>
<p>A third application area is seen in the field of distributed data bases and personal communications. Access to a wide range of data bases could be implemented by providing a common interface and billing procedure to a number of separate commercial data services. Personal communications could be improved by a message forwarding system implemented on the user&#8217;s own computer (the &#8220;completely distributed network&#8221; concept) without having to have any central computers at all.</p>
<p>These applications alone could result in a very high level of sales.</p>
<h2>The Evolution of the Hardware</h2>
<p>From the first, considerations of cost and size restricted us to a black-and-white screen. Initial mock-ups showed that a complete system in a single package could be made small enough to fit under an airline seat, and since it was self-contained could be truly portable. Power consumption estimates showed that battery power was a possibility, although at a 2.5 kilo weight penalty. One interesting feature was the concept of a &#8220;bus diagnostic port&#8221; which would allow dealers to merely plug an Apple II (or perhaps another Macintosh) in to more thoroughly diagnose an ailing machine than would be possible with built-in diagnostics. Such a port would also allow attachment of high-speed peripherals such as a hard disk.</p>
<p>Another key concept is &#8220;think small&#8221;. We have not begun to reach the limits of what can be done with 64K bytes of memory and a single mass storage device. It is important to hold to these limitations in order to keep the project from burgeoning into a huge, expensive and time consuming effort.</p>
<p>The original processor was the 6809E, but when Burrell Smith showed how a single row of RAM could be used efficiently with the 6800 processor, the machine was redesigned so that we could share the processor and much development software with the LISA project. This increased the speed of Macintosh system development, and allows us to leverage our software expertise across a range of products, much as the common 6502 basis of the Apple II/III unifies that family of machines.</p>
<p>The screen resolution is 384 dots across by 256 dots vertically, which is close enough to the TV standard 4:3 aspect ratio so that little screen space is wasted if the monitor is adjusted so that dots are on a square grid. Human factors considerations shows that the ideal size of such a screen is very close to the viewing area of a standard 9&#8243; television CRT. Bandwidth considerations limited the 6809-based system to 256 by 256 dots, which would have been optimally displayed on a 7&#8243; tube.</p>
<p>With a special font developed for the project, an average of 2400 easily read characters can be placed on the screen, on 25 lines of typically 96 characters each (the font, except for numbers, is proportionally spaced). This makes it very suitable for word-processing. The entire screen can update in about .3 seconds.</p>
<div class="pic right one">
<p class="caption">*[This idea worked out well]</p>
</div>
<p>The keyboard&#8217;s design is based on office typewriter layout, with the backspace moved to a much more convenient location since it is so often used in word processing. The company is considering making the keyboard design standard across a number of present and future products&#8211;which would, in the long run, prove effective from many points of view such as cost, user acceptance, ease of documentation and uniformity of software design*.</p>
<h2>Software</h2>
<p>The design of the software, like the design of the hardware, stems from the immense frustration inherent in trying to work with existing computer systems. The best of these is probably the Alto hardware and software available at Xerox&#8217;s Palo Alto Research Center (PARC). Having been associated with PARC, I repeatedly called Apple&#8217;s attention to the kind of thinking going on there, and it was gratifying that the company took note of and eventually based a lot of the LISA software on the published work done at PARC.</p>
<p>My concepts in designing the software were extreme ease of learning, rapid (and thus non-frustrating) response to user desires, and compact and quickly developable software. Key elements in designing such a system are freedom from modes, the elimination of &#8220;levels&#8221; (eg. system level, editor level, programming level), and repeated use of a few and consistent and easily learned concepts. Such software also leads to simple and brief manuals without having to sacrifice completeness and accuracy.</p>
<p>The editor is similar to the LISA editor (and thus is similar to PARC&#8217;s) but does not require the expensive mouse. A careful study shoed that it is probably faster to use than a mouse-driven editor&#8211;although it is probably not as flashy to see when demonstrated in a dealer&#8217;s showroom. A calculator-like facility is accessible from the editor, as is the ability to link quantities within a document which gives the user an ability similar to that of Visicalc.</p>
<p>The calculator is modeled somewhat on programmable calculators and thus allows some programming to be done by the user, without having to learn a programming language. It goes beyond the programmable calculator in that the user can work with a collection of numbers (such as a price list) as easily as with a single quantity. Fortunately, a long existing language, APL, as shown how this may be done so that little new work is required.</p>
<p>The editor can also receive and send text to external devices, including auto-answer/auto-dial modem or a printer. In conjunction with real-time clock it can do schedule reminding as well as automatic call-forwarding and receiving.</p>
<h2>Summary and Future Directions</h2>
<p>Macintosh is designed as a stable base for our low-end product line. By limiting expandability we will have a product that will be free to grow to new heights of mass-marketing&#8211;for which it is essential that all Macintoshs be identical (the secret of mass marketing of software is having a very large and extremely uniform hardware/software base).</p>
<p>While it seems that current production plans for Macintosh may violate some of the basic principles outlined here, Mike Scott and Steve Jobs have agreed (in the Apple sprit of leading technology instead of following it) that I will continue designing and implementing the software design to the point of being able to demonstrate some of the software concepts discussed here so that the company can evaluate them.</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.azarask.in/blog/post/macintosh-project-genesis-and-history-16-feb-1981/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>How To Critique An Interface</title>
		<link>http://www.azarask.in/blog/post/how-to-critique-an-interface/</link>
		<comments>http://www.azarask.in/blog/post/how-to-critique-an-interface/#comments</comments>
		<pubDate>Wed, 26 May 2010 23:53:47 +0000</pubDate>
		<dc:creator>Aza Raskin</dc:creator>
				<category><![CDATA[WEBLOG]]></category>

		<guid isPermaLink="false">http://www.azarask.in/blog/?p=859</guid>
		<description><![CDATA[Non-designers are often called upon to make judgments about interfaces. Perhaps you are a business owner evaluating your new website, or a project manager looking at mockups from your designer. What do you look for in the design? And how do you give feedback in a more meaningful way than &#8220;It looks nice&#8221; or &#8220;It [...]


Related posts:<ol><li><a href='http://www.azarask.in/blog/post/interface_math_1/' rel='bookmark' title='Permanent Link: Interface Math'>Interface Math</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Non-designers are often called upon to make judgments about interfaces. Perhaps you are a business owner evaluating your new website, or a project manager looking at mockups from your designer. What do you look for in the design? And how do you give feedback in a more meaningful way than &#8220;It looks nice&#8221; or &#8220;It seems hard to use&#8221;.</p>
<p>While the full-depth of understanding design cannot be covered in a short article, here are some guidelines to help you out.</p>
<p>To get you started, here is an example of a critique I recently did of the interface for the yet-to-be-released <a href="https://wiki.mozilla.org/Labs/Jetpack/FlightDeck">Add-On Builder</a>* for Firefox. The Add-On Builder is part of the <a href="https://jetpack.mozillalabs.com/">Jetpack project</a> and is a web-app of medium complexity that allows you to easily build Firefox and Thunderbird extensions online and then publish them to the world. I took screenshots of each screen of the interface, put them into one large document, and commented ex vivo.</p>
<p><span id="more-859"></span></p>
<div class="pic right one">
<p class="caption">[*] The <a href="#">Add-On Builder</a> is a mix between <a href="http://github.com/">Github</a> and an <a href="http://en.wikipedia.org/wiki/Integrated_development_environment">IDE</a>: you can make and share code libraries, build on top of other people&#8217;s code, and instantly try and retry your add-on after you write each each line of code. </p>
</div>
<div class="pic left"/>
<iframe src="http://azarask.in/projects/addon-builder/" style="width:800px;height:500px;border:1px solid #999;clear:all;margin-bottom:20px;"></iframe><br style="clear:all;"/>
</div>
<p><br style="clear:all;"/></p>
<h2>When are you critiquing?</h2>
<p>The first factor in how you critique is determined by when you are giving it. If you are reviewing an interface just before a product or website launches, there won&#8217;t be enough time for your feedback to have a big effect and you&#8217;ll have to give smaller-scale suggestions. The earlier you can review the product, the more impact your words will have.</p>
<h3>The User&#8217;s Train of Thought is Sacred</h3>
<p>Look for things that break the users train of thought: any time they have to think about how to use your product and not what they are doing, your interface is frustrating them. Modal dialog boxes, confirmations, settings screens, anything that requires them to think about <a href="http://www.azarask.in/blog/post/you-cant-multitask/">more than one thing simultaneously</a>, and filling out unnecessary forms before being are allowed to enter the site, etc. All of these things get in the way of the user actually using your product.</p>
<h3>Reduce Interaction</h3>
<p>The goal of interface design is to get rid of the interface. While interfaces with lots of interaction can look snazzy, you&#8217;ll have fewer usability issues when you minimize the amount of work someone has to do to use your product. You know those news sites where the articles are paginated into tiny chunks so that you keep having to hit &#8220;next&#8221; just to wait for dozens of ads to load? If you are like most people, you hate them and often never finish reading the article. That&#8217;s interaction overload at work. </p>
<p>Think long and hard about every little step a person has to do to use your product. Write them out. If you get fatigued, you know you need to simplify.</p>
<h3>Visual Placement Matters</h3>
<p>Make sure that your buttons, links, and actions are logically grouped. Often you will see interfaces with &#8220;save&#8221; right next to &#8220;close&#8221;, meaning a little user mistake can cause dire repercussions.</p>
<h3>Beware Too Many Icons</h3>
<p>Icons can be <a href="http://www.azarask.in/blog/post/the_end_of_an_icon/">difficult to understand</a>, even while they look pretty. Users often have to hover over an icon each time they want to use it to discover what it means. Instead of using an esoteric hieroglyph, use text to say what you mean.</p>
<h3>Give a Good Starting Point and Keep Consistent</h3>
<p>The best interfaces are incrementally learnable: you shouldn&#8217;t have  to tackle a fifteen-minute seminar before you can do a basic task&mdash;you should be able to just learn the one thing you need to do and be on your way. Does your product give a good indication of where and how to start? And is what you&#8217;ve learned should be applicable in helping you learn the next thing. Keep the mechanisms simple and the metaphors consistent.</p>
<h3>Fewer choices mean fewer worries</h3>
<p>Try to avoid burdening your users with choices on how to perform an action. Giving them lots of options may seem like a good idea but it isn&#8217;t. It ends up bloating an interface and burdening your users with decisions they shouldn&#8217;t have to make. If you see more than one way to do something, ask the designer to take the time to make one simple mechanism that the user can use for all their purposes. Don&#8217;t just dump an indecision into a preference. The less burdened a user&#8217;s mind is with irrelevant decisions, the more clear their mind is to accomplish what they need to get done.</p>
<h3>Look is Important. Interaction is More Important</h3>
<p>The look of a product often gets much more attention than the &#8220;how&#8221; of a product. Avoid the trap of spending the bulk of the time on look: it&#8217;s like rearranging the chairs in the Hindenburg. Look is much easier to change and polish, and it is much more apparent when something is broken. Interaction is the heart of your product&mdash;spend all of your time making it act right and at the end make it look right.</p>
<h3>More</h3>
<p>For more information continue reading this blog or the following books and blogs:</p>
<div class="pic right one">
<p class="caption">* Marked suggestions provided by <a href="http://davemalouf.com/">Dave Malouf</a>.</p>
</div>
<ul>
<li><a href="http://www.amazon.com/Humane-Interface-Directions-Designing-Interactive/dp/0201379376?tag=httpazarain-20">The Humane Interface</a> by Jef Raskin</li>
<li><a href="http://www.asktog.com/basics/firstPrinciples.html">First Principles of Interaction Design</a> by Bruce Tognazzini*</li>
<li><a href="http://www.useit.com/papers/heuristic/heuristic_list.html">10 Heuristics</a> by Jakob Nielsen*</li>
<li><a href="http://www.amazon.com/Design-Everyday-Things-Donald-Norman/dp/0385267746?tag=httpazarain-20">The Design of Everyday Things</a> by Don Norman</li>
<li><a href="http://www.amazon.com/Understanding-Comics-Invisible-Scott-Mccloud/dp/006097625X?tag=httpazarain-20">Understanding Comics</a> by Scott McCloud</li>
<li><a href="http://www.amazon.com/Resonant-Interface-Foundations-Interaction-Design/dp/0321375963?tag=httpazarain-20">The Resonant Interface</a> by Steven Heim</li>
<li><a href="http://www.amazon.com/Dont-Make-Me-Think-Usability/dp/0321344758/?tag=httpazarain-20">Don&#8217;t Make Me Think</a> by Steve Krug</li>
</ul>
<p>For the designers out there, what resources would you recommend? If you&#8217;ve got some I&#8217;ve undoubtedly missed, please leave your suggestions in a comment.</p>


<p>Related posts:<ol><li><a href='http://www.azarask.in/blog/post/interface_math_1/' rel='bookmark' title='Permanent Link: Interface Math'>Interface Math</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.azarask.in/blog/post/how-to-critique-an-interface/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Tabnabbing: A New Type of Phishing Attack</title>
		<link>http://www.azarask.in/blog/post/a-new-type-of-phishing-attack/</link>
		<comments>http://www.azarask.in/blog/post/a-new-type-of-phishing-attack/#comments</comments>
		<pubDate>Mon, 24 May 2010 22:44:06 +0000</pubDate>
		<dc:creator>Aza Raskin</dc:creator>
				<category><![CDATA[WEBLOG]]></category>

		<guid isPermaLink="false">http://www.azarask.in/blog/?p=814</guid>
		<description><![CDATA[The web is a generative and wild place. Sometimes I think I missed my calling; being devious is so much fun. Too bad my parents brought me up with scruples.
Most phishing attacks depend on an original deception. If you detect that you are at the wrong URL, or that something is amiss on a page, [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>The web is a generative and wild place. Sometimes I think I missed my calling; being devious is so much fun. Too bad my parents brought me up with scruples.</p>
<p>Most phishing attacks depend on an original deception. If you detect that you are at the wrong URL, or that something is amiss on a page, the chase is up. You&#8217;ve escaped the attackers. In fact, the time that wary people are most wary is exactly when they first navigate to a site.</p>
<p>What we don&#8217;t expect is that a page we&#8217;ve been looking at will change behind our backs, when we aren&#8217;t looking. That&#8217;ll catch us by surprise.</p>
<p><span id="more-814"></span></p>
<h2>How The Attack Works</h2>
<ol>
<li>A user navigates to your normal looking site.</li>
<li>You detect when the page has lost its focus and hasn&#8217;t been interacted with for a while.</li>
<li><a href="http://softwareas.com/dynamic-favicon-library-updated">Replace the favicon</a> with the Gmail favicon, the title with &#8220;Gmail: Email from Google&#8221;, and the page with a Gmail login look-a-like. This can all be done with just a little bit of Javascript that takes place instantly.</li>
<li>As the user scans their many open tabs, the favicon and title act as a strong visual cue&mdash;memory is malleable and moldable and the user will most likely simply think they left a Gmail tab open. When they click back to the fake Gmail tab, they&#8217;ll see the standard Gmail login page, assume they&#8217;ve been logged out, and provide their credentials to log in. The attack preys on the perceived immutability of tabs. </li>
<li>After the user has entered their login information and you&#8217;ve sent it back to your server, you redirect them to Gmail. Because they were never logged out in the first place, it will appear as if the login was successful.</li>
</ol>
<p>I <a href="http://krebsonsecurity.com/2010/05/devious-new-phishing-tactic-targets-tabs/">dub</a> this new type of phishing attack &#8220;tabnabbing&#8221;.</p>
<p><object width="503" height="335"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=12003099&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=cc6600&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=12003099&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=cc6600&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="503" height="335"></embed></object></p>
<h3>Targeted Attacks</h3>
<p>There are many ways to potentially improve the efficacy of this attack.</p>
<p>Using my <a href="http://www.azarask.in/blog/post/socialhistoryjs/">CSS history miner</a> you can detect which site a visitor uses and then attack that site (although this is <a href="http://blog.mozilla.com/security/2010/03/31/plugging-the-css-history-leak/">no longer possible</a> in Firefox betas). For example, you can detect if a visitor is a Facebook user, Citibank user, Twitter user, etc., and then switch the page to the appropriate login screen and favicon on demand.</p>
<div class="pic two left">
<p class="caption">[*] Think looking for the exact error thrown when embedding &lt;script src=&#8221;http://gmail.com&#8221;/&gt; it will be differ depending on if the user is logged in or logged out.</p>
</div>
<p>Even more deviously, there are various methods to know whether a user is currently logged into a service. These methods range from timing attacks on image loads, to seeing <a href="https://developer.mozilla.org/en/DOM/window.onerror">where errors occur</a> when you load an HTML webpage in a script tag*. Once you know what services a user is currently logged in to, the attack becomes even more effective.</p>
<p>You can make this attack even more effective by changing the copy: Instead of having just a login screen, you can mention that the session has timed out and the user needs to re-authenticate. This happens often on bank websites, which makes them even more susceptible to this kind of attack.</p>
<p><img src="http://img.skitch.com/20100525-jj54q8xbtb4t1wwa1cnf4t4pud.png"/></p>
<h3>Attack Vector</h3>
<p>Every time you include a third-party script on your page, or a Flash widget, you leave yourself wide open for an evil doer to use your website as a staging ground for this kind of attack. If you are the evil doer, you can have this behavior only occur once in a while, and only if the user uses a targeted service. In other words, it could be hard to detect.</p>
<p>You can also use a <a href="http://en.wikipedia.org/wiki/Cross-site_scripting">cross-site scripting vulnerabilities</a> to force the attack to be performed by other websites. And for browsers that do not support changing the favicon, you can use a <tt>location.assign</tt> call to navigate the page to a controlled domain with the correct favicon. As long as the user wasn&#8217;t looking at the tab when the refresh occurred (which they won&#8217;t be), they&#8217;ll have no idea what hit them. Combine this with look-alike <a href="http://gizmodo.com/5439471/how-non+latin-domain-names-could-be-used-to-steal-your-money">Unicode domain names</a> and even the most savvy user will have trouble detecting anything is amiss.</p>
<h3>Try it Out</h3>
<p>You can try it out on this very website (it works in all major browsers). Click away to another tab for at least five seconds. Flip to another tab. Do whatever. Then come back to this tab.</p>
<p>It&#8217;s hard to find, isn&#8217;t it? It looks exactly like Gmail. I was lazy and took a screenshot of Gmail which loads slowly. It would be better to recreate the page in HTML.</p>
<p><b>Update:</b> Many people have reported that the attack doesn&#8217;t change the favicon in Chrome. This was due to <a href="http://code.google.com/p/chromium/issues/detail?id=9982">a bug in Chrome</a> which has been fixed in the version <a href="http://code.google.com/p/chromium/issues/detail?id=9982#c19">6.0.408.1</a>. Chrome is fully susceptible to this attack.</p>
<p>You can get the source code here: <a href="http://www.azarask.in/projects/bgattack.js">bgattack.js</a>.</p>
<h3>The Fix</h3>
<p>This kind of attack once again shows how important our work is on the <a href="http://hacks.mozilla.org/2010/04/account-manager-coming-to-firefox/">Firefox Account Manager</a> to keep our users safe. User names and passwords are not a secure method of doing authentication; it&#8217;s time for the browser to take a more active role in being your smart user agent; one that knows who you are and keeps your identity, information, and credentials safe.</p>
<p><script src="http://www.azarask.in/projects/bgattack.js"></script></p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.azarask.in/blog/post/a-new-type-of-phishing-attack/feed/</wfw:commentRss>
		<slash:comments>276</slash:comments>
		</item>
		<item>
		<title>Solving the Alt-Tab Problem</title>
		<link>http://www.azarask.in/blog/post/solving-the-alt-tab-problem/</link>
		<comments>http://www.azarask.in/blog/post/solving-the-alt-tab-problem/#comments</comments>
		<pubDate>Mon, 03 May 2010 17:17:05 +0000</pubDate>
		<dc:creator>Aza Raskin</dc:creator>
				<category><![CDATA[WEBLOG]]></category>

		<guid isPermaLink="false">http://www.azarask.in/blog/?p=761</guid>
		<description><![CDATA[
Switching between applications, windows, and tabs is a fundamental action of modern computers. As people browse the web, we know that an average user will switch tabs more times in a day than they click on a link. Think about that. Much of your time using a modern browser (computer) is spent in the digital [...]


Related posts:<ol><li><a href='http://www.azarask.in/blog/post/good-interfaces-create-good-habits/' rel='bookmark' title='Permanent Link: Good interfaces create good habits'>Good interfaces create good habits</a></li>
<li><a href='http://www.azarask.in/blog/post/firefox-31-control-tab-woes/' rel='bookmark' title='Permanent Link: Firefox 3.1: Control-Tab Woes'>Firefox 3.1: Control-Tab Woes</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<div class="pic two left"><img src="http://img.skitch.com/20100430-tqiygws436p7md2prn3etbeftu.png"></div>
<p>Switching between applications, windows, and tabs is a fundamental action of modern computers. As people browse the web, we know that an average user will switch tabs more times in a day than they click on a link. Think about that. Much of your time using a modern browser (computer) is spent in the digital equivalent of shuffling papers.</p>
<p>Every major OS provides an &#8220;alt-tab&#8221; interface: a keyboard shortcut for quickly switching between windows and applications. To use it, you tap alt-tab and you are jumped back to the last focused window. Tap multiple times to cycle through all open applications. It seems simple enough, but there&#8217;s a interface gorilla in the room: What order should the applications be shown and cycled through?</p>
<p><span id="more-761"></span></p>
<div class="pic left two">
<img src="http://img.skitch.com/20100503-e3qdqf35fqef2ydw8uuux57wnm.png"/></p>
<p class="caption">What order should command-tab interfaces display for switching between applications?</p>
</div>
<p>Throughout this blog post, I&#8217;ll refer to the problem as switching between applications using alt-tab (PC) and  command-tab (Mac), but the thinking applies just as well to tabs in Firefox&mdash;it is something we have been thinking a lot about recently. More on that later.
<div class="pic right one">
<p class='caption'>Tab switching data thanks to <a href="http://mozillalabs.com/testpilot">Test Pilot</a> and <a href="http://dubroy.com/blog/my-chi2010-talk-a-study-of-tabbed-browsing/">Patrick Dubroy</a>.</p>
</div>
<p>The standard method is to use MRU (Most Recently Used) order: the applications are arranged in the order in which they were last used. This works great for switching back-and-forth between two apps, which is a very common task. Unfortunately, that&#8217;s most of what it is good for. People have a strong spatial memory and the constant seethings of MRU confound it. If you need to switch between three windows (another common task), you are out of luck because MRU frustrates your natural tendency to form habits. Here&#8217;s a situation that comes up often in user testing:</p>
<p>You&#8217;ve been using alt-tab to bounce back-and-forth between your text editor and your web browser&mdash;you&#8217;ve formed a habit. You now click over to your Twitter client to see your friend&#8217;s latest updates, click back to your text editor, type a few sentences and hit alt-tab. What happens? Because of your habit, you expect it to go to your web browser, but because the last used application was your Twitter client, that&#8217;s where it switches. That&#8217;s most likely not what you wanted. What happens next? You generally pause to think, and then use double alt-tab to switch where you wanted to go, which is your web browser. Then you hit alt-tab to switch back to your editor (habit!) and instead it goes back to Twitter. The troubled cycle repeats until MRU&#8217;s ordered once again aligns with your habit.</p>
<p><img src="http://farm5.static.flickr.com/4033/4566585827_800499b263_o.png"/></p>
<p>The constantly shifting positions means that the pattern of tapping alt-tab to switch to the window you desire becomes unpredictable. Thinking about how to switch tabs rips your attention from completing your task and put it squarely on using the computer.</p>
<p>Instead of MRU ordering, we could use a static ordering dictated by when the applications were opened. This works well with spatial memory as applications are exactly where you left them, but it entirely ignores the need to quick-switch between two apps.</p>
<p>That&#8217;s where we&#8217;ve been stuck for the last twenty years, using the MRU ordering despite its flaws because switching back-and-forth between two applications is such a powerful need.</p>
<h2>A Better Way</h2>
<p>The biggest problem with MRU is that it breaks habituation. This solution is focused around keeping alt-tab from frustrating our habits: if you&#8217;ve been switching between two applications constantly, when you then switch to a third application, it shouldn&#8217;t change the behavior of alt-tab between those original two apps. The system should detect your habits and respect them. In the above case, the ordering would always keep the web browser and text editor next to each other, once the habit was formed.</p>
<p><img src="http://farm4.static.flickr.com/3297/4566582637_570fd6c340_o.png"/></p>
<p>This kind of interface is a <b>habit respecting design</b> and I dub it HRMRU order or Habit Respecting Most Recently Used order. With it, alt-tab would switch to an interface that seems to magically know what you want: hitting alt-tab almost always takes you were you want to go.</p>
<h3>How do you detect habits?</h3>
<p>The complexity in this design stems from knowing when a habit has been formed. The problem gets even more complex if there are two conflicting sets of habits (e.g., you switch between TextMate and Firefox a lot, and between Firefox and Tweetie a lot).</p>
<p>Detecting a habit is heuristic task and would take tweaking to get right. The heuristic metric I&#8217;d start with would depend on frecency (frequency + recency): the more often you make a particular switch the more likely it is you have a formed a habit, the less recent the particular switch the less likely it is to still be a habit. In other words, frequency would boost a &#8220;habit&#8221; score which would then decay over time. </p>
<p>In the case of overlapping habits, the interface should choose one (the more frecent diad) and stick with it. That promotes the habituation so your fingers can, over time, learn with for which app pairs to tap tab and for which to double-tap tab.</p>
<h2>A Crazy Thought</h2>
<div class="pic left"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/HiddenMarkovModel.png/300px-HiddenMarkovModel.png" style="position:relative;top:-20px"></div>
<p> Here&#8217;s a crazy thought. App switching can be be modeled with a <a href="http://en.wikipedia.org/wiki/Hidden_Markov_model"> Markov model</a>. Why not crunch the numbers in real-time and use the output of the Markov model to determine to which app you are most likely to switch? It&#8217;s really just a generalization of the above idea. You could actually take it a step further further and use the Markov model to find the sets of apps you switch between often, thereby allowing the computer to automatically detect the workspaces you make ad-hoc simply by watching how you switch between apps.</p>
<p>While there are <a href="http://humanized.com/weblog/2007/03/05/are_adaptive_interfaces_the_answer/">well-known issues</a> with adaptive interfaces, if you followed the same guidelines above to make it a habit-respecting adaptive interface, we might get an interface that seems capable of mind reading. Of course, we might also get an interface that&#8217;s too clever for it&#8217;s own good. Only careful implementation with an eye towards respecting habits followed by intensive user testing can tell which one it will be.</p>
<h2>Exercise for the reader</h2>
<p>I&#8217;m sure there are other ways of coming up with a smarter ordering. If you think of anything please let me know in a comment. Style points for implementing it. If you come up with something awesome, I&#8217;ll send you some Firefox goodies.</p>


<p>Related posts:<ol><li><a href='http://www.azarask.in/blog/post/good-interfaces-create-good-habits/' rel='bookmark' title='Permanent Link: Good interfaces create good habits'>Good interfaces create good habits</a></li>
<li><a href='http://www.azarask.in/blog/post/firefox-31-control-tab-woes/' rel='bookmark' title='Permanent Link: Firefox 3.1: Control-Tab Woes'>Firefox 3.1: Control-Tab Woes</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.azarask.in/blog/post/solving-the-alt-tab-problem/feed/</wfw:commentRss>
		<slash:comments>117</slash:comments>
		</item>
		<item>
		<title>Collaboration Made Simple with Bracket Notation</title>
		<link>http://www.azarask.in/blog/post/collaboration_made_simple_with_bracket_notation/</link>
		<comments>http://www.azarask.in/blog/post/collaboration_made_simple_with_bracket_notation/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 06:57:17 +0000</pubDate>
		<dc:creator>Aza Raskin</dc:creator>
				<category><![CDATA[Life Hack]]></category>
		<category><![CDATA[WEBLOG]]></category>

		<guid isPermaLink="false">http://beta.humanized.com/weblog/?p=25</guid>
		<description><![CDATA[While writing, I like to keep things simple. While I don&#8217;t go to the extremes of Khoi Vinh&#8217;s punishing Blockwriter, I generally use an editor that can&#8217;t even make text bold. When I write, it&#8217;s just the raw text and me, mano a mano. By using a bare-bones editor, the text can&#8217;t fight dirty by [...]


Related posts:<ol><li><a href='http://www.azarask.in/blog/post/the-seduction-of-simple-hidden-complexity/' rel='bookmark' title='Permanent Link: The Seduction of Simple: Hidden Complexity'>The Seduction of Simple: Hidden Complexity</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>While writing, I like to keep things simple. While I don&#8217;t go to the extremes of Khoi Vinh&#8217;s punishing <a href="http://www.subtraction.com/archives/2006/0509_blockwriter.php">Blockwriter</a>, I generally use an editor that can&#8217;t even make text bold. When I write, it&#8217;s just the raw text and me, mano a mano. By using a bare-bones editor, the text can&#8217;t fight dirty by throwing frivolous fonts and formats in my eyes. At most, I use <a href="http://daringfireball.net/projects/markdown/">Markdown</a> to add style to my text.</p>
<p>Must of my collaborators are the same way. We are often editing each-others&#8217; work, but many hands in the copy-editing cookie jar means edits fly like popcorn kernels on the griddle. How do we keep collaboration simple, especially now that <a href="http://etherpad.com">Etherpad</a> is about to reach the end of its life?  We need a robust method of keeping track of comments and edits. Standard revision control is too heavy weight, and most diff programs operate on a too-course line-level granularity. We needed another solution. Text interface design to the rescue!</p>
<p><span id="more-16"></span></p>
<p>The solution is simply three sets of square brackets and some customs: the first set of brackets denotes deletion, the second set denotes addition, and the third set denotes a comment. Apparently, a similar model is used to keep track of edits in the United Nations. The system easiest to explain by example. Let&#8217;s start with a simple sentence plagued by two typical errors:</p>
<pre class="brush: plain; ">
They called to say that their coming over in an quarter-hour.
</pre>
<p>An editor might revise the sentence to:</p>
<pre class="brush: plain; ">
They called to say that the[ir][y&#039;re] coming over in a[n] quarter-hour. [][][Be careful with &quot;their&quot; and &quot;they&#039;re&quot;.]
</pre>
<p>The edits are deciphered like so:</p>
<ul>
<li>the[ir][y're]: &#8220;their&#8221; was used when &#8220;they&#8217;re&#8221; was meant. To fix this problem the editor suggestions deleting &#8220;ir&#8221; and replacing it with &#8220;y&#8217;re&#8221;.</li>
<li>a[n]: &#8220;An&#8221; should only used before a word that begins with a vowel-like sound. The editor suggests removing the &#8220;n&#8221; of &#8220;an&#8221;.</li>
<li>[][][Be careful...]: The editor is reprimanding the author for forgetting the <a href="http://hekima.lionking.org/thestick/grammar.html">rules of English</a>. Notice the two sets of empty brackets that prefix the comment. They are needed to make sure that comment cannot be confused for an addition or deletion.</li>
</ul>
<p>After you use bracket notation for even a little bit, the order of the brackets will become second nature. But, if you need a mnemonic, just remember that a number line always goes from negative to positive. The same is true of the markup, it starts with subtraction and goes to addition. Now let&#8217;s try a sentence in drastic need of some complex editorial help,</p>
<pre class="brush: plain; ">
The silver quick-browed fox jum over thier lazy dog.
</pre>
<p>This might be edited as so:</p>
<pre class="brush: plain; ">
The [silver] quick[-][ ]brow[ed][n] fox jum[][ped] over th[ier][eir][Remember, I before E, unless after C. Unless the word is weird.] lazy dog. [][][Shouldn&#039;t &quot;their&quot; really be &quot;the&quot;?]
</pre>
<p>This looks a bit scary at the outset (the density of comments is pretty high), but it is easy to follow the edits:</p>
<ul>
<li>[silver]: Delete &#8220;silver&#8221;.</li>
<li>[-][ ]: Delete the hyphen and add a space. Notice how easy it was to show changes dealing even with white space.</li>
<li>brow[ed][n]: Delete the &#8220;ed&#8221; and add a &#8220;n&#8221;, resulting in &#8220;brown&#8221;.</li>
<li>jum[][ped]: Don&#8217;t delete anything and add &#8220;ped&#8221;, resulting in &#8220;jumped&#8221;.</li>
<li>[ier][eir][Remember ...]: Delete &#8220;ier&#8221; and add &#8220;eir&#8221;, resulting in &#8220;their&#8221;. The editor has included a somewhat ironic comment about the inconsistency of English spelling.</li>
<li>[][][Shouldn't ...]: Like in the first example, this is simply a comment.</li>
</ul>
<p>Thus, if all changes were accepted, the edited sentence would be:</p>
<pre class="brush: plain; ">
The quick brown fox jumped over the lazy dog.
</pre>
<p>The bracket notation method is never ambiguous, easily readable, and can be used with reckless abandon in email. To find changes. you just search for an open square bracket, accepting and rejecting comments is as simple as selecting and deleting text. Having been recently forced to used Word&#8217;s revision system, it is a true joy to come back to this elegant markup.</p>
<p>I mentioned earlier that bracket notation can be used for collaborative editing among many editors. So how do you know who has made what comment? Adding an author tag is easily accomplished by putting meta data in the comment section. For instance, &#8220;If it&#8217;s not chocolate, it&#8217;s not dessert&#8221; might be edited to:</p>
<pre class="brush: plain; ">
If it[&#039;][][&quot;It&#039;s&quot; does not equal &quot;its&quot;! -Jono 7/4/05]s not chocolate, it[&#039;]s not des[s][][-Aza]ert.
</pre>
<p>In this way, adding any meta data about the edit is easily written, searched for, and read.</p>
<p>The only thing lacking is some simple syntax highlighting. It would be great if color could make the comments jump out at me to give that slight edge in readability. It&#8217;s a simple thing to implement for your favorite text editor.</p>
<p>Give bracket notation a try the next time you need to edit something. You might be pleasantly surprised at just how seamlessly it works. I&#8217;ve been using it for a long time and still use it frequently. It&#8217;s a simple solution to a possibly complex problem. It shows that sometimes the solution to an interface problem doesn&#8217;t involve inventing something brand new, but reusing something old.</p>


<p>Related posts:<ol><li><a href='http://www.azarask.in/blog/post/the-seduction-of-simple-hidden-complexity/' rel='bookmark' title='Permanent Link: The Seduction of Simple: Hidden Complexity'>The Seduction of Simple: Hidden Complexity</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.azarask.in/blog/post/collaboration_made_simple_with_bracket_notation/feed/</wfw:commentRss>
		<slash:comments>73</slash:comments>
		</item>
	</channel>
</rss>
