<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:ng="http://newsgator.com/schema/extensions" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>My Clippings on NewsGator Online</title><link>http://www.newsgator.com</link><description>My Clippings on NewsGator Online</description><lastBuildDate>Wed, 09 Sep 2009 16:38:03 GMT</lastBuildDate><ttl>60</ttl><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/newsgator/efJB" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>Rhino - JavaScript for Java</title><link>http://feedproxy.google.com/~r/newsgator/efJB/~3/aAnzwdl4VIg/316526</link><description /><pubDate>Sun, 15 Jun 2008 07:08:47 GMT</pubDate><guid isPermaLink="false">tag:newsgator.com,2006:Feed.aspx/-1/5618334083</guid><source url="http://services.newsgator.com/urlclippedposts.aspx">URL clipped post</source><ng:postId>5618334083</ng:postId><ng:feedId>-1</ng:feedId><ng:folderId>0</ng:folderId><ng:folder ng:id="0" ng:flagState="0" ng:annotation="" /><feedburner:origLink>http://www.newsgator.com/316526</feedburner:origLink></item><item><title>[Sponsor] RipIt</title><link>http://feedproxy.google.com/~r/newsgator/efJB/~3/szERxUphzEI/</link><description>
&lt;p&gt;The simple DVD ripper for Macs is here! Finally, getting your movies onto your computer is easy with one-click ripping. As a special offer to our fellow DF readers, please accept this 25% discount valid until Monday the 31st of August: DARINGFIRE2009&lt;/p&gt;

</description><pubDate>Mon, 24 Aug 2009 15:26:30 GMT</pubDate><guid isPermaLink="false">tag:daringfireball.net,2009:/feeds/sponsors//11.17709</guid><author>Daring Fireball Department of Commerce</author><source url="http://daringfireball.net/index.xml">Daring Fireball</source><ng:postId>10387670006</ng:postId><ng:feedId>3342</ng:feedId><ng:folderId>0</ng:folderId><ng:folder ng:id="0" ng:flagState="0" ng:annotation="" /><feedburner:origLink>http://ripitapp.com/?df</feedburner:origLink></item><item><title>Snow Leopard Ships Friday</title><link>http://feedproxy.google.com/~r/newsgator/efJB/~3/dw_UZN2DZw0/24macosx.html</link><description>
&lt;p&gt;The ship date is &lt;a href="http://daringfireball.net/linked/2009/08/12/snow-leopard-gm"&gt;old news&lt;/a&gt; for DF readers, but it&amp;#8217;s worth the excitement. I&amp;#8217;ve been running the betas full-time since WWDC and it&amp;#8217;s really nice. I can&amp;#8217;t think of a single change that isn&amp;#8217;t an improvement over 10.5.&lt;/p&gt;

&lt;div&gt;
&lt;a  title="Permanent link to ‘Snow Leopard Ships Friday’"  href="http://daringfireball.net/linked/2009/08/24/snow-leopard"&gt;&amp;nbsp;★&amp;nbsp;&lt;/a&gt;
&lt;/div&gt;

	</description><pubDate>Mon, 24 Aug 2009 19:58:11 GMT</pubDate><guid isPermaLink="false">tag:daringfireball.net,2009:/linked//6.17712</guid><author>John Gruber</author><source url="http://daringfireball.net/index.xml">Daring Fireball</source><ng:postId>10388927771</ng:postId><ng:feedId>3342</ng:feedId><ng:folderId>0</ng:folderId><ng:folder ng:id="0" ng:flagState="0" ng:annotation="" /><feedburner:origLink>http://www.apple.com/pr/library/2009/08/24macosx.html</feedburner:origLink></item><item><title>Your questions answered #2</title><link>http://feedproxy.google.com/~r/newsgator/efJB/~3/27G7JIZ8bE4/</link><description>&lt;p&gt;&lt;img src="http://html5doctor.com/wp-content/uploads/2009/07/html5doctor-treatment.gif" alt="Doctor treating a patient illustration" class="alignright size-full wp-image-424" /&gt;Since the launch of the site we&amp;#8217;ve be welcoming questions regarding the HTML 5 spec through the &lt;a href="http://html5doctor.com/contact/"&gt;contact form&lt;/a&gt;.  It doesn&amp;#8217;t matter if you think your question is too &amp;#60;H1&amp;#62;big&amp;#60;/H1&amp;#62; or &amp;#60;small&amp;#62;small&amp;#60;/small&amp;#62; we&amp;#8217;re here to help.&lt;/p&gt;
&lt;p&gt;Last month we decided to pull together a post that covered some of the emails that were sent in through the contact page. Since the publication of the last post we have received a lot more questions regarding the HTML 5 spec and have decided that some of these  warranted another post.&lt;/p&gt;
&lt;h2&gt;Content Type&lt;/h2&gt;
&lt;p&gt;Christian asked:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
In checking out various implementations of html5 around the web with a quick &amp;#8220;view source&amp;#8221;, I find everyone seems to specify content type in the headers like so; &amp;#60;meta http-equiv=&amp;#8221;content-type&amp;#8221; content=&amp;#8221;text/html;charset=utf-8&amp;#8243;&amp;#62; even though it&amp;#8217;s already a part of the HTTP header.&lt;/p&gt;
&lt;p&gt;Does it really need to be in both locations, or can we all cut out that redundancy as long as our servers are specifying the content type appropriately in the HTTP header?
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;If you take a look at Dr.Bruce&amp;#8217;s weblog &lt;a href="http://www.brucelawson.co.uk/" title="Bruce Lawson"&gt;http://www.brucelawson.co.uk/&lt;/a&gt; you will see that most of the information can be cut out and simplified. As more and more sites make the jump to HTML 5 you will be able to see what elements can and cannot be left out. If you&amp;#8217;re interested in checking out more sites then please feel free to visit our sister site &lt;a href="http://html5gallery.com"&gt;HTML 5 Gallery&lt;/a&gt; where you will be able to view the source of plenty of sites that are already sporting HTML 5 elements in their markup.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re looking to take your reading even further then Dr. Remy has recently published an article entitled &lt;a href="http://html5doctor.com/html-5-boilerplates/" title="html 5 boilerplates"&gt;HTML5 boilerplates&lt;/a&gt; which should give you more information on the above.&lt;/p&gt;
&lt;h2&gt;HTML 5 &amp;amp; SEO&lt;/h2&gt;
&lt;p&gt;Julio asked:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
I&amp;#8217;m thinking of using HTML 5 in my projects as soon as possible, but I need to be sure that everything will work just as fine as HTML 4. My question is: Google (and other search engines) is already indexing HTML 5 sites? In terms of SEO, will I have any drawbacks?
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In answer to your question, yes Google is indexing HTML 5 sites. Between &lt;a href="http://html5doctor.com/about/" title="the html 5 doctors"&gt;us&lt;/a&gt; we run several sites built with HTML 5 markup and none of the Doctors have had any issues with our sites being indexed or competitive on key phrases.&lt;/p&gt;
&lt;p&gt;&lt;aside&gt;&lt;q&gt;Yes, Google is indexing &lt;abbr&gt;HTML&lt;abbr&gt; 5.&lt;/q&gt;&lt;/aside&gt;&lt;/p&gt;
&lt;p&gt;In fact if you look at the source code of google.com you&amp;#8217;ll see that their doctype is declared as &amp;#60;! doctype html&amp;#62; meaning it&amp;#8217;s using HTML 5! Another site that is part of the Google group, Youtube, has also recently created a mock-up of their layout that can be found at &lt;a href="http://www.youtube.com/html5"&gt;http://www.youtube.com/html5&lt;/a&gt; and this definitely shows that they are thinking about it. One last fact to help settle your nerves, if we&amp;#8217;ve not managed to do it already, is that Ian Hickson who is writing the bulk of the HTML 5 spec works for Google so we don&amp;#8217;t think you&amp;#8217;ll have any problems.&lt;/p&gt;
&lt;h2&gt;HTML 5 Templates&lt;/h2&gt;
&lt;p&gt;Klaus asked:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Where can if find HTML 5 Templates?
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;When this email came in, we weren&amp;#8217;t too sure by what Klaus meant so we&amp;#8217;re tackling his question with two responses.&lt;/p&gt;
&lt;p&gt;For static HTML pages you&amp;#8217;d be hard pushed to find a better resource than Remy&amp;#8217;s boilerplate explained here: &lt;a href="http://html5doctor.com/html-5-boilerplates/" title="html 5 templates"&gt;http://html5doctor.com/html-5-boilerplates/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;However, if you are looking for some HTML 5 Wordpress themes then have a look at the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.brucelawson.co.uk/2009/redesigning-with-html-5-wai-aria/" title="Bruce Lawson HTML 5 wordpress theme"&gt;http://www.brucelawson.co.uk/2009/redesigning-with-html-5-wai-aria/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://diggingintowordpress.com/2009/07/free-html-5-wordpress-theme/" title="Digging into Wordpress HTML 5 theme"&gt;http://diggingintowordpress.com/2009/07/free-html-5-wordpress-theme/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.thatstandardsguy.co.uk/blog/2009/04/03/brave-new-world-wordpress-theme/" title="That Standards guy HTML 5 wordpress theme"&gt;http://www.thatstandardsguy.co.uk/blog/2009/04/03/brave-new-world-wordpress-theme/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;WebSocket Support&lt;/h2&gt;
&lt;p&gt;Dave asked:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
There&amp;#8217;s a lot of features, and I can&amp;#8217;t find anywhere that lists current support in major browser versions (and/or with Google Gears).  The particular one I&amp;#8217;m looking for is WebSocket support
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This is a good resource for checking the state of browser support for a particular feature: &lt;a href="http://a.deveria.com/caniuse/"&gt;http://a.deveria.com/caniuse/&lt;/a&gt; Regarding web workers specifically, we&amp;#8217;ve come across a library that implements Web Sockets and falls away when it&amp;#8217;s available natively.&lt;/p&gt;
&lt;p&gt;None of the doctors have used these personally but feel that they will be useful in answer to your question:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://orbited.org/ title="Orbited.org""&gt;http://orbited.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://molly.com/html5/html5-0709.html" title="Molly on HTML 5"&gt;http://molly.com/html5/html5-0709.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Comparison_of_layout_engines_(HTML_5)" title="HTML 5 layout engines"&gt;http://en.wikipedia.org/wiki/Comparison_of_layout_engines_(HTML_5)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wiki.whatwg.org/wiki/Implementations_in_Web_browsers" title="Working group on implementation in web browsers"&gt;http://wiki.whatwg.org/wiki/Implementations_in_Web_browsers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Reusing Elements Within Same Page&lt;/h2&gt;
&lt;p&gt;Daniel asked:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Dear Doctor,&lt;br /&gt;
Just a quick confirmation please. Am I right in thinking that nav, like header and footer, can be used more than once in a single page?  For example, surrounding a menu at the top of the page and surrounding next/previous buttons at the bottom. Come to think of it, is it fair to say that all tags except html, head and body can be used more than once?&lt;br /&gt;
Thanks in advance, doctor.&lt;br /&gt;
I&amp;#8217;ll be back soon about my dodgy knee.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Yes, for more information please reference this article &amp;#8211; &lt;a href="http://html5doctor.com/designing-a-blog-with-html5/" title="designing a blog with html 5"&gt;http://html5doctor.com/designing-a-blog-with-html5/&lt;/a&gt; and this diagram of a single blog entry (of course, there can be many blog entries on a page) &lt;a href="http://html5doctor.com/wp-content/uploads/2009/06/html5-article-outline.gif" title="diagram of HTML 5 blog"&gt;http://html5doctor.com/wp-content/uploads/2009/06/html5-article-outline.gif&lt;/a&gt; probably.&lt;/p&gt;
&lt;p&gt;Other articles that we have already covered on the site &amp;#8211; &lt;a href="http://html5doctor.com/the-header-element/" title="html 5 header element"&gt;http://html5doctor.com/the-header-element/&lt;/a&gt;, &lt;a href="http://html5doctor.com/the-footer-element/" title="html 5 footer element"&gt;http://html5doctor.com/the-footer-element/&lt;/a&gt; and a great article on the &lt;a href="http://html5doctor.com/nav-element/" title="html 5 nav element"&gt;http://html5doctor.com/nav-element/&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Learning HTML/XHTML Before Reading About HTML 5&lt;/h2&gt;
&lt;p&gt;Manuel asked:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Hi, I&amp;#8217;m new to this field and I would like to learn HTML.&lt;/p&gt;
&lt;p&gt;If I understand correctly, most future web sites will be written in HTML5 (served using the text/html MIME type) and just a few sites will use XHTML5 (served using the application/xhtml+xml MIME type). As a consequence, I will focus on HTML5.&lt;/p&gt;
&lt;p&gt;HTML5 can use both the HTML syntax and the stricter XHTML syntax, but since I&amp;#8217;m starting from scratch I suppose I could safely ignore the XHTML syntax and focus on the HTML syntax (HTML 4.1/5). Why bother about XHTML syntax in 2009? Unfortunately all modern introductory book/online resources about HTML are focused on the XHTML syntax. Where I could learn the pure HTML syntax without any reference to the useless and distracting (for my purposes) XHTML syntax?
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Your best bet would be to get into the good coding practices of &lt;abbr&gt;XHTML&lt;/abbr&gt; (lowercase tag, always closing tags, etc.) while writing HTML, there are a number of resources on the Internet for learning HTML 4.01 which you shouldn&amp;#8217;t have any problems finding. A particular favorite of mine when I was starting out was &lt;a href="http://htmldog.com/"&gt;HTMLDog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We understand the issue of a number of the resources use the XHTML sytax but as I said above this will get you into good coding habits when writing HTML (particularly as HTML is less strict).&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
thank you for your quick reply. You won me: I will learn XHTML (from HTMLDog). Just a last question: when in the next future I will make the transition to HTML5 (served using the text/html MIME type) I hope the XHTML syntax validates anyway, so that I will have just to change the doctype of my pages to &amp;#60;!DOCTYPE html&amp;#62;. Right? (My fear is that the XHTML syntax will require a XHTML5 doctype).
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This is correct though you won&amp;#8217;t get the extra semantics added by HTML 5. For that I suggest you read the articles that appear on the site. If you want to use semantic class naming in your current XHTML I suggest you see the related links after &amp;#8216;Automated Conversion&amp;#8217; in this post. &amp;#8211; &lt;a href="http://html5doctor.com/your-questions-answered-1/"&gt;http://html5doctor.com/your-questions-answered-1/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;There we have it folks&amp;hellip;&lt;/h2&gt;
&lt;p&gt;Another quick round up of some of the more difficult questions we&amp;#8217;ve had to respond to over the last few weeks. We hope that you&amp;#8217;ll find this article helpful and remember that if you have a question that hasn&amp;#8217;t been covered in an article so far feel free to get in touch, you never know, your question might just appear in one of these posts.&lt;/p&gt;
</description><pubDate>Thu, 20 Aug 2009 08:39:09 GMT</pubDate><guid isPermaLink="false">http://html5doctor.com/?p=618</guid><comments>http://html5doctor.com/your-questions-answered-2/#comments</comments><author>Jack Osborne</author><source url="http://html5doctor.com/feed/">HTML5 Doctor</source><ng:postId>10364770744</ng:postId><ng:feedId>5371525</ng:feedId><ng:folderId>0</ng:folderId><ng:folder ng:id="0" ng:flagState="0" ng:annotation="" /><feedburner:origLink>http://html5doctor.com/your-questions-answered-2/</feedburner:origLink></item><item><title>Visualizing up to ten dimensions</title><link>http://feedproxy.google.com/~r/newsgator/efJB/~3/WmvcE-P4n4U/visualizing-up-to-te.html</link><description>

&lt;object width="480" height="392" data="http://flash.revver.com/player/1.0/player.swf?mediaId=99898&amp;affiliate=33530" type="application/x-shockwave-flash" id="revver99898125059494323816773"&gt;&lt;param name="Movie" value="http://flash.revver.com/player/1.0/player.swf?mediaId=99898&amp;affiliate=33530"&gt;&lt;/param&gt;&lt;param name="FlashVars" value="allowFullScreen=true"&gt;&lt;/param&gt;&lt;param name="AllowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="AllowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;embed type="application/x-shockwave-flash" src="http://flash.revver.com/player/1.0/player.swf?mediaId=99898&amp;affiliate=33530" pluginspage="http://www.macromedia.com/go/getflashplayer" allowScriptAccess="always" flashvars="allowFullScreen=true" allowfullscreen="true" height="392" width="480"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;p&gt;
Bowloftoast sez, "This is a short animation that takes the viewer through a progressive description of all (and all possible) dimensions, up to and including the 10th. It is an elegant introduction to the fundamentals of string theory and a mind-blowing toe-dip into the pool of the  metaphysical."

