<?xml version="1.0"?>
<rss version="2.0"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel>
	<title>Planet Mozilla Interns</title>
	<link>http://planet.mozilla.org/interns/</link>
	<language>en</language>
	<description>Planet Mozilla Interns - http://planet.mozilla.org/interns/</description>
	<atom:link rel="self" href="http://planet.mozilla.org/interns/rss20.xml" type="application/rss+xml"/>

<item>
	<title>Jez Ng: Announcing Doppio: A JVM in Coffeescript</title>
	<guid isPermaLink="true">http://www.discontinuously.com//2012/05/doppio:-a-jvm-in-coffeescript</guid>
	<link>http://www.discontinuously.com//2012/05/doppio:-a-jvm-in-coffeescript</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://int3.github.com/doppio/&quot;&gt;Doppio&lt;/a&gt; is a JVM implementation in Coffeescript. I worked on it with &lt;a href=&quot;https://github.com/perimosocordiae&quot;&gt;CJ Carey&lt;/a&gt; and &lt;a href=&quot;https://github.com/jleahey&quot;&gt;Jonny Leahey&lt;/a&gt; as &lt;a href=&quot;http://plasma.cs.umass.edu/emery/grad-systems-project-1&quot;&gt;part of a class&lt;/a&gt; this semester, but we took it a lot further than was required – it now runs Rhino as well as the Java 4 compiler. The &lt;a href=&quot;http://int3.github.com/doppio/about.html&quot;&gt;about page&lt;/a&gt; describes some of the architecture.&lt;/p&gt;

&lt;p&gt;I hadn’t quite planned to announce the project yet, but it found its way onto &lt;a href=&quot;http://www.reddit.com/r/programming/comments/t05yf/doppio_java_on_coffeescript_run_jvm_bytecodes_in/&quot;&gt;reddit&lt;/a&gt; and &lt;a href=&quot;http://news.ycombinator.com/item?id=3913435&quot;&gt;hackernews&lt;/a&gt;, so I guess the cat’s out of the bag. Pardon the rough edges!&lt;/p&gt;</description>
	<pubDate>Tue, 01 May 2012 16:21:05 +0000</pubDate>
</item>
<item>
	<title>Wei Zhou: Location based sex service – this is ridiculous.</title>
	<guid isPermaLink="true">http://weizhou.wordpress.com/2012/04/04/location-based-sex-service-this-is-ridiculous-10/</guid>
	<link>http://weizhou.wordpress.com/2012/04/04/location-based-sex-service-this-is-ridiculous-10/</link>
	<description>&lt;p&gt;OK before I go ahead and make any insightful comments. All of you need to know this popular mobile app: Mo Mo. (Chinese name, 陌陌). It could be directly translated as “strange strange”. And it’s a location based sex hookup software (tho it’s not explicitly explained on their website). &lt;/p&gt;
&lt;p&gt;Go ahead and download this app &lt;a href=&quot;http://immomo.com/&quot; title=&quot;http://immomo.com/&quot;&gt;here&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;If you know Chinese well – go ahead and read&lt;a href=&quot;http://zhidao.baidu.com/question/144893528.html&quot; title=&quot;http://zhidao.baidu.com/question/144893528.html&quot;&gt; this page&lt;/a&gt;, this explains the skills you’ll need to pick up girls. &lt;/p&gt;
&lt;p&gt;Everyone else thinks this app is gonna be huge someday and has the potential to beat up weixin (biggest voice instant chatting app developed by Tencent China) and weibo(Largest SNS micro-blogging site that gains facebook like attention in China, developed by Sina).&lt;/p&gt;
&lt;p&gt;The reason behind this is quite scientific - it meets human being’s basic desires. &lt;/p&gt;
&lt;p&gt;And I just think this is soooo wrong. A digital products’s moral value should be considered into development. &lt;/p&gt;
&lt;p&gt;Compared to Path (A very poetic, private and life-enhancing experience), Mo Mo is so wrong in almost every way. &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/weizhou.wordpress.com/412/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/weizhou.wordpress.com/412/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/weizhou.wordpress.com/412/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/weizhou.wordpress.com/412/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/weizhou.wordpress.com/412/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/weizhou.wordpress.com/412/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/weizhou.wordpress.com/412/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/weizhou.wordpress.com/412/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/weizhou.wordpress.com/412/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/weizhou.wordpress.com/412/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/weizhou.wordpress.com/412/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/weizhou.wordpress.com/412/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/weizhou.wordpress.com/412/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/weizhou.wordpress.com/412/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=weizhou.wordpress.com&amp;amp;blog=2603969&amp;amp;post=412&amp;amp;subd=weizhou&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 04 Apr 2012 23:08:36 +0000</pubDate>
	<dc:creator>wei zhou</dc:creator>
</item>
<item>
	<title>Wei Zhou: What does future digital businesses need?</title>
	<guid isPermaLink="false">http://weizhou.wordpress.com/?p=389</guid>
	<link>http://weizhou.wordpress.com/2012/04/04/what-does-future-digital-businesses-need/</link>
	<description>&lt;p&gt;&lt;strong&gt;What does future digital businesses need?&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;This world goes digital. It’s inevitable, intense and on-going. It is heavily relying on new trends of technology, which fosters to create two identities for each individual(a real self and a second digital self). As these two selves melt together, humanity, culture, nature and business are altered into one single important realm: DESIGN. Why?&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;The major difference between humans and other animals is that “we as human beings are constantly and reflectively changing and creating things and values”.  If we deconstruct human brain we would find the human brain is perfectly designed to align with our worldly visionary pattern: The left brain, the logic one, is constantly seeking efficiency. While the right brain, the emotional one, is relentlessly creating value. It’s not hard to take the assumption that the most valuable human behavior is creating innovative businesses that transforms needs and wants into meaningful realities. We believe a business model describes the rationale of how an organization creates, delivers and captures &lt;strong&gt;value&lt;/strong&gt;. A designer’s job is to extend the boundaries of thought, to generate new options, and, ultimately, to create value for users. This requires the ability to imagine “that which does not exist.” We are convinced that the rolls and attitude of the design profession are prerequisites for success in the business model generation. We can boldly assume the future business practitioners needs both knowledge of business and design to create truly innovative and successful digital products.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;SMALL and HUMAN&lt;/strong&gt;. Information technology rapidly reshapes the world and renders it as a flat and mash-able space. Technology and resources become less and less important factors for business creation. IT starts to penetrate human nature and immerses into every single aspect of daily lives. We conclude that a potential successful business model needs a solid and careful observation of human wants and needs. If a small business model can solve a tiny problem in a set environment – it could be used as a independent pattern for successful value creation. It contains a timeless value that can be used directly or replicated in a similar environment. &lt;strong&gt;We then assume the user experience design associated with that pattern is positive and with a guaranteed business value in it.&lt;/strong&gt; Venture capitalists love these small and human business ideas.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Everyone is entrepreneur.&lt;/strong&gt; This concept is originated from a pure fact: we now even see elementary school students creating iPhone apps to bring in extra income. The income tunnel is not entirely related with age, profession or geo. A simple idea with limited capital and human resource could become a marketable business model and potentially bringing in revenue and value.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Value Co-Creation.&lt;/strong&gt; “Everyone is entrepreneur” is both an concept and a fact. The integration of resource becomes a must. Interdependency is necessary.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;In sum. I believe digital business needs three things: Small&amp;amp;human, everyone as entrepreneur and value co-creation.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/weizhou.wordpress.com/389/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/weizhou.wordpress.com/389/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/weizhou.wordpress.com/389/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/weizhou.wordpress.com/389/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/weizhou.wordpress.com/389/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/weizhou.wordpress.com/389/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/weizhou.wordpress.com/389/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/weizhou.wordpress.com/389/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/weizhou.wordpress.com/389/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/weizhou.wordpress.com/389/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/weizhou.wordpress.com/389/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/weizhou.wordpress.com/389/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/weizhou.wordpress.com/389/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/weizhou.wordpress.com/389/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=weizhou.wordpress.com&amp;amp;blog=2603969&amp;amp;post=389&amp;amp;subd=weizhou&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 04 Apr 2012 03:50:00 +0000</pubDate>
	<dc:creator>wei zhou</dc:creator>
</item>
<item>
	<title>Ehren Metcalfe: The Dead</title>
	<guid isPermaLink="false">http://ehren.wordpress.com/?p=522</guid>
	<link>http://ehren.wordpress.com/2012/03/24/the-dead/</link>
	<description>&lt;blockquote&gt;&lt;p&gt;that region where dwell the vast hosts of the dead&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Conservatively detecting unused functions in a large codebase requires more information than can be gleamed from a simplistic observation of compilation (using GCC or clang, for example). Functions called by ASM alone are one problem. Functions called only via dlsym are another. These are not insurmountable problems (ASM can be parsed; dlsym accepts a constant identifier).&lt;/p&gt;
&lt;p&gt;In addition, mozilla-central contains a large amount of third party code. Removing unused functions in these libraries is at odds with merging upstream changes. There are also large numbers of functions used on one platform (or build setting) but not another. Propagating the appropriate #ifdefs is the solution here but it’s a large task.&lt;/p&gt;
&lt;p&gt;I’d like to offer one approach with an eye towards identifying the easiest candidates for removal. This is a combination of some of my existing work, by now admittedly crusty, based on Dehydra and &lt;a href=&quot;https://developer.mozilla.org/en/Developer_Guide/Callgraph&quot;&gt;Callgraph&lt;/a&gt;, but with a new (too me) simple insight about how to group the members of the subgraph of unused functions: partition them by the “is called by or is a (dead) caller of” relation.&lt;/p&gt;
&lt;p&gt;This has the effect that if a false positive is in the results, all functions declared unused because they’ve been transitively called by the false positive get grouped with that false positive.&lt;/p&gt;
&lt;p&gt;The output of a tool employing the above is &lt;a href=&quot;http://matrix.senecac.on.ca/~egmetcalfe/dead.html&quot;&gt;here&lt;/a&gt; (source &lt;a href=&quot;https://github.com/ehren/thedead&quot;&gt;here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Some notes on the results&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The largest partition consists of &lt;a href=&quot;http://matrix.senecac.on.ca/~egmetcalfe/2343.svg&quot;&gt;541 nodes&lt;/a&gt; (&lt;strong&gt;warning&lt;/strong&gt;: giant file). It is the result of a single false positive, &lt;a href=&quot;http://mxr.mozilla.org/mozilla-central/search?string=legacy_Open&quot;&gt;legacy_Open&lt;/a&gt;, called only via PR_FindFunctionSymbol, a dlsym wrapper. I have attempted to mitigate these situations by colouring green those functions having &lt;em&gt;__attribute__(visibility(“hidden”))&lt;/em&gt; (visibility specified in the flags passed to GCC is also detected). The count of functions having this visibility, but not transitively called by a function that doesn’t, is listed in the ‘Transitively Hidden’ column. This info is useless here, however, because the function is exported using a &lt;a href=&quot;http://mxr.mozilla.org/mozilla-central/source/security/nss/lib/softoken/legacydb/nssdbm.def&quot;&gt;linker map&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It would be interesting to determine if the visibility is always correctly applied; I seem to remember seeing warnings related to the attribute in the past. There may be technical reasons why internal C++ must be visible but, in any case, its visibility does not preclude its removal. &lt;a href=&quot;http://matrix.senecac.on.ca/~egmetcalfe/994.svg&quot;&gt;Here’s&lt;/a&gt; &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=738957&quot;&gt;proof&lt;/a&gt;. (Also, I calculate that only 17.4% of mozilla-central has hidden visibility).&lt;/p&gt;
&lt;p&gt;Moving on, the next largest partition has &lt;a href=&quot;http://matrix.senecac.on.ca/~egmetcalfe/4515.svg&quot;&gt;507 nodes&lt;/a&gt;. They are all in the pulled-in chromium sources however. Apparently, it is genuinely dead because the minimum ranked note, &lt;a href=&quot;http://mxr.mozilla.org/mozilla-central/search?string=evrpc_register_rpc&quot;&gt;evrpc_register_rpc&lt;/a&gt;, is only used in a test case (via a macro).&lt;/p&gt;
&lt;p&gt;xptcstubs’ &lt;a href=&quot;http://mxr.mozilla.org/mozilla-central/search?string=PrepareAndDispatch&quot;&gt;PrepareAndDispatch&lt;/a&gt; is an example of a false positive due to ASM (graph &lt;a href=&quot;http://matrix.senecac.on.ca/~egmetcalfe/4890.svg title='nsMathMLForeignFrameWrapper class and related files are dead'&quot;&gt;here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Anyhow, I will leave the reader to examine the rest which gets more interesting once you skip the mega partitions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Potential improvements&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The non-callgraph portion of the tool is really just a couple of hacky scripts. The same thing could be implemented against the &lt;a href=&quot;http://quetzalcoatal.blogspot.com/2011/07/callgraph.html&quot;&gt;DXR callgraph&lt;/a&gt; (it would need to determine the targets of function pointers in some regard).&lt;/p&gt;
&lt;p&gt;On this topic of handling function pointers, note that the call graph of this tool uses the naive address-taken approach. However, it has been ‘optimized’ for the dead code problem by treating the taking of a function’s address inside the scope of a function as a normal call. This makes the call graph useless for practically anything else but I plan on adding an addressTaker/addressTakee table in the future.&lt;/p&gt;
&lt;p&gt;In fact, such an addition would make it easier to implement a simple type-based alias analysis where functions noted to have their address taken at global or local scope are matched against pointers using their return type and the type of their parameters (they’d then be pruned from the address taken list). I’m not sure if there would be problems with this beyond unsafe casting.&lt;/p&gt;
&lt;p&gt;(More precise attempts at function pointer may-alias analysis would first require an interprocedural control flow graph but that is the simplest step. I’m somewhat tempted to build an ICFG using a hackish framework where visiting a function body = recompiling a .ii file. Were one to go about this, doing some basic form of interprocedural constant propagation and seeing what unused blocks fall out might be more fruitful.)&lt;/p&gt;
&lt;p&gt;In any case, I do have some numbers regarding how many more functions one could expect to declare dead by improving alias information. At one point I had made a change that affected the creation of SQL statements building the graph. By mistake I had left out the generation of SQL for all address taking, regardless of scope. This resulted in the tool flagging just over 50000 functions as dead. Given that it currently flags 11479 out of 187081 (6% — seems low), one might expect to find another 2300 (6% of 39000) or so (these numbers include declarations, definitions, gcc builtins and the like). Although come to think of it, that’s a dubious estimate because function scope address taking is already handled in an, albeit, imprecise manner and the number of functions whose address is taken at file scope is only 5949 (using the 6% figure, only 357 more would be found).&lt;/p&gt;
&lt;p&gt;Finally, another area of unnecessary conservatism is that, as you’ll note in graphs such as &lt;a href=&quot;http://matrix.senecac.on.ca/~egmetcalfe/3198.svg&quot;&gt;this one&lt;/a&gt;, there is an edge going both ways from a method declared in a base class to its override in a derived class (for example, there is an edge from &lt;a href=&quot;http://hg.mozilla.org/mozilla-central/file/ae8de2241732/content/svg/content/src/nsSVGAElement.cpp#l173&quot;&gt;nsSVGAElement::GetLinkState()&lt;/a&gt; to &lt;a href=&quot;http://hg.mozilla.org/mozilla-central/file/ae8de2241732/content/base/src/Link.cpp#l72&quot;&gt;Link::GetLinkState()&lt;/a&gt; because of a direct function call, but there are also two edges linking nsSVGAElement::GetLinkState() and &lt;a href=&quot;http://hg.mozilla.org/mozilla-central/file/ae8de2241732/content/base/public/nsIContent.h#l670&quot;&gt;nsIContent::GetLinkState()&lt;/a&gt; because of their inheritance relationship). The edge really only needs to go from the base to the derived though. Once this is changed, the tool will presumably flag instances where a method overrides a base class method but all calls go through the derived implementation.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/ehren.wordpress.com/522/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/ehren.wordpress.com/522/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/ehren.wordpress.com/522/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/ehren.wordpress.com/522/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/ehren.wordpress.com/522/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/ehren.wordpress.com/522/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/ehren.wordpress.com/522/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/ehren.wordpress.com/522/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/ehren.wordpress.com/522/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/ehren.wordpress.com/522/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/ehren.wordpress.com/522/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/ehren.wordpress.com/522/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/ehren.wordpress.com/522/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/ehren.wordpress.com/522/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=ehren.wordpress.com&amp;amp;blog=9426727&amp;amp;post=522&amp;amp;subd=ehren&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 24 Mar 2012 18:48:31 +0000</pubDate>
	<dc:creator>ehren</dc:creator>
</item>
<item>
	<title>Brian Krausz: Joining Facebook</title>
	<guid isPermaLink="false">http://briankrausz.com/?p=398</guid>
	<link>http://feedproxy.google.com/~r/nerdlife/~3/UCJxUa9_kb4/</link>
	<description>&lt;p&gt;For those who don’t follow my company blog:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.gazehawk.com/blog/gazehawk-team-joins-facebook/&quot;&gt;GazeHawk Team Joins Facebook&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I start at Facebook Monday.  As always I’m hoping I have the chance to blog more actively, though we’ll see how realistic that is.&lt;/p&gt;
&lt;p&gt;To go along with the new job, I’ve moved my blog over from nerdlife.net to briankrausz.com, and made it look a little more professional.  Nerdlife.net will be used to host my pet projects as they pop up.  Feedback/suggestions on the redesign are certainly welcome!&lt;/p&gt;
&lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/nerdlife/~4/UCJxUa9_kb4&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 10 Mar 2012 06:40:18 +0000</pubDate>
	<dc:creator>Brian</dc:creator>
</item>
<item>
	<title>Erick Dransch: Signing Mac Builds</title>
	<guid isPermaLink="false">http://www.erickdransch.com/blog/?p=32</guid>
	<link>http://www.erickdransch.com/blog/2012/02/signing-mac-builds/</link>
	<description>&lt;p&gt;For the past month or so I have been working with &lt;a href=&quot;http://blog.mozilla.com/bhearsum/&quot;&gt;Ben&lt;/a&gt; to add functionality for the signing of mac builds to our current signing infrastructure. Along the way, we discovered a few things.&lt;/p&gt;
&lt;h3&gt;What is signing?&lt;/h3&gt;
&lt;p&gt;Code signing is the process of attaching a digital signature to a piece of software that allows the user’s OS to verify that the software does indeed come from its advertised source, and that it has not been altered since being signed.&lt;/p&gt;
&lt;h3&gt;Why do we need signing?&lt;/h3&gt;
&lt;p&gt;Apple’s recently announced Mountain Lion is going to be introducing a few new features. In particular the new Gatekeeper ( &lt;a href=&quot;http://www.apple.com/macosx/mountain-lion/security.html&quot;&gt;Learn more here&lt;/a&gt; ) is important for Release Engineering at Mozilla. The default setting for Gatekeeper will *only* allow Applications to be installed from The App Store or from Registered Developers. This means that any applications are not signed by a Registered Apple Developer will show Security warnings when users install them. To ensure that our users have a seamless experience, we need to make sure that our builds are signed correctly according to Apple’s standards.&lt;br /&gt;
&lt;a href=&quot;http://www.apple.com/macosx/mountain-lion/security.html&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter&quot; height=&quot;354&quot; src=&quot;http://images.apple.com/macosx/mountain-lion/images/security_settings.jpg&quot; width=&quot;412&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Gatekeeper isn’t the only reason Code signing is important. Signing verifies that the contents of the Application a) come from the trusted developer and b) have not been altered. OSX also uses the code signatures to determine whether an Application is trustworthy enough to be allowed Keychain access.&lt;/p&gt;
&lt;h3&gt;Code Signing on OSX&lt;/h3&gt;
&lt;p&gt;Apple provides a tool for Signing Applications called ‘codesign’. The ‘codesign’ tool will apply a digital signature to an entire ‘.app’ directory.&lt;/p&gt;
&lt;p&gt;There are two parts to the signature:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A generated manifest containing hashes of each file in the directory. This file is located in ‘*.app/Contents/_CodeSigning/CodeResources’ and is generated according to a specified rules file (more on this later).&lt;/li&gt;
&lt;li&gt;A digital signature attached to the binary specified as ‘CFBundleExecutable’ in Info.plist . This signature also contains the hash of the generated CodeResources file.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;‘Codesign’ will verify a given ‘.app’s signature with the -v option. (Be sure to add a second v to get ‘verbose’ output, otherwise the only indication of success is the return code)&lt;/p&gt;
&lt;pre class=&quot;brush: plain; light: true; title: ; notranslate&quot;&gt;$ codesign -vv Firefox.app
Firefox.app: valid on disk
Firefox.app: satisfies its Designated Requirement
&lt;/pre&gt;
&lt;h3&gt;Automating Signing&lt;/h3&gt;
&lt;p&gt;There are a few important details about code signing on OSX which were important to address.&lt;/p&gt;
&lt;h4&gt;OS Compatibility&lt;/h4&gt;
&lt;p&gt;Applications which are signed on OS 10.7 (Lion) do not verify on 10.5 (Leopard). Since we want to be running one set of servers to sign all of our builds, we need signed builds to verify on 10.5, 10.6, and 10.7. Luckily, applications signed on OS 10.6 (Snow Leopard) verify correctly on all three versions. We’ll be using 10.6 as the OS on our Mac signing servers at least until 10.8 (Mountain Lion) is released, at which point we’ll need to re-evaluate.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h4&gt;Keychain Popup&lt;/h4&gt;
&lt;p&gt;Apple’s ‘codesign’ command require an signing key, or ID, which is stored in a Keychain. The ID and Keychain are passed as arguments to ‘codesign’. Unfortunately, ‘codesign’ does not offer any way to enter the password at the command line. If it tries to access a locked Keychain, it will pop up a UI prompt, asking the user for the Keychain’s password.&lt;/p&gt;
&lt;div class=&quot;wp-caption aligncenter&quot; id=&quot;attachment_117&quot; style=&quot;width: 472px;&quot;&gt;&lt;a href=&quot;http://www.erickdransch.com/blog/wp-content/uploads/2012/02/KeychainPop.jpg&quot;&gt;&lt;img alt=&quot;The bane of release engineers worldwide&quot; class=&quot;size-full wp-image-117&quot; height=&quot;242&quot; src=&quot;http://www.erickdransch.com/blog/wp-content/uploads/2012/02/KeychainPop.jpg&quot; width=&quot;462&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;The bane of release engineers worldwide&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Thankfully for those of us who like to automate things, the ‘security’ tool comes to our rescue here. ‘Security’ is another Apple tool that allows command-line access and manipulation of Keychains. And ‘security’ does allow the Keychain’s password to be entered either as an argument or in response to a terminal prompt.&lt;/p&gt;
&lt;pre class=&quot;brush: plain; light: true; title: ; notranslate&quot;&gt;$ security unlock-keychain ***.keychain
password to unlock ***.keychain:
&lt;/pre&gt;
&lt;p&gt;One important thing to note about the ‘security unlock-keychain’ command is that it will only unlock the Keychain for the current security context. In particular this means that if the Keychain has been unlocked by the command being run in a terminal, it is not unlocked for any ssh connections into the machine.&lt;br /&gt;
To user ‘security unlock-keychain’ without user interaction, the password needs to be entered at the tty level. &lt;a href=&quot;http://www.noah.org/wiki/pexpect&quot;&gt;Pexpect&lt;/a&gt; is one option for python which will wait for the command-line prompt and enter the password.&lt;br /&gt;
Now we’ve got all the tools we need to automate signing with the following steps with no user interaction:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Unlock the keychain with ‘security unlock-keychain’ and enter the passphrase using pexpect&lt;/li&gt;
&lt;li&gt;Run the ‘codesign’ command&lt;/li&gt;
&lt;li&gt;Lock the keychain again with ‘security lock-keychain’&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Code Resources&lt;/h4&gt;
&lt;p&gt;The CodeResources file is used by ‘codesign’ to specify which files in the ‘.app’ directory need to be included in the signature and which files do not. Before signing, the CodeResources file contains a set of rules. After signing, the hashes of all files specified in the rules will be added to the CodeResources file.&lt;br /&gt;
&lt;a href=&quot;https://developer.apple.com/library/mac/#technotes/tn2206/_index.html&quot;&gt;This&lt;/a&gt; page by Apple provides some description and examples of the CodeResources file, but it fails to explicitly state an important fact: any path specified in the CodeResources rules will be interpreted recursively to include all of the files in that directory and below.&lt;br /&gt;
The CodeResources rules must specify all files that need to be included in the final signature. Any files not listed or not in any of the recursive includes will be ignored, and will not have their hashes added to the signed version of the CodeResources file. Any files that are included in a recursive listing of a directory can be explicitly omitted. The file specified as ‘CFBundleExecutable’ in Info.plist is never included in the signed CodeResources file. Instead it is signed directly by the ‘codesign’ command.&lt;/p&gt;
&lt;p&gt;The following example will use this simple directory structure:&lt;/p&gt;
&lt;pre class=&quot;brush: plain; light: true; title: ; notranslate&quot;&gt;Test.app
    Contents
        Info.plist
        MacOS
            binary &amp;lt;-- the binary file listed in Info.plist
            anotherfile
        Resources
            omittedfile
            resourcesfile
&lt;/pre&gt;
&lt;p&gt;Before signing, we specify a set of rules in the CodeResources file. These rules will be passed to the ‘codesign’ command when it is called. The following code specifies these rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; Recursively include the ‘MacOS’ directory and the ‘Resources’ directory &lt;/li&gt;
&lt;li&gt;Omit ‘Resources/omittedfile’ from signing.&lt;/li&gt;
&lt;li&gt;Include ‘version.plist’ in the signature&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;brush: xml; title: ; notranslate&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&amp;gt;
&amp;lt;plist version=&quot;1.0&quot;&amp;gt;
&amp;lt;dict&amp;gt;
	&amp;lt;dict&amp;gt;
        &amp;lt;!-- Recursively include 'MacOS' and 'Resources' dirs --&amp;gt;
		&amp;lt;key&amp;gt;^MacOS/&amp;lt;/key&amp;gt;
		&amp;lt;true/&amp;gt;
		&amp;lt;key&amp;gt;^Resources/&amp;lt;/key&amp;gt;
		&amp;lt;true/&amp;gt;
        &amp;lt;!-- Omit a file --&amp;gt;
		&amp;lt;key&amp;gt;^Resources/omittedfile$&amp;lt;/key&amp;gt;
		&amp;lt;dict&amp;gt;
			&amp;lt;key&amp;gt;omit&amp;lt;/key&amp;gt;
			&amp;lt;true/&amp;gt;
			&amp;lt;key&amp;gt;weight&amp;lt;/key&amp;gt;
			&amp;lt;real&amp;gt;1100&amp;lt;/real&amp;gt;
		&amp;lt;/dict&amp;gt;
		&amp;lt;key&amp;gt;^version.plist$&amp;lt;/key&amp;gt;
		&amp;lt;true/&amp;gt;
	&amp;lt;/dict&amp;gt;
&amp;lt;/dict&amp;gt;
&amp;lt;/plist&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The after signing, the CodeResources file has a list of the hash of every file specified in the rules. If any of these files are changed, ‘codesign -vv’ will fail and will specify the changed file. Notice that the omitted file does not have its hash listed here, nor does the Info.plist file, which was not included explicitly, nor in any of the recursive includes. The binary file has been signed separately by ‘codesign’ and is not included in this file.&lt;/p&gt;
&lt;pre class=&quot;brush: xml; title: ; notranslate&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&amp;gt;
&amp;lt;plist version=&quot;1.0&quot;&amp;gt;
&amp;lt;dict&amp;gt;
	&amp;lt;key&amp;gt;files&amp;lt;/key&amp;gt;
	&amp;lt;dict&amp;gt;
		&amp;lt;key&amp;gt;MacOS/anotherfile&amp;lt;/key&amp;gt;
		&amp;lt;data&amp;gt;
		K2QRL8qPGNuexZXewkmnMlmcdKU=
		&amp;lt;/data&amp;gt;
		&amp;lt;key&amp;gt;Resources/resourcesfile&amp;lt;/key&amp;gt;
		&amp;lt;data&amp;gt;
		PhrNXR4JvoBSBHWVsGOxbosr2po=
		&amp;lt;/data&amp;gt;
	&amp;lt;/dict&amp;gt;
	&amp;lt;key&amp;gt;rules&amp;lt;/key&amp;gt;
	&amp;lt;dict&amp;gt;
		&amp;lt;key&amp;gt;^MacOS/&amp;lt;/key&amp;gt;
		&amp;lt;true/&amp;gt;
		&amp;lt;key&amp;gt;^Resources/&amp;lt;/key&amp;gt;
		&amp;lt;true/&amp;gt;
		&amp;lt;key&amp;gt;^Resources/omittedfile$&amp;lt;/key&amp;gt;
		&amp;lt;dict&amp;gt;
			&amp;lt;key&amp;gt;omit&amp;lt;/key&amp;gt;
			&amp;lt;true/&amp;gt;
			&amp;lt;key&amp;gt;weight&amp;lt;/key&amp;gt;
			&amp;lt;real&amp;gt;1100&amp;lt;/real&amp;gt;
		&amp;lt;/dict&amp;gt;
		&amp;lt;key&amp;gt;^version.plist$&amp;lt;/key&amp;gt;
		&amp;lt;true/&amp;gt;
	&amp;lt;/dict&amp;gt;
&amp;lt;/dict&amp;gt;
&amp;lt;/plist&amp;gt;
&lt;/pre&gt;
&lt;h3&gt;That’s it for now&lt;/h3&gt;
&lt;p&gt;Look for Mac signing servers in the next few weeks at Mozilla. I hope this helps us provide a more seamless user experience (maybe including Keychain access?), and readies us for the release of OS 10.8 (Mountain Lion).&lt;/p&gt;</description>
	<pubDate>Wed, 29 Feb 2012 18:34:04 +0000</pubDate>
	<dc:creator>edransch</dc:creator>
</item>
<item>
	<title>Nick Fitzgerald: Source Code Cartography</title>
	<guid isPermaLink="true">http://fitzgeraldnick.com/weblog/44/</guid>
	<link>http://fitzgeraldnick.com/weblog/44/</link>
	<description>&lt;p&gt;I spent the summer at Mozilla working on &lt;a href=&quot;https://wiki.mozilla.org/DevTools/Features/SourceMap&quot;&gt;source maps&lt;/a&gt;. Source maps
allow one to map the line and column information between an original source and
a generated source for debugging purposes. Watch the webcast to learn more!&lt;/p&gt;


    


&lt;h4&gt;
  &lt;a href=&quot;http://fitzgeraldnick.com/weblog/44/#disqus_thread&quot;&gt;View Comments&lt;/a&gt;
&lt;/h4&gt;</description>
	<pubDate>Fri, 23 Dec 2011 07:00:00 +0000</pubDate>
	<author>fitzgen@gmail.com (Nick Fitzgerald)</author>
</item>
<item>
	<title>Nick Fitzgerald: Pycco Needs A Loving Home</title>
	<guid isPermaLink="true">http://fitzgeraldnick.com/weblog/43/</guid>
	<link>http://fitzgeraldnick.com/weblog/43/</link>
	<description>&lt;p&gt;When I wrote &lt;a href=&quot;http://fitzgen.github.com/pycco/&quot;&gt;Pycco&lt;/a&gt;, it was meant to be a single-serving coding session. It was
fun and simple. But then the project started receiving more attention than I
ever expected it to. In fact, one year later, I am still getting a pull request
every month or so. But the problem is that I no longer have the time to spend
nor interest in maintaining the project. I feel bad because a few people are out
there dedicating their own precious time while writing code to make Pycco
better, and I'm not holding up my end of the bargain by reviewing that code and
merging it back to the project.&lt;/p&gt;
&lt;p&gt;If anyone would like to adopt this project and give it a loving home, please
leave a comment here and we can work it out. I'd hate to see the project rot
away while there are definitely still a few people interested in it.&lt;/p&gt;

    


&lt;h4&gt;
  &lt;a href=&quot;http://fitzgeraldnick.com/weblog/43/#disqus_thread&quot;&gt;View Comments&lt;/a&gt;
&lt;/h4&gt;</description>
	<pubDate>Wed, 17 Aug 2011 07:00:00 +0000</pubDate>
	<author>fitzgen@gmail.com (Nick Fitzgerald)</author>
</item>
<item>
	<title>Jez Ng: Using git with mozilla-central</title>
	<guid isPermaLink="true">http://www.discontinuously.com//2011/07/using-git-with-mozilla-central</guid>
	<link>http://www.discontinuously.com//2011/07/using-git-with-mozilla-central</link>
	<description>&lt;p&gt;I like git more than hg, so it made me pretty happy to discover Chris Double’s &lt;a href=&quot;https://github.com/doublec/mozilla-central&quot;&gt;git mirror of mozilla-central.&lt;/a&gt; Here are a couple of scripts and tips that make the git experience more awesome:&lt;/p&gt;

&lt;h3&gt;git branch-diff&lt;/h3&gt;

&lt;p&gt;Paul O’Shannessy has scripted &lt;a href=&quot;https://github.com/zpao/dotfiles/tree/master/bin&quot;&gt;a couple of custom git commands&lt;/a&gt;. One I like very much is &lt;code&gt;git branch-diff &amp;lt;branch&amp;gt;&lt;/code&gt;, which does a diff between &lt;code&gt;&amp;lt;branch&amp;gt;&lt;/code&gt; and its last point of merge with master branch. Very convenient if you’re working with one bug per topic branch.&lt;/p&gt;

&lt;h3&gt;Exporting hg-format patches&lt;/h3&gt;

&lt;p&gt;Since I don’t have level 3 commit access yet, I often find myself asking others to check my code in. Since most of them use hg, I’ve written &lt;a href=&quot;https://github.com/int3/gitcommands&quot;&gt;two scripts&lt;/a&gt; to create the appropriate patch files. &lt;code&gt;git hg-patch &amp;lt;commit 1&amp;gt; &amp;lt;commit 2&amp;gt;&lt;/code&gt; creates a patch of the difference between the two commits, and &lt;code&gt;git hg-branch-patch
&amp;lt;branch&amp;gt;&lt;/code&gt; is a similar command that wraps &lt;code&gt;git branch-diff&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;Faster tab-completion in zsh&lt;/h3&gt;

&lt;p&gt;One thing that bothered me very much was the slow tab-completion in zsh. &lt;code&gt;git
checkout &amp;lt;tab&amp;gt;&lt;/code&gt; would take forever on m-c. Thankfully there’s an easy hack-fix &lt;a href=&quot;http://talkings.org/post/5236392664/zsh-and-slow-git-completion&quot;&gt;here.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’d love to hear about other useful git tricks that you guys use.&lt;/p&gt;</description>
	<pubDate>Fri, 22 Jul 2011 01:35:45 +0000</pubDate>
</item>
<item>
	<title>Jez Ng: Efficient MXR Navigation with mxr-vim</title>
	<guid isPermaLink="true">http://www.discontinuously.com//2011/07/efficient-mxr-navigation-with-mxr-vim</guid>
	<link>http://www.discontinuously.com//2011/07/efficient-mxr-navigation-with-mxr-vim</link>
	<description>&lt;p&gt;MXR is incredibly useful for doing code archaeology, but it is also kind of slow. I often find myself with this annoying workflow:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;1. Search MXR for identifier
2. Click on a result (nsISomething.cpp line 500)
3. Wait for a 6000-line file to load
4. Decide that you want to edit this file
5. Open this file in vim&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;mxr-vim is an addon that allows you to launch vim directly from MXR. My new workflow now is:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;1. Search MXR for identifier
2. Click on a result
3. Result opens in vim.&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Setup&lt;/h3&gt;

&lt;p&gt;mxr-vim can be &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/mxr-vim/&quot;&gt;downloaded here&lt;/a&gt;. Alternatively, you can &lt;a href=&quot;https://github.com/int3/mxr-vim&quot;&gt;clone the source from github&lt;/a&gt; and build it by activating the Addon SDK and typing &lt;code&gt;cfx xpi&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;mxr-vim needs to know three things:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;1. where the source tree on your disk is located (no default; mine is
   ~/src/mozilla-central)
2. where your shell is located (default /bin/sh)
3. where vim is located (default /usr/local/bin/mvim)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;These pieces of information can be set via about:config. They are located under &lt;code&gt;extensions.mxr-vim.*&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To complete the circle of mxr-vim integration, I use the following mappings in my .vimrc, which fire off a search of MXR for the word under the cursor:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;nnoremap &amp;lt;c-f&amp;gt;i :! open -a Aurora.app 'http://mxr.mozilla.org/mozilla-central/ident?i=&amp;lt;cword&amp;gt;'&amp;lt;cr&amp;gt;&amp;lt;cr&amp;gt;
nnoremap &amp;lt;c-f&amp;gt;f :! open -a Aurora.app 'http://mxr.mozilla.org/mozilla-central/search?string=&amp;lt;cword&amp;gt;'&amp;lt;cr&amp;gt;&amp;lt;cr&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
	<pubDate>Mon, 11 Jul 2011 22:05:44 +0000</pubDate>
</item>
<item>
	<title>Jez Ng: Tabs now land where you drop them</title>
	<guid isPermaLink="true">http://www.discontinuously.com//2011/07/tabs-now-land-where-you-drop-them</guid>
	<link>http://www.discontinuously.com//2011/07/tabs-now-land-where-you-drop-them</link>
	<description>&lt;p&gt;Previously, detaching a tab in Firefox would simply create a new window right top of the first, regardless of where you actually try to drop it. Now that &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=465186&quot;&gt;bug 465186&lt;/a&gt; has been fixed in Aurora, the new window is created right under your mouse. (If you try to detach a tab from a window with only one tab, we’re smart enough to move the whole window instead of creating a new one.)&lt;/p&gt;

&lt;p&gt;When Frank Yan finishes &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=455694&quot;&gt;bug 455694&lt;/a&gt;, we’ll have awesome animations to go along with the new tab behavior.&lt;/p&gt;

&lt;p&gt;Happy dragging!&lt;/p&gt;</description>
	<pubDate>Fri, 08 Jul 2011 23:20:23 +0000</pubDate>
</item>
<item>
	<title>Jez Ng: Animating about:memory</title>
	<guid isPermaLink="true">http://www.discontinuously.com//2011/07/animating-about-memory</guid>
	<link>http://www.discontinuously.com//2011/07/animating-about-memory</link>
	<description>&lt;p&gt;I did a little hack to about:memory to make it update regularly and color-code the changes. The rows in the treeview glow red when memory rises and turn green when it drops back down. Here’s a little screencast showing it in action (switch to fullscreen to see it more clearly). You can observe the GC at work a few seconds after tabs get backgrounded or closed.&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
Vimeo
&lt;p&gt;&lt;a href=&quot;http://vimeo.com/26037141&quot;&gt;about:memory animation&lt;/a&gt; from
&lt;a href=&quot;http://vimeo.com/user7683286&quot;&gt;Jezreel Ng&lt;/a&gt; on
&lt;a href=&quot;http://vimeo.com&quot;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;</description>
	<pubDate>Wed, 06 Jul 2011 13:50:47 +0000</pubDate>
</item>
<item>
	<title>Nikhil Marathe: Interning</title>
	<guid isPermaLink="false">tag:blogger.com,1999:blog-3665064696228706104.post-7996294557924730515</guid>
	<link>http://blog.nikhilmarathe.me/2011/05/interning.html</link>
	<description>&lt;div class=&quot;posterous_autopost&quot;&gt;DA-IICT 3rd year students usually do an internship in the summer. Good industrial internships are always hard to come by, although the situation is way better in IT than in other, more resource-intensive disciplines. 10 interviews, a hundred or so e-mails and lots of forms later this is part guide, part my internship search story. The first thing you’ve to decide is what kind of company you want to intern at. Most companies will have menial code jockey jobs which you don’t want. This is my first blog post typed out on the n900 for the most part while waiting for a flight home at Ahmedabad airport. What a keyboard!&lt;br /&gt;&lt;h3&gt;Why not a GSoC again?&lt;/h3&gt;Having over two years of FOSS contribution and 7 years of usage and having done a GSoC previously, I could have done one again. While a GSoC is an invaluable experience, it is not the same as an internship. GSoC is excellent at improving e-mail communication skills and long distance collaboration and giving a feel of the open source development style. But it is not the same as going to office, talking to people, having lunch together and hanging out. In addition internships usually will be in a city or country other than the one you live so it can be a great excuse to explore a new place. So if you’ve already done a GSoC, getting a different sort of experience is way more important in my opinion. So I didn’t apply at all this year. Besides I was confident that my experience would serve me just as well to get into the kind of companies I wanted.&lt;br /&gt;&lt;h3&gt;Have a good CV&lt;/h3&gt;Spell-check, design it well and put in only relevant things. If you are a good singer don’t put that in just to have stuff to show in a IT company. On the other hand positions of responsibility should always be highlighted. FOSS contributions top the charts in startups and other ‘cool’ or cutting-edge companies.&lt;br /&gt;&lt;h3&gt;Start early&lt;/h3&gt;By luck or resolve my best move was starting to look for internships in December for an intern to start in May. Keep in mind that HR departments are busy places, resumes can take time to process and sometimes do get lost. Wait for a week for a reply when you submit your CV, then ping them aggressively on IRC, Twitter and e-mail to ensure you aren’t forgotten. Interview procedures can take upto a month and for international interns there are visa procedures that take time. Finally you are likely to get rejected by the first few and you should have time to apply for more. In any case companies with established internship programs have information available on their websites and start each season with prior planning.&lt;br /&gt;&lt;h3&gt;Decide what you want to work on&lt;/h3&gt;The first two companies I applied to were Google India and RethinkDB. The RethinkDB folks were very positive about international interns. I had two interviews in early January which went ok. I was rejected, which in hindsight I know was due to me not really being passionate enough about what they were doing. So I narrowed down to the two specific interests I currently have.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Javascript engines and low level APIs&lt;/li&gt;&lt;li&gt;concurrency, distributed networking and web-scale computing.&lt;/li&gt;&lt;/ul&gt;and decided that I would only approach companies based on these work areas.&lt;br /&gt;&lt;h3&gt;Stick to a few companies.&lt;/h3&gt;Interviews are always stressful because you have to think on the spot. If you are trying internationally they will be at very bad times (most of mine were at 6am and 10pm). Companies hiring solely on phone interviews will usually take atleast three interviews. In addition you will have to prepare atleast a bit for them. This adds up to a lot of things to do. So stick to a few companies at a time. Prioritise which company you want to work for if hired by multiples companies. When you agree for interview times, make sure you convert timezones properly and that you don’t have any appointments more important than the interview at that time. Finally, remember you have a life too :) I gave one of my interviews at conf.kde.in, and another during Synapse. At such times be very careful with scheduling.&lt;br /&gt;&lt;h3&gt;Research&lt;/h3&gt;Off-campus internships (ie. ones you find on your own) are the way to go. The college will always aim for what is good for a majority of students, or towards established companies. But if your area of interest is niche you can do a much better job looking on your own.&lt;br /&gt;Try to find out as much as you can about what interns do in the company. With some searching you can usually find blog posts of former interns which can be very informative. Talk to people in the domain. If you are a FOSS contributor ask fellow IRC users about intern opportunities or experiences.&lt;br /&gt;Based on my areas I finally applied to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;RethinkDB&lt;/li&gt;&lt;li&gt;Google India&lt;/li&gt;&lt;li&gt;Directi&lt;/li&gt;&lt;li&gt;Opera&lt;/li&gt;&lt;li&gt;Mozilla&lt;/li&gt;&lt;/ul&gt;I was very lucky to meet a former Mozilla intern at the MIT Media Lab COEP workshop in late January. Without that I would never have thought of it as I was unaware of the Mozilla Foundation and Mozilla Corporation dichotomy.&lt;br /&gt;&lt;h3&gt;Be confident, but ready for rejection.&lt;/h3&gt;During the interview what matters most is being able to keep up a continuous stream of conversation going to show that you are capable of thinking. So if you tend to think mentally for 15 minutes and then produce the answer in a flash, it would be good to think out loudly. If you are confused, clarify the question, it does not penalise you. Remember that in interviews no one expects perfect code, and classes and documentation.  If you miss edge cases thats fine, performance – not an issue until the interviewer actually asks you for a better algorithm. Graph and string algorithms are a favourite of interviewers. For algorithms the &lt;a href=&quot;http://www.topcoder.com/tc?d1=tutorials&amp;amp;d2=alg_index&amp;amp;module=Static&quot;&gt;TopCoder tutorials&lt;/a&gt; are a good read. For C++, the &lt;a href=&quot;http://www.parashift.com/c++-faq-lite/&quot;&gt;C++ FAQ&lt;/a&gt; is &lt;i&gt;invaluable&lt;/i&gt;. In fact I suggest always having that page open during the interview. For C++, templates and virtual functions  tend to be a question spot. In addition, know the warts and good points of your favourite language. If you have FOSS projects, be ready to explain what they are, and how you implemented them. One favourite interviewer question is, “What was the hardest part to implement?”. In such a case be prepared to explain in as general terms as possible, since the APIs you use may not be something the interviewer has experience with.&lt;br /&gt;A typical telephone interview will last 30 minutes to an hour. Half of that time will be the technical interview and the other half when you can chat with the interviewer. A full recap of my interviews with each company are beyond the scope of this article, but suffice to say that I was lucky to have extremely nice interviewers. Google insists on algorithmic questions which you’ll usually answer via a shared Google Docs. Remember that in a phone interview it is important to know how to approach the problem. Since you have access to a computer, once you know what to do, you can look up your existing code or use the internet. Just keep discussing the approach on the phone and speak with utmost confidence. The interviewer may try to misguide you. For Mozilla and Opera the interview was purely on former experiences and some C++ stuff. Use the chat time later well. Good questions to ask are about prior interns, what they do, how they find the company etc. If you know their name before the interview, see if you can find out about them on the internet.&lt;br /&gt;&lt;h3&gt;Get to know and learn from the interviewers&lt;/h3&gt;My most memorable interview was the fourth one with Mozilla when due to some daylight savings confusion I was &lt;i&gt;woken up by the interview call&lt;/i&gt;. Desperate to get myself sane, I asked him a few questions before I let him start the technical round. After that I spent 45 minutes discussing spidermonkey and Mozilla’s general plans with Luke Wagner. It was a very humbling experience. If you can show the interviewer that you are passionate about the products and do you homework, there final review is much more likely to be glowingly positive. Finally they can tell you about some implementation features, constraints etc. that can be interesting to know about even if you never join that organization.&lt;br /&gt;&lt;h3&gt;Congrats, now get to work!&lt;/h3&gt;After all this, I hope you get selected somewhere. I can’t really write the part about how to handle it if you get rejected. So what happened to me?&lt;br /&gt;The response order was:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;RethinkDB reject – January 16, 2011&lt;/li&gt;&lt;li&gt;Directi reject – March ??, 2011&lt;/li&gt;&lt;li&gt;Mozilla accept – March 22, 2011&lt;/li&gt;&lt;li&gt;Google accept – March 25, 2011&lt;/li&gt;&lt;li&gt;Opera reject – March 28, 2011&lt;/li&gt;&lt;/ul&gt;based on my interview experiences, stipend and location I opted for Mozilla Corporation! When I got the confirmation on March 22, it was unbelievable but I guess all the hard work paid off. The Mozilla folks have been really nice and punctual throughout the process, and damn they know how to take care of their interns :) I think a series of posts will of course pour out of me regarding the internship in the coming months. I will be working at Mozilla HQ in Mountain View, California from next week to the end of July. My first assignment is typed array implementation improvements in JavaScript so Firefox can perform WebGL, audio/video  and binary data better. With Mozilla I found a great, FOSS friendly company, interesting work dealing directly with JavaScript engines, a new city to explore right in Silicon Valley and going to the United States of America for the first time ever. I couldn’t have asked for more :D&lt;br /&gt;&lt;hr /&gt;A note to DA-IICT students specifically! Our placement cell has an odd policy where when you apply for one or more internships through the placement cell, you are bound to accept the offer of whichever company accepts you first. So if a ‘better’ company delays their interviews, and a ‘lesser’ company hires you already, you are screwed.&lt;br /&gt;&lt;div style=&quot;font-size: 10px;&quot;&gt;&lt;a href=&quot;http://posterous.com/&quot;&gt;Posted via email&lt;/a&gt;  from &lt;a href=&quot;http://bombayrain.posterous.com/interning&quot;&gt;nikhil's posterous&lt;/a&gt; &lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3665064696228706104-7996294557924730515?l=blog.nikhilmarathe.me&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 22 Jun 2011 15:26:14 +0000</pubDate>
	<author>noreply@blogger.com (nikhil)</author>
</item>
<item>
	<title>Nick Fitzgerald: Operational Transformation Part 2: Operations</title>
	<guid isPermaLink="true">http://fitzgeraldnick.com/weblog/42/</guid>
	<link>http://fitzgeraldnick.com/weblog/42/</link>
	<description>&lt;p&gt;This is the second post in a series I am doing on the real-time collaboration
algorithm Operational Transformation (OT). The first post was an &lt;a href=&quot;http://fitzgeraldnick.com/weblog/41/&quot;&gt;introduction to
OT&lt;/a&gt; and this series. There are two repositiories on GitHub to follow along with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/fitzgen/operational-transformation&quot;&gt;operational-transformation&lt;/a&gt; - This is an Operational
Transformation library for plain text which assumes nothing about how the
storage backend for your documents works, what kind of frontend you will be
using, etc. This is where most of the ideas discussed in this series will be
implemented.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/fitzgen/operational-transformation-example&quot;&gt;operational-transformation-example&lt;/a&gt; - This repository contains
an example application which takes advantage of the OT library.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;However, before we can start transforming operations and providing a real-time
experience for our users, we have to decide how to represent and generate
operations. That is the topic for this post.&lt;/p&gt;

&lt;h3&gt;Representing Operations&lt;/h3&gt;

&lt;p&gt;We will be representing operations as a stream of simple edits. As Daniel
Spiewak notes in &lt;em&gt;Understanding and Applying Operational Transformation&lt;/em&gt;, this
is perfect for the type of automated processing we will be doing inside the
&lt;em&gt;xform&lt;/em&gt; function. Our operations will be made up of the following three
types of edits:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;retain(n)&lt;/em&gt; - Copy &lt;em&gt;n&lt;/em&gt; characters from the old version to the new one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;insert(subsequence)&lt;/em&gt; - Insert &lt;em&gt;subsequence&lt;/em&gt; in to the new document, without
 changing where we are indexed in the old document.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;delete(subsequence)&lt;/em&gt; - Advance the position we are indexed in the old
 document by the length of &lt;em&gt;subsequence&lt;/em&gt;, without copying &lt;em&gt;subsequence&lt;/em&gt; in
 to the new document. The reason we pass a subsequence instead of a number
 is soley so that we can assert we are deleting the proper subsequence and
 throw an error if we are not.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To create the document &quot;Hello, World!&quot; from the document &quot;hello world&quot;, you
would apply the following operation:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[ delete('h'),
  insert('H'),
  retain(4),
  insert(','),
  retain(1),
  delete('w'),
  insert('W'),
  retain(4),
  insert('!') ]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note that the edits start at the beginning of the old document and finish at
the end of it. If an operation doesn't affect the whole document, the last
edit in the operation should be &lt;em&gt;retain(length of remaining document)&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;Calculating Operations&lt;/h3&gt;

&lt;p&gt;First off: you don't want to add listeners to keyboard and mouse events! Imagine
all of the edge cases and browser incompatibilities: would you successfully
handle Ctrl-a or Shift-up-arrow followed by backspace? Yikes, I don't even want
to think about all of the common key combinations (not to mention the
differences between key combinations across OSs).&lt;/p&gt;

&lt;p&gt;No, instead you want to take two versions of the document and programmatically
generate a list of operations which transform one version to the
other. Fortunately, comparing sequences and determining their similarity or
difference is pretty much a solved problem in computer science.&lt;/p&gt;

&lt;h3&gt;Levenshtein Distance&lt;/h3&gt;

&lt;p&gt;Levenshtein distance (sometimes also referred to as edit distance) is defined as
the number of edits required to transform one sequence in to another
sequence. Classicly, these edits are either an insertion, deletion, or
substitution of a single item in the sequence. Comparing sequences of characters
(or, as we know them, plain text documents) is a classic use case for
Levenshtein distance. Variations of Levenshtein distance are also often used in
bioinformatics to compare sequences of DNA.&lt;/p&gt;

&lt;p&gt;The Levenshtein distance between &quot;WUTANG&quot; and &quot;MUTATION&quot; is five, because it
would take three substitutions and two insertions to transform &quot;WUTANG&quot; in to
&quot;MUTATION&quot;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&quot;WUTANG&quot; -&amp;gt; &quot;&lt;strong&gt;M&lt;/strong&gt;UTANG&quot; (substitution)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&quot;MUTANG&quot; -&amp;gt; &quot;MUTA&lt;strong&gt;T&lt;/strong&gt;G&quot; (substitution)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&quot;MUTATG&quot; -&amp;gt; &quot;MUTAT&lt;strong&gt;I&lt;/strong&gt;&quot; (substitution)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&quot;MUTATI&quot; -&amp;gt; &quot;MUTATI&lt;strong&gt;O&lt;/strong&gt;&quot; (insertion)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&quot;MUTATIO&quot; -&amp;gt; &quot;MUTATIO&lt;strong&gt;N&lt;/strong&gt;&quot; (insertion)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The algorithm for calculating Levenshtein distance runs in &lt;em&gt;O(m * n)&lt;/em&gt;. Here it is
presented in psuedo code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;LevenshteinDistance( s[1..m], t[1..n] ):
  d = matrix[0..m, 0..n]

  # The distance between the empty string and another
  # string is equal to the length of the other string.
  for i = 0 to m:
    d[i, 0] = i
  for j = 0 to n:
    d[0, j] = j

  for j = 1 to n:
    for i = 1 to m:
      if s[i] is equal to t[j]:
        d[i, j] = d[i-1, j-1]              # No edit
      else:
        d[i. j] = minimum( d[i-1, j] + 1,  # Deletion
                           d[i, j-1] + 1,  # Insertion
                           d[i-1, j-1] + 1 # Substitution
                         )

  return d[m, n]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However, the number of edits is immaterial in our application; we care about
what the edits are. Modifying the algorithm to return a list of edits
instead of the number of edits is trivial: just store lists of edits in the
&lt;em&gt;d&lt;/em&gt; matrix rather than numbers.&lt;/p&gt;

&lt;p&gt;Here is my
&lt;a href=&quot;https://github.com/fitzgen/operational-transformation/blob/master/operations.js&quot;&gt;JavaScript implementation of calculating an operation&lt;/a&gt; on
GitHub.&lt;/p&gt;

&lt;h3&gt;Possible Improvements in Calculating Operations&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Currently, every insert, delete, and retain only handles one character at a
time. We could save some bandwidth if &lt;code&gt;[retain(1), retain(1), retain(1)]&lt;/code&gt; was
simplified to &lt;code&gt;[retain(3)]&lt;/code&gt; and &lt;code&gt;[insert('c'), insert('a'), insert('t')]&lt;/code&gt; to
&lt;code&gt;[insert('cat')]&lt;/code&gt;, etc. I chose not to do this simply because it has been
easier this way, and I haven't ran in to any problems so far.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In practice, usually only a small part of the document has changed since the
last comparison. Humans don't randomly change documents in random places; we
add new sentences and delete old paragraphs. Knowing this, we can cut down on
the size of our problem domain by reducing the area of the strings we are
looking for edits in.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;PrefixPostfixOptimizedOperations(s[1..m], t[1..n]):
  prefix = []
  i = 1
  while s[i] == t[i] and i &amp;lt;= m and i &amp;lt;= n:
    push(prefix, retain(1))
    i = i + 1


  postfix = []
  j = 0
  while s[m-j] == t[n-j] and j &amp;lt; m and j &amp;lt; n:
    push(postfix, retain(1))
    j = j + 1


  return concatenate(prefix,
                     Operations(s[i..m-j], t[i..n-j]),
                     postfix)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I haven't implemented this optimization yet, but I probably will have to
eventually. In my preliminary testing, &lt;em&gt;O(m * n)&lt;/em&gt; is just too slow for large
values of &lt;em&gt;m&lt;/em&gt; and &lt;em&gt;n&lt;/em&gt;, and causes the browser's UI to be unresponsive while
the computation is performing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;My representation of the individual edits in the stream of edits which make
up an operation could be optimized. Currently, each edit is represented in an
array of two elements where the first is the type of edit and the second is
the associated data. For example, &lt;code&gt;insert('toto')&lt;/code&gt; is represented as
&lt;code&gt;['insert', 'toto']&lt;/code&gt; and &lt;code&gt;retain(4)&lt;/code&gt; is &lt;code&gt;['retain', 4]&lt;/code&gt;. This isn't the most
memory efficient, bandwidth efficient, or &quot;JavaScripty&quot; solution; it's just
the first I thought up and implemented. Eventually, I will probably update it
so that each edit is a string and the first character is the operation type,
while the rest of the string is the associated data. So, &lt;code&gt;insert('toto')&lt;/code&gt;
would become &lt;code&gt;'itoto'&lt;/code&gt; and &lt;code&gt;retain(4)&lt;/code&gt; would become &lt;code&gt;'r4'&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I have now &lt;a href=&quot;https://github.com/fitzgen/operational-transformation/commit/fafde5034c4a3260fe119629b9d3816ad971ee1e&quot;&gt;implemented the string representation&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Applying Operations To a Document&lt;/h3&gt;

&lt;p&gt;Applying operations to a document is straight forward. See the &lt;a href=&quot;https://github.com/fitzgen/operational-transformation/blob/master/apply.js&quot;&gt;&lt;code&gt;apply.js&lt;/code&gt;&lt;/a&gt;
file in the &lt;a href=&quot;https://github.com/fitzgen/operational-transformation&quot;&gt;operational-transformation&lt;/a&gt; GitHub repo.&lt;/p&gt;

&lt;h3&gt;Next Up&lt;/h3&gt;

&lt;p&gt;In the next part of this series, I will describe the &lt;em&gt;xform&lt;/em&gt; function, and how
it transforms a pair of operations so that two documents can be kept in sync.&lt;/p&gt;

&lt;h3&gt;References&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Levenshtein_distance&quot;&gt;Levenshtein Distance&lt;/a&gt; on Wikipedia.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.codecommit.com/blog/java/understanding-and-applying-operational-transformation&quot;&gt;Understanding and Applying Operational Transformation&lt;/a&gt; by
Daniel Spiewak.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/0262033844/&quot;&gt;Introduction To Algorithms&lt;/a&gt; section 15.4 on the Longest Common
Subsequence algorithm by Thomas H. Cormen, Charles E. Leiserson, Ronald
L. Rivest, and Clifford Stein. (Levenshtein distance and Longest Common
Subsequence are very similar to the point of being two faces of the same
problem).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; If you don't have the book (or just want more), MIT has provided
the &lt;a href=&quot;http://videolectures.net/mit6046jf05_leiserson_lec15/&quot;&gt;video recorded lecture and notes&lt;/a&gt; by Charles E. Leiserson.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


    


&lt;h4&gt;
  &lt;a href=&quot;http://fitzgeraldnick.com/weblog/42/#disqus_thread&quot;&gt;View Comments&lt;/a&gt;
&lt;/h4&gt;</description>
	<pubDate>Tue, 05 Apr 2011 07:00:00 +0000</pubDate>
	<author>fitzgen@gmail.com (Nick Fitzgerald)</author>
</item>
<item>
	<title>Nick Fitzgerald: Operational Transformation: An Introduction</title>
	<guid isPermaLink="true">http://fitzgeraldnick.com/weblog/41/</guid>
	<link>http://fitzgeraldnick.com/weblog/41/</link>
	<description>&lt;p&gt;I have been researching the optimistic concurrency algorithm for real time
collaboration known as Operational Transformation (OT). OT is the algorithm used
by many real time collaborative editors that you see today, such as
&lt;a href=&quot;https://wave.google.com/&quot;&gt;Google Wave&lt;/a&gt;, &lt;a href=&quot;https://docs.google.com/&quot;&gt;Google Docs&lt;/a&gt;, &lt;a href=&quot;http://etherpad.com/&quot;&gt;Etherpad&lt;/a&gt;, &lt;a href=&quot;https://gomockingbird.com/&quot;&gt;Mockingbird&lt;/a&gt;, and Novell's
&lt;a href=&quot;http://www.novell.com/products/vibe-cloud/&quot;&gt;Vibe Cloud&lt;/a&gt; (formerly known as Pulse). This is the first in a series of posts
I will be writing on OT.&lt;/p&gt;

&lt;p&gt;As I am writing this series, I am I also implementing the ideas being discussed
in JavaScript. I have made two public repositories on github:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/fitzgen/operational-transformation&quot;&gt;operational-transformation&lt;/a&gt; - This is an Operational
Transformation library for plain text which assumes nothing about how the
storage backend for your documents works, what kind of frontend you will be
using, etc. This is where most of the ideas discussed in this series will be
implemented.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/fitzgen/operational-transformation-example&quot;&gt;operational-transformation-example&lt;/a&gt; - This repository contains
an example application which takes advantage of the OT library.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;Why Operational Transformation?&lt;/h3&gt;

&lt;p&gt;Operational Transformation is a good fit for web applications because it is
optimistic. Consider the scenario where multiple clients are concurrently
editing the same document hosted on a central server. The goal is to provide a
real time editing experience so that the clients can collaborate as they change
the document, and each client's changes are preserved.&lt;/p&gt;

&lt;p&gt;OT optimisticly assumes that whatever operations are currently being applied to
the document on any given client will not conflict with any operations that
might be applied at this same moment by one of the other clients. Conflicts
can't be discovered, let alone dealt with, until some point in the future. This
frees operations to be applied to the document as they are generated by the
client and the user interface is updated in a responsive manner. There is no
need to request a lock on the document from the server.&lt;/p&gt;

&lt;p&gt;Locking, and other pessimistic concurrency algorithms, are unrealistic within
the constrains of the web application environment because of the high latency
associated with communicating round trip with the server and other clients. The
majority of clients would be powerless to change the document for many seconds
at a time while another client has acquired the lock. This is a recipe for bad
user experience.&lt;/p&gt;

&lt;p&gt;Furthermore, it is natural to stop thinking of changes at the document level,
and instead focus on individual operations being applied. Operations are much
more malleable than whole documents. If two clients change their documents such
that they become out of sync, how do you bring them back to the same state while
preserving both changes in a meaningful way? In comparison, it is easy to adjust
the index of a single insertion operation on client A because of a deletion from
client B, and then share this adjusted operation with client B so that both
clients' documents are in the same state.&lt;/p&gt;

&lt;p&gt;Finally, Operational Transformation allows us to only consider two operations at
any given time. Rather than fret about how client A's changes will affect client
B's document after client B just applied client C's recent changes, we only
compare one client's document and the central master document at any given
time. Not only is this much more simple, with many less edge cases, but it also
directly maps on to the client/server architecture of the web.&lt;/p&gt;

&lt;h3&gt;A Bird's Eye View of Operational Transformation&lt;/h3&gt;

&lt;p&gt;At the heart of the aptly-named Operational Transformation is the transformation
of operations such that they can be applied to documents whose states have
diverged, bringing them both back to the same state. In other words,&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;xform(a, b) = {a', b'}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;such that if applying the operation &lt;em&gt;a&lt;/em&gt; followed by the operation &lt;em&gt;b'&lt;/em&gt; to
document &lt;em&gt;Y&lt;/em&gt; yields document &lt;em&gt;Z&lt;/em&gt;, applying the operation &lt;em&gt;b&lt;/em&gt; followed by the
operation &lt;em&gt;a'&lt;/em&gt; to document &lt;em&gt;Y&lt;/em&gt; must also yield document &lt;em&gt;Z&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://media.fitzgeraldnick.com/ot1.png&quot; style=&quot;margin: 0 auto;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The one caveat to this rule is summarized in the paper &lt;em&gt;High Latency,
Low-Bandwidth Windowing in the Jupiter Collaboration System&lt;/em&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Of course, there are many possible functions that have this property. For
example, the function xform(c, s) = {delete everything, delete everything}
would satisfy our ordering property, but would probably not satisfy many
users! In general, the transforms should try to find some &quot;reasonable&quot; way to
combine the two operations into a final effect.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;However, &lt;em&gt;xform&lt;/em&gt; only handles the case where each side has diverged by one
operation. In practice, it is hardly ever the case that we only consider
divergences of one. To rectify the situation, &lt;em&gt;xform&lt;/em&gt; will be called repeatedly,
as you traverse across document state space until both the client and server's
documents reach the same state. I will expand on these transformations in a
later post in this series. In the meantime, see &lt;em&gt;Understanding and Applying
Operational Transformation&lt;/em&gt; for more.&lt;/p&gt;

&lt;h3&gt;Resources&lt;/h3&gt;

&lt;p&gt;Read the following papers and articles to learn more about Operational
Transformation and to prepare for the rest of this series.&lt;/p&gt;

&lt;h4&gt;&lt;a href=&quot;http://lively-kernel.org/repository/webwerkstatt/projects/Collaboration/paper/Jupiter.pdf&quot;&gt;High Latency, Low-Bandwidth Windowing in the Jupiter Collaboration System&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Authored by David A. Nichols, Pavel Curtis, Michael Dixon, and John Lamping.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is the paper that I have seen referenced most often by other papers and
articles discussing Operational Transformation. It is very well written and
approachable, and was the first paper published describing OT as we know it
today.&lt;/p&gt;

&lt;h4&gt;&lt;a href=&quot;http://www.codecommit.com/blog/java/understanding-and-applying-operational-transformation&quot;&gt;Understanding and Applying Operational Transformation&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Authored by Daniel Spiewak.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is a great article written by one of the developers working on Novell Vibe
Cloud (previously named Pulse). Vibe Cloud implements the Wave Protocol, and the
article reflects this by focusing on Wave's implementation of OT and Google's
contribution to OT theory with the idea of composing operations. Nevertheless,
this piece is incredibly informative and provides a very detailed walkthrough
of the one of the more difficult transformations you will have to do.&lt;/p&gt;

&lt;h4&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Operational_transformation&quot;&gt;Wikipedia on Operational Transformation&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;Wikipedia's article on OT is very good, but not as approachable as either of the
two resources above. I suggest reading them first and then only reading the
Wikipedia entry once you feel you feel comfortable with the others.&lt;/p&gt;

&lt;h4&gt;&lt;a href=&quot;http://fitzgen.github.com/erl-ot/&quot;&gt;Very Simple Operational Transformation in Erlang&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;This was a &lt;em&gt;very simple&lt;/em&gt; implementation of OT that I wrote in Erlang. It is
written in somewhat of a Literate Programming style, so it should be fairly easy
to follow along with. I will be going in to much more depth in this series, and
with the JavaScript implementation, than I previously did in this project.&lt;/p&gt;

&lt;p&gt;The goals of the Erlang project was to prove to myself that I understood OT,
could implement a simple version of it, and pass all of my tests. The goals of
this series of blog posts, and accompanying JavaScript OT implementation, is a
production-worthy real time collaboration app.&lt;/p&gt;

&lt;h3&gt;Up Next&lt;/h3&gt;

&lt;p&gt;The next installment in this series will focus on how to generate the operations
that Operational Transformation works with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update: &lt;a href=&quot;http://fitzgeraldnick.com/weblog/42/&quot;&gt;Part 2&lt;/a&gt; is posted.&lt;/strong&gt;&lt;/p&gt;


    


&lt;h4&gt;
  &lt;a href=&quot;http://fitzgeraldnick.com/weblog/41/#disqus_thread&quot;&gt;View Comments&lt;/a&gt;
&lt;/h4&gt;</description>
	<pubDate>Sat, 26 Mar 2011 07:00:00 +0000</pubDate>
	<author>fitzgen@gmail.com (Nick Fitzgerald)</author>
</item>
<item>
	<title>Nick Fitzgerald: Javascript Timer Congestion</title>
	<guid isPermaLink="true">http://fitzgeraldnick.com/weblog/40/</guid>
	<link>http://fitzgeraldnick.com/weblog/40/</link>
	<description>&lt;h3&gt;Quick Summary of how JavaScript Timers Work&lt;/h3&gt;

&lt;p&gt;There are two functions that browsers expose to the JavaScript environment for
asynchronously executing functions after a a specified amount of time in
milliseconds: &lt;code&gt;window.setTimeout&lt;/code&gt; and &lt;code&gt;window.setInterval&lt;/code&gt;. Timeouts occur once,
intervals repeat. However, JavaScript is single-threaded (with the exception of
Web Workers) and so if a timer is set, but then the process blocks, the callback
can be delayed or even fail to ever be fired. For example, the &quot;hello&quot; message
will never be logged below.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;window.setTimeout(function () {
    console.log(&quot;hello&quot;);
}, 1000);
while (true) ;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The thread within which the JavaScript interpreter runs is also shared by the
browser's UI and rendering systems. This means that not only will the above
message never be logged, but that the browser will be unresponsive and appear to
be frozen to the user.&lt;/p&gt;

&lt;p&gt;For more in depth discussions about the details of how JavaScript timers work,
see the references.&lt;/p&gt;

&lt;h3&gt;Timer Congestion&lt;/h3&gt;

&lt;p&gt;It also follows from the single threaded nature of JavaScript that only one
timeout can fire its callback at any given moment in time. If another piece of
JavaScript is already executing when a timer is scheduled to run, the timer's
callback is queued to run when the interpreter is done with the code it is
currently executing.&lt;/p&gt;

&lt;p&gt;It is possible to set so many timers expiring at about the same time that they
just keep queuing up one after another; never giving the browser's UI a moment
to update. I am going to refer to this as &quot;timer congestion&quot;. I first read about
this phenomena in Nicholas C. Zakas' book &lt;a href=&quot;http://www.amazon.com/gp/product/059680279X&quot;&gt;High Performance JavaScript&lt;/a&gt;
(HPJS from now on). It was mentioned only in passing, however I found the idea
fascinating. HPJS refers to research conducted by Neil Thomas while he was
working on the mobile version of GMail.&lt;/p&gt;

&lt;p&gt;Neil shared his research and the process that led him to do that research in his
article &lt;a href=&quot;http://googlecode.blogspot.com/2009/07/gmail-for-mobile-html5-series-using.html&quot;&gt;Using Timers Effectively&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;When I first started working on the new version of Gmail for mobile, the
application used only a couple of timers. As we continued adding more and more
features, the number of timers grew. We were curious about the performance
implications: would 10 concurrent timers make the app feel slow? How about
100? How would the performance of many low-frequency timers compare to a
single high-frequency timer?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;He summarized his results as follows.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;With low-frequency timers - timers with a delay of one second or more - we
could create many timers without significantly degrading performance on either
[an Android G1 or iPhone 3G]. Even with 100 timers scheduled, our app was not
noticeably less responsive. With high-frequency timers, however, the story was
exactly the opposite. A few timers firing every 100-200 ms was sufficient to
make our UI feel sluggish.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thomas goes on to explain why they decided to hardcode their callback functions
inline, rather than create a registration-based system:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Keep in mind that this code is going to execute many times every
second. Looping over an array of registered callbacks might be slightly
&quot;cleaner&quot; code, but it's critical that this function execute as quickly as
possible. Hardcoding the function calls also makes it really easy to keep
track of all the work that is being done within the timer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;However, by sacrificing the accuracy of when timers fire, it is possible to
attain the clean architecture Thomas refers to and also guarantee that many
timers will not cause the page to feel sluggish.&lt;/p&gt;

&lt;p&gt;First, restrict yourself to a single recursive timeout loop which you can
register tasks with. Use &lt;code&gt;window.setTimeout&lt;/code&gt; instead of &lt;code&gt;window.setInterval&lt;/code&gt; to
ensure that the browser has enough time to update between every single
iteration. This is necessary because &lt;code&gt;window.setInterval(callback, ms)&lt;/code&gt; tries to
fire its callback every n milliseconds rather than providing n milliseconds
between each time it fires. Thus, if your callback takes longer than n
milliseconds to execute, it will be repeatedly executed back to back, never
allowing the browser a few milliseconds to update the UI.&lt;/p&gt;

&lt;p&gt;Second, while looping through the tasks registered with the timeout loop, keep
track of how long the loop has been running. Before the loop has been running
long enough to negatively affect the user's experience, yield to the browser
with &lt;code&gt;window.setTimeout&lt;/code&gt; and then pick up the loop where you left off after the
browser has had a chance to update the UI.&lt;/p&gt;

&lt;p&gt;By doing these two things, when you have a large number of tasks firing their
callbacks concurrently they will not make the browser feel sluggish like many
timers expiring at the same time would. Instead, the tasks will only be pushed
back and executed at a later time than they had been scheduled for to ensure
that the browser can respond to user interaction. In extreme cases of
congestion, it would be possible for a task pushed back for so long that it will
effectively never be called. Even in this worst case scenario, it is better than
the alternative: an unresponsive browser.&lt;/p&gt;

&lt;h3&gt;Introducing Chronos&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/fitzgen/chronos&quot;&gt;Chronos&lt;/a&gt; is an implementation of the techniques described above which also
mirrors the &lt;a href=&quot;http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#timers&quot;&gt;HTML 5 WindowTimers interface&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;interface WindowTimers {
  long setTimeout(in any handler, in optional any timeout, in any... args);
  void clearTimeout(in long handle);
  long setInterval(in any handler, in optional any timeout, in any... args);
  void clearInterval(in long handle);
};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This means that to switch existing code from using &lt;code&gt;window.setTimout&lt;/code&gt; and
friends, all you need to do is include Chronos on the page and replace
&lt;code&gt;window.setTimeout&lt;/code&gt; with &lt;code&gt;chronos.setTimeout&lt;/code&gt;, etc to take advantage of what
Chronos has to offer.&lt;/p&gt;

&lt;h3&gt;Putting Chronos to the Test&lt;/h3&gt;

&lt;p&gt;I have put together a &lt;a href=&quot;http://media.fitzgeraldnick.com/code-samples/chronos-test.html&quot;&gt;test page for Chronos&lt;/a&gt; where you can define
how many concurrent timers to execute on the page, how long each one should
block for, and whether to use Chronos, or the native timer functions. I have
tested the page on my MacBook Pro (Firefox 3.6 and 4 beta, Safari 5, and Chrome
9), as well as on my Motorolla Droid 2 running Android 2.2. In all cases, the
browser's UI updated more smoothly when using Chronos than without whenever
there was enough of a workload for any type of sluggishness to occur.&lt;/p&gt;

&lt;h3&gt;References&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://googlecode.blogspot.com/2009/07/gmail-for-mobile-html5-series-using.html&quot;&gt;Using Timers Effectively&lt;/a&gt; by Neil Thomas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/059680279X&quot;&gt;High Performance JavaScript&lt;/a&gt; by Nicholas C. Zakas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#timers&quot;&gt;WHATWG HTML 5 Specification for Timers&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://ejohn.org/blog/how-javascript-timers-work/&quot;&gt;How JavaScript Timers Work&lt;/a&gt; by John Resig&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://javascriptweblog.wordpress.com/2010/06/28/understanding-javascript-timers/&quot;&gt;Understanding JavaScript Timers&lt;/a&gt; by Angus Croll&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://fitzgeraldnick.com/weblog/35/&quot;&gt;setTimeout Patterns in JavaScript&lt;/a&gt; by Yours Truly&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


    


&lt;h4&gt;
  &lt;a href=&quot;http://fitzgeraldnick.com/weblog/40/#disqus_thread&quot;&gt;View Comments&lt;/a&gt;
&lt;/h4&gt;</description>
	<pubDate>Tue, 08 Mar 2011 07:00:00 +0000</pubDate>
	<author>fitzgen@gmail.com (Nick Fitzgerald)</author>
</item>
<item>
	<title>Jaclyn Fu: Hello world!</title>
	<guid isPermaLink="false">http://mozmobileintern.wordpress.com/?p=1</guid>
	<link>http://mozmobileintern.wordpress.com/2011/02/26/hello-world/</link>
	<description>&lt;p&gt;Welcome to &lt;a href=&quot;http://wordpress.com/&quot;&gt;WordPress.com&lt;/a&gt;. This is your first post. Edit or delete it and start blogging!&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozmobileintern.wordpress.com/1/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozmobileintern.wordpress.com/1/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozmobileintern.wordpress.com/1/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozmobileintern.wordpress.com/1/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozmobileintern.wordpress.com/1/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozmobileintern.wordpress.com/1/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozmobileintern.wordpress.com/1/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozmobileintern.wordpress.com/1/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozmobileintern.wordpress.com/1/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozmobileintern.wordpress.com/1/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozmobileintern.wordpress.com/1/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozmobileintern.wordpress.com/1/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozmobileintern.wordpress.com/1/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozmobileintern.wordpress.com/1/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozmobileintern.wordpress.com&amp;amp;blog=20553188&amp;amp;post=1&amp;amp;subd=mozmobileintern&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 26 Feb 2011 21:49:34 +0000</pubDate>
	<dc:creator>Jaclyn Fu</dc:creator>
</item>
<item>
	<title>Michael Sullivan: Doing whole tree analysis with Dehydra</title>
	<guid isPermaLink="false">http://www.msully.net/blog/?p=5</guid>
	<link>http://www.msully.net/blog/2009/08/03/doing-whole-tree-analysis-with-dehydra/</link>
	<description>&lt;h4&gt;Introduction&lt;/h4&gt;
&lt;p&gt;In this post I discuss how I used &lt;a href=&quot;https://developer.mozilla.org/En/Dehydra&quot;&gt;Dehydra&lt;/a&gt; to do analysis of the entire Tracemonkey tree.&lt;/p&gt;
&lt;h4&gt;Note&lt;/h4&gt;
&lt;p&gt;I talk briefly about some Tracemonkey things to motivate what I used Dehydra for, but a knowledge of Tracemonkey is not required to appreciate the main point of this post.&lt;/p&gt;
&lt;h4&gt;The problem&lt;/h4&gt;
&lt;p&gt;One of the optimizations in my Tracemonkey inline threading work (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=506182&quot;&gt;Bug 506182&lt;/a&gt;), which I will be posting about later, is “PC update elimination”. Doing this requires figuring out which functions out of a certain set can access the JavaScript virtual program counter (which is stored as a variable named “pc” in a class named “JSFrameRegs”). There are about 230 functions in this set, so doing it manually is impractical.&lt;/p&gt;
&lt;h4&gt;The solution&lt;/h4&gt;
&lt;p&gt;I used Dehydra to help solve this problem mechanically. Dehydra is a static analysis tool built on top of gcc. It allows the semantic information of a program to be queried with JavaScript scripts.&lt;/p&gt;
&lt;h4&gt;First steps&lt;/h4&gt;
&lt;p&gt;By providing a process_function() function in a Dehydra script, I can inspect the variables used and the functions called by every function. Determining whether the pc is used is as simple as seeing if any variable has the name “JSFrameRegs::pc”.&lt;/p&gt;
&lt;pre&gt;function process_function(f, statements) {
  for each (let v in iterate_vars(statements)) {
    if (v.name == &quot;JSFrameRegs::pc&quot;) {
      print(f.name);
      break;
    }
  }
}
&lt;/pre&gt;
&lt;h4&gt;The catch&lt;/h4&gt;
&lt;p&gt;Unfortunately, this isn’t quite what we want. This will tell us which functions directly use the PC, but not which functions can &lt;em&gt;indirectly&lt;/em&gt; use it through function calls. Figuring out that requires looking at all the functions called by a given function. This is not straightforward with Dehydra, as functions frequently call functions declared in other files. Dehydra is a gcc plugin and is driven by the normal build system. Thus, it works on a file-by-file basis. Normal builds output an object file for each source file and rely on the linker to stitch it all together. Likewise, to do a whole tree analysis we need to output per-file information and then link it together later.&lt;/p&gt;
&lt;h4&gt;Collating the data&lt;/h4&gt;
&lt;p&gt;I reworked my process_function() to determine both whether the PC is directly accessed and the set of functions called directly. This data is then printed with the dump() function (discussed below):&lt;/p&gt;
&lt;pre&gt;function process_function(f, statements) {
  usespc = false;
  calls = {};

  for each (let v in iterate_vars(statements)) {
    if (v.name == &quot;JSFrameRegs::pc&quot;) {
      usespc = true;
    }
    if (v.isFunction) {
      calls[v.name] = true;
    }
  }
  dump(f.name, usespc, calls);
}
&lt;/pre&gt;
&lt;p&gt;The remaining question is how to structure our output. Outputting it as data declarations for some programming language seems like an easy way to do it. Since I am more comfortable with Python than JavaScript, I output the data as Python code:&lt;/p&gt;
&lt;pre&gt;function dump(name, usespc, calls) {
  s = '@@@';
  s += '\t&quot;' + name + '&quot;: ({';
  for (let f in calls) {
    s += '&quot;' + f + '&quot;, ';
  }
  s += '}, ' + (usespc ? &quot;True&quot; : &quot;False&quot;) + '),';
  print(s);
}
&lt;/pre&gt;
&lt;p&gt;We create a dictionary mapping function names to tuples of the set containing the name of each function called and whether the PC is accessed directly. When doing a build, the output will be intermixed with output from other parts of the build infrastructure, so we tag all of the output lines with ‘@@@’ so that a post-processing shell script can recognize and extract the relevant data.&lt;/p&gt;
&lt;p&gt;The relevant bit of the shell script (which is linked below), is:&lt;/p&gt;
&lt;pre&gt;(echo &quot;callgraph = {&quot;;
cd &quot;$DIR&quot; &amp;amp;&amp;amp; make -s CXX=&quot;$CXX&quot; 2&amp;gt;&amp;amp;1 | grep &quot;: @@@&quot; | cut -d@ -f4-;
echo &quot;}&quot;)
&lt;/pre&gt;
&lt;p&gt;This data gathering method could easily be modified to analyze different problems. For simplicity, I extracted only the relevant information and converted it directly to Python data structures. Another approach would be to dump all of the function information (probably in JSON), allowing a later analysis script access to everything.&lt;/p&gt;
&lt;h4&gt;The analysis&lt;/h4&gt;
&lt;p&gt;I wrote an analysis script in Python to process the data. The input is a large dictionary, mapping functions to the set of functions they call and whether they touch PC directly.&lt;/p&gt;
&lt;p&gt;I viewed the problem in terms of graph theory. The mapping from functions to the functions they call is simply a directed graph. Each function is a node and there is a edge from a function to each function that it calls. In this graph, some nodes (those that touch the PC) are initially marked. We want to color red every node that has a path to one of the initially marked nodes.&lt;/p&gt;
&lt;p&gt;Another way to state this is that a node is colored red if and only if it is either initially marked or has an edge to a red node. Doing the coloring is a simple problem. We simply compute the reverse graph (reversing all of the edges) and then perform a depth first search of the reverse graph starting from the marked nodes. Every node we see, we color red.&lt;/p&gt;
&lt;p&gt;When doing the DFS, we keep track of which node we first reached a newly colored node from, so that we can determine a path back to an initially marked node.&lt;/p&gt;
&lt;p&gt;My implementation also supports providing a predicate to exclude certain nodes from the search, in order to investigate how fixing certain functions to not require the PC would change things.&lt;/p&gt;
&lt;h4&gt;Caveats&lt;/h4&gt;
&lt;p&gt;While my method is useful, it is not perfect. It can produce both false positives and false negatives.&lt;/p&gt;
&lt;p&gt;False negatives result from polymorphism in the form of virtual functions and function pointers. When a call to such a function is made, there needs to be an edge from the caller to all of the functions that could be called. For virtual functions, this is all functions overriding the virtual function. For function pointers, I think this is every function of the proper type that is used in a way that it not a call at some point. It should be possible to address this problem, but at a &lt;em&gt;significantly&lt;/em&gt; increased complexity compared to what I have. Fortunately for me, Tracemonkey does not use virtual classes much and does not use function pointers in places where it matters for my analysis.&lt;/p&gt;
&lt;p&gt;False positives are a little trickier, and can’t be worked around in general. Consider the following:&lt;/p&gt;
&lt;pre&gt;void foo(bool bar) {
    if (bar)
        // access the PC
}
void baz() { foo(false); }
&lt;/pre&gt;
&lt;p&gt;Calling baz() will not result in the PC being accessed, but my analysis will report that it can access the PC (since foo() can). Knowing whether a function can &lt;em&gt;actually&lt;/em&gt; cause the PC to be accessed is isomorphic to the halting problem and thus undecidable.&lt;/p&gt;
&lt;h4&gt;The code&lt;/h4&gt;
&lt;p&gt;My code is available &lt;a href=&quot;http://www.msully.net/~sully/stuff/static_pc/&quot;&gt;here&lt;/a&gt;. make_callgraph.sh expects to find g++ and Dehydra under ~/gcc-dehydra/, as suggested in the Dehydra &lt;a href=&quot;https://developer.mozilla.org/En/Dehydra/Installing_Dehydra&quot;&gt;installation instructions.&lt;/a&gt; make_callgraph.sh must be run with its output redirected to callgraph.py. search.py contains both the general search algorithm and code that uses it to analyze functions introduced in my inline threading patch.&lt;/p&gt;</description>
	<pubDate>Wed, 16 Feb 2011 06:02:02 +0000</pubDate>
	<dc:creator>sully</dc:creator>
</item>
<item>
	<title>Michael Sullivan: Inline threading for TraceMonkey slides</title>
	<guid isPermaLink="false">http://www.msully.net/blog/?p=6</guid>
	<link>http://www.msully.net/blog/2009/08/16/inline-threading-slide/</link>
	<description>&lt;p&gt;Here are the slides from my end of summer brown-bag presentation: &lt;a href=&quot;http://www.msully.net/~sully/files/inline_slides.pdf&quot;&gt;http://www.msully.net/~sully/files/inline_slides.pdf&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Wed, 16 Feb 2011 05:58:01 +0000</pubDate>
	<dc:creator>sully</dc:creator>
</item>
<item>
	<title>Wei Zhou: 2011欢迎故事的纽约和有故事的纽约人</title>
	<guid isPermaLink="false">http://weizhou.wordpress.com/?p=375</guid>
	<link>http://weizhou.wordpress.com/2011/01/06/2011%e6%ac%a2%e8%bf%8e%e6%95%85%e4%ba%8b%e7%9a%84%e7%ba%bd%e7%ba%a6%e5%92%8c%e6%9c%89%e6%95%85%e4%ba%8b%e7%9a%84%e7%ba%bd%e7%ba%a6%e4%ba%ba/</link>
	<description>&lt;p&gt;2011年的到来，忽然想写一点文字。许久已经没有动笔，有些紧张也有些欣喜。&lt;/p&gt;
&lt;p&gt;自认不是一个多愁善感的人，文字或性格也从不曾盲目伤感。但是今天，我想用文字跳舞。是那种忧伤和惆怅的跳。&lt;/p&gt;
&lt;p&gt;来 美国5年零四个月，读书，生病，读书，工作。今年的圣诞节，我拿到了绿卡，看到告示的那一秒，埋住只有过来人才知道的辛酸，我笑着流泪。3年前的今天，当 我躺在病床前被医生宣判无期徒刑的时候，我被告知我要和梦想划上句号的时候，当我在耶鲁大学因病被迫休学的时候，那时的黑暗和无助里，似乎也曾经沉默着笑 着流泪－心境，却黑白可鉴。也许有种恨，文字都被衬托的苍白。一张绿卡，打开了一扇梦想的门。&lt;/p&gt;
&lt;p&gt;此时此刻，我想要自私的，一个人享受这种快乐。用一种坚韧的笑脸对待明天－也许这样才让我更喜欢我自己。用一种用文字慢舞的方式，发泄自己最深处的脆弱。&lt;/p&gt;
&lt;p&gt;纽 约Korean town是一个神奇的地方，有一种凌晨四点还人流不断的韩国样悲情寂寞，掺杂了些须纽约样的奢华和玩世不恭。从著名的韩国夜店Circle向上走8条街， 或是在脱衣舞店Ricks拐一个弯，就可以看到花花绿绿一幅“整容脸”的韩国女孩们，她们美的非常，美的让人思考那个困扰女人人生的问题－作为一个人和一 个女人，究竟是做一个成功的人，还是做一个成功的女人（女人之所以经常逻辑混乱，和她们被这个变态矛盾的问题纠缠有很大关系）。窗外的女人们，是不是也和我一样，坎坷一言难尽，成就屈指可数，在欢迎故事的纽约 里做有着许多故事的纽约人？&lt;/p&gt;
&lt;p&gt;我爱的朋友们坐在这个地方，庆祝2011年。说些不着边的浑话，或者是不着边的新年愿景。空气中充满了生命力。我不喝酒，也感觉人自醉胜过酒醉人。粗犷的论调，给人很多坚韧的希望。有一秒觉得，活着真他妈好。可以有梦想。&lt;/p&gt;
&lt;p&gt;2011年，我想做一个更好的设计师，想要大刀阔斧地运营公司，想要更快乐，想要自己的性格更完善，想要我的朋友们都幸福安康。凌晨四点的我想着2011年，仿佛一个孩子般，激动的无法入眠，这一年，一定是我人生中最不平凡的一年。&lt;/p&gt;
&lt;p&gt;周为，写于2011年&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/weizhou.wordpress.com/375/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/weizhou.wordpress.com/375/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/weizhou.wordpress.com/375/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/weizhou.wordpress.com/375/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/weizhou.wordpress.com/375/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/weizhou.wordpress.com/375/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/weizhou.wordpress.com/375/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/weizhou.wordpress.com/375/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/weizhou.wordpress.com/375/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/weizhou.wordpress.com/375/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/weizhou.wordpress.com/375/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/weizhou.wordpress.com/375/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/weizhou.wordpress.com/375/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/weizhou.wordpress.com/375/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=weizhou.wordpress.com&amp;amp;blog=2603969&amp;amp;post=375&amp;amp;subd=weizhou&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 06 Jan 2011 21:21:59 +0000</pubDate>
	<dc:creator>weizhou</dc:creator>
</item>
<item>
	<title>Nick Fitzgerald: Oop The Good Parts: Message Passing, Duck Typing, Object Composition, And Not Inheritance</title>
	<guid isPermaLink="true">http://fitzgeraldnick.com/weblog/39/</guid>
	<link>http://fitzgeraldnick.com/weblog/39/</link>
	<description>&lt;p&gt;A couple months ago, a Lisper who goes by Josh Marchán detailed the process he
had been using to write programs in an Object Oriented style.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;You first think of what kind of object you want to describe, and create a new
class that has data fields that sort of describe that &quot;object&quot;, then you write
methods for that class. The hope here is that you can just inherit from
whatever class, and everything will be okay.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I think this is a familiar process for many developers, including
myself. However, Sykosomatic continued by pointing out the weaknesses that this
style of programming presents, mainly that&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;There are many attributes, attribute initializations, and parameters for the
initialization method. This grows to be verbose.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Some of these attributes might be completely unnecessary. A subclass might
derive some of this information from other sources, or programmatically
generate it rather than store it statically in a field.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Subclassing this class is the sole way for other developers or library
end-users to reuse any code. Code that had the potential to be reused in
other places is unnecessarily tied to a class.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In a similar vein, Raganwald pokes fun at inheritance and describes how OOP used
backwards is POO.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The abstract ontology is derived from the behaviour of the individual
specimens, the ontology does not define the behaviour of the individual
specimens.&lt;/p&gt;

&lt;p&gt;OOP gets this backwards. In OOP you define the ontology up front in the form
of classes or prototypes. You then derive individual instances or objects from
the ontology. The OOP ontology isn't a way of sketching what we observe, it's
blueprint for building what we observe, nearly the exact opposite of the
naturalist's ontology.&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;Changes and re-arrangements break existing code, because all of the specimens,
the instances and objects, depend on the various classes, interfaces, and
other constructs that define their behaviour. Is this a problem? Yes again,
because computer programs change constantly. Discovery of new requirements,
and new information is the norm, not the exception. OOP programs built as
towering hierarchies of classes are like perfect crystals, to be admired by
architects everywhere but loathed by the programmers responsible for
maintaining them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;He goes on to champion an alternative way forward.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;What if objects exist as encapsulations, and the communicate via messages?
What if code re-use has nothing to do with inheritance, but uses composition,
delegation, even old-fashioned helper objects or any technique the programmer
deems fit? The ontology does not go away, but it is &lt;em&gt;decoupled from the
implementation&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sykosomatic has a similar revelation after he discovers that the code base for
his Chillax project becomes much cleaner when he codes in terms of generic
functions and protocols rather than classes.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The beauty here is that you can reuse code without dealing with inheritance,
or any sort of class-based hierarchy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;However, these ideas are nothing new. In fact, they are as old as the term
&quot;Object Oriented&quot;, which was coined by Alan Kay.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Just a gentle reminder that I took some pains at the last OOPSLA to try to
remind everyone that Smalltalk is not only NOT its syntax or the class
library, it is not even about classes. I'm sorry that I long ago coined the
term &quot;objects&quot; for this topic because it gets many people to focus on the
lesser idea.&lt;/p&gt;

&lt;p&gt;The big idea is &quot;messaging&quot;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Does an object respond to a set of messages? Does it have X, Y, and Z methods?
If so, we can use it; who cares if it inherits from a certain parent class or
not?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function bad (foo) {
  if ( ! (foo instanceof Bar) ) {
    throw new TypeError(&quot;This is an annoying restriction!&quot;);
  }
  return foo.baz(foo.quux(10));
}

function good (foo) {
  if ( !foo.baz || !foo.quux ) {
    throw new TypeError(&quot;We need foo to have baz and quux methods.&quot;);
  }
  return foo.baz(foo.quux(10));
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This paradigm is sometimes referred to as duck typing. Wikipedia describes duck
typing as &quot;a style of dynamic typing in which an object's current set of methods
and properties determines the valid semantics, rather than its inheritance from
a particular class.&quot;&lt;/p&gt;

&lt;p&gt;The classic example is if it walks like a duck, swims like a duck, and quacks
like a duck, it must be a duck. I prefer Cheech and Chong's explanation:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Looks like dog shit, smells like dog shit, feels like dog shit, tastes like
dog shit. Must be dog shit. Good thing we didn't step in it!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So what am I getting at? I present to you a very simple method to support duck
typing as a first class concept in JavaScript.&lt;/p&gt;

&lt;h3&gt;&lt;code&gt;quacksLike&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Just ask if a given object &lt;code&gt;quacksLike&lt;/code&gt; you want it to. You can describe the
messages you want an object to respond to with the key, and the type that you
expect in the slot by using a constructor as the value.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var arrayish = {
  length: Number
};

var iterable = {
  filter: Function,
  forEach: Function,
  map: Function
};

(function () {

  console.log(quacksLike(arguments, arrayish));
  // true, because the arguments object has the value
  // 3 in its length slot.

  console.log(quacksLike(arguments, iterable));
  // false, because the arguments object is not blessed
  // with the `map`, `filter`, and `forEach` methods.

}(1, &quot;a&quot;, {}));
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The definition of the function &lt;code&gt;quacksLike&lt;/code&gt; is given below.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var quacksLike = function (obj, definition) {
  var k, ctor;
  for ( k in definition ) {
    ctor = definition[k];
    if ( ctor === Number ) {
      if ( Object.prototype.toString.call(obj[k]) !== &quot;[object Number]&quot;
           || isNaN(obj[k]) ) {
        return false;
      }
    } else if ( ctor === String ) {
      if ( Object.prototype.toString.call(obj[k])
           !== &quot;[object String]&quot; ) {
        return false;
      }
    } else if ( ! (obj[k] instanceof ctor) ) {
      return false;
    }
  }
  return true;
};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Do we really need to formalize duck typing with &lt;code&gt;quacksLike&lt;/code&gt;? Strictly, no. You
could call the methods that you expect to exist and let the the errors be raised
if the object was missing that method, or you could check by hand that they
exist like I did in the above function &lt;code&gt;good&lt;/code&gt;. I think the latter is better than
the former because it makes your expectations and
dependencies explicit. &lt;code&gt;quacksLike&lt;/code&gt; is an easier-to-use formalization of this
pattern.&lt;/p&gt;

&lt;h3&gt;Composition&lt;/h3&gt;

&lt;p&gt;Composing objects to create new ones is a powerful technique that allows us to
easily re-use code for multiple objects. Surprisingly enough, even the Gang Of
Four reccomended using composition in favor of inheritance in Design Patterns.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var foo = { 0: &quot;a&quot;, 1: &quot;b&quot;, 2: &quot;c&quot;, length: 3 };
var fooPlusPlus = Object.combine(Array.prototype, foo);

console.log(quacksLike(foo, iterable));
// false
console.log(quacksLike(fooPlusPlus, iterable));
// true
fooPlusPlus.forEach(console.log.bind(console));
// a
// b
// c
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I have defined &lt;code&gt;Object.combine&lt;/code&gt; using ES5's &lt;code&gt;Object.getOwnPropertyNames&lt;/code&gt; for
convenience. Besides making the implementation clearer, it also allows us to
compose objects which include the non-enumerable methods of an object, such as
those on &lt;code&gt;Array.prototype&lt;/code&gt;. If we were to use a for-in loop instead of
&lt;code&gt;Object.getOwnPropertyNames&lt;/code&gt;, we wouldn't iterate over and copy &lt;code&gt;concat&lt;/code&gt;,
&lt;code&gt;forEach&lt;/code&gt;, etc. This is an ongoing trend in my code examples for this blog
post. I would rather communicate ideas than deal with browser quirks, or
incomplete ES5 implementations.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Object.combine = function () {
  var newObj = {},
      i      = 0,
      args   = Array.prototype.slice.call(arguments),
      len    = args.length;
  function copyProperty(k) {
    newObj[k] = args[i][k];
  }
  for ( ; i &amp;lt; len; i++ ) {
    Object.getOwnPropertyNames(args[i]).forEach(copyProperty);
  }
  return newObj;
};
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;An Example&lt;/h3&gt;

&lt;p&gt;Here is a less trivial example: a mini DOM manipulation library. To be trendy,
the global entry point will be &lt;code&gt;$&lt;/code&gt;. This library uses &lt;code&gt;quacksLike&lt;/code&gt; to determine
the DOM model and the correct way to attach event listeners, the module pattern
in multiple places to encapsulate private data, and &lt;code&gt;Object.combine&lt;/code&gt; to re-use
code that has already been written for us by others in &lt;code&gt;Array.prototype&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;window.$ = (function () {

  var undef, listen, customAPI;


  // Private function to turn `thing` in to an array,
  // optionally slicing the first `n` elems off.

  function toArray(thing, n) {
    return Array.prototype.slice.call(thing, n || 0);
  }


  // Private function to partially apply the first n arguments
  // to `fn`.

  function curry (fn) {
    var args = toArray(arguments, 1);
    return function () {
      return fn.apply(this, args.concat(toArray(arguments)));
    };
  }


  // Private function to set the attribute `attr` of a single
  // DOM node `node` to `val`.

  function nodeAttributeSetter (attr, val, node) {
    node.setAttribute(attr, val);
  }


  // Private function to get the value of the attribute `attr`
  // on the DOM node `node`.

  function nodeAttributeGetter (attr, node) {
    return node.getAttribute(attr);
  }


  // Do the work to determine the correct method for attaching
  // event listeners only once by using `quacksLike` and an
  // immediately invoked function.

  listen = (function () {

    var w3c = {
          addEventListener: Function
        },
        ie = {
          attachEvent: Function
        };

    if ( quacksLike(document.body, w3c) ) {
      return function (event, fn, node) {
        node.addEventListener(event, fn, false);
      };
    } else if ( quacksLike(document.body, ie) ) {
      return function (event, fn, node) {
        node.attachEvent(&quot;on&quot; + event, fn);
      };
    } else {
      throw new TypeError(&quot;Do not know how to attach event listeners.&quot;);
    }

  }());


  // This object is a mixin to be composed with the NodeList
  // results of querying the DOM by CSS selector. It provides
  // handy methods for getting and setting attributes,
  // attaching event listeners, and performing sub-queries by
  // CSS on these elements.

  customAPI = {

    attr: function (attr, val) {
      if ( val !== undef ) {
        this.forEach(curry(nodeAttributeSetter, attr, val));
        return this;
      } else {
        return this.length &amp;gt; 0
          ? nodeAttributeGetter(attr, this[0])
          : &quot;&quot;;
      }
    },

    on: function (event, fn) {
      this.forEach(curry(listen, event, fn));
      return this;
    },

    find: function (selector) {
      var res = [];
      this.forEach(function (node) {
        res.push.apply(res, toArray(node.querySelectorAll(selector)));
      });
      return Object.combine(res, customAPI);
    }

  };

  return function (selector, context) {
    context = context || document;
    return Object.combine(Array.prototype,
                          context.querySelectorAll(selector),
                          customAPI);
  };

}());
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The mini DOM library might be used like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// The following two forms are equivalent.
// They select the same elements.

$(&quot;div&quot;).find(&quot;p&quot;);
$(&quot;div p&quot;);


// Disable all links.

$(&quot;a&quot;).on(&quot;click&quot;, function (event) {
  event.preventDefault();
  alert(&quot;Don't leave me all alone!&quot;);
});


// Get the id of the first paragraph.

$(&quot;p&quot;).attr(&quot;id&quot;);


// Disable all input elementss.

$(input&quot;).attr(&quot;disabled&quot;, &quot;disabled&quot;);


// Do stuff with each matched element.

$(&quot;div.foo&quot;).forEach(function (el) {
  doStuffWith(el);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;To conclude, we should recognize that OOP does not need to be an all or nothing
proposition. You can take the parts that are beneficial to you (such as message
passing, encapsulation, and composition) and leave the parts which you may not
require (such as inheritance).&lt;/p&gt;

&lt;p&gt;Finally, take everything I say with a grain of salt (as you should with
everything you read on the internet).&lt;/p&gt;

&lt;h3&gt;References&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Josh Marchán's article &lt;a href=&quot;http://sykosomatic.org/blog/?p=92&quot;&gt;Chillax and Protocols&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Raganwald's article &lt;a href=&quot;https://github.com/raganwald/homoiconic/blob/master/2010/12/oop.md#readme&quot;&gt;OOP Practiced Backwards is POO&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wikipedia's entry on &lt;a href=&quot;http://en.wikipedia.org/wiki/Duck_typing&quot;&gt;Duck Typing&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alan Kay's &lt;a href=&quot;http://lists.squeakfoundation.org/pipermail/squeak-dev/1998-October/017019.html&quot;&gt;message to the Squeak mailing list&lt;/a&gt; about OOP,
inheritance, and message passing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Gang of Four, on &lt;a href=&quot;http://www.docstoc.com/docs/3202586/Design-Patterns-Composition-versus-inheritance&quot;&gt;composition versus inheritance&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Angus Croll's article &lt;a href=&quot;http://javascriptweblog.wordpress.com/2010/12/22/delegation-vs-inheritance-in-javascript/&quot;&gt;Delegation vs. Inheritance in JavaScript&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


    


&lt;h4&gt;
  &lt;a href=&quot;http://fitzgeraldnick.com/weblog/39/#disqus_thread&quot;&gt;View Comments&lt;/a&gt;
&lt;/h4&gt;</description>
	<pubDate>Fri, 31 Dec 2010 08:00:00 +0000</pubDate>
	<author>fitzgen@gmail.com (Nick Fitzgerald)</author>
</item>
<item>
	<title>Brian Krausz: How to Catch a Cheater</title>
	<guid isPermaLink="false">http://nerdlife.net/?p=336</guid>
	<link>http://feedproxy.google.com/~r/nerdlife/~3/sOiQnTK4oEA/</link>
	<description>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I wanted to explicitly mention that these homeworks were basically puzzles, which is why Googling was off-limits.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2:&lt;/strong&gt; Thanks gzak for remembering the actual name of the problem. It’s “Finkleberg’s 101 Game” and a copy of the actual homework is &lt;a href=&quot;http://russell.lums.edu.pk/~archive/DiscreteMath/cmu-greatideasintcs/Assignments/assignment03/assignment03.pdf&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There’s a story making its way around the web about a &lt;a href=&quot;http://tv.gawker.com/5693672/200-students-admit-cheating-after-professors-online-rant&quot;&gt;professor catching 1/3 of his class cheating&lt;/a&gt; and the fallout from it (everyone retakes the midterm, people who admit to cheating have to take an ethics course). It reminded me of something one of my professors at Carnegie Mellon did in one of my Freshman year CS classes. This is a from-memory recount of it, exact details are probably slightly off.&lt;/p&gt;
&lt;p&gt;For context:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The early homeworks in this class were basically puzzles, where if you’ve seen the style of problem before you more or less knew the answer. The goal was to expose us to these types of problems and teach us how to think them through properly.&lt;/li&gt;
&lt;li&gt;We were explicitly told that searching online for answers to homeworks was forbidden.&lt;/li&gt;
&lt;li&gt;One of our last homework’s problems began with something like “Commonly referred to as The Glorblar Problem, …” (I don’t remember the actual word he used, it seemed completely plausible)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We get to class one day and wait for the professor to start speaking. Today he just starts running through slides silently:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;“As many of you know, one of my hobbies is catching cheaters”&lt;/li&gt;
&lt;li&gt;A picture of the last homework with the phrase “The Glorblar Problem” circled&lt;/li&gt;
&lt;li&gt;A screenshot of Google with “The Glorblar Problem” in the search box&lt;/li&gt;
&lt;li&gt;A screenshot of the Google results, with the domain of the first result (which had the problem and correct solution) circled&lt;/li&gt;
&lt;li&gt;The whois result for that domain, with the professor’s name circled (you can hear a collective gulp as half the room realized what was coming next)&lt;/li&gt;
&lt;li&gt;The apache logs from the webserver, along with blurred-out reverse IP lookups for the entries&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Then he started speaking. He told us he had access to the login records from the school’s public machines as well. Anyone who Googled the result should confess and take a 0 for the homework, otherwise he would report them to the dean and they’d fail his mandatory class.&lt;/p&gt;
&lt;p&gt;A ton of students confessed. A lot of them were sent the link from a friend and many claimed not to have used it, but nobody could deny that they were caught cheating by the letter of the law.&lt;/p&gt;
&lt;p&gt;The moral of the story is don’t fuck with &lt;a href=&quot;http://en.wikipedia.org/wiki/Luis_von_Ahn&quot;&gt;Luis von Ahn&lt;/a&gt;, he will wreck you (no, I wasn’t one of the students who cheated, but that was one of the more impressive hacks I’d seen during college).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tl;dr – My professor made a honeypot for cheaters by planting a &lt;a href=&quot;http://en.wikipedia.org/wiki/Google_bomb&quot;&gt;Google bombed&lt;/a&gt; phrase in his homework.&lt;/strong&gt;&lt;/p&gt;
&lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/nerdlife/~4/sOiQnTK4oEA&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 22 Nov 2010 19:47:14 +0000</pubDate>
	<dc:creator>Brian</dc:creator>
</item>
<item>
	<title>Nick Fitzgerald: Pythonic Javascript Methods</title>
	<guid isPermaLink="true">http://fitzgeraldnick.com/weblog/38/</guid>
	<link>http://fitzgeraldnick.com/weblog/38/</link>
	<description>&lt;h3&gt;What do I mean by &quot;Pythonic&quot; methods?&lt;/h3&gt;

&lt;p&gt;For anyone who hasn't used Python before, every instance method in Python takes
the object it is bound to as its first argument, which is named &lt;em&gt;self&lt;/em&gt; by
convention.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Foo(object):
    def bar(self):
        print &quot;This is me:&quot;, self
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;When I refer to &quot;Pythonic&quot; methods, I simply mean methods on an object which
have their first argument bound to that object.&lt;/p&gt;

&lt;h3&gt;Why would we want to make any of our JavaScript methods &quot;Pythonic&quot;?&lt;/h3&gt;

&lt;p&gt;This is a very good question, and if I did not have an answer this whole blog
post would be questionable. Some people like the way methods work in Python,
others do not. I do not want to discuss whether it is good for Python; I want to
explain why it is good for JavaScript. Funny enough, the arguments behind
whether it is good for Python and whether it is good for JavaScript don't really
intersect. This is due to the nature of &lt;em&gt;this&lt;/em&gt; in JavaScript, and how it differs
from &lt;em&gt;self&lt;/em&gt; in Python.&lt;/p&gt;

&lt;p&gt;Unlike Python's &lt;em&gt;self&lt;/em&gt;, JavaScript's &lt;em&gt;this&lt;/em&gt; is not just a normal variable or
parameter. It has dynamic binding (as opposed to lexical) meaning it is a
reflection of the context of the surrounding function when it is invoked rather
than when it is defined. It is common that the value of &lt;em&gt;this&lt;/em&gt; will change in
the middle of your method definitions:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var myObject = {
    foo: function () {
        console.log(1, this);
        (function () {
            console.log(2, this);
        }());
        setTimeout(function () {
            console.log(3, this);
        }, 100);
    }
};

myObject.foo();
// Logs:
//   1 myObject
//   2 window
//   3 window
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you wanted the second and third calls to &lt;em&gt;console.log&lt;/em&gt; to have access to the
same &lt;em&gt;this&lt;/em&gt; that the first one does, the common solution is to create a normal
variable that references the desired context:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var myObject = {
    foo: function () {
        var that = this;
        console.log(1, that);
        (function () {
            console.log(2, that);
        }());
        setTimeout(function () {
            console.log(3, that);
        }, 100);
    }
};

myObject.foo();
// Logs:
//   1 myObject
//   2 myObject
//   3 myObject
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But I get tired of doing that all the time. Tired of remembering when I need to
define &lt;em&gt;that&lt;/em&gt; until after I have a bug. Tired of the ugly blemish it puts in my
code. I would rather write this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var myObject = bindSelf({
    foo: function (self) {
        console.log(1, self);
        (function () {
            console.log(2, self);
        }());
        setTimeout(function () {
            console.log(3, self);
        }, 100);
    }
});

myObject.foo();
// Logs:
//   1 myObject
//   2 myObject
//   3 myObject
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I find this syntactic helper especially nice when defining prototypes or
extending existing objects. These situations tend to rely on state that is
stored in &lt;em&gt;this&lt;/em&gt; more often than other examples, so I find the utility added by
binding &lt;em&gt;this&lt;/em&gt; to &lt;em&gt;self&lt;/em&gt; also tends to be greater.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var MyView = Backbone.View.extend(bindSelf({
    events: {
        &quot;click :input&quot;: &quot;clickHandler&quot;
    },
    initialize: function (self, opts) {
        ...
    },
    render: function (self) {
        ...
    },
    clickHandler: function (self, event) {
        ...
    }
}));
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;What is the implementation?&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;function bindSelf (obj) {

    // 1
    for (var k in obj) {
        if (obj.hasOwnProperty(k) &amp;amp;&amp;amp; typeof obj[k] === &quot;function&quot;) {

            // 2
            (function (oldMethod) {
                obj[k] = function () {

                    // 3
                    return oldMethod.apply(
                        this,
                        [this].concat(toArray(arguments))
                    );

                };
            }(obj[k]));

        }
    }

    // 4
    function toArray (thing) {
        return Array.prototype.slice.call(thing);
    }

    return obj;

}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;What is it doing? We are iterating through each of the methods on &lt;em&gt;obj&lt;/em&gt; and
rebinding the name of each method to a new function which calls the old method
with its &lt;em&gt;this&lt;/em&gt; concatenated with its arguments. That was a mouthful.&lt;/p&gt;

&lt;p&gt;Here is the step-by-step:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;First, we iterate over all of the keys in &lt;em&gt;obj&lt;/em&gt; which are not from the
prototype chain and whose values are functions. This is important. We
obviously don't want to try and redefine non-method attributes of &lt;em&gt;obj&lt;/em&gt; as
functions, which is why we check that &lt;em&gt;typeof obj[k] ===
&quot;function&quot;&lt;/em&gt;. However, we also do not want to break any of the object's
methods which are inherited from its prototype, which is why we check that
&lt;em&gt;obj.hasOwnProperty(k)&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Before rebinding &lt;em&gt;obj[k]&lt;/em&gt; to the new function, we need to make an immediately
invoked function expression so that we create a new variable &lt;em&gt;oldMethod&lt;/em&gt; on
every iteration of the loop. If we didn't do this, and incorrectly wrote the
code something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;...
// At the top level of `bindSelf`.
var oldMethod;
    ...
    // Inside the loop.
    oldMethod = obj[k];
    obj[k] = function () {
        return oldMethod.apply(
            this,
            [this].concat(toArray(arguments))
        );
    }
    ...
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;then we would capture the same &lt;em&gt;oldMethod&lt;/em&gt; variable in the closure of every
new function. Unlike languages such as C, JavaScript does not create a new
scope every time you open the curly braces. Every new method would call the
same &lt;em&gt;oldMethod&lt;/em&gt;; definitely not what we want.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Okay we are finally creating these new functions and rebinding them to where
the &lt;em&gt;oldMethod&lt;/em&gt; used to live. When we call &lt;em&gt;oldMethod&lt;/em&gt;, lets make sure that
&lt;em&gt;this&lt;/em&gt; inside &lt;em&gt;oldMethod&lt;/em&gt; is still bound to &lt;em&gt;this&lt;/em&gt;; and lets also add &lt;em&gt;this&lt;/em&gt;
to the front of the arguments we were called with before passing them to
&lt;em&gt;oldMethod&lt;/em&gt;. This is what we set out to do all along. Its really quite simple
from this point on, you just need to &lt;a href=&quot;https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/apply&quot;&gt;understand what
&lt;em&gt;Function.prototype.apply&lt;/em&gt; does&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The last piece is our good old friend &lt;em&gt;toArray&lt;/em&gt;. Any JavaScripter worth their
salt has probably written this exact function many times before, possibly
with a different name. All it does is take an array-like object and turn it
in to a real array. What is an array-like object? It is one which has a
&lt;em&gt;length&lt;/em&gt; property and possibly &lt;em&gt;0&lt;/em&gt;, &lt;em&gt;1&lt;/em&gt;, &lt;em&gt;2&lt;/em&gt;, etc. properties defined. The
cannonical example is the &lt;a href=&quot;https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#Using_the_arguments_object&quot;&gt;&lt;em&gt;arguments&lt;/em&gt; object&lt;/a&gt;, which is what we are
using it for. See the problem with &lt;em&gt;arguments&lt;/em&gt; is that it doesn't have any of
the &lt;em&gt;Array.prototype&lt;/em&gt;'s methods attached, and that when you concatenate it
with a list, you get unexpected results:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// Does *not* return [1,2,3,4,5,6] as you might expect!
(function () {
    return [1,2,3].concat(arguments);
}(4, 5, 6));


// Instead it returns something like this:
[1, 2, 3, { 0: 4, 1: 5, 2: 6, length: 3 }]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;By calling &lt;em&gt;toArray&lt;/em&gt; on &lt;em&gt;arguments&lt;/em&gt; before concatenation, we get the expected
result.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


    


&lt;h4&gt;
  &lt;a href=&quot;http://fitzgeraldnick.com/weblog/38/#disqus_thread&quot;&gt;View Comments&lt;/a&gt;
&lt;/h4&gt;</description>
	<pubDate>Tue, 16 Nov 2010 07:00:00 +0000</pubDate>
	<author>fitzgen@gmail.com (Nick Fitzgerald)</author>
</item>
<item>
	<title>Brian Krausz: Force a Canvas Refresh</title>
	<guid isPermaLink="false">http://nerdlife.net/?p=329</guid>
	<link>http://feedproxy.google.com/~r/nerdlife/~3/Uls5qL31614/</link>
	<description>&lt;p&gt;When playing around with some canvas stuff I found an interesting &lt;a href=&quot;http://code.google.com/p/chromium/issues/detail?id=55339&quot;&gt;bug in Chrome&lt;/a&gt;.  Basically when you have a &lt;code&gt;putImageData&lt;/code&gt; call inside of a &lt;code&gt;setInterval&lt;/code&gt; loop, canvas does not refresh properly.&lt;/p&gt;
&lt;p&gt;There’s a pretty simple hack to fix this: force the canvas to refresh every time you call &lt;code&gt;putImageData&lt;/code&gt;.  But how do you do this?  There is no redraw function, nor any obvious way to force a refresh.&lt;/p&gt;
&lt;p&gt;The trick is making a change to some property of the canvas element.  Doing this in a way that forces a refresh every frame but won’t actually change anything for the user is not as obvious as you’d think.&lt;/p&gt;
&lt;p&gt;Opacity isn’t actually visible with a sufficiently small delta, so it’s a good candidate.  We just switch back and forth between two different opacities.&lt;/p&gt;
&lt;pre&gt;this.ctx.putImageData(img, x, y);
this.rebuild_chrome_hack = !this.rebuild_chrome_hack;
$('#canvas').css('background-color', this.rebuild_chrome_hack ? 1 : 0.999);&lt;/pre&gt;
&lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/nerdlife/~4/Uls5qL31614&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 22 Oct 2010 03:45:13 +0000</pubDate>
	<dc:creator>Brian</dc:creator>
</item>
<item>
	<title>Brian Louie: Are you a web developer or designer?</title>
	<guid isPermaLink="false">http://mozblouie.wordpress.com/?p=118</guid>
	<link>http://mozblouie.wordpress.com/2010/09/14/are-you-a-web-developer-or-designer/</link>
	<description>&lt;p&gt;&lt;font size=&quot;1&quot;&gt;(This is the same post as the one found on the Mozilla Hacks blog. Thanks to Jay Patel for co-writing this with me.)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;If you are a web developer or designer, &lt;a href=&quot;http://bit.ly/wdatow2010&quot;&gt;we can use your input&lt;/a&gt;.  After gaining some great insights from our &lt;a href=&quot;http://hacks.mozilla.org/2010/06/results-from-our-developer-survey-2/&quot;&gt;previous survey on Firefox 3.6 and Firebug 1.5&lt;/a&gt;, we have decided to go broader and get a better industry-wide snapshot of web developers.&lt;/p&gt;
&lt;p&gt;We have created &lt;a href=&quot;http://bit.ly/wdatow2010&quot;&gt;a new survey&lt;/a&gt; in our continued effort to better understand the web developer landscape and how the Mozilla Developer Network can be a better resource within it. Over the past few weeks, we have interviewed web developers about how they work and collaborated with a research consultant to compile a list of questions that will hopefully give us a clearer picture of the people behind the open Web and how we can better serve them.&lt;/p&gt;
&lt;p&gt;This survey asks questions about the web development experience: the technologies and resources you use, the communities you join, and the companies that influence the realm of your work. We plan to use your responses to improve our developer engagement efforts and deliver relevant programs and content through the Mozilla Developer Network to make your web development experience better.&lt;/p&gt;
&lt;p&gt;Your input is be much appreciated. &lt;a href=&quot;http://bit.ly/wdatow2010&quot;&gt;Take the survey here&lt;/a&gt;, and please feel free to share the survey with other web developers and designers.  &lt;strong&gt;Please pass on this link: http://bit.ly/wdatow2010&lt;/strong&gt; to the appropriate lists, forums, blogs, etc.&lt;/p&gt;
&lt;p&gt;It is important that the results accurately represent the diverse set of people that make up the web developers of the world, so we hope that you will help us reach other developer communities, including those mentioned in our survey.  Together, we can take a step closer to a better open Web. Thanks!&lt;/p&gt;
&lt;p&gt;- the MDN team&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozblouie.wordpress.com/118/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozblouie.wordpress.com/118/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozblouie.wordpress.com/118/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozblouie.wordpress.com/118/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozblouie.wordpress.com/118/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozblouie.wordpress.com/118/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozblouie.wordpress.com/118/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozblouie.wordpress.com/118/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozblouie.wordpress.com/118/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozblouie.wordpress.com/118/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozblouie.wordpress.com/118/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozblouie.wordpress.com/118/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozblouie.wordpress.com/118/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozblouie.wordpress.com/118/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozblouie.wordpress.com&amp;amp;blog=14429761&amp;amp;post=118&amp;amp;subd=mozblouie&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 14 Sep 2010 22:20:56 +0000</pubDate>
	<dc:creator>Brian Louie</dc:creator>
</item>
<item>
	<title>Wei Zhou: Is the browser dying? Is user interface dying? Long live user experience.</title>
	<guid isPermaLink="false">http://weizhou.wordpress.com/?p=370</guid>
	<link>http://weizhou.wordpress.com/2010/09/08/is-the-browser-dying-is-user-interface-dying-long-live-user-experience/</link>
	<description>&lt;p&gt;I haven’t use my browser for almost a week…yes. I cannot believe it is happening, and it’s happening so fast – people spend less and less time with their browser right now. And as an user experience designer I’d like to say, this fact reflects a change of Internet lifestyle. This is pretty significant in computer history because it announces the death of Matrix, and probably, the death of user interface. It is scary and exciting because people soon need to redefine user experience and the job function of UX designers: We will soon design things without thinking about screens. We will think about creating better service. We will become business designers. Or we will become entrepreneur consultants.&lt;/p&gt;
&lt;p&gt;It happened almost like overnight since Apple proudly introduce their iPhone and iPad, followed by a series of other fancy smart phones and mini computer-like devices. People are busy tracking apps instead of browser from the second they wake up in the morning to late night sex time. They are smart enough to realize what they really need is to get rid of all the user interfaces and get to know their best friends’ status, bank balances and next job oppotunites. Now since they can accomplish these tasks without a computer. Sooner or later there’ll be some other vitural devices or service to help them get rid of their smart phones, such as built-in-body-chips or visual augmented sun glasses.&lt;/p&gt;
&lt;p&gt;People’s life are simplified. The world will be more visual and more real since we’ll not gonna deal with interfaces but down-to earth UI-free services.&lt;/p&gt;
&lt;p&gt;Or is it what we really want? How about system design?&lt;/p&gt;
&lt;p&gt;As a hot nerdy girl I both love and hate about system design – it’s  like a sophisticated and but usually over-dressed woman – although we really just want to see the naked body inside, the process to get there could be fancinating and addictive – it has some ritual values. If we don’t design it well, it will turn from a hotty blonde to your mother – who yells at you and makes you want to kill yourself.&lt;/p&gt;
&lt;p&gt;So there I come and say, long live user experience, the browser may die some day, smart phone will die some day, but there’s always people issues that require us to solve – we UX designers will seek our ways to thrive and make better services. As long as there’s people, there’s user experience.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/weizhou.wordpress.com/370/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/weizhou.wordpress.com/370/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/weizhou.wordpress.com/370/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/weizhou.wordpress.com/370/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/weizhou.wordpress.com/370/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/weizhou.wordpress.com/370/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/weizhou.wordpress.com/370/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/weizhou.wordpress.com/370/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/weizhou.wordpress.com/370/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/weizhou.wordpress.com/370/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/weizhou.wordpress.com/370/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/weizhou.wordpress.com/370/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/weizhou.wordpress.com/370/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/weizhou.wordpress.com/370/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=weizhou.wordpress.com&amp;amp;blog=2603969&amp;amp;post=370&amp;amp;subd=weizhou&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 08 Sep 2010 07:42:46 +0000</pubDate>
	<dc:creator>wei zhou</dc:creator>
</item>
<item>
	<title>Brian Louie: Introducing the new MDN website</title>
	<guid isPermaLink="false">http://mozblouie.wordpress.com/?p=107</guid>
	<link>http://mozblouie.wordpress.com/2010/08/30/introducing-the-new-mdn-website/</link>
	<description>&lt;p&gt;&lt;font size=&quot;1&quot;&gt;(This is the same article that can be found on the &lt;a href=&quot;http://hacks.mozilla.org/2010/08/introducing-the-new-mdn-website/&quot;&gt;Hacks blog&lt;/a&gt; and is an updated version of the draft that was posted here last week. Thanks to Jay Patel for co-writing this with me.)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;This week, Mozilla unveiled the newly redesigned &lt;a href=&quot;https://developer.mozilla.org&quot;&gt;Mozilla Developer Network&lt;/a&gt;, the latest incarnation of MDC.  The website has evolved over the years and we recently decided to change the name from Mozilla Developer Center to the Mozilla Developer Network (MDN) to better reflect the developer segments that make up our community and provide a better platform for engaging developers in the Mozilla mission and our plans for pushing the open Web forward.  In this blog post, we’ll walk you through some of the new features and content, in addition to some of the things you can expect in the months to come.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Our Mission&lt;/strong&gt;&lt;br /&gt;
Upon first glance, the most obvious change is that the website has undergone a radical overhaul: from top to bottom, the entire MDN looks different. Even the tagline underneath the title is new: the Mozilla Developer Network is “a comprehensive, usable, and accurate resource for everyone developing for the Open Web.”&lt;/p&gt;
&lt;p&gt;The idea behind the tagline is perhaps the biggest change we’ve made to the MDN: we wanted to create a place where all web developers – not just people who develop using Mozilla technologies – can find the resources they need to make the Internet at-large a better place. This fundamental premise drove many of the design decisions incorporated into the new MDN.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The New Home Page&lt;/strong&gt;&lt;br /&gt;
One of our main goals for this redesign was to streamline and simplify the process of finding information. Because the MDN home page is the first page most people will see when they visit the MDN, we wanted to make sure a diverse set of users could access as much information as possible without cluttering the page.&lt;/p&gt;
&lt;p&gt;Throughout the page, there are several opportunities for the user to sign up for an MDN account; if you already have an MDC/Deki account there’s no need to sign up again.  If you’re new to MDN, you can easily register to join our community.  Members will be able to log in to both the &lt;a href=&quot;http://developer.mozilla.org/forums/&quot;&gt;Developer Forums&lt;/a&gt; and the &lt;a href=&quot;https://developer.mozilla.org/en&quot;&gt;Docs Wiki&lt;/a&gt;.  &lt;/p&gt;
&lt;p&gt;The page also features a promo box with revolving panes highlighting important open Web technologies and tools. The goal of the promo box is to direct developers to the pages about technologies that are most likely to be pertinent to their work, which helps reduce the number of steps it takes to reach a desired article.  There are a lot of things happening at Mozilla that developers will care about, so this is where we hope to provide every visitor a chance to learn more about those topics.&lt;/p&gt;
&lt;p&gt;Moreover, the main content of the page will be available through a tabbed interface that will allow users to click through to whichever section in which they are interested.  We currently have Docs and News but have plans to add Tools and Events as well.   There are plans for the sidebar as well, but for now we have provided a live Twitter feed so that users can get a feel for what various Mozilla communities are talking about and sharing.  We will eventually add trending topics based on activity from around the MDN, streams for conversations in the forums, and the latest web technology demos and experiments.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Site Architecture&lt;/strong&gt;&lt;br /&gt;
The new MDN header contains a search bar and click-through access to various sections through the primary navigation. The MDN’s content has been separated into four main categories, each of which has its own navigation item: &lt;a href=&quot;http://developer.mozilla.org/en-US/web&quot;&gt;Web&lt;/a&gt;, &lt;a href=&quot;http://developer.mozilla.org/en-US/mobile&quot;&gt;Mobile&lt;/a&gt;, &lt;a href=&quot;http://developer.mozilla.org/en-US/addons&quot;&gt;Add-ons&lt;/a&gt;, and &lt;a href=&quot;http://developer.mozilla.org/en-US/apps&quot;&gt;Applications&lt;/a&gt;. This segmentation of the navigation allows us to organize content into non-overlapping buckets, which should more precisely direct developers to the content they need.  Then we have the universal &lt;a href=&quot;http://developer.mozilla.org/en-US/docs&quot;&gt;Docs&lt;/a&gt; – which takes users to a landing page leading to various articles and content from the Docs Wiki – and &lt;a href=&quot;http://developer.mozilla.org/forums/&quot;&gt;Community&lt;/a&gt; – which takes users to the Developer Forums for now – navigation items.  Since those two areas are applicable to all developer segments, we kept them separate in the navigation layout.&lt;/p&gt;
&lt;p&gt;Each content page has a similar format: we feature a few popular articles for each category, some Mozilla-supplied tools, related news and updates, and a feed with relevant tweets. At the bottom of each page, there will eventually be popular forum topics and community comments. (Only the &lt;a href=&quot;http://developer.mozilla.org/en-US/addons&quot;&gt;Add-ons page&lt;/a&gt; has this content right now). If you don’t find what you’re looking for on the landing page for any given category, there are links in each section of the page that take you to more options and pages. Despite the design overhaul, all of the information from the previous MDC remains intact, so there’s no need to worry about losing important articles.  It’s all there and works exactly the same way as before.&lt;/p&gt;
&lt;p&gt;Also, any information that can be accessed via the Docs landing page can also be accessed from other pages on the MDN, but we wanted to provide an alternative way of presenting the information: we highlight some important web development topics, in addition to important topics from the other categories. There are also fun features like Doc of the Day and Most Active Docs, in case you’re interested in what everyone else is looking at.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Growing the Community&lt;/strong&gt;&lt;br /&gt;
The final navigation item in the header is for &lt;a href=&quot;http://developer.mozilla.org/forums/&quot;&gt;Community&lt;/a&gt; and perhaps the most important addition to the new MDN: Developer Forums. In the previous version of the MDN, although there was plenty of documentation to be found, we didn’t provide developers much of an opportunity to talk, discuss, and ask questions. We felt that, in our goal to make the MDN a central hub for web developers, forums comprised an important feature to incorporate into the new version.&lt;/p&gt;
&lt;p&gt;Right now, there are five broad topics for discussion: &lt;a href=&quot;http://developer.mozilla.org/forums/viewforum.php?f=4&quot;&gt;Open Web&lt;/a&gt;, &lt;a href=&quot;http://developer.mozilla.org/forums/viewforum.php?f=6&quot;&gt;Mozilla Platform&lt;/a&gt;, &lt;a href=&quot;http://developer.mozilla.org/forums/viewforum.php?f=3&quot;&gt;MDN Community&lt;/a&gt;, &lt;a href=&quot;https://forums.addons.mozilla.org/&quot;&gt;Mozilla Add-ons&lt;/a&gt;, and &lt;a href=&quot;https://mozillalabs.com/discussions/&quot;&gt;Mozilla Labs&lt;/a&gt;. These domains should be able to cover much of the wide gamut of available discussion topics, but if not, we can always add new ones. Because the forums are new, they are still in the experimental stage; if you have any feedback for us, just use the feedback link at the bottom of the page.  Feel free to start new threads and ask questions about anything, especially if it’s about documentation or the open web in general.&lt;/p&gt;
&lt;p&gt;We’d love for you to try out the new forums!  Again, if you have an account for MDC/Deki, you can use that to log in; if not, you can use the link in the upper-right corner to become an MDN member.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Submitting Feedback&lt;/strong&gt;&lt;br /&gt;
At the bottom of every page, there’s a link to &lt;a href=&quot;http://mdn.uservoice.com/forums/51389-mdn-website-feedback-http-developer-mozilla-org&quot;&gt;submit feedback on the new MDN pages&lt;/a&gt;. Whether there’s something wrong or there’s something you’d like to see (or whether you’d just like to say hello!), just hit that link and let us know what’s on your mind. We’ll do what we can to integrate your ideas to make the Mozilla Developer Network a better place for all developers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Next Steps&lt;/strong&gt;&lt;br /&gt;
Though we have made quite a few changes to the Mozilla Developer Network, they certainly are not the last.  As the MDN continues to expand, we have decided to create a next-generation Docs platform that the Mozilla web development team will be building on Django, similar to the one being implemented for the new SUMO site.  &lt;a href=&quot;http://blog.mozilla.com/jay/2010/06/30/mdn-roadmap-for-2010/&quot;&gt;Planning is already underway&lt;/a&gt;, and we hope to migrate documentation over sometime in 2011.&lt;/p&gt;
&lt;p&gt;Once we’ve converted all the content over, we plan to improve the way you find information via the search bar. So far, we have been devising ways to improve the tagging system and make sure that localized versions of articles are released as soon as possible. In addition, with the help of article rating and commenting systems, we can help make sure that the most relevant and accurate results are mentioned at the top of each search query. And finally, we are building a system that allows community experts in particular fields to regulate editing and writing of articles in their domains.&lt;/p&gt;
&lt;p&gt;We’re also looking to expand the Community tab. Though we expect the forums to remain the centerpiece of that section of the site, we hope to also bring you news, updates, and other community-sourced content.&lt;/p&gt;
&lt;p&gt;We hope that this has helped you get acquainted with the new Mozilla Developer Network. As always, we are amenable to your feedback and ideas, as we are as eager as you are to make the MDN an even better place for web developers to write, read, and discuss important Web topics. We look forward to hearing from you, and we hope you like the new MDN.&lt;/p&gt;
&lt;p&gt;Thanks!&lt;br /&gt;
- Jay &amp;amp; Brian (+ the MDN team)&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozblouie.wordpress.com/107/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozblouie.wordpress.com/107/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozblouie.wordpress.com/107/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozblouie.wordpress.com/107/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozblouie.wordpress.com/107/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozblouie.wordpress.com/107/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozblouie.wordpress.com/107/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozblouie.wordpress.com/107/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozblouie.wordpress.com/107/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozblouie.wordpress.com/107/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozblouie.wordpress.com/107/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozblouie.wordpress.com/107/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozblouie.wordpress.com/107/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozblouie.wordpress.com/107/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozblouie.wordpress.com&amp;amp;blog=14429761&amp;amp;post=107&amp;amp;subd=mozblouie&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 30 Aug 2010 20:01:18 +0000</pubDate>
	<dc:creator>Brian Louie</dc:creator>
</item>
<item>
	<title>Brian Louie: Some cool releases this week</title>
	<guid isPermaLink="false">http://mozblouie.wordpress.com/?p=88</guid>
	<link>http://mozblouie.wordpress.com/2010/08/24/some-cool-releases-this-week/</link>
	<description>&lt;p&gt;Today, we released the next beta for Firefox 4 – the fourth one, for what it’s worth. This might be the biggest beta release yet. Most notably, it features Firefox Panorama (previously referred to as Tab Candy) and Firefox Sync, which allows you to sync your desktop browser with things like your phone and other computers in your house or office or wherever else. CNET posted a good, unbiased &lt;a href=&quot;http://news.cnet.com/8301-30685_3-20014570-264.html&quot;&gt;summary&lt;/a&gt; of the update earlier today. If you’re interested at all in the future of tab and task management, definitely check out the &lt;a href=&quot;http://www.mozilla.com/en-US/firefox/all-rc.html&quot;&gt;latest beta&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also of note: the refreshed Mozilla Developer Network, as I’ve been discussing in many of my posts below, releases tonight, meaning that when you go to &lt;a href=&quot;http://developer.mozilla.org&quot;&gt;developer.mozilla.org&lt;/a&gt; tomorrow morning, you should be able to see the hard work Jay, the web development team, and I have been putting into the MDN over the past few weeks (or months). Expect a long post detailing that in the near future!&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozblouie.wordpress.com/88/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozblouie.wordpress.com/88/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozblouie.wordpress.com/88/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozblouie.wordpress.com/88/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozblouie.wordpress.com/88/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozblouie.wordpress.com/88/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozblouie.wordpress.com/88/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozblouie.wordpress.com/88/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozblouie.wordpress.com/88/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozblouie.wordpress.com/88/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozblouie.wordpress.com/88/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozblouie.wordpress.com/88/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozblouie.wordpress.com/88/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozblouie.wordpress.com/88/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozblouie.wordpress.com&amp;amp;blog=14429761&amp;amp;post=88&amp;amp;subd=mozblouie&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 24 Aug 2010 22:00:33 +0000</pubDate>
	<dc:creator>Brian Louie</dc:creator>
</item>
<item>
	<title>Michael Kurze: Diaspora — Can the Social Graph be Our Web of Trust?</title>
	<guid isPermaLink="false">http://www.thefoundation.de/feeds/michael/on/mozilla/diaspora-and-the-web-of-trust</guid>
	<link>http://www.thefoundation.de/michael/2010/aug/23/diaspora-and-the-web-of-trust/</link>
	<description>&lt;p&gt;On Friday we had Max, Ilya and Raphael from &lt;a href=&quot;http://www.joindiaspora.com&quot; title=&quot;Diaspora Project Site&quot;&gt;Diaspora&lt;/a&gt; over at Mozilla. They &lt;a href=&quot;http://tieguy.org/blog/2010/08/20/notes-on-diaspora-talk/&quot; title=&quot;Luis Villa’s Notes on the Diaspora Talk&quot;&gt;talked&lt;/a&gt; about their effort in creating a distributed social network. Where I think they are on the right track, and where they should think even bigger.&lt;/p&gt;&lt;h3&gt;Why we need Diaspora&lt;/h3&gt;
&lt;p&gt;
Personally, I see three major challenges that everyone passionate about the &lt;a href=&quot;http://www.mozilla.org/about/manifesto.en.html&quot; title=&quot;Principles of the Open Web, as outlined by the Mozilla Manifesto&quot;&gt;open internet&lt;/a&gt; needs to make up their mind about:
&lt;/p&gt;
&lt;ul style=&quot;margin-bottom: 0.5em; margin-top: 0.3em; padding-top: 0;&quot;&gt;
&lt;li&gt;&lt;em&gt;The &lt;a href=&quot;http://googlepublicpolicy.blogspot.com/2010/08/joint-policy-proposal-for-open-internet.html&quot; title=&quot;Google Public Policy on the Verizon deal&quot;&gt;erosion&lt;/a&gt; of &lt;a href=&quot;http://dig.csail.mit.edu/2006/06/neutralnet.html&quot; title=&quot;Daniel Weitzner: The neutral internet&quot;&gt;Net Neutrality&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Participants &lt;a href=&quot;http://futureoftheinternet.org/&quot; title=&quot;The Future of the Internet and How to Stop it by Jonathan Zittrain&quot;&gt;switching to closed&lt;/a&gt; environments of apps and appliances, becoming mere consumers (*)&lt;/em&gt; &lt;/li&gt;
&lt;li&gt;&lt;em&gt;People entrusting their personal data and social activity to Facebook, forced to &lt;a href=&quot;http://www.geekymomblog.com/2010/05/18/the-facebook-dilemma/&quot; title=&quot;Geeky Mom on the Facebook dilemma&quot;&gt;choose&lt;/a&gt; between control and connectedness&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the context of the Diaspora talk, I’ll focus on the third issue.&lt;/p&gt;
&lt;p&gt;We need Diaspora because people need to be in control over with whom they share personal information. Every time Facebook &lt;a href=&quot;http://www.aclunc.org/issues/technology/blog/facebook_places_check_this_out_before_you_check_in.shtml&quot; title=&quot;http://arstechnica.com/web/news/2010/08/privacy-groups-facebook-already-facing-off-over-places.ars&quot;&gt;sneaks in&lt;/a&gt; a new default that breaks privacy, we grudgingly change the settings again — and stay, not wanting to lose our friends. Or we just don’t know about it and leave it as it is. Combined with the social monopoly that Facebook has established, this makes privacy and security optional features, subject to change like any other.&lt;/p&gt;

&lt;h3&gt;How Diaspora can help already&lt;/h3&gt;
&lt;p&gt;
The main distinguishing factor of Diaspora compared to Facebook et al. is in that it decouples your social graph from the network provider, bringing back real competition to the social space. Like with E-Mail, there can be lots of network providers, loosely connected over push-interfaces. Whenever a pod (the equivalent to an e-mail-provider in Diaspora) should violate your trust, you can just switch to another one, or set up your own pod. 
&lt;/p&gt;

&lt;h3&gt;What could be done better&lt;/h3&gt;
&lt;p&gt;
On the downside, this means that you have to trust your pod as well as all your friend’s pods. &lt;em&gt;No big deal?&lt;/em&gt; Well, where the same server software is used on a distributed network, it is very prone to exploit of &lt;a href=&quot;http://en.wikipedia.org/wiki/Sendmail#History_of_vulnerabilities&quot; title=&quot;History of Vulnerabilities in the popular mail server sendmail&quot;&gt;vulnerabilities&lt;/a&gt; due to patch delay and misconfiguration (correctly setting up &lt;abbr title=&quot;Transport Layer Security&quot;&gt;TLS&lt;/abbr&gt; is still a big challenge, &lt;a href=&quot;http://www.theinquirer.net/inquirer/news/1727426/us-government-fails-secure-websites&quot; title=&quot;The Inquirer: DHS fails to secure its website&quot;&gt;not only&lt;/a&gt; for regular people).
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://en.wikipedia.org/wiki/HTTP_Secure&quot; title=&quot;Wikipedia on HTTPS&quot;&gt;Secure HTTP&lt;/a&gt; is great when a large, anonymous group of people needs to trust a central service. It allows us to do online banking and purchases, free from eavesdropping and man-in-the-middle attacks. However, it is not peer-to-peer: When you fetch your mail over a secure IMAP connection, you might be sure that your password is protected, but you do not know who actually sent you that e-mail (think about it: that is the reason why phishing works). When you get it from Google Mail, you might be using TLS, but Google is still able to read your every conversation.
&lt;/p&gt;
&lt;h3&gt;How PGP can solve this&lt;/h3&gt;
&lt;p&gt;
I propose that Diaspora pods should be dumb post boxes that &lt;em&gt;are not able&lt;/em&gt; to actually look into status updates, private messages, friend lists and so on. &lt;em&gt;How?&lt;/em&gt; The technology for that has been available for quite some time and is called &lt;a href=&quot;http://www.pgpi.org/doc/pgpintro/&quot; title=&quot;Introduction to PGP&quot;&gt;PGP&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Basically, PGP allows you to send and receive messages that cannot be decrypted by the servers that route them. So, if you were to encrypt your message inside your browser, you would establish secure end-to-end communication. No need to trust the shady pods that some of your friends decided to use, not knowing any better. &lt;em&gt;But encryption in a web client? That sounds awfully slow!&lt;/em&gt; Well, &lt;a href=&quot;https://addons.mozilla.org/z/en-US/firefox/addon/10868/privacy/&quot; title=&quot;Firefox Sync (aka Weave)&quot;&gt;Firefox Sync&lt;/a&gt; does it already with your entire browsing history (the pass phrase to your key is never sent to the server), and I would imagine that JavaScript interpreters have become fast enough to emulate the cryptographic capabilities of a PC from 1991.
&lt;/p&gt;

&lt;p&gt;I do have ideas on how to approach search and incremental profile updates with this, and on the new security considerations that apply here (Can you always trust your browser? Could a pod not make you use an insecure web client that transmits your passphrase?). However, that is rather technical, possibly material for a follow up post.
&lt;/p&gt;

&lt;h3&gt;The social network is a key signing party&lt;/h3&gt;
&lt;p&gt;
The problem with PGP has always been that people have been unable to exchange public keys in a manner that is both trustworthy and extensive. Because a &lt;a href=&quot;http://en.wikipedia.org/wiki/Web_of_trust&quot; title=&quot;Wikipedia on the Web of Trust&quot;&gt;web of trust&lt;/a&gt; can often not be established, people refrain from using encrypted e-mail. Turns out that social networks come with a mechanism that is just made for this: &lt;em&gt;Friending&lt;/em&gt;. In the secure social network, accepting a friend request would be equivalent to exchanging keys. Usually you are referred to friends from people you already know, so there already is a basic level of trust.
&lt;/p&gt;
&lt;p&gt;
This means that online social networks can be transformed from a jeopardy to our security to a vehicle of the same. This idea is of course also &lt;a href=&quot;http://serendipity.ruwenzori.net/index.php/2009/03/18/pgp-web-of-trust-meets-modern-social-networking&quot; title=&quot;PGP web of trust meets modern social networking by Jean-Marc Liotier&quot;&gt;not entirely new&lt;/a&gt;. What might be new is the idea of building the social web entirely on top of PGP rather than just integrating that as an optional feature.
&lt;/p&gt;

&lt;h3&gt;Any Comments?&lt;/h3&gt;
&lt;p&gt;I have not gotten around to add Commenting or Pingback to this blog, but I would love to incorporate any (links to) comments in a follow up post, please write to michael at this domain.&lt;/p&gt;

&lt;h3&gt;Update:&lt;/h3&gt;
&lt;p&gt;
If I understand correctly, the diaspora guys are already planning to use GPG for cryptography &lt;a href=&quot;http://www.joindiaspora.com/2010/04/21/a-little-more-about-the-project.html&quot; title=&quot;Diaspora Blog: A little more about the project&quot;&gt;somewhere&lt;/a&gt;. This is a pretty good start. If they really already plan on generating keys for everyone, then they would only need to pull the actual encryption into the web client.
&lt;/p&gt;

&lt;p style=&quot;font-size: 85%;&quot;&gt;&lt;em&gt;(*) Like any intern at Mozilla I had the opportunity to to talk to John Lilly, and I got the impression that Mozilla takes this development very seriously.&lt;/em&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 23 Aug 2010 01:30:22 +0000</pubDate>
	<dc:creator>Michael Kurze</dc:creator>
</item>
<item>
	<title>Jaclyn Fu: Once a Mozillian, Always a Mozillian</title>
	<guid isPermaLink="false">http://mozmobileintern.wordpress.com/?p=188</guid>
	<link>http://mozmobileintern.wordpress.com/2010/08/22/once-a-mozillian-always-a-mozillian/</link>
	<description>&lt;p&gt;&lt;em&gt;The most awesomest internship ever.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I wish I could quit school to work here forever. I was spoiled by Bay Area weather, yummy snacks, super people, and rewarding work. Thanks Mozilla for such a great learning experience, and thank you Mozilla community for being great supporters. Hope to work with everyone again soon!&lt;/p&gt;
&lt;p&gt;Back to UC Berkeley for my last year of academic slavery where I’ll be finishing up my History degree (taking loads of marketing classes nevertheless). I’ll probably still be posting Mozilla thoughts here, or maybe I’ll start a new blog – stay tuned!&lt;/p&gt;
&lt;p&gt;Below is the slide deck for my intern presentation which highlights several accomplishments and things I learned. Enjoy!&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozmobileintern.wordpress.com/188/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozmobileintern.wordpress.com/188/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozmobileintern.wordpress.com/188/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozmobileintern.wordpress.com/188/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozmobileintern.wordpress.com/188/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozmobileintern.wordpress.com/188/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozmobileintern.wordpress.com/188/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozmobileintern.wordpress.com/188/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozmobileintern.wordpress.com/188/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozmobileintern.wordpress.com/188/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozmobileintern.wordpress.com/188/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozmobileintern.wordpress.com/188/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozmobileintern.wordpress.com/188/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozmobileintern.wordpress.com/188/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozmobileintern.wordpress.com&amp;amp;blog=13865100&amp;amp;post=188&amp;amp;subd=mozmobileintern&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Sun, 22 Aug 2010 20:59:24 +0000</pubDate>
	<dc:creator>Jaclyn Fu</dc:creator>
</item>
<item>
	<title>John Wayne Hill: Firefox Home Tab Concept</title>
	<guid isPermaLink="false">http://www.johnwaynehill.com/blog/?p=180</guid>
	<link>http://www.johnwaynehill.com/blog/2010/08/17/firefox-home-tab-concept/</link>
	<description>&lt;p&gt;This summer I’ve been working at Mozilla with the Firefox UX team. My main project of the summer was to research what the hometab of the future could and should be. I was to give Firefox a useful path to traverse and provide some ideas about the design and experience of the hometab in Firefox.&lt;/p&gt;
&lt;p&gt;In starting this project I came up with some predispositions (pre-project thoughts) on hometab, and how people use the internet. I then completed three major types of research: competitor analysis, academic research, and user research. This research led me to the following insights:&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-180&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Insights&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; We need to equip people with the right tools&lt;/li&gt;
&lt;li&gt; allow for personal connections&lt;/li&gt;
&lt;li&gt; gradually engage people within the hometab&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From these insights I sketched and iterated on many concepts. I then built a prototype concept. I used this prototype for about two weeks and had my colleagues on the UX team use it as well. I asked for feedback on desires, problems, and future thoughts. With this data I created new mockups showing what I think the hometab of the future should be. These mockups show 10 features of hometab:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; Universal Search (across the web, your history, download, contacts, etc)&lt;/li&gt;
&lt;li&gt; Stream (information guilt free way of browsing things you are interested in)&lt;/li&gt;
&lt;li&gt; Web Apps&lt;/li&gt;
&lt;li&gt; Sessions (an opt-in approach to restore previous sessions)&lt;/li&gt;
&lt;li&gt; Contacts in the browser&lt;/li&gt;
&lt;li&gt; Shared Content (a place to see everything you’ve shared across the web, because it’s important to you)&lt;/li&gt;
&lt;li&gt; Bookmarks&lt;/li&gt;
&lt;li&gt; History&lt;/li&gt;
&lt;li&gt; Downloads&lt;/li&gt;
&lt;li&gt; Firefox Sync&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hometab is laid out in a way to allow gradual engagement, quick access to important information, and personal connections.&lt;/p&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_208&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-208&quot; height=&quot;640&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/HomeTab-v6_1_1.jpg&quot; title=&quot;HomeTab-v6_1_1&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Hometab with universal search and stream view&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_209&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-209&quot; height=&quot;640&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/HomeTab-v6_1_2.jpg&quot; title=&quot;HomeTab-v6_1_2&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;on Hover of Stream Items, an overlay appears&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_210&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-210&quot; height=&quot;638&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/HomeTab-v6_1_3.jpg&quot; title=&quot;HomeTab-v6_1_3&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;upon clicking a stream item, a large overlay appears with details and features&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_211&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-211&quot; height=&quot;395&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/HomeTab-v6_2.jpg&quot; title=&quot;HomeTab-v6_2&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;web apps that allow for badged notifications&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_212&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-212&quot; height=&quot;392&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/HomeTab-v6_3.jpg&quot; title=&quot;HomeTab-v6_3&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;ability to selectively restore tabs from previous sessions&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_213&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-213&quot; height=&quot;552&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/HomeTab-v6_4_1.jpg&quot; title=&quot;HomeTab-v6_4_1&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;showing contacts right in the browser&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_214&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-214&quot; height=&quot;580&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/HomeTab-v6_4_2.jpg&quot; title=&quot;HomeTab-v6_4_2&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;clicking a contact brings up an overlay with information and a conversation stream&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_215&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-215&quot; height=&quot;590&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/HomeTab-v6_5_1.jpg&quot; title=&quot;HomeTab-v6_5_1&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;content that you've shared across the web all in one place for easy findability&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_216&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-216&quot; height=&quot;611&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/HomeTab-v6_5_2.jpg&quot; title=&quot;HomeTab-v6_5_2&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;hovering over a shared content area brings up an overlay with more information&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_217&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-217&quot; height=&quot;603&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/HomeTab-v6_6_1.jpg&quot; title=&quot;HomeTab-v6_6_1&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;easy to get to bookmarks with location aware frequency&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_219&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-219&quot; height=&quot;598&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/HomeTab-v6_6_21.jpg&quot; title=&quot;HomeTab-v6_6_2&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;hovering over a bookmark takes away the favicon overlay and shows a preview of the site&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_220&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-220&quot; height=&quot;523&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/HomeTab-v6_7.jpg&quot; title=&quot;HomeTab-v6_7&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;quick searchable history with an option to see your full browsing history&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_221&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-221&quot; height=&quot;392&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/HomeTab-v6_8.jpg&quot; title=&quot;HomeTab-v6_8&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;easy to acess searchable downloads which the browser can open when possible&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_222&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-222&quot; height=&quot;373&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/HomeTab-v6_9.jpg&quot; title=&quot;HomeTab-v6_9&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;easy acess to Firefox tabs on other computers&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Please keep in mind that this project was to map out a general direction for the Firefox UX team and to provide ideas and thoughts on the design and experience of Firefox hometab. In no way is my concept slated for inclusion in Firefox.&lt;/p&gt;
&lt;p&gt;In the coming weeks I hope to expand upon this concept with more details about my process and the design shown above. Stay tuned!&lt;/p&gt;
&lt;p&gt;Please let me know your thoughts and critique, as &lt;a href=&quot;http://www.johnwaynehill.com/blog/2010/07/15/critique-culture-and-where-i-failed/&quot;&gt;I strongly believe in getting good critiques&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Tue, 17 Aug 2010 15:27:28 +0000</pubDate>
	<dc:creator>John Wayne</dc:creator>
</item>
<item>
	<title>John Wayne Hill: Sharing in Firefox</title>
	<guid isPermaLink="false">http://www.johnwaynehill.com/blog/?p=195</guid>
	<link>http://www.johnwaynehill.com/blog/2010/08/12/sharing-in-firefox/</link>
	<description>&lt;p&gt;Most of us like to share things with people that we know. This is one reason that flickr, facebook, and twitter became so popular. Sharing is huge. It’s likely that if you’ve used the internet, you have shared something with someone. Many of us share different things through many different networks. This can be quite a pain. There are many add-ons that tackle this very issue. However, the browser can make sharing easier by integrating sharing into the browser. If we know what social networks you use, by what passwords you’ve saved in Firefox, it should be pretty easy to enable sharing in Firefox.&lt;/p&gt;
&lt;p&gt;In looking at this problem I’ve come up with the following design:&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-195&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A user should be able to simply right-click an image, video, or link and then click Share. From here a nice overlay should appear with a preview of the thing to be sent, a URL auto filled into a text area, an area to add more information (comment, text, etc), a way to choose what service to use, and a way to share the item with only particular people.&lt;/p&gt;
&lt;p&gt;I’ve created some mock-ups to show how this feature might work. Furthermore, I researched what &lt;a href=&quot;https://spreadsheets.google.com/ccc?key=0AmqAyg8g3AFndHl6T294aEFLX0dqYmpUa1VxN1V1SXc&amp;amp;hl=en&amp;amp;authkey=COWA6PoF&quot;&gt;social services&lt;/a&gt; I think Firefox should support when first implementing this feature.&lt;/p&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_196&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-196&quot; height=&quot;454&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/sharing-feature-1.jpg&quot; title=&quot;sharing-feature-1&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;A page with an image the user wants to share&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_197&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-197&quot; height=&quot;454&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/sharing-feature-2.jpg&quot; title=&quot;sharing-feature-2&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;user right clicks image&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_198&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-198&quot; height=&quot;454&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/sharing-feature-3.jpg&quot; title=&quot;sharing-feature-3&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;user selects &quot;share image&quot;&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_201&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-201&quot; height=&quot;454&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/sharing-feature-6.jpg&quot; title=&quot;sharing-feature-6&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;an overlay appears with a preview of the image and the url autofilled&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_203&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-203&quot; height=&quot;454&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/sharing-feature-8.jpg&quot; title=&quot;sharing-feature-8&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;a user can add their own text if desired&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_199&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-199&quot; height=&quot;454&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/sharing-feature-4.jpg&quot; title=&quot;sharing-feature-4&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;users can select a service with which to share&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_200&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-200 &quot; height=&quot;454&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/sharing-feature-5.jpg&quot; title=&quot;sharing-feature-5&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;character counts could appear if Twitter is selected&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_202&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-202&quot; height=&quot;454&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/sharing-feature-7.jpg&quot; title=&quot;sharing-feature-7&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;users can choose to share privately with certain individuals&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_204&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-204 &quot; height=&quot;454&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/sharing-feature-9.jpg&quot; title=&quot;sharing-feature-9&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;selecting particular people with which to share using Gmail&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_205&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-205 &quot; height=&quot;454&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/08/sharing-feature-10.jpg&quot; title=&quot;sharing-feature-10&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;inline autocomplete for Twitter sharing&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;With sharing enabled directly by the browser people can more easily share images, videos, and links with a variety of social networks or with particular people. Furthermore, by integrating sharing directly into the browser users are never taken out of their flow or interrupted by moving between different websites and services.&lt;/p&gt;
&lt;p&gt;Want to help make Firefox better? Why not contribute and help add this feature. &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=586780&quot;&gt;Bug #: 586780&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 12 Aug 2010 20:33:31 +0000</pubDate>
	<dc:creator>John Wayne</dc:creator>
</item>
<item>
	<title>Brian Louie: Firefox 4.0 beta 3 live</title>
	<guid isPermaLink="false">http://mozblouie.wordpress.com/?p=80</guid>
	<link>http://mozblouie.wordpress.com/2010/08/11/firefox-4-0-beta-3-live/</link>
	<description>&lt;p&gt;Hey, everyone!&lt;/p&gt;
&lt;p&gt;Earlier today, the third beta for Firefox 4.0 went live. Most prominent of the changes include support for multitouch gestures on Windows 7 machines and revisions to the JS engine so that pages render faster. If you haven’t gotten it already, find it &lt;a href=&quot;http://www.mozilla.com/en-US/firefox/all-beta.html&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I’ll be publishing another post soon detailing my work from the past couple of weeks. Stick around!&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozblouie.wordpress.com/80/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozblouie.wordpress.com/80/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozblouie.wordpress.com/80/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozblouie.wordpress.com/80/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozblouie.wordpress.com/80/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozblouie.wordpress.com/80/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozblouie.wordpress.com/80/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozblouie.wordpress.com/80/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozblouie.wordpress.com/80/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozblouie.wordpress.com/80/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozblouie.wordpress.com/80/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozblouie.wordpress.com/80/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozblouie.wordpress.com/80/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozblouie.wordpress.com/80/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozblouie.wordpress.com&amp;amp;blog=14429761&amp;amp;post=80&amp;amp;subd=mozblouie&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 12 Aug 2010 02:23:52 +0000</pubDate>
	<dc:creator>Brian Louie</dc:creator>
</item>
<item>
	<title>Michael Kurze: Sites for Mozilla Input</title>
	<guid isPermaLink="false">http://www.thefoundation.de/feeds/michael/on/mozilla/sites-mozilla-input</guid>
	<link>http://www.thefoundation.de/michael/2010/aug/10/sites-mozilla-input/</link>
	<description>&lt;p&gt;As a side project during my internship at Mozilla, I &lt;a href=&quot;http://aakash.doesthings.com/2010/08/10/firefox-input-1-6-2-is-released-more-malory/&quot;&gt;worked with Aakash&lt;/a&gt; from Mozilla QA to bring &lt;a href=&quot;http://input.mozilla.com/sites&quot; title=&quot;Input Dashboard: Sites&quot;&gt;a new feature&lt;/a&gt; to the Mozilla Input website.&lt;/p&gt;&lt;p&gt;
Oftentimes when users have trouble with a Firefox beta, there is not actually a bug in the beta, but a problem with a specific website (such as broken &lt;a href=&quot;http://www.anybrowser.org/campaign/&quot; title=&quot;Good old anybrowser website, unfortunately still an issue&quot;&gt;user agent detection&lt;/a&gt;). Even when a problem is related to Firefox, it can be very helpful for QA to see what sites trouble our users the most, and what issues the users face there.
&lt;/p&gt;

&lt;h3&gt;Enter clustering…&lt;/h3&gt;
&lt;p&gt;
To group sentiment by topic, my fellow metrics intern Andres and I made use of Dave Dash’s &lt;a href=&quot;http://github.com/davedash/textcluster&quot; title=&quot;Textcluster on github&quot;&gt;clustering algorithm&lt;/a&gt;, which uses techniques from the search engine world to group related input. That helps to get a quick impression on what’s going on when a site is causing trouble for many users. We also get a lot of positive feedback on sites where the user experience has improved for beta users compared to the release version.
&lt;/p&gt;

&lt;h3&gt;…and Django of course!&lt;/h3&gt;
&lt;p&gt;
It was very cool to do something with Django again. The webdev team is very knowledgeable in this area so I learned a lot working with &lt;a href=&quot;http://fredericiana.com/&quot; title=&quot;Fred Wenzel’s blog&quot;&gt;Fred&lt;/a&gt; and &lt;a href=&quot;http://davedash.com/&quot; title=&quot;Dave Dash’s site&quot;&gt;Dave&lt;/a&gt;. There are some limitations (you &lt;em&gt;still&lt;/em&gt; &lt;a href=&quot;http://blog.affien.com/archives/2009/05/30/django-annoyances-no-reverse-select_related/&quot; title=&quot;Django annoyances — no reverse select related&quot;&gt;cannot prefetch related objects&lt;/a&gt; along the inverse edge of a one-to-many relationship, like with any sensible ORM), but other than that Django has become a pretty solid toolkit. Also I finally got started with Git, which is as of now my version control system of choice.
&lt;/p&gt;
&lt;p&gt;
Hopefully my main project will allow me time to improve Input and the dashboard in the future, there’s a lot of cool stuff planned with it.
&lt;/p&gt;</description>
	<pubDate>Tue, 10 Aug 2010 18:46:36 +0000</pubDate>
	<dc:creator>Michael Kurze</dc:creator>
</item>
<item>
	<title>Jaclyn Fu: Firefox 1.1 Quiz Challenge Winners!</title>
	<guid isPermaLink="false">http://mozmobileintern.wordpress.com/?p=189</guid>
	<link>http://mozmobileintern.wordpress.com/2010/08/04/firefox-1-1-quiz-challenge-winners/</link>
	<description>&lt;p&gt;Congratulations  to our two Firefox 1.1 for the Nokia N900 Quiz Challenge winners, &lt;strong&gt;Matt Boes and Heni Purwanti&lt;/strong&gt;! In 3  weeks, over &lt;strong&gt;6,700&lt;/strong&gt; quizzes were submitted from all over the world! Thank you to everyone who  participated and supported Mozilla’s mission to browse without borders.&lt;/p&gt;
&lt;p&gt;Here’s a recap of the quiz questions:&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;strong&gt;Quiz 1 &lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
1) Typing  is hard on a mobile phone. What Firefox 1.1 feature takes you to your  favorite parts of the web with minimal typing? &lt;em&gt;Correct Answer: Awesome  Bar&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Awesome Bar utilizes your search history to suggest links as you’re typing, allowing you to get to sites faster!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2) Firefox  1.1 now has improved zooming to make your browsing experience even more  convenient. What new way can you zoom in and out on the Nokia N900?  Correct Answer: &lt;em&gt;Using the Volume Rocker&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;3)  Don’t start from scratch. Sync your Firefox passwords, history, tabs,  and bookmarks from your PC to your mobile phone. What current Firefox  1.1 feature on the N900 allows you to just get up and go?&lt;em&gt; Correct  Answer: Firefox Sync&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; Note: The Weave Sync project was renamed to Firefox Sync. We clarified this question by asking for the most “current” feature.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;strong&gt;Quiz 2&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
1) How is Firefox for mobile built like Firefox 3.6 for the desktop? Check all that apply. &lt;em&gt;Correct Answer: All (Add-ons, Awesome Bar, Sync, HTML5)&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Did you know that Firefox mobile supports many HTML 5 features! The browser includes important features like&lt;a href=&quot;http://hacks.mozilla.org/2009/06/geolocation/&quot;&gt; Location-Aware browsing&lt;/a&gt;, the&lt;a href=&quot;http://hacks.mozilla.org/2009/06/pushing-pixels-with-canvas/&quot;&gt; &amp;lt;canvas&amp;gt;&lt;/a&gt; and&lt;a href=&quot;http://hacks.mozilla.org/2009/06/rendering-svg-canvas-burst/&quot;&gt; &amp;lt;svg&amp;gt;&lt;/a&gt; tags,&lt;a href=&quot;http://hacks.mozilla.org/2009/07/working-smarter-not-harder/&quot;&gt; Web workers&lt;/a&gt; and&lt;a href=&quot;http://hacks.mozilla.org/2009/07/working-smarter-not-harder/&quot;&gt; offline storage&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2) On our&lt;a href=&quot;http://twitter.com/mozmobile&quot;&gt; @MozMobile&lt;/a&gt; Twitter account, what Firefox 1.1 feature was spotlighted on April 14th  3:08pm US/PST? (hint: you can save as PDF and add search engine here).  &lt;em&gt;Correct Answer: Site menu&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Due to Twitter localization, it was difficult for many people to find   the correct answer. The hint was quickly added after a community member   brought this to our attention (Thank you!).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3) What are the goals of bringing Firefox to mobile phones? &lt;em&gt;Correct Answer: All&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Firefox mobile aims to deliver an exceptional mobile experience, provide a platform for developers, and to do work in shared Mozilla repositories that benefit each other&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;strong&gt;Quiz 3&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
1) (True or False) Firefox is the world’s only mobile Web browser to support add-ons. &lt;em&gt;Correct answer: True&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We are now the &lt;em&gt;first&lt;/em&gt; to support add-ons as of a few mobile Web browsers’ claim of supporting add-ons. Firefox mobile is a pioneer and leader in setting standards!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2)  The improved Site Menu in Firefox 1.1 for the Nokia N900 lets you  better manage your relationship with the site you’re on. What action  can’t you do using the Site Menu options? &lt;em&gt;Correct answer: Pizza&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Interesting that 11% of participants believed you could order pizza off of the Firefox mobile site menu..That should be a new feature! &lt;img alt=&quot;;)&quot; class=&quot;wp-smiley&quot; src=&quot;http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif&quot; /&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3)  Firefox tries everywhere it can to minimize the amount you have to type  on mobile phones. Besides the Awesome Bar, what other feature focuses  on typing less? &lt;em&gt;Correct answer: Form auto-complete&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you did not have the chance to sign up for the &lt;strong&gt;about:mobile newsletter&lt;/strong&gt; to receive exclusive updates on mobile products and future challenges, you can do so by clicking here:&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://list-manage.com/subscribe?u=168bf22f976f5a68fe5770d19&amp;amp;id=f76d3a9899&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter&quot; height=&quot;44&quot; src=&quot;http://farm4.static.flickr.com/3161/2615859599_7f7652b0c9_m.jpg&quot; title=&quot;about:mobile&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;To our two winners of the quiz challenge: Let us know what you think of Firefox 1.1 on your new Nokia N900!&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozmobileintern.wordpress.com/189/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozmobileintern.wordpress.com/189/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozmobileintern.wordpress.com/189/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozmobileintern.wordpress.com/189/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozmobileintern.wordpress.com/189/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozmobileintern.wordpress.com/189/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozmobileintern.wordpress.com/189/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozmobileintern.wordpress.com/189/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozmobileintern.wordpress.com/189/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozmobileintern.wordpress.com/189/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozmobileintern.wordpress.com/189/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozmobileintern.wordpress.com/189/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozmobileintern.wordpress.com/189/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozmobileintern.wordpress.com/189/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozmobileintern.wordpress.com&amp;amp;blog=13865100&amp;amp;post=189&amp;amp;subd=mozmobileintern&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 04 Aug 2010 16:46:15 +0000</pubDate>
	<dc:creator>Jaclyn Fu</dc:creator>
</item>
<item>
	<title>Brian Krausz: GazeHawk Launches!</title>
	<guid isPermaLink="false">http://nerdlife.net/?p=325</guid>
	<link>http://feedproxy.google.com/~r/nerdlife/~3/__tva_il3mA/</link>
	<description>&lt;p&gt;At least now I have a publicly known excuse for being busy!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://techcrunch.com/2010/07/29/y-combinator-backed-gazehawk-heatmaps-with-web-cams/&quot;&gt;http://techcrunch.com/2010/07/29/y-combinator-backed-gazehawk-heatmaps-with-web-cams/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Keep an eye on our blog at &lt;a href=&quot;http://gazehawk.com/blog/&quot;&gt;http://gazehawk.com/blog/&lt;/a&gt; for some interesting technology/startup posts.&lt;/p&gt;
&lt;p&gt;Time to go deal with my ever-growing inbox &lt;img alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; src=&quot;http://briankrausz.com/wp-includes/images/smilies/icon_wink.gif&quot; /&gt; .&lt;/p&gt;
&lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/nerdlife/~4/__tva_il3mA&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 29 Jul 2010 22:06:39 +0000</pubDate>
	<dc:creator>Brian</dc:creator>
</item>
<item>
	<title>Brian Louie: Redesigning the MDN (part 2)</title>
	<guid isPermaLink="false">http://mozblouie.wordpress.com/?p=70</guid>
	<link>http://mozblouie.wordpress.com/2010/07/29/redesigning-the-mdn-part-2/</link>
	<description>&lt;p&gt;&lt;font size=&quot;1&quot;&gt;[This is a continuation of the post &lt;a href=&quot;http://mozblouie.wordpress.com/2010/07/28/redesigning-the-mdn-part-1/&quot;&gt;&quot;Redesigning the MDN (part 1).&quot;&lt;/a&gt;]&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;In my &lt;a href=&quot;http://mozblouie.wordpress.com/2010/07/28/redesigning-the-mdn-part-1/&quot;&gt;previous post&lt;/a&gt; I mentioned our fundamental goal is provide web developers with a central hub for documentation and discussion. I’ve talked a bit about how we plan to achieve the former, but what of the latter?&lt;/p&gt;
&lt;p&gt;For this reason, we added yet another tab to the MDN’s header, called “Community.” In the newest iteration of the MDN, this tab will primarily serve to host a UserVoice-based forum where web developers can congregate and discuss anything open-web related. As we get that finalized, I’ll update this blog with a list of initial topics so that you can start to think about things to talk about.&lt;/p&gt;
&lt;p&gt;Again, when the new MDN goes live sometime in mid-August, expect a more in-depth tour of the Community tab. Also, note that the Community tab will eventually encompass more than forums. Eventually there will also be community-provided news articles and other community engagement efforts via Mozilla. Those should be coming in later iterations of the MDN.&lt;/p&gt;
&lt;p&gt;Thanks for reading! As usual, if you have any questions, comment or shoot me an email.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozblouie.wordpress.com/70/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozblouie.wordpress.com/70/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozblouie.wordpress.com/70/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozblouie.wordpress.com/70/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozblouie.wordpress.com/70/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozblouie.wordpress.com/70/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozblouie.wordpress.com/70/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozblouie.wordpress.com/70/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozblouie.wordpress.com/70/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozblouie.wordpress.com/70/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozblouie.wordpress.com/70/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozblouie.wordpress.com/70/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozblouie.wordpress.com/70/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozblouie.wordpress.com/70/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozblouie.wordpress.com&amp;amp;blog=14429761&amp;amp;post=70&amp;amp;subd=mozblouie&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 29 Jul 2010 21:44:14 +0000</pubDate>
	<dc:creator>Brian Louie</dc:creator>
</item>
<item>
	<title>Jaclyn Fu: Building Firefox 2.0 Position &amp; Product</title>
	<guid isPermaLink="false">http://mozmobileintern.wordpress.com/?p=162</guid>
	<link>http://mozmobileintern.wordpress.com/2010/07/28/building-firefox-2-0-position-product/</link>
	<description>&lt;p&gt;&lt;em&gt;Back to basics: What does the mobile Web user want in a browser?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I left our mobile product delivery meeting with some thoughts: 1) The competitive landscape is rapidly changing what were many “nice to have” features into mandatory industry standards and 2) positioning a product is much easier if we understood exactly what the user wanted.&lt;/p&gt;
&lt;p&gt;This prompted me to conduct a quick market research survey. I included a research question in Quiz #3 of the &lt;a href=&quot;http://bit.ly/aVTG30&quot; target=&quot;_blank&quot;&gt;Firefox 1.1 for the Nokia N900 Quiz Challenge&lt;/a&gt; that asked participants which feature was most important in a mobile Web browser. Here are the results out of a 1800 person sample:&lt;/p&gt;
&lt;p&gt;1) Speed&lt;br /&gt;
2) Battery life/memory usage&lt;br /&gt;
3) Readability/zooming&lt;br /&gt;
4) Tabs&lt;br /&gt;
5) Sync&lt;br /&gt;
6) Social media integration&lt;br /&gt;
7) Add-ons&lt;/p&gt;
&lt;p&gt;It’s interesting to note that in this small sample, many people also wrote “full PC-like capabilities” in the open answer text field. Fennec is built from the same engine as Firefox for desktop and also has the same powerful capabilities as the desktop version. It’s even more interesting to see Tabs rank so high because Firefox is the only mobile Web browser that does tabs right (from experience). Most mobile Web browsers require you to navigate through a maze before you can reach your tabs, but Fennec conveniently stores them to the side of your browser, accessible with a quick swipe across the screen. Firefox Sync and Add-Ons satisfy the 5th and 7th most important features, respectively. Social media integration, or sharing, is the next step in Fennec development. You can view the Fennec planning page&lt;a href=&quot;https://wiki.mozilla.org/Mobile/Planning/2.0&quot; target=&quot;_blank&quot;&gt; here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Most of the sample audience uses Opera Mini, Opera Mobile, IE Mobile, and Android Browser.&lt;em&gt; If you have had experience with these browsers, how do you think Firefox compares with them? &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Firefox 2.0 is going to be a full, rich, mobile Web browser. We have all the bells and whistles – but how do we stand with the basics? &lt;a href=&quot;https://wiki.mozilla.org/Electrolysis&quot; target=&quot;_blank&quot;&gt;Electrolysis&lt;/a&gt; and &lt;a href=&quot;https://wiki.mozilla.org/Layers&quot; target=&quot;_blank&quot;&gt;layers&lt;/a&gt; are going to improve performance, and there are current developments to maximize efficient battery life. The biggest challenge now is to improve readability so that zooming and text formatting is seamless. By the time the final product rolls out, I’m positive Firefox 2.0 will be polished, fast, and ready for daily use.&lt;/p&gt;
&lt;p&gt;The user feedback data was really insightful for gaining a better sense of user needs and expectations. I’ve been trying to apply the concepts I learned from my 8am marketing class from last semester, but of course real-life problems are much more difficult to solve than classroom case studies. Let’s open this up for some discussion – &lt;em&gt;what kind of experience do you have with brand positioning and do you have any tips for an aspiring marketer? How do you feel about Fennec’s current positioning? &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Want to experience the nightlies yourself? You can download a nightly build of Fennec 2.0a1pre &lt;a href=&quot;http://mzl.la/9C4sh9&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozmobileintern.wordpress.com/162/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozmobileintern.wordpress.com/162/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozmobileintern.wordpress.com/162/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozmobileintern.wordpress.com/162/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozmobileintern.wordpress.com/162/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozmobileintern.wordpress.com/162/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozmobileintern.wordpress.com/162/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozmobileintern.wordpress.com/162/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozmobileintern.wordpress.com/162/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozmobileintern.wordpress.com/162/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozmobileintern.wordpress.com/162/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozmobileintern.wordpress.com/162/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozmobileintern.wordpress.com/162/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozmobileintern.wordpress.com/162/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozmobileintern.wordpress.com&amp;amp;blog=13865100&amp;amp;post=162&amp;amp;subd=mozmobileintern&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 28 Jul 2010 19:54:45 +0000</pubDate>
	<dc:creator>Jaclyn Fu</dc:creator>
</item>
<item>
	<title>Brian Louie: Redesigning the MDN (part 1)</title>
	<guid isPermaLink="false">http://mozblouie.wordpress.com/?p=62</guid>
	<link>http://mozblouie.wordpress.com/2010/07/28/redesigning-the-mdn-part-1/</link>
	<description>&lt;p&gt;&lt;font size=&quot;1&quot;&gt;(Redesigning the MDN is a complex project that’s going to take more than one post. In this post, I discuss the reasoning behind some of the more superficial changes I’ve made to the Network.)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Another one of my big projects here at Mozilla has been working on redesigning and re-branding the Mozilla Developer Network (MDN). If you’ve been keeping up with my blog, you’ve already seen some of the work that Jay and I have done with regard to graphically redesigning the network. As I’ll discuss in a bit, we’ve made some important changes since then.&lt;/p&gt;
&lt;p&gt;First, it’s important to understand the impetus for change. The Mozilla Developer Center (the current name for the MDN), as it stands, can be found &lt;a href=&quot;http://developer.mozilla.org&quot;&gt;here&lt;/a&gt;, if you’re not already familiar with it. Although it certainly looks better than it has in years past, it could still use some fixes here and there. Or all over the place. You can find the slide deck with some pictures of our first draft of the redesign &lt;a href=&quot;https://wiki.mozilla.org/MDN&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Underneath the superficial overhaul, however, lies a deeper paradigm shift. Although content is pretty well spread out to cover various domains of the open web, the focus currently concentrates on developing on the Mozilla platform specifically. While certainly we want to reward and help those who develop with the tools that we provide them, we feel that perhaps this mindset is a little close-minded. Mozilla’s goal is to advance the open web in every way possible, Mozilla-inspired or not. Consequently a solely inward focus on only Mozilla’s tools is unintuitive and does not allow us to optimize the progress of the open web.&lt;/p&gt;
&lt;p&gt;Ultimately, the goal of the Mozilla Developer Network is to provide a central hub for discussion and documentation for open web developers, regardless of platform. The redesign of the MDN cannot lose sight of this goal.&lt;/p&gt;
&lt;p&gt;With this goal in mind, we took the original .psd files from our web designers and started making tweaks. As previously mentioned, there are four main documentation headers: Web, Mobile, Add-ons, and Applications. In the currently released design, all of those headers are given equal weight, which runs against our fundamental goal.&lt;/p&gt;
&lt;p&gt;Unfortunately, there wasn’t much of a way to change these headlines without breaking the entire header, so we instead decided to revamp the site’s home page to place a greater emphasis on open web technologies at-large. When the new site is live, you’ll be able to see for yourself. There have been several other changes as well; I’ll tour through them on this blog when the new Network goes live.&lt;/p&gt;
&lt;p&gt;One thing I’d like to emphasize: though our presentation of information has changed to fit our goal, none of the documentation has changed. You will still find all the information found on the current MDC, from Gecko to info about Mozilla-specific APIs. These articles will continued to be updated as well. &lt;em&gt;Only the presentation of the information has changed.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Expect the site to go live mid-August. Tomorrow, I’ll write about some of the awesome new features that we can expect to see in the next iteration of the MDN and how we plan to facilitate communication between developers.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozblouie.wordpress.com/62/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozblouie.wordpress.com/62/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozblouie.wordpress.com/62/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozblouie.wordpress.com/62/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozblouie.wordpress.com/62/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozblouie.wordpress.com/62/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozblouie.wordpress.com/62/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozblouie.wordpress.com/62/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozblouie.wordpress.com/62/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozblouie.wordpress.com/62/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozblouie.wordpress.com/62/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozblouie.wordpress.com/62/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozblouie.wordpress.com/62/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozblouie.wordpress.com/62/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozblouie.wordpress.com&amp;amp;blog=14429761&amp;amp;post=62&amp;amp;subd=mozblouie&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 28 Jul 2010 18:19:27 +0000</pubDate>
	<dc:creator>Brian Louie</dc:creator>
</item>
<item>
	<title>Brian Louie: Firefox 4 beta 2</title>
	<guid isPermaLink="false">http://mozblouie.wordpress.com/?p=56</guid>
	<link>http://mozblouie.wordpress.com/2010/07/27/firefox-4-beta-2/</link>
	<description>&lt;p&gt;A quick aside from my summary posts: download &lt;a href=&quot;http://mzl.la/1ePD15&quot;&gt;the Firefox 4 beta 2&lt;/a&gt; to check out application tabs and a sweet new Mac OS X interface. The &lt;a href=&quot;http://www.azarask.in/blog/post/tabcandy/&quot;&gt;alpha for Tab Candy&lt;/a&gt; is also available as an early build of Firefox, if you’re interested in trying that out as well.&lt;/p&gt;
&lt;p&gt;For a more detailed rundown of the new beta, check out the &lt;a href=&quot;http://hacks.mozilla.org/2010/07/firefox4-beta2/&quot;&gt;Hacks blog&lt;/a&gt; for a sweet demo from our very own Paul Rouget!&lt;/p&gt;
&lt;p&gt;Happy developing!&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozblouie.wordpress.com/56/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozblouie.wordpress.com/56/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozblouie.wordpress.com/56/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozblouie.wordpress.com/56/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozblouie.wordpress.com/56/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozblouie.wordpress.com/56/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozblouie.wordpress.com/56/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozblouie.wordpress.com/56/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozblouie.wordpress.com/56/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozblouie.wordpress.com/56/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozblouie.wordpress.com/56/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozblouie.wordpress.com/56/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozblouie.wordpress.com/56/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozblouie.wordpress.com/56/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozblouie.wordpress.com&amp;amp;blog=14429761&amp;amp;post=56&amp;amp;subd=mozblouie&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 27 Jul 2010 20:12:51 +0000</pubDate>
	<dc:creator>Brian Louie</dc:creator>
</item>
<item>
	<title>Brian Louie: A global picture of the open web</title>
	<guid isPermaLink="false">http://mozblouie.wordpress.com/?p=51</guid>
	<link>http://mozblouie.wordpress.com/2010/07/27/a-global-picture-of-the-open-web/</link>
	<description>&lt;p&gt;Hey there! Sorry for the long delay since my previous post; it’s been a busy past few weeks. Since coming back from the summit, my internship has been full of twists and turns, leaving me little time to write.&lt;/p&gt;
&lt;p&gt;I’ve been assigned to work on a whole lot of different things. To give equal exposure to all of them, I’ll write several posts to update you on my work these past few weeks.&lt;/p&gt;
&lt;p&gt;One of my big projects thus far has been designing an industry-wide web developer survey. Some of you might have seen one of my previous blog entries about the results of the survey we distributed this past March. The findings, while interesting, don’t paint a complete picture of the state of the open web and the developer tools you all like to use. Thus far the surveys we’ve released – the one previously mentioned and one that was released last November – have been distributed via Mozilla channels and have only really inquired about Mozilla platform technologies. We hope to change that.&lt;/p&gt;
&lt;p&gt;We hope to get a wider snapshot of the web development community, not just for us, but for you. A panorama, if you will.&lt;/p&gt;
&lt;p&gt;The survey will be released in a few weeks – sometime before the end of August – so check back frequently for the opportunity to take the survey and help us paint the picture of the open web. Thus far I’ve iterated through several drafts of the survey and talked to several market research consultants to determine how to best distribute and design the survey. It will be ready soon!&lt;/p&gt;
&lt;p&gt;On a more interesting note, I’ve also been reaching out to infographic designers. Although the data obtained from the survey will certainly help us, we want it to help you, too. We want to present our data and conclusions in an aesthetically awesome way. Right now, I’m talking over our goals and the possibilities of an end design with several artists. They all have some pretty good stuff going on; they’ve won awards and made some pretty interesting designs. Stay tuned!&lt;/p&gt;
&lt;p&gt;Because we expect such a large audience to be taking the survey, there has been a lot of pressure to get every word and every question right. I never realized just how much goes into designing a questionnaire: figuring out the average time spent to read and answer each question, the best way to structure a question, the most efficient reconciliation of details and the big picture, etc. Given the impact we expect this survey to have on our engagement efforts, the survey must determine with exact precision the information that we’re looking for. Such a statistical conquest, I have discovered, isn’t as easy as it looks.&lt;/p&gt;
&lt;p&gt;More blog posts about the other things I’m working on will be coming soon! Thanks for reading.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozblouie.wordpress.com/51/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozblouie.wordpress.com/51/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozblouie.wordpress.com/51/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozblouie.wordpress.com/51/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozblouie.wordpress.com/51/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozblouie.wordpress.com/51/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozblouie.wordpress.com/51/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozblouie.wordpress.com/51/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozblouie.wordpress.com/51/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozblouie.wordpress.com/51/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozblouie.wordpress.com/51/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozblouie.wordpress.com/51/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozblouie.wordpress.com/51/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozblouie.wordpress.com/51/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozblouie.wordpress.com&amp;amp;blog=14429761&amp;amp;post=51&amp;amp;subd=mozblouie&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 27 Jul 2010 17:54:53 +0000</pubDate>
	<dc:creator>Brian Louie</dc:creator>
</item>
<item>
	<title>Brian Krausz: The Worst Paragraph Ever Written</title>
	<guid isPermaLink="false">http://nerdlife.net/?p=323</guid>
	<link>http://feedproxy.google.com/~r/nerdlife/~3/ScRNeKv1wPk/</link>
	<description>&lt;p&gt;Context: There’s an organization that sponsors Shabbat dinners.  It’s really awesome: they basically pay you to feed your friends.  That being said, they need a copywriter.  Here’s a paragraph in the email they sent confirming my sponsored dinner:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;As of Monday, July 19th, the new NEXT Shabbat program will begin providing new NEXT Shabbat’s with up to $14 per guest (maximum of 16 guests) for the first three meals a host registers after that date. After those three meals, hosts will receive up to $10 dollars per guest. As a returning NEXT Shabbat host, your meal-payment will be based on the number of meals you’ve held already. However, since you have a meal scheduled to take place between July 19th and August 19th, you will still receive $18 per-guest for that meal. Following that meal, if you’ve already held at least three meals, any meal registered after July 19th will only be eligible for a payment of $10 per guest. By joining with us as we make these changes to the program you will give many more people the opportunity to host and will enable thousands to participate in home-based Shabbat meals for the first time. If you’ve held less than three meals, any meal registered after July 19th will be eligible for a payment of up to $14 through your third meal. You can also see how many meals you have already hosted.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;As always apologies for the lack of updates: I promise there’s a short (but major) update coming very soon, followed by more frequent posting (there’s a reason I’ve been so quiet lately).&lt;/p&gt;
&lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/nerdlife/~4/ScRNeKv1wPk&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 21 Jul 2010 11:31:15 +0000</pubDate>
	<dc:creator>Brian</dc:creator>
</item>
<item>
	<title>Jaclyn Fu: NEW Creative Collective Design Challenge! “Home is Where the Phone is”</title>
	<guid isPermaLink="false">http://mozmobileintern.wordpress.com/?p=69</guid>
	<link>http://mozmobileintern.wordpress.com/2010/07/17/new-creative-collective-design-challenge-home-is-where-the-phone-is/</link>
	<description>&lt;p&gt;&lt;em&gt;Design an iPhone skin for Firefox Home! &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Find out more on the &lt;a href=&quot;http://bit.ly/9yTkMh&quot; target=&quot;_blank&quot;&gt;Creative Collective challenge page&lt;/a&gt;&lt;em&gt;. &lt;/em&gt;&lt;em&gt;&lt;br /&gt;
&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Calling on all designers and Firefox mobile enthusiasts! Create cool designs to make into iPhone skins and help spread the news about &lt;a href=&quot;https://www.mozilla.com/en-US/mobile/home/&quot; target=&quot;_blank&quot;&gt;Firefox Home&lt;/a&gt;. This is your opportunity to be featured on Mozilla’s website, blogs and possibly even official Mozilla merchandise!&lt;/p&gt;
&lt;p&gt;We’re looking for designs that convey the message of how Firefox Home gives you instant access to your favorite parts of the web. Now you can carry your home with you on your phone. Themes we are focusing on:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-71 alignleft&quot; height=&quot;226&quot; src=&quot;http://mozmobileintern.files.wordpress.com/2010/06/430px-mcc_logo.jpg?w=258&amp;amp;h=226&quot; title=&quot;430px-MCC_Logo&quot; width=&quot;258&quot; /&gt;-&lt;em&gt;Get up and go.&lt;/em&gt; Easily  pick up where you left off with Firefox.&lt;/p&gt;
&lt;p&gt;-&lt;em&gt;Home sweet home.&lt;/em&gt; Access your favorite parts of the Web anytime and anywhere.&lt;/p&gt;
&lt;p&gt;-&lt;em&gt;Don’t start from  scratch&lt;/em&gt;. Enjoy the convenience of leveraging your Firefox browsing  history.&lt;/p&gt;
&lt;p&gt;-&lt;em&gt;Comforts of your web.&lt;/em&gt; Your private data is  protected and always with you.&lt;/p&gt;
&lt;p&gt;We encourage you to be as creative as you can be. Be abstract and don’t take the themes too literally. A Mozilla team will pick the Top 5, and it’s up to the community to vote for the winner.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://people.mozilla.org/~jfu/drop/MozillaSubmissionTemplate.psd&quot;&gt;Download&lt;/a&gt; the design template and start designing! Make sure you follow all the &lt;a href=&quot;https://wiki.mozilla.org/Mobile/firefoxhome/designchallenge&quot; target=&quot;_blank&quot;&gt;design guidelines&lt;/a&gt; to ensure your design is considered.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The challenge ends on August 15th.&lt;/strong&gt; Can’t wait to see what you come up with!&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozmobileintern.wordpress.com/69/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozmobileintern.wordpress.com/69/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozmobileintern.wordpress.com/69/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozmobileintern.wordpress.com/69/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozmobileintern.wordpress.com/69/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozmobileintern.wordpress.com/69/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozmobileintern.wordpress.com/69/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozmobileintern.wordpress.com/69/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozmobileintern.wordpress.com/69/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozmobileintern.wordpress.com/69/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozmobileintern.wordpress.com/69/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozmobileintern.wordpress.com/69/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozmobileintern.wordpress.com/69/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozmobileintern.wordpress.com/69/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozmobileintern.wordpress.com&amp;amp;blog=13865100&amp;amp;post=69&amp;amp;subd=mozmobileintern&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 17 Jul 2010 17:55:01 +0000</pubDate>
	<dc:creator>Jaclyn Fu</dc:creator>
</item>
<item>
	<title>John Wayne Hill: Mozilla Summit 2010</title>
	<guid isPermaLink="false">http://www.johnwaynehill.com/blog/?p=163</guid>
	<link>http://www.johnwaynehill.com/blog/2010/07/14/mozilla-summit-2010/</link>
	<description>&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone size-full wp-image-164&quot; height=&quot;180&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/07/Mozilla-summit-wiki-banner.png&quot; title=&quot;Mozilla Summit 2010 Banner&quot; width=&quot;650&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I recently got back from the Mozilla 2010 Summit in Whistler, BC.&lt;/p&gt;
&lt;p&gt;I can sum up my entire experience in just one word.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Awesome! &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-163&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;But, that doesn’t really do the summit justice, not even close really. The summit was held over three days. Three full days of talking to people who change the world. Three days of meeting with like minded people who are just as enthusiastic about Mozilla as I am, even more perhaps. These people changed me a bit. I saw a spark in them that is very hard to describe. They, much like me, really believed that they could change the world (via the internet) for a better place. They really cared, not just giving lip service, about the people who use the software they help create. They put people first. Awesome!&lt;/p&gt;
&lt;p&gt;This “army of awesome” as it was so called lent me a lot of energy. I was fueled by their passion. It was fantastic.&lt;/p&gt;
&lt;p&gt;I gave a talk on the &lt;a href=&quot;http://www.johnwaynehill.com/blog/2010/06/16/perceived-speed-performace/&quot;&gt;Perception of Performance&lt;/a&gt; in Firefox. I think there was about 500-600 people in attendance. It rocked my world. Many people came up to me after and told me that they really liked the work I was doing. Validation! I walked away from that talk exhausted but feeling incredibly worthy and capable of changing the world.&lt;/p&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_165&quot; style=&quot;width: 610px;&quot;&gt;&lt;img alt=&quot;Firefox UX Beer Hall Design Session&quot; class=&quot;size-full wp-image-165&quot; height=&quot;450&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/07/127451450.jpg&quot; title=&quot;Firefox UX Beer Hall Design Session&quot; width=&quot;600&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Firefox UX Beer Hall Design Session&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Much like any conference or summit, so many things happened in the after hours events. The Firefox UX team held a Beer Hall design session where we solicited ideas, complaints, and solutions from anyone who wished to join us. The ‘end-of-summit’ party, held on top of a mountain, was the best I’ve ever attended. It was full of fun, dancing, and some great discussions. We also had fun monsters hanging out with us! We even had a cool &lt;a href=&quot;http://www.flickr.com/photos/fligtar/4779959597/&quot;&gt;dancing conga line&lt;/a&gt;!&lt;/p&gt;
&lt;div class=&quot;wp-caption alignnone&quot; id=&quot;attachment_166&quot; style=&quot;width: 710px;&quot;&gt;&lt;img alt=&quot;Me Dancing with the Monsters&quot; class=&quot;size-full wp-image-166&quot; height=&quot;525&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/07/ICAM0054.jpg&quot; title=&quot;Dancing with the Monsters&quot; width=&quot;700&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Me dancing with the monsters&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;In summary I would like to thank everyone who made this possible. The summit was truly invigorating and exhilarating. In short, it was effing awesome!&lt;/p&gt;</description>
	<pubDate>Wed, 14 Jul 2010 18:42:57 +0000</pubDate>
	<dc:creator>John Wayne</dc:creator>
</item>
<item>
	<title>Brian Louie: Mozilla Summit 2010: day 3</title>
	<guid isPermaLink="false">http://mozblouie.wordpress.com/?p=32</guid>
	<link>http://mozblouie.wordpress.com/2010/07/10/mozilla-summit-2010-day-3/</link>
	<description>&lt;p&gt;The final day was a little shorter than the first two, but it was arguably the most memorable of the trip.&lt;/p&gt;
&lt;p&gt;We woke up to a few lightning talks, which are five-minute demonstrations of various things that Mozillians have been working on. The lightning talks also featured the work of fellow intern John Wayne Hill, who has been working in user experience. Check out his blog at &lt;a href=&quot;http://planet.mozinterns.net&quot;&gt;planet.mozinterns.net&lt;/a&gt; for more info.&lt;/p&gt;
&lt;p&gt;Afterward, we went to our penultimate round of breakout sessions. Today I decided to stray from the usual engagement stuff to check out a session on web gaming. We were treated to demos of non-Flash-based games, including one that a fellow Mozillian had coded up on the plane on the way to Vancouver. It was, in short, a good time.&lt;/p&gt;
&lt;p&gt;We then had one final round of lightning talks – featuring another fellow intern, Kyle Huey – followed by two more sets of breakout sessions. One of the most interesting breakout sessions featured my mentor, Jay Patel. As I mentioned in a blog post a week or two ago, one of our big projects has been working on the expansion and the redesign of the Mozilla Developer Network (previously called the Mozilla Developer Center). We’ve finished designing the new static pages, which should be going live by the end of the month. Most important in the redesign of these static pages is the categorization of documentation pages into four parts: web, mobile, add-ons, other.&lt;/p&gt;
&lt;p&gt;If you want to see what the MDN looks like right now, check out the &lt;a href=&quot;http://developer.mozilla.org&quot;&gt;site&lt;/a&gt;. As you can tell, it could use quite the graphical overhaul.&lt;/p&gt;
&lt;p&gt;We also hope to clean up the documentation and improve the way people navigate the site. As indicated by the heated discussion at the session, the most difficult obstacle will be localization: it’s hard to coordinate translation of documentation and to keep all of those different translations updated. We plan to keep the site constantly updated with the most updated version of an article in at least one language and to offer incentives for localizers to contribute. Furthermore, we plan to pinpoint contributors’ areas of expertise to streamline the technical review process so that articles are updated in a timely fashion.&lt;/p&gt;
&lt;p&gt;If you want more details about the redesign of the MDN, check out the &lt;a href=&quot;http://wiki.mozilla.org/MDN&quot;&gt;site&lt;/a&gt; for a copy of the PowerPoint deck that Jay and I made and also the priorities and requirements documents. If you have anything you’d like to contribute or suggest, please feel free to comment on this article or to contact me at blouie@mozilla.com. Any feedback is much appreciated!&lt;/p&gt;
&lt;p&gt;Equally important is finding ways to get people to contribute to original documentation. Eric Shephard and Janet Swisher gave a great presentation about the implementation of so called “doc sprints,” which will bring together developers and experts in a particular field to draft documentation about a particular topic. If you have ideas to do so, definitely email Eric or Janet at sheppy@mozilla and jswisher@mozilla respectively.&lt;/p&gt;
&lt;p&gt;After quite the busy day and an inspiring closing address by Jay Sullivan, we were corralled into gondolas that took us up to the peak of one of the highest mountains in Whistler. There was a great dinner and dance party up there; it was the perfect way to wrap up this opportunity to learn so much awesome stuff and meet so many awesome people. As they said at the closing address, there was “too much awesome.”&lt;/p&gt;
&lt;p&gt;I can’t find a better way to describe it. I hope you’ve enjoyed reading my chronicles of the summit. If you have anything to say, don’t hesitate to talk to me!&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozblouie.wordpress.com/32/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozblouie.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozblouie.wordpress.com/32/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozblouie.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozblouie.wordpress.com/32/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozblouie.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozblouie.wordpress.com/32/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozblouie.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozblouie.wordpress.com/32/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozblouie.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozblouie.wordpress.com/32/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozblouie.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozblouie.wordpress.com/32/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozblouie.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozblouie.wordpress.com&amp;amp;blog=14429761&amp;amp;post=32&amp;amp;subd=mozblouie&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Sun, 11 Jul 2010 04:05:44 +0000</pubDate>
	<dc:creator>Brian Louie</dc:creator>
</item>
<item>
	<title>Brian Louie: Mozilla Summit 2010: day 2</title>
	<guid isPermaLink="false">http://mozblouie.wordpress.com/?p=27</guid>
	<link>http://mozblouie.wordpress.com/2010/07/09/mozilla-summit-2010-day-2/</link>
	<description>&lt;p&gt;Day two was equally as eventful, interesting, and informative as day one.&lt;/p&gt;
&lt;p&gt;After starting the day with a breakfast highlighted by muffins and yogurt with berries and honey, we were treated to a couple of keynote addresses from Mitchell Baker and Mike Shaver, two of the most prominent Mozillians. They were inspiring; I’ve never felt safer and prouder of Mozilla’s future.&lt;/p&gt;
&lt;p&gt;Soon after, breakout sessions continued. The first breakout session I attended was pretty unique: it compared Mozilla to other nonprofit movements, from the Boy Scouts to Alcoholics Anonymous. Though clearly Mozilla is different from these movements – the difference is especially apparent when analyzing certain of these organizations – but nonetheless there are certain core values that make each of these decentralized organizations successful, from having a unified mission to delineating a specific list of principles. Because precedence has been established, it’s easy to follow these examples and cultivate an effective call to action.&lt;/p&gt;
&lt;p&gt;A few hours (and a delicious lunch with ravioli and peach upside-down cake) later, Mozilla threw a “science fair” in which Mozillians from various departments showed off demos of their hard work. The exhibits were diverse; there were some WebGL demos, some mobile demos with Nokia N900s, and there were Bugzilla-related demos. My favorite was Paul Rouget’s usage of HTML5 in Firefox 4 to do crazy things in his web page, like play videos on rotating cubes and scroll along 3D photo walls, all using just HTML, CSS, and a bit of JavaScript. The hall was clogged around Paul’s table; be sure to take a look at it online after the summit is over!&lt;/p&gt;
&lt;p&gt;The next breakout session I attended discussed the the telling of the Mozilla mission. The session featured consultants from Engine Company 1, a market research firm. With the help of some data they’ve been collecting over the past couple years, the consultants offered some interesting and rather surprising insights, from the “people” Mozilla and its competitors convey to the branding association between parent company and browser to even the way people look at the Mozilla mascot. The main takeaway is that although Mozilla has awesome products (try out the Firefox 4 beta if you haven’t!), its brand image is not as well defined as its offerings. I accepted this as a personal challenge with regard to the developer community. I’ll update my blog as I continue to make progress over the next couple of months.&lt;/p&gt;
&lt;p&gt;Afterward, we were treated to the summit’s World Expo, in which Mozilla branches from countries all around the world set up tables and talked about their countries. I’ll be honest: I really only went to the tables that had free snacks, including some rather interesting salted licorice. But the people were equally interesting! I met programmers from Sweden, marketers from Japan, and community developers from Chile. In short, Mozilla is EVERYWHERE.&lt;/p&gt;
&lt;p&gt;The highlight of the event was definitely the dinner. In honor of the international theme of the event, Mozilla set up three dining rooms, each geographically themed. One room was for Asian, one was for Europe, and one was for the Americas. There was so much food that I got full after eating in just one room! But the food was delicious. Despite being full, I couldn’t help but stuff myself a little bit more.&lt;/p&gt;
&lt;p&gt;The expo more or less marked the rest of the day, minus some barhopping and such. Stick around for updates on day three!&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozblouie.wordpress.com/27/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozblouie.wordpress.com/27/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozblouie.wordpress.com/27/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozblouie.wordpress.com/27/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozblouie.wordpress.com/27/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozblouie.wordpress.com/27/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozblouie.wordpress.com/27/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozblouie.wordpress.com/27/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozblouie.wordpress.com/27/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozblouie.wordpress.com/27/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozblouie.wordpress.com/27/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozblouie.wordpress.com/27/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozblouie.wordpress.com/27/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozblouie.wordpress.com/27/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozblouie.wordpress.com&amp;amp;blog=14429761&amp;amp;post=27&amp;amp;subd=mozblouie&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 10 Jul 2010 01:20:28 +0000</pubDate>
	<dc:creator>Brian Louie</dc:creator>
</item>
<item>
	<title>Jaclyn Fu: Mozilla Summit 2010</title>
	<guid isPermaLink="false">http://mozmobileintern.wordpress.com/?p=107</guid>
	<link>http://mozmobileintern.wordpress.com/2010/07/09/mozilla-summit-2010/</link>
	<description>&lt;p&gt;&lt;em&gt;“Be More Like The Web”, Fairmont Chateau – Whistler, BC, July 6-10&lt;br /&gt;
&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I think I may have lost all my brain cells in my 4 days at Summit from all the mind-blowing that happened. If you’re thinking about interning at Mozilla, I advise you to choose an even-numbered year (or intern twice!) so you don’t miss out on Summit. I always loved Mozilla, our mission, my work, and the people; but my experience this week gave me an invigorated passion and a motivation to truly make the Web a better place.&lt;/p&gt;
&lt;p&gt;I was able to match IRC handles to faces, participate in stimulating discussions on challenges we’re facing, and create new memories that still give me shits and giggles whenever I think about them (&lt;a href=&quot;http://mozblouie.wordpress.com/&quot; target=&quot;_blank&quot;&gt;blouie&lt;/a&gt;, get it?) The keynotes, breakout sessions, and lightning talks raised questions about the future of OUR Web and reinforced that Mozilla is a mover in how users will interact with their browser and the Web. Issues of privacy, communicating the Mozilla mission, the future of Mobile, and building community, contended that Mozilla Firefox will always be on the users’ side. Great products for great people by great people. On this note: Firefox 4 is going to be game-changing. I’m still recovering from the demo of Tab Candy.&lt;/p&gt;
&lt;p&gt;To all the new friends I made: Thank you for the cool conversations and let’s keep in touch.&lt;/p&gt;
&lt;p&gt;For pictures and Twitter feed of the Summit, click &lt;a href=&quot;http://bit.ly/ctLBK7&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozmobileintern.wordpress.com/107/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozmobileintern.wordpress.com/107/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozmobileintern.wordpress.com/107/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozmobileintern.wordpress.com/107/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozmobileintern.wordpress.com/107/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozmobileintern.wordpress.com/107/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozmobileintern.wordpress.com/107/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozmobileintern.wordpress.com/107/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozmobileintern.wordpress.com/107/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozmobileintern.wordpress.com/107/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozmobileintern.wordpress.com/107/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozmobileintern.wordpress.com/107/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozmobileintern.wordpress.com/107/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozmobileintern.wordpress.com/107/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozmobileintern.wordpress.com&amp;amp;blog=13865100&amp;amp;post=107&amp;amp;subd=mozmobileintern&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 09 Jul 2010 21:56:45 +0000</pubDate>
	<dc:creator>Jaclyn Fu</dc:creator>
</item>
<item>
	<title>Wilson Lee: Cross-Domain Requests and Prototype</title>
	<guid isPermaLink="false">http://kourge.net/131 at http://kourge.net</guid>
	<link>http://kourge.net/node/131</link>
	<description>&lt;p&gt;Ever since 3.5, &lt;a href=&quot;http://www.w3.org/TR/cors/&quot;&gt;cross-domain HTTP requests&lt;/a&gt; have been supported in Firefox. Getting this to work may seem easier and saner than piggy-backing Flash (&quot;simply request a URL of different origin in your &lt;code&gt;XMLHttpRequest&lt;/code&gt;!&quot;), but unless you use &lt;a href=&quot;http://jquery.com&quot;&gt;jQuery&lt;/a&gt;, you'll realize that for some reason, cross-domain requests mysteriously fail in your JavaScript framework despite the fact that the server is correctly responding with an appropriate &lt;code&gt;Access-Control-Allow-Origin&lt;/code&gt; header.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://kourge.net/node/131&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 08 Jul 2010 18:47:54 +0000</pubDate>
	<dc:creator>kourge</dc:creator>
</item>
<item>
	<title>Jaclyn Fu: Want to win a Nokia N900? Take the Quiz Challenge!</title>
	<guid isPermaLink="false">http://mozmobileintern.wordpress.com/?p=41</guid>
	<link>http://mozmobileintern.wordpress.com/2010/07/07/want-to-win-a-nokia-n900-take-the-quiz-challenge/</link>
	<description>&lt;p&gt;&lt;em&gt;Firefox 1.1 is available for download in the Ovi Store. Take the weekly Quiz Challenge for your chance to win a Nokia N900.&lt;br /&gt;
&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;The challenge is now closed. Thank you for participating!&lt;br /&gt;
&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://bit.ly/cZ0qpD&quot; target=&quot;_blank&quot;&gt;&lt;/a&gt;&lt;img alt=&quot;Click to take the quiz!&quot; class=&quot;alignnone size-full wp-image-134&quot; height=&quot;298&quot; src=&quot;http://mozmobileintern.files.wordpress.com/2010/07/challenge_quiz.jpg?w=500&amp;amp;h=298&quot; title=&quot;challenge_quiz&quot; width=&quot;500&quot; /&gt;&lt;br /&gt;
&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Challenge&lt;/strong&gt;&lt;br /&gt;
Pass a quiz with a perfect score for a chance to win a Nokia N900. There will be a total of &lt;strong&gt;3 weekly quizzes&lt;/strong&gt; every Wednesday, with the last one ending &lt;strong&gt;Tuesday, July 27th&lt;/strong&gt; 11:59pm PST. The more quizzes you pass the more chances you have to win! Each completed quiz with a score of 100% will enter into a pool where 2 winners are selected.&lt;/p&gt;
&lt;p&gt;We welcome all Firefox mobile enthusiasts of any experience level.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Getting Started&lt;/strong&gt;&lt;br /&gt;
Firefox 1.1 for the Nokia N900 is the newest version of our awesome mobile browser. Don’t know much about it? Here’s a list of useful resources to get you started:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://planet.firefox.com/mobile/&quot; target=&quot;_blank&quot;&gt;Firefox Mobile blogs &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/firefoxformobile&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot;&gt;Demo videos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mozilla.com/en-US/mobile/maemo/&quot; target=&quot;_blank&quot;&gt;Firefox Mobile website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;More information&lt;/strong&gt;&lt;br /&gt;
&lt;span style=&quot;text-decoration: line-through;&quot;&gt;1st Quiz: 7/7 – 7/13&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;text-decoration: line-through;&quot;&gt;2nd Quiz: 7/14 – 7/20&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;text-decoration: line-through;&quot;&gt;Last Quiz: 7/21 – 7/27&lt;/span&gt;&lt;br /&gt;
Announcement of winners: 8/4 – Congrats to our winners! &lt;a href=&quot;http://bit.ly/99Wyh0&quot;&gt;http://bit.ly/99Wyh0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After the deadline of each quiz passes, you will no longer be able to take that quiz. However, you can still continue in the challenge and participate in other quizzes if you miss any.&lt;/p&gt;
&lt;ul&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Stay Connected&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://list-manage.com/subscribe?u=168bf22f976f5a68fe5770d19&amp;amp;id=f76d3a9899&quot; target=&quot;_blank&quot;&gt;Sign up for our Mobile newsletter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.facebook.com/firefoxformobile&quot; id=&quot;hsc9&quot; rel=&quot;external nofollow&quot; target=&quot;_blank&quot; title=&quot;Join     the Firefox for mobile on Facebook&quot;&gt;Join the Firefox for mobile on Facebook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://twitter.com/mozmobile&quot; target=&quot;_blank&quot;&gt;Follow Firefox for  mobile on Twitter&lt;/a&gt;&lt;strong&gt;&lt;br /&gt;
&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Challenge Rules&lt;/strong&gt;&lt;br /&gt;
Please see complete &lt;a href=&quot;https://wiki.mozilla.org/Mobile/Firefox1.1QuizChallengeRules&quot; target=&quot;_blank&quot;&gt;Challenge  Rules&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Questions?&lt;/strong&gt;&lt;br /&gt;
Contact firefoxmobile@mozilla.com or jaclynf on IRC (#mobile, #marketing) for more information.&lt;/p&gt;
&lt;p&gt;Good luck!&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozmobileintern.wordpress.com/41/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozmobileintern.wordpress.com/41/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozmobileintern.wordpress.com/41/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozmobileintern.wordpress.com/41/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozmobileintern.wordpress.com/41/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozmobileintern.wordpress.com/41/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozmobileintern.wordpress.com/41/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozmobileintern.wordpress.com/41/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozmobileintern.wordpress.com/41/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozmobileintern.wordpress.com/41/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozmobileintern.wordpress.com/41/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozmobileintern.wordpress.com/41/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozmobileintern.wordpress.com/41/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozmobileintern.wordpress.com/41/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozmobileintern.wordpress.com&amp;amp;blog=13865100&amp;amp;post=41&amp;amp;subd=mozmobileintern&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 07 Jul 2010 07:00:04 +0000</pubDate>
	<dc:creator>Jaclyn Fu</dc:creator>
</item>
<item>
	<title>Michael Kurze: En Route To Whistler</title>
	<guid isPermaLink="false">http://www.thefoundation.de/feeds/michael/on/mozilla/en-route-whistler</guid>
	<link>http://www.thefoundation.de/michael/2010/jul/06/en-route-whistler/</link>
	<description>&lt;p&gt;The two first weeks as an intern at Mozilla were like a blast. Now we are heading for the worldwide Summit 2010 in Whistler, Mountain View.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;
Independence day with fireworks in SF is just over, and we are already heading back to the city, this time for the airport. In the past two weeks there was not much time for blogging: Mozilla interns BBQ, awesome work at the Metrics team, and Germany advancing past the round of eight in the soccer world cup.
&lt;/p&gt;
&lt;p&gt;
Before I board the plane, I want to share a picture of the custom keyboard I am using at Mozilla:
&lt;/p&gt;
Mission accomplished!
&lt;h4&gt;Update:&lt;/h4&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;http://blog.finette.co.uk/&quot; title=&quot;Pascal Finette&quot;&gt;Pascal&lt;/a&gt; at Mozilla who gave me a keyboard with German layout.&lt;/p&gt;</description>
	<pubDate>Tue, 06 Jul 2010 13:48:05 +0000</pubDate>
	<dc:creator>Michael Kurze</dc:creator>
</item>
<item>
	<title>Michael Kurze: Stirring Kettle</title>
	<guid isPermaLink="false">http://www.thefoundation.de/feeds/michael/on/mozilla/stirring-kettle</guid>
	<link>http://www.thefoundation.de/michael/2010/jul/06/stirring-kettle/</link>
	<description>&lt;p&gt;To work on my intern project at Mozilla, I have learned my way around with &lt;a href=&quot;http://www.pentaho.com/&quot; title=&quot;Pentaho Web Site&quot;&gt;Pentaho Data Integration&lt;/a&gt; (aka Kettle).&lt;/p&gt;&lt;h3&gt;What is this data integration anyways?&lt;/h3&gt;
&lt;p&gt;
At any organization as large as Mozilla, enormous amounts of data are generated, that are potentially useful when making development decisions: We count downloads, up-to-date checks for the &lt;a href=&quot;http://blog.mozilla.com/webdev/tag/blocklist/&quot; title=&quot;On the Mozilla Malware Blocklist&quot;&gt;malware blocklist&lt;/a&gt; and installed addons, and there are webserver logs for the various Mozilla Web sites, the responses for Test Pilot case studies, and so on. 
&lt;/p&gt;
&lt;p&gt;
Such data pieces are generated in large quantities every day. So before the data can be analyzed by the metrics team, it needs to be grouped by common criteria (e.g. by date, language, region or hour of the day). This way, the data sets are summarized and the amount of becomes digestable for statistical tools such as &lt;a href=&quot;http://www.r-project.org/&quot; title=&quot;R Statistics Software Project Site&quot;&gt;R&lt;/a&gt;, Microsoft Excel or OpenOffice Calc.
&lt;/p&gt;
&lt;p&gt;
A data collection that is accessible for analysis in this way is often called a &lt;em&gt;data warehouse&lt;/em&gt;, as it persists data and makes it accessible in consumable quantities. &lt;em&gt;Data integration&lt;/em&gt; is the task of transforming data from various sources into the data warehouse representation.
&lt;/p&gt;

&lt;h3&gt;How does Kettle help here?&lt;/h3&gt;
&lt;p&gt;
Kettle is a powerful node based tool to model and implement data integration tasks. It simple to visually express data transformations without getting lost in a soup of nested function calls and intermingled SQL-statements. 
Nodes in the graph represent transformation steps, while the edges indicate the flow of records. Each step handles one record at a time, allowing for parallel handling of large data sets.
&lt;/p&gt;
&lt;p&gt;
There are lots of predefined steps available to import and export data to and from text/CSV files or database tables, to perform basic calculation, to group and to sort. There are steps for details-lookup, for merging and for splitting of record sets. When manually programmed, such operations require a lot of hand coding and are easy to get wrong. With Kettle, it is just a matter of connecting the right nodes and setting the appropriate configuration. 
&lt;/p&gt;
&lt;p&gt;
Whenever the predefined steps are insufficient, it is possible to write custom steps in JavaScript — or Java if performance is a concern.
&lt;/p&gt;

&lt;h3&gt;No downsides?&lt;/h3&gt;
&lt;p&gt;
Of course, there is always room or improvement, with Pentaho Data Integration especially in the area of usability. On Mac OS X, the visual editor does not use the appropriate shortcuts (it requires you to press ctrl-c instead of cmd-c for copy to clipboard). Also, the node editing is a bit fiddly: The editor for the various transformation steps should be a contextual inspector that automatically shows the editing options for the currently selected steps. Instead, I manually have to open it for each step (that means: all the time).
&lt;/p&gt;

&lt;p&gt;
In the end, Kettle is very useful nonetheless: It allows for headless execution of the created transformations, so that the data integration process can be automated. And it has very good support for regular expressions, allowing for the parsing of fairly complicated source formats.&lt;/p&gt;
&lt;p&gt;If you have to deal with the conversion of file and/or database formats on a regular basis, you might want to give Kettle a try. There is a free community edition of PDI available at the Pentaho website.
&lt;/p&gt;</description>
	<pubDate>Tue, 06 Jul 2010 11:45:59 +0000</pubDate>
	<dc:creator>Michael Kurze</dc:creator>
</item>
<item>
	<title>John Wayne Hill: Firefox Home Tab Concepts</title>
	<guid isPermaLink="false">http://www.johnwaynehill.com/blog/?p=145</guid>
	<link>http://www.johnwaynehill.com/blog/2010/07/01/firefox-home-tab-concepts/</link>
	<description>&lt;p&gt;As you may know, I’ve been doing a lot of &lt;a href=&quot;http://www.johnwaynehill.com/blog/2010/05/26/firefox-home-tab/&quot;&gt;researching and thinking&lt;/a&gt; about post Firefox 4 Home Tab during my internship here at Mozilla. I’ve taken the research I’ve conducted, my colleagues thinking, experience and ideas, along with my own experience and ideas and put together some wireframes. These sketches represent some very basic directions that we could take with the Home Tab.&lt;/p&gt;
&lt;p&gt;It’s important to note that these concepts represent some very basic and rough ideas of what the home tab could look like in the future. These are in no way absolute directions, but rather provide some jumping off points for future work.&lt;/p&gt;
&lt;p&gt;That being said, let’s frame these concepts a bit better.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-145&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I’ve been thinking about the word “Home” and it’s meaning for a while. So, what does it mean and how am I using it?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Home&lt;/strong&gt;: a place to store my stuff. I define home here as a place to store my stuff. This is a very basic definition and certainly does not cover all uses of the word but I’ve found it adequate for my research.&lt;/p&gt;
&lt;p&gt;I’ve also done some research &lt;a href=&quot;http://www.johnwaynehill.com/blog/2010/05/26/firefox-home-tab/&quot;&gt;looking at current ‘start’ pages on the web&lt;/a&gt;, as well as some academic research. Currently most of these ‘start’ pages allow you to collect things, put your things in ‘boxes’, they allow for customization, and usually have some sort of quick access links. But, … they still don’t &lt;strong&gt;understand me&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;What we really need is a better way to organize and collect my online data, all of it. We need a way to help me find stuff I’ve put online, stuff my friends have put online, and general online trends. We need a way of representing the relationships between these things. We need to better understand people’s locations and how that effects browsing habits. Furthermore, we need a way for me to discover new things, not just random things (which is entertaining at times), but things that matter to me.&lt;/p&gt;
&lt;p&gt;I’ve also identified some keywords that I think are important in going forward with my research: Personal, Fast, Digestible, Easy, Stable, Findable, Discoverable, and Delightful.&lt;/p&gt;
&lt;p&gt;With this basic framing in place we can now begin to explore this design space via some concepts.&lt;br /&gt;
&lt;small&gt;(Please note that I did not wireframe all my ideas, concepts, and sketches but rather only a subset of these)&lt;/small&gt;&lt;/p&gt;
&lt;h3&gt;Sessions &amp;amp; Discover&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone size-large wp-image-146&quot; height=&quot;420&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/06/2.-Sessions-Discover-700x420.png&quot; title=&quot;Sessions &amp;amp; Discover&quot; width=&quot;700&quot; /&gt;The Sessions &amp;amp; Discover concept illustrates many ideas. First, you have a basic session restore feature that allows you to save and restore browsing session with ease. The sites feature is basically a location aware list of your favorite bookmarks. The Links feature is a listing of all the links, photos, videos, etc that you have shared across the web; this makes finding these links much easier as they are likely pretty important to you. Next up we have the Discover feature. This feature is a way for Firefox to show you things that you are interested in that you might not have discovered yet. For instance, if you were big into photography, like me, Firefox might ‘know’ this by your browsing history, bookmarks, etc. Firefox could then easily find other websites and applications that you are likely to be interesting to you. On the very right is the Contacts feature. This feature collects all of your contacts from across the web and lets you know who is online in a open, non-platform binding manner.&lt;/p&gt;
&lt;p&gt;Many of these features are included in other concepts below.&lt;/p&gt;
&lt;h3&gt;Drawers&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone size-large wp-image-147&quot; height=&quot;420&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/06/3.-Drawers-700x420.png&quot; title=&quot;Drawers&quot; width=&quot;700&quot; /&gt;The Drawers concept includes features such as Sites, Links, and Contacts. Furthermore it features a Downloads section which lists all of your downloads for greatly findability. History is located on the left side of the browser and slides out, as a drawer, to list your browsing history. Additionally a Discover drawer is located on the right which also slides out and shows things that you could discover.&lt;/p&gt;
&lt;h3&gt;WordPress&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone size-large wp-image-148&quot; height=&quot;420&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/06/4.-Wordpress-700x420.png&quot; title=&quot;Wordpress&quot; width=&quot;700&quot; /&gt;The WordPress concept takes many of the above features and puts them in a very familiar WordPress like layout. This would allow for a more detail per individual feature while still being navigatable. Furthermore, this concept features a Personal Search which allows you to search across all of your personal items, history, links, etc.&lt;/p&gt;
&lt;h3&gt;Post in the Middle&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone size-large wp-image-149&quot; height=&quot;420&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/06/5.-Post-in-the-Middle-700x420.png&quot; title=&quot;Post in the Middle&quot; width=&quot;700&quot; /&gt;The Post in the Middle concept shows many of the same features as the concepts above. Additionally, this concept features a quick post area that allows for quickly posting to a blog; as well as a simple ToDo list.&lt;/p&gt;
&lt;h3&gt;Spokes&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone size-large wp-image-150&quot; height=&quot;420&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/06/6.-Spokes-700x420.png&quot; title=&quot;Spokes&quot; width=&quot;700&quot; /&gt;The Spokes concept is a way to show the relationships of your data to you. You could click on the Sites icon to see your bookmarks, or click on Contacts to see a listing of friends; from there you could dive deeper to take a look at what links you have shared with a particular friend, or what links they have shared with you.&lt;/p&gt;
&lt;h3&gt;Left Nav&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone size-large wp-image-151&quot; height=&quot;420&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/06/7.-Left-Nav-700x420.png&quot; title=&quot;Left Nav&quot; width=&quot;700&quot; /&gt;The Left Nav is a concept that shows greater details for each feature while still providing easy, very common, navigation.&lt;/p&gt;
&lt;h3&gt;Grid&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone size-large wp-image-152&quot; height=&quot;420&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/06/8.-Grid-700x420.png&quot; title=&quot;Grid&quot; width=&quot;700&quot; /&gt;The Grid concept is a way to show lots of information in an overview like state. Individual items could be drilled down into to see more detail and information. Furthermore, this concept has a Web Clips feature which would allow you to ‘clip’ a certain part of a website and have it shown and updated on your home page (shopping for prices, game scores, etc). The Events feature shows you events in your local area that you might be interested and could also pull information in from various calendars.&lt;/p&gt;
&lt;h3&gt;As a Site&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone size-large wp-image-153&quot; height=&quot;420&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/06/9.-As-a-Site-700x420.png&quot; title=&quot;As a Site&quot; width=&quot;700&quot; /&gt;The As a Site concept shows what Firefox Home Tab could look like as a website. This could allow you to use a friends computer, but log into Firefox and have access to all of your data.&lt;/p&gt;
&lt;h3&gt;Timeline&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone size-large wp-image-154&quot; height=&quot;420&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/06/10.-Timeline-700x420.png&quot; title=&quot;Timeline&quot; width=&quot;700&quot; /&gt;The Timeline concept shows your history, discovery items, and trending topics in a timeline view. This view shows history along a timeline as well as showing ‘future history’, Discovery towards the front. This allows for a great mental model of things that you might be interested in going to, but have not yet visited. Individual favicons would be displayed along the top of the line if a topic/website is trending across the web or below the line if a topic/website is more personal to just you. Each favicon could be clicked to see more information. Additionally, a slider along the bottom of the page allows for different zoom levels to get a broad or vary narrow view of your personal timeline.&lt;/p&gt;
&lt;h3&gt;Hitchhiker’s Guide&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone size-large wp-image-155&quot; height=&quot;420&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/06/11.-Hitchhikers-Guide-700x420.png&quot; title=&quot;Hitchhiker's Guide&quot; width=&quot;700&quot; /&gt;The Hitchhiker’s Guide concept is directly inspired from the book interface of the movie. This provides a delightful way of exploring your personal information gathered from across the web.&lt;/p&gt;
&lt;h3&gt;Feedback, Critique, and Future Directions&lt;/h3&gt;
&lt;p&gt;I presented these ideas and concepts to the Firefox UX team, of which I’m a proud proud member! My colleagues gave me great feedback, critique, and suggestions. Some feedback that I recieved was that there wasn’t always a clear visual hierarchy to these designs, there was a desire to see other firefox content within these concepts, that clips and contacts are great, worry about how to show different web applications (not app tabs), a worry about Links vs Sites, thoughts on how to scale these ideas to other devices, thoughts on sharing things via the browser, comments on how to make Firefox Home Tab more personal, as well as how to show that things are private and secure, and much much more.&lt;/p&gt;
&lt;p&gt;Future directions include iterating on these and other ideas, ideating on my colleagues great feedback and critique, and getting more public feedback. Furthermore, I wish to explore more design inspiration for future interfaces. I also wish to further think about how concepts might scale to other devices, and how to make the home tab much more personal.&lt;/p&gt;</description>
	<pubDate>Thu, 01 Jul 2010 18:10:29 +0000</pubDate>
	<dc:creator>John Wayne</dc:creator>
</item>
<item>
	<title>Michael Kurze: 72 Hours at Mozilla</title>
	<guid isPermaLink="false">http://www.thefoundation.de/feeds/michael/on/mozilla/72-hours-mozilla</guid>
	<link>http://www.thefoundation.de/michael/2010/jun/24/72-hours-mozilla/</link>
	<description>&lt;p&gt;On Monday, my internship at Mozilla started, and I &lt;em&gt;can&lt;/em&gt; tell you how great it is. Since everything is open source anyway, I am actually encouraged to blog and talk about my work there.&lt;/p&gt;&lt;p&gt;Mozilla has more than a hundred people at its headquarters in Mountain View, while even more contributors work from all around the world. There are more than thirty other interns here, involved in various projects from mobile development, to metrics (such as myself), to developer engagement. I am going to write more about the data integration project I am working on, but first I want to give a quick impression of what an internship at Mozilla entails.&lt;/p&gt;

&lt;p&gt;
&lt;/p&gt;

&lt;p&gt;There are various benefits that help you to relax when you need to, and to focus on your work otherwise. For example free snacks and drinks (even beer) are provided for everyone, there are some big screen TV sets (yes, I watched the German team advance in the World Cup today, wooot), as well as pool and ping pong tables.&lt;/p&gt;

&lt;p&gt;Also, there are &lt;strong&gt;lots&lt;/strong&gt; of small conference rooms, so whenever you need some quiet for work and/or a phone call, you can find a spot, or just hang out at &lt;em&gt;Ten Forward&lt;/em&gt; which is like a bar, a living room and a cinema in one. Funny thing: All conference rooms are either inspired by the Star Trek series, or pick up on classic internet memes. Other than Ten Forward, there are for example &lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Holodeck&quot; title=&quot;Wikipedia: Holodeck&quot;&gt;Holodeck&lt;/a&gt;&lt;/em&gt; (where new interns are trained), &lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/All_your_base&quot; title=&quot;Wikipedia: All your Base&quot;&gt;All your Base&lt;/a&gt;&lt;/em&gt; and the &lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Bikeshed&quot; title=&quot;Wikipedia: Parkinson’s Law of Triviality&quot;&gt;Bikeshed&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Every Monday after the all-hands meeting there is free food for everyone, and every Wednesday evening there is Intern Movie Night (we watched &lt;a href=&quot;http://www.imdb.com/title/tt0390384/&quot; title=&quot;IMDB: Primer&quot;&gt;Primer&lt;/a&gt; tonight: great, but mind-boggling). Yesterday, I was at lunch with the Metrics Team: There is some great &lt;a href=&quot;http://www.thecantankerousfish.com/&quot;&gt;seafood&lt;/a&gt; to be had in mountain view.&lt;/p&gt;

&lt;p&gt;In July, there will be the Mozilla Summit in Whistler, Canada. I will make sure to write about that, too.&lt;/p&gt;</description>
	<pubDate>Thu, 24 Jun 2010 08:42:50 +0000</pubDate>
	<dc:creator>Michael Kurze</dc:creator>
</item>
<item>
	<title>Michael Kurze: Going to Mozilla</title>
	<guid isPermaLink="false">http://www.thefoundation.de/feeds/michael/on/mozilla/going-mozilla</guid>
	<link>http://www.thefoundation.de/michael/2010/jun/18/going-mozilla/</link>
	<description>&lt;p&gt;Starting on Monday, June 21 I am going to intern at the &lt;a href=&quot;http://www.mozilla.com&quot; title=&quot;mozilla.com&quot;&gt;Mozilla Corporation&lt;/a&gt; (MoCo) in Mountain View, California. Yay!&lt;/p&gt;&lt;p&gt;
For quite some time I have been following the &lt;a href=&quot;http://mozillazine.org&quot; title=&quot;mozillaZine&quot;&gt;mozine&lt;/a&gt; and later &lt;a href=&quot;http://planet.mozilla.org&quot; title=&quot;Planet Mozilla&quot;&gt;PMO&lt;/a&gt;. 
So I am absolutely thrilled to have this opportunity, and this also means that this blog will get a new
&lt;a href=&quot;http://www.thefoundation.de/michael/on/mozilla&quot; title=&quot;Articles on Mozilla&quot;&gt;topic&lt;/a&gt; added. Not only will I get to know many more interns with whom I am going to live in &lt;a href=&quot;http://en.wikipedia.org/wiki/Mountain_View,_California&quot; title=&quot;Mountain View (Wikipedia)&quot;&gt;Mountain View&lt;/a&gt;, and not only will I participate in the Mozilla project together with all the great people at the MoCo HQ. But also I will be attending the Mozilla Summit, the biennial meeting of people from all over the world that made great projects such as the Firefox web browser and &lt;a href=&quot;http://addons.mozilla.org&quot; title=&quot;Mozilla Addons&quot;&gt;AMO&lt;/a&gt; possible.
&lt;/p&gt;

&lt;p&gt;
My internship position will be at the &lt;a href=&quot;http://blog.mozilla.com/metrics/&quot; title=&quot;Mozilla Blog of Metrics&quot;&gt;metrics department&lt;/a&gt; led by Ken Kovash and quite probably I will be allowed to go into the details of my project there, either at this blog or at a Mozilla blog.
&lt;/p&gt;

Leaving for CA

&lt;p&gt;
If you plan to go abroad to the U.S. for an internship, I suggest you apply for the internship position(s) of your choice at least two months before the actual start of the internship. I was a bit late to the party and that led to a rather tight schedule: As a Germany based student at RWTH Aachen University, I had to invest some time in getting the visa. But fortunately there is a very helpful &lt;a href=&quot;http://cicdgo.com/&quot; title=&quot;CICD&quot;&gt;visa sponsoring partner&lt;/a&gt;, so everything went smoothly after all. 
&lt;/p&gt;

&lt;p&gt;
I do not know about other areas, but as a student in computer science you can expect compensation for an internship in the U.S. which is not necessarily the case in Germany. I applied at two organizations, and in both cases their offers covered living expenses and the flight to California. So I really do recommend that next spring you visit the web site of any company or organization you always wanted to get to know, and apply for an internship there. Make sure that the professional and academic experience on your resume matches the position you apply for, and prepare for two to three phone interviews.
&lt;/p&gt;</description>
	<pubDate>Fri, 18 Jun 2010 17:07:33 +0000</pubDate>
	<dc:creator>Michael Kurze</dc:creator>
</item>
<item>
	<title>John Wayne Hill: Perceived Speed Performace</title>
	<guid isPermaLink="false">http://www.johnwaynehill.com/blog/?p=128</guid>
	<link>http://www.johnwaynehill.com/blog/2010/06/16/perceived-speed-performace/</link>
	<description>&lt;p&gt;Firefox is fast, no doubt about it. But for many people it feels pretty slow when starting up. Chrome, while only marginally faster than Firefox at starting, feels much faster. By analyzing videos of these start-up processes we can start to understand what makes Firefox feel slow.&lt;/p&gt;
&lt;p&gt;First, last start with some definitions of browser start-up events.&lt;/p&gt;
&lt;ul class=&quot;contentList noIndent&quot;&gt;
&lt;li&gt;&lt;strong&gt;Before Spinner:&lt;/strong&gt; the time from when the user clicks the application icon to when the spinner starts running.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spinner Running:&lt;/strong&gt; the time while the spinner is actually running (may appear and disappear).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Before Window Draw:&lt;/strong&gt; the time from when the spinner stops running until the window begins drawing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Window Drawing:&lt;/strong&gt; the time from when the window starts drawing until the title bar comes into view.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Drawing Title Bar:&lt;/strong&gt; the time it takes the title bar to come into view.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Window Done Drawing:&lt;/strong&gt; the time it takes for the window to draw after the title bar is seen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Drawing Chrome:&lt;/strong&gt; the time it takes for the browser chrome to be drawn.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Website Drawn:&lt;/strong&gt; the time it takes for the entire website to be drawn (different websites used).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Close Window:&lt;/strong&gt; the time it takes from when a users presses the close button on the browser until when the browser is no longer shown.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Active Icon Disappears:&lt;/strong&gt; the time it takes from when the browser is no longer shown until the application is no longer running.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“Fresh”:&lt;/strong&gt; brand new profile; standard set of plugins enabled: Acrobat, Google Update, Java Deployment Toolkit, Java(TM) platofmr SE 6 U20, Microsoft Office 2010, Shockwave Flash, Silverlight, WPI Detector 1.1&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“Full”:&lt;/strong&gt; fresh profile (only the history data used to create the 50 bookmarks below); standard set of plugins; 50 bookmarks (the 50 top alexa global sites); 5 tabs in the session (google, facebook, youtube, wikipedia, live.com); 2 common add-ons installed (ietab and adblock plus)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span id=&quot;more-128&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Videos&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;My colleague Alex Faaborg shot the following videos with an SLR at 60fps. Furthermore he created a very small application that would show time flying by in milliseconds. He then loaded up each browser, with different configurations, three times each.&lt;/p&gt;
&lt;p&gt;Firefox Fresh (no plugins): &lt;a href=&quot;http://www.youtube.com/watch?v=HtC7XVdq8Ko&quot;&gt;http://www.youtube.com/watch?v=HtC7XVdq8Ko&lt;/a&gt;&lt;br /&gt;
Firefox vs Chrome (Fresh): &lt;a href=&quot;http://www.youtube.com/watch?v=S3oLFHkeCco&quot;&gt;http://www.youtube.com/watch?v=S3oLFHkeCco&lt;/a&gt;&lt;br /&gt;
Firefox vs Chrome (Full): &lt;a href=&quot;http://www.youtube.com/watch?v=t7uAFp4gRq4&quot;&gt;http://www.youtube.com/watch?v=t7uAFp4gRq4&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;General Observations&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Spinner Count:&lt;/strong&gt; Upon starting Firefox, the spinner graphic is shown (and disappears) a total of three times, meanwhile in Chrome the graphic is only shown twice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Window Drawing:&lt;/strong&gt; In Firefox, the window is drawn (animated to size), then the browser chrome is drawn, then the website is drawn. In Chrome, the window and browser chrome is drawn all at once and then the web- site is drawn. This helps Chrome to feel faster because there is less visually going on at different times. Firefox feels very sequential in it’s loading, while Chrome seems to do everything at once. This allows Chrome to feel fast because once the window is animated the size, everything is pretty much ready to go. This is especially true if google.com is set as your homepage on Chrome.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Webpage Drawing:&lt;/strong&gt; In Chrome the webpage loading icon is fairly small and is never ‘fully’ seen. While in Firefox the loading icon is large, grey, and can always be seen in it’s entirety. This is visually ‘bloated’ and makes Firefox seems slower. Furthermore, because Chrome’s loading icon animation goes ‘around’ faster, Firefox’s loading icon takes more time (seemingly) to get ‘around’.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Page Title:&lt;/strong&gt; In Firefox, a page’s title is shown on the tab right away, while in Chrome the title is not shown un- til the website has completed loading. This is a simple trick that allows Chrome to feel faster in that once the title is shown, the page is ready. While in Firefox, a page’s title makes it seem like a page has loaded but&lt;br /&gt;
in fact the page isn’t ready to be interacted with quite yet and the user has to ‘wait longer’.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Graphs&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The following graphs show the average time, in milliseconds, each event takes to ‘complete’.&lt;/p&gt;

&lt;a href=&quot;http://www.johnwaynehill.com/blog/2010/06/16/perceived-speed-performace/firefox/&quot; title=&quot;Firefox&quot;&gt;&lt;img alt=&quot;Firefox&quot; class=&quot;attachment-thumbnail&quot; height=&quot;50&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/06/Firefox-50x50.jpg&quot; title=&quot;Firefox&quot; width=&quot;50&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.johnwaynehill.com/blog/2010/06/16/perceived-speed-performace/fresh/&quot; title=&quot;Fresh&quot;&gt;&lt;img alt=&quot;Fresh&quot; class=&quot;attachment-thumbnail&quot; height=&quot;50&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/06/Fresh-50x50.jpg&quot; title=&quot;Fresh&quot; width=&quot;50&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.johnwaynehill.com/blog/2010/06/16/perceived-speed-performace/full/&quot; title=&quot;Full&quot;&gt;&lt;img alt=&quot;Full&quot; class=&quot;attachment-thumbnail&quot; height=&quot;50&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/06/Full-50x50.jpg&quot; title=&quot;Full&quot; width=&quot;50&quot; /&gt;&lt;/a&gt;

&lt;h3&gt;Explanation of Deltas&lt;/h3&gt;
&lt;p&gt;In the Firefox vs Chrome Fresh Installs graph, Firefox was loaded up with the default minefield page. This page is significantly heavier (both in text and images) than the Chrome Fresh Installs default page (google.com).&lt;/p&gt;
&lt;p&gt;It should also be noted that Chrome draws the window and browser chrome at the same time.&lt;/p&gt;
&lt;p&gt;In the Firefox vs Chrome Full graph, Firefox was loaded with at least four tabs while Chrome was only loaded with one tab (google.com). This has a significant affect on the Window Drawing time and the Close Window time (diaglog box that informs of closing multiple tabs opens and needs to be closed first).&lt;/p&gt;
&lt;h3&gt;Recommend Actions&lt;/h3&gt;
&lt;p&gt;With just a few changes in the Firefox start-up process, we could greatly enhance the feeling of Firefox’s speed. The changes listed below are recommendations to help better the overall Firefox experience.&lt;/p&gt;
&lt;ul class=&quot;contentList noIndent&quot;&gt;
&lt;li&gt;Draw the OS spinner icon as little as possible, but one solid break isn’t bad and might be better than one really long spinner.&lt;/li&gt;
&lt;li&gt;Draw the browser chrome while the window is being animated (drawn) to size. So that most of the drawing happens simultaneously rather than sequentially.&lt;/li&gt;
&lt;li&gt;Make a new ‘website loading’ icon with less visual weight that animates faster but is slightly larger (would allow a user to ‘see’ the faster animation).&lt;/li&gt;
&lt;li&gt;‘Lazy’ load tabs that are being restored (already being talked about).&lt;/li&gt;
&lt;li&gt;Load upgrades and add-on updates upon browser close, not browser start.&lt;/li&gt;
&lt;li&gt;Delay loading the website’s title until the website is ready for interaction.&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Wed, 16 Jun 2010 21:25:19 +0000</pubDate>
	<dc:creator>John Wayne</dc:creator>
</item>
<item>
	<title>Jaclyn Fu: Lock and Loaded</title>
	<guid isPermaLink="false">http://mozmobileintern.wordpress.com/?p=29</guid>
	<link>http://mozmobileintern.wordpress.com/2010/06/16/lock-and-loaded/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://blog.mozilla.com/blog/2010/05/26/firefox-home-coming-soon-to-the-iphone/&quot; target=&quot;_blank&quot;&gt;Firefox Home for the iPhone&lt;/a&gt; and &lt;a href=&quot;http://starkravingfinkle.org/blog/2010/04/firefox-1-1-beta-1-for-maemo/&quot; target=&quot;_blank&quot;&gt;Firefox 1.1 for the Nokia N900&lt;/a&gt; are about to go live soon! So what have I been doing to help support these launches?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;With the submission of Firefox Home, we’re going to launch an &lt;strong&gt;iPhone skin design challenge&lt;/strong&gt; through the &lt;a href=&quot;http://creative.mozilla.org/&quot; target=&quot;_blank&quot;&gt;Creative Collective&lt;/a&gt; to find the coolest looking designs. Get those creative juices flowing! Be on the lookout later in June.&lt;/li&gt;
&lt;li&gt;Firefox 1.1 is an awesome mobile browser, but you’ll need a Nokia N900 in order to experience it. Don’t have one? We got you covered! A &lt;strong&gt;quiz challenge&lt;/strong&gt; will also be launched later in June that will feature TWO Nokia N900 phones as grand prizes. Start &lt;a href=&quot;http://planet.firefox.com/mobile/&quot; target=&quot;_blank&quot;&gt;reading up&lt;/a&gt; about Firefox 1.1 in the mean time so you have the best chances of winning!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To find out more information, tune in to the bi-weekly &lt;a href=&quot;http://www.spreadfirefox.com/cmt&quot; target=&quot;_blank&quot;&gt;Community Marketing Calls&lt;/a&gt; or the IRC #mobile channel.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozmobileintern.wordpress.com/29/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozmobileintern.wordpress.com/29/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozmobileintern.wordpress.com/29/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozmobileintern.wordpress.com/29/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozmobileintern.wordpress.com/29/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozmobileintern.wordpress.com/29/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozmobileintern.wordpress.com/29/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozmobileintern.wordpress.com/29/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozmobileintern.wordpress.com/29/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozmobileintern.wordpress.com/29/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozmobileintern.wordpress.com/29/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozmobileintern.wordpress.com/29/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozmobileintern.wordpress.com/29/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozmobileintern.wordpress.com/29/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozmobileintern.wordpress.com&amp;amp;blog=13865100&amp;amp;post=29&amp;amp;subd=mozmobileintern&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Wed, 16 Jun 2010 17:41:20 +0000</pubDate>
	<dc:creator>Jaclyn Fu</dc:creator>
</item>
<item>
	<title>Brian Krausz: How to Dispose of a Hard Drive</title>
	<guid isPermaLink="false">http://nerdlife.net/?p=319</guid>
	<link>http://feedproxy.google.com/~r/nerdlife/~3/ot3xRyObqhY/</link>
	<description>&lt;p&gt;In 5 easy steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Find hammer&lt;/li&gt;
&lt;li&gt;Give up on finding hammer…grab pliers&lt;/li&gt;
&lt;li&gt;Attack drive with pliers, destorying circuitry but leaving platters untouched&lt;/li&gt;
&lt;li&gt;Cut finger, swear and bleed profusely on drive&lt;/li&gt;
&lt;li&gt;Repeat steps 3 &amp;amp; 4 until you realize that nobody cares enough about your data to read it directly from platters.  Toss drive in trash, go grab a band-aid&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tada!&lt;/p&gt;
&lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/nerdlife/~4/ot3xRyObqhY&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 03 Jun 2010 01:50:40 +0000</pubDate>
	<dc:creator>Brian</dc:creator>
</item>
<item>
	<title>Jaclyn Fu: Off to the Races</title>
	<guid isPermaLink="false">http://mozmobileintern.wordpress.com/?p=15</guid>
	<link>http://mozmobileintern.wordpress.com/2010/05/29/get-to-work/</link>
	<description>&lt;p&gt;The first three days were fun, but getting started on my projects for the summer is even better! I had my 1 on 1 meeting with Caitlin and we sat down to identify objectives and which of my ideas met those objectives.  It’s so exciting to have your ideas recognized and to be put into place, especially as an intern – there’s no coffee fetching here (only if it’s for yourself)! At Mozilla, interns have just as much responsibility and accountability as regular employees. Love it. I have full control over my projects and creative input in everything I want to do.&lt;/p&gt;
&lt;p&gt;My first task was to write creative briefs on the ideas I’m proposing to help drive downloads for Firefox Home and Firefox 1.1 on the Nokia N900. Firefox Home is an iPhone application that will sync your desktop and mobile phone with all of your Firefox history, tabs and bookmarks so that you can just get up and go with all your stuff. Pretty handy for people like me who hate typing out lengthy URLS and who always forget passwords. If you have a N900, download Firefox 1.1 and check out how features like the Awesome Bar, Add-Ons, and Firefox Sync can make your mobile browsing experience even better.&lt;/p&gt;
&lt;p&gt;Writing the creative briefs reminded me of writing case briefs for marketing class. It’s definitely a lot harder to write a proposal completely off of your own idea than analyzing a previous case. But with them almost complete, I have already started talking to different Mozillians and got the ball rolling on putting things together. Can’t wait to see them at materialization!&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozmobileintern.wordpress.com/15/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozmobileintern.wordpress.com/15/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozmobileintern.wordpress.com/15/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozmobileintern.wordpress.com/15/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozmobileintern.wordpress.com/15/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozmobileintern.wordpress.com/15/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozmobileintern.wordpress.com/15/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozmobileintern.wordpress.com/15/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozmobileintern.wordpress.com/15/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozmobileintern.wordpress.com/15/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozmobileintern.wordpress.com/15/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozmobileintern.wordpress.com/15/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozmobileintern.wordpress.com/15/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozmobileintern.wordpress.com/15/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozmobileintern.wordpress.com&amp;amp;blog=13865100&amp;amp;post=15&amp;amp;subd=mozmobileintern&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Sat, 29 May 2010 17:31:02 +0000</pubDate>
	<dc:creator>Jaclyn Fu</dc:creator>
</item>
<item>
	<title>Brian Krausz: Diaspora’s Upfront Costs</title>
	<guid isPermaLink="false">http://nerdlife.net/?p=307</guid>
	<link>http://feedproxy.google.com/~r/nerdlife/~3/4TpAr-S_Wx4/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://news.ycombinator.com/item?id=1380942&quot;&gt;This post on Hacker News&lt;/a&gt; got me thinking about the costs &lt;a href=&quot;http://www.kickstarter.com/projects/196017994/diaspora-the-personally-controlled-do-it-all-distr&quot;&gt;Dispora&lt;/a&gt;‘s going to have receiving all of their money and fulfilling their promises, so I did a little digging.  The numbers below are estimates, but they should be fairly close to actual costs for these services (assuming no huge burst in donations over the next 6 days):&lt;/p&gt;
&lt;pre&gt;$ 5510 = $190k * 2.9% Amazon fees[1]
  1800 = 6k donations * $0.30 Amazon fees
  9500 = $190k * 5% for Kickstarter
  4150 = 5000 cds with jewel cases * $0.83 (random googling, I assume the &quot;note from our team&quot; will be on the jewel case insert)
  1380 = 400 sheets of stickers * $3.45 (zazzle, 20 sheet of stickers, 2 stickers per person)
 10200 = 3000 shirts * $3.40 (customink, Gildan 50/50 1 color on white front only)
  9000 = 3000 postage &amp;amp; packaging for shirts + stickers * $3
  2000 = 2000 postage &amp;amp; packaging for just stickers * $1
  1200 = &quot;Turnkey hosting&quot; for 600 people[2]
  2800 = 4 new computers*$700
======
$47540&lt;/pre&gt;
&lt;p&gt;&lt;small&gt;[1] I’m not sure if Kickstarter gets a bulk discount here, or if it’s Dispora’s account history, so a volume discount may apply.  I also assume all transactions are billed at the $10+ rate (2.9%) rather than the &amp;lt; $10 rate (5%) for simplicity.&lt;br /&gt;
[2] Turnkey hosting and phone support are hard to estimate...it may be more if they need to pay for phone support, but I think this is a reasonable number.  I'm also including project hosting costs.  I know they say plenty of hosting companies have offered their services, but you can't guarantee that will be there.&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Keep in mind that this misses three big points:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Declined credit cards &amp;amp; canceled/fraudulent donations – I have no clue what the expected amount of these is&lt;/li&gt;
&lt;li&gt;People who requested a gift for donating who never give their contact info&lt;/li&gt;
&lt;li&gt;The huge overhead for packing/sending all of these items, though I imagine a day of pizza and soda for volunteers can get all of them packed (the con I used to help run had similar “mailing parties” that were fairly effective)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With that in mind you’re looking at about 25% of the funding going toward transaction fees and fulfilling the rewards.  This leaves around $142,000 left for them, which is still plenty of money.  Though I don’t want to think about what an accountant would say about this money and how much he would charge to make it legitimate.&lt;/p&gt;
&lt;p&gt;Don’t get me wrong: I think Diaspora is a great idea and I’d love to see it succeed, but I wonder if the founders considered the logistical overhead to this whole thing.  Granted, this would have been smaller had they only raised $10k, but it’s still a big task to undertake.  I hope they’re ready for it and they don’t let us down.&lt;/p&gt;
&lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/nerdlife/~4/4TpAr-S_Wx4&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 27 May 2010 03:08:55 +0000</pubDate>
	<dc:creator>Brian</dc:creator>
</item>
<item>
	<title>Brian Krausz: Boston WordPress Meetup Example Code</title>
	<guid isPermaLink="false">http://nerdlife.net/?p=289</guid>
	<link>http://feedproxy.google.com/~r/nerdlife/~3/MIoKSPLgz14/</link>
	<description>&lt;p&gt;As promised here’s the example code from the meetup I gave last Monday.  It’s fairly small, so I only describe what it does briefly in the top comment.  Feel free to use it how you wish (though if you make a lot of money off of it you owe me a t-shirt):&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-289&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h5&gt;Example 1: Erroring out on install&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;register_activation_hook(__FILE__, 'bostonwp_install_error');

if('error_scrape' == $_GET['action'] &amp;amp;&amp;amp; basename($_SERVER['PHP_SELF']) == 'plugins.php') {
    echo '&amp;lt;pre&amp;gt;' . get_option('bostonwp_activate_error') . '&amp;lt;/pre&amp;gt;';
    delete_option('bostonwp_activate_error');
    deactivate_plugins($_GET['plugin']);
    die();
}

function bostonwp_install_error($error = false) {
    if(!$error) {
        $error = 'Generic Error Occurred';
    }
    add_option('bostonwp_activate_error', $error);
    //trigger a fatal error
    trigger_error('', E_USER_ERROR);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h5&gt;Example 2: Updating your DB structure&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;// http://codex.wordpress.org/Creating_Tables_with_Plugins

define('BOSTONWP_DB_VERSION', '1.0');

register_activation_hook(__FILE__, 'bostonwp_install');

$wpdb-&amp;gt;bostonwp = $wpdb-&amp;gt;prefix . 'bostonwp';

function bostonwp_install() {
    global $wpdb;

    $installed_ver = get_option( 'bostonwp_db_version' );

    $sql = 'CREATE TABLE ' . $wpdb-&amp;gt;bostonwp . ' (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        time bigint(11) DEFAULT 0 NOT NULL,
        name tinytext NOT NULL,
        text text NOT NULL,
        url VARCHAR(55) NOT NULL,
        UNIQUE KEY id (id)
        );';

    if($wpdb-&amp;gt;get_var('show tables like &quot;' . $wpdb-&amp;gt;bostonwp . '&quot;') != $wpdb-&amp;gt;bostonwp) {
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);

        $welcome_name = 'Mr. WordPress';
        $welcome_text = 'Congratulations, you just completed the installation!';

        $insert = 'INSERT INTO ' . $wpdb-&amp;gt;bostonwp .
            ' (time, name, text) ' .
            'VALUES (' . time() . ',&quot;' . $wpdb-&amp;gt;escape($welcome_name) . '&quot;,&quot;' . $wpdb-&amp;gt;escape($welcome_text) . '&quot;)&quot;';

        $results = $wpdb-&amp;gt;query( $insert );

        add_option(&quot;bostonwp_db_version&quot;, BOSTONWP_DB_VERSION);
    }
    elseif( $installed_ver != BOSTONWP_DB_VERSION ) {
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);

        update_option( &quot;bostonwp_db_version&quot;, BOSTONWP_DB_VERSION );
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h5&gt;Example 3: Adding admin menus&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;// http://codex.wordpress.org/Adding_Administration_Menus

add_action('admin_menu', 'bostonwp_menu');
function bostonwp_menu() {
    add_posts_page('My Page', 'My Page', 'manage_categories', 'bostonwp_page', 'bostonwp_dostuff');
}

function bostonwp_dostuff() {
?&amp;gt;
    &amp;lt;div class=&quot;wrap&quot;&amp;gt;
        &amp;lt;?php if(function_exists('screen_icon')) screen_icon(); ?&amp;gt;
        &amp;lt;h2&amp;gt;My Boston WP Page&amp;lt;/h2&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;?php
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h5&gt;Example 4: Adding meta boxes to posts&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;// http://www.deluxeblogtips.com/2010/04/how-to-create-meta-box-wordpress-post.html

add_action('add_meta_boxes_post', 'bostonwp_box');
add_action('save_post', 'bostonwp_save');
add_action('delete_post', 'bostonwp_delete');

function bostonwp_box($post) {
    // http://codex.wordpress.org/Function_Reference/add_meta_box
    add_meta_box('bostonwp', __('Boston WP'), 'bostonwp_meta_box', 'post', 'side');
}

function bostonwp_meta_box() {
    global $post;
    $val = get_post_meta($post-&amp;gt;ID, 'bostonwp', true);

    // Use nonce for verification
    echo '&amp;lt;input type=&quot;hidden&quot; name=&quot;bostonwp_nonce&quot; id=&quot;bostonwp_nonce&quot; value=&quot;' . wp_create_nonce( plugin_basename(__FILE__) ) . '&quot; /&amp;gt;';

    // The actual fields for data entry
    echo '&amp;lt;input type=&quot;checkbox&quot; name=&quot;bostonwp&quot; value=&quot;1&quot; ' . ($val ? ' checked=&quot;checked&quot; ' : '') . ' /&amp;gt;';
    echo '&amp;lt;label for=&quot;bostonwp&quot;&amp;gt;' . __('There Is Cake!') . '&amp;lt;/label&amp;gt; ';
}

function bostonwp_save($id) {
    // verify nonce
    if ($_POST['action'] != 'inline-save' &amp;amp;&amp;amp; !wp_verify_nonce($_POST['bostonwp_nonce'], plugin_basename(__FILE__))) {
        return $id;
    }

    // check autosave
    if (defined('DOING_AUTOSAVE') &amp;amp;&amp;amp; DOING_AUTOSAVE) {
        return $id;
    }

    update_post_meta($id, 'bostonwp', $_POST['bostonwp']);
}

function bostonwp_delete($id) {
    delete_post_meta($id, 'bostonwp');
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h5&gt;Example 5: Adding columns to post list&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;add_filter('manage_posts_columns', 'bostonwp_posts_column');
add_action('manage_posts_custom_column', 'bostonwp_manage_column', 10, 2);

function bostonwp_posts_column($cols) {
    $cols['bostonwp'] = __('Boston WP');
    return $cols;
}

function bostonwp_manage_column($name, $id) {
    if($name != 'bostonwp') {
        return;
    }
    $cake = get_post_meta($id, 'bostonwp', true);
    if($cake) {
        echo 'There is cake!';
        $cake = 1;
    }
    else {
        echo 'The cake is a lie!';
        $cake = 0;
    }
    echo '&amp;lt;div id=&quot;inline_' . $id . '_bostonwp&quot; class=&quot;hidden&quot;&amp;gt;' . $cake . '&amp;lt;/div&amp;gt;';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h5&gt;Example 6: Expanding Quick Edit&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;add_action('quick_edit_custom_box', 'bostonwp_posts_custom_box', 10, 2);
add_action('admin_head-edit.php', 'bostonwp_add_script');

function bostonwp_posts_custom_box($col, $type) {
    if($col != 'bostonwp' || $type != 'post') {
        return;
    }
?&amp;gt;
&amp;lt;fieldset class=&quot;inline-edit-col-right&quot;&amp;gt;&amp;lt;div class=&quot;inline-edit-col&quot;&amp;gt;
    &amp;lt;div class=&quot;inline-edit-group&quot;&amp;gt;
        &amp;lt;label class=&quot;alignleft&quot;&amp;gt;
            &amp;lt;input type=&quot;checkbox&quot; value=&quot;1&quot; name=&quot;bostonwp&quot; id=&quot;bostonwp_check&quot;&amp;gt;
            &amp;lt;span class=&quot;checkbox-title&quot;&amp;gt;This Post Has Cake&amp;lt;/span&amp;gt;
        &amp;lt;/label&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/fieldset&amp;gt;
&amp;lt;?php
}

function bostonwp_add_script() {
?&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
jQuery(document).ready(function() {
    jQuery('a.editinline').live('click', function() {
        var id = inlineEditPost.getId(this);
        var val = parseInt(jQuery('#inline_' + id + '_bostonwp').text());
        jQuery('#bostonwp_check').attr('checked', !!val);
    });
});
&amp;lt;/script&amp;gt;
&amp;lt;?php
}
&lt;/code&gt;&lt;/pre&gt;
&lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/nerdlife/~4/MIoKSPLgz14&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 27 May 2010 02:01:50 +0000</pubDate>
	<dc:creator>Brian</dc:creator>
</item>
<item>
	<title>John Wayne Hill: Firefox Home Tab</title>
	<guid isPermaLink="false">http://www.johnwaynehill.com/blog/?p=111</guid>
	<link>http://www.johnwaynehill.com/blog/2010/05/26/firefox-home-tab/</link>
	<description>&lt;p&gt;&lt;img alt=&quot;Firefox 4 Home Tab Icon&quot; class=&quot;alignright size-full wp-image-124&quot; height=&quot;250&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/05/home-large1.png&quot; title=&quot;home-large&quot; width=&quot;225&quot; /&gt;&lt;/p&gt;
&lt;p&gt;As you may know, I’m currently working as User Experience Intern at Mozilla. I’ve been tasked with designing the next generation Firefox Home Tab. I wanted to share what work I’ve done so far and give a general update on what I plan on doing in the near future. I will be routinely updating the progress and my work on this project as the summer goes forward. So check back often to keep updated on what I’m doing.&lt;/p&gt;
&lt;p&gt;I think it’s important to know right off the what we (the UX team) are imagining for the new home tab. We do not imagine the new home tab to be a content aggregation service, but rather we hope to fully understand and push the boundaries of what we (as a browser) can do that websites might not be able to do well. I’ve come up with some approaches that I’ve been looking at to use while designing, which I’ve listed below.&lt;/p&gt;
&lt;h4&gt;Possible Design Tools&lt;/h4&gt;
&lt;ul class=&quot;contentList noIndent&quot;&gt;
&lt;li&gt;Golden Questions&lt;br /&gt;
&lt;small&gt;used to understand many different perspectives&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;Secondary Research&lt;br /&gt;
&lt;small&gt;what research has been done so far by academia and other industry players?&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;User Research&lt;br /&gt;
&lt;small&gt;understand what users of home pages via surveys, possible interviews&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;Data Aggregation&lt;br /&gt;
&lt;small&gt;bring together all data points, see trends, gather insights&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;Brainstorming&lt;br /&gt;
&lt;small&gt;generate multiple ideas on what we can do as a browser&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;Design Lunch&lt;br /&gt;
&lt;small&gt;group brainstorming to get multiple view points and crazy ideas&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;Sketching&lt;br /&gt;
&lt;small&gt;to get ideas out of our heads&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;Concepting, Ideating&lt;br /&gt;
&lt;small&gt;to fully explore a design space&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;Prototyping&lt;br /&gt;
&lt;small&gt;to further explore a particular design&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;User Studies&lt;br /&gt;
&lt;small&gt;to understand gaps and problems with a design or concept&lt;/small&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span id=&quot;more-111&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Current Existing Approaches&lt;/h3&gt;
&lt;p&gt;I started out with this project by completing a competitor analysis of current ‘home’ pages on the web. This would allow me to get a good grasp of what is currently ‘out there’ in the world, to get a base understanding of what people actually use, to find out what is popular currently, to understand some trends, and to find what existing approaches currently ‘do right’. In order to be effective, I decided to focus on the following web sites:&lt;/p&gt;
&lt;div class=&quot;wp-caption alignleft&quot; id=&quot;attachment_113&quot; style=&quot;width: 160px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-113&quot; height=&quot;150&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/05/Yahoo-Home1.png&quot; title=&quot;Yahoo Home&quot; width=&quot;150&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Yahoo&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignleft&quot; id=&quot;attachment_114&quot; style=&quot;width: 160px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-114&quot; height=&quot;150&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/05/My-Yahoo.png&quot; title=&quot;My Yahoo&quot; width=&quot;150&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;My Yahoo&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignleft&quot; id=&quot;attachment_115&quot; style=&quot;width: 160px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-115&quot; height=&quot;150&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/05/iGoogle-Home.png&quot; title=&quot;iGoogle Home&quot; width=&quot;150&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;iGoogle&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignleft&quot; id=&quot;attachment_116&quot; style=&quot;width: 160px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-116&quot; height=&quot;150&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/05/Windows-Live.png&quot; title=&quot;Windows Live&quot; width=&quot;150&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Windows Live&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignleft&quot; id=&quot;attachment_117&quot; style=&quot;width: 160px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-117&quot; height=&quot;150&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/05/MSN-Home.png&quot; title=&quot;MSN Home&quot; width=&quot;150&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;MSN&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignleft&quot; id=&quot;attachment_118&quot; style=&quot;width: 160px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-118&quot; height=&quot;150&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/05/My-MSN.png&quot; title=&quot;My MSN&quot; width=&quot;150&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;My MSN&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignleft&quot; id=&quot;attachment_119&quot; style=&quot;width: 160px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-119&quot; height=&quot;150&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/05/Netvibes.png&quot; title=&quot;Netvibes&quot; width=&quot;150&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Netvibes&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignleft&quot; id=&quot;attachment_120&quot; style=&quot;width: 160px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-120&quot; height=&quot;150&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/05/Chimp.png&quot; title=&quot;Chimp&quot; width=&quot;150&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Chi.mp&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignleft&quot; id=&quot;attachment_121&quot; style=&quot;width: 160px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-121&quot; height=&quot;150&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/05/FlavorsMe.png&quot; title=&quot;FlavorsMe&quot; width=&quot;150&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Flavors.me&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;wp-caption alignleft&quot; id=&quot;attachment_122&quot; style=&quot;width: 160px;&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-122&quot; height=&quot;150&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/05/UnHub.png&quot; title=&quot;UnHub&quot; width=&quot;150&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;UnHub&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;clear&quot;&gt; &lt;/div&gt;
&lt;p&gt;In doing this research I looked at trends among these sites and general observations. I aggregated&lt;br /&gt;
this research into the following observations.&lt;/p&gt;
&lt;ul class=&quot;contentList&quot;&gt;
&lt;li&gt; Most home page current use the gadgets/widgets&lt;/li&gt;
&lt;li&gt; Boxes are the prevalent way to interact with these widgets&lt;/li&gt;
&lt;li&gt; Most sites/pages allow for customization of layout, color choices, and/or themes&lt;/li&gt;
&lt;li&gt; News was the most popular default widget, although I didn’t find it useful (survey here?)&lt;/li&gt;
&lt;li&gt; Ads were very prominent and disruptive to the experience&lt;/li&gt;
&lt;li&gt; Search was very prominent and always in the same position on every different site/page&lt;/li&gt;
&lt;li&gt; Tabs on the side/top were the predominant way to organize these horrible boxes&lt;/li&gt;
&lt;li&gt; Twitter trends were popular&lt;/li&gt;
&lt;li&gt; Facebook connect was popular&lt;/li&gt;
&lt;li&gt; Quick sharing was popular&lt;/li&gt;
&lt;li&gt; Quick links to other integrated services were popular&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can find my full research (notes) on &lt;a href=&quot;http://docs.google.com/Doc?docid=0AWqAyg8g3AFnZGZuazJ2bmRfMThoazM1ZmNmeA&amp;amp;hl=en&quot;&gt;Google Docs&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Summary and Next Steps&lt;/h3&gt;
&lt;p&gt;To summarize, we are not looking to build the next iGoogle, Netvibes, or My Yahoo clone, but rather&lt;br /&gt;
looking at what we (Mozilla) can do with our special role as an information broker and not a&lt;br /&gt;
web site. I’ve outlined some possible design tools and approaches to use in this project, and looked&lt;br /&gt;
at existing solutions in the world today.&lt;/p&gt;
&lt;p&gt;As I move forward in this (very fluid) design process, I’ll be blogging about individual steps I’m&lt;br /&gt;
taking as well as my reflection on those steps and my process in general. I hope to continue&lt;br /&gt;
writing about my experience here at Mozilla and the awesome things on which I get to work.&lt;/p&gt;
&lt;p&gt;I look forward to your feedback, comments, and ideas while continuing my work on this project.&lt;/p&gt;</description>
	<pubDate>Wed, 26 May 2010 18:45:16 +0000</pubDate>
	<dc:creator>John Wayne</dc:creator>
</item>
<item>
	<title>Jaclyn Fu: 270</title>
	<guid isPermaLink="true">http://mozmobileintern.wordpress.com/2010/05/25/270/</guid>
	<link>http://mozmobileintern.wordpress.com/2010/05/25/270/</link>
	<description>&lt;p&gt;Sitting on a padded rolling filing cabinet in a conference room named “Peanut Butter and Jelly”, I witnessed the creative whirlwind that would be the makings of a product launch. Amidst all the ideas being thrown around, teleconference technical difficulties and big dogs, I was truly inspired. The marketing meetings I attended really showed me how much of an impact such a small group of people can make on millions of people. It was in this Peanut Butter and Jelly conference room that Firefox Mobile was going to be marketed and rolled out. What does it take to market Firefox Mobile? A whole bunch of Google Docs, emails, coffee and amazing people. Everyone has so much responsibility and input, I can’t wait to get started and produce results!&lt;/p&gt;
&lt;p&gt;I was reminded of Mozilla’s vision and how everything centered around  improving the web experience through open-source transparency. It still surprises me that only a company of 270 employees can make such a great difference in the way we browse the web – and soon, how we browse on a mobile phone. Probably had a lot of interns..&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozmobileintern.wordpress.com/8/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozmobileintern.wordpress.com/8/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozmobileintern.wordpress.com/8/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozmobileintern.wordpress.com/8/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozmobileintern.wordpress.com/8/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozmobileintern.wordpress.com/8/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozmobileintern.wordpress.com/8/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozmobileintern.wordpress.com/8/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozmobileintern.wordpress.com/8/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozmobileintern.wordpress.com/8/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozmobileintern.wordpress.com/8/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozmobileintern.wordpress.com/8/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozmobileintern.wordpress.com/8/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozmobileintern.wordpress.com/8/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozmobileintern.wordpress.com&amp;amp;blog=13865100&amp;amp;post=8&amp;amp;subd=mozmobileintern&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 25 May 2010 21:40:50 +0000</pubDate>
	<dc:creator>Jaclyn Fu</dc:creator>
</item>
<item>
	<title>Jaclyn Fu: Day 1</title>
	<guid isPermaLink="false">http://mozmobileintern.wordpress.com/2010/05/25/day-1/</guid>
	<link>http://mozmobileintern.wordpress.com/2010/05/24/day-1/</link>
	<description>&lt;p&gt;Hey everyone! This blog will be about my summer at Mozilla as a Firefox Mobile Marketing Intern. I will be posting on my thoughts about mobile browsing, Firefox on different phones and what it’s like to be a product marketing intern here at Mozilla.&lt;/p&gt;
&lt;p&gt;To kick it off, my first day went something like this:&lt;/p&gt;
&lt;p&gt;* Dogs&lt;br /&gt;
* Orientation (which was an overload of information on how good the life of an intern is)&lt;br /&gt;
* Meeting my mentor – Yay Caitlin!&lt;br /&gt;
* Getting lost finding the bathroom&lt;br /&gt;
* Getting lost finding my desk&lt;br /&gt;
* Chinese food!&lt;br /&gt;
* More stickers added to my laptop (I found that the average stickers/laptop here is around 2)&lt;/p&gt;
&lt;p&gt;I’m so excited to get my hands on an Android phone so I can start testing mobile browsers (basically to confirm that Firefox Mobile is the best)! I’ll also be working to drive downloads for Firefox 1.1 on Nokia N900s and to engage with the early adopter community.&lt;/p&gt;
&lt;p&gt;Only 43 more days until Mozilla Summit in Whistler!&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/mozmobileintern.wordpress.com/3/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mozmobileintern.wordpress.com/3/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/mozmobileintern.wordpress.com/3/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mozmobileintern.wordpress.com/3/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/mozmobileintern.wordpress.com/3/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/mozmobileintern.wordpress.com/3/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/mozmobileintern.wordpress.com/3/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/mozmobileintern.wordpress.com/3/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/mozmobileintern.wordpress.com/3/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mozmobileintern.wordpress.com/3/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/mozmobileintern.wordpress.com/3/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mozmobileintern.wordpress.com/3/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/mozmobileintern.wordpress.com/3/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mozmobileintern.wordpress.com/3/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mozmobileintern.wordpress.com&amp;amp;blog=13865100&amp;amp;post=3&amp;amp;subd=mozmobileintern&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 24 May 2010 20:56:04 +0000</pubDate>
	<dc:creator>Jaclyn Fu</dc:creator>
</item>
<item>
	<title>John Wayne Hill: Firefox User Experience</title>
	<guid isPermaLink="false">http://www.johnwaynehill.com/blog/?p=107</guid>
	<link>http://www.johnwaynehill.com/blog/2010/05/20/firefox-user-experience/</link>
	<description>&lt;h4&gt;&lt;img alt=&quot;Firefox Icon&quot; class=&quot;size-full wp-image-108 alignright&quot; height=&quot;256&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/05/firefox-256.png&quot; title=&quot;firefox-256&quot; width=&quot;256&quot; /&gt;Woo hoo!&lt;/h4&gt;
&lt;p&gt;This summer (actually I already started) I will be working with Mozilla on the Firefox User Experience team. I couldn’t be more excited or happy. Firefox is a great product that has around 370 million users worldwide. This is a huge audience for which to design and will come with many challenges. I look forward to tackling these challenges head on with all that I have learned about design. I also hope to learn more than ever about designing in the real world, working with real people, on  stuff that will actually be in the world and used by millions. It’s scary as hell and I love it!&lt;/p&gt;
&lt;h4&gt;Reflection Thus Far&lt;/h4&gt;
&lt;p&gt;In thinking about the past (almost) two weeks, I can already seen how things have changed for me a bit. I’ve started to understand how UX teams might work in real world companies, specifically companies that are developer centric. Furthermore, I’ve started to understand the unique challenges that come with designing open source software. There are so many people involved, so many opinions, and so very many valid use and edge cases. It’s superbly interesting and a little overwhelming. I’m starting to look through my toolset and understand what tools I have that can best be used within a community such as Firefox. My colleagues (wow, that’s awesome to say) have blogged about some of these things as well. I work with really smart and amazing people. I’m very grateful for their help and support thus far.&lt;/p&gt;
&lt;p&gt;You might want to have a look at what &lt;a href=&quot;http://blog.mozilla.com/faaborg/2010/04/07/what-i-have-against-contextual-design-and-personas/&quot;&gt;Alex Faaborg&lt;/a&gt;, &lt;a href=&quot;http://jboriss.wordpress.com/2010/04/07/that-pesky-design-process/&quot;&gt;Jennifer Borris&lt;/a&gt;, &lt;a href=&quot;http://www.azarask.in/blog/&quot;&gt;Aza Raskin&lt;/a&gt;, and &lt;a href=&quot;http://limi.net/articles/improving-download-behaviors-web-browsers/&quot;&gt;Alex Limi&lt;/a&gt; are saying. It’s awesome!&lt;/p&gt;
&lt;p&gt;The first week here I was a sponge, running around trying to soak up as much information as possible. It also happened to be an intensive work week where we had all of our remote people in the office. It was a really great week where I learned quite a bit about how things work at Mozilla and the direction that Firefox was taking. I also got to participate in many quick design meetings where we discussed and ideated on designs. Furthermore, I was able to give my opinion on some &lt;a href=&quot;http://planet.firefox.com/ux/&quot;&gt;Bike Sheding&lt;/a&gt; issues and I really felt welcomed.&lt;/p&gt;
&lt;p&gt;This week (my second) I’ve started my first project and helped the team on some other stuff. Limi and I filled a bazillion bugs for the Firefox Papercuts issues (see his &lt;a href=&quot;http://www.scribd.com/doc/31643187/Firefox-4-Paper-Cuts-Alexander-Limi-Firefox-User-Experience&quot;&gt;presentation on the topic&lt;/a&gt;). So now I have a great grasp on filling bugs within bugzilla. My new project involves doing a good amount of research on what the next generation “&lt;a href=&quot;https://wiki.mozilla.org/Firefox/Projects/Home_Tab&quot;&gt;home tab&lt;/a&gt;” might look like for the web. I really like this project thus far as it really allows me to stretch my imagination and think about the future of the web and how it can be better designed for people.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Mozilla Foundation Logo&quot; class=&quot;alignleft size-full wp-image-110&quot; height=&quot;147&quot; src=&quot;http://www.johnwaynehill.com/blog/wp-content/uploads/2010/05/mozilla-foundation1.png&quot; title=&quot;mozilla-foundation&quot; width=&quot;152&quot; /&gt;&lt;/p&gt;
&lt;p&gt;So far, I’m having a great time. The Bay Area is fantastic. Mozilla is really great, and I love the people on the UX team. Plus I’m working for an organization that has a dino head for a logo. How cool is that!&lt;/p&gt;
&lt;p&gt;Life is good.&lt;/p&gt;</description>
	<pubDate>Thu, 20 May 2010 21:55:06 +0000</pubDate>
	<dc:creator>John Wayne</dc:creator>
</item>
<item>
	<title>Adrian Kalla: The Proprietary Trap</title>
	<guid isPermaLink="true">http://adrianer.jogger.pl/2010/05/11/the-proprietary-trap/</guid>
	<link>http://adrianer.jogger.pl/2010/05/11/the-proprietary-trap/</link>
	<description>&lt;p&gt;Once again I was reminded, that proprietary file formats are not only evil, but are real trouble for the user at the end. Here is the story:&lt;/p&gt;
&lt;p&gt;After finishing secondary school seven years ago, I started a movie project using all the pictures and video material we have gathered in school. As the software I have chosen &quot;Pinnacle Studio 8&quot;, because my uncle was using it at that time too. I should have listened to him, when he was telling me, that &quot;this is the worst software I have ever seen&quot;, because he was right. It took me nearly two years and an upgrade to &quot;Studio 9&quot; to be able to finish the project - the software was simply so buggy, that it was impossible to encode a one hour movie without bugs (e.g. missing transition effects, reversed transition effects) or crashes.&lt;/p&gt;
&lt;p&gt;But finally - about five years ago my free time project was ready, burned to DVDs, and I was happy that I don't have to use Pinnacle's software anymore&lt;/p&gt;
&lt;p&gt;2005 I wasn't thinking about HD videos (and my PC would be even too slow to allow me to watch them, not even considering encoding HD videos). But now I'd like to have that movie in HD.&lt;/p&gt;
&lt;p&gt;I still have all the project files, so &lt;b&gt;it would be really nice to just: &lt;i&gt;choose a good video editing software, open the project and export it to 1080p&lt;/i&gt;&lt;/b&gt;. Unfortunately, that's not possible, because Pinnacle stores the project in a proprietary format. So the only choice I have, is to rely on &quot;Pinnacle Studio 14&quot;, which can export my movie project to HD.&lt;/p&gt;
&lt;p&gt;In theory, &quot;Studio 14&quot; can open projects saved by &quot;Studio 9&quot; or newer, but I remember my experience upgrading &quot;Studio 8&quot; to &quot;Studio 9&quot; - it took me several days to remove all the glitches it created in the project... I don't have so much time for it now - I just want to have it working and be ready with it in one single day.&lt;/p&gt;
&lt;p&gt;To come to a conclusion: my hopes are, that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;maybe someone reading this knows a converter for Pinnacle Studio projects to use them with other software?&lt;/li&gt;
&lt;li&gt;if the above will not work... The I'll have to give &quot;Studio 14&quot; a try, but that is my least favorite option - I read too many comments about that version saying &quot;as buggy as the previous versions&quot; :/&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;At least I've learned my lesson: never, absolutely never store anything in a proprietary format - even if you think you won't need to use it in the future - you never really know. And you never know what (and if any) software will support that format in the future. Stay on the safe side - stay open.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 11 May 2010 02:08:24 +0000</pubDate>
</item>
<item>
	<title>Brian Krausz: On To Bigger Things</title>
	<guid isPermaLink="false">http://nerdlife.net/?p=282</guid>
	<link>http://feedproxy.google.com/~r/nerdlife/~3/6fVyddBjdII/</link>
	<description>&lt;p&gt;Alternative title: OMGWTF I just quit my job!&lt;br /&gt;
Alternative alternative title: &lt;a href=&quot;http://techcrunch.com/2010/04/24/how-not-to-handle-a-resignation-gracefully/&quot;&gt;A better way to resign from a company&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That’s right.  I just gave notice that I’m leaving a great job with awesome coworkers and interesting problems.  I’m trading all of that for the privilege of moving across the country, not taking a salary, and working 80 hours a week.  If I’m lucky, I’ll get to continue doing this for a long time, rather than finding another job that pays actual money.&lt;/p&gt;
&lt;p&gt;Shorter explanation: I’m moving to Silicon Valley to start a business.&lt;/p&gt;
&lt;p&gt;Not too much to say right now about the startup.  I got a funding offer I couldn’t turn down for an idea I really believe in.  Expect more posts in the future, since they valley always does inspire more blogging in me.  For now I don’t want to say too much about the idea itself, since we’re still fleshing a lot of things out, but I promise there will be some awesome posts about it in the future.&lt;/p&gt;
&lt;p&gt;However, there is something to say about my current employer, TripAdvisor.  Shortly put, they’ve been amazing.  I got to work on awesome features (like mobile flight search, which just launched today…tripadvisor.com from a mobile phone).  And not just work on them but have a major say in their direction.  My coworkers were a lot of fun, and my boss was flexible and understanding.&lt;/p&gt;
&lt;p&gt;I knew before I graduated that I would eventually leave my first employer to start a business (though I didn’t think it would be so soon).  TripAdvisor made that an incredibly hard thing to do, which I commend them for.  Hopefully I’ll be hiring soon, but until I open a Boston office, definitely &lt;a href=&quot;http://www.tripadvisor.com/careers/jobs&quot;&gt;apply for a position with them&lt;/a&gt;.  If you’d like a contact within the company (not necessary, the engineering HR manager is a solid guy and will get your resume to the right place), &lt;a href=&quot;http://nerdlife.net/about/&quot;&gt;just ask&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I’ll be out in Mountain View in early June.  See you on TechCrunch &lt;img alt=&quot;:)&quot; class=&quot;wp-smiley&quot; src=&quot;http://briankrausz.com/wp-includes/images/smilies/icon_smile.gif&quot; /&gt; .&lt;/p&gt;
&lt;img height=&quot;1&quot; src=&quot;http://feeds.feedburner.com/~r/nerdlife/~4/6fVyddBjdII&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 04 May 2010 01:20:56 +0000</pubDate>
	<dc:creator>Brian</dc:creator>
</item>
<item>
	<title>Wei Zhou: Tencent QQ UX design – Chinese user experience products is picking up…are we ready for the combat?</title>
	<guid isPermaLink="false">http://weizhou.wordpress.com/?p=357</guid>
	<link>http://weizhou.wordpress.com/2010/04/27/tencent-qq-ux-design-chinese-user-experience-products-is-picking-up-are-we-ready-for-the-combat/</link>
	<description>&lt;p&gt;&lt;em&gt;This article is about an reflection on a user experience design of a popular Chinese chatting software – QQ. I think UX experts can learn from about International digital products business development and culture barrier issues by studying their case. QQ has proven to be the best chatting software among all existing ones(it has the richest user experience and the most users) – it’s business models deserve to be studied by western cultures.  Chinese has a unique way of thinking user experience design in terms of life-enhancing patterns – we’ve seen this country is moving from imitation to innovation. For me this process is thrilling – Western investors and entrepreneurs, is it too late to enter China?&lt;br /&gt;
&lt;/em&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot;&gt;- Wei Zhou&lt;/p&gt;
&lt;p&gt;I’ve recently seen an article from Tencent QQ official site:&lt;a href=&quot;http://cdc.tencent.com/?p=2464&quot;&gt; http://cdc.tencent.com/?p=2464&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Video:&lt;/p&gt;
&lt;span style=&quot;text-align: center; display: block;&quot;&gt;&lt;a href=&quot;http://weizhou.wordpress.com/2010/04/27/tencent-qq-ux-design-chinese-user-experience-products-is-picking-up-are-we-ready-for-the-combat/&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://img.youtube.com/vi/ANrUKnoj0Q0/2.jpg&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;p&gt;Background: Tecent QQ is the dominating instant messaging software in China. I personally believe it will be the dominating reasons for Facebook and Twitter to fail in China. This software has existed for over 20 years and it’s influence is encompassing. Chinese’ three generations are using it and it togethers with Baidu(A chinese Google), Taobao(a Chinese eBay) and Xiaonei/Kaixin(Chinese facebook) to form Chinese digital UX patterns. Recently Tencent officially announced their new prototype. It’s claim for practicing “natural interface design” reflects some Zen thoughts. It’s fresh and original interface is worth to see.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Development process(translated from their official site):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This prototype is Tencent QQ’s first NUI(Natural User Interface)product. In addition to the basic instant messaging feature, it also includes dynamic profile pictures, dynamic backgrounds, Multi-tab windows, 3D Interaction, Vector Interact and Desktop friends short-cut…&lt;/p&gt;
&lt;p&gt;The original interface lights up the users: It triggers a lot more emotions. The interface is life-enhancing. It delivers an imaginary space beyond time and space dimensions. The expressions of interface is bold and colorful…It supports better mouse interaction and touchscreen interaction integration.&lt;/p&gt;
&lt;p&gt;There’s two trends involved in the design process: Personified and materialized processes. Keywords are: Life force, time and space. This means the product design concerns day-to-day life stories. The interaction model should have a “breathing” effect.Design changes in different time settings, etc.,&lt;/p&gt;
&lt;p&gt;Brain storming process:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://weizhou.files.wordpress.com/2010/04/picture-21.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone size-full wp-image-358&quot; src=&quot;http://weizhou.files.wordpress.com/2010/04/picture-21.png?w=1000&quot; title=&quot;Picture 21&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Wireframes and prototyping:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://weizhou.files.wordpress.com/2010/04/picture-22.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone size-full wp-image-359&quot; src=&quot;http://weizhou.files.wordpress.com/2010/04/picture-22.png?w=1000&quot; title=&quot;Picture 22&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Interesting pane emotion selector:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://weizhou.files.wordpress.com/2010/04/picture-23.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone size-full wp-image-360&quot; src=&quot;http://weizhou.files.wordpress.com/2010/04/picture-23.png?w=1000&quot; title=&quot;Picture 23&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Visual Languages:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://weizhou.files.wordpress.com/2010/04/picture-24.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone size-full wp-image-361&quot; src=&quot;http://weizhou.files.wordpress.com/2010/04/picture-24.png?w=1000&quot; title=&quot;Picture 24&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Profile Manager:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://weizhou.files.wordpress.com/2010/04/picture-25.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone size-full wp-image-362&quot; src=&quot;http://weizhou.files.wordpress.com/2010/04/picture-25.png?w=1000&quot; title=&quot;Picture 25&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Friends management:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://weizhou.files.wordpress.com/2010/04/picture-26.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone size-full wp-image-363&quot; src=&quot;http://weizhou.files.wordpress.com/2010/04/picture-26.png?w=1000&quot; title=&quot;Picture 26&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dynamic backgrounds:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://weizhou.files.wordpress.com/2010/04/picture-27.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone size-full wp-image-364&quot; src=&quot;http://weizhou.files.wordpress.com/2010/04/picture-27.png?w=1000&quot; title=&quot;Picture 27&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pie panel enhances touchscreen interaction:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://weizhou.files.wordpress.com/2010/04/picture-28.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;alignnone size-full wp-image-365&quot; src=&quot;http://weizhou.files.wordpress.com/2010/04/picture-28.png?w=1000&quot; title=&quot;Picture 28&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I will add QQ’s business models tomorrow. They did a great job on integrating online Ads into this product smoothly and seamlessly.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/weizhou.wordpress.com/357/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/weizhou.wordpress.com/357/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/weizhou.wordpress.com/357/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/weizhou.wordpress.com/357/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/weizhou.wordpress.com/357/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/weizhou.wordpress.com/357/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/weizhou.wordpress.com/357/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/weizhou.wordpress.com/357/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/weizhou.wordpress.com/357/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/weizhou.wordpress.com/357/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/weizhou.wordpress.com/357/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/weizhou.wordpress.com/357/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/weizhou.wordpress.com/357/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/weizhou.wordpress.com/357/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=weizhou.wordpress.com&amp;amp;blog=2603969&amp;amp;post=357&amp;amp;subd=weizhou&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 27 Apr 2010 21:27:17 +0000</pubDate>
	<dc:creator>wei zhou</dc:creator>
</item>
<item>
	<title>Ehren Metcalfe: RTL level function removal</title>
	<guid isPermaLink="false">http://ehren.wordpress.com/?p=496</guid>
	<link>http://ehren.wordpress.com/2010/04/21/rtl-level-function-removal/</link>
	<description>&lt;p&gt;Over the past few days I’ve been focusing on getting the call graph portion of my dead code analysis in check. It turns out that function local const (or static) initializations are not accessible during later gcc passes. Luckily, walking the front end tree representation, which is accessible via &lt;a href=&quot;https://developer.mozilla.org/en/Treehydra&quot;&gt;Treehydra&lt;/a&gt;‘s process_cp_pre_genericize, does the trick. This takes care of all remaining false positives of which I am aware.  &lt;/p&gt;
&lt;p&gt;The downside is that going through all these extra tree codes is sloooow. After a bunch of false starts the damn thing is still running on one of the &lt;a href=&quot;http://cdot.senecac.on.ca/&quot;&gt;CDOT&lt;/a&gt;‘s development machines (probably an 8+ hour compile).&lt;/p&gt;
&lt;p&gt;For a little while though, I’ve been thinking of ways to automatically remove identified dead code without actually patching the source. By applying Taras’ &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=547581&quot;&gt;assembler name patch&lt;/a&gt; to dehydra I can now identify precisely which code to remove. The question now is how to remove it.&lt;/p&gt;
&lt;p&gt;My first thought was a hack using &lt;a href=&quot;http://sourceware.org/binutils/docs/binutils/objcopy.html&quot;&gt;objcopy&lt;/a&gt;. I could first output a list of the mangled names of dead functions and then, after running a build with &lt;a href=&quot;http://gcc.gnu.org/onlinedocs/gcc-4.0.4/gcc/Optimize-Options.html#index-ffunction_002dsections-545&quot;&gt;-ffunction-sections&lt;/a&gt;, run a script like this:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;pre class=&quot;brush: bash;&quot;&gt;#!/bin/sh
while read asmname
do
  find objdir -name &quot;*.o&quot; | xargs objcopy --remove-section=&quot;.text.$asmname&quot;
done &amp;lt; asmlist.txt
&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;(and then relinking). This works, but only for non-member functions. &lt;/p&gt;
&lt;p&gt;The other option was some sort of gcc hack to remove as much code as possible when obcopy can’t do the job. I first tried removing every statement in every basic block of the function (see &lt;a href=&quot;http://gcc.gnu.org/onlinedocs/gccint/Sequence-iterators.html#Sequence-iterators&quot;&gt;gsi_remove&lt;/a&gt;). This seems to only work with a non-branching cfg however (even when I leave a valid return statement). I then tried &lt;a href=&quot;http://gcc.gnu.org/viewcvs/trunk/gcc/cgraph.c?revision=158607&amp;amp;view=markup#l1288&quot;&gt;cgraph_remove_node&lt;/a&gt; with an IPA pass plugin which blows up if a function’s referenced anywhere else.&lt;/p&gt;
&lt;p&gt;Today I arrived at a solution that, although requiring a direct patch of GCC, seems to be ideal. Surprisingly, it’s possible to hook in right before assembly generation, and it’s easy too:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;pre class=&quot;brush: cpp;&quot;&gt;diff --git a/gcc/final.c b/gcc/final.c
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -4090,16 +4090,34 @@
 {
   if (symbol_queue)
     {
       free (symbol_queue);
       symbol_queue = NULL;
       symbol_queue_size = 0;
     }
 }
+
+static bool
+is_dead(const char* name) 
+{
+  char asmname[100];
+  FILE* fp = fopen(&quot;/home/ehren/asmlist.txt&quot;, &quot;r&quot;);
+  if (!fp)
+    return false;
+
+  while (fscanf(fp, &quot;%s&quot;, asmname) != EOF) {
+    if (strcmp(asmname, name) == 0) {
+      fclose(fp);
+      return true;
+    }
+  }
+  fclose(fp);
+  return false;
+}
 
 /* Turn the RTL into assembly.  */
 static unsigned int
 rest_of_handle_final (void)
 {
   rtx x;
   const char *fnname;
 
@@ -4109,17 +4127,19 @@
   x = DECL_RTL (current_function_decl);
   gcc_assert (MEM_P (x));
   x = XEXP (x, 0);
   gcc_assert (GET_CODE (x) == SYMBOL_REF);
   fnname = XSTR (x, 0);
 
   assemble_start_function (current_function_decl, fnname);
   final_start_function (get_insns (), asm_out_file, optimize);
-  final (get_insns (), asm_out_file, optimize);
+  if (!is_dead(fnname)) {
+    final (get_insns (), asm_out_file, optimize);
+  }
   final_end_function ();
 
 #ifdef TARGET_UNWIND_INFO
   /* ??? The IA-64 &quot;.handlerdata&quot; directive must be issued before
      the &quot;.endp&quot; directive that closes the procedure descriptor.  */
   output_function_exception_table (fnname);
 #endif
&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;With this, functions are removed completely (except from the symbol table) and the bodies of virtuals are replaced with a couple words worth of NOPs. Yes, opening up the file with a hardcoded path for every function is ugly but later on I could always read it into a global somewhere else (and do a binary search).&lt;/p&gt;
&lt;p&gt;The only downside here is I won’t get any link time errors if a few false positives slip through, as opposed to with objcopy. In my experiments, calling a function that doesn’t exist results in an immediate segmentation fault (makes sense), but storing the return of a NOP-body virtual just leaves you with an uninitialized value.&lt;/p&gt;
&lt;p&gt;Hopefully, I’ll soon have some good results on the analysis front to actually test this on Mozilla.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/ehren.wordpress.com/496/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/ehren.wordpress.com/496/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/ehren.wordpress.com/496/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/ehren.wordpress.com/496/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/ehren.wordpress.com/496/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/ehren.wordpress.com/496/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/ehren.wordpress.com/496/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/ehren.wordpress.com/496/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/ehren.wordpress.com/496/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/ehren.wordpress.com/496/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/ehren.wordpress.com/496/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/ehren.wordpress.com/496/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/ehren.wordpress.com/496/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/ehren.wordpress.com/496/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=ehren.wordpress.com&amp;amp;blog=9426727&amp;amp;post=496&amp;amp;subd=ehren&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 22 Apr 2010 04:38:10 +0000</pubDate>
	<dc:creator>ehren</dc:creator>
</item>
<item>
	<title>Ehren Metcalfe: Dead code progress</title>
	<guid isPermaLink="false">http://ehren.wordpress.com/?p=479</guid>
	<link>http://ehren.wordpress.com/2010/04/07/dead-code-progress/</link>
	<description>&lt;p&gt;So far things are on track with my attempts to developed an unused function finding tool. Now that the function pointer/jump table problem &lt;a href=&quot;http://ehren.wordpress.com/2010/04/06/function-declaration-escape-analysis-v2/&quot;&gt;has been solved&lt;/a&gt; other more subtle issues have come to light.&lt;/p&gt;
&lt;p&gt;The first was a problem with &lt;a href=&quot;https://developer.mozilla.org/en/Callgraph&quot;&gt;callgraph&lt;/a&gt;‘s handling of inheritance chains. As I &lt;a href=&quot;http://ehren.wordpress.com/2010/04/04/function-declaration-escape-analysis/&quot;&gt;mentioned previously&lt;/a&gt;, it was necessary to add each method to the node table (see &lt;a href=&quot;http://https://developer.mozilla.org/En/Callgraph/Schema_Reference&quot;&gt;schema reference&lt;/a&gt;) both when the method’s body is processed (as is already the case) but also when the method’s type is processed. At some point I should really develop some tests here but this affects the recognition of pure virtual functions in a number of complicated cases.&lt;/p&gt;
&lt;p&gt;However, I also ran into another issue where certain methods were not finding themselves into the inheritance chains in which they belong. This seems to be only when a virtual function overrides a base class function that has not been defined in the ‘next up’ base class (A defines virtual foo, B derives from A, C derives from B and redefines virtual foo). This could be a &lt;a href=&quot;http://https://developer.mozilla.org/en/Treehydra&quot;&gt;Treehydra&lt;/a&gt; issue or a maybe a problem with the GCC &lt;a href=&quot;http://gcc.gnu.org/onlinedocs/gccint/Classes.html&quot;&gt;binfo&lt;/a&gt; data structure (or maybe I’m just misunderstanding things).&lt;/p&gt;
&lt;p&gt;Either way, my solution has been to process all base classes and subclasses of a method both when the type is processed and also when the method body is processed. This appears to be a working solution (although it certainly does not improve callgraph compilation times). &lt;/p&gt;
&lt;p&gt;Once this was handled I started to get some pretty good results but I noticed scriptable methods were getting into the mix. After a few hours of fruitless hacking it turned out I just forgot to properly define &lt;a href=&quot;http://mxr.mozilla.org/mozilla-central/source/xpcom/base/nscore.h#518&quot;&gt;NS_SCRIPTABLE&lt;/a&gt; (since I’m not running a &lt;a href=&quot;https://developer.mozilla.org/en/Building_with_static_checking&quot;&gt;–with-static-checking&lt;/a&gt; build). After rebuilding again, I believe I finally attained a 0% false positive rate. &lt;/p&gt;
&lt;p&gt;This time I hit another problem though. A bunch of genuinely dead methods turned up by my most recent (defective) analysis were not showing up. In fact, very few methods were showing up at all. Investigating, it turns out I’ve been quite overzealous in marking a method as scriptable. My previous technique was to check if &lt;code&gt;__attribute__((user(&quot;NS_script&quot;))&lt;/code&gt; was present in the declaration attributes of a function and also to check if it is present in the type attributes of the class and &lt;em&gt;any base class&lt;/em&gt;. This excludes a bunch of juicy dead stuff like &lt;a href=&quot;http://mxr.mozilla.org/mozilla-central/search?string=SetCharsetCheckmark&quot;&gt;nsCharsetMenu::SetCharsetCheckmark&lt;/a&gt; (gimple isn count 75 ftw) which is a member of a non-scriptable class that derives from two scriptable interfaces (which do not declare SetCharsetCheckmark).&lt;/p&gt;
&lt;p&gt;Naturally, the solution when marking methods scriptable because of their base classes is only to mark the method scriptable when the base class declares the method and is scriptable. Come to think of it, I probably don’t even need to do this because of the way I group together base and derived methods.&lt;/p&gt;
&lt;p&gt;Anyway, my current status is waiting for a build with these changes to finish. We will see if there are more issues.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/ehren.wordpress.com/479/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/ehren.wordpress.com/479/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/ehren.wordpress.com/479/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/ehren.wordpress.com/479/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/ehren.wordpress.com/479/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/ehren.wordpress.com/479/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/ehren.wordpress.com/479/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/ehren.wordpress.com/479/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/ehren.wordpress.com/479/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/ehren.wordpress.com/479/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/ehren.wordpress.com/479/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/ehren.wordpress.com/479/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/ehren.wordpress.com/479/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/ehren.wordpress.com/479/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=ehren.wordpress.com&amp;amp;blog=9426727&amp;amp;post=479&amp;amp;subd=ehren&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 08 Apr 2010 02:04:15 +0000</pubDate>
	<dc:creator>ehren</dc:creator>
</item>
<item>
	<title>Ehren Metcalfe: Function declaration escape analysis v2</title>
	<guid isPermaLink="false">http://ehren.wordpress.com/?p=467</guid>
	<link>http://ehren.wordpress.com/2010/04/06/function-declaration-escape-analysis-v2/</link>
	<description>&lt;p&gt;I don’t want to get too excited until I’ve run this through 4000000 loc but I believe I’ve solved the problem of being &lt;a href=&quot;http://ehren.wordpress.com/2010/04/05/problems-with-const-static-initializations/&quot;&gt;unable&lt;/a&gt; to process global initializations of const/static global variables. Earlier, I posted a &lt;a href=&quot;http://gcc.gnu.org/ml/gcc/2010-04/msg00056.html&quot;&gt;message&lt;/a&gt; to the GCC mailing list describing my troubles with &lt;code&gt;varpool&lt;/code&gt;. I did receive a helpful response in that there is nothing inherent about const/static declarations that would prevent one from getting at the lhs of their initialization.&lt;/p&gt;
&lt;p&gt;Today I experimented with walking as many trees in as many places as I could find without much luck. I then tried compiling this sample code with -Wunused:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;pre class=&quot;brush: cpp;&quot;&gt;int foo() {
  return 0;
}

typedef struct {
  int (*p) ();
} Table;

static Table t[] = {
  { foo }
};
&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;As expected, GCC warns about the unused static variable. &lt;/p&gt;
&lt;p&gt;Taking a look at &lt;a href=&quot;http://gcc.gnu.org/viewcvs/trunk/gcc/toplev.c?view=markup&quot;&gt;toplevel.c&lt;/a&gt; It didn’t take too long to find a solution (and this works for const, static, and const static):&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;pre class=&quot;brush: cpp;&quot;&gt;Index: gcc/toplev.c
===================================================================
--- gcc/toplev.c  (revision 157978)
+++ gcc/toplev.c  (working copy)
@@ -844,12 +844,26 @@
   return output_something;
 }

+static tree 
+find_funcs_callback(tree *tp, int *walk_subtrees, void *data)
+{
+  tree t = *tp;
+
+  if (TREE_CODE(t) == FUNCTION_DECL)
+    fprintf(stderr, &quot;address held: %s\n&quot;, IDENTIFIER_POINTER(DECL_NAME(t)));
+
+  return NULL_TREE;
+}
+
 /* A subroutine of check_global_declarations.  Issue appropriate warnings
    for the global declaration DECL.  */

 void
 check_global_declaration_1 (tree decl)
 {
+  if (DECL_INITIAL(decl))
+    walk_tree(&amp;amp;DECL_INITIAL(decl), find_funcs_callback, NULL, NULL);
+
   /* Warn about any function declared static but not defined.  We don't
      warn about variables, because many programs have static variables
      that exist only to get some text into the object file.  */
&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I’ve got to fix up the output to match &lt;a href=&quot;https://developer.mozilla.org/en/Callgraph&quot;&gt;callgraph&lt;/a&gt;‘s serialization but &lt;em&gt;this could be it&lt;/em&gt;.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/ehren.wordpress.com/467/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/ehren.wordpress.com/467/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/ehren.wordpress.com/467/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/ehren.wordpress.com/467/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/ehren.wordpress.com/467/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/ehren.wordpress.com/467/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/ehren.wordpress.com/467/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/ehren.wordpress.com/467/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/ehren.wordpress.com/467/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/ehren.wordpress.com/467/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/ehren.wordpress.com/467/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/ehren.wordpress.com/467/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/ehren.wordpress.com/467/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/ehren.wordpress.com/467/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=ehren.wordpress.com&amp;amp;blog=9426727&amp;amp;post=467&amp;amp;subd=ehren&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Tue, 06 Apr 2010 07:46:45 +0000</pubDate>
	<dc:creator>ehren</dc:creator>
</item>
<item>
	<title>Ehren Metcalfe: Problems with const static initializations</title>
	<guid isPermaLink="false">http://ehren.wordpress.com/?p=460</guid>
	<link>http://ehren.wordpress.com/2010/04/05/problems-with-const-static-initializations/</link>
	<description>&lt;p&gt;Unfortunately I spoke too soon about developing an airtight dead code finder. The technique of processing file scope variables I mentioned in my &lt;a href=&quot;http://ehren.wordpress.com/2010/04/04/function-declaration-escape-analysis/&quot;&gt;previous post&lt;/a&gt; has a serious drawback: it doesn’t work for const static data. This is a show stopper when it comes to peeking into most jump tables.&lt;/p&gt;
&lt;p&gt;I’ve been able to print type information for all globals using the dehydra hooks placed into c-common.c however it seems like const initializations are not even handled at this level. I have my suspicions that there’s no way to recover the FUNCTION_DECL node in this case, likely because gcc has no use for the info at this level.&lt;/p&gt;
&lt;p&gt;Although I may be able to make do by simply manually filtering as many callback functions as I can this approach is not quite ideal. I’ll have to think more about this but I’m now thinking that the &lt;a href=&quot;http://gcc.gnu.org/wiki/LinkTimeOptimization&quot;&gt;lto&lt;/a&gt; streamer might be of use. There’s also the chance that there’s another way of using the cgraph to get at this data.&lt;/p&gt;
&lt;p&gt;The other possibility is ditching gcc entirely and using elsa to dump the data. I’ll report back when I know more.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/ehren.wordpress.com/460/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/ehren.wordpress.com/460/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/ehren.wordpress.com/460/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/ehren.wordpress.com/460/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/ehren.wordpress.com/460/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/ehren.wordpress.com/460/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/ehren.wordpress.com/460/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/ehren.wordpress.com/460/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/ehren.wordpress.com/460/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/ehren.wordpress.com/460/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/ehren.wordpress.com/460/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/ehren.wordpress.com/460/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/ehren.wordpress.com/460/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/ehren.wordpress.com/460/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=ehren.wordpress.com&amp;amp;blog=9426727&amp;amp;post=460&amp;amp;subd=ehren&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Mon, 05 Apr 2010 05:02:44 +0000</pubDate>
	<dc:creator>ehren</dc:creator>
</item>
<item>
	<title>Ehren Metcalfe: Function declaration escape analysis</title>
	<guid isPermaLink="false">http://ehren.wordpress.com/?p=442</guid>
	<link>http://ehren.wordpress.com/2010/04/04/function-declaration-escape-analysis/</link>
	<description>&lt;p&gt;It’s been quite a while since I’ve blogged. Frankly I’ve got behind with my work. However, I believe I have hit a huge breakthrough finding dead code. I don’t want to get too ahead of myself but if things work as I think, I can now identify every unused function/member function in mozilla-central with a near 0 false positive rate.&lt;/p&gt;
&lt;p&gt;I’ve mentioned many times that assignments to function pointers are a huge pain when it comes to recognizing call graph edges. I’ve been able to handle function local address taking for some time now but the problem of functions referenced in global variables (usually jump tables) has proved elusive. In fact, it’s currently not possibly to process global variables at all with &lt;a href=&quot;https://developer.mozilla.org/en/Treehydra&quot;&gt;Treehydra&lt;/a&gt;. This leads to thousands of false positives in the analysis and a bunch of special case handling.&lt;/p&gt;
&lt;p&gt;It suddenly dawned on me that GCC might have already done the work for me. &lt;a href=&quot;http://gcc.gnu.org/viewcvs/trunk/gcc/ipa-type-escape.c?revision=157950&amp;amp;view=markup&quot;&gt;ipa-type-escape.c&lt;/a&gt;, which “determines which types in the program contain only instances that are completely encapsulated by the compilation unit” seems to fit the bill, but I ended up with less than stellar results trying to print out any escaping function declarations. In fact, I don’t think it really is useful for my purposes.&lt;/p&gt;
&lt;p&gt;However, the technique of processing global variables using the &lt;code&gt;varpool&lt;/code&gt; is exactly what I needed. In fact, I can very easily write a GCC plugin to print off all the globally escaping declarations in a compilation unit. Unfortunately, getting a plugin to build that uses more than the standard set of routines is a bit of a challenge (more stuff needs to be linked in) so I just hacked it into &lt;a href=&quot;http://hg.mozilla.org/rewriting-and-analysis/dehydra/file/d039748e7775/dehydra_plugin.c#l301&quot;&gt;dehydra_plugin.c&lt;/a&gt;. It works though!&lt;/p&gt;
&lt;p&gt;Here’s the code:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;pre class=&quot;brush: cpp;&quot;&gt;static tree find_funcs_callback(tree *tp, int *walk_subtrees, void *data) {
  tree t = *tp;
  
  if (TREE_CODE(t) == FUNCTION_DECL) {
    // dump function (I use dehydra specific code)
  }
  
  return NULL_TREE;
}
 
static void find_funcs(tree decl) {
  walk_tree(&amp;amp;decl, find_funcs_callback, NULL, NULL);
}

// This needs to go in the execute function of an IPA pass.
// I just stuck it into dehydra's gcc_plugin_post_parse
struct varpool_node *vnode;
FOR_EACH_STATIC_VARIABLE(vnode)
  find_funcs(DECL_INITIAL(vnode-&amp;gt;decl));
&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Now all I have to do is mark every function printed by this routine as escaping. I’ve been able to match &lt;a href=&quot;https://developer.mozilla.org/en/Callgraph&quot;&gt;callgraph&lt;/a&gt;‘s serialization almost completely so this will be a breeze. &lt;/p&gt;
&lt;p&gt;I’ve also found that the current way callgraph treats inheritance chains (using a &lt;a href=&quot;https://developer.mozilla.org/En/Callgraph/Schema_Reference&quot;&gt;table&lt;/a&gt; of ‘implementor’ – ‘interface’ pairs) is not particularly useful for finding dead code. In fact, a whole bunch of functions in the implementors table are being left out of the node table. I’ve been able to rectify this by treating method overriding just like any call edge. In particular, I have the base class ‘call’ the derived class which will fit right into my existing algorithm (becuase of dynamic dispatch, once the base method is called all bets are off on whether or not some derived method is called). In order to get any results previously, I’ve just been identifying base method-derived method pairs by textually matching the prototypes. Looking at my current results, I’ve found a disproportionate number of static methods which suggests that this technique is too conservative. Here’s the &lt;a href=&quot;http://matrix.senecac.on.ca/~egmetcalfe/path-restrictive.py&quot;&gt;old script&lt;/a&gt; btw. With these callgraph chages the next one will be much simpler (with no method name parsing!) &lt;/p&gt;
&lt;p&gt;I’ve had some success already with dead code in &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=551390&quot;&gt;content&lt;/a&gt; and particularly in &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=556446&quot;&gt;layout&lt;/a&gt;, even with this rudimentary script. I also certainly have &lt;a href=&quot;http://zenit.senecac.on.ca/wiki/index.php/User:Egmetcalfe/Dead_Code&quot;&gt;more to file&lt;/a&gt;. With this new approach, though, I think I’ll be able able to find and file &lt;em&gt;all of it&lt;/em&gt; by release 1.0.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/ehren.wordpress.com/442/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/ehren.wordpress.com/442/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/ehren.wordpress.com/442/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/ehren.wordpress.com/442/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/ehren.wordpress.com/442/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/ehren.wordpress.com/442/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/ehren.wordpress.com/442/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/ehren.wordpress.com/442/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/ehren.wordpress.com/442/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/ehren.wordpress.com/442/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/ehren.wordpress.com/442/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/ehren.wordpress.com/442/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/ehren.wordpress.com/442/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/ehren.wordpress.com/442/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=ehren.wordpress.com&amp;amp;blog=9426727&amp;amp;post=442&amp;amp;subd=ehren&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Sun, 04 Apr 2010 15:13:31 +0000</pubDate>
	<dc:creator>ehren</dc:creator>
</item>
<item>
	<title>Adrian Kalla: Browser ballot fail: asks to set IE as the default browser</title>
	<guid isPermaLink="true">http://adrianer.jogger.pl/2010/03/11/browser-ballot-fail-asks-to-set-ie-as-the-default-browser/</guid>
	<link>http://adrianer.jogger.pl/2010/03/11/browser-ballot-fail-asks-to-set-ie-as-the-default-browser/</link>
	<description>&lt;p&gt;Wasn't the whole ballot thing about preserving the users choice? Then wtf is this:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://img215.imageshack.us/i/ballotfail.jpg/&quot;&gt;&lt;img alt=&quot;ballot fail screenshot&quot; src=&quot;http://img215.imageshack.us/img215/1972/ballotfail.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Procedure to reproduce:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;choose to install your prefered browser, but not IE (actually, my prefered browser, SeaMonkey, is not in the list, even when it is the 6th most popular desktop browser in Europe... That's a big fail too.)&lt;/li&gt;
&lt;li&gt;close the ballot screen by clicking on &quot;Choose later (Später auswählen)&quot;, because you couldn't find a &quot;Close&quot; button&lt;/li&gt;
&lt;li&gt;install the downloaded browser and set it as default&lt;/li&gt;
&lt;li&gt;restart your system&lt;/li&gt;
&lt;li&gt;see the ballot screen asking you to set IE as the default browser&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Is it just me, or does this look like a violation of what Microsoft has signed in Brussels?&lt;/p&gt;</description>
	<pubDate>Thu, 11 Mar 2010 19:50:28 +0000</pubDate>
</item>
<item>
	<title>Wei Zhou: It’s really not all about money</title>
	<guid isPermaLink="false">http://weizhou.wordpress.com/?p=355</guid>
	<link>http://weizhou.wordpress.com/2010/03/05/its-really-not-all-about-money/</link>
	<description>&lt;p&gt;When I studied Graphic Design in Yale University, my professor told me a universal truth: “When you choose a career path the primary thing is figure out if you would enjoy the details.” I realized at a young age that I don’t enjoy choosing typefaces among a thousand of options, so I quit graphic design. Among these years, I’ve watched so many types of jobs: I would never be an investment banker because I don’t enjoy correction typos or copying pasting numbers in the pitch book. I would never be an programmer because debugging kills my skin cell. And I would never be a teacher because I don’t enjoy talking to dumb kids. Now I work as a senior consultant in user experience industry, I realize sometimes don’t like using visios to create wireframes or photoshop creating visual design comps. This baffles me for a while: how could I ever fulfill and satisfy myself? I think this article(by josh Kaufman) answers this question well: you need to know yourself well enough.&lt;/p&gt;
&lt;p&gt;Here’s a deceptively simple question: why do people work? On the face of it, the answer seems relatively straightforward:&lt;/p&gt;
&lt;h3&gt;The 3 Core Levels of Material Need&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Level 1: Resources&lt;/strong&gt;&lt;br /&gt;
Working for immediate needs like food &amp;amp; shelter; living paycheck to paycheck.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Level 2: Security&lt;/strong&gt;&lt;br /&gt;
Working to ensure safety; saving and investing for future needs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Level 3: Freedom&lt;/strong&gt;&lt;br /&gt;
Working to ensure self-sufficiency and independent choice of action.&lt;/p&gt;
&lt;p&gt;These three levels of work are similar to the first few levels of &lt;a href=&quot;http://en.wikipedia.org/wiki/Maslow%27s_hierarchy_of_needs&quot;&gt;Maslow’s Hierarchy of Needs&lt;/a&gt; or &lt;a href=&quot;http://en.wikipedia.org/wiki/ERG_theory&quot;&gt;ERG Theory&lt;/a&gt;: work is a way we can meet our basic existential needs effectively and reliably.&lt;/p&gt;
&lt;p&gt;That’s a perfectly reasonable explanation, but here’s where things get interesting: what happens when people have enough resources to do whatever they want? What does “Level 4” look like?&lt;/p&gt;
&lt;h3&gt;Level 4: Primary Motivation&lt;/h3&gt;
&lt;p&gt;Consider individuals like &lt;a href=&quot;http://en.wikipedia.org/wiki/Warren_Buffett&quot;&gt;Warren Buffett&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Steve_jobs&quot;&gt;Steve Jobs&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Dick_cheney&quot;&gt;Dick Cheney&lt;/a&gt;, and &lt;a href=&quot;http://en.wikipedia.org/wiki/Angelina_jolie&quot;&gt;Angeline Jolie&lt;/a&gt;. Each of these individuals has enough money to ensure that they never need to work again – they could quit tomorrow and live off of their savings in perpetuity. For some reason, however, they don’t – they keep working. Why?&lt;/p&gt;
&lt;p&gt;After considering this question, I think that people who have reached the “Freedom” stage of work make a choice (either explicitly or implicitly) about what they’re ultimately working for. The choice ultimately revolves around what that person values most: power, status, pleasure, creation, or quality.&lt;/p&gt;
&lt;h4&gt;#1: The Autocrat&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;The Autocrat’s primary motivation is power and control.&lt;/strong&gt; Common behaviors include continually seeking influence or control over the lives and actions of other people. Examples: businesspeople turned politicians like &lt;a href=&quot;http://en.wikipedia.org/wiki/Henry_Paulson&quot;&gt;Henry Paulson&lt;/a&gt; (US Secretary of the Treasury), &lt;a href=&quot;http://en.wikipedia.org/wiki/Dick_cheney&quot;&gt;Dick Cheney&lt;/a&gt; (US Vice-President), and &lt;a href=&quot;http://en.wikipedia.org/wiki/Michael_Bloomburg&quot;&gt;Michael Bloomburg&lt;/a&gt; (mayor of New York City).&lt;/p&gt;
&lt;h4&gt;#2: The Narcissist&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;The Narcissist’s primary motivation is attention, status, and fame.&lt;/strong&gt; Common behaviors include continually seeking the attention and esteem of other people, and acting in ways that will ensure they receive more and more attention. Examples: actors / celebrities like &lt;a href=&quot;http://en.wikipedia.org/wiki/Lindsay_lohan&quot;&gt;Lindsay Lohann&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Brittany_spears&quot;&gt;Brittany Spears&lt;/a&gt;, and &lt;a href=&quot;http://en.wikipedia.org/wiki/Madonna_%28entertainer%29&quot;&gt;Madonna&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;#3: The Hedonist&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;The Hedonist’s primary motivation is pleasure and enjoyment of material goods.&lt;/strong&gt; Common behaviors include the continual acquisition of luxurious homes, fine food, and exotic travel. Examples: &lt;a href=&quot;http://en.wikipedia.org/wiki/Larry_Ellison&quot;&gt;Larry Elison&lt;/a&gt; (CEO of Oracle), &lt;a href=&quot;http://en.wikipedia.org/wiki/Mohammed_bin_Rashid_al-Maktoum&quot;&gt;Mohammed bin Rashid Al Maktoum&lt;/a&gt; (Sheikh of Dubai), and &lt;a href=&quot;http://en.wikipedia.org/wiki/Paul_Allen&quot;&gt;Paul Allen&lt;/a&gt; (co-founder of Microsoft).&lt;/p&gt;
&lt;h4&gt;#4: The Architect&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;The Architect’s primary motivation is creating something new or reshaping the world.&lt;/strong&gt; Common behaviors include the establishment of a vision of what the world “should” look like, then continually pursuing projects that they believe will bring the world closer to that ideal. Examples: &lt;a href=&quot;http://en.wikipedia.org/wiki/Steve_jobs&quot;&gt;Steve Jobs&lt;/a&gt; (CEO of Apple), &lt;a href=&quot;http://en.wikipedia.org/wiki/Richard_Dawkins&quot;&gt;Richard Dawkins&lt;/a&gt; (biologist and lecturer), &lt;a href=&quot;http://en.wikipedia.org/wiki/Muhammad_Yunus&quot;&gt;Muhammad Yunus&lt;/a&gt; (father of micro-lending), and politicians like &lt;a href=&quot;http://en.wikipedia.org/wiki/Ron_paul&quot;&gt;Ron Paul&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Dennis_kucinich&quot;&gt;Denis Kucinich&lt;/a&gt;, and &lt;a href=&quot;http://en.wikipedia.org/wiki/Al_gore&quot;&gt;Al Gore&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;#5: The Craftsman&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;The Craftsman’s primary motivation is quality and enjoyment of the work.&lt;/strong&gt; Common behaviors include the continual exercise and improvement of a set of specific skills or abilities and use of those skills as a means of self-expression. Examples: &lt;a href=&quot;http://en.wikipedia.org/wiki/Warren_Buffett&quot;&gt;Warren Buffett&lt;/a&gt; (investor and CEO of Berkshire Hathaway), &lt;a href=&quot;http://en.wikipedia.org/wiki/J.K._Rowling&quot;&gt;J.K. Rowling&lt;/a&gt; (author), and &lt;a href=&quot;http://en.wikipedia.org/wiki/Stephen_Spielberg&quot;&gt;Stephen Spielberg&lt;/a&gt; (filmmaker).&lt;/p&gt;
&lt;h3&gt;Why is Primary Motivation Important?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Here’s my first hypothesis: once you identify your primary motivation, you’ll find it much easier to achieve your goals.&lt;/strong&gt; These primary motivations appear to be relatively universal, and are based on very deep-seated psychological needs. Tapping into these sources of motivation directly allows people to accomplish their actual objectives more quickly, whatever they might be. Said another way, it’s easier to get what you really want if you identify what you really want.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My second hypothesis is that not all of these primary motivations lead to a lasting sense of personal satisfaction and fulfillment.&lt;/strong&gt; If you’re an Autocrat, there will always be people you do not control. If you’re a Narcissist, there will always be people who look down on or ignore you. If you’re a Hedonist, the &lt;a href=&quot;http://en.wikipedia.org/wiki/Hedonic_treadmill&quot;&gt;hedonic treadmill&lt;/a&gt; ensures that every pleasure eventually fades. If you’re an Architect, the world seems to have a tendency to stubbornly refuse to conform to your ideals.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When I look at the universe of “successful” people in the world, it appears that the Craftsman has the best shot at lasting personal satisfaction and fulfillment.&lt;/strong&gt; You ultimately can’t control the world or other people, but you &lt;span style=&quot;text-decoration: underline;&quot;&gt;can&lt;/span&gt; control your dedication to perfecting your craft and expressing yourself through your work.&lt;/p&gt;
&lt;p&gt;If we have a choice in determining our primary motivation, it seems that the Craftsman’s ethos has the most to offer: it may eventually lead to power, status, pleasure, and world-changing achievement, but it frees us from the perception that our self-worth depends on any of these things. That’s a remarkable combination.&lt;/p&gt;
&lt;p&gt;Thoughts?  Leave them in the comments.&lt;/p&gt;
&lt;div id=&quot;TixyyLink&quot;&gt;&lt;a href=&quot;http://personalmba.com/business-not-really-about-money/#ixzz0hKsiQFvJ&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/weizhou.wordpress.com/355/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/weizhou.wordpress.com/355/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/weizhou.wordpress.com/355/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/weizhou.wordpress.com/355/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/weizhou.wordpress.com/355/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/weizhou.wordpress.com/355/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/weizhou.wordpress.com/355/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/weizhou.wordpress.com/355/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/weizhou.wordpress.com/355/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/weizhou.wordpress.com/355/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/weizhou.wordpress.com/355/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/weizhou.wordpress.com/355/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/weizhou.wordpress.com/355/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/weizhou.wordpress.com/355/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=weizhou.wordpress.com&amp;amp;blog=2603969&amp;amp;post=355&amp;amp;subd=weizhou&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 05 Mar 2010 20:41:55 +0000</pubDate>
	<dc:creator>wei zhou</dc:creator>
</item>
<item>
	<title>Ehren Metcalfe: Dead code update (and problems finding uninitialized class members)</title>
	<guid isPermaLink="false">http://ehren.wordpress.com/?p=433</guid>
	<link>http://ehren.wordpress.com/2010/02/25/dead-code-update-and-problems-finding-uninitialized-class-members/</link>
	<description>&lt;p&gt;Well, I’ve fallen way behind with this blog again. Unfortunately, what I’ve done so far hasn’t worked out exactly as expected either. Anyway, here’s an update.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Finding Dead Code&lt;/strong&gt;&lt;br /&gt;
I’ve refined the script I posted previously to take into account the fact that indirect calls to virtual functions register in g++ as calls to the base method (among a few other things). It can be viewed &lt;a href=&quot;http://matrix.senecac.on.ca/~egmetcalfe/path.py&quot;&gt;here&lt;/a&gt;. Running this new analysis, I’ve learned that finding dead methods is even more difficult than finding dead functions. Why? A tonne of stuff is exported as part of the Mozilla public api. A function or even an entire class may seem dead but it’s likely used via javascript/xpcom inside the mozilla tree (or maybe in an extension).&lt;/p&gt;
&lt;p&gt;As far as I know, anything that derives from a class defined in an idl file probably can’t be marked dead and I suspect detecting this case will be most difficult. One thing I could take into account, however, are methods marked as &lt;code&gt;NS_SCRIPTABLE&lt;/code&gt; ie &lt;code&gt;__attribute__((user(&quot;NS_script&quot;)))&lt;/code&gt;. It would be easy to add this info to the node table in &lt;a href=&quot;https://developer.mozilla.org/en/Callgraph&quot;&gt;callgraph&lt;/a&gt;. Also, in regard to plain functions, I think it would be prudent to register function local address taking (of functions).&lt;/p&gt;
&lt;p&gt;On the bright side I think I’ve found a handful of unused functions (view sample output of the script showing these &lt;a href=&quot;http://matrix.senecac.on.ca/~egmetcalfe/maybe-dead-stuff.txt&quot;&gt;here&lt;/a&gt;). I may be able to gleam more info once I’m able to actually query my paths table though. Unfortunately, the latest incarnation of the script is only about 85% finished:&lt;br /&gt;
&lt;/p&gt;&lt;pre class=&quot;brush: plain;&quot;&gt;  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                         
28977 ehren     20   0 17804  12m 2132 R 100.1  0.4   2331:07 python
&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;That’s CPU time!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Uninitialized class members&lt;/strong&gt;&lt;br /&gt;
I’ve also put a bit of work into a more immediate analysis. &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=525063&quot;&gt;Bug 525063&lt;/a&gt; proposes an error for any class with uninitialized data members. It seemed like an interesting project perhaps as an introduction to ESP analysis (especially since the only state transitions are assignments and passing by reference). In fact, dmandelin’s already done work on an analysis for uninitialized variables in general which I originally attempted to adapt. This was not the easiest task however, although I have just recently learned why I was not successful (I think it relates to a malfunctioning of &lt;a href=&quot;http://hg.mozilla.org/rewriting-and-analysis/dehydra/file/d039748e7775/libs/unstable/analysis.js#l14&quot;&gt;create_decl_set&lt;/a&gt; which I have yet to diagnose).&lt;/p&gt;
&lt;p&gt;Giving up on ESP for the moment, I tried my hand doing things the simple way. That is, if there’s any code at all in the constructor that initializes a variable, then I consider that variable initialized. &lt;/p&gt;
&lt;p&gt;To accomplish this, I first wrote a &lt;a href=&quot;http://matrix.senecac.on.ca/~egmetcalfe/uninit-old.js&quot;&gt;rather ugly&lt;/a&gt; and unreadable version of the script. I then &lt;a href=&quot;http://matrix.senecac.on.ca/~egmetcalfe/uninit.js&quot;&gt;polished it up&lt;/a&gt; a bit. My days of using JS arrays for maps and sets is hopefully over and, in fact, I think I’d be able to take another run at an ESP analysis now. Unfortunately though, running my simple script has uncovered more fundamental problems.&lt;/p&gt;
&lt;p&gt;The bug comments mention classes with an overridden &lt;code&gt;operator new&lt;/code&gt; (containing a &lt;code&gt;memset(0)&lt;/code&gt; to initialize the data members) as one special case but this is nowhere near the largest problem. Consider &lt;a href=&quot;https://developer.mozilla.org/en/Adding_XPCOM_components_to_Mozilla_build_system#The_init_function&quot;&gt;this mdc page on xpcom&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;You can provide an initialization function for your class. This will be called immediately after your class is allocated and the constructor is called. The init function takes 0 arguments, returns an nsresult, and must be public. You can call it anything you like, just reference it from NS_GENERIC_FACTORY_CONSTRUCTOR_INIT (discussed below).
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Now we have the situation of variable initialization split across multiple functions. In fact, it’s even more complicated! Here’s an example:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://hg.mozilla.org/mozilla-central/file/9a4b73f92f0e/editor/libeditor/html/nsHTMLEditor.h#l750&quot;&gt;mCSSAware&lt;/a&gt; (part of nsHTMLEditor) is one ‘uninitialized’ member turned up by the script. Rather than being directly initialized in &lt;code&gt;Init()&lt;/code&gt; (or in the constructor), the initialization takes place in &lt;a href=&quot;http://hg.mozilla.org/mozilla-central/file/9a4b73f92f0e/editor/libeditor/html/nsHTMLEditor.h#l442&quot;&gt;UpdateForFlags&lt;/a&gt; which is called from &lt;code&gt;Init()&lt;/code&gt; &lt;a href=&quot;http://hg.mozilla.org/mozilla-central/file/9a4b73f92f0e/editor/libeditor/html/nsHTMLEditor.cpp#l276&quot;&gt;here&lt;/a&gt;. Luckily in this case the initializations are all within the same translation unit although I suspect this is not always the case.&lt;/p&gt;
&lt;p&gt;So, what would be the solution? If it’s worth doing, some kind of interprocedural analysis will have to be performed. I was thinking of collecting all the ‘uninitialized’ fields during compilation of both the constructor and any other functions identified as an inititializer. Initializers must include any member function called by an initializer (note that pass by reference is just simple initialization). If the set of uninitialized fields in a particular constructor intersected with the sets of fields from the other initializers is non-empty, you’ve found a genuine uninitialized field. &lt;/p&gt;
&lt;p&gt;I was thinking that if every initialization takes place in the same translation unit it might be possible to do this within the current static-checking framework ie by compiling only once. I’d basically just have to identify the set of data members not initialized for &lt;em&gt;every&lt;/em&gt; member function while building a mini call graph to eventually determine which of those member functions is really an initializer. It would then be a simple matter to take the intersection of the relevant sets of uninitialized fields. &lt;/p&gt;
&lt;p&gt;However, I suspect there’s probably more than a few cases where member function definitions are spread across translation units (Actually that might be a neat dehydra analysis if this behaviour’s unwanted). To deal with this case I’d have to store the sets of ‘uninitialized’ data members until the entire build is complete while also determining the set of initializing functions. I’d then have to determine which data members are really initialized during a post-compilation analysis.&lt;/p&gt;
&lt;p&gt;It might also be possible to produce the errors while the build process is still under way if I was able to query an sqlite database from within a treehydra script. I’m under the impression that the only way to use sqlite from js is by using xpcshell though so I don’t know if this suggestion would work. You’d still have to run a callgraph build prior to compilation anyway which takes quite some time. &lt;/p&gt;
&lt;p&gt;There’s also the issue of the accuracy of any analysis when the call graph will likely have to be pretty dumb ie unfeasible code in a particular function that contains a call will end up registering as an edge. I suppose it would also be necessary to relate a functions parameter’s (and any global data) to whether or not a particular call within a function is feasible or not (and so on). The ESP paper does discuss a framework for interprocedural analysis but that’s way out of my scope. It would probably still be a worthwhile analysis if this kind of stuff is not taken into account, however it kind of defeats the purpose of performing an ESP analysis to find which members are uninitialized.&lt;/p&gt;
&lt;p&gt;Anyway, I’ll report back (hopefully without such a long delay) when I’ve determined the next course of action.&lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/ehren.wordpress.com/433/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/ehren.wordpress.com/433/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/ehren.wordpress.com/433/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/ehren.wordpress.com/433/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/ehren.wordpress.com/433/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/ehren.wordpress.com/433/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/ehren.wordpress.com/433/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/ehren.wordpress.com/433/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/ehren.wordpress.com/433/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/ehren.wordpress.com/433/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/ehren.wordpress.com/433/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/ehren.wordpress.com/433/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/ehren.wordpress.com/433/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/ehren.wordpress.com/433/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://stats.wordpress.com/b.gif?host=ehren.wordpress.com&amp;amp;blog=9426727&amp;amp;post=433&amp;amp;subd=ehren&amp;amp;ref=&amp;amp;feed=1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 25 Feb 2010 14:16:10 +0000</pubDate>
	<dc:creator>ehren</dc:creator>
</item>

</channel>
</rss>

