<?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'><id>tag:blogger.com,1999:blog-18929277</id><updated>2008-07-24T06:02:57.464-07:00</updated><title type='text'>mykzilla</title><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default?start-index=26&amp;max-results=25'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>54</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-18929277.post-7113448444877220360</id><published>2008-07-14T17:29:00.000-07:00</published><updated>2008-07-14T17:30:14.802-07:00</updated><title type='text'>Snowl: an experiment with messaging in the browser</title><content type='html'>Last August, after Mitchell blogged about &lt;a  href="http://blog.lizardwrangler.com/2007/07/23/the-future-of-email/"&gt;the future of email&lt;/a&gt; and penned an &lt;a  href="http://blog.lizardwrangler.com/2007/07/25/email-call-to-action/"&gt;email call to action&lt;/a&gt;, I posted some thoughts about &lt;a  href="http://wiki.mozilla.org/MailNews_Talk:Future_of_Mail#Thoughts_On_a_Next-Gen_Conversations_App"&gt;what a next-generation conversations app might look like&lt;/a&gt;.&amp;nbsp; I've kept thinking about it since then, and several months ago I proposed a &lt;a  href="http://wiki.mozilla.org/Labs/Proposals/Snowl"&gt;labs experiment to build a Firefox extension&lt;/a&gt; that tries out some of those ideas.&lt;br&gt; &lt;br&gt; Lots of users use desktop applications like &lt;a  href="http://www.mozilla.com/en-US/thunderbird/"&gt;Thunderbird&lt;/a&gt; and &lt;a  href="http://www.apple.com/macosx/features/mail.html"&gt;Apple Mail&lt;/a&gt; to converse with each other online, while many others use web apps, including not only webmail but also social networks, web discussion forums, and other site/service-specific tools.&amp;nbsp; Is there a role for Firefox in this mix?&lt;br&gt; &lt;br&gt; That's the key question I'm trying to answer.&lt;br&gt; &lt;br&gt; I've been hacking on a prototype on and off since then.&amp;nbsp; It's not quite usable yet, but it's getting there.&amp;nbsp; It currently has basic support for subscribing to, searching, and browsing messages from feeds via two views: a list view similar to a three-pane email application's interface and a variant of the "river of news" view &lt;a  href="http://www.reallysimplesyndication.com/riverOfNews"&gt;described by Dave Winer&lt;/a&gt;.&lt;br&gt; &lt;br&gt; I plan to have a 0.1 version of the prototype ready by the &lt;a  href="http://wiki.mozilla.org/Summit2008"&gt;Mozilla Summit&lt;/a&gt; in two weeks, where I've proposed a &lt;a  href="http://wiki.mozilla.org/Summit2008/Sessions/Proposals/Snowl:_Messaging_in_the_Browser"&gt;session to present and discuss the experiment&lt;/a&gt;.&amp;nbsp; In the meantime, adventurous readers are welcome to &lt;a href="http://hg.mozilla.org/labs/snowl/"&gt;check out the source&lt;/a&gt; and send me feedback via comments on this blog post, &lt;a  href="mailto:myk@mozilla.org"&gt;email&lt;/a&gt;, &lt;a  href="irc://moznet/myk,isnick"&gt;IRC&lt;/a&gt;, &lt;a  href="http://www.facebook.com/inbox/?compose"&gt;Facebook&lt;/a&gt;, your own blog post that references this one, etcetera, etcetera, and so forth.&lt;br&gt; &lt;br&gt; </content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2008/07/snowl-experiment-with-messaging-in.html' title='Snowl: an experiment with messaging in the browser'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=7113448444877220360' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7113448444877220360'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7113448444877220360'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-42944240929924575</id><published>2008-07-07T23:59:00.001-07:00</published><updated>2008-07-07T23:59:53.689-07:00</updated><title type='text'>Why I Host Projects on Mozdev</title><content type='html'>I've been using &lt;a href="http://mozdev.org/"&gt;Mozdev&lt;/a&gt; for almost eight years, ever since it started hosting &lt;a  href="http://forumzilla.mozdev.org/"&gt;Forumzilla&lt;/a&gt;, my project to build a Mozilla-based web forum reader (which eventually became a Thunderbird extension and then Thunderbird's built-in feed reading feature).&lt;br&gt; &lt;br&gt; Mozdev plays the critical role in the Mozilla community of hosting Mozilla-related projects that aren't considered core enough to the Mozilla mission to host on official community infrastructure.&amp;nbsp; It's a great adjunct to &lt;a href="https://addons.mozilla.org/"&gt;AMO&lt;/a&gt;, which distributes many of the projects that Mozdev hosts.&lt;br&gt; &lt;br&gt; Over the years, I've been happy to host a number of such projects there, including the aforementioned Forumzilla plus &lt;a  href="http://bugxula.mozdev.org/"&gt;Bugxula&lt;/a&gt; (defunct), &lt;a  href="http://tinderstatus.mozdev.org/"&gt;Tinderstatus&lt;/a&gt;, and revision control/bug tracking for the &lt;a href="http://labs.mozilla.com/"&gt;Labs&lt;/a&gt; project &lt;a href="http://labs.mozilla.com/projects/personas/"&gt;Personas&lt;/a&gt;.&lt;br&gt; &lt;br&gt; Although there have always been alternatives, they have been unpalatable: &lt;a href="http://sourceforge.net/"&gt;SourceForge&lt;/a&gt; has a cumbersome and unfamiliar interface, and hosting on my own server would have meant doing all my own systems administration.&amp;nbsp; I use Mozdev because I want to focus on my projects, not on the infrastructure for developing them.&lt;br&gt; &lt;br&gt; Over the last couple of years, &lt;a href="http://code.google.com/"&gt;Google Code&lt;/a&gt; has become an option.&amp;nbsp; Although it provides much less functionality than Mozdev (and limits how many projects you can create), it does have a simpler interface and a more modern revision control system.&lt;br&gt; &lt;br&gt; The &lt;a href="http://www.mozdev.org/about.html"&gt;folks who run Mozdev&lt;/a&gt; (which includes me) want simplicity and modern services (without sacrificing power) for Mozdev too, and we've identified three priorities in that regard: adding &lt;a  href="http://www.selenic.com/mercurial/wiki/"&gt;Mercurial&lt;/a&gt; for revision control, implementing WYSIWYG content editing, and automating project creation and management.&lt;br&gt; &lt;br&gt; So I'm thrilled to read Mozdev developer &lt;a  href="http://www.silfreed.net/"&gt;Doug Warner&lt;/a&gt;'s announcement today, via a &lt;a  href="http://www.mozdev.org/pipermail/project_owners/2008-July/011603.html"&gt;post to the project owners mailing list&lt;/a&gt;, that he has landed Mercurial support.&amp;nbsp; Now you can get all the goodness of Hg hosted on your behalf for any of your Mozilla-related projects.&lt;br&gt; &lt;br&gt; Eight years later, I think Mozdev remains the best place to host my projects, and it's just getting better.&amp;nbsp; I can't wait to see what's next (and I have some ideas about what simple WYSIWYG editing could look like, about which more soon).&lt;br&gt; &lt;br&gt; </content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2008/07/why-i-host-projects-on-mozdev.html' title='Why I Host Projects on Mozdev'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=42944240929924575' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/42944240929924575'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/42944240929924575'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-6690854102747910871</id><published>2008-06-03T18:19:00.000-07:00</published><updated>2008-06-03T19:06:21.926-07:00</updated><title type='text'>Merging with Mercurial and Meld</title><content type='html'>When confronted with a merge conflict, Mercurial 0.9.5 (the version that comes with Ubuntu 8.04) uses its &lt;span style="font-style:italic;"&gt;hgmerge&lt;/span&gt; script to call &lt;a href="http://meld.sourceforge.net/"&gt;meld&lt;/a&gt; in a way that displays your version of the file on the left, the other version on the right, and hg's attempt to merge them in the middle, with conflict markers where it was unable to do so.&lt;br /&gt;&lt;br /&gt;Here's meld handling the &lt;a href="http://hgbook.red-bean.com/hgbookch3.html#x7-600003.2"&gt;&lt;span style="font-style:italic;"&gt;Merging conflicting changes&lt;/span&gt; example&lt;/a&gt; from the &lt;a href="http://hgbook.red-bean.com/hgbook.html"&gt;hg book&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/default-hgmerge-785866.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://www.melez.com/mykzilla/uploaded_images/default-hgmerge-785862.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;You're supposed to fix the one in the middle, resolving the conflicts between the ones on either side, and then save the middle one (which will get saved to your working directory, from where you can commit your merge).&lt;br /&gt;&lt;br /&gt;The following patch hacks &lt;span style="font-style:italic;"&gt;hgmerge&lt;/span&gt; to display the base version (the one from which your version and the other version originated) on the left, the other version on the right, and your version in the middle.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;--- hgmerge.orig        2008-06-01 13:51:10.000000000 -0700&lt;br /&gt;+++ hgmerge     2008-06-01 14:35:46.000000000 -0700&lt;br /&gt;@@ -158,13 +158,12 @@&lt;br /&gt;         conflicts_or_success&lt;br /&gt;     fi&lt;br /&gt; &lt;br /&gt;     if [ -n "$MELD" ]; then&lt;br /&gt;+        cp "$BACKUP" "$LOCAL"&lt;br /&gt;         cp "$BACKUP" "$CHGTEST"&lt;br /&gt;         # protect our feet - meld allows us to save to the left file&lt;br /&gt;-        cp "$BACKUP" "$LOCAL.tmp.$RAND"&lt;br /&gt;-        # Meld doesn't have automatic merging, so to reduce intervention&lt;br /&gt;-        # use the file with conflicts&lt;br /&gt;+        cp "$BASE" "$LOCAL.tmp.$RAND"&lt;br /&gt;         $MELD "$LOCAL.tmp.$RAND" "$LOCAL" "$OTHER" || failure&lt;br /&gt;         # Also it doesn't return good error code&lt;br /&gt;         $TEST "$LOCAL" -nt "$CHGTEST" &amp;&amp; conflicts_or_success || ask_if_merged&lt;br /&gt;     fi&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here again you're supposed to fix and save the file in the middle, which gets saved to your working directory.&lt;br /&gt;&lt;br /&gt;Here's what the example looks like using the hacked version of &lt;span style="font-style:italic;"&gt;hgmerge&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/hacked-hgmerge-746491.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://www.melez.com/mykzilla/uploaded_images/hacked-hgmerge-746179.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;After trying both versions of the script on several test and real merges (a few of which I screwed up), it's still not clear to me which approach is better (or if there's something better still).  &lt;a href="http://dbaron.org/"&gt;David Baron&lt;/a&gt; pointed out in a conversation that it can be useful to see the base version, but it's also useful to distinguish between your version and the version that ultimately results from the merge (which is presumably why &lt;a href="http://kdiff3.sourceforge.net/"&gt;kdiff3&lt;/a&gt;, which is &lt;a href="http://hgbook.red-bean.com/hgbookch3.html#x7-610003.2.1"&gt;shown in the book&lt;/a&gt;, displays all four: base, yours, other, and final).&lt;br /&gt;&lt;br /&gt;Thoughts?&lt;br /&gt;&lt;br /&gt;(Note: Devmo's &lt;a href="http://developer.mozilla.org/en/docs/Mercurial_basics"&gt;Mercurial basics&lt;/a&gt; says to use Mercurial version 1.0 or later, although I hear that doesn't even include &lt;span style="font-style:italic;"&gt;hgmerge&lt;/span&gt;, leaving configuration of a merge tool entirely up to each user, so the question is even more significant there.)</content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2008/06/merging-with-mercurial-and-meld.html' title='Merging with Mercurial and Meld'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=6690854102747910871' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6690854102747910871'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6690854102747910871'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-3387186777476893745</id><published>2008-06-03T16:42:00.000-07:00</published><updated>2008-06-03T17:37:34.179-07:00</updated><title type='text'>JS 1.8 syntax checking in Komodo</title><content type='html'>I've been using JavaScript 1.8 &lt;a href="http://developer.mozilla.org/en/docs/New_in_JavaScript_1.8#Expression_closures"&gt;expression closures&lt;/a&gt; lately, but &lt;a href="http://www.activestate.com/Products/komodo_ide/"&gt;ActiveState Komodo&lt;/a&gt;'s JS syntax checker, which is just &lt;a href="http://developer.mozilla.org/en/docs/SpiderMonkey"&gt;SpiderMonkey&lt;/a&gt; 1.7, doesn't recognize them, so it treats them as a syntax error and stops checking the file:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.melez.com/mykzilla/uploaded_images/screenshot-before-701247.png" alt="" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Fortunately, the fix turns out to be pretty simple.  Komodo ships with SpiderMonkey 1.7 as an executable, so I first built SpiderMonkey 1.8 (on Linux) using the &lt;a href="http://developer.mozilla.org/en/docs/SpiderMonkey_Build_Documentation"&gt;SpiderMonkey build instructions&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot co -l mozilla/js/src mozilla/js/src/config mozilla/js/src/editline mozilla/js/src/fdlibm&lt;br /&gt;cd mozilla/js/src&lt;br /&gt;BUILD_OPT=1 make -f Makefile.ref&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Then I backed up Komodo's version and replaced it with the one I built:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;cp Linux_All_OPT.OBJ/js ~/Applications/Komodo-IDE-4/lib/mozilla/js18&lt;br /&gt;cd ~/Applications/Komodo-IDE-4/lib/mozilla&lt;br /&gt;mv js js17&lt;br /&gt;ln -s js18 js&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Voila!  Syntax checking works for expression closures:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.melez.com/mykzilla/uploaded_images/screenshot-after-715874.png"/&gt;&lt;br /&gt;&lt;br /&gt;In theory I might have just horked some part of Komodo that depends on JS 1.7, although the &lt;a href="http://developer.mozilla.org/en/docs/New_in_JavaScript_1.8"&gt;New in JavaScript 1.8&lt;/a&gt; doc doesn't mention breaking changes between the two versions, and so far Komodo seems to be working fine.&lt;br /&gt;&lt;br /&gt;If it does create problems, however, then a more contained fix, as ActiveState's &lt;a href="http://blogs.activestate.com/toddw/"&gt;Todd Whiteman&lt;/a&gt; points out &lt;a href="http://aspn.activestate.com/ASPN/Mail/Message/komodo-discuss/3637025"&gt;on the Komodo Discuss mailing list&lt;/a&gt;, would be to update &lt;a href="http://grok.openkomodo.com/source/xref/openkomodo/trunk/src/lint/koXPCShellLinter.py#75"&gt;koXPCShellLinter.py's jsInterp variable&lt;/a&gt; to point to the 1.8 executable.</content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2008/06/js-18-syntax-checking-in-komodo.html' title='JS 1.8 syntax checking in Komodo'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=3387186777476893745' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3387186777476893745'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3387186777476893745'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-3663016023144225771</id><published>2008-05-11T23:41:00.000-07:00</published><updated>2008-05-12T00:44:24.890-07:00</updated><title type='text'>XPCOMless Preferences API</title><content type='html'>I've been working on &lt;span style="font-weight: bold;"&gt;yet another JavaScript API&lt;/span&gt; for accessing preferences. My goals for it are simplicity, intuitiveness, power, and perhaps performance.  I'm also interested in learning whether freeing it from the restrictions of XPCOM can make it better than existing APIs.&lt;br /&gt;&lt;h3&gt;The Basics&lt;/h3&gt;It's a JavaScript module, so you start by importing it from somewhere:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Components.utils.import("resource://somewhere/Preferences.js");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Getting and setting prefs is easy:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;let foo = Preferences.get("extensions.test.foo");&lt;br /&gt;Preferences.set("extensions.test.foo", foo);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As with &lt;a href="http://developer.mozilla.org/en/docs/FUEL"&gt;FUEL&lt;/a&gt;'s &lt;a href="http://developer.mozilla.org/en/docs/FUEL:PreferenceBranch"&gt;preferences API&lt;/a&gt;, datatypes are auto-detected, and you can pass a default value that the API will return if the pref doesn't have a value:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;let foo = Preferences.get("extensions.test.nonexistent", "default value");&lt;br /&gt;// foo == "default value"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Unlike FUEL, which returns null in the same situation, the module doesn't return a value when you get a nonexistent pref without specifying a default value:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;let foo = Preferences.get("extensions.test.nonexistent");&lt;br /&gt;// typeof foo == "undefined"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(Although the preferences service doesn't currently store &lt;span style="font-style:italic;"&gt;null&lt;/span&gt; values, other interfaces like &lt;a href="http://mxr.mozilla.org/mozilla/source/xpcom/ds/nsIVariant.idl"&gt;nsIVariant&lt;/a&gt; and &lt;a href="http://mxr.mozilla.org/mozilla/source/toolkit/components/contentprefs/public/nsIContentPrefService.idl"&gt;nsIContentPrefService&lt;/a&gt; and embedded storage engines like SQLite distinguish between the &lt;span style="font-style:italic;"&gt;null&lt;/span&gt; value and "doesn't have a value," as does JavaScript, so it seems more consistent and robust to do so here as well.)&lt;br /&gt;&lt;h3&gt;Look Ma, No XPCOM&lt;/h3&gt;Because we aren't using XPCOM, we can include some interesting API features.  First, as you may have noticed already, the interface doesn't require you to create a branch just to get a pref, but you can create one if you want to via an intuitive syntax:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;let testBranch = new Preferences("extensions.test.");&lt;br /&gt;// Preferences.get("extensions.test.foo") == testBranch.get("foo")&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The &lt;span style="font-style:italic;"&gt;get&lt;/span&gt; method uses polymorphism to enable you to retrieve multiple values in a single call, and, with JS 1.7's &lt;a href="http://developer.mozilla.org/en/docs/New_in_JavaScript_1.7#Destructuring_assignment"&gt;destructuring assignment&lt;/a&gt;, you can assign those values to individual variables:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;let [foo, bar, baz] = testBranch.get(["foo", "bar", "baz"]);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And &lt;span style="font-style:italic;"&gt;set&lt;/span&gt; lets you update multiple prefs in one call (although they still get updated individually on the backend, so each change results in a separate notification):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;testBranch.set({ foo: 1, bar: "awesome", baz: true });&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Performance?&lt;/h3&gt;Getting prefs via the module is several times slower than getting them directly from the preferences service, but it's much faster than using FUEL, and we can make the module just as fast as the direct approach by making it cache values (at some unknown &lt;span style="font-style:italic;"&gt;set&lt;/span&gt; and memory cost):&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.melez.com/mozilla/10k-gets.png" alt="chart showing performance of 10k gets via various methods" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Nevertheless I wonder if it's worth the added complexity and other iatrogenic costs of caching, given that preferences generally don't get accessed very frequently, and all of these methods are fast enough for small numbers of accesses.&lt;br /&gt;&lt;h3&gt;Everything Else&lt;/h3&gt;I haven't yet built the rest of the API (&lt;span style="font-style: italic;"&gt;has&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;reset&lt;/span&gt;/&lt;span style="font-style: italic;"&gt;clear&lt;/span&gt;, locking, adding and removing observers, etc.). Is it worth doing so?  Is this API better enough than FUEL's or simply direct access to the XPCOM preferences service?  And are there other improvements we can make given that we aren't limited to the language features XPCOM supports?&lt;br /&gt;&lt;br /&gt;(To try it out, download the &lt;a href="http://www.melez.com/mozilla/Preferences.js"&gt;Preferences&lt;/a&gt; and/or &lt;a href="http://www.melez.com/mozilla/CachingPreferences.js"&gt;CachingPreferences&lt;/a&gt; modules.)</content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2008/05/xpcomless-preferences-api.html' title='XPCOMless Preferences API'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=3663016023144225771' title='5 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3663016023144225771'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3663016023144225771'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-5823627140348869034</id><published>2008-04-28T17:30:00.000-07:00</published><updated>2008-04-28T17:31:01.002-07:00</updated><title type='text'>a trademark to distinguish network neutral providers</title><content type='html'>While on vacation last week, I saw a sign in front of a Burger King in New York advertising free wifi.&amp;nbsp; The sign listed six things you can do with it (downloading songs, chatting, etc.), which left me wondering whether they provide the whole whopping internet or just the selected portions they highlight.&lt;br&gt; &lt;br&gt; And that got me wondering whether it would make sense to trademark a logo and phrase for distinguishing internet providers that provide unobstructed access to make it easier for users to pick network neutral wifi hotspots at restaurants and hotels, DSL/cable providers, and mobile plans.&lt;br&gt; &lt;br&gt; Providers licensing the logo could still rate limit, as long as they didn't do so on the basis of site or protocol.&amp;nbsp; And the trademarked content would be designed to be simple and understandable by non-technical users, like Creative Commons' &lt;a  href="http://creativecommons.org/about/licenses"&gt;license logos&lt;/a&gt;, TRUSTe's &lt;a  href="http://www.truste.org/businesses/seal_programs_overview.php"&gt;privacy seals&lt;/a&gt;, and the &lt;a href="http://www.feedicons.com/"&gt;feed icon&lt;/a&gt;.&lt;br&gt; &lt;br&gt; I'm not sure what organization would be most suitable for running such a program, but it should be not-for-profit, as &lt;a  href="http://creativecommons.org/about/"&gt;Creative Commons&lt;/a&gt;, &lt;a  href="http://truste.org/about/index.php"&gt;TRUSTe&lt;/a&gt;, and &lt;a  href="http://www.mozilla.org/about/"&gt;Mozilla&lt;/a&gt; all are.&lt;br&gt; &lt;br&gt; Properly implemented, it seems like a program like this would make it a whole lot easier for users to pick providers that don't have frustrating problems caused by access obstructions while putting pressure on providers to provide the whole internet so they can qualify for the program.&lt;br&gt; &lt;br&gt; Thoughts?&lt;br&gt; &lt;br&gt; </content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2008/04/trademark-to-distinguish-network.html' title='a trademark to distinguish network neutral providers'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=5823627140348869034' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/5823627140348869034'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/5823627140348869034'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-8107945875039050823</id><published>2008-04-14T15:03:00.000-07:00</published><updated>2008-04-14T15:12:36.270-07:00</updated><title type='text'>me three</title><content type='html'>myk@myk:~$ uname -a&lt;br /&gt;Linux myk 2.6.22-14-generic #1 SMP Tue Feb 12 07:42:25 UTC 2008 i686 GNU/Linux&lt;br /&gt;myk@myk:~$ history|awk '{a[$2]++ } END{for(i in a){print a[i] " " i}}'|sort -rn|head&lt;br /&gt;115 cvs&lt;br /&gt;61 cd&lt;br /&gt;50 ls&lt;br /&gt;33 safari&lt;br /&gt;31 komodo&lt;br /&gt;28 firefox&lt;br /&gt;23 cp&lt;br /&gt;16 ll&lt;br /&gt;12 zip&lt;br /&gt;12 scp&lt;br /&gt;11 mv</content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2008/04/me-three.html' title='me three'/><link rel='related' href='http://blog.sandmill.org/2008/04/me-too.html' title='me three'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=8107945875039050823' title='4 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8107945875039050823'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8107945875039050823'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-7626050948949451396</id><published>2008-04-02T09:44:00.000-07:00</published><updated>2008-04-02T09:37:21.216-07:00</updated><title type='text'>proposed changes to Mozdev roadmap</title><content type='html'>I'm on the board of the &lt;a href="http://www.mozdev.org/about.html"&gt;Mozdev organization&lt;/a&gt;, and we're in the process of reviewing our &lt;a  href="http://www.mozdev.org/resources/roadmap.html"&gt;roadmap for development&lt;/a&gt;.&lt;br&gt; &lt;br&gt; We're a small organization with limited resources, so we can't do everything that would be useful, and it makes sense to leverage the tooling taking place elsewhere in the Mozilla community.&lt;br&gt; &lt;br&gt; At the same time, I want Mozdev to blaze a trail on the usability and functionality of key services like website development/deployment tools and discussion forums.&amp;nbsp; And it should be super-easy to set up and manage a project on Mozdev.&lt;br&gt; &lt;br&gt; So I am proposing that we revise the roadmap to make the following three items the top priorities for the organization:&lt;br&gt; &lt;ol&gt;   &lt;li&gt;&lt;b&gt;Add one additional revision control system, and deprecate CVS.&lt;/b&gt;&lt;br&gt;     &lt;br&gt; The two systems in the running are Subversion and Mercurial, and they each have their advantages.&amp;nbsp; Subversion's chief advantages are its similarity to CVS and familiarity to some existing project owners, while Mercurial's are its modern design (including support for distributed development) and its momentum in the Mozilla community.&lt;br&gt;     &lt;br&gt; Overall, I think we're better off adding Mercurial, which has the full weight of Mozilla tooling efforts behind it and which is on track to become the most popular system in the Mozilla community (until the next one comes along, anyway).&lt;br&gt;     &lt;br&gt; So I think we should add Mercurial to the site.&amp;nbsp; But this would not preclude adding Subversion as well at some point if resources became available to deploy and maintain it.&lt;br&gt;     &lt;br&gt;   &lt;/li&gt;   &lt;li&gt;&lt;b&gt;Implement a new website hosting service with simple WYSIWYG wiki publishing and scp/sftp/ftps file upload.&lt;/b&gt;&lt;br&gt;     &lt;br&gt; Here we're tackling two constituencies at once: those who just want a simple hosting option where it is easy to create and edit pages, and those who want complete control over the files that make up their site.&lt;br&gt;     &lt;br&gt; The file upload option also addresses the needs of users who generally want the simple approach but occasionally need to upload a file or two (f.e. an image to display on a page in the wiki or a presentation in PDF format).&lt;br&gt;     &lt;br&gt;   &lt;/li&gt;   &lt;li&gt;&lt;b&gt;Automate project creation and management so that project creation requests can be addressed in minutes or hours and users can self-manage their projects.&lt;/b&gt;&lt;br&gt;     &lt;br&gt; This item combines the &lt;i&gt;automate project creation process&lt;/i&gt; and &lt;i&gt;centralized account management system&lt;/i&gt; items from the second and third priority groups, respectively, on the &lt;a  href="http://www.mozdev.org/resources/roadmap.html"&gt;existing roadmap&lt;/a&gt;.&lt;br&gt;     &lt;br&gt; I think we should continue to require approval of new project requests from unknown people but no longer require approval of those from known, trusted people like existing project owners, so that trusted people can have a new project up and running in seconds.&lt;/li&gt; &lt;/ol&gt; There are certainly many other changes that would be beneficial, like integrating forums, feeds, mailing lists, and newsgroups, so users can pick their preferred delivery format and get the same communications as on every other channel.&lt;br&gt; &lt;br&gt; But these three changes would make a big difference in the usability and functionality of the site, and I think we should make them our top priorities.&lt;br&gt; &lt;br&gt; Thoughts?&lt;br&gt; &lt;br&gt; </content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2008/04/proposed-changes-to-mozdev-roadmap.html' title='proposed changes to Mozdev roadmap'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=7626050948949451396' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7626050948949451396'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7626050948949451396'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-8489598016536375060</id><published>2008-04-01T14:15:00.000-07:00</published><updated>2008-04-01T14:16:25.311-07:00</updated><title type='text'>Dynamic Personas - How They Work</title><content type='html'>The recently released &lt;a  href="http://labs.mozilla.com/2008/03/major-update-to-personas-for-firefox/"&gt;update to the Personas extension&lt;/a&gt; includes support for &lt;i&gt;dynamic personas&lt;/i&gt;, which are personas that change over time.&amp;nbsp; Here's a technical overview of the history and present condition of the feature (for a non-technical overview, see the &lt;a  href="http://labs.mozilla.com/2008/03/major-update-to-personas-for-firefox/"&gt;labs blog&lt;/a&gt;).&lt;br&gt; &lt;h3&gt;Take One&lt;/h3&gt; Original discussions for making personas more dynamic started with the idea of building an API for them to specify a series of background images and when to switch between them.&amp;nbsp; But the more ideas we had about what personas might want to do, the more complicated this API became.&lt;br&gt; &lt;br&gt; I wanted something both simpler to scale to more complex functionality and more powerful right off the bat, so I suggested we simply stick iframes behind the browser chrome at the top and bottom of the browser window, let personas load any web content (HTML, SVG, etc.) into them, and let them update themselves as needed ajaxically.&lt;br&gt; &lt;br&gt; That seemed promising, so I prototyped it by &lt;a  href="http://developer.mozilla.org/en/docs/XBL:XBL_1.0_Reference"&gt;XBL binding&lt;/a&gt; the top and bottom chrome into XUL stacks, making their backgrounds transparent, and sticking iframes underneath them.&lt;br&gt; &lt;br&gt; That worked great until I locked down the iframes with &lt;i&gt;type="content"&lt;/i&gt; for security, at which point they were hoisted to the tops of the stacks and covered up the browser chrome.&lt;br&gt; &lt;br&gt; I asked about this on IRC, and roc pointed me to &lt;a  href="https://bugzilla.mozilla.org/show_bug.cgi?id=130078"&gt;bug 130078&lt;/a&gt;, which &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=130078#c84"&gt;won't be fixed in Gecko 1.9&lt;/a&gt;.&amp;nbsp; So I had to find a different solution.&lt;br&gt; &lt;h3&gt;Take Two&lt;/h3&gt; The one I hit upon, which is in the latest release, preserves as much of the web content magic of the original solution while still working (safely).&amp;nbsp; And it still enables personas to change over time, albeit not as rapidly.&lt;br&gt; &lt;br&gt; The extension creates two iframes in the &lt;a  href="http://developer.mozilla.org/en/docs/Working_with_windows_in_chrome_code#The_hidden_window_hack"&gt;hidden window&lt;/a&gt;, loads the persona content into them (which can still be any web content), takes a snapshot of them using the canvas 2D context's &lt;a  href="http://developer.mozilla.org/en/docs/Drawing_Graphics_with_Canvas#Rendering_Web_Content_Into_A_Canvas"&gt;drawWindow&lt;/a&gt; method, converts the snapshots to &lt;a  href="http://developer.mozilla.org/en/docs/The_data_URL_scheme"&gt;data: URL&lt;/a&gt;-encapsulated PNG images using canvas's &lt;a  href="http://developer.mozilla.org/en/docs/Code_snippets:Canvas"&gt;toDataURL&lt;/a&gt; method, and then makes those images the background images for the top and bottom chrome.&lt;br&gt; &lt;h3&gt;Rinse and Repeat&lt;/h3&gt; The extension then leaves the persona loaded in the iframes and periodically (once per minute by default) updates the browser chrome with new snapshots.&amp;nbsp; And occasionally (once per hour by default) it reloads the persona from scratch, although personas are of course free to update themselves more frequently.&lt;br&gt; &lt;br&gt; Once per minute is obviously not fast enough for animation (like an aquarium with fish swimming around in your toolbar), but it's fast enough for gradual changes, like a panoramic landscape that darkens as the sun sets or a pictorial depiction of the weather report.&amp;nbsp; And there are plenty of interesting personas for which this update frequency is fast enough.&lt;br&gt; &lt;br&gt; (Incidentally, one can jack up the frequency with a hidden preference, but doing so is not recommended, since it could impact performance).&lt;br&gt; &lt;h3&gt;Bits and Pieces&lt;/h3&gt; When dynamic personas change the background, the optimal foreground color might change too, so the extension sets the foreground (text) color to the one specified on the root element of an HTML dynamic persona.&lt;br&gt; &lt;br&gt; For example, Heldenhaft's &lt;a  href="https://labs.mozilla.com/forum/index.php/topic,556.0.html"&gt;Paderborn, Germany panorama&lt;/a&gt; persona is dark at night and light in the daytime, so I adapted some code from an &lt;a  href="http://www.srrb.noaa.gov/highlights/sunrise/sunrise.html"&gt;NOAA Sunrise/Sunset Calculator&lt;/a&gt; to enable it to determine the status of the sun at its location and set its foreground color appropriately.&lt;br&gt; &lt;br&gt; And if you want to test out this "any web content" claim, just select &lt;i&gt;Preferences...&lt;/i&gt; from the personas menu, press the &lt;i&gt;Custom Persona Editor...&lt;/i&gt; button to open the custom persona editor, and enter any URL (f.e. &lt;a  href="http://www.mozilla.com/"&gt;http://www.mozilla.com/&lt;/a&gt;) into the Header or Footer fields.&amp;nbsp; It might not be pretty, but it'll show you a chunk of the page behind the chrome.&lt;br&gt; &lt;h3&gt;Locking it Down&lt;/h3&gt; The code is a actually bit more complicated than described above, because the hidden window is an HTML document on Windows and Linux, and &lt;a  href="http://developer.mozilla.org/en/docs/XPCNativeWrapper#What_is_a_trusted_window.3F"&gt;HTML iframes can't be locked down with type="content"&lt;/a&gt;.&lt;br&gt; &lt;br&gt; So instead of creating those iframes in the hidden window, it creates another iframe in the hidden window that loads a XUL document that contains the two iframes that load the persona content.&lt;br&gt; &lt;br&gt; Tests like &lt;a  href="https://bugzilla.mozilla.org/show_bug.cgi?id=408668#c10"&gt;this one&lt;/a&gt; (and a version that tests the personas code directly) demonstrate that the content iframes are indeed locked down, so while personas can do anything web content can do in a browser tab, they can't break out of the content jail and access chrome UI or capabilities.&lt;br&gt; &lt;br&gt; The only thing injected into chrome is static PNG snapshots of web content.&lt;br&gt; &lt;br&gt; Of course, if you can think of a way around that or another security issue, I and other Personas hackers would be very &lt;a  href="https://labs.mozilla.com/forum/index.php/board,18.0.html"&gt;interested in your thoughts&lt;/a&gt;.&amp;nbsp; To confirm your suspicions, &lt;a  href="http://people.mozilla.com/%7Ecbeard/personas/dist/personas-v1.0a1.xpi"&gt;install and test the extension&lt;/a&gt; or &lt;a  href="http://personas.mozdev.org/source.html"&gt;peruse the code online&lt;/a&gt;.&lt;br&gt; &lt;br&gt; </content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2008/04/dynamic-personas-how-they-work.html' title='Dynamic Personas - How They Work'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=8489598016536375060' title='4 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8489598016536375060'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8489598016536375060'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-43014350779762507</id><published>2008-03-24T17:30:00.000-07:00</published><updated>2008-03-24T18:34:16.684-07:00</updated><title type='text'>a trio of extensions</title><content type='html'>Last week while on vacation I spent a bit of time hacking, and I cooked up three extensions to improve the Firefox experience.&lt;br /&gt;&lt;br /&gt;The first two are pretty trivial:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/6800"&gt;Bookmark Toolbar Icons&lt;/a&gt; unhides those icons on the Mac using &lt;a href="http://blog.vlad1.com/"&gt;Vlad&lt;/a&gt;'s &lt;a href="http://blog.vlad1.com/2008/02/04/getting-bookmark-icons-back-on-your-toolbar/"&gt;user chrome code&lt;/a&gt; (with the enhancement &lt;a href="http://firebird-browser.de/" onclick="javascript:pageTracker._trackPageview('/outbound/commentauthor/firebird-browser.de');" rel="external nofollow"&gt;Abdulkadir Topal&lt;/a&gt; suggested in his &lt;a href="http://blog.vlad1.com/2008/02/04/getting-bookmark-icons-back-on-your-toolbar/#comment-289"&gt;comment on Vlad's post&lt;/a&gt;):&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/toolbar-icons-screenshot-740228.png"&gt;&lt;img style="cursor: pointer;" src="http://www.melez.com/mykzilla/uploaded_images/toolbar-icons-screenshot-740218.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Extensions are easier to install and remove than chunks of user chrome code, so this makes that enhancement accessible to greater numbers of users.&lt;br /&gt;&lt;br /&gt;&lt;hr size="2" width="100%"&gt;&lt;br /&gt;And &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/6829"&gt;Command-PageUp/PageDown&lt;/a&gt; lets you use those shortcuts for switching between tabs on the Mac, which is handy for &lt;span style="font-style: italic;"&gt;selectively closing tabs via the keyboard&lt;/span&gt;, since otherwise you have to switch accelerators between moving to a tab (&lt;span style="font-weight: bold; font-style: italic;"&gt;Ctrl&lt;/span&gt;&lt;span style="font-style: italic;"&gt;-PageUp/PageDown&lt;/span&gt;) and closing it (&lt;span style="font-weight: bold; font-style: italic;"&gt;Cmd&lt;/span&gt;&lt;span style="font-style: italic;"&gt;-W&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Besides making that use case easier, the Command accelerator feels a bit more Mactuitive in general, although there's no standard shortcut for tab-switching in particular.  Apple apps like Safari and Terminal use the clunky &lt;span style="font-style: italic;"&gt;Cmd-Shift-[/]&lt;/span&gt;, while &lt;a href="http://colloquy.info/"&gt;Colloquy&lt;/a&gt; uses &lt;span style="font-style: italic;"&gt;Cmd-LeftArrow/RightArrow&lt;/span&gt;, and &lt;a href="http://www.activestate.com/Products/komodo_ide/index.mhtml"&gt;ActiveState Komodo&lt;/a&gt; uses &lt;span style="font-style: italic;"&gt;Cmd-PageUp/PageDown&lt;/span&gt; (i.e. the same shortcut this extension enables in Firefox).&lt;br /&gt;&lt;br /&gt;&lt;hr size="2" width="100%"&gt;&lt;br /&gt;The third extension, &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/6830"&gt;Bookmarks UI Consolidator&lt;/a&gt;, is more involved.  It consolidates the Bookmarks menu in the menubar and the Smart Bookmarks folder in the Bookmarks Toolbar into a single Bookmarks folder in the toolbar:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/consolidator-screenshot-736383.png"&gt;&lt;img style="cursor: pointer;" src="http://www.melez.com/mykzilla/uploaded_images/consolidator-screenshot-736379.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Besides simplifying the UI, the extension makes the toolbar keyboard-accessible.  Just press &lt;span style="font-style: italic;"&gt;Alt-B&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;Ctrl-B&lt;/span&gt; on Mac) to focus and open the folder, &lt;span style="font-style: italic;"&gt;Esc&lt;/span&gt; to close it again (but leave it focused), and then the &lt;span style="font-style: italic;"&gt;LeftArrow/RightArrow&lt;/span&gt; keys (or &lt;span style="font-style: italic;"&gt;Tab/Shift-Tab&lt;/span&gt;) to move between items on the toolbar. &lt;span style="font-style: italic;"&gt;Space/Return/Enter&lt;/span&gt; on an item in the toolbar loads a focused bookmark and opens a focused folder.&lt;br /&gt;&lt;br /&gt;(That second step in the process, hitting &lt;span style="font-style: italic;"&gt;Esc&lt;/span&gt;, shouldn't be necessary, but I haven't yet figured out how to make the toolbar behave like the menubar, where hitting &lt;span style="font-style: italic;"&gt;RightArrow&lt;/span&gt; while a menu is open focuses the next menu to the right if the current menuitem doesn't have a submenu.)&lt;br /&gt;&lt;br /&gt;Note: focusing outside the toolbar turns off the focusability of its items, so you don't have to tab through all items on the toolbar every time you want to go from the Search bar to the tab strip.&lt;br /&gt;&lt;br /&gt;And while you can't drop off the toolbar with the arrow keys, you can drop off it with &lt;span style="font-style: italic;"&gt;Tab/Shift-Tab&lt;/span&gt; (as with the tab strip, although there it drops you off immediately; maybe the Bookmarks Toolbar should behave the same).&lt;br /&gt;&lt;br /&gt;Adding this keyboard access method allowed me to simplify further by removing the Bookmarks Toolbar menuitem, which was added primarily for accessibility over in &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=408938"&gt;bug 408938&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And replacing Smart Bookmarks with Bookmarks saves a "smart" amount of precious horizontal toolbar real estate for user bookmarks.&lt;br /&gt;&lt;br /&gt;I wonder how far we could take this kind of change.  Could we consolidate the History menu into the Back/Forward buttons dropdown menu? Could we get rid of the menubar entirely, integrating all menu-accessible functions into other UI (perhaps a command toolbar)?&lt;br /&gt;&lt;br /&gt;Maybe the four menu commands (Bookmark This Page, Subscribe to This Page, Bookmark All Tabs, and Organize Bookmarks) could be buttons on the Bookmarks Toolbar for better discoverability and immediate accessibility (although it would take up more of that precious toolbar space).</content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2008/03/trio-of-extensions.html' title='a trio of extensions'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=43014350779762507' title='6 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/43014350779762507'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/43014350779762507'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-4435388013599793007</id><published>2008-02-27T11:51:00.000-08:00</published><updated>2008-02-29T11:17:59.723-08:00</updated><title type='text'>thoughts on sheriffing</title><content type='html'>I sheriffed yesterday, on the last day before the code freeze for Firefox 3, beta 4.&amp;nbsp; &lt;a href="http://wiki.mozilla.org/Sheriff_Duty"&gt;Sheriffing&lt;/a&gt; is an unusual role within the Mozilla community in that it isn't distributed meritocratically.&amp;nbsp; It's a shared responsibility of the development team, and you can be assigned to sheriff without a clue how to do it.&lt;br&gt; &lt;br&gt; (That said, it's not clear how one gets on or off the &lt;a  href="http://www.google.com/calendar/embed?src=ajZ0a3Zxa3VmOWVsdWFsOGwydGJ1azJ1bWtAZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ"&gt;roster&lt;/a&gt;.&amp;nbsp; We'd benefit from a clear and simple policy here, like making it be the set of people who have checked in to Gecko and Firefox modules recently, or some other set that represents the most likely current stakeholders in the health of the tree.)&lt;br&gt; &lt;br&gt; And it's a pressure cooker, with lots of hard decisions to make, plenty of chances to screw things up, and a bevy of developers clamoring for a more or less open tree depending on their individual circumstances and biases.&lt;br&gt; &lt;br&gt; Nevertheless, it's great training in making hard decisions under pressure (with the safety net of revision control, unlike in the real world, where you can't uncut the red wire), and there are plenty of people helping out with advice and assistance with the chores of sheriffing.&lt;br&gt; &lt;br&gt; Reed Loden and David Baron, in particular, were a huge help to me yesterday in tracking down regressions, backing out patches, filing bugs, and the like.&amp;nbsp; And David ultimately took on the last leg of sheriffing when we extended the freeze a few hours to make up for a late tree closure (the &lt;a  href="http://wiki.mozilla.org/Tree_Closures#Closures"&gt;third that day&lt;/a&gt;).&amp;nbsp; Thanks guys!&lt;br&gt; &lt;br&gt; (Thanks too to Matthew Zeier for jumping in at midnight to kick a box that was preventing the tree from reopening!)&lt;br&gt; &lt;br&gt; Ultimately, despite the difficulties associated with an all "volunteer" force, I don't think I would professionalize the sheriff role.&amp;nbsp; The tree is our shared treasure, and sheriffing is a great eye opener to the project-wide costs of individual mistakes and the value of good tree etiquette, helping us develop into better stewards of the source.&amp;nbsp; I think it's worth the pain, but for a different perspective, see &lt;a href="http://weblogs.mozillazine.org/dougt/archives/002434.html"&gt;dougt's thoughts&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update: dougt's blog post has since been removed, but he's expressed his current thoughts on the subject in a &lt;a href="https://www.blogger.com/comment.g?blogID=18929277&amp;postID=4435388013599793007"&gt;comment on this post&lt;/a&gt;&lt;/b&gt;.</content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2008/02/thoughts-on-sheriffing.html' title='thoughts on sheriffing'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=4435388013599793007' title='4 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4435388013599793007'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4435388013599793007'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-8389913852455364741</id><published>2008-02-06T15:07:00.000-08:00</published><updated>2008-02-07T09:17:30.358-08:00</updated><title type='text'>better MDC searches from the search box</title><content type='html'>I had an "MDC (English)" search plugin (not sure where I got it from), but it wasn't returning the &lt;a  href="http://developer.mozilla.org/en/docs/Observer_Notifications"&gt;Observer Notifications&lt;/a&gt; page when I searched for "xpcom-shutdown".&amp;nbsp; Turns out it was using the old search engine instead of the new Nutch-based one, so I created a plugin that uses Nutch instead and &lt;a  href="http://mycroft.mozdev.org/developer/devlist.html?email=myk%40mozilla.org"&gt;uploaded it to Mycroft&lt;/a&gt;.&amp;nbsp; Grab it from there if you want better MDC searches from the search box.&lt;br&gt; &lt;br&gt; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update: the search plugin built into MDC now uses Nutch, so you can now simply install that one by going to MDC and then clicking the glowing icon in the search box.&lt;/b&gt;</content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2008/02/better-mdc-searches-from-search-box.html' title='better MDC searches from the search box'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=8389913852455364741' title='3 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8389913852455364741'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8389913852455364741'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-4386865931692176264</id><published>2007-12-17T12:11:00.001-08:00</published><updated>2007-12-19T14:02:50.151-08:00</updated><title type='text'>keeping up with the Joneses</title><content type='html'>I thought I'd mention a couple blogs I follow to keep abreast of what is happening with other browsers.&lt;br&gt; &lt;br&gt; First, Bernie Zimmerman (author of the GrayModern theme) tracks news about multiple browsers at his &lt;a href="http://browsersphere.com/"&gt;Browsersphere&lt;/a&gt; blog.&amp;nbsp; Second, WebKit and Safari news has long been available at &lt;a  href="http://webkit.org/blog/"&gt;Surfin' Safari&lt;/a&gt;, although I suspect the WebKit part of that will slowly move over to the new &lt;a  href="http://planet.webkit.org/"&gt;Planet WebKit&lt;/a&gt;.&lt;br&gt; &lt;br&gt; What blogs do you read to track the &lt;a href="http://en.wikipedia.org/wiki/Coopetition"&gt;coopetition&lt;/a&gt;?&lt;br&gt; &lt;br&gt;</content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2007/12/keeping-up-with-joneses.html' title='keeping up with the Joneses'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=4386865931692176264' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4386865931692176264'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4386865931692176264'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-4136557017021217453</id><published>2007-11-29T11:43:00.001-08:00</published><updated>2007-11-29T11:43:39.543-08:00</updated><title type='text'>Video of Joseph Smarr on High Performance JavaScript</title><content type='html'>Last month &lt;a href="http://josephsmarr.com/"&gt;Joseph Smarr&lt;/a&gt;, Chief Platform Architect at &lt;a href="http://www.plaxo.com/info"&gt;Plaxo&lt;/a&gt;, came to the MoCo office to talk about High Performance JavaScript: Why Everything You've Been Taught is Wrong.&lt;br&gt; &lt;br&gt; Joseph has tons of experience optimizing JavaScript for a large-scale AJAX application and gave a great presentation chock full of useful info for web app and Firefox chrome developers on improving the performance of JavaScript-based applications.&lt;br&gt; &lt;br&gt; A &lt;a  href="http://videos.mozilla.org/presentations/js-performance-10.25.2007.mov"&gt;video of Joseph's presentation&lt;/a&gt; is now available, and the &lt;a  href="http://josephsmarr.com/papers/Smarr-OSCON-2007.ppt"&gt;presentation slides&lt;/a&gt; are also online, so check it out.&amp;nbsp; Unless you've already seen it or are Joseph, you're going to learn something.&lt;br&gt; &lt;br&gt; </content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2007/11/video-of-joseph-smarr-on-high.html' title='Video of Joseph Smarr on High Performance JavaScript'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=4136557017021217453' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4136557017021217453'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4136557017021217453'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-624330705048082885</id><published>2007-11-15T03:15:00.001-08:00</published><updated>2007-11-15T03:15:49.260-08:00</updated><title type='text'>Alt-Tab-like history navigation</title><content type='html'>Here's an idea for an extension that I'll probably never get around to writing (but one of you might, perhaps for the &lt;a  href="http://labs.mozilla.com/contests/extendfirefox/"&gt;extension contest&lt;/a&gt;!):&lt;br&gt; &lt;br&gt; Overload Alt-(Left|Right)Arrow, the history back and forward keyboard shortcuts (Cmd-Arrows on Mac), to create an Alt-Tab-like experience with a row of thumbnail previews to which you can navigate by holding down the Alt key, pressing the arrow keys multiple times until you reach the target page, and then releasing the Alt key.&lt;br&gt; &lt;br&gt; In other words, do the same thing for history navigation that &lt;a  href="http://en.design-noir.de/"&gt;D&amp;atilde;o Gottwald&lt;/a&gt; is doing for tab navigation with his &lt;a  href="http://en.design-noir.de/mozilla/ctrl-tab/"&gt;Ctrl-Tab extension&lt;/a&gt;.&lt;br&gt; &lt;br&gt; (Bonus points for version 2: track non-linear meanderings and expose them as parallel tracks to which you can navigate with the up and down arrows.)&lt;br&gt; &lt;br&gt; </content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2007/11/alt-tab-like-history-navigation.html' title='Alt-Tab-like history navigation'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=624330705048082885' title='5 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/624330705048082885'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/624330705048082885'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-2815485524124522803</id><published>2007-11-15T00:26:00.001-08:00</published><updated>2007-11-15T00:26:52.865-08:00</updated><title type='text'>tabs for Thunderbird 2.0.0.9</title><content type='html'>Anticipating requests, I've spun some tab-enabled builds of the latest version of Mozilla's mail/news desktop app for &lt;a  href="http://www.melez.com/tabmail/thunderbird-2.0.0.9.en-US.linux-i686.tar.gz"&gt;Linux&lt;/a&gt;, &lt;a href="http://www.melez.com/tabmail/thunderbird-2.0.0.9.en-US.mac.dmg"&gt;Mac&lt;/a&gt;, and &lt;a  href="http://www.melez.com/tabmail/thunderbird-2.0.0.9.en-US.win32.installer.exe"&gt;Windows&lt;/a&gt;.&lt;br&gt; &lt;br&gt; Note that the Mac version is no longer compatible with Mac OS X 10.2, as my Mac build machine (a.k.a. my laptop) has been upgraded to Leopard and XCode 3.0 and no longer has the 10.2.8 SDK on it.&amp;nbsp; It should work on 10.3.9+, 10.4, and 10.5, however.&lt;br&gt; &lt;br&gt; p.s. Congrats to the Thunderbird team on the release of 2.0.0.9!&amp;nbsp; Getting a security and stability release out the door is no mean feat, requiring careful coordination between several groups of talented folk with a high standard for software quality that they consistently achieve.&amp;nbsp; Bravo!&lt;br&gt; &lt;br&gt; </content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2007/11/tabs-for-thunderbird-2009.html' title='tabs for Thunderbird 2.0.0.9'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=2815485524124522803' title='15 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2815485524124522803'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2815485524124522803'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-6827570048362574034</id><published>2007-10-31T02:12:00.001-07:00</published><updated>2007-10-31T02:12:17.433-07:00</updated><title type='text'>Mac OS 10.5 First Glance</title><content type='html'>I spend most of my time in an Ubuntu VM, so I don't use many of the features of my MacBook Pro's host OS.&amp;nbsp; But I upgraded to 10.5 yesterday for &lt;a  href="http://arstechnica.com/reviews/os/mac-os-x-10-5.ars/5#dtrace"&gt;dtrace&lt;/a&gt; and checked out a few other features in the process.&lt;br&gt; &lt;h3&gt;Spaces&lt;/h3&gt; Spaces works about as well as &lt;a href="http://virtuedesktops.info/"&gt;VirtueDesktops&lt;/a&gt;.&amp;nbsp; It's easier to configure, and it's less crashy, but it doesn't let me give my spaces names, which has been a palpable visual cue in VirtueDesktops that I've landed on the right one.&lt;br&gt; &lt;br&gt; And although moving to the right of the rightmost space usefully wraps around to the leftmost one, the transition animation shows me moving left (but not across the intermediate spaces), which confuses me every time.&lt;br&gt; &lt;br&gt; But most significantly, like VirtueDesktops it makes navigating to a window even more complex than it already was, with three somewhat-overlapping keyboard shortcuts: Control-ArrowKeys to change spaces, Command-Tab to change applications (across all spaces), and Command-BackQuote to change windows within an application.&lt;br&gt; &lt;br&gt; I'm constantly hitting the wrong key.&amp;nbsp; Maybe I'll get used to it, but I think I'll continue to prefer how I've configured multiple desktops in Ubuntu, where one shortcut (Control-Alt-ArrowKeys) switches between desktops and another (Control-Tab) switches between windows on that desktop.&amp;nbsp; I wish there was a way to do that on Mac.&lt;br&gt; &lt;h3&gt;Time Machine&lt;/h3&gt; Time Machine looks like it could replace the manual backups I currently do with &lt;a  href="http://www.shirt-pocket.com/SuperDuper/SuperDuperDescription.html"&gt;SuperDuper!&lt;/a&gt;.&amp;nbsp; It seems to lack a "back up everything now" button, which I want to press before leaving for a trip, but perhaps its automatic hourly backups are good enough.&lt;br&gt; &lt;br&gt; Nevertheless, it's unclear when and how it'll back up my 40GB Ubuntu virtual disk file, which is almost always open.&amp;nbsp; Maybe I could exclude that file from Time Machine backups and then back up the files inside it from within the VM.&lt;br&gt; &lt;br&gt; Unfortunately, there's no Time Machine (or even SuperDuper!) for Ubuntu, as far as I can tell, just a hundred blog posts describing how various smart folks have used some arcane combination of tar and rsync commands to back up their systems.&lt;br&gt; &lt;h3&gt;Networking&lt;/h3&gt; The Network preferences dialog is much better organized, which is nice, since I seem to visit it more often than I'd like.&amp;nbsp; But perhaps I'll be visiting it less now that Mac OS X no longer turns up its nose at my home network's WPA personal security after every taste of the office network's WPA2 enterprise security.&lt;br&gt; &lt;br&gt; The WPA2 enterprise username/password dialog also no longer goes away while I'm in the middle of filling it out if I take more than three seconds to do so, a welcome change.&lt;br&gt; &lt;h3&gt;VMWare Fusion&lt;/h3&gt; &lt;a href="http://www.vmware.com/products/fusion/"&gt;VMWare Fusion&lt;/a&gt; has a few minor issues in 10.5.&amp;nbsp; It no longer resizes my Linux VM's resolution when I plug my laptop into my external monitor, nor does it recenter the desktop when I go from the external monitor back to my laptop's display until I switch from full screen mode to window mode and back.&lt;br&gt; &lt;br&gt; And using Command-Tab to go to Fusion alternates between open Fusion VMs on two different spaces instead of taking me to the last one I used.&amp;nbsp; Plus the tools need &lt;a  href="http://communities.vmware.com/message/780207"&gt;some munging&lt;/a&gt; to properly integrate with X.&lt;br&gt; &lt;br&gt; But on the whole it still works fine, and I can continue to live in my full-screen Linux VM (from where I'm typing up this blog post now).&lt;br&gt; &lt;h3&gt;Appearance&lt;/h3&gt; I like the new darkness, with its multitude of gray tones.&amp;nbsp; But I bemoan the addition of even more rounded edges, like those at the bottoms of menus.&amp;nbsp; I prefer sharp edges in both virtual designs and physical ones (like cars and clothing), and its too bad everything has become a &lt;a href="http://boingboing.net/images/blobjects.htm"&gt;blobject&lt;/a&gt; since computers made it easy to draw a spline.&amp;nbsp; Bubble buttons, bubble cars, bleh.&lt;br&gt; &lt;br&gt; </content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2007/10/mac-os-105-first-glance.html' title='Mac OS 10.5 First Glance'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=6827570048362574034' title='6 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6827570048362574034'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6827570048362574034'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-2750215489078869376</id><published>2007-10-15T15:53:00.001-07:00</published><updated>2007-10-15T15:53:30.187-07:00</updated><title type='text'>automated JS code rewriting</title><content type='html'>&lt;a href="http://blog.mozilla.com/tglek"&gt;Taras Glek&lt;/a&gt; has been doing awesome work on a framework for automated C++ code rewriting.&amp;nbsp; I'd love to see something like that for JS code, since there are potential optimizations that are hard to do by hand (like changing the way we &lt;a  href="https://bugzilla.mozilla.org/show_bug.cgi?id=385809"&gt;memoize nullary methods&lt;/a&gt; or removing the &lt;a  href="https://bugzilla.mozilla.org/show_bug.cgi?id=389368"&gt;names of function expressions assigned to object properties&lt;/a&gt;).&lt;br&gt; &lt;br&gt; Maybe &lt;a  href="http://lxr.mozilla.org/mozilla/source/js/narcissus/jsparse.js"&gt;Narcissus&lt;/a&gt; could be repurposed to provide round-trip JavaScript parsing, modification, and reserializing?&amp;nbsp; This'd be a great project for someone who wants to help improve Firefox performance.&lt;br&gt; &lt;br&gt; </content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2007/10/automated-js-code-rewriting.html' title='automated JS code rewriting'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=2750215489078869376' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2750215489078869376'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2750215489078869376'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-3034824338624500683</id><published>2007-10-04T00:41:00.000-07:00</published><updated>2007-10-04T00:42:05.247-07:00</updated><title type='text'>Bo Yang's Advanced Microsummary Builder</title><content type='html'>This summer Bo Yang, a student at NanKai University in Tianjin, China, worked on a microsummary builder extension.&amp;nbsp; His goal was to make it easy for regular users to create custom live titles for pages while experimenting with some additional features for power users.&lt;br&gt; &lt;br&gt; He's recently uploaded the extension to addons.mozilla.org, and I've created a screencast showing it in action.&amp;nbsp; Check out the &lt;a  href="http://people.mozilla.com/%7Emyk/microsummaries/microsummary-builder-screencast.ogg"&gt;screencast&lt;/a&gt;, then try out the &lt;a  href="https://addons.mozilla.org/en-US/firefox/addon/5732"&gt;extension&lt;/a&gt; (Firefox 3 pre-releases or nightly builds only).&lt;br&gt; &lt;br&gt; Don't forget to file any &lt;a  href="http://advmicrosummarygenerator.mozdev.org/bugs.html"&gt;bugs&lt;/a&gt; you find, and let Bo know (in comments on this blog post or by &lt;a  href="mailto:struggleyb@gmail.com"&gt;emailing him directly&lt;/a&gt;) what kinds of pages you're summarizing and how the extension works for you.&lt;br&gt; &lt;br&gt; (For example, I used it to create a live title of timeandate.com's &lt;a  href="http://www.timeanddate.com/worldclock/"&gt;World Clock page&lt;/a&gt; showing the approximate time in Bo's time zone so I knew when I could expect to see him online.)&lt;br&gt; &lt;br&gt; </content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2007/10/bo-yangs-advanced-microsummary-builder.html' title='Bo Yang&apos;s Advanced Microsummary Builder'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=3034824338624500683' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3034824338624500683'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3034824338624500683'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-3874802988184981501</id><published>2007-09-20T05:06:00.000-07:00</published><updated>2007-09-20T01:59:11.882-07:00</updated><title type='text'>tabs for Thunderbird 2.0</title><content type='html'>A user of one of the "Thunderbird 1.5 with tabs" builds I made a couple years ago recently asked me if it would be possible to update the patch for Thunderbird 2.0.&amp;nbsp; After some wrangling, I got the patch to apply and behave itself in my testing, and I've spun some tab-enabled builds of 2.0.0.6 for &lt;a  href="http://www.melez.com/tabmail/thunderbird-2.0.0.6.en-US.linux-i686.tar.gz"&gt;Linux&lt;/a&gt;, &lt;a href="http://www.melez.com/tabmail/thunderbird-2.0.0.6.en-US.mac.dmg"&gt;Mac OS X&lt;/a&gt;, and &lt;a  href="http://www.melez.com/tabmail/thunderbird-2.0.0.6.en-US.win32.installer.exe"&gt;Windows&lt;/a&gt;.&lt;br&gt; &lt;br&gt; Note that the Thunderbird developers are implementing a different version of tabs for Thunderbird 3 over in &lt;a  href="https://bugzilla.mozilla.org/show_bug.cgi?id=218999"&gt;bug 218999&lt;/a&gt;.&amp;nbsp; So I won't be porting this patch to the trunk.&amp;nbsp; But if you can't wait for that release to get your tabs, these builds may be useful to you.&lt;br&gt; &lt;br&gt; To open a message in a tab, context-click it and select "Open message in new tab" from the context menu.&amp;nbsp; To make this the default behavior when opening messages, set Preferences &amp;gt; Advanced &amp;gt; General &amp;gt; &lt;i&gt;"Open new messages in"&lt;/i&gt; to &lt;i&gt;"A new message tab"&lt;/i&gt;.&lt;br&gt; &lt;br&gt; p.s. congrats to Thunderbird on the new organization!&amp;nbsp; I'm looking forward to great things from it.&lt;br&gt; &lt;br&gt; </content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2007/09/tabs-for-thunderbird-20.html' title='tabs for Thunderbird 2.0'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=3874802988184981501' title='15 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3874802988184981501'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3874802988184981501'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-2626875736542813806</id><published>2007-08-17T14:31:00.001-07:00</published><updated>2007-08-17T14:31:22.977-07:00</updated><title type='text'>Dave Winer's take on feed reading in Firefox</title><content type='html'>Dave Winer came to MoCo yesterday for a chat about feed reading.&lt;br&gt; &lt;br&gt; He gave us some food for thought, in particular the idea that limiting Firefox's feed reading functionality to a mere conduit for transferring feeds to the user's third-party reader of choice doesn't meet the needs of users who don't already understand the benefits of aggregated feed reading (which may well be a large majority of users).&lt;br&gt; &lt;br&gt; Dave suggested we instead integrate feed reading directly into Firefox (while preserving choice for users who want to use another app).&amp;nbsp; I'm inclined to agree, but I'll note that there's a third option: we could simply choose a default third-party feed reader, just as we've chosen a default search engine, and direct users there when they click on a feed.&lt;br&gt; &lt;br&gt; </content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2007/08/dave-winers-take-on-feed-reading-in.html' title='Dave Winer&apos;s take on feed reading in Firefox'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=2626875736542813806' title='6 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2626875736542813806'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2626875736542813806'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-34906723718072055</id><published>2007-07-27T04:26:00.001-07:00</published><updated>2007-07-27T04:26:29.301-07:00</updated><title type='text'>it's not just about Thunderbird</title><content type='html'>Folks seem to have missed half of Mitchell's recent &lt;a  href="http://weblogs.mozillazine.org/mitchell/archives/2007/07/email_futures.html"&gt;email call to action&lt;/a&gt;.&amp;nbsp; It wasn't only about finding a new home for Thunderbird.&lt;br&gt; &lt;br&gt; Mitchell also says that "we would also like to find contributors committed to creating and implementing a new vision of mail" and that "Mozilla has a range of resources - funds, code, etc. - that can be applied to this problem. We're looking for people with expertise, vision and leadership capabilities."&lt;br&gt; &lt;br&gt; MoCo's raison d'&amp;ecirc;tre isn't Firefox, it's improving the Internet through Firefox and other initiatives.&amp;nbsp; That's why it's investing in the mobile space with projects like &lt;a href="http://wiki.mozilla.org/Labs/Joey"&gt;Joey&lt;/a&gt;, and it's why Mitchell and others (like me) are interested in mail.&lt;br&gt; &lt;br&gt; But Thunderbird only has 5-10 million users (including me), while Firefox has 100 million, which means that at least 90% of Firefox users (and many more users of other browsers) are not being helped by Thunderbird.&lt;br&gt; &lt;br&gt; That's not because MoCo hasn't invested enough into Thunderbird, it's because Thunderbird isn't the right solution for those users.&amp;nbsp; And, based on its development trajectory to date, I don't expect that to change.&lt;br&gt; &lt;br&gt; But neither do the other extant mail apps serve their users particularly well.&amp;nbsp; As Mitchell says, we need a new vision for mail, and for me it's one that combines the portability of webmail with the usability of a desktop app and provides innovative new features for presenting and participating in conversations.&lt;br&gt; &lt;br&gt; So let's not only focus on what to do with Thunderbird, let's also figure out what to do about mail and how to do it.&lt;br&gt; &lt;br&gt; </content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2007/07/its-not-just-about-thunderbird.html' title='it&apos;s not just about Thunderbird'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=34906723718072055' title='8 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/34906723718072055'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/34906723718072055'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-3805507211736859511</id><published>2007-06-11T07:35:00.001-07:00</published><updated>2007-06-11T11:13:10.118-07:00</updated><title type='text'>multi-OS builds from one source tree</title><content type='html'>Someone asked me recently about the &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=297379"&gt;tabmail patch for Thunderbird&lt;/a&gt;, and, in some spare time between the &lt;a href="http://www.nyariegyetem.hu/"&gt;super-intensive Hungarian language classes&lt;/a&gt; I was attending the last two weeks, I thought I'd see what it would take to get the patch working in Thunderbird 2.0.&lt;br /&gt;&lt;br /&gt;I also figured I'd take the opportunity to switch my Windows build environment from the old Cygwin-based environment to the new MSYS-based &lt;a href="http://developer.mozilla.org/en/docs/Windows_Build_Prerequisites#MozillaBuild"&gt;MozillaBuild&lt;/a&gt; environment and--following &lt;a href="http://weblogs.mozillazine.org/roc/archives/2007/01/babes_in_toylan.html"&gt;roc's lead&lt;/a&gt;--try to set up a shared source directory on my Mac laptop that my Linux and Windows Parallels-based VMs could build from.&lt;br /&gt;&lt;br /&gt;Setting up an SMB/CIFS share in Mac OS X via &lt;cite&gt;Apple &gt; System Preferences &gt; Sharing&lt;/cite&gt; was trivial.&lt;br /&gt;&lt;br /&gt;And mounting the share in Linux also proved fairly easy.  I just had to install the &lt;cite&gt;smbfs&lt;/cite&gt; package (available from &lt;cite&gt;Applications &gt; Configuration &gt; Synaptic Package Manager&lt;/cite&gt; in Ubuntu 6.10) and then use Linux's standard mechanisms for mounting to an arbitrary filesystem location, f.e. via the smbmount command:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;smbmount //10.211.55.2/myk ~/Machome -o username=myk&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note: you need to &lt;cite&gt;setuid&lt;/cite&gt; on the &lt;cite&gt;smbmnt&lt;/cite&gt; and &lt;cite&gt;smbumount&lt;/cite&gt; binaries to be able to mount as a non-root user.&lt;br /&gt;&lt;br /&gt;Getting things working on Windows proved harder, however.  I tried to use &lt;cite&gt;mount&lt;/cite&gt; to mount the share:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mount \\10.211.55.2\myk /home/myk/Machome&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;But &lt;cite&gt;mount&lt;/cite&gt; complained "function not implemented", and googling for a solution proved unfruitful.&lt;br /&gt;&lt;br /&gt;Then I tried adding a mount point to &lt;cite&gt;/etc/fstab&lt;/cite&gt; per the instructions in &lt;cite&gt;/etc/fstab.sample&lt;/cite&gt;, which got MSYS to mount the share (after also restarting Windows, since MSYS only parses &lt;cite&gt;/etc/fstab&lt;/cite&gt; on DLL initialization), but then &lt;cite&gt;cl&lt;/cite&gt; mistranslated a filename on the share and died with this error:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cl -Fohost_cppsetup.obj -c -TC -nologo -Fdhost_cppsetup.pdb -DXP_WIN32 -DXP_WIN&lt;br /&gt;-DWIN32 -D_WIN32 -DNO_X11 -Ox -MD           -DINCLUDEDIR=\"/usr/include\"&lt;br /&gt;-DOBJSUFFIX=\".obj\"   -I../../dist/include/mkdepend -I../../dist/include&lt;br /&gt;-I../../dist/include/nspr    -I../../dist/sdk/include -I../../dist/include/nspr&lt;br /&gt;/home/myk/Machome/Projects/bonecho/mozilla/config/mkdepend/cppsetup.c&lt;br /&gt;cl : Command line warning D4002 : ignoring unknown option&lt;br /&gt;'//10.211.55.2/myk/Projects/bonecho/mozilla/config/mkdepend/cppsetup.c'&lt;br /&gt;cl : Command line error D2003 : missing source filename&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I thought perhaps I could fool &lt;cite&gt;cl&lt;/cite&gt; with a symbolic link:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ln -s /home/myk/Machome /home/myk/Machome2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;But MSYS's version of &lt;cite&gt;ln&lt;/cite&gt; apparently copies the directory (and all its contents) instead of linking to it (at least for network shares).&lt;br /&gt;&lt;br /&gt;Finally I discovered that I could map a drive letter to the share in &lt;cite&gt;Windows Explorer &gt; Tools &gt; Map Network Drive&lt;/cite&gt;, which MSYS (after restarting Windows again) maps to a path (&lt;cite&gt;/z&lt;/cite&gt; in my case) that--although it's not where I want it--at least doesn't get screwed up by &lt;cite&gt;cl&lt;/cite&gt;.&lt;br /&gt;&lt;br /&gt;So now things are (almost) working.  But not quite, as I'm seeing strange build errors like this one (when trying to build Firefox on the trunk):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/c/mozilla-build/moztools/bin/nsinstall -m 644 _xpidlgen/mozIPersonalDictionary.h _xpidlgen/mozISpellCheckingEngine.h _xpidlgen/mozISpellI18NUtil.h _xpidlgen/mozISpellI18NManager.h ../../../dist/include/spellchecker &lt;br /&gt;make[5]: Leaving directory `/home/myk/Projects/minefield/build/firefox-opt/extensions/spellcheck/idl'&lt;br /&gt;make[5]: Entering directory `/home/myk/Projects/minefield/build/firefox-opt/extensions/spellcheck/locales'&lt;br /&gt;make[5]: Leaving directory `/home/myk/Projects/minefield/build/firefox-opt/extensions/spellcheck/locales'&lt;br /&gt;make[5]: Entering directory `/home/myk/Projects/minefield/build/firefox-opt/extensions/spellcheck/myspell'&lt;br /&gt;make: Entering an unknown directory&lt;br /&gt;make: *** src: No such file or directory.  Stop.&lt;br /&gt;make: Leaving an unknown directory&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And this one (when trying to build Thunderbird with the tabmail patch against the 2.0.0.4 release tag):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/c/mozilla-build/moztools/bin/nsinstall /z/Projects/bonecho/mozilla/xpfe/bootstrap/showOSAlert.cpp /z/Projects/bonecho/mozilla/toolkit/xre&lt;br /&gt;nsinstall: cannot copy z:\Projects\bonecho\mozilla\xpfe\bootstrap\showOSAlert.cpp to z:\Projects\bonecho\mozilla\toolkit\xre\showOSAlert.cpp: Access is denied.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So I'm still working on building on Windows.&lt;br /&gt;&lt;br /&gt;FWIW, build times feel OK on Linux and bad (but tolerable, for occasional use) on Windows, where initial build configuration and CVS operations seem particularly slow.&lt;br /&gt;&lt;br /&gt;Speaking of CVS operations, I edited MozillaBuild's &lt;cite&gt;start-msvc71.bat&lt;/cite&gt; file to start &lt;cite&gt;ssh-agent&lt;/cite&gt; so I wouldn't have to enter my SSH key for every CVS transaction:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;start "MSYS Shell - MSVC7.1 Environment" &lt;span style="color: rgb(0, 0, 0); background-color: rgb(204, 255, 204);"&gt;"%MOZILLABUILD%\msys\bin\ssh-agent"&lt;/span&gt;&lt;br /&gt;"%MOZILLABUILD%\msys\bin\rxvt" -backspacekey  -sl 2500 -fg %FGCOLOR% -bg %BGCOLOR%&lt;br /&gt;-sr -fn "Lucida Console" -tn msys -geometry 80x25 -e /bin/bash --login -i&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note: unlike in Cygwin, &lt;cite&gt;ssh-add&lt;/cite&gt; in MSYS only registers &lt;cite&gt;~/.ssh/identity&lt;/cite&gt; by default.  To get it to register your SSH v2 DSA private key, you have to specify the path to that key on the command line, i.e.:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ssh-add ~/.ssh/id_dsa&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;FWIW, MozillaBuild is a dream to install compared to the old Cygwin-based environment, but I miss the more Unixy Cygwin, not to mention the much more functional &lt;a href="http://web.gccaz.edu/%7Emedgar/puttycyg/"&gt;Puttycyg&lt;/a&gt; terminal.</content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2007/06/multi-os-builds-from-one-source-tree.html' title='multi-OS builds from one source tree'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=3805507211736859511' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3805507211736859511'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3805507211736859511'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-4650795207731346493</id><published>2007-05-02T00:51:00.001-07:00</published><updated>2007-05-02T00:51:21.637-07:00</updated><title type='text'>The Importance of Good Translation</title><content type='html'>A Hungarian and an American were walking down the street, both of them wishing they were holding hands.&amp;nbsp; They'd been teaching English in the same Hungarian school for months, and they'd grown quite fond of each other.&lt;br&gt; &lt;br&gt; The American was talking about a man she knew, and the Hungarian grew worried about this potential rival.&amp;nbsp; "Did you two have a romantic relationship?" he eventually asked pensively.&lt;br&gt; &lt;br&gt; "No," the American reassured him, "it was platonic."&lt;br&gt; &lt;br&gt; The Hungarian was crushed.&amp;nbsp; In the Hungarian language, a pl&amp;aacute;t&amp;oacute;i relationship is an unrequited one, in which the pair still pines for each other.&amp;nbsp; Quite different from common usage in English to mean a relationship devoid of romantic attraction.&lt;br&gt; &lt;br&gt; So they didn't hold hands that day or any other for a year until they discovered the misunderstanding.&amp;nbsp; All because of that single error in translation.&lt;br&gt; &lt;br&gt; Fortunately, they did eventually discover the error, and last I heard, they were getting married.&lt;br&gt; &lt;br&gt; </content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2007/05/importance-of-good-translation.html' title='The Importance of Good Translation'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=4650795207731346493' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4650795207731346493'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4650795207731346493'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-4503462342935429094</id><published>2007-04-30T12:48:00.001-07:00</published><updated>2007-04-30T12:50:23.676-07:00</updated><title type='text'>toolsmith opportunity at Mozdev</title><content type='html'>The Mozilla-related job market seems to be heating up these days, and I even received an inquiry from a recruiter lately asking if I know of (or am) someone to hire.&lt;br&gt; &lt;br&gt; Job postings from that recruiter (and others) are available on &lt;a  href="http://groups.google.com/group/mozilla.jobs/topics"&gt;mozilla.jobs&lt;/a&gt;, and the Mozilla Corporation is &lt;a  href="http://www.mozilla.com/en-US/about/careers.html#software"&gt;also hiring&lt;/a&gt;, but I'd like to highlight something else: a &lt;a  href="http://www.mozdev.org/community/jobs.html"&gt;Web Apps Developer/Sysadmin contract position&lt;/a&gt; at &lt;a  href="http://www.mozdev.org/about.html"&gt;Mozdev&lt;/a&gt;.&lt;br&gt; &lt;br&gt; Mozdev provides project hosting and development tools to Mozilla-related projects, and we're looking for someone to enhance and integrate the services we provide.&lt;br&gt; &lt;br&gt; This is a fantastic opportunity for an engineer's engineer who really appreciates the value of good tools in the software development process and wants to implement and integrate the state of the art collaborative development tools (VCS, wiki, forum, bug tracking, etc.) and push the toolsmithing envelope.&lt;br&gt; &lt;br&gt; If you know of (or are) the right person for this job, then &lt;a  href="http://www.mozdev.org/community/jobs.html"&gt;don't hesitate to apply&lt;/a&gt;!&lt;br&gt; &lt;br&gt;</content><link rel='alternate' type='text/html' href='http://www.melez.com/mykzilla/2007/04/toolsmith-opportunity-at-mozdev.html' title='toolsmith opportunity at Mozdev'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=4503462342935429094' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://www.melez.com/mykzilla/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4503462342935429094'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4503462342935429094'/><author><name>Myk</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email></author></entry></feed>