&lt;p&gt;
&lt;a href="http://tenthdimension.com/medialinks.php"&gt;Imagining the Tenth Dimension&lt;/a&gt;

(&lt;i&gt;Thanks, Bowloftoast!&lt;/i&gt;)&lt;br clear="both" style="clear: both;"/&gt;
&lt;br clear="both" style="clear: both;"/&gt;
&lt;a href="http://ads.pheedo.com/click.phdo?s=5da663dab168f473ce4c0b73f19bc78f&amp;p=1"&gt;&lt;img alt="" style="border: 0;" border="0" src="http://ads.pheedo.com/img.phdo?s=5da663dab168f473ce4c0b73f19bc78f&amp;p=1"/&gt;&lt;/a&gt;
&lt;img src="http://feeds.feedburner.com/~r/boingboing/iBag/~4/hJQdJjjWiCE" height="1" width="1"/&gt;</description><pubDate>Tue, 18 Aug 2009 11:30:13 GMT</pubDate><guid isPermaLink="false">tag:www.boingboing.net,2009://1.65543</guid><author>Cory Doctorow</author><source url="http://boingboing.net/rss.xml">Boing Boing</source><ng:postId>10351689675</ng:postId><ng:feedId>476450</ng:feedId><ng:folderId>0</ng:folderId><ng:folder ng:id="0" ng:flagState="0" ng:annotation="" /><feedburner:origLink>http://feedproxy.google.com/~r/boingboing/iBag/~3/hJQdJjjWiCE/visualizing-up-to-te.html</feedburner:origLink></item><item><title>Chemex coffee brewing guide</title><link>http://feedproxy.google.com/~r/newsgator/efJB/~3/WSRp8Y1P8V8/chemex-coffee-brewin.html</link><description>&lt;object width="500" height="288"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6161817&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=6161817&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="500" height="288"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;br clear="all"&gt;&lt;P&gt;
The inventor of the beautiful Chemex brewer, Peter Schlumbohm, once said, "&lt;a href="http://boingboing.net/2008/06/12/with-the-chemex-even.html"&gt;With the Chemex, even a moron can make good coffee&lt;/a&gt;.” Now, &lt;a href="http://www.intelligentsiacoffee.com/"&gt;Intelligentsia Coffee&lt;/a&gt; has produced a terrific video that will show morons how to make &lt;em&gt;terrific&lt;/em&gt; coffee. 

&lt;P&gt;&lt;div class="previously2"&gt;
&lt;em&gt;Previously:&lt;/em&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.boingboing.net/2008/06/16/bbtv-a-morning-at-in.html#previouspost"&gt;BBtv: A Morning at Intelligentsia - Boing Boing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.boingboing.net/2008/06/20/bbtv-a-morning-at-in-1.html#previouspost"&gt;BBtv: A Morning at Intelligentsia Coffee Part 2 - Boing Boing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.boingboing.net/coffee/#previouspost"&gt;Boing Boing: Coffee Archives&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.boingboing.net/2008/10/08/bbtv-looking-for-the.html#previouspost"&gt;(BBtv) Looking for the Perfect Bean: Kyle Glanville&amp;#39;s World Coffee ...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.boingboing.net/2009/01/21/barista-championship.html#previouspost"&gt;Barista Championships Coming to LA - Boing Boing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.boingboing.net/2005/08/09/espresso_crema_shots.html#previouspost"&gt;Boing Boing: Espresso crema shots&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;br clear="both" style="clear: both;"/&gt;
&lt;br clear="both" style="clear: both;"/&gt;
&lt;a href="http://ads.pheedo.com/click.phdo?s=6ad0bfa906f4b0aa556cf3d0a61101a9&amp;p=1"&gt;&lt;img alt="" style="border: 0;" border="0" src="http://ads.pheedo.com/img.phdo?s=6ad0bfa906f4b0aa556cf3d0a61101a9&amp;p=1"/&gt;&lt;/a&gt;
&lt;img src="http://feeds.feedburner.com/~r/boingboing/iBag/~4/07VLxSFzMnk" height="1" width="1"/&gt;</description><pubDate>Tue, 18 Aug 2009 17:18:28 GMT</pubDate><guid isPermaLink="false">tag:www.boingboing.net,2009://1.65568</guid><author>Mark Frauenfelder</author><source url="http://boingboing.net/rss.xml">Boing Boing</source><ng:postId>10353395515</ng:postId><ng:feedId>476450</ng:feedId><ng:folderId>0</ng:folderId><ng:folder ng:id="0" ng:flagState="0" ng:annotation="" /><feedburner:origLink>http://feedproxy.google.com/~r/boingboing/iBag/~3/07VLxSFzMnk/chemex-coffee-brewin.html</feedburner:origLink></item><item><title>Benjamin Franklin’s Daily Schedule</title><link>http://feedproxy.google.com/~r/newsgator/efJB/~3/Egi-oJo4Hdw/benjamin-franklins-daily-schedule-via-nick</link><description>
&lt;p&gt;Buzz Andersen:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Franklin’s plan is an inspiration to me because it reminds me why I went down the tough road of being an indie developer in the first place: to live a more balanced, reflective life.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A nice page design, too.&lt;/p&gt;

&lt;div&gt;
&lt;a  title="Permanent link to ‘Benjamin Franklin’s Daily Schedule’"  href="http://daringfireball.net/linked/2009/08/15/ben-franklin-schedule"&gt;&amp;nbsp;★&amp;nbsp;&lt;/a&gt;
&lt;/div&gt;

	</description><pubDate>Sat, 15 Aug 2009 19:13:09 GMT</pubDate><guid isPermaLink="false">tag:daringfireball.net,2009:/linked//6.17671</guid><author>John Gruber</author><source url="http://daringfireball.net/feeds/combo">Daring Fireball</source><ng:postId>10337700231</ng:postId><ng:feedId>5289488</ng:feedId><ng:folderId>0</ng:folderId><ng:folder ng:id="0" ng:flagState="0" ng:annotation="" /><feedburner:origLink>http://log.scifihifi.com/post/161617118/benjamin-franklins-daily-schedule-via-nick</feedburner:origLink></item><item><title>It Never Stops</title><link>http://feedproxy.google.com/~r/newsgator/efJB/~3/og8d8gahS6o/</link><description>
&lt;p&gt;Lovely piece by Maira Kalman on Ben Franklin:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Don&amp;#8217;t mope in your room. Go invent something. That is the American message.&lt;/p&gt;
  
  &lt;p&gt;Electricity. Flight. The telephone. Television. Computers. Walking on the moon. It never stops.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div&gt;
&lt;a  title="Permanent link to ‘It Never Stops’"  href="http://daringfireball.net/linked/2009/08/02/kalman-franklin"&gt;&amp;nbsp;★&amp;nbsp;&lt;/a&gt;
&lt;/div&gt;

	</description><pubDate>Sun, 02 Aug 2009 15:57:43 GMT</pubDate><guid isPermaLink="false">tag:daringfireball.net,2009:/linked//6.17581</guid><author>John Gruber</author><source url="http://daringfireball.net/index.xml">Daring Fireball</source><ng:postId>10257134361</ng:postId><ng:feedId>3342</ng:feedId><ng:folderId>0</ng:folderId><ng:folder ng:id="0" ng:flagState="0" ng:annotation="" /><feedburner:origLink>http://kalman.blogs.nytimes.com/2009/07/30/can-do/</feedburner:origLink></item><item><title>How to make kombucha</title><link>http://feedproxy.google.com/~r/newsgator/efJB/~3/Ftq7AAWKX3U/how-to-make-kombucha.html</link><description>I first started making kombucha in 1995, but when we had our first child in 1997, I was knocked out of many patterns, including making this tasty fermented beverage. About a month ago I started making it again. It's really easy. 

&lt;p&gt;Before you make your own kombucha, here are a few reasons why you might not want to:
&lt;ul&gt;
&lt;li&gt;Paul Stamets: &lt;a href="http://www.fungi.com/info/articles/blob.html"&gt;"The danger of misuse should be a prevailing concern for us all"&lt;/a&gt;
&lt;li&gt;CDC: &lt;a href="http://www.cdc.gov/mmwr/preview/mmwrhtml/00039742.htm"&gt;Unexplained severe illness possibly associated with consumption of kombucha tea&lt;/a&gt;
&lt;li&gt;Journal of Intensive Care Medicine: &lt;a href="http://jic.sagepub.com/cgi/content/abstract/24/3/205"&gt;A case of kombucha tea toxicity&lt;/a&gt;
&lt;/ul&gt;

&lt;p&gt;Why do I drink it? Because it's fun to make and the flavor is almost addictive. The benefits outweigh the risks, at least for me. Here's how I make it. (Click on photos for enlargement.):

&lt;p&gt;

&lt;a href="http://www.boingboing.net/IMG_9518.jpg" onclick="window.open('http://www.boingboing.net/IMG_9518.jpg','popup','width=1000,height=750,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"&gt;&lt;img src="http://www.boingboing.net/IMG_9518-tm.jpg" height="187" width="250" border="0" align="left" hspace="4" vspace="4" alt="Img 9518" /&gt;&lt;/a&gt;

&lt;br clear="all"&gt;&lt;P&gt;
&lt;strong&gt;1. Get some live kombucha.&lt;/strong&gt;  I foolishly paid $25 to an online store that sells the culture in little vials (as seen above). As I later found out, you can buy a bottle of kombucha for a few dollars at grocery store and use that as your starter.
If you have a friend who makes it, ask them for a "mother" (the floppy, blobby, disc that floats on top of a batch of kombucha) and a cup of the kombucha tea.

&lt;br clear="all"&gt;&lt;P&gt;

&lt;a href="http://www.boingboing.net/IMG_9530.jpg" onclick="window.open('http://www.boingboing.net/IMG_9530.jpg','popup','width=1000,height=750,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"&gt;&lt;img src="http://www.boingboing.net/IMG_9530-tm.jpg" height="187" width="250" border="0" align="left" hspace="4" vspace="4" alt="Img 9530" /&gt;&lt;/a&gt;

&lt;br clear="all"&gt;&lt;P&gt;
&lt;strong&gt;2. Collect the ingredients:&lt;/strong&gt; sugar, vinegar (or a half cup of the kombucha tea from your last batch), tea bags (any kind). I used green tea for my first batch, but I'm now using decaf black tea. 
&lt;br clear="all"&gt;&lt;P&gt;

&lt;a href="http://www.boingboing.net/IMG_9536.jpg" onclick="window.open('http://www.boingboing.net/IMG_9536.jpg','popup','width=1000,height=750,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"&gt;&lt;img src="http://www.boingboing.net/IMG_9536-tm.jpg" height="187" width="250" border="0" align="left" hspace="4" vspace="4" alt="Img 9536" /&gt;&lt;/a&gt;

&lt;br clear="all"&gt;&lt;P&gt;&lt;strong&gt;3. Add 4-8 tea bags into a little less than one gallon of water.&lt;/strong&gt; I used filtered water and a ceramic crock. I've heard you shouldn't use metal containers to make kombucha. Let it steep for a while. You can use hot water to steep the tea, but let it cool down before you add any culture (to prevent killing it).
&lt;br clear="all"&gt;&lt;P&gt;


&lt;a href="http://www.boingboing.net/IMG_9554.jpg" onclick="window.open('http://www.boingboing.net/IMG_9554.jpg','popup','width=1000,height=750,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"&gt;&lt;img src="http://www.boingboing.net/IMG_9554-tm.jpg" height="187" width="250" border="0" align="left" hspace="4" vspace="4" alt="Img 9554" /&gt;&lt;/a&gt;

&lt;br clear="all"&gt;&lt;P&gt;&lt;strong&gt;4. Stir in 1 or 1 and 1/2 cups of sugar.&lt;/strong&gt; The sugar is the fuel for the kombucha microbes. I have been using one cup of sugar, but in the batch I started yesterday I used one and one-half cups because I want it to be stronger and more vinegary. I have heard that the more sour it is, the more resistant it is to bacterial infection. (How do you like my hand carved spoon?)&lt;br clear="all"&gt;&lt;P&gt;

&lt;a href="http://www.boingboing.net/IMG_9559.jpg" onclick="window.open('http://www.boingboing.net/IMG_9559.jpg','popup','width=1000,height=750,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"&gt;&lt;img src="http://www.boingboing.net/IMG_9559-tm.jpg" height="187" width="250" border="0" align="left" hspace="4" vspace="4" alt="Img 9559" /&gt;&lt;/a&gt;

&lt;br clear="all"&gt;&lt;P&gt;&lt;strong&gt;5. Stir in 1/2 cup of kombucha from your last batch&lt;/strong&gt;, or 1/4 cup of vinegar and a vial of expensive kombucha culture you foolishly purchased over the Internet. &lt;br clear="all"&gt;&lt;P&gt;


&lt;a href="http://www.boingboing.net/IMG_9613.jpg" onclick="window.open('http://www.boingboing.net/IMG_9613.jpg','popup','width=1000,height=750,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"&gt;&lt;img src="http://www.boingboing.net/IMG_9613-tm.jpg" height="187" width="250" border="0" align="left" hspace="4" vspace="4" alt="Img 9613" /&gt;&lt;/a&gt;

&lt;br clear="all"&gt;&lt;P&gt;&lt;strong&gt;6. Cover crock with cloth for a week.&lt;/strong&gt; If a "mushroom" (not a real  mushroom) has grown on the surface, that means it worked! Save the mushroom and use it to cover your next batch. In a week, the mushroom will have another mushroom attached to it that you can peel off and use, discard, or give away.&lt;br clear="all"&gt;&lt;P&gt;

&lt;a href="http://www.boingboing.net/IMG_0017.jpg" onclick="window.open('http://www.boingboing.net/IMG_0017.jpg','popup','width=750,height=1000,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false"&gt;&lt;img src="http://www.boingboing.net/IMG_0017-tm.jpg" height="333" width="250" border="0" align="left" hspace="4" vspace="4" alt="Img 0017" /&gt;&lt;/a&gt;

&lt;br clear="all"&gt;&lt;P&gt;&lt;strong&gt;7. Transfer the tangy, fizzy beverage into a bottle and refrigerate.&lt;/strong&gt; Some websites say not to store kombucha in plastic but I like this one gallon bottle.&lt;br clear="all"&gt;&lt;P&gt;

&lt;p&gt;If you have any tips to share about kombucha, please put them in the comments.

&lt;br clear="both" style="clear: both;"/&gt;
&lt;br clear="both" style="clear: both;"/&gt;
&lt;a href="http://ads.pheedo.com/click.phdo?s=9871433ced50b61bbe603b4943d6aaac&amp;p=1"&gt;&lt;img alt="" style="border: 0;" border="0" src="http://ads.pheedo.com/img.phdo?s=9871433ced50b61bbe603b4943d6aaac&amp;p=1"/&gt;&lt;/a&gt;
&lt;img src="http://feeds.feedburner.com/~r/boingboing/iBag/~4/COTZIeDpAAw" height="1" width="1"/&gt;</description><pubDate>Wed, 29 Jul 2009 21:36:46 GMT</pubDate><guid isPermaLink="false">tag:www.boingboing.net,2009://1.64659</guid><author>Mark Frauenfelder</author><source url="http://boingboing.net/rss.xml">Boing Boing</source><ng:postId>10234093273</ng:postId><ng:feedId>476450</ng:feedId><ng:folderId>0</ng:folderId><ng:folder ng:id="0" ng:flagState="0" ng:annotation="" /><feedburner:origLink>http://feedproxy.google.com/~r/boingboing/iBag/~3/COTZIeDpAAw/how-to-make-kombucha.html</feedburner:origLink></item><item><title>HTML 5 Reset Stylesheet</title><link>http://feedproxy.google.com/~r/newsgator/efJB/~3/S3kkxyIMqSI/</link><description>&lt;p&gt;We&amp;#8217;ve had a number of people asking about templates, boilerplates and styling for &lt;abbr&gt;HTML&lt;/abbr&gt; 5 so to give you all a helping hand and continue on from those &lt;a href="http://feedproxy.google.com/html-5-boilerplates/"&gt;basic building blocks&lt;/a&gt; that &lt;a href="http://feedproxy.google.com/author/remys/"&gt;Remy&lt;/a&gt; talked about last week I&amp;#8217;ve created a HTML 5 reset stylesheet for you to take away and use, edit, amend and update in your projects.&lt;/p&gt;
&lt;p&gt;Based on &lt;a href="http://meyerweb.com/eric/tools/css/reset/"&gt;Eric Meyers &lt;abbr&gt;CSS&lt;/abbr&gt; reset&lt;/a&gt;, I&amp;#8217;ve made a few adjustments from Erics work that we&amp;#8217;ll get to later but first here&amp;#8217;s the file in full and we&amp;#8217;ll then break it down step by step.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/*
html5doctor.com Reset Stylesheet
v1.4
2009-07-27
Author: Richard Clark - http://richclarkdesign.com
*/

html, body, div, span, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
abbr, address, cite, code,
del, dfn, em, img, ins, kbd, q, samp,
small, strong, sub, sup, var,
b, i,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, dialog, figure, footer, header,
hgroup, menu, nav, section, menu,
time, mark, audio, video {
	margin:0;
	padding:0;
	border:0;
	outline:0;
	font-size:100%;
	vertical-align:baseline;
	background:transparent;
}
body {
	line-height:1;
}

article, aside, dialog, figure, footer, header,
hgroup, nav, section {
	display:block;
}

nav ul {
	list-style:none;
}

blockquote, q {
	quotes:none;
}

blockquote:before, blockquote:after,
q:before, q:after {
	content:'';
	content:none;
}

a {
	margin:0;
	padding:0;
	border:0;
	font-size:100%;
	vertical-align:baseline;
	background:transparent;
}

ins {
	background-color:#ff9;
	color:#000;
	text-decoration:none;
}

mark {
	background-color:#ff9;
	color:#000;
	font-style:italic;
	font-weight:bold;
}

del {
	text-decoration: line-through;
}

abbr[title], dfn[title] {
	border-bottom:1px dotted #000;
	cursor:help;
}

table {
	border-collapse:collapse;
	border-spacing:0;
}

hr {
    display:block;
    height:1px;
    border:0;
    border-top:1px solid #cccccc;
    margin:1em 0;
    padding:0;
}

input, select {
	vertical-align:middle;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;So what&amp;#8217;s new then?&lt;/h2&gt;
&lt;p&gt;Well firstly, I&amp;#8217;ve removed those elements that have been deprecated from the &lt;abbr&gt;HTML&lt;/abbr&gt; 5 specification such as &lt;code&gt;&amp;lt;acronym&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;font&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;big&amp;gt;&lt;/code&gt; (We&amp;#8217;ll cover deprecated elements in more detail in another post). I&amp;#8217;ve added in the the new &lt;abbr&gt;HTML&lt;/a&gt; 5 elements to the reset, to remove any default padding, margin and borders. I&amp;#8217;ve then added the explicit &lt;code&gt;display:block&lt;/code&gt; declaration for those elements that are required to render as blocks.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve also removed the &lt;code&gt;:focus&lt;/code&gt; part from Eric&amp;#8217;s stylesheet. There are two reasons for this; the first is that by declaring &lt;code&gt;outline:0&lt;/code&gt; you remove the focus identifier for keyboard users. The second is that although Eric released his stylesheet in good faith that people would edit it and style :focus, they don&amp;#8217;t. You will also notice that I&amp;#8217;ve set defaults for &lt;code&gt;&amp;lt;ins&amp;gt;&lt;/code&gt; as I don&amp;#8217;t think they got updated very often in Eric&amp;#8217;s styles either.&lt;/p&gt;
&lt;p&gt;Another change from Eric&amp;#8217;s stylsheet is that I decided to remove the lines that remove bullets from lists, the reason for this is purely personal. I tend to only add the list style back in when using Erics reset anyway. I have however included &lt;code&gt;nav ul {list-style:none;}&lt;/code&gt; to at least remove those pesky bullets from your navigation. &lt;/p&gt;
&lt;h3&gt;Using attribute selectors&lt;/h3&gt;
&lt;p&gt;You&amp;#8217;ll notice that I&amp;#8217;ve included attribute selctors for &lt;code&gt;&amp;lt;abbr&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;dfn&amp;gt;&lt;/code&gt;, the reason for this is I only want the style to appear &lt;em&gt;if&lt;/em&gt; there is a title attribute to be displayed. The reason for this is primarly for accessibility. For example we use &lt;code&gt;&amp;lt;abbr&amp;gt;&lt;/code&gt; regularly on this site but don&amp;#8217;t always include a title attribute, that&amp;#8217;s because it&amp;#8217;s safe to assume &lt;em&gt;all&lt;/em&gt; (no matter what device they are using) our readers know what &lt;abbr&gt;HTML&lt;/abbr&gt; is, however we need to still include &lt;code&gt;&amp;lt;abbr&amp;gt;&lt;/code&gt; to make sure screenreaders read the text as H-T-M-L rather than &amp;#8220;HTML&amp;#8221; which they struggle to pronounce.&lt;/p&gt;
&lt;h3&gt;What&amp;#8217;s that bit about mark?&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;mark&amp;gt;&lt;/code&gt; is a new element introduced in &lt;abbr&gt;HTML&lt;/abbr&gt; 5 used to (you guessed it) &lt;mark&gt;mark&lt;/mark&gt; text in a document. The spec describes &lt;code&gt;&amp;lt;mark&amp;gt;&lt;/code&gt; as &lt;q&gt;&amp;#8220;The mark element represents a run of text in one document marked or highlighted for reference purposes, due to its relevance in another context.&amp;#8221;&lt;/q&gt;. I anticipate this it will be used for highlighting phrases in search results and similar. We&amp;#8217;ll have more on this in a post soon.&lt;/p&gt;
&lt;h2&gt;Where are all those application elements?&lt;/h2&gt;
&lt;p&gt;&amp;#8220;Application elements&amp;#8221; is the term I&amp;#8217;ve used to loosely describe those elements such as &lt;code&gt;&amp;lt;datagrid&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;datalist&amp;gt;&lt;/code&gt; etc. Basically those that you are likely to find in web apps rather than websites. These have been left out because at the current time hardly any of what was &amp;#8216;Web Applications 1.0&amp;#8242; has been implemented by browsers. Also this reset is primarily aimed at those serving their pages as &lt;code&gt;text/html&lt;/code&gt; not &lt;abbr&gt;xml&lt;/abbr&gt;.&lt;/p&gt;
&lt;h2&gt;Go grab it&lt;/h2&gt;
&lt;p&gt;So that basically wraps it up, it&amp;#8217;s released under a creative commons license and you can use it for both personal and commercial work. I thought I&amp;#8217;d let Google take care of the hosting so go grab it from Google Code and let me know of any thoughts, queries or improvements you can offer.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://code.google.com/p/html5resetcss/downloads/list"&gt;HTML 5 Reset Stylesheet&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/html5doctor/~4/IKWrfrgCcpw" height="1" width="1"/&gt;</description><pubDate>Mon, 27 Jul 2009 14:00:42 GMT</pubDate><guid isPermaLink="false">http://html5doctor.com/?p=622</guid><comments>http://html5doctor.com/html-5-reset-stylesheet/#comments</comments><author>Richard Clark</author><source url="http://html5doctor.com/feed/">HTML5 Doctor</source><ng:postId>10216951866</ng:postId><ng:feedId>5371525</ng:feedId><ng:folderId>0</ng:folderId><ng:folder ng:id="0" ng:flagState="0" ng:annotation="" /><feedburner:origLink>http://feedproxy.google.com/~r/html5doctor/~3/IKWrfrgCcpw/</feedburner:origLink></item><item><title>Serving and Protecting Fonts on the Web</title><link>http://feedproxy.google.com/~r/newsgator/efJB/~3/8NJkw7DWrR0/</link><description>&lt;div class='snap_preview'&gt;&lt;br /&gt;&lt;p&gt;When describing Typekit to both web and type designers, we often say that we&amp;#8217;re &amp;#8220;offering a level of protection that the type industry needs.&amp;#8221; Considering all the discussion there has been recently about differing formats and safeguarding fonts, we thought we&amp;#8217;d explain our approach in detail.&lt;/p&gt;
&lt;p&gt;The fact is, for something to appear in a browser, it has to be on the web. If it&amp;#8217;s on the web, it can&amp;#8217;t be completely protected. Recent history has shown repeatedly that attempts to manage digital rights through code have been &lt;a href="http://news.bbc.co.uk/2/hi/technology/7813527.stm"&gt;rejected by consumers&lt;/a&gt; and &lt;a href="http://www.ftc.gov/opa/2007/01/sony.shtm"&gt;drawn legal fire&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While the entertainment industry has wrestled with this issue for a decade, it&amp;#8217;s only recently became a concern for foundries and type designers. Browser release schedules don&amp;#8217;t iterate as fast as opinions do, and that requires everyone to experiment in public. Can commercial fonts be used in a way that doesn&amp;#8217;t turn every website into a free font server? With Typekit, we feel there&amp;#8217;s an opportunity to find a middle ground.&lt;/p&gt;
&lt;h3&gt;Depth in Defense&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Defense_in_depth"&gt;Defense in depth&lt;/a&gt; is an old military strategy and an apt analogy for what we&amp;#8217;re doing. Armies would put barrier after barrier between them and the enemy. Each trench or string of barbed wire was relatively easy to get past, but each one slowed them down and tired them out a little. Dozens and dozens of these small hurdles would eventually wear them down.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve put up a few hurdles of our own. Our intent is only to &lt;em&gt;discourage casual misuse&lt;/em&gt; and to make it clear that taking fonts from Typekit is an &lt;em&gt;explicit and intentional act&lt;/em&gt;.  Here&amp;#8217;s what we&amp;#8217;re doing.&lt;/p&gt;
&lt;h3&gt;Levels of Protection&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HTTP referrer checking&lt;/strong&gt; Only authorized domains are allowed to link to fonts. If you take the URL for our CSS or fonts and try to link them to your site — or just try to load them directly in your browser  — you&amp;#8217;ll get no response. To circumvent this, you&amp;#8217;ll need to use curl or some other command line http user agent to spoof the referrer. But this technique helps us protect the service from &lt;a href="http://en.wikipedia.org/wiki/Hotlinking"&gt;Hotlinking&lt;/a&gt; and helps prevent quick &amp;#8220;grab the link and try it on my site&amp;#8221; experimenting.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://typekit.files.wordpress.com/2009/07/data-url1.png"&gt;&lt;img style="float:right;margin-left:10px;border:1px solid silver;" src="http://typekit.files.wordpress.com/2009/07/data-url1.png?w=262&amp;#038;h=215" alt="Fonts as Data URIs in Firebug" width="262" height="215" /&gt;&lt;/a&gt;&lt;strong&gt;Obfuscation&lt;/strong&gt; Hard-to-guess file names are not security. Not even a little bit. But files listed as strings of seemingly random characters can be intimidating to those who aren&amp;#8217;t familiar with the conventions of viewing source or launching tools like Safari&amp;#8217;s Activity Window or Firefox&amp;#8217;s Firebug. To that end, our Javascript is minified and the fonts themselves are represented as Base64 encoded strings. You may see right through this, but the vast majority of web users wouldn&amp;#8217;t know what to make of it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data URIs&lt;/strong&gt; We don&amp;#8217;t just encode the fonts to make them look scary. We do this so they can be injected in-line with our generated CSS. While this adds about 20 percent to the file size, it&amp;#8217;s actually more performant because we eliminate all but one HTTP connection. According to the Yahoo Developer &lt;a href="http://developer.yahoo.com/performance/rules.html#num_http"&gt;best practices&lt;/a&gt;, &amp;#8220;Most time is tied up in downloading all the components in the page: images, stylesheets, scripts, Flash, etc. Reducing the number of components in turn reduces the number of HTTP requests required to render the page. This is the key to faster pages.&amp;#8221;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Visible license data&lt;/strong&gt; Based on the proposed metadata of the .webfont initiative, we&amp;#8217;ve included license, copyright, and &amp;#8220;allowed&amp;#8221; domains as comments in our CSS. While the browser doesn&amp;#8217;t currently support an automated mechanism for approving or displaying those rules, they are still a visible reminder that repurposing the files is illegal. Removing this text is easy, but it&amp;#8217;s another explicit act.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://typekit.files.wordpress.com/2009/07/segmented-font.png"&gt;&lt;img class="alignright" style="float:right;margin-left:10px;border:1px solid silver;" src="http://typekit.files.wordpress.com/2009/07/segmented-font.png?w=166&amp;#038;h=114" alt="Segmented font in Mac OS X" width="166" height="114" /&gt;&lt;/a&gt;&lt;strong&gt;Segmenting and subsetting&lt;/strong&gt; Even if you follow these steps, the resulting font files won&amp;#8217;t contain the full character set. We split requested fonts into multiple files and recombine them using the CSS font stack. And we are subsetting only character sets requested by the Typekit user to improve performance. To make a usable and installable font, you&amp;#8217;ll need to open a font authoring tool and recombine the glyphs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With enough knowledge of web technologies, it&amp;#8217;s possible to circumvent each one of these steps. Many can be automated with scripts and command line tools. In aggregate, they provide enough of a barrier to discourage all but the most motivated. And as we&amp;#8217;ve seen over and over again, &lt;a href="http://en.wikipedia.org/wiki/Jon_Lech_Johansen"&gt;those with enough time and talent&lt;/a&gt; will find ways around any attempt at security. The reality is that there are countless places that make it far easier to steal fonts, if that&amp;#8217;s your goal.&lt;/p&gt;
&lt;p&gt;Our goal is different. After talking to dozens of foundries, we&amp;#8217;ve found traction with a solution that works today and moves the conversation forward. With it, we hope to provide the easiest place to use real fonts on the web, legally and licensed, and to compensate type designers for their amazing contribution to visual communication. &lt;/p&gt;
&lt;p&gt;&lt;cite&gt;You can see this all in action on one of the sites sites participating in our technology preview: &lt;a href="http://forabeautifulweb.com/"&gt;For A Beautiful Web&lt;/a&gt;.&lt;/cite&gt;&lt;/p&gt;
  &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/typekit.wordpress.com/145/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/typekit.wordpress.com/145/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/typekit.wordpress.com/145/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/typekit.wordpress.com/145/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/typekit.wordpress.com/145/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/typekit.wordpress.com/145/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/typekit.wordpress.com/145/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/typekit.wordpress.com/145/" /&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/typekit.wordpress.com/145/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/typekit.wordpress.com/145/" /&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.typekit.com&amp;blog=7722726&amp;post=145&amp;subd=typekit&amp;ref=&amp;feed=1" /&gt;&lt;/div&gt;</description><pubDate>Tue, 21 Jul 2009 23:31:41 GMT</pubDate><guid isPermaLink="false">http://blog.typekit.com/?p=145</guid><comments>http://blog.typekit.com/2009/07/21/serving-and-protecting-fonts-on-the-web/#comments</comments><author>Jeffrey Veen</author><source url="http://blog.typekit.com/feed/">The Typekit Blog</source><ng:postId>10189324210</ng:postId><ng:feedId>5203632</ng:feedId><ng:folderId>0</ng:folderId><ng:folder ng:id="0" ng:flagState="0" ng:annotation="" /><feedburner:origLink>http://blog.typekit.com/2009/07/21/serving-and-protecting-fonts-on-the-web/</feedburner:origLink></item><item><title>Overflow – a secret benefit</title><link>http://feedproxy.google.com/~r/newsgator/efJB/~3/8kaNrbeqDWw/</link><description>&lt;p&gt;Overflow does some cool things you should know about.&lt;/p&gt;
&lt;ul style="padding-left: 20px; list-style-type: decimal;"&gt;
&lt;li&gt;Creates Block Formatting Context&lt;/li&gt;
&lt;li&gt;Clears Floats&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Generating block formatting context&lt;/h3&gt;
&lt;p&gt;Arnaud Gueras called this &amp;#8220;contexte de formattage&amp;#8221; years ago, and I was kind of surprised when I moved back to the US how few developers here had heard of this &amp;#8220;secret weapon&amp;#8221;. When the overflow property is set, a new &lt;a href="http://www.w3.org/TR/CSS2/visuren.html#block-formatting"&gt;block formatting context&lt;/a&gt; is created. What does that mean? It changes the way the block interacts with floats. It no longer wraps around floats, but rather &lt;a href="http://www.w3.org/TR/CSS2/visuren.html#bfc-next-to-float"&gt;becomes narrower&lt;/a&gt;.&lt;/p&gt;
&lt;style type="text/css"&gt;
.wrapper{background-color: #e2e2e2;overflow:hidden; _overflow:visible; zoom:1; margin: 10px; padding:10px;}
.float{float:left; width:50px; height:50px; background-color:#64b0c0; color:#fff;}
.context{overflow:hidden;}
.content{background-color: #c9ebeb;}
&lt;/style&gt;
&lt;div class="wrapper"&gt;
&lt;div class="float"&gt;floated box&lt;/div&gt;
&lt;div class="content"&gt;
&lt;h6&gt;Without the effect&lt;/h6&gt;
&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="wrapper"&gt;
&lt;div class="float"&gt;floated box&lt;/div&gt;
&lt;div class="content context"&gt;
&lt;h6&gt;With new block formatting context&lt;/h6&gt;
&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;&lt;p&gt;The border box of a table, a block-level replaced element, or an element in the normal flow that establishes a new block formatting context (such as an element with &amp;#8216;overflow&amp;#8217; other than &amp;#8216;visible&amp;#8217;) must not overlap any floats in the same block formatting context as the element itself.&lt;br /&gt;
&lt;cite class="author"&gt;W3C, CSS 2.1&lt;/cite&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This is &lt;em&gt;not a hack&lt;/em&gt;, it is all in the spec from the w3c. &lt;/p&gt;
&lt;h4&gt;Sweet, so how can you use it?&lt;/h4&gt;
&lt;p&gt;A block with a new formatting context takes all the remaining space on a line, while leaving room for floats which have already been positioned. In my object-oriented CSS open source project I use the formatting context in two ways.&lt;/p&gt;
&lt;ul style="padding-left: 20px; list-style-type: square;"&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Main content column&lt;/strong&gt; &amp;#8211; adding a formatting context means that my main column takes all the space that remains after my left and right columns have been rendered. This means having only one template because if you want to remove a column from the three column layout, you simply delete the column from the html. No changes to make anywhere else, CMS developers will love you for that. &lt;/p&gt;
&lt;h5&gt;&lt;a href="http://oocss.org/template.html"&gt;Play with the template&lt;/a&gt; in Firebug. &lt;/h5&gt;
&lt;ol style="padding-left: 20px; list-style-type: decimal;"&gt;
&lt;li&gt;Try adding the class &amp;#8220;liquid&amp;#8221; to the &amp;#8220;page&amp;#8221; element. &lt;/li&gt;
&lt;li&gt;Add or remove one of the columns from the HTML. &lt;/li&gt;
&lt;li&gt;Extend one of the column objects with the additional classes listed in the documentation. &lt;/li&gt;
&lt;li&gt;Try changing the width of the column directly in Firebug.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grids&lt;/strong&gt; &amp;#8211; anyone who has developed a grids system knows the pain of sub-pixel rounding errors. Browsers don&amp;#8217;t know what to do with 33.3 pixels, so they all do something different. The YUI grids system hid these differences in the gutters between the blocks, but we can also hide that difference inside the units themselves.
&lt;p&gt;A new block formatting context can be used to make the last unit in any grids line absorb the tiny differences in size. &lt;a href="http://oocss.org/grids_docs.html"&gt;Play with the grids&lt;/a&gt;, you&amp;#8217;ll notice that as you modify the sizes of the units, the last unit grows and shrinks to accommodate the difference. It has no width, and yet, with a new block formatting context is also doesn&amp;#8217;t wrap around floats. &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Clearing Floats&lt;/h3&gt;
&lt;p&gt;You have probably heard about clearing floats. People have been &lt;a href="http://www.sitepoint.com/blogs/2005/02/26/simple-clearing-of-floats/"&gt;talking about clearing floats via the overflow property&lt;/a&gt; for a while now. Some consider it hacky, but a careful reading of the spec shows that while this may not have been expressly intended by spec authors, it was a reasonable interpretation by browser vendors. &lt;/p&gt;
&lt;p&gt;In order for them to calculate what overflowed the bounds of the block (and thus should be hidden), they needed to know the size of the block. Because these blocks do no have an explicit height set, the browsers used the calculated height of the content instead. For more &lt;a href="http://meyerweb.com/eric/thoughts/2009/02/16/css3-feedback-layout/#comment-443521"&gt;information on clearing&lt;/a&gt;, see this conversation Eric Meyer and I had on his blog.&lt;/p&gt;
&lt;h4&gt;Caveats&lt;/h4&gt;
&lt;p&gt;Overflow can clip bits of too big content (like giant images, pre, or tables), I&amp;#8217;m now experimenting with overflow: auto versus hidden to see which is a better trade off.&lt;/p&gt;
&lt;h3&gt;Other work in this Area&lt;/h3&gt;
&lt;p&gt;Lots of people are working to find solutions to grids to meet different requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Matt Sweeney of the YUI team is experimenting with inline-blocks&lt;/li&gt;
&lt;li&gt;Thierry Koblentz is playing with the idea of using table-cell&lt;/li&gt;
&lt;li&gt;Lindsey Simon at Google is looking at alternatives to overflow:hidden that would work well for web applications&lt;/li&gt;
&lt;li&gt;Blueprint and 960gs use widths in pixels rather than percent. &lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Thu, 23 Jul 2009 17:44:59 GMT</pubDate><guid isPermaLink="false">http://www.stubbornella.org/content/?p=362</guid><comments>http://www.stubbornella.org/content/2009/07/23/overflow-a-secret-benefit/#comments</comments><author>Nicole</author><source url="http://www.stubbornella.org/content/feed/">Stubbornella</source><ng:postId>10195779709</ng:postId><ng:feedId>3343906</ng:feedId><ng:folderId>0</ng:folderId><ng:folder ng:id="0" ng:flagState="0" ng:annotation="" /><feedburner:origLink>http://www.stubbornella.org/content/2009/07/23/overflow-a-secret-benefit/</feedburner:origLink></item><item><title>Developer Color Picker</title><link>http://feedproxy.google.com/~r/newsgator/efJB/~3/nQs_QTj_8RY/</link><description>
&lt;p&gt;Great free utility by Panic&amp;#8217;s Wade Cosgrove: a Mac OS X system-wide color picker panel that lets you copy color values in NSColor, UIColor, CGColorRef, CSS, and HTML styles.&lt;/p&gt;

&lt;div&gt;
&lt;a  title="Permanent link to ‘Developer Color Picker’"  href="http://daringfireball.net/linked/2009/07/25/developer-color-picker"&gt;&amp;nbsp;★&amp;nbsp;&lt;/a&gt;
&lt;/div&gt;

	</description><pubDate>Sat, 25 Jul 2009 20:03:57 GMT</pubDate><guid isPermaLink="false">tag:daringfireball.net,2009:/linked//6.17518</guid><author>John Gruber</author><source url="http://daringfireball.net/index.xml">Daring Fireball</source><ng:postId>10208377872</ng:postId><ng:feedId>3342</ng:feedId><ng:folderId>0</ng:folderId><ng:folder ng:id="0" ng:flagState="0" ng:annotation="" /><feedburner:origLink>http://www.panic.com/~wade/picker/</feedburner:origLink></item><item><title>Ask Google to guarantee privacy for the future of reading</title><link>http://feedproxy.google.com/~r/newsgator/efJB/~3/Zw-_LET-k5c/ask-google-to-guaran.html</link><description>

Hugh from the Electronic Frontier Foundation sez, 

&lt;blockquote&gt;
&lt;img src="http://craphound.com/images/googlebooks1.png.jpg"&gt;&lt;br&gt;
As Google expands its Google Book Search service, adding millions of titles, it will dramatically increase the public's access to books. More and more people will soon be browsing, reading and purchasing books online. But Google may be leaving out the privacy we have come to expect, with systems that monitor the digital books you search, the pages you read, how long you spend on various pages, and even what you write down in the margins.
&lt;p&gt;
To ensure that our privacy remains at least as strong online as it is in the physical world, Google needs to do more. With the ACLU of Northern California and the Samuelson Clinic at UC Berkeley, EFF has written a letter to Google CEO Eric Schmidt, demanding that Google take specific steps to protect your freedom to read privately. We've asked that Google only respond to legitimate warrants when the government comes calling, for example, and we've asked that they not share your private reading data with third parties without your permission, among other things.
&lt;p&gt;
Now, we need you to join us in the fight to defend reader privacy -- take action and tell Eric Schmidt that you demand the same privacy for your online reading habits that you enjoy when reading paper.
&lt;/blockquote&gt;

I have some misgivings about the Google Book Search settlement, mostly to do with the fact that a settlement means that Google won't litigate the fair use question of whether making a copy of a work in order to create a search engine infringes copyright. Those misgivings don't trump my delight at the idea of guaranteeing public access to all these books, and the restoration of orphan books to public hands.
&lt;p&gt;
But the issue of privacy is much more grave. I want Google to create a binding, written agreement to hold readers' information private, so that the future of reading doesn't include the possibility of warrantless spying on your book-reading activity. For complex legal reasons, it's unlikely that anyone will ever be in a position to give Google a settlement permitting this again, so this is it. The status quo Google sets will be the one that we end up living with for the foreseeable future.
&lt;p&gt;

&lt;a href="https://secure.eff.org/site/Advocacy?cmd=display&amp;page=UserAction&amp;id=433"&gt;Don't Let Google Close the Book on Reader Privacy&lt;/a&gt;&lt;br clear="both" style="clear: both;"/&gt;
&lt;br clear="both" style="clear: both;"/&gt;
&lt;a href="http://ads.pheedo.com/click.phdo?s=560eb3ed35f636c5e21f18ab3fcb02b9&amp;p=1"&gt;&lt;img alt="" style="border: 0;" border="0" src="http://ads.pheedo.com/img.phdo?s=560eb3ed35f636c5e21f18ab3fcb02b9&amp;p=1"/&gt;&lt;/a&gt;
&lt;img src="http://feeds.feedburner.com/~r/boingboing/iBag/~4/nqSFwhXlTUQ" height="1" width="1"/&gt;</description><pubDate>Fri, 24 Jul 2009 05:35:21 GMT</pubDate><guid isPermaLink="false">tag:www.boingboing.net,2009://1.64411</guid><author>Cory Doctorow</author><source url="http://boingboing.net/rss.xml">Boing Boing</source><ng:postId>10201978404</ng:postId><ng:feedId>476450</ng:feedId><ng:folderId>0</ng:folderId><ng:folder ng:id="0" ng:flagState="0" ng:annotation="" /><feedburner:origLink>http://feedproxy.google.com/~r/boingboing/iBag/~3/nqSFwhXlTUQ/ask-google-to-guaran.html</feedburner:origLink></item><item><title>PsiWheel Under a Glass Container video</title><link>http://feedproxy.google.com/~r/newsgator/efJB/~3/_PgbkIDxuCM/psiwheel-under-a-gla.html</link><description>
&lt;img src="http://www.boingboing.net/psi-wheek.png" height="236" width="265" border="0" align="left" hspace="4" vspace="4" alt="Psi-Wheek" /&gt;
&lt;br clear="all"&gt;&lt;P&gt;
&lt;a href="http://www.youtube.com/watch?v=H5NwRfMJgOQ&amp;amp;feature=response_watch"&gt;This video&lt;/a&gt; is a couple of years old, but I just read about it on &lt;a href="http://forgetomori.com/2009/skepticism/psychic-powers-video-proof/"&gt;Forgetomori&lt;/a&gt; last night. It shows a folded piece of paper, balanced on an upright toothpick, under a glass bowl. The guy in the video shows how he can make the paper spin with his "psychic powers." &lt;p&gt;Before he starts making it spin though, he first blows a hair dryer around the bowl to show that the apparatus inside can't be affected by moving air, and then he moves a powerful magnet all around the bowl to show that there's no magnetism involved. The he sits down in a meditative pose and makes the paper spin in one direction, and then another.
&lt;P&gt;You can read the video creator's explanation &lt;a href="http://forgetomori.com/2009/skepticism/psychic-powers-video-proof/"&gt;here&lt;/a&gt;. Before you read it though, try to think how he might have accomplished this.

&lt;p&gt;&lt;a href="http://forgetomori.com/2009/skepticism/psychic-powers-video-proof/"&gt;PsiWheel Under a Glass Container video&lt;/a&gt;
&lt;br clear="both" style="clear: both;"/&gt;
&lt;br clear="both" style="clear: both;"/&gt;
&lt;a href="http://ads.pheedo.com/click.phdo?s=dcb890bf628193cd1ce75b41f463319b&amp;p=1"&gt;&lt;img alt="" style="border: 0;" border="0" src="http://ads.pheedo.com/img.phdo?s=dcb890bf628193cd1ce75b41f463319b&amp;p=1"/&gt;&lt;/a&gt;
&lt;img src="http://feeds.feedburner.com/~r/boingboing/iBag/~4/VleJy6ngEhc" height="1" width="1"/&gt;</description><pubDate>Sat, 25 Jul 2009 16:40:27 GMT</pubDate><guid isPermaLink="false">tag:www.boingboing.net,2009://1.64477</guid><author>Mark Frauenfelder</author><source url="http://boingboing.net/rss.xml">Boing Boing</source><ng:postId>10207740029</ng:postId><ng:feedId>476450</ng:feedId><ng:folderId>0</ng:folderId><ng:folder ng:id="0" ng:flagState="0" ng:annotation="" /><feedburner:origLink>http://feedproxy.google.com/~r/boingboing/iBag/~3/VleJy6ngEhc/psiwheel-under-a-gla.html</feedburner:origLink></item><item><title>Definitive Guide to Taming the IE6 Beast</title><link>http://feedproxy.google.com/~r/newsgator/efJB/~3/wFThaJWzPmw/</link><description>&lt;p&gt;&lt;img src="http://images.sixrevisions.com/2009/07/25-01_ie6_definitive_lead.jpg" width="550" height="250" alt="Definitive Guide to Taming the IE6 Beast" /&gt;&lt;/p&gt;
&lt;p&gt;For years, Internet Explorer 6 (IE6) has been the bane of existence for web designers around the world. Designers and users alike have come to enjoy the increasingly predictable, standards-compliant behavior of great modern browsers like Firefox, Opera, and Safari. Meanwhile, IE6 continues to haunt our designs, lurking in dark places while dying a painfully slow, agonizing death. As we await that grand and glorious day when IE6 is as dead as Netscape 4, let us be mindful of the endagered species of users who, for whatever sad reason, continue to torture themselves with that terrible beast of a browser.&lt;/p&gt;
&lt;p&gt;      &lt;span id="more-1323"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;So come now, let us celebrate these last days of IE6 with this definitive guide to taming the IE6 beast.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;In this comprehensive article, you&amp;#8217;ll learn some of the best methods for supporting IE6, including proper targeting, specific hacks, image support, box models, floats, and everything in between.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Use conditional comments to target IE6&lt;/h3&gt;
&lt;p&gt;Conditional comments play an important role in getting IE6 to behave. Conditional comments are basically snippets of code that are included in your (X)HTML markup that enable you to target or filter specific versions of Internet Explorer. Here is a conditional comment that targets IE6 with a special message:&lt;/p&gt;
&lt;pre&gt;
&lt;strong&gt;&amp;lt;!--[if IE6]&amp;gt;&lt;/strong&gt;
  &amp;lt;p&amp;gt;Oops! Looks like you're still using Internet Explorer 6!
     You deserve better!&amp;lt;/p&amp;gt;
&lt;strong&gt;&amp;lt;![endif]--&amp;gt;&lt;/strong&gt;&lt;/pre&gt;
&lt;p&gt;This is an extremely useful method of delivering code and content only to IE6. Other browsers will see this conditional comment as an ordinary (X)HTML comment and simply ignore its contents. Thus, when adapting our web pages for IE6, conditional comments enable us to apply CSS styles directly, without interfering with other browsers. Although conditional comments are a proprietary Microsoft invention, they are arguably the best way to &amp;#8220;hack&amp;#8221; specific versions of Internet Explorer.&lt;/p&gt;
&lt;p&gt;The easiest way to use conditional comments to target and apply styles only to IE6 is to include an &amp;#8220;IE6-only&amp;#8221; stylesheet in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section of your web pages:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;!--[if IE6]&amp;gt;
  &amp;lt;link rel="stylesheet" href="http://domain.tld/&lt;strong&gt;ie6.css&lt;/strong&gt;"
    media="screen" /&amp;gt;
&amp;lt;![endif]--&amp;gt;&lt;/pre&gt;
&lt;p&gt;Then, in the &lt;code&gt;ie6.css&lt;/code&gt; stylesheet, we place all of the IE6-specific hacks and other trickery that are needed in order to accomodate IE6. This enables us to consolidate our IE6 styles into a single stylesheet that is completely ignored by all other browsers. With this method of applying styles to IE6, there is no need for IE6-specific hacks such as the so-called &amp;#8220;star-HTML&amp;#8221; hack or the underscore hack. Selectors are simply targeted &amp;#8220;as-is&amp;#8221; from within the IE6-only stylesheet.&lt;/p&gt;
&lt;p&gt;Of course, conditional comments can do much more than target IE6. By design, they are able to target or filter any version(s) of Internet Explorer for both HTML and XHTML. For more information on conditional comments, these fine articles are highly recommended:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms537512(VS.85).aspx" title="Microsoft explains conditional comments"&gt;Microsoft explains conditional comments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.quirksmode.org/css/condcom.html" title="Learn about conditional comments at QuirksMode"&gt;Learn more about conditional comments at QuirksMode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://perishablepress.com/press/2007/07/18/wrapping-your-head-around-downlevel-conditional-comments/" title="Wrapping Your Head around Downlevel Conditional Comments"&gt;Wrapping Your Head around Conditional Comments&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Target and filter IE6 with &amp;#8220;in-CSS&amp;#8221; hacks&lt;/h3&gt;
&lt;p&gt;Despite the usefulness of conditional comments, there are situations in which you may decide to apply IE6-specific styles from &lt;em&gt;within&lt;/em&gt; the stylesheet. A good example of this may happen during site development, when it is more expedient and practical to work with a single stylesheet, in which IE6 styles are located next to &amp;#8220;normal&amp;#8221; styles for easy comparison. Once development is complete, all &amp;#8220;in-CSS&amp;#8221; hacks may be consolidated to an IE6 stylesheet included via conditional comments.&lt;/p&gt;
&lt;p&gt;Fortunately, when it comes to IE6, there is no shortage of these in-CSS targeting methods. Over the years, a few of these &amp;#8220;hacks&amp;#8221; have risen to the top of the pile, proving to be extremely useful and effective for targeting IE6. Perhaps the most widely used of these in-CSS techniques is known as the &amp;#8220;star-HTML&amp;#8221; hack:&lt;/p&gt;
&lt;pre&gt;
&lt;strong&gt;/* target IE6 */&lt;/strong&gt;
&lt;strong&gt;* html&lt;/strong&gt; #selector { color: red; }&lt;/pre&gt;
&lt;p&gt;While standards-compliant browsers ignore this illogical selector, IE6 treats it as legitimate, even though &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; is the highest element in the document tree. This enables us to apply CSS styles exclusively to IE6 without interfering with other browsers. Best of all, this method of targeting IE6 is completely valid.&lt;/p&gt;
&lt;p&gt;There are also cases where we need to &lt;em&gt;hide&lt;/em&gt; styles from IE6. The following hack is referred to as the &amp;#8220;child-selector filter,&amp;#8221; and it enables us to apply CSS styles to all browsers &lt;em&gt;except&lt;/em&gt; IE6:&lt;/p&gt;
&lt;pre&gt;
&lt;strong&gt;/* filter IE6 */&lt;/strong&gt;
&lt;strong&gt;html&gt;body&lt;/strong&gt; #selector { color: red; }&lt;/pre&gt;
&lt;p&gt;This selector is also completely valid, and readily applied by all standards-compliant browsers. It is effective because IE6 simply doesn&amp;#8217;t understand its meaning.&lt;/p&gt;
&lt;p&gt;Other useful methods of targeting and filtering IE6 include the &lt;code&gt;!important&lt;/code&gt; hack, which is useful when you need to override a property value for IE6:&lt;/p&gt;
&lt;pre&gt;
#selector {
  width: 200px &lt;strong&gt;!important&lt;/strong&gt;; &lt;strong&gt;/* target other browsers */&lt;/strong&gt;
  width: 100px;            &lt;strong&gt;/* target IE6 and lower */&lt;/strong&gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When there are two identical properties for a selctor, IE6 will apply the second property, even if the first property includes the &lt;code&gt;!important&lt;/code&gt; directive. Other browsers will of course apply the &lt;code&gt;!important&lt;/code&gt; declaration, enabling us to target IE6 with the subsequent rule.&lt;/p&gt;
&lt;h3&gt;Enable alpha-transparent PNG support&lt;/h3&gt;
&lt;p&gt;One of the most frustrating shortcomings of IE6 is its lack of 32-bit alpha-transparent PNG support. When displaying a 32-bit alpha-transparent PNG, IE6 replaces all transparency with an ugly grey background. Fortunately, this is a well-known and frequently addressed issue for which there are a wide variety of workarounds and solutions.&lt;/p&gt;
&lt;p&gt;Apart from avoiding the use of alpha-transparent PNG images altogether, perhaps the simplest way to ensure visual compatibility with IE6 is to stick with fully transparent PNG images, which are fully supported and displayed properly in all browsers, including IE6.&lt;/p&gt;
&lt;p&gt;A more practical approach is to apply alpha-transparency via &lt;em&gt;8-bit&lt;/em&gt; PNG format rather than the usual 32-bit format. To do so, use a program such as Adobe Fireworks (Photoshop does not work for this purpose), save your alpha-tranparent PNG image in 8-bit format, and then include in your design as usual. 8-bit PNGs may not look quite as good as 32-bit versions, but their alpha-transparency degrades gracefully to full index transparency in IE6. This method enables you to employ alpha-transparency in all modern browsers without getting the ugly grey background in IE6.&lt;/p&gt;
&lt;p&gt;Of course, it is also possible to enable IE6-support for 32-bit alpha-transparency. There are many different scripts that enable such functionality, but all of them ultimately rely on a proprietary Microsoft &lt;code&gt;AlphaImageLoader&lt;/code&gt; filter that may be included in your CSS file as follows:&lt;/p&gt;
&lt;pre&gt;
* html .iepngfix { &lt;strong&gt;behavior: url(iepngfix.htc)&lt;/strong&gt;; }&lt;/pre&gt;
&lt;p&gt;To make this work, you need to upload &lt;a href="http://perishablepress.com/press/wp-content/online/code/png-fix-required-files.zip" title="Download PNG-fix files from Perishable Press"&gt;these two files&lt;/a&gt; to the same directory as your CSS file. The first file is a blank &lt;code&gt;gif&lt;/code&gt; image, and the second file is an HTC script that provides IE6 (and below) with the functionality required for 32-bit alpha-transparency. This is the most basic implementation of the &lt;code&gt;AlphaImageLoader&lt;/code&gt; filter, but more advanced functionality is also possible using a wide variety of freely available scripts. Here are a few of my favorites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.dillerdesign.com/experiment/DD_belatedPNG/" title="Medicine for your IE6/PNG headache!"&gt;DD_belatedPNG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://labs.unitinteractive.com/unitpngfix.php" title="Unit PNG Fix"&gt;Unit PNG Fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.twinhelix.com/css/iepngfix/" title="TwinHelix' IE PNG Fix"&gt;TwinHelix IE PNG Fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://perishablepress.com/press/2008/05/28/css-hackz-series-png-fix-for-internet-explorer/" title="CSS Hackz Series: PNG Fix for Internet Explorer"&gt;Roundup of PNG Fixes for IE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Fix the broken box model&lt;/h3&gt;
&lt;p&gt;Early versions of Internet Explorer incorrectly interpreted the box model to include borders and padding in the calculation of the content width. For example, consider the following case:&lt;/p&gt;
&lt;pre&gt;
div {
  border: 10px solid black;
  padding: 10px;
  height: 100px;
  width: 100px;
}&lt;/pre&gt;
&lt;p&gt;In modern browsers, the height and width of this division are each calculated according to W3C specifications as &lt;code&gt;100px + 20px + 20px = 140px&lt;/code&gt;. In early versions of IE, however, the height and width are each calculated improperly as &lt;code&gt;100px&lt;/code&gt;. This discrepency is responsible for many design inconsistencies between standards-compliant browsers and older versions of Internet Explorer.&lt;/p&gt;
&lt;p&gt;Fortunately, the broken box model was addressed in IE6, which is capable of rendering proper widths for web pages that include a complete &lt;code&gt;&amp;lt;!DOCTYPE&amp;gt;&lt;/code&gt;. When a complete &lt;code&gt;&amp;lt;!DOCTYPE&amp;gt;&lt;/code&gt; is present, IE6 switches to either &amp;#8220;standards-compliant mode&amp;#8221; or &amp;#8220;almost-standards-compliant mode,&amp;#8221; both of which cause IE6 to correctly interpret the box model. Conversely, when a complete &lt;code&gt;&amp;lt;!DOCTYPE&amp;gt;&lt;/code&gt; is not included in a web page, IE6 reverts to &amp;#8220;quirks mode&amp;#8221; and interprets the box model incorrectly.&lt;/p&gt;
&lt;p&gt;Thus, the box-model problem is easily fixed in IE6 by including a complete &lt;code&gt;&amp;lt;!DOCTYPE&amp;gt;&lt;/code&gt; and designing in standards-compliant mode. If you need to work in quirks mode, the next easiest fix is to avoid applying padding or borders on elements for which you have specified a width. You can always apply padding and/or margins to the enclosed elements.&lt;/p&gt;
&lt;p&gt;Even with these solutions, there may be situations where it is necessary to control the height and width of specific elements. In these cases, we may use the &amp;#8220;Tan Hack&amp;#8221; to get the job done:&lt;/p&gt;
&lt;pre&gt;
#selector {
  border: 10px solid black;
  padding: 10px;
  height: 100px;
  width: 100px;
}
* html #selector {
&lt;strong&gt;  \height&lt;/strong&gt;: 140px; &lt;strong&gt;/* targets IE5 and IE6 in quirks mode */&lt;/strong&gt;
&lt;strong&gt;  he\ight&lt;/strong&gt;: 100px; &lt;strong&gt;/* targets IE6 in standards mode */&lt;/strong&gt;
&lt;strong&gt;  \width&lt;/strong&gt;: 140px;  &lt;strong&gt;/* targets IE5 and IE6 in quirks mode */&lt;/strong&gt;
&lt;strong&gt;  w\idth&lt;/strong&gt;: 100px;  &lt;strong&gt;/* targets IE6 in standards mode */&lt;/strong&gt;
}&lt;/pre&gt;
&lt;p&gt;In the first set of rules, we apply our width and height as normal for all standard-compliant browsers. Then, in the second set of rules, we account for the broken box model in IE5 and IE6 quirks mode by adjusting the values for height and width to include the additonal padding and border widths. That&amp;#8217;s quite a mouthful, so hopefully the code and comments will clarify the technique.&lt;/p&gt;
&lt;h3&gt;Fix min-width/max-width and min-height/max-height&lt;/h3&gt;
&lt;p&gt;Out of the box, IE6 fails to understand maximum and minimum height and width. This is incredibly sad for designers, as many layout scenarios require these properties to function properly. In modern, standards-compliant browsers, we can use the following CSS to acheive our goals:&lt;/p&gt;
&lt;pre&gt;div.max-height {
  max-height: 333px;
}
div.min-height {
  min-height: 333px;
}
div.max-width {
  max-width: 333px;
}
div.min-width {
  min-width: 333px;
}&lt;/pre&gt;
&lt;p&gt;Of course, this is &lt;em&gt;waaay tooo&lt;/em&gt; easy for Internet Explorer, which completely fails to understand these basic CSS properties. Fortunately, IE supports its own, proprietary &lt;code&gt;expression&lt;/code&gt; attribute, which enables us to use JavaScript expressions to manipulate (X)HTML document properties such as max/min-width and max/min-height. For example, to specify a width property value via the &lt;code&gt;expression&lt;/code&gt; attribute, we could use this:&lt;/p&gt;
&lt;pre&gt;
div {
  width: &lt;strong&gt;expression&lt;/strong&gt;(333 + "px");
}&lt;/pre&gt;
&lt;p&gt;..Which is equivalent to this:&lt;/p&gt;
&lt;pre&gt;
div {
  width: 333px;
}&lt;/pre&gt;
&lt;p&gt;There are two downsides to using IE&amp;#8217;s &lt;code&gt;expression&lt;/code&gt; attribute. First, as expressions are essentially JavaScript, they fail when JavaScript is disabled (or otherwise missing) in the user&amp;#8217;s browser. Second, use of CSS expressions for min/max properties is very resource intensive and may negatively impact browser performance. Nonetheless, the setting of max/min-widths/heights remains an important tool in the web designer&amp;#8217;s toolbox. With that in mind, here are some useful CSS expressions enabling complete min/max functionality in IE6.&lt;/p&gt;
&lt;h4&gt;max-width&lt;/h4&gt;
&lt;pre&gt;
&lt;strong&gt;/* max-width for IE6 */&lt;/strong&gt;
* html div.max-width {
  width: expression(document.body.clientWidth &gt; 776 ? "777px" : "auto");
}
&lt;strong&gt;/* max-width for standards-compliant browsers */&lt;/strong&gt;
div.max-width {
  max-width: 777px;
}&lt;/pre&gt;
&lt;h4&gt;min-width&lt;/h4&gt;
&lt;pre&gt;
&lt;strong&gt;/* min-width for IE6 */&lt;/strong&gt;
* html div.min-width {
  width: expression(document.body.clientWidth &lt; 334 ? "333px" : "auto");
}
&lt;strong&gt;/* min-width for standards-compliant browsers */&lt;/strong&gt;
div.min-width {
  min-width: 333px;
}&lt;/pre&gt;
&lt;h4&gt;max-height&lt;/h4&gt;
&lt;pre&gt;
&lt;strong&gt;/* max-height for IE6 */&lt;/strong&gt;
* html div.max-height {
  height: expression(this.scrollHeight &gt; 332 ? "333px" : "auto");
}
&lt;strong&gt;/* max-height for standards-compliant browsers */&lt;/strong&gt;
div.max-height {
  max-height: 333px;
}&lt;/pre&gt;
&lt;h4&gt;min-height&lt;/h4&gt;
&lt;p&gt;Fortunately, we can skip the crazy JavaScript/CSS expressions when applying minimum height in IE6. Thanks to &lt;a href="http://www.dustindiaz.com/min-height-fast-hack/" title="Min-Height Fast Hack"&gt;Dustin Diaz&lt;/a&gt;, we can set &lt;code&gt;min-height&lt;/code&gt; in IE6 with this morsel of valid CSS:&lt;/p&gt;
&lt;pre&gt;
&lt;strong&gt;/* min-height for IE6 */&lt;/strong&gt;
div.min-height {
  min-height: 500px;
  height: auto &lt;strong&gt;!important&lt;/strong&gt;;
  height: 500px;
}&lt;/pre&gt;
&lt;h3&gt;Kill the double margin bug&lt;/h3&gt;
&lt;p&gt;Most web designers who have been designing sites for awhile are familair with IE6&amp;#8217;s &amp;#8220;doubled floated-margin bug.&amp;#8221; This nasty bug rears its ugly head whenever you float an element (such as a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;) in one direction and then apply a margin in that same direction. For example, if we do this:&lt;/p&gt;
&lt;pre&gt;
div {
  float: right;
  margin-right: 10px;
}&lt;/pre&gt;
&lt;p&gt;..IE6 will (usually) &lt;em&gt;double&lt;/em&gt; the size of the margin to &lt;code&gt;20px&lt;/code&gt; for no apparent reason whatsoever. Needless to say, this double-margin bug has wrecked many a fine web design, causing much pain and distress along the way.&lt;/p&gt;
&lt;p&gt;Fortunately, this bug is easy to kill. Simply change the display type of the floated element from &lt;code&gt;block&lt;/code&gt; to &lt;code&gt;inline&lt;/code&gt;, like so:&lt;/p&gt;
&lt;pre&gt;
div#selector {
  float: right;
  margin-right: 10px;
}
* html div#selector {
  display: inline; &lt;strong&gt;/* kill double-margin bug */&lt;/strong&gt;
}&lt;/pre&gt;
&lt;p&gt;This solves the double-margin bug 99% of the time without issue. For those rare, unexplainable cases where this fix &lt;em&gt;doesn&amp;#8217;t&lt;/em&gt; work, you may need to workaround the issue by removing the margin and applying padding to either the parent element or to the floated element itself.&lt;/p&gt;
&lt;h3&gt;Clear your floats&lt;/h3&gt;
&lt;p&gt;Clearing floats is another common layout challenge, not only for IE6, but for many modern browsers. In a perfect world, an element that contains a floated element enlcoses that element entirely. In the imperfect world of web browsers, however, floats are frequently &lt;em&gt;not&lt;/em&gt; entirely closed. When this happens, we say that the floated element has not been &amp;#8220;cleared&amp;#8221; by its parent element. Fortunately, there are several easy ways to clear your floats in IE6 and other browsers as well.&lt;/p&gt;
&lt;p&gt;One of the oldest ways to clear your floats is to use the &lt;a href="http://perishablepress.com/press/2008/02/05/lessons-learned-concerning-the-clearfix-css-hack/" title="Lessons Learned Concerning the Clearfix CSS Hack • Perishable Press"&gt;clearfix hack&lt;/a&gt;. This CSS technique works by generating content after the parent element using the CSS &lt;code&gt;:after&lt;/code&gt; pseudo-class. The generated content then serves to clear the floated element. Here is a typical example:&lt;/p&gt;
&lt;pre&gt;
.clearfix&lt;strong&gt;:after&lt;/strong&gt; {
  content: " ";
  display: block;
  height: 0;
  clear: both;
  visibility: hidden;
}

.clearfix { display: inline-table; }

&lt;strong&gt;/* Hides from IE-mac \*/&lt;/strong&gt;
* html .clearfix {height: 1%;}
.clearfix { display: block; }
&lt;strong&gt;/* End hide from IE-mac */&lt;/strong&gt;&lt;/pre&gt;
&lt;p&gt;To use this method to clear your floats, place it into your CSS file and change all instances of &lt;code&gt;.clearfix&lt;/code&gt; to the selector of the element that needs to clear its floated ancestors.&lt;/p&gt;
&lt;p&gt;Another CSS method of clearing your floats is to simply float the container element. For example, if you float an image within a container &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; that fails to enclose it, simply apply the following CSS:&lt;/p&gt;
&lt;pre&gt;
div {
  float: left;
}&lt;/pre&gt;
&lt;p&gt;Then, if the containing element needs to behave as a regular block element, apply a width of 100% to force a line-break before the next element:&lt;/p&gt;
&lt;pre&gt;
div {
  float: left;
  width: 100%;
}&lt;/pre&gt;
&lt;p&gt;So far so good, but there is an even &lt;em&gt;better&lt;/em&gt; method of clearing your floats. By simply applying an &lt;code&gt;overflow&lt;/code&gt; value to the container &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;, it will automatically expand vertically and clear its floated children. Here is an example:&lt;/p&gt;
&lt;pre&gt;
div.container {
  overflow: hidden;
  width: 100%;
}&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;width&lt;/code&gt; declaration is required for Internet Explorer and Opera, but it doesn&amp;#8217;t need to be set at &lt;code&gt;100%&lt;/code&gt;; rather, you may use any width and unit of measure that is needed. If you don&amp;#8217;t want to specify a &lt;code&gt;width&lt;/code&gt;, you may specify a &lt;code&gt;height&lt;/code&gt; instead. For the &lt;code&gt;overflow&lt;/code&gt; property, you may use any of the following three values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;auto&lt;/code&gt; - display scrollbars if content exceeds specified width&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hidden&lt;/code&gt; - never display scrollbars even if content exceeds width&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scroll&lt;/code&gt; - always display scrollbars, even if they&amp;#8217;re not necessary&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As well as this method works for clearing floated elements, there are cases where the &lt;code&gt;overflow&lt;/code&gt; property can interfere with other aspects of the design. If this should occur, you may want to try limiting the scope of the overflow by using &lt;code&gt;overflow-x:hidden;&lt;/code&gt; or &lt;code&gt;overflow-y:hidden;&lt;/code&gt;. And remember, the &lt;code&gt;width&lt;/code&gt; property may be replaced by &lt;code&gt;height&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Fix other common IE6 problems&lt;/h3&gt;
&lt;p&gt;Wrapping things up, let&amp;#8217;s run through a few other problems commonly experienced with IE6. These issues and their corresponding fixes are fairly straightforward, so I will spare you the lengthy diatribe and jump straight to the point. Keep in mind as you continue through this article that you should relocate and consolidate any IE6-specific hacks into an IE6-specific stylesheet, which should be included via conditional comments (see first section, above).&lt;/p&gt;
&lt;h4&gt;Fix relative positioning&lt;/h4&gt;
&lt;p&gt;Using &lt;code&gt;position:relative&lt;/code&gt; in your designs is perhaps the easiest way to mess things up in IE6. Modern browsers display relatively positioned nested elements without issue, but IE6 frequently chokes up on even slightly complicated layouts. Fortunately, the solution is as easy as triggering &lt;code&gt;hasLayout&lt;/code&gt; by adding &lt;code&gt;zoom:1;&lt;/code&gt; to each relatively positioned element:&lt;/p&gt;
&lt;pre&gt;
.selector {
  &lt;strong&gt;position: relative&lt;/strong&gt;;
}
* html .selector {
  &lt;strong&gt;zoom: 1&lt;/strong&gt;;
}&lt;/pre&gt;
&lt;p&gt;Note that you should not apply &lt;code&gt;zoom:1;&lt;/code&gt; to any inline elements. Doing so will cause IE6 to treat them as block elements. Keep this in mind for the following solutions as well.&lt;/p&gt;
&lt;h4&gt;Fix negative margins&lt;/h4&gt;
&lt;p&gt;Negative margins are useful in a variety of scenarios, and most browsers handle them with no problem whatsoever. Unfortunately, IE6 doesn&amp;#8217;t like negative margins unless you apply relative positioning to the target element:&lt;/p&gt;
&lt;pre&gt;
.selector {
  margin: &lt;strong&gt;-1.5em&lt;/strong&gt;;
}
* html .selector {
  position: relative;
  zoom: 1;
}&lt;/pre&gt;
&lt;p&gt;Note the addition of the &lt;code&gt;zoom:1;&lt;/code&gt; declaration, which is required because of the relative positioning. Ain&amp;#8217;t IE great?&lt;/p&gt;
&lt;h4&gt;Fix overflow problems&lt;/h4&gt;
&lt;p&gt;Using the &lt;code&gt;overflow&lt;/code&gt; in IE6 will sometimes lead to unexpected, unexplainable display issues. Fortunately, we can resolve many &lt;code&gt;overflow&lt;/code&gt;-related display problems by triggering &lt;code&gt;hasLayout&lt;/code&gt; via &amp;#8212; yep, you guessed it &amp;#8212; &lt;code&gt;zoom:1;&lt;/code&gt;. Here is an example:&lt;/p&gt;
&lt;pre&gt;
.selector {
  overflow: hidden
}
* html .selector {
  &lt;strong&gt;zoom: 1&lt;/strong&gt;;
}&lt;/pre&gt;
&lt;p&gt;Another strange &lt;code&gt;overflow&lt;/code&gt;-related issue is observed when &lt;code&gt;font-style:italic;&lt;/code&gt; expands the width of its parent element. Thankfully, this nuance is easily resolved by applying the following CSS to the parent element:&lt;/p&gt;
&lt;pre&gt;
* html .selector {
  overflow-x: hidden;
}&lt;/pre&gt;
&lt;h4&gt;Line up floated elements&lt;/h4&gt;
&lt;p&gt;When you float elements of a fixed width, they will align themselves horizontally to fit the width of the parent element. At least, that&amp;#8217;s how it works in most browsers. In IE6, the floated items will not be displayed in a straight line, but rather will appear to &lt;a href="http://css-tricks.com/prevent-menu-stepdown/" title="Prevent Menu 'Stepdown'"&gt;stepdown&lt;/a&gt; in bizarre, staircase-like fashion. Fortunately, there are two ways to fix this issue. The first is to apply a &lt;code&gt;line-height:0;&lt;/code&gt; declaration to the parent element:&lt;/p&gt;
&lt;pre&gt;
.selector {
  float: left;
  width: 100px;
  clear: none;
}
* html .selector {
  &lt;strong&gt;line-height: 0&lt;/strong&gt;;
}&lt;/pre&gt;
&lt;p&gt;Alternately, you may prevent stepdown by applying a &lt;code&gt;display:inline;&lt;/code&gt; declaration to the floated elements:&lt;/p&gt;
&lt;pre&gt;
.selector {
  float: left;
  width: 100px;
  clear: none;
}
* html .selector {
  &lt;strong&gt;display: inline&lt;/strong&gt;;
}&lt;/pre&gt;
&lt;h4&gt;Fix your list items&lt;/h4&gt;
&lt;p&gt;Lastly, if IE6 decides to add an extra set of list items (&lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;) after your list (&lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;), adding an HTML comment has been known to magically resolve the issue. Here is what your source code will look like before and after applying the fix:&lt;/p&gt;
&lt;h4&gt;&lt;em&gt;Before:&lt;/em&gt;&lt;/h4&gt;
&lt;pre&gt;
&amp;lt;ul&amp;gt;
  &amp;lt;li&amp;gt;Firefox&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;Opera&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;Safari&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;Internet Explorer&amp;lt;/li&amp;gt;
  &amp;lt;/ul&amp;gt;
&amp;lt;li&amp;gt;Internet Explorer&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Internet Explorer&amp;lt;/li&amp;gt;&lt;/pre&gt;
&lt;h4&gt;&lt;em&gt;After:&lt;/em&gt;&lt;/h4&gt;
&lt;pre&gt;
&amp;lt;ul&amp;gt;
  &amp;lt;li&amp;gt;Firefox&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;Opera&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;Safari&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;Internet Explorer&amp;lt;/li&amp;gt;
  &lt;strong&gt;&amp;lt;-- IE6 fix --&amp;gt;&lt;/strong&gt;
&amp;lt;/ul&amp;gt;&lt;/pre&gt;
&lt;h3&gt;In Closing&lt;/h3&gt;
&lt;p&gt;With the CSS tricks described in this article, you are well-equipped to tame the IE6 beast and get it to behave when displaying your web pages. When it&amp;#8217;s time to make your next design compatible with IE6, refer to this definitive guide for clear explanations and solutions for the most common IE6 issues. And of course, if you&amp;#8217;ve got more tricks, ideas, comments, or questions, be sure to sound off in the comments section!&lt;/p&gt;
&lt;h3&gt;Related content&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://sixrevisions.com/javascript/javascript-debugging-techniques-in-ie-6/"&gt;JavaScript Debugging Techniques in IE 6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sixrevisions.com/project-management/adopting-a-does-it-really-matter-philosophy/"&gt;Adopting a &amp;quot;Does It Really Matter?&amp;quot; Philosophy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sixrevisions.com/css/20-useful-resources-for-learning-about-css3/"&gt;20 Useful Resources for Learning about CSS3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Related categories&lt;/em&gt;: &lt;a href="http://sixrevisions.com/category/css/"&gt;CSS&lt;/a&gt; and &lt;a href="http://sixrevisions.com/category/web-development/"&gt;Web Development&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;About the Author&lt;/h3&gt;
&lt;p class="about-author"&gt;&lt;img src="http://images.sixrevisions.com/authors/jeff-starr_small.jpg" alt="" width="80" height="80" /&gt;&lt;span class="author-bio-text"&gt;&lt;strong&gt;Jeff Starr&lt;/strong&gt; is a web-developing, graphic-designing alien from the distant planet &lt;a href="http://perishablepress.com/" title="Perishable Press: Digital Design and Dialogue"&gt;Perishable Press&lt;/a&gt;. When he&amp;#8217;s not flying through hyperspace, Jeff uses his alien powers to write &lt;a href="http://diggingintowordpress.com/" title="Digging into WordPress"&gt;amazing stuff about WordPress&lt;/a&gt; and design &lt;a href="http://monzilla.biz/" title="Monzilla Media: Obsessive Web and Graphic Design"&gt;awesome websites for humans&lt;/a&gt;. Jeff comes in peace, so don&amp;#8217;t be afraid to &lt;a href="http://twitter.com/perishable" title="Jeff Starr (aka Perishable) on Twitter"&gt;follow him on Twitter&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SixRevisions/~4/wNrSH0P3EBs" height="1" width="1"/&gt;</description><pubDate>Thu, 23 Jul 2009 21:54:32 GMT</pubDate><guid isPermaLink="false">http://sixrevisions.com/?p=1323</guid><comments>http://sixrevisions.com/web-development/definitive-guide-to-taming-the-ie6-beast/#comments</comments><author>Jacob Gube</author><source url="http://feeds.feedburner.com/SixRevisions">Six Revisions</source><ng:postId>10196990226</ng:postId><ng:feedId>2275289</ng:feedId><ng:folderId>0</ng:folderId><ng:folder ng:id="0" ng:flagState="0" ng:annotation="" /><feedburner:origLink>http://feedproxy.google.com/~r/SixRevisions/~3/wNrSH0P3EBs/</feedburner:origLink></item><item><title>Computing with JavaScript Web Workers</title><link>http://feedproxy.google.com/~r/newsgator/efJB/~3/hYiIA6n5imI/</link><description>	&lt;p&gt;&lt;a href="http://www.whatwg.org/specs/web-workers/current-work/"&gt;Web Workers&lt;/a&gt; are, undoubtedly, the coolest new feature to arrive in the latest version of web browsers. Web Workers allow you to run JavaScript in parallel on a web page, without blocking the user interface.&lt;/p&gt;
	&lt;p&gt;Normally in order to achieve any sort of computation using JavaScript you would need to break your jobs up into tiny chunks and split their execution apart using timers. This is both slow and unimpressive (since you can't actually run anything in parallel - more information on this in &lt;a href="http://ejohn.org/blog/how-javascript-timers-work/"&gt;How JavaScript Timers Work&lt;/a&gt;).&lt;/p&gt;
	&lt;p&gt;With our current situation in mind, let's dig in to Web Workers.&lt;/p&gt;
	&lt;h3&gt;Web Workers&lt;/h3&gt;
	&lt;p&gt;The &lt;a href="http://www.whatwg.org/specs/web-workers/current-work/"&gt;Web Worker recommendation&lt;/a&gt; is partially based off of the prior work done by the Gears team on their &lt;a href="http://code.google.com/apis/gears/api_workerpool.html"&gt;WorkerPool Module&lt;/a&gt;. The idea has since grown and been tweaked to become a full recommendation.&lt;/p&gt;
	&lt;p&gt;A 'worker' is a script that will be loaded and executed in the background. Web Workers provide a way to do this seamlessly, for example:&lt;/p&gt;
	&lt;div class="syntax_hilite"&gt;
&lt;div id="js-1"&gt;
	&lt;div&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;new&lt;/span&gt; Worker&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"worker.js"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;p&gt;The above will load the script, located at 'worker.js', and execute it in the background.&lt;/p&gt;
	&lt;p&gt;There are some HUGE stipulations, though:&lt;/p&gt;
	&lt;ol&gt;
	&lt;li&gt;Workers don't have access to the DOM. No &lt;code&gt;document&lt;/code&gt;, &lt;code&gt;getElementById&lt;/code&gt;, etc. (The notable exceptions are &lt;code&gt;setTimeout&lt;/code&gt;, &lt;code&gt;setInterval&lt;/code&gt;, and &lt;code&gt;XMLHttpRequest&lt;/code&gt;.)&lt;/li&gt;
	&lt;li&gt;Workers don't have direct access to the 'parent' page.&lt;/li&gt;
	&lt;/ol&gt;
	&lt;p&gt;With these points in mind the big question should be: How do you actually use a worker and what is it useful for?&lt;/p&gt;
	&lt;p&gt;You use a worker by communicating with it using messages. All browsers support passing in a string message (Firefox 3.5 also supports passing in JSON-compatible objects). This message will be communicated to the worker (the worker can also communicate messages back to the parent page). This is the extent to which communication can occur.&lt;/p&gt;
	&lt;p&gt;The message passing is done using the &lt;a href="http://ejohn.org/blog/postmessage-api-changes/"&gt;postMessage&lt;/a&gt; API, working like this:&lt;/p&gt;
	&lt;div class="syntax_hilite"&gt;
&lt;div id="js-2"&gt;
	&lt;div&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; worker = &lt;span style="color: #003366; font-weight: bold;"&gt;new&lt;/span&gt; Worker&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"worker.js"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/p&gt;
	&lt;p&gt;&lt;span style="color: #009900; font-style: italic;"&gt;// Watch for messages from the worker&lt;/span&gt;&lt;br /&gt;
worker.&lt;span style="color: #006600;"&gt;onmessage&lt;/span&gt; = &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;e&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style="color: #009900; font-style: italic;"&gt;// The message from the client:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; e.&lt;span style="color: #006600;"&gt;data&lt;/span&gt;&lt;br /&gt;
&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;;&lt;/p&gt;
	&lt;p&gt;worker.&lt;span style="color: #006600;"&gt;postMessage&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"start"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;p&gt;&lt;strong&gt;The Client:&lt;/strong&gt;&lt;/p&gt;
	&lt;div class="syntax_hilite"&gt;
&lt;div id="js-3"&gt;
	&lt;div&gt;onmessage = &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;e&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt; e.&lt;span style="color: #006600;"&gt;data&lt;/span&gt; === &lt;span style="color: #3366CC;"&gt;"start"&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #009900; font-style: italic;"&gt;// Do some computation&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; done&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;;&lt;/p&gt;
	&lt;p&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; done&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style="color: #009900; font-style: italic;"&gt;// Send back the results to the parent page&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; postMessage&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"done"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;p&gt;This particular message-passing limitation is in place for a number of reasons: It keeps the child worker running securely (since it can't, blatantly, affect a parent script) and it keeps the parent page thread-safe (having the DOM be thread safe would be a logistical nightmare for browser developers).&lt;/p&gt;
	&lt;p&gt;Right now Web Workers are implemented by Firefox 3.5 and Safari 4. They've also landed in the &lt;a href="http://build.chromium.org/buildbot/snapshots/chromium-rel-xp/"&gt;latest Chromium nightlies&lt;/a&gt;. Most people would balk when hearing this (only two released browsers!) but this shouldn't be a concern. Workers allow you to take a normal piece of computation and highly parallelize it. In this way you can easily have two versions of a script (one that runs in older browsers and one that runs in a worker, if it's available). Newer browsers will just run that much faster.&lt;/p&gt;
	&lt;p&gt;Some interesting demos have already been created that utilize this new API.&lt;/p&gt;
	&lt;p&gt;&lt;strong&gt;RayTracing&lt;/strong&gt;&lt;/p&gt;
	&lt;p&gt;&lt;a href="http://nerget.com/rayjs-mt/rayjs.html"&gt;&lt;img src="http://ejohn.org/files/ww-raytracer.sm.png"/&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;This demo makes use of Canvas to draw out a rendered scene. You'll note that when you turn on the workers the scene is drawn in pieces. This is working by telling a worker to compute a slice of pixels. The worker responds with an array of colors to draw on the Canvas and the parent page changes the canvas. (Note that the worker itself doesn't manipulate the canvas.)&lt;/p&gt;
	&lt;p&gt;&lt;strong&gt;Movement Tracking&lt;/strong&gt;&lt;/p&gt;
	&lt;p&gt;&lt;a href="http://www.mozbox.org/pub/tracker/"&gt;&lt;img src="http://ejohn.org/files/ww-move.sm.png"/&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;(Requires Firefox 3.5. &lt;a href="http://blog.mozbox.org/post/2009/02/20/Video-Canvas-Worker-thread-A-movement-tracker"&gt;About the demo&lt;/a&gt;.) This one uses a number of technologies: The video element, the canvas element, and drawing video frames to a canvas. All of the motion detection it taking place in the background worker (so that the video rendering isn't blocked).&lt;/p&gt;
	&lt;p&gt;&lt;strong&gt;Simulated Annealing&lt;/strong&gt;&lt;/p&gt;
	&lt;p&gt;&lt;a href="http://www.mozbox.org/pub/simulatedAnnealing/"&gt;&lt;img src="http://ejohn.org/files/ww-anneal.sm.png"/&gt;&lt;/a&gt;&lt;/p&gt;
	&lt;p&gt;This demo attempts to draw outlines around a series of randomly-placed points using simulated annealing (&lt;a href="http://en.wikipedia.org/wiki/Simulated_annealing"&gt;More information&lt;/a&gt;). It also includes an animated PNG (works in Firefox 3.5) that continues to spin even while all the processing is occurring in the background.&lt;/p&gt;
	&lt;h3&gt;Computing with JavaScript Web Workers&lt;/h3&gt;
	&lt;p&gt;The other day Engine Yard started &lt;a href="http://www.engineyard.com/blog/2009/programming-contest-win-iphone-3gs-2k-cloud-credit/"&gt;an interesting contest&lt;/a&gt; (which is probably over, by the time that you're reading this).&lt;/p&gt;
	&lt;p&gt;The premise is that they would give you a phrase, which you would take the SHA1 of, and try to find another SHA1-ed string that has the smallest possible &lt;a href="http://en.wikipedia.org/wiki/Hamming_distance"&gt;hamming distance&lt;/a&gt; from the original.&lt;/p&gt;
	&lt;p&gt;The phrase was &lt;a href="http://www.engineyard.com/blog/2009/engine-yard-contest-challenge-phrase-and-dictionary/"&gt;posted the other day&lt;/a&gt; and developers have been furiously working to find a string that yields a low value.&lt;/p&gt;
	&lt;p&gt;The current leader is using a series of &lt;a href="http://forums.nvidia.com/index.php?showtopic=102349"&gt;dedicated GPUs&lt;/a&gt; crunching out results at a pace of a couple hundred million per second. Considering the rate at which they're progressing any other implementation will have a hard time catching up.&lt;/p&gt;
	&lt;p&gt;Of greater interest to me were two pure-JavaScript (&lt;a href="http://www.raycmorgan.com/"&gt;1&lt;/a&gt;, &lt;a href="http://rustyengines.silentmac.com/jsengine.php"&gt;2&lt;/a&gt;) entrants into the competition - they both run completely in the browser and utilize the user's JavaScript engine to find results. While neither of them have a prayer of overcoming the GPU-powered monsters dominating the pack, they do serve as an interesting realm for exploration.&lt;/p&gt;
	&lt;p&gt;Reading through the source to both implementations they both utilize nearly-identical tactics for computing results: They execute a batch of results broken up by a timer. I've played around with them in different browsers and have been able to get around 1000-1500 matches/second. Unfortunately they both peg the CPU pretty hard and even with the timer splitting they manage to bog down the user interface.&lt;/p&gt;
	&lt;p&gt;This sounds like a perfect opportunity to use Web Workers!&lt;/p&gt;
	&lt;p&gt;I took the &lt;a href="http://www.raycmorgan.com/"&gt;Ray C Morgan implementation&lt;/a&gt;, stripped out all the UI components and timers, and pushed it in to worker (through which 4 of them are run in parallel). (I submit results back to the original implementation, just in case a good result is found.)&lt;/p&gt;
	&lt;p&gt;Check out the demo and source:&lt;/p&gt;
	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://ejohn.org/apps/web-workers/"&gt;SHA1-Crunching Web Worker Demo&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://ejohn.org/apps/web-workers/run.js"&gt;'Parent' Source&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://ejohn.org/apps/web-workers/worker.js"&gt;Worker Source&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;I ran the &lt;a href="http://www.raycmorgan.com/"&gt;old implementation&lt;/a&gt; against the new one in the browsers that support Web Workers to arrive at the following results:&lt;/p&gt;
	&lt;table style="font-family:Helvetica,Arial;font-size:10px;width:400px;"&gt;
	&lt;tr&gt;
&lt;th&gt;Browser&lt;/th&gt;
	&lt;th&gt;Old Runs/s&lt;/th&gt;
	&lt;th&gt;New Runs/s&lt;/th&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;th&gt;Firefox 3.5&lt;/th&gt;
	&lt;td&gt;2700&lt;/td&gt;
	&lt;td&gt;4600&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;th&gt;Safari 4&lt;/th&gt;
	&lt;td&gt;2500&lt;/td&gt;
	&lt;td&gt;8400&lt;/td&gt;
&lt;/tr&gt;
	&lt;tr&gt;
&lt;th&gt;Chrome Nightly&lt;/th&gt;
	&lt;td&gt;4500&lt;/td&gt;
	&lt;td&gt;9600&lt;/td&gt;
&lt;/tr&gt;
	&lt;/table&gt;
	&lt;p&gt;How does this implementation work? Digging in to the &lt;a href="http://ejohn.org/apps/web-workers/run.js"&gt;source of the parent launcher&lt;/a&gt; we can see:&lt;/p&gt;
	&lt;div class="syntax_hilite"&gt;
&lt;div id="js-4"&gt;
	&lt;div&gt;&lt;span style="color: #009900; font-style: italic;"&gt;// Build a worker&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; worker = &lt;span style="color: #003366; font-weight: bold;"&gt;new&lt;/span&gt; Worker&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"worker.js"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/p&gt;
	&lt;p&gt;&lt;span style="color: #009900; font-style: italic;"&gt;// Listen for incoming messages&lt;/span&gt;&lt;br /&gt;
worker.&lt;span style="color: #006600;"&gt;onmessage&lt;/span&gt; = &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;e&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; parts = e.&lt;span style="color: #006600;"&gt;data&lt;/span&gt;.&lt;span style="color: #006600;"&gt;split&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;" "&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &lt;span style="color: #009900; font-style: italic;"&gt;// We're getting the rate at which computations are done&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt; parts&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;0&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#93;&lt;/span&gt; === &lt;span style="color: #3366CC;"&gt;"rate"&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; rates&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#91;&lt;/span&gt;i&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#93;&lt;/span&gt; = parseInt&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;parts&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;1&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #009900; font-style: italic;"&gt;// Total the rates from all the workers&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; total = &lt;span style="color: #CC0000;"&gt;0&lt;/span&gt;;&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #000066; font-weight: bold;"&gt;for&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; j = &lt;span style="color: #CC0000;"&gt;0&lt;/span&gt;; j &amp;lt; rates.&lt;span style="color: #006600;"&gt;length&lt;/span&gt;; j++ &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; total += rates&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#91;&lt;/span&gt;j&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#93;&lt;/span&gt;;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; num.&lt;span style="color: #006600;"&gt;innerHTML&lt;/span&gt; = total;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &lt;span style="color: #009900; font-style: italic;"&gt;// We've found a new best score, send it to the server&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt; parts&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;0&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#93;&lt;/span&gt; === &lt;span style="color: #3366CC;"&gt;"found"&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; img = document.&lt;span style="color: #006600;"&gt;createElement&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"img"&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; img.&lt;span style="color: #006600;"&gt;src&lt;/span&gt; = &lt;span style="color: #3366CC;"&gt;"http://www.raycmorgan.com/new-best?phrase="&lt;/span&gt; +&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; escape&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;parts.&lt;span style="color: #006600;"&gt;slice&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;1&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;join&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;" "&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; document.&lt;span style="color: #006600;"&gt;body&lt;/span&gt;.&lt;span style="color: #006600;"&gt;appendChild&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt; img &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &lt;span style="color: #009900; font-style: italic;"&gt;// A new personal best score was found&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt; parts&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;0&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#93;&lt;/span&gt; === &lt;span style="color: #3366CC;"&gt;"mybest"&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; tmp = parseInt&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;parts&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;1&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt; tmp &amp;lt; mybest &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; mybest = tmp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; best.&lt;span style="color: #006600;"&gt;innerHTML&lt;/span&gt; = mybest;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;
&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;;&amp;nbsp; &amp;nbsp; &lt;/p&gt;
	&lt;p&gt;&lt;span style="color: #009900; font-style: italic;"&gt;// Start the worker&lt;/span&gt;&lt;br /&gt;
worker.&lt;span style="color: #006600;"&gt;postMessage&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt; data.&lt;span style="color: #006600;"&gt;sha&lt;/span&gt; + &lt;span style="color: #3366CC;"&gt;" "&lt;/span&gt; + &lt;br /&gt;
&amp;nbsp; data.&lt;span style="color: #006600;"&gt;words&lt;/span&gt;.&lt;span style="color: #006600;"&gt;join&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;","&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; + &lt;span style="color: #3366CC;"&gt;" "&lt;/span&gt; + data.&lt;span style="color: #006600;"&gt;best&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;p&gt;To start, we're constructing the worker and listening for any incoming messages. There are three types of messages that can come from the worker: "rate" (a 'ping' from the worker notifying the parent how quickly it's running), "found" (sent back when a new high scoring phrase has been found by the client), and "mybest" (sent when the worker gets a new personal-best high score).&lt;/p&gt;
	&lt;p&gt;Additionally we can see the initialization data sent to the client in &lt;code&gt;worker.postMessage&lt;/code&gt;. Unfortunately we have to pass the data in using a string in order to have it work in all browsers (only Firefox 3.5 supports the ability to pass in a raw JavaScript object).&lt;/p&gt;
	&lt;p&gt;Looking at the contents of the &lt;a href="http://ejohn.org/apps/web-workers/worker.js"&gt;worker&lt;/a&gt; we can see some more, interesting, logic.&lt;/p&gt;
	&lt;div class="syntax_hilite"&gt;
&lt;div id="js-5"&gt;
	&lt;div&gt;&lt;span style="color: #009900; font-style: italic;"&gt;// ... snip ...&lt;/span&gt;&lt;/p&gt;
	&lt;p&gt;&lt;span style="color: #009900; font-style: italic;"&gt;// New Personal Best Found&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;distance &amp;lt; myBest&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; myBest = distance;&lt;br /&gt;
&amp;nbsp; postMessage&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"mybest "&lt;/span&gt; + myBest&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;/p&gt;
	&lt;p&gt;&lt;span style="color: #009900; font-style: italic;"&gt;// New All-time Best Found&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;distance &amp;lt; best&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; best = distance;&lt;br /&gt;
&amp;nbsp; postMessage&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;"found "&lt;/span&gt; + phrase&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;/p&gt;
	&lt;p&gt;&lt;span style="color: #009900; font-style: italic;"&gt;// ... snip ...&lt;/span&gt;&lt;/p&gt;
	&lt;p&gt;&lt;span style="color: #009900; font-style: italic;"&gt;// Report Rate Back to Parent&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt; stats&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; nowDiff = &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;new&lt;/span&gt; Date&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;getTime&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt; - startTime;&lt;br /&gt;
&amp;nbsp; &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; perSec = Math.&lt;span style="color: #006600;"&gt;floor&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;processed/nowDiff*&lt;span style="color: #CC0000;"&gt;1000&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; postMessage&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"rate "&lt;/span&gt; + perSec &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;&lt;/p&gt;
	&lt;p&gt;&lt;span style="color: #009900; font-style: italic;"&gt;// ... snip ...&lt;/span&gt;&lt;/p&gt;
	&lt;p&gt;&lt;span style="color: #009900; font-style: italic;"&gt;// Get the incoming information from the parent&lt;/span&gt;&lt;br /&gt;
onmessage = &lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;e&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; parts = e.&lt;span style="color: #006600;"&gt;data&lt;/span&gt;.&lt;span style="color: #006600;"&gt;split&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;" "&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; data = &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#123;&lt;/span&gt; sha: parts&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;0&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#93;&lt;/span&gt;, words: parts&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;1&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#93;&lt;/span&gt;.&lt;span style="color: #006600;"&gt;split&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;","&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;, best: parts&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #CC0000;"&gt;2&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; start&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style="color:#008800; font-weight:bold;"&gt;&amp;#125;&lt;/span&gt;;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
	&lt;p&gt;The two 'distance' checks take place deep in the computation logic. After a new match has been found it is compared against the existing high scores. If this a sufficiently good-enough the result is sent back to the parent page using &lt;code&gt;postMessage&lt;/code&gt;.&lt;/p&gt;
	&lt;p&gt;The 'stats' function is called periodically, which then reports back the current rate of processing to the parent page.&lt;/p&gt;
	&lt;p&gt;The 'onmessage' callback listens for the initialization data to come from the parent page - and once it's been received begins processing.&lt;/p&gt;
	&lt;p&gt;--&lt;/p&gt;
	&lt;p&gt;In all I found this project to be a lot of fun - a relatively minor amount of code yielded 2-3x faster computation power. If you're doing any computation with JavaScript you should definitely opt to use Web Workers if they're available - the result is both faster and a better experience for the end user.
&lt;/p&gt;
		&lt;img src="http://ejohn.org/apps/rss/?from=rss&amp;id=5691" style="width:0px;height:0px;"/&gt;&lt;img src="http://feeds.feedburner.com/~r/JohnResig/~4/hYiIA6n5imI" height="1" width="1"/&gt;</description><pubDate>Tue, 21 Jul 2009 20:25:32 GMT</pubDate><guid isPermaLink="false">http://ejohn.org/blog/web-workers/</guid><comments>http://ejohn.org/blog/web-workers/#comments</comments><author>John Resig</author><source url="http://feeds.feedburner.com/JohnResig">John Resig</source><ng:postId>10183394968</ng:postId><ng:feedId>147422</ng:feedId><ng:folderId>0</ng:folderId><ng:folder ng:id="0" ng:flagState="0" ng:annotation="" /><feedburner:origLink>http://ejohn.org/blog/web-workers/</feedburner:origLink></item><item><title>Fake Steve on the True Cost of Chinese Manufacturing</title><link>http://feedproxy.google.com/~r/newsgator/efJB/~3/zUNWHsHk5AI/im-really-thinking-maybe-i-shouldnt.html</link><description>
&lt;p&gt;Fake Steve:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;We all know that there&amp;#8217;s no fucking way in the world we should have microwave ovens and refrigerators and TV sets and everything else at the prices we&amp;#8217;re paying for them. There&amp;#8217;s no way we get all this stuff and everything is done fair and square and everyone gets treated right. No way. And don&amp;#8217;t be confused &amp;#8212; what we&amp;#8217;re talking about here is our way of life. Our standard of living. You want to &amp;#8220;fix things in China,&amp;#8221; well, it&amp;#8217;s gonna cost you. Because everything you own, it&amp;#8217;s all done on the backs of millions of poor people whose lives are so awful you can&amp;#8217;t even begin to imagine them, people who will do anything to get a life that is a tiny bit better than the shitty one they were born into, people who get exploited and treated like shit and, in the worst of all cases, pay with their lives.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div&gt;
&lt;a  title="Permanent link to ‘Fake Steve on the True Cost of Chinese Manufacturing’"  href="http://daringfireball.net/linked/2009/07/22/fsj-china"&gt;&amp;nbsp;★&amp;nbsp;&lt;/a&gt;
&lt;/div&gt;

	</description><pubDate>Wed, 22 Jul 2009 14:32:11 GMT</pubDate><guid isPermaLink="false">tag:daringfireball.net,2009:/linked//6.17488</guid><author>John Gruber</author><source url="http://daringfireball.net/index.xml">Daring Fireball</source><ng:postId>10187890876</ng:postId><ng:feedId>3342</ng:feedId><ng:folderId>0</ng:folderId><ng:folder ng:id="0" ng:flagState="0" ng:annotation="" /><feedburner:origLink>http://fakesteve.blogspot.com/2009/07/im-really-thinking-maybe-i-shouldnt.html</feedburner:origLink></item><item><title>3D Transforms</title><link>http://feedproxy.google.com/~r/newsgator/efJB/~3/tWZZxrXlMNw/</link><description>&lt;p&gt;WebKit on Mac OS X now has support for &lt;a href="http://www.w3.org/TR/css3-3d-transforms/"title="CSS 3D Transforms Module Level 3"&gt;CSS 3D transforms&lt;/a&gt;, which allow you to position elements on the page in three-dimensional space using CSS. This is a natural extension of 2D transforms, which we described in an earlier &lt;a href="http://webkit.org/blog/130/css-transforms/" title="Surfin&amp;#8217; Safari - Blog Archive  &amp;raquo; CSS Transforms"&gt;blog post&lt;/a&gt;. 3D transforms have been supported on iPhone since 2.0, and now we&amp;#8217;re please to announce that we have currently added support for Leopard and later.&lt;/p&gt;
&lt;p&gt;If you want to jump right in and see a demo, make sure you&amp;#8217;re running &lt;a href="http://nightly.webkit.org/" title="WebKit Nightly Builds"&gt;recent WebKit nightly build&lt;/a&gt; on Leopard or later, and load this example:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://webkit.org/blog-files/3d-transforms/poster-circle.html"&gt;Poster Circle&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s a screenshot for those not running a recent-enough WebKit (if you are, hover over it for a treat!):&lt;/p&gt;
&lt;style type="text/css" media="screen"&gt;
#flip-container {
  position: relative;
  margin: 10px auto;
  width: 250px;
  height: 261px;
  z-index: 1;
}
.face.back {
  display: none;
}
@media all and (-webkit-transform-3d) {
  /* Use the media query to determine if 3D transforms are supported */
  #flip-container {
    -webkit-perspective: 800;
  }
  #flip-card {
    width: 100%;
    height: 100%;
    -webkit-transform-style: preserve-3d;
    -webkit-transition: -webkit-transform 1s;
  }
  #flip-container:hover #flip-card {
    -webkit-transform: rotateY(180deg);
  }
  .face {
    position: absolute;
    width: 100%;
    height: 100%;
    -webkit-backface-visibility: hidden;
  }
  .face.back {
    display: block;
    -webkit-transform: rotateY(180deg);
    -webkit-box-sizing: border-box;
    padding: 10px;
    font-size: 12pt;
    color: white;
    text-align: center;
    background-color: #835A99;
    -webkit-border-radius: 10px;
  }
}
&lt;/style&gt;
&lt;div id="flip-container"&gt;
&lt;div id="flip-card"&gt;
&lt;div class="front face"&gt;
    &lt;img src="http://webkit.org/blog-files/3d-transforms/poster-circle.png" width="250" height="261" alt="poster circle"/&gt;
  &lt;/div&gt;
&lt;div class="back face"&gt;
    This flip effect is done entirely with 3D transforms and transitions&amp;mdash;no JavaScript required!
  &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Like many of the examples you&amp;#8217;ll see here, this one combines CSS transforms with &lt;a href="http://webkit.org/blog/138/css-animation/" title="Surfin&amp;#8217; Safari - Blog Archive  &amp;raquo; CSS Animation"&gt;CSS transitions and animations&lt;/a&gt; to great effect.&lt;/p&gt;
&lt;p&gt;3D transforms are applied via the same &lt;code&gt;-webkit-transform&lt;/code&gt; property as 2D transforms. For example, here&amp;#8217;s how to rotate an element about the Y (vertical) axis:&lt;/p&gt;
&lt;pre&gt;
-webkit-transform: rotateY(45deg);
&lt;/pre&gt;
&lt;p&gt;There are several new transform functions available for use in the &lt;code&gt;-webkit-transform&lt;/code&gt; property:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;translate3d(x, y, z), translateZ(z)&lt;/dt&gt;
&lt;dd&gt;Move the element in x, y and z, and just move the element in z. Positive z is towards the viewer. Unlike x and y, the z value cannot be a percentage.&lt;/dd&gt;
&lt;dt&gt;scale3d(sx, sy, sz), scaleZ(sz)&lt;/dt&gt;
&lt;dd&gt;Scale the element in x, y and z. The z scale affects the scaling along the z axis in transformed children.&lt;/dd&gt;
&lt;dt&gt;rotateX(angle), rotateY(angle), rotate3d(x, y, z, angle), &lt;/dt&gt;
&lt;dd&gt;The first two forms simply rotate the element about the horizontal and vertical axes. Angle units can be degrees (deg) radians (rad) or gradians (grad). The last form allows you to rotate the element around an arbitrary vector in 3D space; x, y and z should specify the unit vector you wish to rotate around (we&amp;#8217;ll normalize it for you).&lt;/dd&gt;
&lt;dt&gt;perspective(p)&lt;/dt&gt;
&lt;dd&gt;This function allows you to put some perspective into the transformation matrix. For an explanation of &lt;em&gt;p&lt;/em&gt;, see below. Normally perspective is applied via the &lt;code&gt;-webkit-perspective&lt;/code&gt; property, but this function allows you to get a perspective effect for a single element, with something like:&lt;/p&gt;
&lt;pre&gt;
-webkit-transform: perspective(500px) rotateY(20deg);
&lt;/pre&gt;
&lt;/dd&gt;
&lt;dt&gt;matrix3d(&amp;#8230;)&lt;/dt&gt;
&lt;dd&gt;This function allows you to specify the raw 4&amp;#215;4 homogeneous transformation matrix of 16 values in column-major order. Have fun with that!&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;We&amp;#8217;ve also extended one other CSS transform property, and implemented the four other 3D-related properties described in the spec:
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-webkit-transform-origin&lt;/code&gt;&lt;/strong&gt; now accepts three values, allowing you to specify a z offset for the transform origin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-webkit-perspective&lt;/code&gt;&lt;/strong&gt; is used to give an illusion of depth; it determines how things change size based on their z-offset from the z=0 plane. You can think of it as though you&amp;#8217;re looking at the page from a distance &lt;em&gt;p&lt;/em&gt; away. Objects on the z=0 plane appear in their normal size. Something at a z offset of &lt;em&gt;p&lt;/em&gt;/2 (halfway between the viewer and the z=0 plane) will look twice as big, and something at a z offset of -&lt;em&gt;p&lt;/em&gt; will look half as big. Thus, large values give a little foreshortening effect, and small values lots of foreshortening. Values between 500px and 1000px give a reasonable-looking result for most content. &lt;/p&gt;
&lt;p&gt;The default origin for the perspective effect is the center of the element&amp;#8217;s border box, but you can control this with &lt;strong&gt;&lt;code&gt;-webkit-perspective-origin&lt;/code&gt;&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;
Here&amp;#8217;s an example that shows how perspective works:
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://webkit.org/blog-files/3d-transforms/perspective-by-example.html"&gt;Perspective&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; The interesting thing about &lt;code&gt;-webkit-perspective&lt;/code&gt; is that it does not affect the element directly. Instead, it affects the appearance of the 3D transforms on the transformed &lt;em&gt;descendants&lt;/em&gt; of that element; you can think of it as a adding a transform that gets multiplied into the descendant transforms. This allows those descendants to all share the same perspective as they move around. &lt;/p&gt;
&lt;p&gt;Now that we&amp;#8217;ve described how you can assign 3D transforms to elements and make them look three-dimensional with some perspective. However, so far, all the effects are really just painting effects. Those transformed children are still rendering into the plane of their parent; in other words, they are &lt;em&gt;flattened&lt;/em&gt;. &lt;/p&gt;
&lt;p&gt;When you start to build hierarchies of objects with 3D transforms, flattening is not what you want. You want parents and children to live in a shared three-dimensional space, and to all share the same perspective which propagates up from some container. This is where &lt;code&gt;-webkit-transform-style&lt;/code&gt; comes in. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-webkit-transform-style&lt;/code&gt;&lt;/strong&gt; has two values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;flat&lt;/code&gt;: This is the default value, and gives the behavior described above; transformed children are flattened into the plane of their parent (think of the 3D transform as simply a painting effect).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;preserves-3d&lt;/code&gt;: This value states that the element to which it is assigned does not flatten its children into it; instead, those children live in a shared 3D space with the element.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;#8217;s an example that shows transform-style in action:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://webkit.org/blog-files/3d-transforms/transform-style.html"&gt;Transform Style&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A common pattern, therefore, is to have content that looks like this:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;div class="container" style="-webkit-perspective: 600px"&amp;gt;
  &amp;lt;div class="box" style="-webkit-transform-style: preserve-3d; -webkit-transform: rotateY(10deg)"&amp;gt;
    &amp;lt;div class="leaf" style="-webkit-transform: rotateX(10deg)"&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Here both &amp;#8216;leaf&amp;#8217; and &amp;#8216;box&amp;#8217; share the same 3D space, so both appear with the perspective specified on the container. &amp;#8216;box&amp;#8217; can also be rotated with a transition or animation, and &amp;#8216;leaf&amp;#8217; will move around as &amp;#8216;box&amp;#8217; moves, in perspective.&lt;/p&gt;
&lt;p&gt;One thing you may have noticed in these demos is that it&amp;#8217;s quite common to have a 3D transform that flips an element around so that you can see its reverse side. In some cases you don&amp;#8217;t want the element to appear at all in this situation (say, for example, you want to position two elements back-to-back, so you need to hide the one that&amp;#8217;s facing away from the viewer). This is the reason for the last 3d-related property, &lt;strong&gt;&lt;code&gt;-webkit-backface-visibility&lt;/code&gt;&lt;/strong&gt;. Its two values&amp;mdash;&lt;code&gt;visible&lt;/code&gt; (the default), and &lt;code&gt;hidden&lt;/code&gt;&amp;mdash;specify whether the element is visible or not when that element is transformed such that its back face is towards the viewer. &lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s a final example that shows backface-visibility in action, along with more 3D goodness, animations and transitions:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://webkit.org/blog-files/3d-transforms/morphing-cubes.html"&gt;Morphing Power Cubes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="display: block; margin: 0 auto;" src="http://webkit.org/blog-files/3d-transforms/mighty-cubes.png" width="415" height="175" alt="mighty cubes"/&gt;&lt;/p&gt;
&lt;p&gt; For more information, see the CSS working drafts on &lt;a href="http://www.w3.org/TR/css3-2d-transforms/" title="CSS 2D Transforms Module Level 3"&gt;2D transforms&lt;/a&gt;, &lt;a href="http://www.w3.org/TR/css3-3d-transforms/" title="CSS 3D Transforms Module Level 3"&gt;3D transforms&lt;/a&gt;, &lt;a href="http://www.w3.org/TR/css3-transitions/" title="CSS Transitions Module Level 3"&gt;transitions&lt;/a&gt; and &lt;a href="http://www.w3.org/TR/css3-animations/" title="CSS Animations Module Level 3"&gt;animations&lt;/a&gt;. There is also documentation in the &lt;a href="http://developer.apple.com/safari/library/documentation/InternetWeb/Conceptual/SafariVisualEffectsProgGuide/Transforms/Transforms.html" title="Safari Visual Effects Guide: Transforms"&gt;Safari Reference Library&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We hope you have a blast with these new features, and share your creations with us. If you find bugs, please report them at &lt;a href="http://bugs.webkit.org/"&gt;bugs.webkit.org&lt;/a&gt;.&lt;/p&gt;
</description><pubDate>Thu, 16 Jul 2009 19:02:29 GMT</pubDate><guid isPermaLink="false">http://webkit.org/blog/?p=386</guid><comments>http://webkit.org/blog/386/3d-transforms/#comments</comments><author>Simon Fraser</author><source url="http://webkit.org/blog/feed/">Surfin' Safari</source><ng:postId>10146127391</ng:postId><ng:feedId>201764</ng:feedId><ng:folderId>0</ng:folderId><ng:folder ng:id="0" ng:flagState="0" ng:annotation="" /><feedburner:origLink>http://webkit.org/blog/386/3d-transforms/</feedburner:origLink></item><item><title>New York Nearest Subway Augmented Reality App for iPhone 3GS</title><link>http://feedproxy.google.com/~r/newsgator/efJB/~3/m4Izrj01P4c/watch</link><description>
&lt;p&gt;This is one of the most impressive software demo videos I&amp;#8217;ve ever seen. It&amp;#8217;s like something from &lt;em&gt;Minority Report&lt;/em&gt;. This is &lt;em&gt;holy shit!&lt;/em&gt; stuff. The developers, Acrossair, also have a similar app for London; both apps are awaiting approval from Apple.&lt;/p&gt;

&lt;p&gt;(&lt;strong&gt;Update:&lt;/strong&gt; I originally stated that the London app was already available; it is not.)&lt;/p&gt;

&lt;div&gt;
&lt;a  title="Permanent link to ‘New York Nearest Subway Augmented Reality App for iPhone 3GS’"  href="http://daringfireball.net/linked/2009/07/15/augmented-reality-iphone-app"&gt;&amp;nbsp;★&amp;nbsp;&lt;/a&gt;
&lt;/div&gt;

	</description><pubDate>Wed, 15 Jul 2009 21:08:42 GMT</pubDate><guid isPermaLink="false">tag:daringfireball.net,2009:/linked//6.17443</guid><author>John Gruber</author><source url="http://daringfireball.net/index.xml">Daring Fireball</source><ng:postId>10138002801</ng:postId><ng:feedId>3342</ng:feedId><ng:folderId>0</ng:folderId><ng:folder ng:id="0" ng:flagState="0" ng:annotation="" /><feedburner:origLink>http://www.youtube.com/watch?v=cH6r2tIaRXU</feedburner:origLink></item></channel></rss>
