<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-18929277</id><updated>2011-12-28T11:02:48.757-08:00</updated><category term='jetpack'/><title type='text'>mykzilla</title><subtitle type='html'>Myk Melez working on Mozilla projects</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default?start-index=101&amp;max-results=100'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>104</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-18929277.post-3538011216013400890</id><published>2011-10-17T10:38:00.001-07:00</published><updated>2011-10-17T10:38:52.345-07:00</updated><title type='text'>Mozilla Status Board Text is Markdown</title><content type='html'>It isn't documented anywhere that I can find, but Benjamin     Smedberg's handy &lt;a       href="http://benjamin.smedbergs.us/weekly-updates.fcgi/"&gt;Mozilla       Status Board&lt;/a&gt; tool parses status text as &lt;a       href="http://daringfireball.net/projects/markdown/"&gt;Markdown&lt;/a&gt;,     which is how I added a &lt;b&gt;Didn't&lt;/b&gt; header to the &lt;b&gt;Done&lt;/b&gt;     section of my &lt;a       href="http://benjamin.smedbergs.us/weekly-updates.fcgi/user/mykmelez"&gt;status       update&lt;/a&gt; with all the things I planned to do last week but     didn't make happen. (The &lt;b&gt;Done&lt;/b&gt;, &lt;b&gt;Next&lt;/b&gt;, and &lt;b&gt;Coordination&lt;/b&gt;     headers are all &lt;b&gt;H4&lt;/b&gt;s, so I prepended four hash marks to &lt;tt&gt;####       &lt;b&gt;Didn't&lt;/b&gt;&lt;/tt&gt; to make it the same size).&lt;br&gt;     &lt;br&gt;     (Note that &lt;tt&gt;[&lt;a         href="http://daringfireball.net/projects/markdown/basics"&gt;Markdown-style         links&lt;/a&gt;](&lt;a class="moz-txt-link-freetext" href="http://daringfireball.net/projects/markdown/basics"&gt;http://daringfireball.net/projects/markdown/basics&lt;/a&gt;)&lt;/tt&gt;     don't work and cause the entire section in which they appear to     remain unparsed. However angle-bracketed URLs, as recommended by &lt;tt&gt;&lt;a href="http://labs.apache.org/webarch/uri/rfc/rfc3986.html#delimiting"&gt;RFC         3986&lt;/a&gt;       &lt;a class="moz-txt-link-rfc2396E" href="http://labs.apache.org/webarch/uri/rfc/rfc3986.html#delimiting"&gt;&amp;lt;http://labs.apache.org/webarch/uri/rfc/rfc3986.html#delimiting&amp;gt;&lt;/a&gt;&lt;/tt&gt;,     work when added to the ends of lines. And "&lt;tt&gt;bug ###&lt;/tt&gt;"     references are auto-linkified.)&lt;br&gt;     &lt;br&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-3538011216013400890?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/3538011216013400890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=3538011216013400890' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3538011216013400890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3538011216013400890'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2011/10/mozilla-status-board-text-is-markdown.html' title='Mozilla Status Board Text is Markdown'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-3002229182794927051</id><published>2011-09-16T08:32:00.001-07:00</published><updated>2011-09-16T08:32:13.528-07:00</updated><title type='text'>to all the bugs I've filed before</title><content type='html'>The &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=20142"&gt;first       bug I filed&lt;/a&gt; was marked as &lt;i&gt;duplicate&lt;/i&gt;; the &lt;a       href="https://bugzilla.mozilla.org/show_bug.cgi?id=20187"&gt;second&lt;/a&gt;     was &lt;i&gt;worksforme&lt;/i&gt; (although Chris Petersen could reproduce it     before he couldn't anymore); and the &lt;a       href="https://bugzilla.mozilla.org/show_bug.cgi?id=24840"&gt;third&lt;/a&gt;     was &lt;i&gt;invalid&lt;/i&gt; (it was the spec, not the code, that was     errant). The &lt;a       href="https://bugzilla.mozilla.org/show_bug.cgi?id=25082"&gt;fourth&lt;/a&gt;     is the first that was &lt;i&gt;fixed&lt;/i&gt;.&lt;br&gt;     &lt;br&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-3002229182794927051?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/3002229182794927051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=3002229182794927051' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3002229182794927051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3002229182794927051'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2011/09/to-all-bugs-ive-filed-before.html' title='to all the bugs I&apos;ve filed before'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-2481752447493541518</id><published>2011-09-09T17:01:00.000-07:00</published><updated>2011-09-09T17:00:36.580-07:00</updated><title type='text'>"Next/Previous Tab" Keyboard Shortcuts on Windows</title><content type='html'>On my Windows laptop, I use the following four programs with tabbed     interfaces on a regular basis:&lt;br&gt;     &lt;ul&gt;       &lt;li&gt;Firefox&lt;/li&gt;       &lt;li&gt;Thunderbird&lt;/li&gt;       &lt;li&gt;Instantbird&lt;/li&gt;       &lt;li&gt;Komodo IDE&lt;/li&gt;     &lt;/ul&gt;     (I'd love to have tabs in my Windows terminal app of choice, &lt;a       href="http://code.google.com/p/mintty/"&gt;Mintty&lt;/a&gt;, but its     developer &lt;a       href="http://code.google.com/p/mintty/issues/detail?id=8"&gt;thinks       tabs should be implemented at the window manager level&lt;/a&gt;.)&lt;br&gt;     &lt;br&gt;     Unlike &lt;a href="http://mykzilla.blogspot.com/2011/09/nextprevious-tab-keyboard-shortcuts-on.html"&gt;on       my Mac&lt;/a&gt;, all those programs implement the same keyboard     shortcut for switching to the previous/next tab, and it's a simple     one with just a two-key chord: Control + PageUp / PageDown.&lt;br&gt;     &lt;br&gt;     Ha!&lt;br&gt;     &lt;br&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-2481752447493541518?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/2481752447493541518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=2481752447493541518' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2481752447493541518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2481752447493541518'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2011/09/nextprevious-tab-keyboard-shortcuts-on_09.html' title='&quot;Next/Previous Tab&quot; Keyboard Shortcuts on Windows'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-1639696569383368856</id><published>2011-09-08T17:03:00.001-07:00</published><updated>2011-09-08T17:03:31.723-07:00</updated><title type='text'>"Next/Previous Tab" Keyboard Shortcuts on Mac</title><content type='html'>On my Mac, I use the following five programs with tabbed interfaces     on a regular basis:&lt;br&gt;     &lt;ul&gt;       &lt;li&gt;Firefox&lt;/li&gt;       &lt;li&gt;Thunderbird&lt;/li&gt;       &lt;li&gt;Adium&lt;/li&gt;       &lt;li&gt;Terminal&lt;/li&gt;       &lt;li&gt;Komodo IDE&lt;/li&gt;     &lt;/ul&gt;     &lt;br&gt;     And those programs implement the following five different keyboard     shortcuts for switching to the previous/next tab:&lt;br&gt;     &lt;ul&gt;       &lt;li&gt;Control + PageUp / PageDown (Firefox, Thunderbird)&lt;br&gt;       &lt;/li&gt;       &lt;li&gt;Command + LeftArrow / RightArrow (Adium)&lt;/li&gt;       &lt;li&gt;Command + PageUp / PageDown (Komodo IDE)&lt;/li&gt;       &lt;li&gt;Command + Shift + [ / ] (Terminal)&lt;/li&gt;       &lt;li&gt;Command + Shift + LeftArrow / RightArrow (Terminal)&lt;/li&gt;     &lt;/ul&gt;     Hrm.&lt;br&gt;     &lt;br&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-1639696569383368856?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/1639696569383368856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=1639696569383368856' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/1639696569383368856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/1639696569383368856'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2011/09/nextprevious-tab-keyboard-shortcuts-on.html' title='&quot;Next/Previous Tab&quot; Keyboard Shortcuts on Mac'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-4435398397928021957</id><published>2011-09-07T14:25:00.000-07:00</published><updated>2011-09-20T11:37:47.397-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jetpack'/><title type='text'>gitflow vs. the SDK</title><content type='html'>&lt;a href="http://nvie.com/posts/a-successful-git-branching-model/"&gt;gitflow&lt;/a&gt; is a model for developing and shipping software using &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt;. &lt;a href="https://addons.mozilla.org/en-US/developers/builder"&gt;Add-on SDK&lt;/a&gt; uses Git, and &lt;a href="https://wiki.mozilla.org/Jetpack/Development_Process"&gt;it too has a model&lt;/a&gt;, which is similar to gitflow in some ways and different in others. Here's a comparison of the two and some thoughts on why they vary.&lt;br /&gt;&lt;br /&gt;First, some similarities: both models use multiple branches, including an ongoing branch for general development and another ongoing branch that is always ready for release (their names vary, but that's a trivial difference). Both also permit development on temporary feature (topic) branches and utilize a branch for stabilization of the codebase leading up to a release. And both accommodate the occasional hotfix release in similar ways.&lt;br /&gt;&lt;br /&gt;(Aside: gitflow appears to encourage feature branches, but I tend to agree with &lt;a href="http://martinfowler.com/bliki/FeatureBranch.html"&gt;Martin Fowler&lt;/a&gt; through &lt;a href="http://pauljulius.com/blog/2009/09/03/feature-branches-are-poor-mans-modular-architecture/"&gt;Paul Julius&lt;/a&gt; that continuously integrating with a central development branch is preferable.)&lt;br /&gt;&lt;br /&gt;Second, some differences: the SDK uses a single ongoing stabilization branch, while gitflow uses multiple short-lived stabilization branches, one per release. And in the SDK, stabilization fixes land on the development branch and then get cherry-picked to the stabilization branch; whereas in gitflow, stabilization fixes land on the stabilization branch and then get merged to the development branch.&lt;br /&gt;&lt;br /&gt;(Also, the SDK releases on a regular time/quality-driven "train" schedule similar to &lt;a href="http://mozilla.github.com/process-releases/draft/development_overview/"&gt;Firefox's&lt;/a&gt;, while  gitflow may anticipate an irregular feature/quality-driven release schedule, although it can be  applied to projects with train schedules, like &lt;a href="http://lloyd.io/applying-gitflow"&gt;BrowserID&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;A benefit of gitflow's approach to stabilization is that its change graph includes only distinct changes, whereas cherry-picking adds duplicate, semi-associated changes to the SDK's graph. However, a downside of gitflow's approach is that developers must attend to where they land changes, whereas SDK developers always land changes on its development branch, and its release manager takes on the chore of getting those changes onto the stabilization branch.&lt;br /&gt;&lt;br /&gt;(It isn't clear what happens in gitflow if a change lands on the development branch while a release is being stabilized and afterward is identified as being wanted for the release. Perhaps it gets cherry-picked?)&lt;br /&gt;&lt;br /&gt;Overall, these models seem fairly similar, and it wouldn't be too hard to make the SDK's be essentially gitflow. We would just need to stipulate that developers land stabilization fixes on the stabilization branch, and the release manager's job would then be to merge that branch back to the development branch periodically instead of cherry-picking in the other direction.&lt;br /&gt;&lt;br /&gt;However, it isn't clear to me that such a change would be preferable. What do you think?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-4435398397928021957?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/4435398397928021957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=4435398397928021957' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4435398397928021957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4435398397928021957'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2011/09/gitflow-vs-sdk.html' title='gitflow vs. the SDK'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-8020854027593557159</id><published>2011-08-21T22:51:00.000-07:00</published><updated>2011-09-20T11:38:43.594-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jetpack'/><title type='text'>Administer Git? Get a job!</title><content type='html'>As I &lt;a href="http://mykzilla.blogspot.com/2011/08/why-add-on-sdk-doesnt-land-in-mozilla.html"&gt;mentioned       recently&lt;/a&gt;, &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; (on &lt;a       href="https://github.com/"&gt;GitHub&lt;/a&gt;) has become a popular VCS     for Mozilla-related projects.&lt;br&gt;     &lt;br&gt;     GitHub is a fantastic tool for collaboration, and the site does a     great job running a Git server, but given the importance of the VCS,     and because Mozilla's automated test machines don't have access to     servers outside the Mozilla firewall, Mozilla should &lt;a       href="https://bugzilla.mozilla.org/show_bug.cgi?id=528360"&gt;run its       own Git server&lt;/a&gt; (that syncs with GitHub, so developers can     continue to use that site for collaboration).&lt;br&gt;     &lt;br&gt;     Unfortunately, the organization doesn't have a great deal of     in-house Git server administration experience, but we're &lt;a href="http://hire.jobvite.com/CompanyJobs/Careers.aspx?c=qpX9Vfwa&amp;amp;cs=9Kt9Vfw1&amp;amp;page=Job%20Description&amp;amp;j=oIfPVfwr"&gt;hiring       systems administrators&lt;/a&gt;, so if you grok Git hosting and meet     the other requirements, &lt;a href="http://hire.jobvite.com/CompanyJobs/Careers.aspx?c=qpX9Vfwa&amp;amp;page=Apply&amp;amp;j=oIfPVfwr"&gt;send       in your resume&lt;/a&gt;!&lt;br&gt;     &lt;br&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-8020854027593557159?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/8020854027593557159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=8020854027593557159' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8020854027593557159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8020854027593557159'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2011/08/administer-git-get-job.html' title='Administer Git? Get a job!'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-1307851753993957811</id><published>2011-08-11T13:33:00.000-07:00</published><updated>2011-09-20T11:38:43.545-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jetpack'/><title type='text'>Why the Add-on SDK Doesn't "Land in mozilla-central"</title><content type='html'>Various Mozillians sometimes suggest that the Add-on SDK should "land  in mozilla-central" and wonder why it doesn't. Here's  why.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The Add-on SDK depends on features of Firefox (and Gecko), and the SDK's development process synchronizes its release schedule with Firefox's. Nevertheless, the SDK  isn't a component of Firefox, it's a distinct product with its own  codebase, development process, and release schedule.&lt;br /&gt;&lt;br /&gt;Mozilla makes multiple products that interact with Firefox  (addons.mozilla.org, a.k.a. AMO, is another), and distinct product development  efforts should generally utilize separate code repositories, to avoid  contention between the projects regarding tree management, the stages of  the software development lifecycle (i.e. when which branch is in alpha,  beta, etc.), and the schedules for merging between branches.&lt;br /&gt;&lt;br /&gt;There can be exceptions to that principle, for products that share a  bunch of code, use the same development process, and have the same  release schedule (cf. the Firefoxes for desktop and mobile). But the  SDK is not one of those exceptions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It shares no code with Firefox. Its process utilizes one fewer branch  and six fewer weeks of development than the Firefox development process,  to minimize the burden of branch management and stabilization build  testing on its much smaller development team and testing community. And  it merges its branches and ships its releases two weeks before Firefox, to give AMO and addon developers time to update addons for each new version of the browser.&lt;br /&gt;&lt;br /&gt;Living in its own repository makes it possible for the SDK to have these differences in its process, and it also makes it possible for us to change the  process in the future, for example to move up the branch/release dates  one week, if we discover that AMO and addon developers would benefit from three  weeks of lead time; or to ship twice as frequently, if we determine  that doing so would get APIs for new Firefox features into  developers' hands faster.&lt;br /&gt;&lt;br /&gt;Finally, the Jetpack project has a vibrant community of contributors  (including both organization staff and volunteers) who strongly prefer  contributing via Git and &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;, because they find it easier, more efficient, and more  enjoyable, and for whom working in mozilla-central would mean taking too  great a hit on their productivity, passion, and participation.&lt;br /&gt;&lt;br /&gt;Mozilla Labs innovates not only on features and  user experience but also on development process and tools, and while Jetpack didn't lead the way to GitHub, we were a fast follower once  early experiments validated its benefits. And our experience since then has only confirmed our decision, as GitHub has proven to be a fantastic tool for branch management, code review/integration, and other software development tasks.&lt;br /&gt;&lt;br /&gt;Other Mozillians agree: there are now almost two hundred members and  over one hundred repositories (not counting forks) in the Mozilla organization on GitHub, with major initiatives like &lt;a href="https://github.com/mozilla/openwebapps"&gt;Open Web Apps&lt;/a&gt; and &lt;a href="https://github.com/mozilla/browserid"&gt;BrowserID&lt;/a&gt; being hosted there, not to mention all the  Mozilla projects in user repositories, including &lt;a href="https://github.com/graydon/rust"&gt;Rust&lt;/a&gt; and &lt;a href="https://github.com/jbalogh/zamboni"&gt;Zamboni&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Even if we don't make mozilla-central the canonical repository for SDK  development, however, we could still periodically drop a copy of the SDK  source against which Firefox changes should be tested into  mozilla-central. And doing so would theoretically make it easier for Firefox  developers to run SDK tests when they discover that a Firefox change  breaks the SDK, because they wouldn't have to get the SDK first.&lt;br /&gt;&lt;br /&gt;But the benefit to Firefox developers is minimal. Currently, we  periodically drop a reference to the SDK revision against which Firefox  changes should be tested, and developers have to do the following to  initiate testing:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;nbsp; wget -i testing/jetpack/jetpack-location.txt -O addon-sdk.tar.bz2&lt;br /&gt;&amp;nbsp; tar xjf addon-sdk.tar.bz2&lt;br /&gt;&amp;nbsp; cd addon-sdk-[revision]&lt;br /&gt;&amp;nbsp; source bin/activate&lt;br /&gt;&amp;nbsp; cfx testall --binary path/to/Firefox/build&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;We can simplify this to:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;nbsp; testing/jetpack/clone&lt;br /&gt;&amp;nbsp; cd addon-sdk&lt;br /&gt;&amp;nbsp; source bin/activate&lt;br /&gt;&amp;nbsp; cfx testall --binary path/to/Firefox/build&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Whereas if we dropped the source instead of just a reference to it, it would instead be the only slightly simpler:  &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;nbsp; cd testing/jetpack/addon-sdk&lt;br /&gt;&amp;nbsp; source bin/activate&lt;br /&gt;&amp;nbsp; cfx testall --binary path/to/Firefox/build&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Either of which can be abstracted to a single make target.&lt;br /&gt;&lt;br /&gt;But if we were to drop source instead of a reference thereto, the drops  would be larger and riskier changes. And test automation would  still need to be updated to support Git (or at least continue to use  brittle Git -&amp;gt; Mercurial mirroring), in order to run tests on SDK  changes, which periodic source drops do not address.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now, this doesn't mean that no SDK code will ever land in mozilla-central.&lt;br /&gt;&lt;br /&gt;Various folks have discussed integrating parts of the SDK into core  Firefox&lt;span class="st"&gt;—&lt;/span&gt;including stable API implementations, the module loader, and  possibly the bootstrapper&lt;span class="st"&gt;—&lt;/span&gt;to reduce the size of addon packages, improve  addon startup times, and decrease addon memory consumption. I have  written a very preliminary draft of a &lt;a href="https://wiki.mozilla.org/Features/Jetpack/Land_Parts_of_Add-on_SDK_In_Core"&gt;feature page describing this work&lt;/a&gt;,  although I do not think it is a high priority at the moment, relative to the other priorities identified in the &lt;a href="https://wiki.mozilla.org/Jetpack/Roadmap"&gt;Jetpack roadmap&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And Dietrich Ayala recently suggested &lt;a href="http://groups.google.com/group/mozilla.dev.planning/browse_frm/thread/2b57ebe15aad4130"&gt;integrating the SDK into core  Firefox for use by core features&lt;/a&gt;,  by which he presumably also means the API implementations/module  loader/bootstrapper rather than the command-line tool for testing and  packaging addons.&lt;br /&gt;&lt;br /&gt;Nevertheless, I am (and, I suspect, the whole Jetpack team is) even open  to discussing integration of the command-line tool (or its replacement  by a graphical equivalent), merging together the two products, and  erasing the distinction between them, just as Firefox ships with core  features for web development.&amp;nbsp; We've even drafted a &lt;a href="https://wiki.mozilla.org/Features/Jetpack/Add-on_SDK_as_an_Addon"&gt;feature page for  converting the SDK into an addon&lt;/a&gt;,  which is a big step in that direction.&lt;br /&gt;&lt;br /&gt;But until that happens, farther on up the road, the SDK is its own  product that we develop with its own process and ship on its own schedule. And it has good reason to live in its own repository, and a Git one at that, as do the many (and growing number of) other Mozilla projects using similar processes and tools, which our community-wide development, collaboration, and testing infrastructure must evolve to accommodate.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-1307851753993957811?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/1307851753993957811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=1307851753993957811' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/1307851753993957811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/1307851753993957811'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2011/08/why-add-on-sdk-doesnt-land-in-mozilla.html' title='Why the Add-on SDK Doesn&apos;t &quot;Land in mozilla-central&quot;'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-6715608859512848344</id><published>2010-12-02T11:07:00.001-08:00</published><updated>2011-09-20T11:38:43.568-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jetpack'/><title type='text'>SDK Training and More at Add-on-Con</title><content type='html'>&lt;div class="moz-text-html" lang="x-western"&gt;Next Wednesday, December       8, I'll be at &lt;a href="http://addoncon.com/"&gt;Add-on-Con&lt;/a&gt;.&lt;br&gt;       &lt;br&gt;       In the morning, I'll conduct a training session introducing       Mozilla's new Add-on SDK, which makes it faster and easier to       build Firefox add-ons. Afterwards, I'll be around and about to       discuss add-ons and answer questions about the SDK and add-on       development generally.&lt;br&gt;       &lt;br&gt;       Lots of other Mozilla folks will also be on hand over the course       of the two-day conference, including &lt;a         href="http://www.oxymoronical.com/"&gt;Dave Townsend&lt;/a&gt;, Jorge       Villalobos, &lt;a href="http://jboriss.wordpress.com/"&gt;Jeniffer         Boriss&lt;/a&gt;, &lt;a href="http://starkravingfinkle.org/blog/"&gt;Mark         Finkle&lt;/a&gt;, and &lt;a href="http://blog.fligtar.com/"&gt;Justin Scott&lt;/a&gt;.       A rockin' time should be had by all. Join us!&lt;br&gt;       &lt;br&gt;     &lt;/div&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-6715608859512848344?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/6715608859512848344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=6715608859512848344' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6715608859512848344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6715608859512848344'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2010/12/sdk-training-and-more-at-add-on-con.html' title='SDK Training and More at Add-on-Con'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-1323551422046235302</id><published>2010-11-27T20:47:00.001-08:00</published><updated>2011-09-20T11:38:43.550-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jetpack'/><title type='text'>Further Adventures In Git(/Hub)ery</title><content type='html'>&lt;div class="moz-text-html" lang="x-western"&gt; This evening I decided       to check if there were any outstanding pull requests for the SDK       repository (to which I haven't been paying attention).&lt;br&gt;       &lt;br&gt;       There were! The oldest was &lt;a         href="https://github.com/mozilla/addon-sdk/pull/29"&gt;pull request         29&lt;/a&gt; from Thomas Bassetto, which contains two small fixes (&lt;a href="https://github.com/tbassetto/addon-sdk/commit/8268334070d03a896d5c006d1b4db94d4cb44b17"&gt;first&lt;/a&gt;,       &lt;a href="https://github.com/tbassetto/addon-sdk/commit/666ad7a99e05e338348dfc579d5b1f75e8d3bb1b"&gt;second&lt;/a&gt;)       to the docs.&lt;br&gt;       &lt;br&gt;       So I fetched the branch of his fork in which the changes reside:&lt;br&gt;       &lt;br&gt;       &lt;blockquote&gt;&lt;tt&gt;$ git fetch &lt;a class="moz-txt-link-freetext"             href="https://github.com/tbassetto/addon-sdk.git"&gt;https://github.com/tbassetto/addon-sdk.git&lt;/a&gt;           master&lt;/tt&gt;&lt;br&gt;       &lt;/blockquote&gt;       &lt;br&gt;       But that branch (and the fork in general) is a few weeks       out-of-date, so "&lt;tt&gt;git diff HEAD FETCH_HEAD&lt;/tt&gt;" showed a bunch       of changes, and it was unclear how painful the merge would be.&lt;br&gt;       &lt;br&gt;       Thus I decided to try cherry-picking the changes, my first time       using "&lt;tt&gt;git cherry-pick&lt;/tt&gt;".&lt;br&gt;       &lt;br&gt;       The first one went great:&lt;br&gt;       &lt;br&gt;       &lt;blockquote&gt;&lt;tt&gt;$ git cherry-pick           8268334070d03a896d5c006d1b4db94d4cb44b17&lt;/tt&gt;&lt;br&gt;         &lt;tt&gt;Finished one cherry-pick.&lt;/tt&gt;&lt;br&gt;         &lt;tt&gt;[master ceadb1f] Fixed an internal link in the widget doc&lt;/tt&gt;&lt;br&gt;         &lt;tt&gt;&amp;nbsp;1 files changed, 1 insertions(+), 1 deletions(-)&lt;/tt&gt;&lt;br&gt;       &lt;/blockquote&gt;       &lt;br&gt;       Except that I realized afterward I hadn't added "r,a=myk" to the       commit message. So I tried "&lt;tt&gt;git commit --amend&lt;/tt&gt;" for the       first time, which worked just fine:&lt;br&gt;       &lt;br&gt;       &lt;blockquote&gt;&lt;tt&gt;$ git commit --amend&lt;/tt&gt;&lt;br&gt;         &lt;tt&gt;[master 2d674a6] Fixed an internal link in the widget doc;           r,a=myk&lt;/tt&gt;&lt;br&gt;         &lt;tt&gt;&amp;nbsp;1 files changed, 1 insertions(+), 1 deletions(-)&lt;/tt&gt;&lt;br&gt;       &lt;/blockquote&gt;       &lt;br&gt;       Next time I'll remember to use the "&lt;tt&gt;--edit&lt;/tt&gt;" flag to "&lt;tt&gt;git          cherry-pick&lt;/tt&gt;", which lets one "edit the commit message prior       to committing."&lt;br&gt;       &lt;br&gt;       The second cherry-pick was more complicated, because I only wanted       one of the two changes in the commit (in &lt;a href="https://github.com/tbassetto/addon-sdk/commit/666ad7a99e05e338348dfc579d5b1f75e8d3bb1b#commitcomment-204023"&gt;my          review&lt;/a&gt;, I had identified the second change as unnecessary);       and, as it turned out, also because there was a merge conflict       with other commits.&lt;br&gt;       &lt;br&gt;       I started by cherry-picking the commit with the "&lt;tt&gt;--no-commit&lt;/tt&gt;"       option (so I could remove the second change):&lt;br&gt;       &lt;br&gt;       &lt;blockquote&gt;&lt;tt&gt;$ git cherry-pick --no-commit           666ad7a99e05e338348dfc579d5b1f75e8d3bb1b&lt;/tt&gt;&lt;br&gt;         &lt;tt&gt;Automatic cherry-pick failed.&amp;nbsp; After resolving the           conflicts,&lt;/tt&gt;&lt;br&gt;         &lt;tt&gt;mark the corrected paths with 'git add &amp;lt;paths&amp;gt;' or           'git rm &amp;lt;paths&amp;gt;' and commit the result.&lt;/tt&gt;&lt;br&gt;         &lt;tt&gt;When commiting, use the option '-c 666ad7a' to retain           authorship and message.&lt;/tt&gt;&lt;br&gt;       &lt;/blockquote&gt;       &lt;br&gt;       The conflict was trivial, and I knew where it was, so I resolved       it manually (instead of trying "&lt;tt&gt;git mergetool&lt;/tt&gt;" for the       first time), removed the second change, added the merged file, and       committed the result, using the "&lt;tt&gt;-c&lt;/tt&gt;" option to preserve       the original author and commit message while allowing me to edit       the message to add "r,a=myk":&lt;br&gt;       &lt;br&gt;       &lt;blockquote&gt;&lt;tt&gt;$ git add packages/addon-kit/docs/request.md&lt;/tt&gt;&lt;br&gt;         &lt;tt&gt;$ git commit -c 666ad7a&lt;/tt&gt;&lt;br&gt;         &lt;tt&gt;[master 774d1cb] Completed the example in the Request module           documentation; r,a=myk&lt;/tt&gt;&lt;br&gt;         &lt;tt&gt;&amp;nbsp;1 files changed, 1 insertions(+), 0 deletions(-)&lt;/tt&gt;&lt;br&gt;       &lt;/blockquote&gt;       &lt;br&gt;       Then I used "&lt;tt&gt;gitg&lt;/tt&gt;" and "&lt;tt&gt;git log master         ^upstream/master&lt;/tt&gt;" to verify that the commits looked good to       go, after which I pushed them:&lt;br&gt;       &lt;br&gt;       &lt;blockquote&gt;&lt;tt&gt;$ git push upstream master&lt;/tt&gt;&lt;br&gt;         &lt;tt&gt;[git's standard obscure and disconcerting gobbledygook]&lt;/tt&gt;&lt;br&gt;       &lt;/blockquote&gt;       &lt;br&gt;       Finally, I closed the pull request with &lt;a         href="https://github.com/mozilla/addon-sdk/pull/29#issuecomment-570630"&gt;this          comment&lt;/a&gt; that summarized what I did and provided links to the       cherry-picked commits.&lt;br&gt;       &lt;br&gt;       It would have been nice if the cherry-picked commit that didn't       have merge conflicts (and which I didn't change in the process of       merging) had kept its original commit ID, but I sense that that is       somehow a fundamental violation of the model.&lt;br&gt;       &lt;br&gt;       It would also have been nice if the cherry-picked commit messages       had been automatically annotated with references to the original       commits.&lt;br&gt;       &lt;br&gt;       But overall the process seemed pretty reasonable, it was fairly       easy to do what I wanted and recover from mistakes, and the       author, committer, reviewer, and approver are clearly indicated in       the cherry-picked commits (&lt;a href="https://github.com/mozilla/addon-sdk/commit/2d674a6ea84d3be88b5365b2d24b994297a60d7a"&gt;first&lt;/a&gt;,       &lt;a href="https://github.com/mozilla/addon-sdk/commit/774d1cbf49e152a030a0bf6cbde7b4139c8c3f49"&gt;second&lt;/a&gt;).&lt;br&gt;       &lt;br&gt;       [Also &lt;a href="http://groups.google.com/group/mozilla-labs-jetpack/browse_thread/thread/430750c65fe80231"&gt;posted         to the discussion group&lt;/a&gt;.]&lt;br&gt;       &lt;br&gt;     &lt;/div&gt;   &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-1323551422046235302?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/1323551422046235302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=1323551422046235302' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/1323551422046235302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/1323551422046235302'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2010/11/further-adventures-in-githubery.html' title='Further Adventures In Git(/Hub)ery'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-7960433840999647174</id><published>2010-11-27T20:39:00.001-08:00</published><updated>2011-09-20T11:38:43.583-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jetpack'/><title type='text'>More Git/Hub Workflow Experiences</title><content type='html'>After posting about my &lt;a href="http://mykzilla.blogspot.com/2010/11/github-workflow-experiences.html"&gt;first       Git/Hub workflow experiences&lt;/a&gt;, I got lots of helpful input from     various folks, particularly Erik Vold, Irakli Gozalishvili, and     Brian Warner, which led me to refine my process for handling pull     requests:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;From the "how to merge this pull request" section of the pull         request page (f.e. &lt;a href="https://github.com/mozilla/addon-sdk/pull/43"&gt;pull           request 34&lt;/a&gt;), copy the command from step two, but change         the word "pull" to "fetch" to fetch the remote branch containing         the changes without also merging it:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;git fetch &lt;a class="moz-txt-link-freetext" href="https://github.com/toolness/jetpack-sdk.git"&gt;https://github.com/toolness/jetpack-sdk.git&lt;/a&gt;           bug-610507&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Use the magic FETCH_HEAD reference to the last fetched branch         to verify that the set of changes is what you expect:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;git diff &lt;/tt&gt;&lt;tt&gt;HEAD &lt;/tt&gt;&lt;tt&gt;FETCH_HEAD&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;(The exact syntax here may need some work; HEAD..FETCH_HEAD?         three dots?)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Merge the remote branch into your local branch with a custom         commit message:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;git merge FETCH_HEAD --no-ff -m"bug 610507: get rid of the           nsjetpack package; r=myk"&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Push the changes upstream:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;git push upstream master&lt;/tt&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;I like this set of commands because it doesn't require me to add a     remote, I can copy/paste the fetch command from GitHub (being     careful not to issue the pull before I change it to a fetch), and I     always type the same FETCH_HEAD reference to the remote branch in     step three.&lt;br /&gt;&lt;br /&gt;However, I wish the &lt;a href="https://github.com/mozilla/addon-sdk/commit/0e23d1c1555d5de228ed7ad62c8715e2775d2390"&gt;merge        commit page&lt;/a&gt; explicitly referenced the &lt;a href="https://github.com/mozilla/addon-sdk/commit/68b6e306dfeccef103b071e0812dc3a375830ac0"&gt;specific&lt;/a&gt;     &lt;a href="https://github.com/mozilla/addon-sdk/commit/715cb47c720bcdd11846cae6c6cab325bb1a982b"&gt;commits&lt;/a&gt;     that were merged. It does mention that it's a branch merge, it isn't     obvious how to get from that page to the pages for the commits I     merged from the branch.&lt;br /&gt;&lt;br /&gt;"&lt;tt&gt;git log --oneline --graph&lt;/tt&gt;", &lt;tt&gt;gitg&lt;/tt&gt;, and &lt;tt&gt;gitk&lt;/tt&gt;     do give me that information, though, so I'm ok on the command line,     anyway.&lt;br /&gt;&lt;br /&gt;[More discussion can be found in the &lt;a href="http://groups.google.com/group/mozilla-labs-jetpack/browse_thread/thread/2c6cb3e7f3bec468"&gt;discussion       group thread&lt;/a&gt;.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-7960433840999647174?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/7960433840999647174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=7960433840999647174' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7960433840999647174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7960433840999647174'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2010/11/more-github-workflow-experiences.html' title='More Git/Hub Workflow Experiences'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-7037189428773681360</id><published>2010-11-12T18:55:00.000-08:00</published><updated>2011-09-20T11:38:43.577-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jetpack'/><title type='text'>Git/Hub Workflow Experiences</title><content type='html'>&lt;div class="moz-text-html" lang="x-western"&gt;The Jetpack project recently migrated its SDK repository to Git (hosted on GitHub), and we've been working out changes to the bug/review/commit workflow that GitHub's tools enable (specifically, pull requests).&lt;/div&gt;&lt;div class="moz-text-html" lang="x-western"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="moz-text-html" lang="x-western"&gt;Here are some of my initial experiences and my thoughts on them (which I've also &lt;a href="http://groups.google.com/group/mozilla-labs-jetpack/browse_thread/thread/2c6cb3e7f3bec468"&gt;posted to the Jetpack discussion group&lt;/a&gt;).&lt;/div&gt;&lt;div class="moz-text-html" lang="x-western"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="moz-text-html" lang="x-western"&gt; &lt;/div&gt;&lt;div class="moz-text-html" lang="x-western"&gt;     Warning: Git wonkery ahead, with excruciating details. I would not     want to read this post. I recommend you skip it. ;-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;     Part 1: Wherein I Handle My First Pull Request&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To fix some test failures, Atul submitted &lt;a href="https://github.com/mozilla/addon-sdk/pull/33"&gt;GitHub pull       request 33&lt;/a&gt;, I reviewed the changes (comprising &lt;a href="https://github.com/toolness/jetpack-sdk/commit/97619b0b25554712756827de883883c9b810319d"&gt;two&lt;/a&gt;     &lt;a href="https://github.com/toolness/jetpack-sdk/commit/405390a586f6c09bad2b26183fe2925d09bcd52b"&gt;commits&lt;/a&gt;)     on GitHub, and then I pushed them to the canonical repository via     the following set of commands:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;git checkout -b toolness-&lt;span class="commit-ref from"&gt;4.0b7-bustage-fixes&lt;/span&gt;         master&lt;/li&gt;&lt;li&gt;git pull &lt;a class="moz-txt-link-freetext" href="https://github.com/toolness/jetpack-sdk.git"&gt;https://github.com/toolness/jetpack-sdk.git&lt;/a&gt; &lt;span class="commit-ref from"&gt;4.0b7-bustage-fixes&lt;/span&gt;&lt;/li&gt;&lt;li&gt;git checkout master&lt;/li&gt;&lt;li&gt;git merge toolness-&lt;span class="commit-ref from"&gt;4.0b7-bustage-fixes&lt;/span&gt;&lt;/li&gt;&lt;li&gt;git push upstream master&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;That landed the &lt;a href="https://github.com/mozilla/addon-sdk/commit/97619b0b25554712756827de883883c9b810319d"&gt;two&lt;/a&gt;     &lt;a href="https://github.com/mozilla/addon-sdk/commit/405390a586f6c09bad2b26183fe2925d09bcd52b"&gt;commits&lt;/a&gt;     in the canonical repository, but it isn't obvious that they were     related (i.e. part of the same pull request), that I was the one who     reviewed them, or that I was the one who pushed them.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Part 2: Wherein I Handle My Second Pull Request&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Thus, for the fix for &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=611042"&gt;bug       611042&lt;/a&gt;, for which Atul submitted &lt;a href="https://github.com/mozilla/addon-sdk/pull/34"&gt;GitHub pull       request 34&lt;/a&gt;, I again reviewed the changes (also comprising &lt;a href="https://github.com/toolness/jetpack-sdk/commit/5e6ca0e1834e65623f6ac87d3828965da420847c"&gt;two&lt;/a&gt;     &lt;a href="https://github.com/toolness/jetpack-sdk/commit/1ab9c78c94fb08610460ad19fd763a7402fc233c"&gt;commits&lt;/a&gt;)     on GitHub, but then I pushed them to the &lt;a href="https://github.com/mozilla/addon-sdk"&gt;canonical repository&lt;/a&gt;     via this different set of commands (after discussion with Atul and     Patrick Walton of the Rust team):&lt;br /&gt;&lt;ol&gt;&lt;li&gt;git checkout -b toolness-bug-611042 master&lt;/li&gt;&lt;li&gt;git pull &lt;a class="moz-txt-link-freetext" href="https://github.com/toolness/jetpack-sdk.git"&gt;https://github.com/toolness/jetpack-sdk.git&lt;/a&gt;         bug-611042&lt;/li&gt;&lt;li&gt;(There might have been something else here, since the pull         request resulted in a merge; I don't quite remember.)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;git checkout master&lt;/li&gt;&lt;li&gt;git merge --no-ff --no-commit toolness-bug-611042&lt;/li&gt;&lt;li&gt;git commit --signoff -m "bug 611042: remove         request.response.xml for e10s compatibility; r=myk" --author         "atul"&lt;/li&gt;&lt;li&gt;git push upstream master&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Because Atul's pull request was no longer against the tip (since I     had just merged those previous changes), when I pulled the remote     bug-611042 branch into my local toolness-bug-611042 branch (step 2),     I had to merge his changes, which resulted in a &lt;a href="https://github.com/mozilla/addon-sdk/commit/6a3c9e2a614f29b61e580a7a7619f91dd1306eea"&gt;merge       commit&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Merging the changes to my local master with "--no-ff" and     "--no-commit" (step 5) then allowed me to commit the merge to my     master branch manually (step 6), resulting in another &lt;a href="https://github.com/mozilla/addon-sdk/commit/9f202a3003cddace040bc695ab7137d4a31051ec"&gt;merge       commit&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For the second merge commit, I specified "--signoff", which added     "Signed-off-by: Myk Melez &lt;a class="moz-txt-link-rfc2396E" href="mailto:myk@mozilla.org"&gt;&lt;myk@mozilla.org&gt;&lt;/myk@mozilla.org&gt;&lt;/a&gt;" to the commit     message; crafted a custom commit message that included "r=myk"; and     specified '--author "atul"', which made Atul the author of the     merge.&lt;br /&gt;&lt;br /&gt;I dislike having the former merge commit in history, since it's     extraneous, unuseful details about how I did the merging locally     before I pushed to the canonical repository. I'm not sure how to     avoid it, though.&lt;br /&gt;&lt;br /&gt;On the other hand, I like having the latter merge commit in history,     since it provides context for Atul's &lt;a href="https://github.com/mozilla/addon-sdk/commit/5e6ca0e1834e65623f6ac87d3828965da420847c"&gt;two&lt;/a&gt;     &lt;a href="https://github.com/mozilla/addon-sdk/commit/1ab9c78c94fb08610460ad19fd763a7402fc233c"&gt;commits&lt;/a&gt;:     the bug number, the fact that the changes were reviewed, and a     commit message that describes the changes as a whole.&lt;br /&gt;&lt;br /&gt;I'm ambivalent about --signoff vs. adding "r=myk" to the commit     message, as they seem equivalentish, with --signoff being more     explicit (so in theory it might form part of an enlightened workflow     in the future), while "r=myk" is simpler.&lt;br /&gt;&lt;br /&gt;And I dislike having made Atul the author of the merge, since it's     incorrect: he wasn't the author of the merge, he was only the author     of the changes (for which he is correctly credited). And if the     merge itself caused problems (f.e. I accidentally backed out other     recent changes in the process), I would be the one responsible for     fixing those problems, not Atul.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Part 3: Pushing Patches&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In addition to pull requests, one can also contribute via patches.     I've pushed a few of these via something like the following set of     commands:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;git apply patch.diff&lt;/li&gt;&lt;li&gt;git commit -a -m "bug &lt;number&gt;: &lt;description changes="" of=""&gt;; r=myk" --author "&lt;author name=""&gt;"&lt;br /&gt;&lt;/author&gt;&lt;/description&gt;&lt;/number&gt;&lt;/li&gt;&lt;li&gt;git push upstream master&lt;/li&gt;&lt;/ol&gt;That results in a commit like &lt;a href="https://github.com/mozilla/addon-sdk/commit/026b4e8e78336c2dbbf30edb14e5db78ca4afb21"&gt;this       one&lt;/a&gt;, which shows me as the committer and the patch author as     the author. And that seems like a fine record of what happened.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Part 4: To Bug or Not To Bug?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One of the questions GitHub raises is whether or not every change     deserves a bug report. And if not, how do we differentiate those     that do from the rest?&lt;br /&gt;&lt;br /&gt;I don't have the definitive answers to these questions, but my     sense, from my experience so far, is that we shouldn't require all     changes to be accompanied by bug reports, but larger, riskier,     time-consuming, and/or controversial changes should have reports to     capture history, provide a forum for discussion, and permit project     planning; while bug reports should be optional for smaller, safer,     quickly-resolved, and/or non-controversial changes.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-7037189428773681360?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/7037189428773681360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=7037189428773681360' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7037189428773681360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7037189428773681360'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2010/11/github-workflow-experiences.html' title='Git/Hub Workflow Experiences'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-236254320002589931</id><published>2010-07-15T14:22:00.000-07:00</published><updated>2011-09-20T11:38:43.557-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jetpack'/><title type='text'>My Recent Jetpack Presentations</title><content type='html'>The last few weeks have been presentation-heavy.&lt;br /&gt;&lt;br /&gt;First, I gave a presentation about the Jetpack project (past accomplishments, present status, future plans) at the &lt;a href="https://wiki.mozilla.org/MAOW:2010:London"&gt;2010 London Mozilla Add-ons Workshop&lt;/a&gt; (MAOW), including a demo of using &lt;a href="https://builder.mozillalabs.com/"&gt;Add-on Builder&lt;/a&gt; to build an add-on in five minutes.&lt;br /&gt;&lt;br /&gt;Then I reprised the Add-on Builder demo as part of the opening day keynote at the &lt;a href="https://wiki.mozilla.org/Summit2010"&gt;Mozilla Summit&lt;/a&gt;, where it got a great reception. You can watch it in &lt;a href="http://www.youtube.com/watch?v=lKN4_fOKEWQ"&gt;this Youtube video&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Finally, I gave an updated version of the MAOW presentation on the third day of the summit. The slides are available in &lt;a href="https://people.mozilla.com/%7Emyk/presentations/Prepare%20for%20Liftoff%20-%20Summit%202010.odp"&gt;OpenDocument&lt;/a&gt; and &lt;a href="https://people.mozilla.com/%7Emyk/presentations/Prepare%20for%20Liftoff%20-%20Summit%202010.pdf"&gt;PDF&lt;/a&gt; formats, and Jetpack presentation materials generally are all available from the &lt;a href="https://wiki.mozilla.org/Labs/Jetpack/Presentations"&gt;Jetpack Presentations wiki page&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-236254320002589931?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/236254320002589931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=236254320002589931' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/236254320002589931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/236254320002589931'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2010/07/my-recent-jetpack-presentations.html' title='My Recent Jetpack Presentations'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-6583468542975089893</id><published>2010-03-05T23:03:00.001-08:00</published><updated>2010-04-18T23:58:52.841-07:00</updated><title type='text'>This blog has moved</title><content type='html'>&lt;br /&gt;       This blog is now located at http://mykzilla.blogspot.com/.&lt;br /&gt;       You will be automatically redirected in 30 seconds, or you may click &lt;a href='http://mykzilla.blogspot.com/'&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;       For feed subscribers, please update your feed subscriptions to&lt;br /&gt;       http://mykzilla.blogspot.com/feeds/posts/default.&lt;br /&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-6583468542975089893?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://mykzilla.blogspot.com/' title='This blog has moved'/><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/6583468542975089893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=6583468542975089893' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6583468542975089893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6583468542975089893'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2010/03/this-blog-has-moved.html' title='This blog has moved'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-7015776887411907934</id><published>2009-11-17T17:26:00.000-08:00</published><updated>2009-11-17T17:26:50.807-08:00</updated><title type='text'>The Skinny on Raindrop's Mailing List Extensions</title><content type='html'>Raindrop is an exploration of messaging innovation that strives to intelligently assist people in managing their flood of incoming messages. And mailing lists are a common source of messages you need to manage. So, with assistance from the Raindrop hackers, I wrote extensions that make it easier to deal with messages from mailing lists.&lt;br /&gt;&lt;br /&gt;Their goal is to soothe two particular pain points when dealing with mailing lists: grouping their messages together by list and unsubscribing from them once you're no longer interested in their subject matter.&lt;br /&gt;&lt;br /&gt;This post explains how the extensions do this; touches on some aspects of Raindrop's message processing and data storage models; and speculates about possible future directions for the extensions.&lt;br /&gt;&lt;h3&gt;Raindrop Extensibility&lt;/h3&gt;Raindrop is being built with the explicit goal of being broadly and deeply extensible, and it includes a number of APIs for adding and modifying functionality. The mailing list enhancements comprise two related extensions, one in the backend and one in the user interface.&lt;br /&gt;&lt;br /&gt;The backend extension plugs into Raindrop's incoming message processor, intercepting incoming email messages and extracting info about the mailing lists to which they belong. It also handles much of the work of unsubscribing from a list.&lt;br /&gt;&lt;br /&gt;The frontend extension plugs into Raindrop's Inflow application, modifying its interface to show you the most recent mailing list messages at a glance, group mailing list conversations together by list, and provide a button you can press to easily unsubscribe from a mailing list.&lt;br /&gt;&lt;h3&gt;Message Processing and Data Storage&lt;br /&gt;&lt;/h3&gt;Before getting into how the extensions work, it's useful to know a bit about how Raindrop processes and stores messages.&lt;br /&gt;&lt;br /&gt;Raindrop stores information using &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt;, a document-centric database whose principal unit of information storage and retrieval is the document (the equivalent of a record in SQL databases). Documents are just JSON blobs that can contain arbitrary name -&gt; value pairs (unlike SQL records, which can only contain values for predeclared columns).&lt;br /&gt;&lt;br /&gt;To distinguish between different kinds of documents, Raindrop assigns each a schema (similar to a table in SQL parlance) that describes (and may one day constrain) its properties. The &lt;tt&gt;rd.msg.email&lt;/tt&gt; schema is the primary schema representing an email message, while the &lt;tt&gt;rd.mailing-list&lt;/tt&gt; is the schema representing a mailing list, and the &lt;tt&gt;rd.msg.email.mailing-list&lt;/tt&gt; is a simple schema that associates messages with their lists.&lt;br /&gt;&lt;br /&gt;(In an SQL database, &lt;tt&gt;rd.msg.email&lt;/tt&gt; and &lt;tt&gt;rd.mailing-list&lt;/tt&gt; would be tables whose rows represent email messages and mailing lists, while &lt;tt&gt;rd.msg.email.mailing-list&lt;/tt&gt; would be a table whose rows map one to the other.)&lt;br /&gt;&lt;br /&gt;Note that there's a many-to-one relationship between messages and lists, since messages belong to a single list, although lists contain many messages, so &lt;tt&gt;rd.msg.email.mailing-list&lt;/tt&gt; isn't strictly necessary. Its &lt;tt&gt;list-id&lt;/tt&gt; property (which identifies the list to which the message belongs) could simply be a property of &lt;tt&gt;rd.msg.email&lt;/tt&gt; docs (or, in SQL terms, a foreign key in the &lt;tt&gt;rd.msg.email&lt;/tt&gt; table).&lt;br /&gt;&lt;br /&gt;But putting it into its own document has several advantages. First, it improves robustness, as it reduces the possibility of conflicts between extensions and core code writing to the same documents.&lt;br /&gt;&lt;br /&gt;It also improves write performance, as it's faster to add a document than to modify an existing one (although index generation and read performance can be an issue).&lt;br /&gt;&lt;br /&gt;Finally, it improves extensibility, because it makes it possible to write an extension that extends the backend mailing list extension.&lt;br /&gt;&lt;br /&gt;That's because Raindrop's incoming message processing model allows extensions to observe the creation of any kind of document, including those created by other extensions.&lt;br /&gt;&lt;br /&gt;So just as the mailing list extension observes the creation of &lt;tt&gt;rd.msg.email&lt;/tt&gt; documents, another extension can observe the creation of &lt;tt&gt;rd.msg.email.mailing-list&lt;/tt&gt; documents and process them further in some useful way. If the mailing list extension simply modified the original document instead of creating its own, that would require some additional and more complicated API.&lt;br /&gt;&lt;h3&gt;The Backend Extension&lt;/h3&gt;The primary function of the backend extension is to examine every incoming message and dress the ones from mailing lists with some additional structured information that the frontend can use to organize them.&lt;br /&gt;&lt;br /&gt;Backend extensions are accompanied by a JSON manifest that tells Raindrop what kinds of incoming documents it wants to intercept. The mailing list extension's manifest registers it as an observer of incoming &lt;tt&gt;rd.msg.email&lt;/tt&gt; documents, which get created when Raindrop retrieves an email message:&lt;br /&gt;&lt;pre style="background-color: rgb(238, 238, 238); border: 1px solid rgb(187, 187, 187); color: black; padding: 10px;"&gt;"schemas" : {&lt;br /&gt;  "rd.ext.workqueue" : {&lt;br /&gt;      "source_schemas" : ["rd.msg.email"],&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;The extension itself is a Python script with a &lt;tt&gt;handler&lt;/tt&gt; function that gets passed the &lt;tt&gt;rd.msg.email&lt;/tt&gt; document and looks to see if it contains a &lt;tt&gt;List-ID&lt;/tt&gt; header (or, in certain cases, another identifier) identifying the mailing list from which the message comes:&lt;br /&gt;&lt;pre style="background-color: rgb(238, 238, 238); border: 1px solid rgb(187, 187, 187); color: black; padding: 10px;"&gt;def handler(message):&lt;br /&gt;  ...&lt;br /&gt;  if 'list-id' in message['headers']:&lt;br /&gt;      # Extract the ID and name of the mailing list from the list-id header.&lt;br /&gt;      # Some mailing lists give only the ID, but others (Google Groups,&lt;br /&gt;      # Mailman) provide both using the format 'NAME &amp;lt;id&amp;gt;', so we extract them&lt;br /&gt;      # separately if we detect that format.&lt;br /&gt;      list_id = message['headers']['list-id'][0]&lt;br /&gt;  ...&lt;/pre&gt;&lt;br /&gt;If it doesn't find a list identifier, it simply returns, and Raindrop continues processing the message:&lt;br /&gt;&lt;pre style="background-color: rgb(238, 238, 238); border: 1px solid rgb(187, 187, 187); color: black; padding: 10px;"&gt;if not list_id:&lt;br /&gt;    logger.debug("NO LIST ID; ignoring message %s", message_id)&lt;br /&gt;    return&lt;/pre&gt;&lt;br /&gt;Otherwise, it calls Raindrop's &lt;tt&gt;emit_schema&lt;/tt&gt; function to create an &lt;tt&gt;rd.msg.email.mailing-list&lt;/tt&gt; document linking the message document to an &lt;tt&gt;rd.mailing-list&lt;/tt&gt; document representing the mailing list:&lt;br /&gt;&lt;pre style="background-color: rgb(238, 238, 238); border: 1px solid rgb(187, 187, 187); color: black; padding: 10px;"&gt;emit_schema('rd.msg.email.mailing-list', { 'list_id': list_id })&lt;/pre&gt;&lt;br /&gt;In this function call, &lt;tt&gt;rd.msg.email.mailing-list&lt;/tt&gt; is the type of document to create, while &lt;tt&gt;{ 'list_id': list_id }&lt;/tt&gt; is the document itself, written as Python that will get serialized to JSON.&lt;br /&gt;&lt;br /&gt;A document created inside a backend extension like this automatically gets a reference to the document the extension is processing (i.e. the &lt;tt&gt;rd.msg.email&lt;/tt&gt; document), so the only thing it has to explicitly include is a reference to the list document, in the form of a &lt;tt&gt;list_id&lt;/tt&gt; property whose value is the list identifier.&lt;br /&gt;&lt;br /&gt;The extension also checks if there's an &lt;tt&gt;rd.mailing-list&lt;/tt&gt; document in the database for the mailing list itself, and if not, it creates one, populating it with information from the message's &lt;tt&gt;List-*&lt;/tt&gt; headers, like how to unsubscribe from the list. Otherwise, it updates the existing mailing list document if the message's &lt;tt&gt;List-*&lt;/tt&gt; headers contain updates.&lt;br /&gt;&lt;h3&gt;The Frontend Extension&lt;/h3&gt;The frontend extension uses the information extracted by the backend to help users manage mailing lists in the Inflow application.&lt;br /&gt;&lt;br /&gt;It adds a widget to the Home view that shows you the last few messages from your lists at the bottom of the page, so you can keep an eye on those messages without having to give them your full attention:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.melez.com/mykzilla/uploaded_images/latest-list-messages-714113.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img src="http://www.melez.com/mykzilla/uploaded_images/latest-list-messages-714111.png" height="176" width="320" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;It adds a list of your mailing lists to the Organizer widget:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.melez.com/mykzilla/uploaded_images/mailing-list-list-722772.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img src="http://www.melez.com/mykzilla/uploaded_images/mailing-list-list-722768.png" height="320" width="190" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;And when you click on the name of a list, it shows you its conversations in the conversation pane:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.melez.com/mykzilla/uploaded_images/list-conversations-763392.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img src="http://www.melez.com/mykzilla/uploaded_images/list-conversations-763369.png" height="201" width="320" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In traditional mail clients, users who want to break out their list messages into separate buckets like this typically have to create a folder for each list to contain its messages and then a filter for each list to move incoming list messages into the appropriate folders. The extension does this for you automatically!&lt;br /&gt;&lt;br /&gt;Finally, while viewing list conversations, if the extension knows how to unsubscribe you from the list, it displays an Unsubscribe button:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.melez.com/mykzilla/uploaded_images/unsubscribe-button-794151.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img src="http://www.melez.com/mykzilla/uploaded_images/unsubscribe-button-794149.png" height="201" width="320" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Pressing the button (and then confirming your decision) unsubscribes you from the list. You don't have to do anything else, like remembering your username/password for some web page, sending an email, or confirming your request with the list admin. The extensions handle all those details for you so you don't have to know about them!&lt;br /&gt;&lt;h3&gt;List Unsubscription&lt;/h3&gt;In case you do want to know the details, however, it goes like this...&lt;br /&gt;&lt;br /&gt;First, the frontend extension sends a message to the list's admin address requesting unsubscription, with a certain command (like "unsubscribe") in the subject or body of the message (lists often specify exactly what command to send in the &lt;tt&gt;mailto:&lt;/tt&gt; link they include in the &lt;tt&gt;List-Unsubscribe&lt;/tt&gt; header):&lt;br /&gt;&lt;pre style="background-color: rgb(238, 238, 238); border: 1px solid rgb(187, 187, 187); color: black; padding: 10px;"&gt;From: Jan Reilly &lt;jan@example.com&gt;&lt;br /&gt;To: wasbigtalk-admin@example.com&lt;br /&gt;Subject: unsubscribe&lt;/jan@example.com&gt;&lt;/pre&gt;&lt;br /&gt;Then the server responds with a message requesting confirmation of the request, often putting a unique token into the Subject or Reply-To header to track the request:&lt;br /&gt;&lt;pre style="background-color: rgb(238, 238, 238); border: 1px solid rgb(187, 187, 187); color: black; padding: 10px;"&gt;From: wasbigtalk-admin@example.com&lt;br /&gt;To: jan@example.com&lt;br /&gt;Subject: please confirm unsubscribe from wasbigtalk (4bc3b7e439fd)&lt;br /&gt;&lt;br /&gt;Hello jan@example.com,&lt;br /&gt;&lt;br /&gt;We have received a request to unsubscribe you from wasbigtalk.&lt;br /&gt;Please confirm this request to unsubscribe by replying to this email.&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;Then the backend extension responds with a message confirming the request that includes the unique token:&lt;br /&gt;&lt;pre style="background-color: rgb(238, 238, 238); border: 1px solid rgb(187, 187, 187); color: black; padding: 10px;"&gt;From: jan@example.com&lt;br /&gt;To: wasbigtalk-admin@example.com&lt;br /&gt;Subject: Re: please confirm unsubscribe from wasbigtalk (4bc3b7e439fd)&lt;/pre&gt;&lt;br /&gt;Finally, the server responds with a message confirming that the subscriber has, indeed, been unsubscribed:&lt;br /&gt;&lt;pre style="background-color: rgb(238, 238, 238); border: 1px solid rgb(187, 187, 187); color: black; padding: 10px;"&gt;From: wasbigtalk-admin@example.com&lt;br /&gt;To: jan@example.com&lt;br /&gt;Subject: you have been unsubscribed from wasbigtalk&lt;br /&gt;&lt;br /&gt;Hello jan@example.com,&lt;br /&gt;&lt;br /&gt;Your unsubscription from wasbigtalk was successful.&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;At this point, the backend extension marks the list unsubscribed in the database, and the frontend extension marks it unsubscribed in the user interface.&lt;br /&gt;&lt;br /&gt;This process matches the way much mailing list server software works, although there are daemons in the details, so the extensions have to be programmed to support each server individually.&lt;br /&gt;&lt;br /&gt;Currently, they know how to handle &lt;a href="http://groups.google.com/"&gt;Google Groups&lt;/a&gt; and &lt;a href="http://www.gnu.org/software/mailman/"&gt;Mailman&lt;/a&gt; lists. &lt;a href="http://www.mj2.org/"&gt;Majordomo2&lt;/a&gt; (used by the &lt;a href="http://www.bugzilla.org/"&gt;Bugzilla&lt;/a&gt; and &lt;a href="http://www.openbsd.org/"&gt;OpenBSD&lt;/a&gt; projects, among others) is not supported, because it doesn't send &lt;tt&gt;List-*&lt;/tt&gt; headers (alhough supposedly it can be configured to do so). The &lt;a href="http://www.w3.org/"&gt;W3C&lt;/a&gt;'s list server is not yet supported, although it does send &lt;tt&gt;List-*&lt;/tt&gt; headers, and support should be fairly easy to add.&lt;br /&gt;&lt;br /&gt;Note that some of the processing the extension does is (locale-dependent) "screen"-scraping, as Google Groups and Mailman don't consistently identify the list ID and message type in some of their correspondence. In the long run, hopefully server software will improve in that regard. Perhaps someone can spearhead an effort to make it so?&lt;br /&gt;&lt;h3&gt;The Future&lt;/h3&gt;The extensions' current features fit in well with Raindrop's goal of helping people better handle their flood of incoming messages. But there is surely much more they could do to help in this regard.&lt;br /&gt;&lt;br /&gt;Besides general improvements to reliability and robustness--like support for additional list servers and handling of localized admin messages--they could let you resubscribe to a mailing list from which you've unsubscribed. And perhaps they could automatically fetch the messages you missed while you were away. Or even retrieve the entire archive of a list to which you're subscribed, so you can browse the archive in Raindrop!&lt;br /&gt;&lt;br /&gt;What bugs you about mailing lists? And how might Raindrop's mailing list extensions make them easier (and even funner) to use?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-7015776887411907934?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/7015776887411907934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=7015776887411907934' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7015776887411907934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7015776887411907934'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2009/11/skinny-on-raindrops-mailing-list.html' title='The Skinny on Raindrop&apos;s Mailing List Extensions'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-7740719470656815276</id><published>2009-11-04T15:58:00.001-08:00</published><updated>2009-11-04T15:58:03.687-08:00</updated><title type='text'>Building/Releasing Personas</title><content type='html'>Want to know how a popular extension like Personas gets built and released? Neither do I! Yet I know anyway. And I've written it down for your edification! So &lt;a  href="https://wiki.mozilla.org/Labs/Personas/Build"&gt;check it out&lt;/a&gt;.&lt;br&gt; &lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-7740719470656815276?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/7740719470656815276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=7740719470656815276' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7740719470656815276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7740719470656815276'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2009/11/buildingreleasing-personas.html' title='Building/Releasing Personas'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-3631027799136148808</id><published>2009-10-12T19:32:00.001-07:00</published><updated>2009-10-12T19:32:19.699-07:00</updated><title type='text'>Makefile for building/distributing extensions</title><content type='html'>I've written a Makefile to help build and distribute Personas and Snowl. It automates the process of generating manifests; packaging the extension into a JAR and a XPI; and, for a "development" distribution channel, autogenerating successive version numbers and rsyncing the builds and update.rdf file to a distribution server.&lt;br&gt; &lt;br&gt; The file makes it easy for me to update the &lt;a  href="https://people.mozilla.com/%7Ecbeard/personas/dist/personas-dev-latest.xpi"&gt;latest development build&lt;/a&gt; of Personas after checking in a fix via:&lt;br&gt; &lt;br&gt; &lt;pre&gt;make build channel=dev make package channel=dev make publish&lt;/pre&gt; &lt;br&gt; For release builds, it's:&lt;br&gt; &lt;br&gt; &lt;pre&gt;make build channel=rel make package channel=rel [manually upload to AMO]&lt;/pre&gt; &lt;br&gt; And when I just want to test locally, I can build and install to a local profile:&lt;br&gt; &lt;br&gt; &lt;pre&gt;make build make install profile=~/dev-profile firefox -profile ~/dev-profile&lt;/pre&gt; &lt;br&gt; Or I can package the build and install via Firefox's Add-ons Manager:&lt;br&gt; &lt;br&gt; &lt;pre&gt;make build make package [manually install via Firefox's Add-ons Manager]&lt;/pre&gt; &lt;br&gt; Because I reuse it for multiple projects, project-specific variables are defined in a separate client.mk file. If you have similar needs and would find it useful, you are welcome to it!&lt;br&gt; &lt;br&gt; Just grab the &lt;a  href="http://hg.mozilla.org/labs/personas/file/tip/client/Makefile"&gt;Makefile&lt;/a&gt;, see &lt;a  href="http://hg.mozilla.org/labs/personas/file/tip/client/client.mk"&gt;client.mk&lt;/a&gt; for the variables you should define, and check out the &lt;a  href="http://hg.mozilla.org/labs/personas/file/tip/client/"&gt;Personas source directory&lt;/a&gt; for the general layout that the Makefile handles as well as the &lt;a  href="http://hg.mozilla.org/labs/personas/file/tip/client/install.rdf.in"&gt;install.rdf.in&lt;/a&gt;, &lt;a  href="http://hg.mozilla.org/labs/personas/file/tip/client/chrome.manifest.in"&gt;chrome.manifest.in&lt;/a&gt;, and &lt;a  href="http://hg.mozilla.org/labs/personas/file/tip/client/update.rdf.in"&gt;update.rdf.in&lt;/a&gt; templates from which their respective files are built.&lt;br&gt; &lt;br&gt; &lt;br&gt; Notes:&lt;br&gt; &lt;ol&gt;   &lt;li&gt;It's originally based on &lt;a  href="http://hg.mozilla.org/labs/weave/file/tip/Makefile"&gt;Weave's top-level Makefile&lt;/a&gt;, although it doesn't currently support the binary components that Weave's Makefile builds.&lt;br&gt;     &lt;br&gt;   &lt;/li&gt;   &lt;li&gt;It assumes a directory structure in which &lt;i&gt;content/&lt;/i&gt;, &lt;i&gt;locale/&lt;/i&gt;, and &lt;i&gt;skin/&lt;/i&gt; directories are at the top level of the source directory (not within a &lt;i&gt;chrome/&lt;/i&gt; subdirectory).&lt;br&gt;     &lt;br&gt;   &lt;/li&gt;   &lt;li&gt;It currently builds in the source directory rather than in an object directory, which means it can leave old &lt;i&gt;install.rdf&lt;/i&gt;, &lt;i&gt;chrome.manifest&lt;/i&gt;, and &lt;i&gt;chrome.jar&lt;/i&gt; files around, so sometimes I need to &lt;tt&gt;make clean &amp;amp;&amp;amp; make build&lt;/tt&gt; to get rid of the ones I previously built (f.e. for a release build whose chrome files are archived) and generate new ones for continued development.&lt;br&gt;     &lt;br&gt;   &lt;/li&gt;   &lt;li&gt;For Personas, I use a &lt;a  href="http://hg.mozilla.org/labs/personas/file/tip/client/defaults/preferences/prefs.js.in"&gt;defaults/preferences/prefs.js.in&lt;/a&gt; template to generate prefs that contain the Mercurial revision ID (so I can identify the version of code in a development build with which someone is reporting problems) and the distribution channel (which the extension uses to suppress the "You've been updated!" page for the "dev" channel, since that would get annoying fast).&lt;/li&gt; &lt;/ol&gt; &lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-3631027799136148808?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/3631027799136148808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=3631027799136148808' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3631027799136148808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3631027799136148808'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2009/10/makefile-for-buildingdistributing.html' title='Makefile for building/distributing extensions'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-6089802576414913288</id><published>2009-08-29T07:54:00.000-07:00</published><updated>2009-08-29T08:10:43.751-07:00</updated><title type='text'>Personas for Email Messages</title><content type='html'>Here's a thought (I had in the middle of a dream about brightly garbed superheroes): use &lt;a href="http://www.getpersonas.com/"&gt;Personas&lt;/a&gt; to style email messages in &lt;a href="http://www.mozillamessaging.com/thunderbird/"&gt;Thunderbird&lt;/a&gt;! It'd be a simple way to easily add some style to your messages to friends and family, highlighting your current mood, your perennial interests, or the subject of the message.&lt;br /&gt;&lt;br /&gt;A &lt;strike&gt;dramatization&lt;/strike&gt; mockup:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/personas-in-message-775241.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 339px;" src="http://www.melez.com/mykzilla/uploaded_images/personas-in-message-775234.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are some tricky issues, like how to select a background color for the message that blends in attractively with the bottom of the header image. And it's not clear if the footer image is useful in this case.&lt;br /&gt;&lt;br /&gt;But overall the idea seems quite promising. What do you think? And, if you're a Mozilla extension hacker (or would like to become one), would you be interested in prototyping it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-6089802576414913288?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/6089802576414913288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=6089802576414913288' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6089802576414913288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6089802576414913288'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2009/08/personas-for-email-messages.html' title='Personas for Email Messages'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-1287699979278620781</id><published>2009-04-23T08:15:00.000-07:00</published><updated>2009-04-23T08:19:39.021-07:00</updated><title type='text'>The Problems With Pagination</title><content type='html'>Many web sites and applications paginate their content. Often this makes them harder to use.&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/pagination-amo-797068.png"&gt;&lt;img style="border: 1px solid black; cursor: pointer; width: 391px; height: 48px;" src="http://www.melez.com/mykzilla/uploaded_images/pagination-amo-797067.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Partly it's because site-provided pagination interacts poorly with the browser's built-in scrolling, because the content on any given web page usually takes up more than one vertical screen of space, and you have to jump back and forth between site pagination and browser scrolling, hunting down their controls each time you do so.&lt;br /&gt;&lt;br /&gt;Sites compound this problem by moving their pagination controls around, so you can't leave your mouse over the &lt;span style="font-style: italic;"&gt;Next Page&lt;/span&gt; button and assume you can simply click the mouse button repeatedly to jump to subsequent pages.&lt;br /&gt;&lt;br /&gt;And pagination control click targets are small, which makes them hard to hit. Page-specific targets are often a single number (&lt;span style="font-style: italic;"&gt;1&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;2&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;3&lt;/span&gt;), while the &lt;span style="font-style: italic;"&gt;Next Page&lt;/span&gt; target is sometimes a single character (&lt;span style="font-style: italic;"&gt;&gt;&lt;/span&gt;).&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/pagination-salon-755844.png"&gt;&lt;img style="border: 1px solid black; cursor: pointer; width: 115px; height: 26px;" src="http://www.melez.com/mykzilla/uploaded_images/pagination-salon-755842.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Finally, pagination confounds searching through content using a browser's &lt;span style="font-style: italic;"&gt;Find in Page&lt;/span&gt; feature, since it requires you to switch back and forth between searching for the content on the current page and navigating to the next one until you find the text you're looking for (and beyond, if you're looking for multiple occurrences of it).&lt;br /&gt;&lt;br /&gt;And it similarly confounds any other activity in which you want to engage with all the content in an application, like when I wanted to turn off tracebacks/pingbacks for all 56 posts in a Wordpress blog, which is a six step process, and I had to &lt;a href="http://wordpress.org/support/topic/228285?replies=3"&gt;repeat those six steps four times each&lt;/a&gt; because Wordpress's list of posts only lets me see 15 at a time.&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/pagination-wordpress-794734.png"&gt;&lt;img style="border: 1px solid black; cursor: pointer; width: 345px; height: 44px;" src="http://www.melez.com/mykzilla/uploaded_images/pagination-wordpress-794733.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Nevertheless, there are legitimate uses for pagination:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;sites whose content is computationally intensive to generate (like search engines) use it to reduce load and cost;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;those with large quantities of content that strains server, client, and network resources to display all at once (search engines again, the &lt;a href="http://www.getpersonas.com/gallery/All/All/1"&gt;Personas gallery&lt;/a&gt;) use it to improve responsiveness;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;those whose content cannot usefully be browsed in its entirety much of the time (search engines a third time, messaging applications) use it to reduce the cognitive overload of providing all their content at once;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;and those with an ad-based revenue model (you guessed it, search engines, but also online news and many other sites) use it to show more ads.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/pagination-google-742305.png"&gt;&lt;img style="border: 1px solid black; cursor: pointer; width: 259px; height: 57px;" src="http://www.melez.com/mykzilla/uploaded_images/pagination-google-742304.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;For those kinds of sites, pagination makes sense, although doing it right still matters, like giving its controls large click targets and putting them in the same place on every page.&lt;br /&gt;&lt;br /&gt;And, for content that spills across multiple screens, including the pagination controls at both the top and bottom of the content, the two scroll positions at which users often find themselves when they want to change pages; or positioning them absolutely, so they're always visible; or only loading a screenful of content at a time, so users never have to both page and scroll; or using &lt;a href="http://www.37signals.com/svn/archives2/no_more_more_pages.php"&gt;endless/infinite scrolling&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Are there even better approaches, and are there ways for the web platform to support them so that web sites don't have to roll their own? Perhaps browsers and servers could collaborate to provide content in screenfuls with integrated scrolling and paging controls that play well together and don't change from site to site.&lt;br /&gt;&lt;br /&gt;What do you think?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-1287699979278620781?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/1287699979278620781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=1287699979278620781' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/1287699979278620781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/1287699979278620781'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2009/04/problems-with-pagination.html' title='The Problems With Pagination'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-7974255395631974196</id><published>2009-04-16T18:17:00.001-07:00</published><updated>2009-04-16T19:24:48.355-07:00</updated><title type='text'>syntaxes for iterating arrays in JavaScript</title><content type='html'>&lt;a href="https://developer.mozilla.org/en/JavaScript"&gt;JavaScript&lt;/a&gt; lets you iterate arrays using the &lt;a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Statements/for_each...in"&gt;&lt;span style="font-style: italic;"&gt;for each...in&lt;/span&gt; statement&lt;/a&gt;:&lt;br /&gt;&lt;pre style="border: 1px solid #bbbbbb; background-color: #eeeeee; color: black; padding: 10px;"&gt;for each (var item in [1, 2, 3]) alert(item);&lt;/pre&gt;&lt;br /&gt;&lt;a href="https://developer.mozilla.org/en/New_in_JavaScript_1.6"&gt;JavaScript 1.6&lt;/a&gt; added the &lt;a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/forEach"&gt;&lt;span style="font-style: italic;"&gt;Array.forEach&lt;/span&gt; method&lt;/a&gt;:&lt;br /&gt;&lt;pre style="border: 1px solid #bbbbbb; background-color: #eeeeee; color: black; padding: 10px;"&gt;[1, 2, 3].forEach(function(item) { alert(item) });&lt;/pre&gt;&lt;br /&gt;I've always preferred &lt;a href="http://perldoc.perl.org/perlsyn.html#Statement-Modifiers"&gt;Perl's statement modifiers&lt;/a&gt;, though, for the popular English-like order of their clauses ("do this for each of those"):&lt;br /&gt;&lt;pre style="border: 1px solid #bbbbbb; background-color: #eeeeee; color: black; padding: 10px;"&gt;print $_ foreach (1, 2, 3);&lt;/pre&gt;&lt;br /&gt;&lt;a href="https://developer.mozilla.org/En/New_in_JavaScript_1.7"&gt;JavaScript 1.7&lt;/a&gt; added &lt;a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Working_with_Arrays#Array_comprehensions"&gt;array comprehensions&lt;/a&gt; for array initialization:&lt;br /&gt;&lt;pre style="border: 1px solid #bbbbbb; background-color: #eeeeee; color: black; padding: 10px;"&gt;var squares = [item * item for each (item in [1, 2, 3])];&lt;/pre&gt;&lt;br /&gt;I just realized I can (ab)use comprehensions to iterate arrays with Perl-like syntax by throwing away the result:&lt;br /&gt;&lt;pre style="border: 1px solid #bbbbbb; background-color: #eeeeee; color: black; padding: 10px;"&gt;[alert(item) for each (item in [1, 2, 3])];&lt;/pre&gt;&lt;br /&gt;I can iterate object properties the same way:&lt;br /&gt;&lt;pre style="border: 1px solid #bbbbbb; background-color: #eeeeee; color: black; padding: 10px;"&gt;var obj = { foo: 1, bar: 2, baz: 3 };&lt;br /&gt;[alert(name + "=" + obj[name]) for (name in obj)];&lt;/pre&gt;&lt;br /&gt;Sweet!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-7974255395631974196?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/7974255395631974196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=7974255395631974196' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7974255395631974196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7974255395631974196'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2009/04/syntaxes-for-iterating-arrays-in.html' title='syntaxes for iterating arrays in JavaScript'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-6609413790681181898</id><published>2009-04-09T15:00:00.000-07:00</published><updated>2009-04-09T15:00:00.977-07:00</updated><title type='text'>Snowl Integration with Places</title><content type='html'>alta88 has recently done a bunch of work to integrate Snowl with Places. His initial efforts have focused on getting sources and people into Places, as he describes in &lt;a href="https://labs.mozilla.com/forum/comments.php?DiscussionID=5445"&gt;this post to the discussion forum&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This will make the list of collections in the next version of Snowl work like Firefox's list of bookmarks in the Bookmarks Sidebar, and sources/people will also show up in the AwesomeBar:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/Picture-3-709941.png"&gt;&lt;img style="cursor: pointer; width: 399px; height: 295px;" src="http://www.melez.com/mykzilla/uploaded_images/Picture-3-709939.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Snowl doesn't yet register the &lt;span style="font-style: italic;"&gt;snowl:&lt;/span&gt; protocol, however, so selecting those items doesn't do anything (yet). What do you think it should do?&lt;br /&gt;&lt;br /&gt;And what additional Places-backed features would be useful?&lt;br /&gt;&lt;br /&gt;(Picking up on something &lt;a href="http://twitter.com/dietrich/status/1412995579"&gt;dietrich said on Twitter&lt;/a&gt; last week, I'd love to see Places get populated with tweets that reference a URL, setting the title of the Places entry to the content of the tweet, so you can use the AwesomeBar to find that site you saw last week in a tweet, as &lt;a href="http://brian.kingsonline.net/talk/?p=386"&gt;other folks have done with Delicious&lt;/a&gt;.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-6609413790681181898?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/6609413790681181898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=6609413790681181898' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6609413790681181898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6609413790681181898'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2009/04/snowl-integration-with-places.html' title='Snowl Integration with Places'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-6642316858017254871</id><published>2009-04-07T16:09:00.002-07:00</published><updated>2009-04-09T16:25:17.120-07:00</updated><title type='text'>Snowl development builds</title><content type='html'>I've created a distribution channel to get Snowl changes out to its testing community faster. I'll push development snapshots to the channel on a regular basis as significant fixes are committed (or perhaps nightly, if I can automate the process).&lt;br /&gt;&lt;br /&gt;Once you install a development build, Firefox will automatically check for newer ones and prompt you to update when it finds one, just as it does for the release builds on AMO.&lt;br /&gt;&lt;br /&gt;This is truly the slicing edge. If you use these builds, &lt;span style="font-weight: bold;"&gt;be prepared for the possibility of regressions and bustage&lt;/span&gt;. On the other hand, you'll also get to test new features earlier, like &lt;a href="http://www.melez.com/mykzilla/2009/04/snowl-integration-with-places.html"&gt;alta88's Places integration work&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Install the &lt;a href="https://people.mozilla.com/%7Emyk/snowl/dist/snowl-dev-latest.xpi"&gt;latest development build&lt;/a&gt;, then &lt;a href="https://labs.mozilla.com/forum/?CategoryID=27"&gt;discuss it&lt;/a&gt; and &lt;a href="https://bugzilla.mozilla.org/enter_bug.cgi?product=Mozilla%20Labs&amp;amp;component=Snowl"&gt;report bugs&lt;/a&gt; you find. (If you don't want to be on the slicing edge, try the &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/8397/"&gt;latest stabler release&lt;/a&gt; instead.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-6642316858017254871?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/6642316858017254871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=6642316858017254871' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6642316858017254871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6642316858017254871'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2009/04/snowl-development-builds.html' title='Snowl development builds'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-7502720403339773467</id><published>2009-04-07T00:24:00.000-07:00</published><updated>2009-04-07T00:48:33.423-07:00</updated><title type='text'>ISO simple open web image editor</title><content type='html'>Is there a simple open web image editor? I know about &lt;a href="http://www.pixlr.com/"&gt;Pixlr&lt;/a&gt;, &lt;a href="http://www.picnik.com/"&gt;Picnik&lt;/a&gt;, and &lt;a href="http://aviary.com/"&gt;Aviary&lt;/a&gt;, but those all use Flash. It seems like it should be possible to make one using &lt;a href="https://developer.mozilla.org/En/HTML/Canvas"&gt;Canvas&lt;/a&gt; and other modern open web technologies.&lt;br /&gt;&lt;br /&gt;In addition to using it for simple photo manipulations, I'd like one that can be embedded into other applications, like &lt;a href="http://labs.mozilla.com/projects/firefox-personas/"&gt;Personas&lt;/a&gt; (to make it easy for users to make and refine their own personas) and image hosting sites (so users don't have to go to a separate website and import their images to edit them).&lt;br /&gt;&lt;br /&gt;In other words, I want the web-based image editing equivalent of Gecko+Firefox: a great open-source image rendering and editing engine with a flagship product that demonstrates its capabilities and an API for embedding it into other applications.&lt;br /&gt;&lt;br /&gt;Is there such a thing? Does anyone want to create one?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-7502720403339773467?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/7502720403339773467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=7502720403339773467' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7502720403339773467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7502720403339773467'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2009/04/iso-simple-open-web-image-editor.html' title='ISO simple open web image editor'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-310923379342044586</id><published>2009-04-06T11:23:00.001-07:00</published><updated>2009-04-06T12:52:14.451-07:00</updated><title type='text'>The Extension Bootcamp Tutorial</title><content type='html'>A few weeks ago, as part of &lt;a href="http://labs.mozilla.com/"&gt;Mozilla Labs&lt;/a&gt;' &lt;a href="http://design-challenge.mozilla.com/spring09/"&gt;Design Challenge&lt;/a&gt;, I taught a tutorial on extension development. My goal was to impart the minimum necessary information to build a simple extension using modern best practices. I called it &lt;span style="font-style: italic;"&gt;Extension Bootcamp: Zero to "Hello world!" in 45 Minutes&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The tutorial, which borrowed from other ones (including my ancient &lt;a href="https://developer.mozilla.org/en/Creating_a_Mozilla_Extension"&gt;Tinderstatus tutorial&lt;/a&gt;, the venerable &lt;a href="https://developer.mozilla.org/en/Building_an_Extension"&gt;Building an Extension&lt;/a&gt;, and the new &lt;a href="https://developer.mozilla.org/En/Firefox_addons_developer_guide"&gt;Firefox addons developer guide&lt;/a&gt;), covered:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;what extensions are, what they can do, and what they're made of;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;how to configure your development environment on Windows, Mac OS X, or Linux;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;how to construct an extension, including required files and directory structure;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;how to package and test your extension;&lt;/li&gt;&lt;li&gt;a simple extension that inserts XUL into the main browser window via an overlay, styles it with CSS, listens for and responds to a DOM event on it using JavaScript, and localizes its strings with both a DTD and a properties file.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;It explicitly excluded:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;archiving chrome files into a JAR archive (valuable for large, popular, and stable extensions, but not worth the added complexity for the rest);&lt;/li&gt;&lt;li&gt;developing XPCOM components (most extensions should use JavaScript modules instead);&lt;/li&gt;&lt;li&gt;putting CSS/image files into a separate skin package (Firefox doesn't ship with two themes, which was the original impetus for segregating these files thusly, and most extensions don't support third-party themes, so this is unnecessary).&lt;/li&gt;&lt;/ul&gt;To conserve time, I didn't cover:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;developing JavaScript modules;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;accessing XPCOM components;&lt;/li&gt;&lt;li&gt;using tools and documentation to introspect and learn Mozilla code and APIs.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Developing a Firefox extension is pretty complicated, since there are so many different pieces to it, and the tutorial ended up taking two hours, including time for the students to practice each lesson on their own computers (for which my colleague &lt;a href="http://jonoscript.wordpress.com/"&gt;Jono&lt;/a&gt;'s assistance in fielding questions was invaluable).&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://design-challenge.mozilla.com/spring09/index.html#extension_bootcamp"&gt;video of the tutorial&lt;/a&gt;, edited down to 1.5 hours, as well as the &lt;a href="http://people.mozilla.com/%7Emyk/bootcamp/"&gt;slides and accompanying files&lt;/a&gt; are available. If I had time to work more on this, I'd expand it to include the essential topics I didn't cover. I'd also update the &lt;a href="https://developer.mozilla.org/en/Building_an_Extension"&gt;Building an Extension&lt;/a&gt; tutorial to adopt the pedagogy of this one. If you'd like to do either of those things, please do!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-310923379342044586?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/310923379342044586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=310923379342044586' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/310923379342044586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/310923379342044586'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2009/04/extension-bootcamp-tutorial.html' title='The Extension Bootcamp Tutorial'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-8481225304758219196</id><published>2009-03-31T10:18:00.002-07:00</published><updated>2009-04-01T11:28:10.060-07:00</updated><title type='text'>Personas in Thunderbird</title><content type='html'>Huang Yaoquan recently &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=483743"&gt;contributed a patch&lt;/a&gt; to make Personas work in Thunderbird! Here's Thunderbird with the &lt;a href="http://www.getpersonas.com/store/gallery/persona/3/3/33"&gt;Groovy Blue persona&lt;/a&gt; selected:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/Picture-1-708661.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 339px;" src="http://www.melez.com/mykzilla/uploaded_images/Picture-1-708655.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The patch requires a Thunderbird 3 beta, and it landed after the cutoff for the Personas 1.0 release, so it's not in the version on AMO, but it is in the &lt;a href="http://people.mozilla.com/%7Emyk/personas/dist/personas-dev.xpi"&gt;latest development build&lt;/a&gt;, so give that one a spin if you're developmentally inclined, and provide feedback in the &lt;a href="https://labs.mozilla.com/forum/?CategoryID=18"&gt;discussion forums&lt;/a&gt; or by &lt;a href="https://bugzilla.mozilla.org/enter_bug.cgi?product=Mozilla%20Labs&amp;amp;component=Personas"&gt;filing bugs&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-8481225304758219196?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/8481225304758219196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=8481225304758219196' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8481225304758219196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8481225304758219196'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2009/03/personas-in-thunderbird.html' title='Personas in Thunderbird'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-4985739686493851286</id><published>2009-03-25T18:23:00.000-07:00</published><updated>2009-04-01T11:35:23.551-07:00</updated><title type='text'>JSON JS module for Firefox 3.0/3.5 API compatibility</title><content type='html'>&lt;p&gt;I've written a &lt;a href="http://hg.mozdev.org/jsmodules/file/tip/JSON.js" class="external text" title="http://hg.mozdev.org/jsmodules/file/tip/JSON.js" rel="nofollow"&gt;JSON module&lt;/a&gt; to wrap the incompatible Firefox 3.0 and 3.5 JSON APIs, presenting the 3.5 API on both versions of Firefox, which is useful for extensions that support them both. Import this module to parse and stringify JSON in both 3.0 and 3.5 without having to check the host application's version each time. &lt;/p&gt;&lt;p&gt;Note: don't import this into the global namespace! If you do, you'll hork native Firefox 3.0 code that expects the 3.0 API. Instead, import it into your own object like this: &lt;/p&gt; &lt;pre style="border: 1px solid rgb(136, 136, 136); padding: 5px; background-color: rgb(221, 221, 221); color: rgb(0, 0, 0);"&gt;let MyExtension = {&lt;br /&gt;JSON: null,&lt;br /&gt;...&lt;br /&gt;};&lt;br /&gt;Components.utils.import("chrome://myextension/modules/JSON.js", MyExtension);&lt;br /&gt;// Now MyExtension.JSON is an object implementing the Firefox 3.5 JSON API.&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;The module also works in Thunderbird 3.0, which uses Firefox 3.5's API (although there's no need to use it for an extension that only supports Thunderbird 3.0). I use it in &lt;a href="http://labs.mozilla.com/projects/firefox-personas/"&gt;Personas&lt;/a&gt;, which supports both Firefox 3.0 and 3.5 as well as Thunderbird 3.0.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The Firefox 3.5 JSON API is documented in the Mozilla Developer Center article &lt;a href="https://developer.mozilla.org/En/Using_JSON_in_Firefox" class="external text" title="https://developer.mozilla.org/En/Using_JSON_in_Firefox" rel="nofollow"&gt;Using JSON in Firefox&lt;/a&gt;. This JSON module is documented on Mozilla Labs' &lt;a href="https://wiki.mozilla.org/Labs/JS_Modules"&gt;JS Modules wiki page&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-4985739686493851286?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/4985739686493851286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=4985739686493851286' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4985739686493851286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4985739686493851286'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2009/03/json-js-module-for-firefox-3035-api.html' title='JSON JS module for Firefox 3.0/3.5 API compatibility'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-2096866215127809719</id><published>2009-03-18T18:32:00.000-07:00</published><updated>2009-03-18T19:18:17.145-07:00</updated><title type='text'>Merging with Mercurial 1.0 and Meld</title><content type='html'>In an &lt;a href="http://www.melez.com/mykzilla/2008/06/merging-with-mercurial-and-meld.html"&gt;earlier post&lt;/a&gt;, I described my experience merging changes with Mercurial 0.9.5 and Meld 1.1.5.1 on Ubuntu 8.04.&lt;br /&gt;&lt;br /&gt;Things have changed in Ubuntu 8.10, which ships Mercurial 1.0.1. Now Meld displays your version of the file on the left, the other version on the right, and the base version (from which yours and the other are descended) in the middle.&lt;br /&gt;&lt;br /&gt;Here it is 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;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/mercurial-meld-717708.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 176px;" src="http://www.melez.com/mykzilla/uploaded_images/mercurial-meld-717703.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Your job is to reconcile the conflicts between your version on the left and the other version on the right, turning your version on the left into the result of the reconciliation, which you then save to your working directory.&lt;br /&gt;&lt;br /&gt;I understand why it can be useful to show the base version, and I think it's ok to use the same pane to show both your version and the final result (although kdiff3 provides a fourth pane beneath these three for the latter, which seems better).&lt;br /&gt;&lt;br /&gt;But I don't understand why the base version is in the middle, given that one's primary task in this situation is to compare the differences between the two versions on either side of the window, copying changes from one to the other as needed. Putting another file in the middle just gets in the way of that process (which is presumably why kdiff3 puts the base version on the left and your version in the middle according to the screenshot in the aforementioned example in the hg book).&lt;br /&gt;&lt;br /&gt;In fact, I frequently find myself starting a merge by copying the other version of the file into the base version in its entirety. That destroys my ability to refer to the base version, but it places the other version and my version side by side, at which point it's much easier to compare the two and edit my version accordingly:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/mercurial-meld-2-746096.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 176px;" src="http://www.melez.com/mykzilla/uploaded_images/mercurial-meld-2-746085.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But maybe I'm missing the point or misusing the tool, and there's some valid reason for the way Mercurial uses Meld. Can someone tell me what it is?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-2096866215127809719?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/2096866215127809719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=2096866215127809719' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2096866215127809719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2096866215127809719'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2009/03/merging-with-mercurial-10-and-meld.html' title='Merging with Mercurial 1.0 and Meld'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-644793084211281747</id><published>2009-02-04T17:48:00.001-08:00</published><updated>2009-02-04T19:27:24.446-08:00</updated><title type='text'>A XULRunner-Based Unit Test Harness</title><content type='html'>&lt;h3&gt;Prologue&lt;/h3&gt;After finding a couple bugs in the &lt;a href="https://wiki.mozilla.org/Labs/JS_Modules#Observers"&gt;Observers JS module&lt;/a&gt; recently, I looked around for a simple test harness to exercise it and other &lt;a href="http://wiki.mozilla.org/Labs/JS_Modules"&gt;JS modules&lt;/a&gt;. &lt;a href="http://labs.mozilla.com/projects/weave/"&gt;Weave&lt;/a&gt;'s (based on &lt;a href="https://developer.mozilla.org/en/Writing_xpcshell-based_unit_tests"&gt;Mozilla's xpcshell harness&lt;/a&gt;) seemed promising, although it has to hack around various limitations of &lt;a href="https://developer.mozilla.org/en/xpcshell"&gt;xpcshell&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.toolness.com/"&gt;Atul Varma&lt;/a&gt; had suggested some time ago that a &lt;a href="https://developer.mozilla.org/en/XULRunner"&gt;XULRunner&lt;/a&gt;-based harness might make sense, so I decided to see if I could modify Weave's harness to run JS module tests using XULRunner instead of xpcshell.&lt;br /&gt;&lt;h3&gt;Act 1&lt;/h3&gt;That proved doable, although some details were tricky.  Sometimes I wondered whether I wouldn't have been better off reusing &lt;a href="https://developer.mozilla.org/en/Mochitest"&gt;MochiTest&lt;/a&gt;, although it's heavier weight.  Other times I wondered why I didn't find this &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=359830"&gt;bug about XULRunner-based unit tests&lt;/a&gt; sooner, although it's not clear that reusing the attachment in that bug would have been faster.&lt;br /&gt;&lt;br /&gt;In any case, I got the harness working with XULRunner and wrote an initial set of tests of the Observers module.  To run them, pull the &lt;code&gt;jsmodules&lt;/code&gt; repository, change to its &lt;code&gt;test/unit/&lt;/code&gt; subdirectory, and run &lt;code&gt;make&lt;/code&gt; with the location of your XULRunner executable (or set the &lt;code&gt;XULRUNNER_BIN&lt;/code&gt; environment variable to its location):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;hg clone https://hg.mozdev.org/jsmodules&lt;br /&gt;cd jsmodules/test/unit/&lt;br /&gt;make xulrunner_bin=/usr/bin/xulrunner&lt;/pre&gt;&lt;br /&gt;Since Firefox 3.0 comes with XULRunner, you can use any Firefox 3.0 (or newer) executable instead (except on Linux distros that ship Firefox as a XULRunner app--you have to use the XULRunner executable on those), like &lt;code&gt;/Applications/Firefox.app/Contents/MacOS/firefox-bin&lt;/code&gt; on Mac and &lt;code&gt;/c/Program\ Files/Mozilla\ Firefox/firefox.exe&lt;/code&gt; on Windows.&lt;br /&gt;&lt;h3&gt;Epilogue&lt;/h3&gt;Once I got the harness working for jsmodules, I backported it to Weave, where it mostly works, except that &lt;a href="http://hg.mozilla.org/labs/weave/file/de9f2a53bda4/src/IWeaveCrypto.idl#l101"&gt;IWeaveCrypto.generateKeypair&lt;/a&gt; (which calls &lt;a href="http://hg.mozilla.org/mozilla-central/file/6c1090838778/security/nss/lib/pk11wrap/pk11akey.c#l1188"&gt;PK11_GenerateKeyPair&lt;/a&gt;) fails, apparently because of &lt;code&gt;SEC_ERROR_TOKEN_NOT_LOGGED_IN&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;I have no idea why, but if you do, comment here or in &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=476539"&gt;bug 476539&lt;/a&gt;, since that's the last blocker to Weave using this harness.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-644793084211281747?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/644793084211281747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=644793084211281747' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/644793084211281747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/644793084211281747'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2009/02/xulrunner-based-unit-test-harness.html' title='A XULRunner-Based Unit Test Harness'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-7249977648066146146</id><published>2009-02-04T17:44:00.000-08:00</published><updated>2009-02-04T19:25:20.651-08:00</updated><title type='text'>Observers JS Module Improvements</title><content type='html'>I've updated the &lt;a href="https://wiki.mozilla.org/Labs/JS_Modules#Observers"&gt;Observers JS module&lt;/a&gt; with a number of changes.  In particular, it's now possible to specify a &lt;span style="font-style: italic;"&gt;this&lt;/span&gt; object when adding an observer that is a method, so instead of doing this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;let MyObserver = {&lt;br /&gt;  onFoo: function(subject) {...},&lt;br /&gt;  onBar: function(subject) {...},&lt;br /&gt;  onBaz: function(subject) {...},&lt;br /&gt;  QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver]),&lt;br /&gt;  observe: function(subject, topic, data) {&lt;br /&gt;    switch(topic) {&lt;br /&gt;      case "foo":&lt;br /&gt;        this.onFoo(subject);&lt;br /&gt;        break;&lt;br /&gt;      case "bar":&lt;br /&gt;        this.onBar(subject);&lt;br /&gt;        break;&lt;br /&gt;      case "baz":&lt;br /&gt;        this.onBaz(subject);&lt;br /&gt;        break;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Observers.add("foo", MyObserver);&lt;br /&gt;Observers.add("bar", MyObserver);&lt;br /&gt;Observers.add("baz", MyObserver);&lt;/pre&gt;&lt;br /&gt;You can do this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;let MyObserver = {&lt;br /&gt;  onFoo: function(subject) {...},&lt;br /&gt;  onBar: function(subject) {...},&lt;br /&gt;  onBaz: function(subject) {...}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Observers.add("foo", MyObserver.onFoo, MyObserver);&lt;br /&gt;Observers.add("bar", MyObserver.onBar, MyObserver);&lt;br /&gt;Observers.add("baz", MyObserver.onBaz, MyObserver);&lt;/pre&gt;&lt;br /&gt;Other changes include a couple of bug fixes and some backwards-incompatible API improvements.  See the &lt;a href="https://wiki.mozilla.org/Labs/JS_Modules#Observers"&gt;documentation&lt;/a&gt; for all the details (including steps to update from the previous version of the module).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-7249977648066146146?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/7249977648066146146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=7249977648066146146' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7249977648066146146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7249977648066146146'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2009/02/observers-js-module-improvements.html' title='Observers JS Module Improvements'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-4220389101602206157</id><published>2009-01-09T17:55:00.000-08:00</published><updated>2009-01-09T18:01:18.152-08:00</updated><title type='text'>Snowl Roadmap</title><content type='html'>Based on Snowl's potential &lt;a title="futures" href="http://www.melez.com/mykzilla/2009/01/with-snowl-0.html" id="i8p2"&gt;futures&lt;/a&gt;, and in line with its &lt;a title="principles" href="http://www.melez.com/mykzilla/2009/01/snowl-principles.html" id="eaif"&gt;principles&lt;/a&gt;, I've put together a &lt;a title="roadmap" href="https://wiki.mozilla.org/Labs/Snowl/Roadmap" id="c3z4"&gt;roadmap&lt;/a&gt; for its next three releases (beyond the imminent 0.2 release).&lt;br /&gt;&lt;br /&gt;Generally, I'm aiming for six week development cycles that are that ambiguous mixture of date-, feature set-, and quality-driven, so the goal is to hit the target date with high quality implementations of the specified set of features.  But work may be pushed to later releases or the schedule extended as appropriate.&lt;br /&gt;&lt;br /&gt;Each cycle has a theme on which I'll focus my efforts, and I'll publish regular preview releases, which will be numbered with consecutive "pre[n]" suffixes (f.e. 0.3pre1, 0.3pre2).&lt;br /&gt;&lt;br /&gt;Most of the work on the roadmap is stuff I'm planning to do myself, although it also lists tasks that other developers have expressed an interest in tackling.  And it's ambitious, so I probably won't get to all of these tasks (although I'll probably do other things that come up along the way).&lt;br /&gt;&lt;br /&gt;If you want to do something with Snowl, whether or not it's on the roadmap, &lt;a title="check out the source code" href="http://hg.mozilla.org/labs/snowl/" id="zhgx"&gt;check out the source code&lt;/a&gt;  and go for it! (And &lt;a title="let me know what you're doing" href="https://labs.mozilla.com/forum/?CategoryID=27" id="yg-x"&gt;let us know what you're doing&lt;/a&gt;  so others don't duplicate your work.)&lt;br /&gt;&lt;br /&gt;Caveat: nothing is written in stone, it's the best laid plans of mice and men, take it with a grain of salt, etc.  Among other things, this roadmap doesn't account for time I may spend working on other projects, nor am I any better than other hackers at estimating the time it takes to do work I haven't already done.  And the farther out the roadmap goes, the fuzzier its plans.&lt;br /&gt;&lt;br /&gt;Also, your suggestions are welcome.  Are you missing something from the roadmap?  Is there something on it that shouldn't be there? &lt;a title="your suggestions are welcome" href="https://labs.mozilla.com/forum/?CategoryID=27" id="f17m"&gt;Let us know!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The latest version lives on the Mozilla wiki at &lt;span&gt;&lt;a title="https://wiki.mozilla.org/Labs/Snowl/Roadmap" href="https://wiki.mozilla.org/Labs/Snowl/Roadmap" id="oqbd"&gt;https://wiki.mozilla.org/Labs/Snowl/Roadmap&lt;/a&gt;&lt;/span&gt;.  Currently, it looks like this:&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Priorities&lt;br /&gt;&lt;/h3&gt;&lt;span&gt;As with Firefox development &lt;/span&gt;(f.e. with &lt;a title="Firefox 3.1 features" href="https://wiki.mozilla.org/Firefox3.1/Features" id="r3.t"&gt;Firefox 3.1 features&lt;/a&gt;)&lt;span&gt;, Snowl tasks are prioritized.  For Snowl, the fuzzy prioritization scheme is:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;P1: really want&lt;br /&gt;&lt;/li&gt;&lt;li&gt;P2: want&lt;/li&gt;&lt;li&gt;P3: nice to have&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h3&gt;Releases&lt;/h3&gt;These are the target release dates for the imminent 0.2 release and the three releases after that:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;0.2: Monday, January 12&lt;/li&gt;&lt;li&gt;0.3: Monday, March 9&lt;/li&gt;&lt;li&gt;0.4: Monday, April 20&lt;/li&gt;&lt;li&gt;0.5: Tuesday, May 26&lt;/li&gt;&lt;/ul&gt;(Note: The 0.3 cycle is eight weeks long to accommodate twoish weeks of vacation I have planned in January and February.)&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;0.3: simpler and smarter&lt;br /&gt;&lt;/h3&gt; &lt;h4&gt;Feeds&lt;/h4&gt; &lt;ul&gt;&lt;li&gt;P1 expose feeds from frecent (frequent + recent) websites [atul]&lt;br /&gt;&lt;/li&gt;&lt;li&gt;P1 pick a feed automatically from among feeds with equivalent content&lt;/li&gt;&lt;li&gt;P1 let users subscribe to feeds by entering the location of a website&lt;/li&gt;&lt;li&gt;P2 automatically subscribe to feeds in live bookmarks [atul]&lt;br /&gt;&lt;/li&gt;&lt;li&gt;P2 automatically discard old feed items and tweets&lt;/li&gt;&lt;li&gt;P2 automatically determine how often to refresh feeds&lt;/li&gt;&lt;li&gt;P2 let users specify how long to retain feed items and tweets&lt;/li&gt;&lt;/ul&gt;      &lt;br /&gt;&lt;h4&gt;Twitter&lt;/h4&gt;  &lt;ul&gt;&lt;li&gt;P1 support replying to messages&lt;/li&gt;&lt;li&gt; P2 support direct messages (private messages to specific users)&lt;/li&gt;&lt;li&gt;P2 automatically subscribe to Twitter account in browser history&lt;br /&gt;&lt;/li&gt;&lt;li&gt;  P3 shorten long URLs when composing messages&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;Architecture/Extensibility&lt;/h4&gt;  &lt;ul&gt;&lt;li&gt;P1 simplify composition of messaging service implementations from Source and Target prototypes&lt;/li&gt;&lt;/ul&gt;   &lt;br /&gt;&lt;h4&gt;Misc&lt;/h4&gt;  &lt;ul&gt;&lt;li&gt;P1 split collections view into resizable accounts/people sections [alta88]&lt;br /&gt;&lt;/li&gt;&lt;li&gt;P1 support email protocols [alta88]&lt;/li&gt;&lt;li&gt;P2 integrate Snowl into Thunderbird&lt;/li&gt;&lt;li&gt;P2 organize river view into editions&lt;/li&gt;&lt;li&gt;P3 use JS templates to build stream, river views&lt;/li&gt;&lt;/ul&gt;     &lt;br /&gt;&lt;h3&gt;0.4: people and extensibility&lt;br /&gt;&lt;/h3&gt;&lt;h4&gt;People&lt;/h4&gt;&lt;ul&gt;&lt;li&gt; P1 add a person-centric view&lt;/li&gt;&lt;li&gt;P1 automatically associate identities that represent the same person&lt;/li&gt;&lt;li&gt;P1 let users associate identities that represent the same person&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;        &lt;br /&gt;&lt;h4&gt;Extensibility&lt;/h4&gt;  &lt;ul&gt;&lt;li&gt;P1 optimize database schema for sparse/custom attributes (f.e. username for Twitter, website URI for feeds)&lt;/li&gt;&lt;li&gt;P2 move OPML import/export processing into messaging service connectors so they can provide custom attributes (f.e. username for Twitter)&lt;/li&gt;&lt;li&gt;P2 compose subscription dialog from messaging service connector-specific overlays&lt;/li&gt;&lt;li&gt;P3 factor out common functionality from Feed and Twitter implementations into Source and Target prototypes&lt;/li&gt;&lt;/ul&gt;           &lt;br /&gt;&lt;h4&gt;Conversations&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;P2 derive conversations from message metadata&lt;/li&gt;&lt;li&gt;P2 display messages in the contexts of the conversations to which they belong&lt;/li&gt;&lt;/ul&gt;  &lt;br /&gt;&lt;h4&gt;Misc&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;P2 add a wordle-like view of messages&lt;/li&gt;&lt;/ul&gt;  &lt;br /&gt;&lt;h3&gt;0.5: broader horizons&lt;br /&gt;&lt;/h3&gt;&lt;h4&gt;Feed Conversations&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;P1 retrieve comments on feed items automatically&lt;/li&gt;&lt;li&gt; P2 enable users to post comments on feed items&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;People&lt;/h4&gt;&lt;ul&gt;&lt;li&gt; P1 consume contact info from Portable Contacts service providers&lt;/li&gt;&lt;li&gt; P2 provide contact info to Portable Contacts consumers&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;Misc&lt;/h4&gt;  &lt;ul&gt;&lt;li&gt;P1 support several additional messaging services/social networks&lt;/li&gt;&lt;/ul&gt; &lt;ul&gt;&lt;li&gt;P2 support categorization of accounts and messages via tagging&lt;/li&gt;&lt;li&gt;P2 synchronize subscriptions to a cloud datastore&lt;br /&gt;&lt;/li&gt;&lt;li&gt;P3 synchronize all message data to a cloud datastore&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-4220389101602206157?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/4220389101602206157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=4220389101602206157' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4220389101602206157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4220389101602206157'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2009/01/snowl-roadmap.html' title='Snowl Roadmap'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-3542775603962603803</id><published>2009-01-08T21:34:00.000-08:00</published><updated>2009-01-08T21:52:39.238-08:00</updated><title type='text'>Snowl Principles</title><content type='html'>Over the course of working on Snowl, I've established a set of principles to guide its development.  They're aspirational, but they have many practical ramifications.  And while the current implementation doesn't embody them yet by a long shot, I expect it conform more and more closely to them over time.&lt;br /&gt;&lt;br /&gt;The principles are:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;feeds are a transport format, not a feature;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;people and conversations are first-class objects;&lt;/li&gt;&lt;li&gt;one app can satisfy a broad range of users;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;searching is better than pre-categorization;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;browser features are useful for messaging;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;a messaging app is a platform.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h3&gt;  feeds are a transport format, not a feature&lt;br /&gt;&lt;/h3&gt; &lt;div style="text-align: left;"&gt;Feeds are currently presented in many application interfaces (including Firefox's) as a user-facing feature of the web.  But feeds are data formats defining generic mechanisms for syndicating content.  They're designed to be machine-readable, not human-consumable, and interfaces that expose them directly are often too technical, like the way websites publish both RSS and Atom feeds and Firefox asks users to pick between them (as aptly &lt;a title="noted by Atul" href="http://www.toolness.com/wp/?p=158" id="lnw:"&gt;described by Atul Varma&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Treating feeds as a transport format means that rather than exposing them directly, Snowl should use them internally to give users a way to do the things they want to do, like find out when a website changes or keep up with what their friends are doing on the web.&lt;br /&gt;&lt;br /&gt;So when a website provides RSS and Atom feeds of the same content, Snowl should pick a format instead of asking the user to do so.  And when a website provides comment feeds, Snowl shouldn't expose those feeds to users, it should just show the conversations embodied in them to the users following that site.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;The same is true for feeds provided by social network APIs.  For example, the &lt;a title="Last.fm API" href="http://www.last.fm/api" id="srf3"&gt;Last.fm API&lt;/a&gt; exposes the listening habits of its users' friends as individual feeds, but Snowl shouldn't make users manage individual feed subscriptions when they're really just interested in what their friends are listening to.  Instead, it should present those individual feeds as &lt;span style="font-style: italic;"&gt;Last.fm friend updates&lt;/span&gt;, separating them by friend--not feed--where appropriate.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt; people and conversations are first-class objects&lt;br /&gt;&lt;/h3&gt; There's no unique identifier for people on the internet.  We each have an ever growing number of email addresses, usernames, and nicks on various websites, social networks, and messaging services.  But we think of each person's various identifiers as representing the same being, and so should Snowl, so its users never have to figure out how they received a message (email, blog post, tweet, etc.) when looking for one from a particular person.&lt;br /&gt;&lt;br /&gt;Also, context is crucial in conversations, and it's rarely obvious which message contains a particular portion of an extended conversation, so Snowl should let users interact with conversations rather than just their constituent messages, searching and browsing them as easily as they search and browse individual messages, and displaying messages in context.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;one app can satisfy a broad range of users&lt;/h3&gt; Most users don't want to configure their experience, they just want things to work.  And Snowl shouldn't force them to make unnecessary decisions.  In fact, Snowl should need no preferences, because it always knows exactly what its users want.&lt;br /&gt;&lt;br /&gt;Realistically, that's not possible, but the closer we can get, the better (while not trying to be too smart in ways that frustrate users).  For example, a number of feed readers let users specify how often to update each feed.  But this is information that it's possible to derive based on how often a feed is updated.  There's no reason for Snowl to expose this question to users who shouldn't need to answer it.&lt;br /&gt;&lt;br /&gt;Some users, however, do want to configure their experience.  Others have unusual needs.  And some have great ideas about how to create better experiences.&lt;br /&gt;&lt;br /&gt;Firefox has shown that it's possible to build an application that satisfies all these users, and Snowl should follow in its pawsteps, using hidden preferences, subtle affordances, extensibility APIs, and other techniques to make it possible for those users to customize and modify Snowl to their hearts' content, while keeping the interface simple for everyone else.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;searching is better than pre-categorization&lt;/h3&gt; Traditional messaging interfaces use pre-categorization to help you find messages.  But the evolution of web search engines has shown that it's faster and simpler in many cases to simply search for what you want.  Snowl should make it trivial to find any message quickly by searching for its content or metadata.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;browser features are useful for messaging&lt;/h3&gt; Web browsers have developed a variety of features over the last dozenish years to make it easier for users to browse, find, save, and recall the web pages they visit.  Snowl should take advantage of all these innovations to make accessing messages better, utilizing features like tabs for opening multiple messages, bookmarks to flag them for later reference, tagging for categorization, and the awesomebar for searching them.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt; a messaging app is a platform&lt;/h3&gt; Snowl was never intended to be just a feed and tweet reader.  Feeds and Twitter are just two popular services with open APIs whose disparate kinds of messaging were good testbeds for early architectural and user experience decisions.  Communication over the internet is evolving rapidly, and messaging apps have to evolve alongside it.&lt;br /&gt;&lt;br /&gt;The best way to do that is to make Snowl a platform that others can extend to new messaging services and user experiences.&lt;br /&gt;&lt;br /&gt;So Snowl comprises a datastore of subscriptions, messages, and people; a set of APIs for retrieving, storing, and sending messages; and a variety of interfaces for accessing them.  And it should employ a flexible schema (like &lt;a title="CouchDB" href="http://couchdb.apache.org/" id="m9tk"&gt;CouchDB&lt;/a&gt;'s) to make it trivial to extend its data model; expose an API that makes it easy to add support for new messaging services; and provide useful primitives for building innovative new ways of looking at messages.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-3542775603962603803?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/3542775603962603803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=3542775603962603803' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3542775603962603803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3542775603962603803'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2009/01/snowl-principles.html' title='Snowl Principles'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-2146340664228072900</id><published>2009-01-07T23:59:00.000-08:00</published><updated>2009-01-08T00:00:58.038-08:00</updated><title type='text'>Snowl Futures</title><content type='html'>&lt;div class="moz-text-html" lang="x-western"&gt;      With Snowl 0.2 almost out the door, I've been thinking about potential directions for its future development, and I've identified three possibilities.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Message Reader&lt;/h3&gt; The first is the idea that started the project: a message reader integrated into the browser, which uses Firefox features like tabs, bookmarks, history, the awesomebar, the sidebar, etc. to present messages.&lt;br /&gt;&lt;br /&gt;Internet users live in their browsers, and much of their messaging is web-centric (feed items, tweets, messages sent via social networks, etc.).  A message reader built into Firefox can aggregate those messages, store them locally (where their recipients have control over them), and provide a unified interface to them no matter where they come from and what protocols delivered them.&lt;br /&gt;&lt;br /&gt;And it can help users uncover unknown sources of useful messages, like feeds from websites they frequent and updates from social networks to which they belong.&lt;br /&gt;&lt;br /&gt;Snowl's biggest weakness relative to web-based alternatives (webmail, web feed readers, messaging apps built into social networks) is that it doesn't persist messages to a remote datastore, so users can't access them from anywhere.  But it certainly could do so using &lt;a href="http://labs.mozilla.com/projects/weave/"&gt;Weave&lt;/a&gt;, &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt;, or some other technology for synchronization to cloud storage.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Social Activity Tracker&lt;/h3&gt; The second potential direction for Snowl is for it to utilize feeds and social network APIs to keep users  informed about what their friends are doing on the web.  In other words, it could take up the mantle of &lt;a href="https://wiki.mozilla.org/Labs/The_Coop"&gt;The Coop&lt;/a&gt;, the idea for a Firefox-based social activity tracker that labs prototyped in 2007.&lt;br /&gt;&lt;br /&gt;Just as with a message reader, a social activity tracker built into the browser would be in a unique position to expose useful updates to users across all of the sites they visit.&lt;br /&gt;&lt;br /&gt;Snowl would need some modifications to behave in this way.  In particular, it would need to get better at retrieving and aggregating lists of friends across multiple social networks.  But its architecture is already well-suited to the task in a number of respects, since social activity is frequently exposed through messaging protocols, which Snowl has been designed to support.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Better Feed Reader for Thunderbird&lt;/h3&gt; The third potential is to integrate Snowl into Thunderbird as a better feed reader for that application.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt; Thunderbird's current feed reading feature is based on the &lt;a title="Forumzilla" href="http://forumzilla.mozdev.org/" id="hyy-"&gt;Forumzilla&lt;/a&gt; feed reading extension I originally started working on in 1999/2000, and it suffers from a number of limitations and archaicisms.  For example, it confines its messages to a separate "server" within the Thunderbird folder pane, and it provides only the traditional three-pane interface for reading them.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Snowl integrated into Thunderbird could break feed messages out of their "separate folder" ghetto, integrating them into the stream of messages from other sources, and provide a variety of useful views on them.  And it would bring Twitter messaging to Thunderbird, too.  Plus, Snowl developers would gain exposure to some of the interesting and innovative work happening in Thunderbird these days, which could benefit Snowl on Firefox.&lt;br /&gt;&lt;br /&gt;The biggest challenge would be integrating Snowl into the very different capabilities provided by Thunderbird.  Recent improvements to Thunderbird's extensibility and support for browser-like features such as tabs will make this easier, however.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I think all these directions have potential and are worth exploring.  And while I'm going to remain focused primarily on Snowl as a message reader for now, I'll be conducting experiments along the way to learn more about the other possibilities.  I'd also love to see other folks tackling them, so if you're interested in doing so, &lt;a title="let's talk" href="https://labs.mozilla.com/forum/?CategoryID=27" id="ivhp"&gt;let's talk&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-2146340664228072900?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/2146340664228072900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=2146340664228072900' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2146340664228072900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2146340664228072900'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2009/01/with-snowl-0.html' title='Snowl Futures'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-3729536929165976830</id><published>2009-01-07T23:47:00.001-08:00</published><updated>2009-01-07T23:55:52.359-08:00</updated><title type='text'>Snowl 0.2rc2</title><content type='html'>The second release candidate of Snowl 0.2 is now available.  This version fixes a few minor issues discovered in the first release candidate.  Barring the discovery of additional issues that would block the release, this is the build that will be released as Snowl 0.2.&lt;br /&gt;&lt;br /&gt;Give it a try, and let us know what you think.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;&lt;a href="https://people.mozilla.com/%7Emyk/snowl/snowl-test.xpi"&gt;Install Snowl&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://labs.mozilla.com/projects/snowl/"&gt;Snowl Central&lt;/a&gt; | &lt;a href="https://labs.mozilla.com/forum/?CategoryID=27"&gt;Discussion Forum&lt;/a&gt; | &lt;a href="ircs://irc.mozilla.org:6697/%23labs"&gt;IRC Channel&lt;/a&gt; | &lt;a href="https://bugzilla.mozilla.org/buglist.cgi?product=Mozilla%20Labs&amp;amp;component=Snowl"&gt;Bug Reports&lt;/a&gt; | &lt;a href="https://bugzilla.mozilla.org/enter_bug.cgi?product=Mozilla%20Labs&amp;amp;component=Snowl"&gt;Report a Bug&lt;/a&gt; | &lt;a href="http://hg.mozilla.org/labs/snowl/"&gt;Source Code&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-3729536929165976830?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/3729536929165976830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=3729536929165976830' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3729536929165976830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3729536929165976830'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2009/01/snowl-02rc2.html' title='Snowl 0.2rc2'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-5551553385873069575</id><published>2008-12-31T17:37:00.001-08:00</published><updated>2008-12-31T19:44:23.729-08:00</updated><title type='text'>Snowl 0.2rc1</title><content type='html'>The first release candidate of Snowl 0.2 is now available.&amp;nbsp; This version sports no new features relative to the &lt;a  href="http://www.melez.com/mykzilla/2008/11/third-and-final-preview-of-snowl-02.html"&gt;last preview release&lt;/a&gt;, just a bunch of bug fixes.&amp;nbsp; Barring the discovery of unexpected issues, this is the build that will be released as Snowl 0.2.&lt;br&gt; &lt;br&gt; Notable bug fixes include:&lt;br&gt; &lt;ul&gt;   &lt;li&gt;an updated visual design with platform-specific icons for feeds and people;&lt;/li&gt;   &lt;li&gt;Firefox is more responsive when Snowl is refreshing sources and building views;&lt;/li&gt;   &lt;li&gt;multiple Twitter accounts no longer occasionally get confused for each other;&lt;/li&gt;   &lt;li&gt;views update more consistently when messages and sources are added or removed;&lt;/li&gt;   &lt;li&gt;the river and stream views always show messages in the order they were received.&lt;/li&gt; &lt;/ul&gt; As of this release, I've also switched to hosting Snowl development on the same infrastructure (source code repository, bug tracker, discussion forums, etc.) as other labs projects to make it easier for participants in those other projects to contribute to Snowl.&lt;br&gt; &lt;br&gt; Give the release candidate a try, and let me know what you think.&lt;br&gt; &lt;br&gt; &lt;b&gt;&lt;a href="https://people.mozilla.com/%7Emyk/snowl/snowl-test.xpi"&gt;Install Snowl&lt;/a&gt;&lt;/b&gt;&lt;br&gt; &lt;br&gt; &lt;a href="https://labs.mozilla.com/forum/?CategoryID=27"&gt;Discussion Forum&lt;/a&gt; | &lt;a  href="https://bugzilla.mozilla.org/buglist.cgi?product=Mozilla%20Labs&amp;amp;amp;component=Snowl"&gt;Bug Reports&lt;/a&gt; | &lt;a  href="https://bugzilla.mozilla.org/enter_bug.cgi?product=Mozilla%20Labs&amp;amp;amp;component=Snowl"&gt;Report a Bug&lt;/a&gt; | &lt;a href="http://hg.mozilla.org/labs/snowl/"&gt;Source Code&lt;/a&gt;&lt;br&gt; &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-5551553385873069575?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/5551553385873069575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=5551553385873069575' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/5551553385873069575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/5551553385873069575'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/12/snowl-02rc1.html' title='Snowl 0.2rc1'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-8223228565666214935</id><published>2008-11-30T22:35:00.000-08:00</published><updated>2008-11-30T22:50:54.661-08:00</updated><title type='text'>simpler, easier string bundle API</title><content type='html'>In the process of improving localizability in &lt;a href="http://labs.mozilla.com/projects/snowl/"&gt;Snowl&lt;/a&gt; today, I put together a &lt;a href="http://hg.mozdev.org/jsmodules/file/tip/StringBundle.js"&gt;StringBundle JS module&lt;/a&gt; to make it easier to access string bundles from other JS modules (and JS XPCOM components and chrome JS, for that matter).&lt;br /&gt;&lt;br /&gt;The module has a simple, easy-to-use API with a single &lt;code&gt;get&lt;/code&gt; method that retrieves both plain and formatted strings:&lt;br /&gt;&lt;pre style="border: 1px dashed black; padding: 5px; overflow: auto; color: black; background-color: lightgrey;"&gt;let strings = new StringBundle("chrome://example/locale/strings.properties");&lt;br /&gt;let foo = strings.get("foo");&lt;br /&gt;let barFormatted = strings.get("bar", [arg1, arg2]);&lt;br /&gt;for each (let string in strings.getAll())&lt;br /&gt;  dump(string.key + " = " + string.value + "\n");&lt;br /&gt;&lt;/pre&gt;  However, it also supports the API for the &lt;a href="http://mxr.mozilla.org/mozilla/source/toolkit/content/widgets/stringbundle.xml"&gt;stringbundle XBL binding&lt;/a&gt; to make it easier to move from the binding to the module:&lt;br /&gt;&lt;pre style="border: 1px dashed black; padding: 5px; overflow: auto; color: black; background-color: lightgrey;"&gt;let strings = &lt;strike&gt;document.getElementById("myStringBundleElement");&lt;/strike&gt;&lt;br /&gt;              new StringBundle("chrome://example/locale/strings.properties");&lt;br /&gt;let foo = strings.getString("foo");&lt;br /&gt;let barFormatted = strings.getFormattedString("bar", [arg1, arg2]);&lt;br /&gt;let enumerator = strings.strings;&lt;br /&gt;while (enumerator.hasMoreElements()) {&lt;br /&gt;  let string = enumerator.getNext().QueryInterface(Ci.nsIPropertyElement);&lt;br /&gt;  dump(string.key + " = " + string.value + "\n");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; The &lt;a href="http://hg.mozdev.org/jsmodules/file/tip/StringBundle.js"&gt;module is available&lt;/a&gt; with the other &lt;a href="http://hg.mozdev.org/jsmodules/file/tip"&gt;useful JS modules&lt;/a&gt; in the jsmodules project on mozdev.org.  Documentation is embedded inside the module as well as &lt;a href="https://wiki.mozilla.org/Labs/JS_Modules#StringBundle"&gt;on the project wiki&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-8223228565666214935?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/8223228565666214935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=8223228565666214935' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8223228565666214935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8223228565666214935'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/11/simpler-easier-string-bundle-api.html' title='simpler, easier string bundle API'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-2447306625868099694</id><published>2008-11-26T23:14:00.000-08:00</published><updated>2008-11-26T23:54:15.088-08:00</updated><title type='text'>Third (and Final) Preview of Snowl 0.2</title><content type='html'>I've pushed a new preview release of the next version of Snowl.  It includes an updated design for the "river of news" view with many improvements suggested by &lt;a href="http://blog.mozilla.com/faaborg/"&gt;Alex Faaborg&lt;/a&gt; and others.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/Picture-1-789444.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 251px;" src="http://www.melez.com/mykzilla/uploaded_images/Picture-1-789440.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It also supports sending tweets in addition to receiving them via an interface built into the river and stream views.  Just click on the "write a message" icon to expose it:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/Picture-4-778682.png"&gt;&lt;img style="cursor: pointer; width: 222px; height: 204px;" src="http://www.melez.com/mykzilla/uploaded_images/Picture-4-778679.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And it supports multiple Twitter accounts (thanks to &lt;a href="http://weblogs.mozillazine.org/bz/"&gt;Boris Zbarsky&lt;/a&gt;, who helped resolve a final vexing issue with HTTP auth), so if you happen to have more than one, you can keep track of all of them:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/Picture-6-769961.png"&gt;&lt;img style="cursor: pointer; width: 182px; height: 75px;" src="http://www.melez.com/mykzilla/uploaded_images/Picture-6-769955.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;alta88 also contributed a bunch of improvements and bug fixes, including a context menu for sources with some common commands (like Refresh and Unsubscribe).  And &lt;a href="http://www.toolness.com/wp/"&gt;Atul Varma&lt;/a&gt; contributed a patch that will make it easier to plug in support for other sources of messages.&lt;br /&gt;&lt;br /&gt;Finally, I fixed a big performance bug that was slowing down database queries for message content linearly with the database's growth in size.  It looked something like this (courtesy &lt;a href="http://flickr.com/photos/beneneuman/"&gt;beneneuman&lt;/a&gt;):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/big-fat-bug-779029.jpg"&gt;&lt;img style="cursor: pointer; width: 358px; height: 400px;" src="http://www.melez.com/mykzilla/uploaded_images/big-fat-bug-779023.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This preview is feature complete, which means no additional features will land in 0.2.  From here on out, it's only important bug fixes, minor look and feel enhancements, localization support, and other low risk/polish/completeness issues until the release of 0.2.&lt;br /&gt;&lt;br /&gt;So try it out, and let me know if you run into any of those kinds of problems (or any others, for that matter, as 0.3 development will be gearing up soon).&lt;br /&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="on" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;img src="http://www.blogger.com/img/blank.gif" alt="Link" class="gl_link" border="0" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/8397/"&gt;Install&lt;/a&gt; | &lt;a href="http://snowl.mozdev.org/drupal/forum/1"&gt;Discuss&lt;/a&gt; | &lt;a href="irc://moznet/%23labs"&gt;Chat&lt;/a&gt; | &lt;a href="https://www.mozdev.org/bugs/buglist.cgi?product=snowl"&gt;Bug Reports&lt;/a&gt; | &lt;a href="https://www.mozdev.org/bugs/enter_bug.cgi?product=snowl"&gt;Report a Bug&lt;/a&gt; | &lt;a href="http://hg.mozdev.org/snowl"&gt;Source Code&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Warning: this version is a primitive implementation with many bugs, and subsequent versions will include changes that break functionality and delete all your messages, making you start over from scratch.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-2447306625868099694?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/2447306625868099694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=2447306625868099694' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2447306625868099694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2447306625868099694'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/11/third-and-final-preview-of-snowl-02.html' title='Third (and Final) Preview of Snowl 0.2'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-4689189991894147367</id><published>2008-11-19T12:02:00.000-08:00</published><updated>2008-11-19T12:16:50.738-08:00</updated><title type='text'>making OS X stop prompting me for my wireless password</title><content type='html'>I've long had problems automatically reconnecting to a certain WPA Enterprise wireless network from my MacBook Pro running Mac OS X 10.5.&lt;br /&gt;&lt;br /&gt;Despite deleting the network from System Preferences &gt; Network &gt; AirPort &gt; Advanced... &gt; Preferred Networks, deleting its password from the login and System keychains using Applications &gt; Utilities &gt; Keychain Access, and then saving the network and credentials anew, the OS would prompt me to reenter my password for it every time I reconnected to it.&lt;br /&gt;&lt;br /&gt;Some digging around on the web suggested that folks having a variety of Mac OS X wireless networking problems can sometimes solve them by deleting various configuration files, including /Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist.&lt;br /&gt;&lt;br /&gt;I checked that file, and strangely, it listed a very old password for that wireless network.  Turning off AirPort, deleting that file (I made a backup first just in case), and turning AirPort back on has resolved the problem.  I can now reconnect to the network repeatedly (including after a reboot) without being prompted for my password.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-4689189991894147367?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/4689189991894147367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=4689189991894147367' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4689189991894147367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4689189991894147367'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/11/making-os-x-stop-prompting-me-for-my.html' title='making OS X stop prompting me for my wireless password'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-5208510983881943124</id><published>2008-11-17T22:54:00.000-08:00</published><updated>2008-11-18T11:21:12.737-08:00</updated><title type='text'>news: links to Google Groups</title><content type='html'>(&lt;strong&gt;Note: updated with a more reliable representation of the link.&lt;/strong&gt;)&lt;br /&gt;(&lt;strong&gt;Note: updated again to support news:&amp;lt;newsgroup-name&gt; links.&lt;/strong&gt;)&lt;br /&gt;&lt;br /&gt;Here's an obscure hack.&lt;br /&gt;&lt;br /&gt;Firefox 3 supports web protocol handlers (f.e. sending mailto: links to Gmail), while Google Groups archives Usenet.  But as far as I can tell, Google Groups doesn't support news: links, even though Firefox can send them to it.  It does, however, support retrieving messages by their IDs or newsgroup names, which news: links contain.&lt;br /&gt;&lt;br /&gt;So how could we get Google Groups to load news: links passed to it by Firefox?&lt;br /&gt;&lt;br /&gt;The solution is to pass them to an intermediary that extracts the IDs/names from the links and passes them to Google Groups.  Here's a data: URL that does that:&lt;br /&gt;&lt;pre style="border: 1px solid black; padding: 5px; overflow: auto; background-color: rgb(204, 204, 204); color: black;"&gt;data:text/html,\&lt;br /&gt;  &amp;lt;html&gt;&amp;lt;body&gt;&amp;lt;script&gt;\&lt;br /&gt;    var url = '%s';\&lt;br /&gt;    var stripPrefix = /^news:(\\/\\/[^\\/]+\\/)?/;\&lt;br /&gt;    if (/@/.test(url))\&lt;br /&gt;      window.location = 'http://groups.google.com/groups?selm='+url.replace(stripPrefix, '');\&lt;br /&gt;    else\&lt;br /&gt;      window.location = 'http://groups.google.com/group/'+url.replace(stripPrefix, '');\&lt;br /&gt;  &amp;lt;/script&gt;&amp;lt;/body&gt;&amp;lt;/html&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Unfortunately, it isn't easy to configure Firefox to use this URL as the news: protocol handler.  Manually hacking &lt;a href="http://kb.mozillazine.org/MimeTypes.rdf"&gt;mimeTypes.rdf&lt;/a&gt; is most unpleasant, while &lt;a href="https://developer.mozilla.org/en/DOM/window.navigator.registerProtocolHandler"&gt;window.navigator.registerProtocolHandler&lt;/a&gt; only registers http(s): URLs.&lt;br /&gt;&lt;br /&gt;But it's possible to construct a javascript: URL that does the same thing registerProtocolHandler does, namely call the &lt;a href="http://mxr.mozilla.org/mozilla/source/uriloader/exthandler/nsIHandlerService.idl"&gt;handler service&lt;/a&gt; and register the handler with it directly.&lt;br /&gt;&lt;br /&gt;The only trick is that you have to enter and run it in the Error Console, which has chrome privileges.  Otherwise the URL won't have the privileges it needs to register the handler.&lt;br /&gt;&lt;br /&gt;Here's a javascript: URL that registers the handler:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 1px solid black; padding: 5px; background-color: rgb(204, 204, 204); color: black;"&gt;javascript: var Cc = Components.classes; var Ci = Components.interfaces; var handler = Cc['@mozilla.org/uriloader/web-handler-app;1'].createInstance(Ci.nsIWebHandlerApp); handler.name = 'Google Groups'; handler.uriTemplate = "data:text/html, &amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;script&amp;gt; var url = '%s'; var stripPrefix = /^news:(\\/\\/[^\\/]+\\/)?/; if (/@/.test(url)) window.location = 'http://groups.google.com/groups?selm='+url.replace(stripPrefix, ''); else window.location = 'http://groups.google.com/group/'+url.replace(stripPrefix, ''); &amp;lt;/script&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;"; var eps = Cc['@mozilla.org/uriloader/external-protocol-service;1'].getService(Ci.nsIExternalProtocolService); var handlerInfo = eps.getProtocolHandlerInfo('news'); handlerInfo.possibleApplicationHandlers.appendElement(handler, false); handlerInfo.alwaysAskBeforeHandling = true; var hs = Cc['@mozilla.org/uriloader/handler-service;1'].getService(Ci.nsIHandlerService); hs.store(handlerInfo); window.location = "data:text/html, &amp;lt;body&amp;gt; &amp;lt;p&amp;gt;The news: link handler for Google Groups has been installed. Try it with these links:&amp;lt;/p&amp;gt; &amp;lt;ul&amp;gt; &amp;lt;li&amp;gt;&amp;lt;a href='news:mozilla.support.firefox'&amp;gt;news:mozilla.support.firefox&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;lt;a href='news://news.mozilla.org/mozilla.support.firefox'&amp;gt;news://news.mozilla.org/mozilla.support.firefox&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;lt;a href='news:37604264.65F502CD@netscape.com'&amp;gt;news:37604264.65F502CD@netscape.com&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;li&amp;gt;&amp;lt;a href='news://news.mozilla.org/37604264.65F502CD@netscape.com'&amp;gt;news://news.mozilla.org/37604264.65F502CD@netscape.com&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;/ul&amp;gt; &amp;lt;/body&amp;gt;"; &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To use it, copy the URL, open the Error Console (Tools &gt; Error Console or Ctrl/Command+Shift+J), paste the URL into the evaluation field, and press the Evaluate button.&lt;br /&gt;&lt;br /&gt;Once you've done that, try it out with these links:&lt;ul&gt;&lt;li&gt;&lt;a href='news:mozilla.support.firefox'&gt;news:mozilla.support.firefox&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='news://news.mozilla.org/mozilla.support.firefox'&gt;news://news.mozilla.org/mozilla.support.firefox&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='news:37604264.65F502CD@netscape.com'&gt;news:37604264.65F502CD@netscape.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='news://news.mozilla.org/37604264.65F502CD@netscape.com'&gt;news://news.mozilla.org/37604264.65F502CD@netscape.com&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;When you click one, Firefox will ask you what you want to do with the link, and Google Groups should be an option on the list.&lt;br /&gt;&lt;br /&gt;For the curious, here's a nicely formatted version of the code inside that javascript: URL, which is based on &lt;a href="http://mxr.mozilla.org/mozilla/ident?i=WCCR_addProtocolHandlerButtonCallback"&gt;WCCR_addProtocolHandlerButtonCallback&lt;/a&gt;:&lt;br /&gt;&lt;pre style="border: 1px solid black; padding: 5px; overflow: auto; background-color: rgb(204, 204, 204); color: black;"&gt;javascript:&lt;br /&gt;var Cc = Components.classes;&lt;br /&gt;var Ci = Components.interfaces;&lt;br /&gt;&lt;br /&gt;var handler = Cc['@mozilla.org/uriloader/web-handler-app;1'].createInstance(Ci.nsIWebHandlerApp);&lt;br /&gt;handler.name = 'Google Groups';&lt;br /&gt;handler.uriTemplate = "data:text/html,\&lt;br /&gt;  &amp;lt;html&gt;&amp;lt;body&gt;&amp;lt;script&gt;\&lt;br /&gt;    var url = '%s';\&lt;br /&gt;    var stripPrefix = /^news:(\\/\\/[^\\/]+\\/)?/;\&lt;br /&gt;    if (/@/.test(url))\&lt;br /&gt;      window.location = 'http://groups.google.com/groups?selm='+url.replace(stripPrefix, '');\&lt;br /&gt;    else\&lt;br /&gt;      window.location = 'http://groups.google.com/group/'+url.replace(stripPrefix, '');\&lt;br /&gt;  &amp;lt;/script&gt;&amp;lt;/body&gt;&amp;lt;/html&gt;";&lt;br /&gt;&lt;br /&gt;var eps = Cc['@mozilla.org/uriloader/external-protocol-service;1'].getService(Ci.nsIExternalProtocolService);&lt;br /&gt;var handlerInfo = eps.getProtocolHandlerInfo('news');&lt;br /&gt;handlerInfo.possibleApplicationHandlers.appendElement(handler, false);&lt;br /&gt;handlerInfo.alwaysAskBeforeHandling = true;&lt;br /&gt;&lt;br /&gt;var hs = Cc['@mozilla.org/uriloader/handler-service;1'].getService(Ci.nsIHandlerService);&lt;br /&gt;hs.store(handlerInfo);&lt;br /&gt;&lt;br /&gt;window.location = "data:text/html,\&lt;br /&gt;  &amp;lt;body&gt;\&lt;br /&gt;    &amp;lt;p&gt;The news: link handler for Google Groups has been installed.\&lt;br /&gt;       Try it with these links:&amp;lt;/p&gt;\&lt;br /&gt;    &amp;lt;ul&gt;\&lt;br /&gt;      &amp;lt;li&gt;&amp;lt;a href='news:mozilla.support.firefox'&gt;news:mozilla.support.firefox&amp;lt;/a&gt;&amp;lt;/li&gt;\&lt;br /&gt;      &amp;lt;li&gt;&amp;lt;a href='news://news.mozilla.org/mozilla.support.firefox'&gt;news://news.mozilla.org/mozilla.support.firefox&amp;lt;/a&gt;&amp;lt;/li&gt;\&lt;br /&gt;      &amp;lt;li&gt;&amp;lt;a href='news:37604264.65F502CD@netscape.com'&gt;news:37604264.65F502CD@netscape.com&amp;lt;/a&gt;&amp;lt;/li&gt;\&lt;br /&gt;      &amp;lt;li&gt;&amp;lt;a href='news://news.mozilla.org/37604264.65F502CD@netscape.com'&gt;news://news.mozilla.org/37604264.65F502CD@netscape.com&amp;lt;/a&gt;&amp;lt;/li&gt;\&lt;br /&gt;    &amp;lt;/ul&gt;\&lt;br /&gt;  &amp;lt;/body&gt;";&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Of course Google Groups could make this hack moot by simply supporting news: links and protocol handler registration natively.  For info on how to do that, Google Groups, see the news: URL standard in &lt;a href="http://tools.ietf.org/html/rfc1738"&gt;RFC 1738&lt;/a&gt; and &lt;a href="http://www.eyrie.org/%7Eeagle/nntp/drafts/"&gt;these subsequent IETF drafts&lt;/a&gt;, then read the Devmo docs on &lt;a href="https://developer.mozilla.org/en/DOM/window.navigator.registerProtocolHandler"&gt;window.navigator.registerProtocolHandler&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-5208510983881943124?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/5208510983881943124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=5208510983881943124' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/5208510983881943124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/5208510983881943124'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/11/news-links-to-google-groups.html' title='news: links to Google Groups'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-72256486109205482</id><published>2008-11-17T12:05:00.001-08:00</published><updated>2008-11-17T12:05:58.100-08:00</updated><title type='text'>Working at &gt;Play</title><content type='html'>Saturday I staffed the &lt;a href="http://labs.mozilla.com/"&gt;Mozilla Labs&lt;/a&gt; booth at the &lt;a href="http://playconference.org/"&gt;&amp;gt;play conference&lt;/a&gt; expo along with my colleagues &lt;a href="http://www.toolness.com/wp/"&gt;Atul Varma&lt;/a&gt; (who also &lt;a href="http://www.toolness.com/wp/?p=337"&gt;blogged about it&lt;/a&gt;) and &lt;a href="http://blog.mozilla.com/jay/"&gt;Jay Patel&lt;/a&gt;.&amp;nbsp; The event went really well, with a steady stream of visitors to our booth who were curious about Mozilla Labs projects and Mozilla in general.&lt;br&gt; &lt;br&gt; &lt;h3&gt;Profit is not a Four Letter Word Here&lt;br&gt; &lt;/h3&gt; I noticed early on that my standard spiel about Mozilla being nonprofit wasn't having the effect it normally has.&amp;nbsp; Usually people nod approvingly when I explain that we are a mission-driven organization and community, but this time I was getting blank stares or even slight airs of disapproval.&lt;br&gt; &lt;br&gt; I suppose that's because the conference was sponsored by a business school, and its attendees are mostly aspiring businesspeople, so nonprofit endeavors like ours don't have the same cachet they do amongst the web and open source hackers I usually meet at conferences.&lt;br&gt; &lt;br&gt; &lt;h3&gt;The Pitches &amp;amp; Audience Reactions&lt;/h3&gt; Nevertheless, everyone was really friendly and positive about Firefox, and many of them had heard of at least some of the labs projects we were demoing (&lt;a href="http://labs.mozilla.com/projects/weave/"&gt;Weave&lt;/a&gt;, &lt;a href="http://labs.mozilla.com/projects/ubiquity/"&gt;Ubiquity&lt;/a&gt;, &lt;a  href="http://labs.mozilla.com/projects/snowl/"&gt;Snowl&lt;/a&gt;, and the &lt;a  href="http://labs.mozilla.com/projects/concept-series/"&gt;Concept Series&lt;/a&gt;, among others).&lt;br&gt; &lt;br&gt; Everyone I asked also knew what open source was, and they were overall very positive about our plan to get more designers involved in open source development through the Concept Series.&lt;br&gt; &lt;br&gt; And the booth duty was great for refining my descriptions of those projects.&amp;nbsp; There's nothing like saying the same thing over and over again to separate the essence of the point from the redundant, misunderstood, or just plain unnecessary cruft.&amp;nbsp; By the middle of the day, my pitches were crisp and tight.&lt;br&gt; &lt;br&gt; &lt;h3&gt;Miscellaneous Firefox Feedback&lt;/h3&gt; One visitor told me he switched back to Safari because it lets him email a whole page (not just a link) with one click.&lt;br&gt; &lt;br&gt; Another attendee asked for a lighter-weight variant of the master password feature that protects Show Passwords in the Saved Passwords dialog but doesn't prompt you to enter the master password each session, so you can protect your passwords from being retrieved by others without the annoyance of having to enter the master every time you restart your browser.&lt;br&gt; &lt;br&gt; A third person asked for a way to see only unvisited search results when searching the web, so he can check occasionally to see if there's new information about a search term without having to scroll through all the stuff he's already seen.&lt;br&gt; &lt;br&gt; And a professor suggested we could grow marketshare among students by pitching Firefox as the best browser for the popular iLearn online education software, as she solves many of her students' problems accessing her online classes by getting them to switch browsers.&lt;br&gt; &lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-72256486109205482?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/72256486109205482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=72256486109205482' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/72256486109205482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/72256486109205482'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/11/working-at-play.html' title='Working at &gt;Play'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-8633253142048357343</id><published>2008-11-13T09:52:00.001-08:00</published><updated>2008-11-13T09:52:11.468-08:00</updated><title type='text'>egg timer for lightning talks</title><content type='html'>Yesterday, for the Lightning Talks portion of the &lt;a  href="http://labs.mozilla.com/2008/11/mozilla-labs-meetup-wednesday-1112/"&gt;Mozilla Labs Meetup&lt;/a&gt;, I couldn't find a good online egg timer, so I created a simple one and put it up at &lt;a href="http://eggtimer.org/"&gt;eggtimer.org&lt;/a&gt;.&amp;nbsp; Since then I've found &lt;a href="http://lightningtimer.net/"&gt;lightningtimer.net&lt;/a&gt;, so I guess it wasn't necessary, but it's there now anyway.&lt;br&gt; &lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-8633253142048357343?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/8633253142048357343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=8633253142048357343' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8633253142048357343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8633253142048357343'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/11/egg-timer-for-lightning-talks.html' title='egg timer for lightning talks'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-5245311690572972985</id><published>2008-11-10T00:36:00.000-08:00</published><updated>2008-11-10T12:38:06.336-08:00</updated><title type='text'>&lt;jstemplate&gt;</title><content type='html'>&lt;pre&gt;&lt;div style="background-color: #B0C4DE; color: black; border: 1px solid black; border-bottom: 1px dotted black;"&gt;&lt;br /&gt;  &amp;lt;jstemplate&gt;&lt;br /&gt;    &amp;lt;description&gt;Hello world!&amp;lt;/description&gt;&lt;br /&gt;    &amp;lt;description&gt;{"Hello world!"}&amp;lt;/description&gt;&lt;br /&gt;    &amp;lt;description value="{'Hello world!'}"/&gt;&lt;br /&gt;  &amp;lt;/jstemplate&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #CCFFCC; color: black; border: 1px solid black; border-top: none;"&gt;&lt;br /&gt;  &amp;lt;description&gt;Hello world!&amp;lt;/description&gt;&lt;br /&gt;  &amp;lt;description&gt;Hello world!&amp;lt;/description&gt;&lt;br /&gt;  &amp;lt;description value="Hello world!"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;div style="background-color: #B0C4DE; color: black; border: 1px solid black; border-bottom: 1px dotted black;"&gt;&lt;br /&gt;  &amp;lt;description&gt;Good { new Date().getHours() &gt; 11 ? "afternoon" : "morning" }.&amp;lt;/description&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #CCFFCC; color: black; border: 1px solid black; border-top: none;"&gt;&lt;br /&gt;  &amp;lt;description&gt;Good morning.&amp;lt;/description&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;div style="background-color: #B0C4DE; color: black; border: 1px solid black; border-bottom: 1px dotted black;"&gt;&lt;br /&gt;  &amp;lt;?js for each (let i in [1, 2, 3]) { ?&gt;&lt;br /&gt;    &amp;lt;description&gt;There's no place like home.&amp;lt;/description&gt;&lt;br /&gt;  &amp;lt;?js } ?&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #CCFFCC; color: black; border: 1px solid black; border-top: none;"&gt;&lt;br /&gt;  &amp;lt;description&gt;There's no place like home.&amp;lt;/description&gt;&lt;br /&gt;  &amp;lt;description&gt;There's no place like home.&amp;lt;/description&gt;&lt;br /&gt;  &amp;lt;description&gt;There's no place like home.&amp;lt;/description&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;div style="background-color: #B0C4DE; color: black; border: 1px solid black; border-bottom: 1px dotted black;"&gt;&lt;br /&gt;  &amp;lt;script type="application/javascript"&gt;&lt;br /&gt;    let people = [&lt;br /&gt;      { name: "Jim",    rank: "celebrated", cerealBrand: "Special K" },&lt;br /&gt;      { name: "Midge",  rank: "heard of",   cerealBrand: "Trix" },&lt;br /&gt;      { name: "Genie",  rank: "unknown",    cerealBrand: "Muesli" },&lt;br /&gt;    ];&lt;br /&gt;  &amp;lt;/script&gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;jstemplate&gt;&lt;br /&gt;    &amp;lt;table xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;br /&gt;      &amp;lt;tr&gt;&lt;br /&gt;        &amp;lt;th&gt;Name&amp;lt;/th&gt;&lt;br /&gt;        &amp;lt;th&gt;Rank&amp;lt;/th&gt;&lt;br /&gt;        &amp;lt;th&gt;Cereal Brand&amp;lt;/th&gt;&lt;br /&gt;      &amp;lt;/tr&gt;&lt;br /&gt;      &amp;lt;?js for each (let person in people) { ?&gt;&lt;br /&gt;        &amp;lt;tr&gt;&lt;br /&gt;          &amp;lt;td&gt;{person.name}&amp;lt;/td&gt;&lt;br /&gt;          &amp;lt;td&gt;{person.rank}&amp;lt;/td&gt;&lt;br /&gt;          &amp;lt;td&gt;{person.cerealBrand}&amp;lt;/td&gt;&lt;br /&gt;        &amp;lt;/tr&gt;&lt;br /&gt;      &amp;lt;?js } ?&gt;&lt;br /&gt;    &amp;lt;/table&gt;&lt;br /&gt;  &amp;lt;/jstemplate&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #CCFFCC; color: black; border: 1px solid black; border-top: none;"&gt;&lt;br /&gt;  &amp;lt;table xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;br /&gt;    &amp;lt;tr&gt;&lt;br /&gt;      &amp;lt;th&gt;Name&amp;lt;/th&gt;&lt;br /&gt;      &amp;lt;th&gt;Rank&amp;lt;/th&gt;&lt;br /&gt;      &amp;lt;th&gt;Cereal Brand&amp;lt;/th&gt;&lt;br /&gt;    &amp;lt;/tr&gt;&lt;br /&gt;    &amp;lt;tr&gt;&lt;br /&gt;      &amp;lt;td&gt;Jim&amp;lt;/td&gt;&lt;br /&gt;      &amp;lt;td&gt;celebrated&amp;lt;/td&gt;&lt;br /&gt;      &amp;lt;td&gt;Special K&amp;lt;/td&gt;&lt;br /&gt;    &amp;lt;/tr&gt;&lt;br /&gt;    &amp;lt;tr&gt;&lt;br /&gt;      &amp;lt;td&gt;Midge&amp;lt;/td&gt;&lt;br /&gt;      &amp;lt;td&gt;heard of&amp;lt;/td&gt;&lt;br /&gt;      &amp;lt;td&gt;Trix&amp;lt;/td&gt;&lt;br /&gt;    &amp;lt;/tr&gt;&lt;br /&gt;    &amp;lt;tr&gt;&lt;br /&gt;      &amp;lt;td&gt;Genie&amp;lt;/td&gt;&lt;br /&gt;      &amp;lt;td&gt;unknown&amp;lt;/td&gt;&lt;br /&gt;      &amp;lt;td&gt;Muesli&amp;lt;/td&gt;&lt;br /&gt;    &amp;lt;/tr&gt;&lt;br /&gt;  &amp;lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://people.mozilla.com/~myk/template.xml"&gt;code is available&lt;/a&gt;.  Your thoughts &amp;amp; comparisons to &lt;a href="http://code.google.com/p/trimpath/wiki/JavaScriptTemplates"&gt;JavaScript Templates&lt;/a&gt;, &lt;a href="http://blog.markturansky.com/BetterJavascriptTemplates.html"&gt;Better JavaScript Templates&lt;/a&gt;, &lt;a href="http://code.google.com/p/jsmarty/"&gt;JSmarty&lt;/a&gt;, &lt;a href="http://github.com/bard/seethrough_js/wikis"&gt;seethrough&lt;/a&gt; and &lt;a href="https://developer.mozilla.org/en/JavaScript_templates"&gt;others&lt;/a&gt; are welcome!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-5245311690572972985?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/5245311690572972985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=5245311690572972985' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/5245311690572972985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/5245311690572972985'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/11/code-is-available.html' title='&amp;lt;jstemplate&amp;gt;'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-3650499738440737810</id><published>2008-10-20T12:33:00.001-07:00</published><updated>2008-10-20T12:51:41.687-07:00</updated><title type='text'>Second Preview of Snowl 0.2</title><content type='html'>I've just pushed the second preview release of the upcoming Snowl 0.2.  It adds a non-columnar option to the river view along with grouping by time period to the river and stream views.&lt;br /&gt;&lt;br /&gt;Here's the stream view grouped by day:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/Picture-3-758047.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://www.melez.com/mykzilla/uploaded_images/Picture-3-758043.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;And here's the period selector in the river view:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/Picture-9-776544.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://www.melez.com/mykzilla/uploaded_images/Picture-9-776541.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The second preview release also includes a number of enhancements from alta88, who has added several layout and header options to the list view along with a bunch of other improvements (like a customizable toolbar button for quickly accessing Snowl features).&lt;br /&gt;&lt;br /&gt;Here's the menu for selecting those layout and header options:&lt;br /&gt;&lt;br /&gt;&lt;div id="n5b5" style="padding: 1em 0pt; text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/Picture-8-728039.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://www.melez.com/mykzilla/uploaded_images/Picture-8-727963.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;/div&gt; This preview release also includes many bug fixes to improve performance and functionality.&lt;br /&gt;&lt;br /&gt;Still to come is a lot of behavior and visual design work, a number of additional bug fixes, and several more features, including Twitter-based message sending.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Get Snowl for Firefox&lt;/h3&gt; Get the preview release: &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/8397"&gt;Snowl for Firefox&lt;/a&gt;. &lt;p&gt;&lt;b id="d-.225"&gt;Warning: this version is a primitive implementation with many bugs, and subsequent versions will include changes that break functionality and delete all your messages, making you start over from scratch.&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt; &lt;h3&gt;Get Involved&lt;/h3&gt; Let us know what you think by &lt;a id="ine2" title="posting in the forum" href="http://snowl.mozdev.org/drupal/forum/1"&gt;posting in the forum&lt;/a&gt;, &lt;a id="rz-a" title="reporting bugs" href="https://www.mozdev.org/bugs/buglist.cgi?product=snowl"&gt;reporting bugs&lt;/a&gt;, or conversing with us in the #labs channel on irc.mozilla.org. Or &lt;a id="t978" title="check out the source" href="http://hg.mozdev.org/snowl/"&gt;check out the source&lt;/a&gt; and &lt;a id="g6o:" title="submit your bug fixes and enhancements" href="https://www.mozdev.org/bugs/enter_bug.cgi?product=snowl"&gt;submit your bug fixes and enhancements&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-3650499738440737810?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/3650499738440737810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=3650499738440737810' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3650499738440737810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3650499738440737810'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/10/second-preview-of-snowl-0.html' title='Second Preview of Snowl 0.2'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-1203758364191339492</id><published>2008-10-07T13:13:00.000-07:00</published><updated>2008-10-08T15:26:41.049-07:00</updated><title type='text'>Easier Access to Sidebars</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/Picture-5-783718.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://www.melez.com/mykzilla/uploaded_images/Picture-5-783718.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a href="http://blog.mozilla.com/faaborg/"&gt;Alex Faaborg&lt;/a&gt; suggested to me a few weeks ago that there should be an easier way to open and close &lt;a href="http://labs.mozilla.com/projects/snowl/"&gt;Snowl&lt;/a&gt;'s stream view sidebar, like a button that toggles it open and closed.&lt;br /&gt;&lt;br /&gt;That got me thinking that the same is true for other sidebars, as the &lt;span style="font-style: italic;"&gt;View &gt; Sidebar&lt;/span&gt; menu seems like a relatively obscure and cumbersome way to access them.  My inclination was to place a permanent interface on the left-hand side of the browser window, right where sidebars appear, that would be contextual, discoverable, and easily accessible.&lt;br /&gt;&lt;br /&gt;Tabs seemed to fit these requirements and are consistent with Firefox's "one sidebar open at a time" behavior, so, with some helpful input from &lt;a href="http://blog.sandmill.org/"&gt;Dan Mills&lt;/a&gt; on how similar interfaces in other applications have behaved, I cooked up an experimental extension that implements a column of vertical tabs representing sidebars down the left-hand side of the browser window.&lt;br /&gt;&lt;br /&gt;Dragging a tab to the right opens the corresponding sidebar, while dragging it back to the left closes it.  Dragging also lets you set the sidebar width.  Or open a sidebar to its previous width by simply clicking its tab (clicking again toggles it closed).&lt;br /&gt;&lt;br /&gt;The extension supports both built-in sidebars (Bookmarks, History) and those provided by extensions, as long as the extensions use the &lt;a href="http://developer.mozilla.org/En/Creating_a_Firefox_sidebar"&gt;standard machinery for defining their sidebars&lt;/a&gt;.  And it extends that machinery with support for tab icons: just set the &lt;span style="font-style: italic;"&gt;image&lt;/span&gt; attribute on your &lt;span style="font-style: italic;"&gt;&lt;broadcaster&gt;&lt;/broadcaster&gt;&lt;/span&gt; tag to the URL of the icon.&lt;br /&gt;&lt;br /&gt;It uses the new &lt;a href="http://developer.mozilla.org/web-tech/2008/09/12/css-transforms/"&gt;&lt;i&gt;-moz-transform&lt;/i&gt; CSS property&lt;/a&gt; to orient text vertically on the tabs (and a bit of the &lt;a href="http://developer.mozilla.org/En/DragDrop/Drag_and_Drop"&gt;new drag-drop API&lt;/a&gt; to start the drag operation) so it only works on &lt;a href="http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/"&gt;recent nightlies&lt;/a&gt;.  And it's a prototype, so there's still some wonkiness in its appearance and behavior.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/9181/"&gt;Check it out in the AMO sandbox&lt;/a&gt;, and let me know what you think. (Also note the &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1027"&gt;All-in-One Sidebar&lt;/a&gt;, another take on the same concept.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-1203758364191339492?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/1203758364191339492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=1203758364191339492' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/1203758364191339492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/1203758364191339492'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/10/easier-access-to-sidebars.html' title='Easier Access to Sidebars'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-7837360772061935519</id><published>2008-10-03T19:15:00.001-07:00</published><updated>2008-10-03T19:15:24.651-07:00</updated><title type='text'>Stuck on Songbird</title><content type='html'>I've tried the &lt;a  href="http://www.mozilla.org/projects/mozilla-based.html"&gt;Mozilla-based&lt;/a&gt; open-source music player &lt;a href="http://getsongbird.com/"&gt;Songbird&lt;/a&gt; twice before, and each time I reluctantly retreated to &lt;a  href="http://www.apple.com/itunes/"&gt;iTunes&lt;/a&gt; for a variety of reasons: Songbird wouldn't play my DRM-encumbered iTunes Store tracks, it was cumbersome to use, it kept crashing or wouldn't start, etc.&lt;br&gt; &lt;br&gt; But in August I stripped the DRM from my 50 encumbered songs by burning them to four CDs and then ripping them back.&amp;nbsp; And then I heard that the latest version of Songbird (0.7) had a redesigned interface.&amp;nbsp; So I decided to give it another try.&amp;nbsp; And this time it stuck.&lt;br&gt; &lt;br&gt; The major reason is the interface redesign, which has simplified the application considerably, making it much easier to navigate.&amp;nbsp; But it also doesn't crash much anymore and has started up fine every time.&lt;br&gt; &lt;br&gt; I've been using Songbird almost exclusively for the last few weeks, except when I need to burn a CD (which it still doesn't do) and during the occasional foray into the iTunes Store to see if it has DRM-free versions of songs I can't find in the &lt;a  href="http://www.amazon.com/MP3-Music-Download/b?ie=UTF8&amp;amp;node=163856011"&gt;Amazon MP3 Store&lt;/a&gt;, like &lt;a  href="http://en.wikipedia.org/wiki/Ministry_%28band%29"&gt;Ministry&lt;/a&gt;'s original recording of &lt;a  href="http://en.wikipedia.org/wiki/Jesus_Built_My_Hotrod"&gt;Jesus Built My Hotrod&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/The_Damned"&gt;The Damned&lt;/a&gt;'s remake of &lt;a  href="http://en.wikipedia.org/wiki/Jet_Boy,_Jet_Girl"&gt;Jet Boy, Jet Girl&lt;/a&gt; (sadly, it usually doesn't).&lt;br&gt; &lt;br&gt; I even activated its &lt;a href="http://www.audioscrobbler.net/"&gt;scrobbler&lt;/a&gt; support, and it's been pushing my listening habits to my public &lt;a  href="http://www.last.fm/"&gt;last.fm&lt;/a&gt; profile, which feels uncomfortably revealing, although no more so than having dozens of my colleagues following my decidedly non-work-related tweets.&lt;br&gt; &lt;br&gt; And I've tried out its &lt;a href="http://www.songkick.com/"&gt;Songkick&lt;/a&gt; functionality for automatically finding concert dates for the artists in my library, which feels like a killer feature, since it's so much easier than searching for concerts manually (or tediously programming &lt;a  href="http://www.ticketmaster.com/"&gt;Ticketmaster&lt;/a&gt;/&lt;a  href="http://www.livenation.com/"&gt;Live Nation&lt;/a&gt; to keep me in the loop).&lt;br&gt; &lt;br&gt; Finally, I've sampled its &lt;a href="http://www.shoutcast.com/"&gt;SHOUTcast&lt;/a&gt; internet radio integration, which seems like it could be a great way to get someone else to mix my daily soundtrack for me, except that I haven't yet put in the effort to find the stations I want to listen to from the overwhelmingly voluminous selection of them.&lt;br&gt; &lt;br&gt; Overall, I'm pretty happy with Songbird.&amp;nbsp; Support for burning CDs and better integration with the Amazon MP3 Store are the only major features I'm missing.&amp;nbsp; The rest is just &lt;a  href="http://bugzilla.songbirdnest.com/show_bug.cgi?id=6723"&gt;nits&lt;/a&gt;.&lt;br&gt; &lt;br&gt; &lt;i&gt;(Note: recent versions of Songbird supposedly play DRM-encumbered iTunes Store tracks just fine, although I'm glad to be DRM-free anyway and plan to remain so from now on by not purchasing any more encumbered music.)&lt;/i&gt;&lt;br&gt; &lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-7837360772061935519?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/7837360772061935519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=7837360772061935519' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7837360772061935519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7837360772061935519'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/10/stuck-on-songbird.html' title='Stuck on Songbird'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-7617065960841704560</id><published>2008-09-26T14:48:00.000-07:00</published><updated>2008-09-26T14:57:22.109-07:00</updated><title type='text'>sharing one Mozilla source tree with Linux/WinXP VMs on Mac host OS</title><content type='html'>Here's how I shared one Mozilla source tree on my Mac OS X host OS (one Core 2 Duo, 4GB physical RAM) with two VMware Fusion VMs, one running Ubuntu Linux 8.04 (two CPUs, 1GB RAM), the other running Windows XP (one CPU, 512MB RAM):&lt;br /&gt;&lt;br /&gt;I checked out the source tree to &lt;cite&gt;~/Mozilla/source&lt;/cite&gt; on my Mac's filesystem.&lt;br /&gt;&lt;br /&gt;I configured each VM with one shared folder via Fusion's &lt;cite&gt;Virtual Machine &gt; Shared Folders &gt; Shared Folder Settings...&lt;/cite&gt; configuration dialog.  In both cases, I shared my Mac user account's home folder (&lt;cite&gt;/Users/myk&lt;/cite&gt;).  Fusion 2 named both shares &lt;cite&gt;myk&lt;/cite&gt; (Fusion 1 had named the Windows share &lt;cite&gt;myk On My Mac&lt;/cite&gt;).&lt;br /&gt;&lt;br /&gt;I made these shares read/write so I could manipulate the tree from the VMs (particularly from the Linux one, where I do most of my development) and also because the Mozilla build process tries to modify the source tree, even when you're using an objdir (f.e. &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=384978"&gt;bug 384978&lt;/a&gt;), and the build process runs smoother if you let it.&lt;br /&gt;&lt;br /&gt;On Linux, the shared folder showed up at /&lt;cite&gt;mnt/hgfs/myk&lt;/cite&gt;.  Because of a limitation in Fusion (described in the &lt;a href="http://www.vmware.com/support/fusion2/doc/releasenotes_fusion.html"&gt;release notes&lt;/a&gt; as "Shared Folders permissions might be too restrictive in Linux and Mac OS X Server guests"), I had to configure the &lt;cite&gt;/etc/fstab&lt;/cite&gt; entry for the shared folder to mount with my Linux user account's uid/gid:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;# Beginning of the block added by the VMware software&lt;br /&gt;.host:/   /mnt/hgfs   vmhgfs   defaults,ttl=5&lt;span style="font-weight: bold;"&gt;,uid=myk,gid=myk&lt;/span&gt;   0 0&lt;br /&gt;# End of the block added by the VMware software&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note: this modification gets reset and has to be redone every time I reinstall VMWare Tools (i.e. after each kernel upgrade).&lt;br /&gt;&lt;br /&gt;On Windows, the shared folder showed up at &lt;cite&gt;Start &gt; My Network Places &gt; Shared Folders on .host&lt;/cite&gt;.  Fusion 2 automatically created a network drive for the shared folder, mapping it to the uppercase drive letter &lt;cite&gt;Z:&lt;/cite&gt;.  When I was using Fusion 1, I manually created the network drive via &lt;cite&gt;Tools &gt; Map Network Drive&lt;/cite&gt; in Windows Explorer.&lt;br /&gt;&lt;br /&gt;In older build environments, I then had to create &lt;cite&gt;/etc/fstab&lt;/cite&gt; (following the instructions in &lt;cite&gt;/etc/fstab.sample&lt;/cite&gt;) to mount the network drive, but I think simply mapping the drive automagically makes it available at its lowercase Unixy equivalent (f.e. &lt;cite&gt;/z&lt;/cite&gt;) in the latest versions of MozillaBuild (perhaps after a MozillaBuild or Windows restart?).&lt;br /&gt;&lt;br /&gt;I only share my source tree, putting config files in &lt;cite&gt;~/Mozilla/configs&lt;/cite&gt; and builds in &lt;cite&gt;~/Mozilla/builds&lt;/cite&gt; on the Mac and Linux filesystems and in &lt;cite&gt;/home/myk/Mozilla/(configs|builds)&lt;/cite&gt; on the Windows filesystem (as my home directory on Windows is &lt;cite&gt;/c/Documents and Settings/myk&lt;/cite&gt;, and Mozilla has trouble building to a directory with spaces in its path).&lt;br /&gt;&lt;br /&gt;Once configured as described, building on each OS became the simple matter of crafting the build config file, changing to the source directory, and calling &lt;cite&gt;make&lt;/cite&gt;, for example on Linux (with &lt;a href="http://melez.com/mozilla/configs/linux-minefield-opt"&gt;this config file&lt;/a&gt;):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;cd /mnt/hgfs/myk/Mozilla/source&lt;br /&gt;time MOZCONFIG=~/Mozilla/configs/minefield-opt make -f client.mk build&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;On Mac (with &lt;a href="http://melez.com/mozilla/configs/mac-minefield-opt"&gt;this config file&lt;/a&gt;):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;cd ~/Mozilla/source&lt;br /&gt;time MOZCONFIG=~/Mozilla/configs/minefield-opt make -f client.mk build&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And on Windows (with &lt;a href="http://melez.com/mozilla/configs/windows-minefield-opt"&gt;this config file&lt;/a&gt;):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;cd /z/myk/Mozilla/source&lt;br /&gt;time MOZCONFIG=/home/myk/Mozilla/configs/minefield-opt make -f client.mk build&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note: compiling on Linux seems pretty speedy, but compiling on Windows is dog slow, perhaps even slower in Fusion 2 than in 1.  I haven't tried it lately, but it might be faster to share the tree with Windows using SMB.&lt;br /&gt;&lt;br /&gt;Note: it's theoretically possible to compile on two or all three OSes simultaneously, but it does slow down the machine, and I got build failures the few times I tried it (I don't remember exactly what now, I think something about the Windows build process being unable to access certain files).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-7617065960841704560?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/7617065960841704560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=7617065960841704560' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7617065960841704560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7617065960841704560'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/09/heres-how-i-shared-one-mozilla-source.html' title='sharing one Mozilla source tree with Linux/WinXP VMs on Mac host OS'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-3848535145624026081</id><published>2008-09-19T06:40:00.000-07:00</published><updated>2008-09-19T15:16:35.788-07:00</updated><title type='text'>Rocking the Linux User Experience (Boat)</title><content type='html'>Mark Shuttleworth has recently &lt;a href="http://www.markshuttleworth.com/archives/162"&gt;announced plans to rock the Linux user experience&lt;/a&gt; (yes, I know I'm a week late; I've been on vacation and am just now catching up).&lt;br /&gt;&lt;br /&gt;I've been an avid Linux user for about a dozen years, first on Red Hat, then Fedora, and lately Ubuntu, and I've had my share of frustrations with the OS, so I'm thrilled to hear about this initiative.&lt;br /&gt;&lt;br /&gt;And I have a piece of advice: don't be afraid to cross (and dissolve) boundaries between layers of functionality and give developers the authority to fix problems no matter where they reside, even at the risk of ruffling feathers (as did ZFS with its "damn the software stack, full speed ahead to the desired outcome" approach).&lt;br /&gt;&lt;br /&gt;I say this because my small window into the GNOME development process (bugs &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=482354"&gt;482354&lt;/a&gt; and &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=162726"&gt;162726&lt;/a&gt;) suggests its developers spend way too much time trying to figure out which of the many layers of functionality in the Linux desktop is responsible for an issue (and thus who is responsible for fixing it).&lt;br /&gt;&lt;br /&gt;Mozilla isn't perfect in this regard either, but when it works well, it's because developers take responsibility for making the user experience great no matter what part of the code needs to be touched (like the recent progress being made in &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=248970"&gt;bug 248970&lt;/a&gt; by &lt;a href="http://ehsanakhgari.org/"&gt;Ehsan Akhgari&lt;/a&gt; in collaboration with others on a private browsing mode for Firefox).&lt;br /&gt;&lt;br /&gt;If you want to rock the Linux user experience, be willing to rock its boat as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-3848535145624026081?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/3848535145624026081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=3848535145624026081' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3848535145624026081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3848535145624026081'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/09/mark-shuttleworth-has-recently.html' title='Rocking the Linux User Experience (Boat)'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-2644683378346462728</id><published>2008-09-02T08:26:00.000-07:00</published><updated>2008-09-02T09:02:29.718-07:00</updated><title type='text'>Alt/Cmd+Left/RightArrow brainsprinkling</title><content type='html'>Recently &lt;a href="http://www.toolness.com/wp/?p=127"&gt;some&lt;/a&gt; &lt;a href="http://jonoscript.wordpress.com/2008/08/21/tabbing-through-the-tabs/"&gt;folks&lt;/a&gt; &lt;a href="http://www.azarask.in/blog/post/firefox-31-control-tab-woes/"&gt;have&lt;/a&gt; &lt;a href="http://jboriss.wordpress.com/2008/08/28/new-controltab-discussion-thread/"&gt;been&lt;/a&gt; blogging about Ctrl+Tab.  It's great to see that shortcut getting love, and it reminds me that there's another one for navigating between pages that could use similar attention: Alt/Cmd+Left/RightArrow for going backwards and forwards through history within a tab.&lt;br /&gt;&lt;br /&gt;Like the old Ctrl+Tab implementation, Alt/Cmd+Left/RightArrow only lets you move one page at a time, and you can't see where you're going until you get there.  And sometimes you land on a page that is the product of a POST request, which you don't know until you are forced by a modal dialog to decide whether or not to resubmit data that you don't get to see when making the decision.&lt;br /&gt;&lt;br /&gt;We could enable multi-page moves by making the shortcuts work similarly to Alt+Tab in operating systems: holding down the Alt key and pressing a horizontal arrow key would bring up a list of icons representing the pages in the history (perhaps formatted like Alt+Tab in operating systems or via the 3D effect &lt;a href="http://jonoscript.wordpress.com/2008/08/21/tabbing-through-the-tabs/"&gt;Jono suggested for Ctrl+Tab&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Each icon would be a screenshot of the page as it was when you left it, and the adjacent page to the current page would be selected by default.  But as long as you held down the Alt key, the list of pages would stay on the screen, and pressing the arrow keys would let you travel back and forth through it.  Once you let go of the Alt key, Firefox would switch to the page that was selected at the time.&lt;br /&gt;&lt;br /&gt;This behavior might also reduce frustrating clicks on posted pages, although the better solution, as &lt;a href="http://blog.sandmill.org/"&gt;Dan Mills&lt;/a&gt; recently pointed out in a conversation, would be to stop forcing users to reload pages just to go back (or forward) to them, even if they were the result of a POST.&lt;br /&gt;&lt;br /&gt;But if we can't do that for some important technical reason, we could at least display a non-interactive and suitably-dressed snapshot of the page and drop down a non-modal notification bar at the top of the tab explaining why we can't provide the page itself and allowing the user to see what they are potentially going to reload.&lt;br /&gt;&lt;br /&gt;And the list of pages could itself indicate which of its pages are POSTed, thus providing the user two levels of useful indication of what will happen when they try to go back to that page.&lt;br /&gt;&lt;br /&gt;Of course, there's more to history than the past and future of each individual tab, and pan-tabscape history navigation affordances would also be useful to think through.  But there's still a place for a tab-specific interface, given that many such trails represent a specific path through the web with relevance and meaning to the user, so it'd be good to improve the way Alt/Cmd+Left/RightArrow works (or invent even better tab history traversal).&lt;br /&gt;&lt;br /&gt;Thoughts?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-2644683378346462728?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/2644683378346462728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=2644683378346462728' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2644683378346462728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2644683378346462728'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/09/altcmdleftrightarrow-brainsprinkling.html' title='Alt/Cmd+Left/RightArrow brainsprinkling'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-6338445439603875786</id><published>2008-09-02T00:12:00.001-07:00</published><updated>2008-09-02T03:49:11.835-07:00</updated><title type='text'></title><content type='html'>A couple weeks ago I &lt;a href="http://www.melez.com/mykzilla/2008/08/snowl-feedback-and-futures.html"&gt;blogged about my priorities&lt;/a&gt; for the next version of Snowl.  I've just uploaded a preview release of the next version to addons.mozilla.org with an initial implementation of a view optimized for short messages and recent updates:&lt;br /&gt;&lt;p align="center"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/stream-screenshot-717708.png"&gt;&lt;img style="cursor: pointer;" src="http://www.melez.com/mykzilla/uploaded_images/stream-screenshot-717703.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;The view is implemented as a sidebar that shows short messages (such as from Twitter) in their entirety and displays the subjects of long messages with links to their content.  Messages are sorted in the order received, with the most recent ones on top, to make it easy to see the newest stuff at a glance.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Plans&lt;/h3&gt;&lt;br /&gt;There's still plenty of functionality yet to be implemented in the sidebar, including:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;grouping messages by time period (this morning, yesterday, last week, etc.);&lt;/li&gt;&lt;li&gt;making it possible to see some of the content of long messages;&lt;/li&gt;&lt;li&gt;an easier way to open and close the sidebar (f.e. a button that toggles it on and off).&lt;/li&gt;&lt;/ul&gt;I also want to improve elements of the visual design. In particular, I'd like to add a subtle but noticeable visual cue that messages have arrived (f.e. making messages slide into place from the top of the sidebar).&lt;br /&gt;&lt;br /&gt;And I'm still working on implementing message sending and conversations as first-class objects for version 0.2. This preview release is just a taste of the first of several upcoming features.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Other Changes&lt;/h3&gt;&lt;br /&gt;This release also fixes a number of bugs and makes some improvements to the architecture (there seems to be a neverending supply of such infrastructure work, but it's all necessary to prototype features on top of).  And it improves access to Snowl's features via some conventional extension integration points: an item in the Tools menu, an icon on the statusbar.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Get Snowl for Firefox&lt;/h3&gt;&lt;br /&gt;Get the initial prototype: &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/8397"&gt;Snowl for Firefox&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;strong id="d-.225"&gt;Warning: the initial prototype is a primitive implementation with many bugs, and subsequent versions will include changes that break functionality and delete all your messages, making you start over from scratch.&lt;/strong&gt;&lt;/p&gt; &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Get Involved&lt;/h3&gt;&lt;br /&gt;Let us know what you think by &lt;a id="ine2" title="posting in the forum" href="http://snowl.mozdev.org/drupal/forum/1"&gt;posting in the forum&lt;/a&gt;, &lt;a id="rz-a" title="reporting bugs" href="https://www.mozdev.org/bugs/buglist.cgi?product=snowl"&gt;reporting bugs&lt;/a&gt;, or conversing with us in the #labs channel on irc.mozilla.org.  Or &lt;a id="t978" title="check out the source" href="http://hg.mozdev.org/snowl/"&gt;check out the source&lt;/a&gt; and &lt;a id="g6o:" title="submit your bug fixes and enhancements" href="https://www.mozdev.org/bugs/enter_bug.cgi?product=snowl"&gt;submit your bug fixes and enhancements&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-6338445439603875786?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/6338445439603875786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=6338445439603875786' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6338445439603875786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6338445439603875786'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/09/couple-weeks-ago-i-blogged-about-my.html' title=''/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-1746094472713976569</id><published>2008-08-24T20:01:00.000-07:00</published><updated>2008-08-25T13:32:47.293-07:00</updated><title type='text'>Content Preferences, Now With Toolbar Widgets</title><content type='html'>Last weekend I updated my &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/4066"&gt;Content Preferences&lt;/a&gt; extension to work with Firefox 3.&lt;br /&gt;&lt;br /&gt;Along the way, I finished up an additional feature for it: pref widgets you can add to your browser toolbars.  The widgets let you set page zoom, page style, and character encoding directly from visible browser chrome, and you use them by customizing your toolbars to include them via the &lt;span style="font-style: italic;"&gt;View &gt; Toolbars &gt; Customize&lt;/span&gt; command.&lt;br /&gt;&lt;br /&gt;Here's the page style widget in the menubar on Linux:&lt;br /&gt;&lt;p align="center"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/page-style-linux-720848.png"&gt;&lt;img style="cursor: pointer;" src="http://www.melez.com/mykzilla/uploaded_images/page-style-linux-720781.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Here are all three widgets on their own toolbar on Mac:&lt;br /&gt;&lt;p align="center"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/widgets-mac-720876.png"&gt;&lt;img style="cursor: pointer;" src="http://www.melez.com/mykzilla/uploaded_images/widgets-mac-720873.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;As with page zoom in Firefox 3, these widgets are site-specific and persist across browsing sessions.  And as with earlier versions of the extension, they're also available in a sidebar that follows you as you browse around the web and also lets you set global defaults:&lt;br /&gt;&lt;p align="center"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/cpref-sidebar-714044.png"&gt;&lt;img style="cursor: pointer;" src="http://www.melez.com/mykzilla/uploaded_images/cpref-sidebar-714042.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;UI like this has three possible futures:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;If it's useful to a broad range of users a significant percentage of the time, it belongs in the default chrome.&lt;br /&gt;&lt;br /&gt;The page zoom widget is a candidate for this placement.  Among other indications, a number of popular sites, like &lt;a href="http://www.cbsnews.com/"&gt;CBS News&lt;/a&gt;, provide a version of it to their users within the default "chrome" of their content pages:&lt;br /&gt;&lt;p align="center"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/cbs-news-zoom-779381.png"&gt;&lt;img style="cursor: pointer;" src="http://www.melez.com/mykzilla/uploaded_images/cbs-news-zoom-779376.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Otherwise, if it's useful enough to enough users (a fuzzy definition, to be sure), it belongs in optional chrome, either via an extension or in well-concealed parts of the core product (hidden preferences, the browser toolbar palette, etc.).&lt;br /&gt;&lt;br /&gt;The character encoding widget perhaps satisfies these conditions, as it might be very useful in certain parts of the world where automatic charset specification and detection is not yet up to snuff.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Otherwise, it doesn't belong in the chrome at all.&lt;br /&gt;&lt;br /&gt;I wonder if that's the case for the page style widget, since browser UI for website skinning has never caught on.&lt;br /&gt;&lt;br /&gt;But there's a chicken and egg problem here, since sites don't have impetus to provide multiple skins without useful browser UI for applying them, while browsers don't feel pressure to implement good UI when so few sites take advantage of it.  Maybe a persistent site-specific page style widget is just the ticket to change that.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;I'm not happy with the widgets, though.  The page style and charset widgets simply mirror the functional but archaic menu-based UI in the View menu, and while the page zoom widget tries something new, and it's easy enough to understand, it's difficult and frustrating to use, since it requires precise manual dexterity to set a specific zoom level.&lt;br /&gt;&lt;br /&gt;It could be improved in a variety of ways--indicators of which direction does what, markers and snap anchors at specific zoom levels, etc.  But maybe there's something even better.  Two big buttons for zooming in and out?&lt;br /&gt;&lt;p align="center"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/two-button-zoom-798150.png"&gt;&lt;img style="cursor: pointer;" src="http://www.melez.com/mykzilla/uploaded_images/two-button-zoom-798149.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;A set of sticky buttons that each represent a zoom level?&lt;br /&gt;&lt;p align="center"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/multi-button-zoom-718754.png"&gt;&lt;img style="cursor: pointer;" src="http://www.melez.com/mykzilla/uploaded_images/multi-button-zoom-718752.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;As for page style, perhaps it could display a set of screenshots showing the appearance of the page with each alternative style applied.  And the charset widget could show you what the text would look like if you applied each encoding.&lt;br /&gt;&lt;br /&gt;Thoughts?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-1746094472713976569?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/1746094472713976569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=1746094472713976569' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/1746094472713976569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/1746094472713976569'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/08/content-preferences-now-with-toolbar.html' title='Content Preferences, Now With Toolbar Widgets'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-92618960376176039</id><published>2008-08-13T15:16:00.001-07:00</published><updated>2008-08-13T15:16:54.289-07:00</updated><title type='text'>Snowl Feedback and Futures</title><content type='html'>Last month I &lt;a  href="http://www.melez.com/mykzilla/2008/07/snowl-experiment-with-messaging-in.html"&gt;blogged&lt;/a&gt; about &lt;a href="http://labs.mozilla.com/projects/snowl/"&gt;Snowl&lt;/a&gt;, an experiment with messaging in the browser.&amp;nbsp; Two weeks ago I presented it at the Firefox+ Summit.&amp;nbsp; And last Wednesday I released an &lt;a  href="https://addons.mozilla.org/en-US/firefox/addon/8397"&gt;initial prototype&lt;/a&gt;.&lt;br&gt; &lt;br&gt; I've been getting tons of feedback since then from a variety of sources, including discussion at the summit, &lt;a  href="http://labs.mozilla.com/2008/08/introducing-snowl/#comments"&gt;comments on the announcement&lt;/a&gt;, &lt;a  href="https://addons.mozilla.org/en-US/firefox/addon/8397#reviews"&gt;AMO reviews&lt;/a&gt;, &lt;a href="http://snowl.mozdev.org/drupal/forum/1"&gt;discussion in the forum&lt;/a&gt;, news and commentary (&lt;a  href="http://www.techcrunch.com/2008/08/06/snowl-unified-messaging-in-your-firefox-browser/"&gt;TechCrunch&lt;/a&gt;, &lt;a  href="http://www.readwriteweb.com/archives/first_look_at_mozillas_snowl.php"&gt;ReadWriteWeb&lt;/a&gt;, &lt;a href="http://news.zdnet.co.uk/software/0,1000000121,39458184,00.htm"&gt;ZDNet&lt;/a&gt;, &lt;a  href="http://www.pcworld.com/article/149623/2008/08/.html?tk=rss_news"&gt;Computerworld&lt;/a&gt;, &lt;a  href="http://arstechnica.com/news.ars/post/20080807-mozillas-snowl-hunts-twitter-rss-and-soon-e-mail.html"&gt;Ars Technica&lt;/a&gt;, &lt;a  href="http://tech.slashdot.org/article.pl?sid=08/08/08/0430219"&gt;Slashdot&lt;/a&gt;, &lt;a  href="http://digg.com/tech_news/Mozilla_s_Snowl_hunts_Twitter_RSS_and_soon_e_mail"&gt;Digg&lt;/a&gt;, etc.), &lt;a  href="http://blogsearch.google.com/blogsearch?hl=en&amp;amp;q=snowl&amp;amp;btnG=Search+Blogs"&gt;blog posts&lt;/a&gt;, and &lt;a  href="http://bugzilla.mozdev.org/buglist.cgi?product=snowl"&gt;bug reports&lt;/a&gt;.&lt;br&gt; &lt;br&gt; Some opinions I've seen expressed more than once:&lt;br&gt; &lt;ul&gt;   &lt;li&gt;the river view feels like it fits into Firefox&lt;br&gt;   &lt;/li&gt;   &lt;li&gt;the list view doesn't mix well with general web browsing&lt;br&gt;   &lt;/li&gt;   &lt;li&gt;"I'd rather use a standalone application."&lt;/li&gt;   &lt;li&gt;"I'd like even more integration with Firefox."&lt;/li&gt;   &lt;li&gt;many of the prototype's features should be part of Thunderbird&lt;br&gt;   &lt;/li&gt;   &lt;li&gt;it lacks a number of useful features (f.e. sharing)&lt;/li&gt;   &lt;li&gt;it contains a number of bugs&lt;/li&gt;   &lt;li&gt;it has lots of potential&lt;br&gt;   &lt;/li&gt; &lt;/ul&gt; Overall, there's a lot of interest in Snowl, in browser/messaging integration, and in messaging innovation generally.&amp;nbsp; There's plenty more to explore here, and I'd like to see Snowl experiment with the following features in particular:&lt;br&gt; &lt;ul&gt;   &lt;li&gt;simple web search engine-like attribute-based search&lt;br&gt;   &lt;/li&gt;   &lt;li&gt;a message view optimized for short, simple messages (Twitter, IM, SMS)&lt;/li&gt;   &lt;li&gt;an experimental message view that uses color, size, graphics, word clouds, animation, or other techniques to help users make sense of their flood of messages&lt;/li&gt;   &lt;li&gt;support for sending messages, including responding to tweets and posting comments to blogs&lt;/li&gt;   &lt;li&gt;easy access to feeds from frecent (frequent+recent) sites, sites you are currently browsing, live bookmarks, and feed items you've commented on&lt;br&gt;   &lt;/li&gt;   &lt;li&gt;conversations (i.e. threads) as first-class objects&lt;/li&gt;   &lt;li&gt;better support for people as first-class objects&lt;br&gt;   &lt;/li&gt;   &lt;li&gt;email, IM, and other message sources&lt;/li&gt;   &lt;li&gt;user-initiated and automated message grouping (Home/Work, Important/Unimportant, Today/Yesterday/Last Week, etc.)&lt;br&gt;   &lt;/li&gt; &lt;/ul&gt; Of those, I'll be focusing on a short message view, message sending, and conversations as first-class objects for the next iteration.&lt;br&gt; &lt;br&gt; If you have a burning desire to see something else on this list (or something else entirely) happen sooner than later, your contributions are welcome!&amp;nbsp; Discuss ideas and post mockups to the &lt;a  href="http://snowl.mozdev.org/drupal/forum/1"&gt;discussion forum&lt;/a&gt;, pick up the source code from the &lt;a href="http://hg.mozdev.org/snowl/"&gt;code repository&lt;/a&gt;, and submit patches in &lt;a  href="https://www.mozdev.org/bugs/buglist.cgi?product=snowl"&gt;bug reports&lt;/a&gt;.&lt;br&gt; &lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-92618960376176039?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/92618960376176039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=92618960376176039' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/92618960376176039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/92618960376176039'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/08/snowl-feedback-and-futures.html' title='Snowl Feedback and Futures'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-5637361647141160244</id><published>2008-07-24T16:59:00.001-07:00</published><updated>2008-07-24T16:59:46.759-07:00</updated><title type='text'>Thunderbird 2.0.0.16 with tabs</title><content type='html'>Last week I got a new MacBook Pro to replace my (two year) old one.&amp;nbsp; Among the problems with the old machine was a perennial lack of space on the hard drive.&amp;nbsp; I kept having to compress, archive, and throw away files to keep myself (barely) in the black.&lt;br&gt; &lt;br&gt; The new machine's drive is twice as big, and that means plenty of space to build updated packages of Thunderbird 2 with &lt;a  href="https://bugzilla.mozilla.org/show_bug.cgi?id=tabmail"&gt;my tabs patch&lt;/a&gt; based on the &lt;a  href="http://developer.mozilla.org/devnews/index.php/2008/07/23/thunderbird-20016-security-and-stability-release-now-available/"&gt;just-released Thunderbird 2.0.0.16&lt;/a&gt;.&amp;nbsp; The packages are available for &lt;a  href="http://melez.com/tabmail/thunderbird-2.0.0.16.en-US.mac.dmg"&gt;Mac OS X&lt;/a&gt;, &lt;a  href="http://melez.com/tabmail/thunderbird-2.0.0.16.en-US.linux-i686.tar.gz"&gt;Linux&lt;/a&gt;, and &lt;a  href="http://melez.com/tabmail/thunderbird-2.0.0.16.en-US.win32.installer.exe"&gt;Windows&lt;/a&gt;.&lt;br&gt; &lt;br&gt; If you are the adventurous type, however, check out the Thunderbird team's &lt;a moz-do-not-send="true"  href="http://www.mozillamessaging.com/en-US/thunderbird/early_releases/"  target="_blank"&gt;3.0 alpha releases&lt;/a&gt;, which have tabs built-in by default.&amp;nbsp; And note the &lt;a  href="http://groups.google.com/group/mozilla.dev.apps.thunderbird/browse_thread/thread/d83667904aaa43bf#"&gt;discussion on an experimental message view&lt;/a&gt; that aims to come up with an even better approach to opening multiple messages.&lt;br&gt; &lt;br&gt; Incidentally, I'm standing on the shoulders of giants here.&amp;nbsp; The only reason I can build these at all is because Mozilla's build/release team puts hard work into maintaining a build system and toolchain that makes it relatively easy to compile this several-year-old codebase even on new hardware running recent versions of all three operating systems.&amp;nbsp; Kudos and many thanks to them.&lt;br&gt; &lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-5637361647141160244?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/5637361647141160244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=5637361647141160244' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/5637361647141160244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/5637361647141160244'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/07/thunderbird-20016-with-tabs.html' title='Thunderbird 2.0.0.16 with tabs'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>2</thr:total></entry><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; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-7113448444877220360?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/7113448444877220360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=7113448444877220360' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7113448444877220360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7113448444877220360'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/07/snowl-experiment-with-messaging-in.html' title='Snowl: an experiment with messaging in the browser'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>2</thr:total></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; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-42944240929924575?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/42944240929924575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=42944240929924575' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/42944240929924575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/42944240929924575'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/07/why-i-host-projects-on-mozdev.html' title='Why I Host Projects on Mozdev'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-6690854102747910871</id><published>2008-06-03T18:19:00.000-07:00</published><updated>2009-03-18T19:20:17.209-07:00</updated><title type='text'>Merging with Mercurial and Meld</title><content type='html'>&lt;span style="font-weight: bold;"&gt;[Update: see &lt;a href="http://www.melez.com/mykzilla/2009/03/merging-with-mercurial-10-and-meld.html"&gt;Merging with Mercurial 1.0 and Meld&lt;/a&gt; for more up-to-date info on the experience with Mercurial 1.0, which comes with Ubuntu 8.10.]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;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;" src="http://www.melez.com/mykzilla/uploaded_images/default-hgmerge-785862.png" alt="" border="0" /&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;&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;" src="http://www.melez.com/mykzilla/uploaded_images/hacked-hgmerge-746179.png" alt="" border="0" /&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.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-6690854102747910871?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/6690854102747910871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=6690854102747910871' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6690854102747910871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6690854102747910871'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/06/merging-with-mercurial-and-meld.html' title='Merging with Mercurial and Meld'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>4</thr:total></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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-3387186777476893745?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/3387186777476893745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=3387186777476893745' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3387186777476893745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3387186777476893745'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/06/js-18-syntax-checking-in-komodo.html' title='JS 1.8 syntax checking in Komodo'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-3663016023144225771</id><published>2008-05-11T23:41:00.000-07:00</published><updated>2008-09-18T14:33:43.538-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://hg.mozdev.org/jsmodules/file/tip/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.)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Update: the latest version of the module is available at &lt;a href="http://hg.mozdev.org/jsmodules/file/tip/Preferences.js"&gt;http://hg.mozdev.org/jsmodules/file/tip/Preferences.js&lt;/a&gt;.  That link will stay up-to-date with changes to the module.&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-3663016023144225771?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/3663016023144225771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=3663016023144225771' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3663016023144225771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3663016023144225771'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/05/xpcomless-preferences-api.html' title='XPCOMless Preferences API'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>5</thr:total></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; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-5823627140348869034?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/5823627140348869034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=5823627140348869034' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/5823627140348869034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/5823627140348869034'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/04/trademark-to-distinguish-network.html' title='a trademark to distinguish network neutral providers'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>2</thr:total></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&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-8107945875039050823?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blog.sandmill.org/2008/04/me-too.html' title='me three'/><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/8107945875039050823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=8107945875039050823' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8107945875039050823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8107945875039050823'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/04/me-three.html' title='me three'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>6</thr:total></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; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-7626050948949451396?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/7626050948949451396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=7626050948949451396' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7626050948949451396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7626050948949451396'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/04/proposed-changes-to-mozdev-roadmap.html' title='proposed changes to Mozdev roadmap'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>2</thr:total></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; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-8489598016536375060?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/8489598016536375060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=8489598016536375060' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8489598016536375060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8489598016536375060'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/04/dynamic-personas-how-they-work.html' title='Dynamic Personas - How They Work'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>4</thr:total></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).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-43014350779762507?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/43014350779762507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=43014350779762507' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/43014350779762507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/43014350779762507'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/03/trio-of-extensions.html' title='a trio of extensions'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>8</thr:total></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;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-4435388013599793007?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/4435388013599793007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=4435388013599793007' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4435388013599793007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4435388013599793007'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/02/thoughts-on-sheriffing.html' title='thoughts on sheriffing'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>4</thr:total></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;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-8389913852455364741?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/8389913852455364741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=8389913852455364741' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8389913852455364741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8389913852455364741'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2008/02/better-mdc-searches-from-search-box.html' title='better MDC searches from the search box'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>3</thr:total></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;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-4386865931692176264?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/4386865931692176264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=4386865931692176264' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4386865931692176264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4386865931692176264'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/12/keeping-up-with-joneses.html' title='keeping up with the Joneses'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>2</thr:total></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; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-4136557017021217453?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/4136557017021217453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=4136557017021217453' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4136557017021217453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4136557017021217453'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/11/video-of-joseph-smarr-on-high.html' title='Video of Joseph Smarr on High Performance JavaScript'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>0</thr:total></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; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-624330705048082885?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/624330705048082885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=624330705048082885' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/624330705048082885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/624330705048082885'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/11/alt-tab-like-history-navigation.html' title='Alt-Tab-like history navigation'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>5</thr:total></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; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-2815485524124522803?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/2815485524124522803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=2815485524124522803' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2815485524124522803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2815485524124522803'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/11/tabs-for-thunderbird-2009.html' title='tabs for Thunderbird 2.0.0.9'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>15</thr:total></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; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-6827570048362574034?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/6827570048362574034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=6827570048362574034' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6827570048362574034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6827570048362574034'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/10/mac-os-105-first-glance.html' title='Mac OS 10.5 First Glance'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>6</thr:total></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; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-2750215489078869376?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/2750215489078869376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=2750215489078869376' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2750215489078869376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2750215489078869376'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/10/automated-js-code-rewriting.html' title='automated JS code rewriting'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>0</thr:total></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; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-3034824338624500683?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/3034824338624500683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=3034824338624500683' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3034824338624500683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3034824338624500683'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/10/bo-yangs-advanced-microsummary-builder.html' title='Bo Yang&apos;s Advanced Microsummary Builder'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>1</thr:total></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; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-3874802988184981501?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/3874802988184981501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=3874802988184981501' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3874802988184981501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3874802988184981501'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/09/tabs-for-thunderbird-20.html' title='tabs for Thunderbird 2.0'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>15</thr:total></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; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-2626875736542813806?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/2626875736542813806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=2626875736542813806' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2626875736542813806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/2626875736542813806'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/08/dave-winers-take-on-feed-reading-in.html' title='Dave Winer&apos;s take on feed reading in Firefox'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>6</thr:total></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; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-34906723718072055?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/34906723718072055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=34906723718072055' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/34906723718072055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/34906723718072055'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/07/its-not-just-about-thunderbird.html' title='it&apos;s not just about Thunderbird'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>8</thr:total></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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-3805507211736859511?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/3805507211736859511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=3805507211736859511' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3805507211736859511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/3805507211736859511'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/06/multi-os-builds-from-one-source-tree.html' title='multi-OS builds from one source tree'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>0</thr:total></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; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-4650795207731346493?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/4650795207731346493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=4650795207731346493' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4650795207731346493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4650795207731346493'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/05/importance-of-good-translation.html' title='The Importance of Good Translation'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>1</thr:total></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;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-4503462342935429094?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/4503462342935429094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=4503462342935429094' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4503462342935429094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/4503462342935429094'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/04/toolsmith-opportunity-at-mozdev.html' title='toolsmith opportunity at Mozdev'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-5582063411224531372</id><published>2007-04-30T11:01:00.001-07:00</published><updated>2007-04-30T11:01:34.916-07:00</updated><title type='text'>MTV returns to HTML</title><content type='html'>According to &lt;a href="http://www.bernzilla.com/item.php?id=838"&gt;Bernzilla&lt;/a&gt;, according to &lt;a  href="http://www.simplebits.com/notebook/2007/04/25/mtv.html"&gt;SimpleBits&lt;/a&gt;, according to &lt;a  href="http://www.mtvlabs.tv/2007/04/new-html-mtvcom.html"&gt;MTV Labs&lt;/a&gt;, &lt;a href="http://www.mtv.com/"&gt;mtv.com&lt;/a&gt; has switched back to an HTML-based site from the Flash-based site they implemented nine months ago.&lt;br&gt; &lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-5582063411224531372?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/5582063411224531372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=5582063411224531372' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/5582063411224531372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/5582063411224531372'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/04/mtv-returns-to-html.html' title='MTV returns to HTML'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-8211530262753510173</id><published>2007-04-24T03:12:00.001-07:00</published><updated>2007-04-24T03:12:53.345-07:00</updated><title type='text'>tab-specific mute</title><content type='html'>I've heard from a number of folks that it'd be very useful for Firefox to let you mute a particular tab in the browser, since more and more sites are incorporating music or other audio content, and users are leaving more tabs open in the background, and they don't necessarily want to hear those tabs while listening to tunes or working.&lt;br&gt; &lt;br&gt; So I looked around for a way to do this (ideally something I could integrate with site-specific preferences, so you could specify which sites are allowed to quack), and the closest I could find is &lt;a  href="http://www.indev.no/?p=projects#flashmute"&gt;FlashMute&lt;/a&gt;, a small Windows app written by &lt;a href="http://www.indev.no/?p=about"&gt;Einar Otto Stangvik&lt;/a&gt; that mutes all Flash (and other browser-based sound).&lt;br&gt; &lt;br&gt; It's like a global mute for browsers, and although it isn't open source, its author &lt;a href="http://forums.indev.no/viewtopic.php?t=154"&gt;says it will be&lt;/a&gt; once he gets around to pushing it to Google Code.&lt;br&gt; &lt;br&gt; But it doesn't let you mute individual tabs, much less specific sites, so it's not quite the feature folks have been clamoring for.&amp;nbsp; So I asked around a bit, and smart folks seem to think it would be very hard to well nigh impossible to implement this on Windows, except possibly on Vista with major changes to our plugin architecture.&lt;br&gt; &lt;br&gt; Anyone know different or know what the situation is on other platforms?&lt;br&gt; &lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-8211530262753510173?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/8211530262753510173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=8211530262753510173' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8211530262753510173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/8211530262753510173'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/04/tab-specific-mute.html' title='tab-specific mute'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-1715905147584285671</id><published>2007-04-24T01:25:00.000-07:00</published><updated>2007-04-24T02:49:44.429-07:00</updated><title type='text'>Site-Specific Preferences, Take 0.3</title><content type='html'>The Content Preferences extension version 0.3 is now available &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/4066&amp;status=1"&gt;from the AMO sandbox&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/cprefpreview-799937.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; cursor: pointer;" src="http://www.melez.com/mykzilla/uploaded_images/cprefpreview-799933.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;I added these user-facing enhancements:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;a site-specific &lt;span style="font-weight: bold;"&gt;Page Style&lt;/span&gt; setting for sites like &lt;a href="http://dbaron.org/"&gt;dbaron.org&lt;/a&gt; that provide alternate stylesheets;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;a site-specific &lt;span style="font-weight: bold;"&gt;Character Encoding&lt;/span&gt; setting for when Firefox incorrectly guesses the encoding on a site;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;a &lt;span style="font-weight: bold;"&gt;Reset All&lt;/span&gt; button at the bottom of the sidebar that lets you reset all settings to their default values for the current site;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;a &lt;span style="font-weight: bold;"&gt;Global&lt;/span&gt; tab that lets you set preferences that apply to all sites;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;a yellow background color behind modified settings that helps you identify the settings you've twiddled;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;a Reset button (&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/arrow-undo-786898.png"&gt;&lt;img style="cursor: pointer;" src="http://www.melez.com/mykzilla/uploaded_images/arrow-undo-786895.png" alt="" border="0" /&gt;&lt;/a&gt;) next to modified settings for setting them back to their default values (thanks to &lt;a href="http://www.famfamfam.com/"&gt;Mark James&lt;/a&gt; for the icon, which comes from his &lt;a href="http://www.famfamfam.com/lab/icons/silk/"&gt;Silk icon set&lt;/a&gt;).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Props to &lt;a href="http://blog.mozilla.com/faaborg"&gt;Alex Faaborg&lt;/a&gt; for his feedback on and assistance with several of these enhancements and to &lt;a href="http://weblogs.mozillazine.org/dmose/"&gt;Dan Mosedale&lt;/a&gt; for pointing out the spiffy way &lt;a href="http://www.omnigroup.com/applications/omniweb/"&gt;OmniWeb&lt;/a&gt; lets you reset modified settings.&lt;br /&gt;&lt;br /&gt;I should note that while I implemented site-specific Page Style (primarily to exercise the back-end code) in a way that could be  integrated into the Firefox core, I think it would make more sense to move the entire Page Style feature out of the core and make it available only as an extension, given how rarely the feature is used.&lt;br /&gt;&lt;br /&gt;But, as &lt;a href="http://steelgryphon.com/blog/"&gt;Mike Connor&lt;/a&gt; pointed out to me recently, UI for selecting an alternate stylesheet is actually mandated by the CSS 2 spec (&lt;a href="http://www.w3.org/TR/CSS21/conform.html#conformance"&gt;section 3.2&lt;/a&gt;, point 5), and if we have to include it, we might as well make it work better.&lt;br /&gt;&lt;br /&gt;On the back-end, the extension sports the following enhancements:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;a declarative syntax (modeled after the one used by the Preferences dialog) for describing widgets in the sidebar, which the sidebar controller uses to auto-update prefs when users twiddle widgets (and vice-versa);&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;nsIObserver-style notifications from the service and the controller;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;DOMContentLoaded notifications from the controller, in addition to the location change notifications, to support settings like Page Style that need to do their thing after the page has loaded;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;nsIVariant pref values stored as blobs in the database, for theoretical round-trip integrity to the database and beyond, err, back;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;auto-derivation of sites from URIs inside all service methods, so instead of calling &lt;span style="font-weight: bold;"&gt;getSiteForURI&lt;/span&gt; to derive the site and then a second method like &lt;span style="font-weight: bold;"&gt;getPref&lt;/span&gt; to do some actual work, you just call the second method, passing it the URI, and let the service do the deriving.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I also fixed a number of miscellaneous bugs (and undoubtedly introduced new ones) and worked around a few bugs in Firefox.  Many thanks to &lt;a href="http://seis.bris.ac.uk/%7Eccjpb/"&gt;John P. Baker&lt;/a&gt; for spotting some of the problems and providing useful feedback on the API.&lt;br /&gt;&lt;br /&gt;Per the &lt;a href="http://wiki.mozilla.org/Firefox3/Firefox_Requirements"&gt;Firefox 3 product plan&lt;/a&gt;, my next step will be to integrate the core service and site-specific text zoom into the browser core, for which I've filed bugs &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=378547"&gt;378547&lt;/a&gt; and &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=378549"&gt;378549&lt;/a&gt;, respectively.&lt;br /&gt;&lt;br /&gt;The sidebar, on the other hand, and the other two settings it exposes will remain an extension for now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-1715905147584285671?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/1715905147584285671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/1715905147584285671'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/04/site-specific-preferences-take-03.html' title='Site-Specific Preferences, Take 0.3'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-7521353675212177975</id><published>2007-03-28T17:17:00.000-07:00</published><updated>2007-03-29T11:23:03.324-07:00</updated><title type='text'>The End of the URL?</title><content type='html'>I was listening to BBC news radio last night when the announcer said to "type &lt;code&gt;World Business Report&lt;/code&gt; into the search engine and follow the link from there" for the latest version of the report.&lt;br&gt; &lt;br&gt; He followed up by mentioning the BBC's news domain name (&lt;strike&gt;bbc.co.uk&lt;/strike&gt; bbcnews.com) as an alternative, but it was striking that he considered "the search engine" a more reliable path to the program's page.&lt;br&gt; &lt;br&gt; Of course, the &lt;a  href="http://www.bbc.co.uk/worldservice/programmes/world_business_report.shtml"&gt;actual URL for that page&lt;/a&gt; is pretty long, and it isn't available directly from the &lt;a href="http://news.bbc.co.uk/"&gt;BBC news home page&lt;/a&gt; or even from its &lt;a  href="http://news.bbc.co.uk/2/hi/business/default.stm"&gt;Business page&lt;/a&gt;, so he's probably right.&lt;br&gt; &lt;br&gt; For &lt;a  href="http://www.google.com/search?q=world+business+report&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rls=org.mozilla:en-US:unofficial&amp;amp;client=firefox-a"&gt;Google&lt;/a&gt; and &lt;a  href="http://search.msn.com/results.aspx?q=world+business+report&amp;amp;FORM=MSNH"&gt;MSN&lt;/a&gt;, anyway, both of which return the report as the second search result (the first being the BBC's &lt;b&gt;other&lt;/b&gt; &lt;a  href="http://news.bbc.co.uk/2/hi/business/1143010.stm"&gt;World Business Report&lt;/a&gt;, a TV program).&lt;br&gt; &lt;br&gt; &lt;a  href="http://search.yahoo.com/search?p=world+business+report&amp;amp;fr=yfp-t-501&amp;amp;toggle=1&amp;amp;cop=mss&amp;amp;ei=UTF-8"&gt;Yahoo&lt;/a&gt;, on the other hand, returns the &lt;a  href="http://en.wikipedia.org/wiki/World_Business_Report"&gt;Wikipedia entry describing the TV program&lt;/a&gt; as its first result.&amp;nbsp; The radio program page is below the fold (on my monitor) as the fourth result.&lt;br&gt; &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-7521353675212177975?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/7521353675212177975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=7521353675212177975' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7521353675212177975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7521353675212177975'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/03/end-of-url.html' title='The End of the URL?'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-7718301971986397692</id><published>2007-03-26T13:26:00.001-07:00</published><updated>2007-03-26T13:26:24.352-07:00</updated><title type='text'>microsummaries for the Summer of Code</title><content type='html'>I've added three microsummary-related projects to Mozilla's &lt;a  href="http://wiki.mozilla.org/Community:SummerOfCode07"&gt;Summer of Code project list&lt;/a&gt;:&lt;br&gt; &lt;ul&gt;   &lt;li&gt;rich content microsummaries: support for HTML and image-based microsummaries&lt;br&gt;   &lt;/li&gt;   &lt;li&gt;microsummary builder: a tool to make microsummaries simpler to create (for both regular users and developers)&lt;br&gt;   &lt;/li&gt;   &lt;li&gt;microsummary generator web service: integration with a generator repository, including auto-notification and easy installation of available generators for the sites you browse&lt;br&gt;   &lt;/li&gt; &lt;/ul&gt; The deadline for applying to hack on one of these projects is today at 5pm PDT (midnight UTC), which is just hours away, so if you're interested in tackling one of these, don't delay!&lt;br&gt; &lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-7718301971986397692?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/7718301971986397692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=7718301971986397692' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7718301971986397692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/7718301971986397692'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/03/microsummaries-for-summer-of-code.html' title='microsummaries for the Summer of Code'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-5701820121080844214</id><published>2007-02-14T16:39:00.001-08:00</published><updated>2007-02-14T17:00:22.990-08:00</updated><title type='text'>Content Preferences - Architecture/API</title><content type='html'>The content preferences code currently has a four piece architecture:&lt;br&gt; &lt;ol&gt;   &lt;li&gt;&lt;b&gt;a service&lt;/b&gt; that manages the database of prefs;&lt;/li&gt;   &lt;li&gt;&lt;b&gt;a controller&lt;/b&gt; for each window that watches the browser's location and notifies pref handlers when it changes;&lt;/li&gt;   &lt;li&gt;&lt;b&gt;pref handlers&lt;/b&gt; that tweak the browser according to the user's prefs;&lt;br&gt;   &lt;/li&gt;   &lt;li&gt;&lt;b&gt;a sidebar&lt;/b&gt; housing controls for twiddling prefs.&lt;br&gt;   &lt;/li&gt; &lt;/ol&gt; In the first version of the extension, I designed these to support preferences like the text zoom pref.&amp;nbsp; In v2 I redesigned them to improve that support and tried to generalize the API to work for other prefs.&lt;br&gt; &lt;br&gt; But a single caller is a very limited perspective for designing an API (indeed, I've already found issues while getting a second pref up and running on it), so I'm keen to get feedback on how to make this work well for other prefs (in both core code and extensions).&lt;br&gt; &lt;br&gt; Here's how it works at the moment:&lt;br&gt; &lt;h2&gt;The Service (mozISitePrefService)&lt;/h2&gt; The service manages the database of prefs.&amp;nbsp; Its API is pretty simple.&amp;nbsp; It has four core methods, getPref, setPref, hasPref, and removePref:&lt;br&gt; &lt;br&gt; &lt;br /&gt;&lt;pre&gt;mozISitePref getPref(in AUTF8String site, in AUTF8String key);&lt;br /&gt;void setPref(in AUTF8String site, in AUTF8String key, in AUTF8String value);&lt;br /&gt;boolean hasPref(in AUTF8String site, in AUTF8String key);&lt;br /&gt;void removePref(in AUTF8String site, in AUTF8String key);&lt;br /&gt;&lt;/pre&gt; &lt;br&gt; It also has a method, getPrefs, that gets all prefs for a site, and it has another method, getSiteForURI, that extracts a site identifier from a URI:&lt;br&gt; &lt;br&gt; &lt;br /&gt;&lt;pre&gt;void getPrefs(in AUTF8String site, &lt;br /&gt;                   out unsigned long prefCount,&lt;br /&gt;                   [retval, array, size_is(prefCount)] out mozISitePref prefs);&lt;br /&gt;&lt;br /&gt;AUTF8String getSiteForURI(in nsIURI uri);&lt;br /&gt;&lt;/pre&gt; &lt;br&gt; Site identifiers are full domains by default (f.e. &lt;a  class="moz-txt-link-abbreviated" href="http://www.mozilla.org"&gt;www.mozilla.org&lt;/a&gt;), but you can configure the extension to use base domains (f.e. mozilla.org), and perhaps we'll cook up other options in the future.&lt;br&gt; &lt;br&gt; The interface to a preference (mozISitePref) is very basic:&lt;br&gt; &lt;br&gt; &lt;pre&gt;readonly attribute AUTF8String site;&lt;br /&gt;readonly attribute AUTF8String key;&lt;br /&gt;readonly attribute AUTF8String value; &lt;/pre&gt; &lt;br&gt; &lt;h2&gt;The Controller (SitePref)&lt;/h2&gt; The controller's job is to notify pref handlers when the browser location changes so those handlers can apply the user's preferences for the new location.&amp;nbsp; It has addObserver and removeObserver methods that handlers can use to register/unregister themselves for notifications:&lt;br&gt; &lt;br&gt; &lt;pre&gt;addObserver(in AUTF8String key, in nsISupports observer)&lt;br /&gt;removeObserver(in AUTF8String key, in nsISupports observer)&lt;/pre&gt; &lt;br&gt; The methods take a pref key so the controller know what setting the handler cares about.&amp;nbsp; When the location changes, the controller grabs the set of prefs for the new location and calls each observer's onLocationChange method with the pref it cares about (if any):&lt;br&gt; &lt;br&gt; &lt;pre&gt;onLocationChange(in nsISitePref pref) &lt;/pre&gt; &lt;br&gt; &lt;h2&gt;The Pref Handlers&lt;/h2&gt; The pref handlers implement the aforementioned onLocationChange method and then do whatever they need to do to apply user preferences to the browser.&lt;br&gt; &lt;br&gt; &lt;h2&gt;The Sidebar (&lt;a class="moz-txt-link-freetext"  href="chrome://cpref/content/sidebar.xul"&gt;chrome://cpref/content/sidebar.xul&lt;/a&gt;)&lt;/h2&gt; The sidebar provides a central location for site-specific preference controls.&amp;nbsp; It's an experiment in exposing these preferences in a place that is location-specific (unlike the Preferences dialog) and visible alongside the page being affected (unlike the View menu).&lt;br&gt; &lt;br&gt; It doesn't do much besides provide a place for pref controls to overlay themselves onto.&amp;nbsp; Controls are responsible for updating themselves when the location changes.&amp;nbsp; But the sidebar does define a gMainWindow shortcut for getting the browser window that the sidebar is embedded in.&lt;br&gt; &lt;br&gt; &lt;h2&gt;Feedback&lt;/h2&gt; I'm interested in feedback on all aspects of this API.&amp;nbsp; Here are the questions I know I should ask:&lt;br&gt; &lt;ol&gt;   &lt;li&gt;Should pref values be typed?&lt;br&gt;     &lt;br&gt; We can't store them typed in the database given the &lt;a  href="http://en.wikipedia.org/wiki/Entity-Attribute-Value_model"&gt;EAV model&lt;/a&gt; we're using to store them (although we could change the model if it mattered enough), but we could convert them on their way in and out of the database and have type-specific methods for getting and setting them (&amp;agrave; la &lt;a  href="http://lxr.mozilla.org/mozilla/source/modules/libpref/public/nsIPrefBranch.idl"&gt;nsIPrefBranch&lt;/a&gt;).&lt;br&gt;     &lt;br&gt;   &lt;/li&gt;   &lt;li&gt;Should pref handlers listen for location changes themselves and get their prefs directly from the service instead of having that work be mediated by the controller?&lt;br&gt;     &lt;br&gt; It's faster for the controller to query once for all prefs, and it's simpler on the pref handlers not to have to implement &lt;a  href="http://lxr.mozilla.org/mozilla/source/uriloader/base/nsIWebProgressListener.idl"&gt;nsIWebProgressListener&lt;/a&gt; themselves, but it makes the architecture more complex, since it adds an extra layer between the service and the handlers.&lt;br&gt;     &lt;br&gt;   &lt;/li&gt;   &lt;li&gt;Is AUTF8String the right string type for site identifiers and keys?&lt;br&gt;   &lt;/li&gt; &lt;/ol&gt; And then there are all those questions I don't know I should be asking (along with their answers), so clue me in!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-5701820121080844214?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/5701820121080844214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=5701820121080844214' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/5701820121080844214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/5701820121080844214'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/02/content-preferences-architectureapi.html' title='Content Preferences - Architecture/API'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-6316389582276652088</id><published>2007-02-13T08:54:00.001-08:00</published><updated>2007-02-13T08:54:30.229-08:00</updated><title type='text'>Content Preferences - take 2</title><content type='html'>I released an updated version of the &lt;a href="https://addons.mozilla.org/firefox/4066/"&gt;Content Preferences&lt;/a&gt; extension today.&lt;br /&gt;&lt;br /&gt;This update features significant changes under the hood to improve the API for extensions that want to use it to store their own site-specific prefs (about which more shortly).&lt;br /&gt;&lt;br /&gt;It also offers the following two improvements for end-users who use it for its text-zoom functionality:&lt;br /&gt;&lt;ol&gt;   &lt;li&gt;Text zoom changes via the mousewheel are now supported, so no matter how you change your text zoom (via the View menu, keyboard shortcuts, the sidebar slider provided by this extension, or mousewheel gestures), this extension will save your setting for each site you visit.&lt;br /&gt;   &lt;br /&gt;  &lt;/li&gt;   &lt;li&gt;An experimental mode lets you set preferences for a domain and all its subdomains. (f.e. *.mozilla.org).  To enable this mode, use &lt;a class="moz-txt-link-freetext" href="about:config"&gt;about:config&lt;/a&gt; to set the &lt;cite&gt;extensions.cpref.siteMode&lt;/cite&gt; preference to the number &lt;cite&gt;1&lt;/cite&gt;.&lt;br /&gt;   &lt;br /&gt;If you're trying out the &lt;a href="http://developer.mozilla.org/devnews/index.php/2007/02/07/136/"&gt;Gran Paradiso Alpha 2&lt;/a&gt; release (or trunk nightlies), the extension uses the new "effective TLD service" to correctly determine the base domain for each site (f.e. mozilla.org for &lt;a class="moz-txt-link-abbreviated" href="http://www.mozilla.org/"&gt;www.mozilla.org&lt;/a&gt; and bbc.co.uk for &lt;a class="moz-txt-link-abbreviated" href="http://www.bbc.co.uk/"&gt;www.bbc.co.uk&lt;/a&gt;).  Otherwise, it falls back to the "top-level domain plus one segment" rule (i.e. mozilla.org for &lt;a class="moz-txt-link-abbreviated" href="http://www.mozilla.org/"&gt;www.mozilla.org&lt;/a&gt; and co.uk for &lt;a class="moz-txt-link-abbreviated" href="http://www.bbc.co.uk/"&gt;www.bbc.co.uk&lt;/a&gt;).&lt;br /&gt;  &lt;/li&gt; &lt;/ol&gt; &lt;a href="https://addons.mozilla.org/firefox/4066/"&gt;Give it a try&lt;/a&gt;, and let me know what you think.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-6316389582276652088?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/6316389582276652088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=6316389582276652088' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6316389582276652088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/6316389582276652088'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/02/content-preferences-take-2.html' title='Content Preferences - take 2'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-117046381064090577</id><published>2007-02-02T16:50:00.000-08:00</published><updated>2007-02-02T16:50:10.706-08:00</updated><title type='text'>Three Things I Love About Komodo</title><content type='html'>Last week &lt;a href="http://www.activestate.com/"&gt;ActiveState&lt;/a&gt; released version 4.0 of their &lt;a  href="http://www.activestate.com/products/komodo_ide/"&gt;Komodo IDE&lt;/a&gt; (and announced &lt;a href="http://www.activestate.com/products/komodo_edit/"&gt;Komodo Edit&lt;/a&gt;, a new free-as-in-beer version of the app).&amp;nbsp; Komodo, like &lt;a  href="http://www.songbirdnest.com/"&gt;Songbird&lt;/a&gt; and &lt;a  href="http://www.getdemocracy.com/"&gt;Democracy&lt;/a&gt;, is Mozilla-based, and I've been using it as my primary editor for several years.&lt;br&gt; &lt;br&gt; Here are three things I love about it:&lt;br&gt; &lt;h3&gt;Tabs&lt;/h3&gt; Like Firefox with web pages, Komodo uses tabs to present multiple documents in a single window.&amp;nbsp; Tabs blows away every previous MDI approach for usability, and I wince whenever I have to use an application (TextWrangler, emacs) that presents multiple documents in any other way.&lt;br&gt; &lt;h3&gt;Indentation Adjustment&lt;br&gt; &lt;/h3&gt; This may sound trivial, but Komodo has the easiest keyboard shortcut for adjusting indentation of any editor I've ever used.&amp;nbsp; Just select the lines (or portions thereof) you want to indent and press the Tab key.&amp;nbsp; To unindent, press Shift-Tab.&lt;br&gt; &lt;br&gt; Komodo will indent using tab characters or spaces per your settings (which you can set for individual files) or by sniffing out the indentation strategy already in use in the file.&lt;br&gt; &lt;h3&gt;Fully-Configurable Key Bindings and Syntax Highlighting&lt;/h3&gt; I almost never tweak these settings, but it made a big difference to be able to do so when I first started using the application.&lt;br&gt; &lt;br&gt; In Komodo, every keyboard shortcut is configurable, which I used to change "Find Next" from F3 to Ctrl-G and "Go to Line" from Ctrl-G to Ctrl-L to match what I was used to from previous editors.&lt;br&gt; &lt;br&gt; Syntax highlighting is also customizable--including font family, size, color, and background color--down to individual language elements, so you can give JS variables, HTML attributes, and Python comments their own individual styles.&lt;br&gt; &lt;br&gt; Komodo also provides an Emacs key binding scheme and a Vi compatibility mode, if that's your thing.&amp;nbsp; And it includes several built-in highlighting schemes, so you don't have to design your own from scratch (I started with "Dark" and made a few tweaks).&lt;br&gt; &lt;h3&gt;Everything Else&lt;/h3&gt; There are tons of other things to love, of course, like integrated debugging for half a dozen scripting languages, remote file access via S/FTP or SCP, code completion, background syntax checking, integrated source control for CVS, SVN, and Perforce, and so on.&lt;br&gt; &lt;br&gt; And then there are the features I haven't learned to love yet, because they're new in version 4.0, but which I expect to come to rely upon in the future, like support for Firefox-style extensions.&lt;br&gt; &lt;br&gt; Did I mention that it's cross-platform (Windows, Mac, and Linux)?&amp;nbsp; If you're looking for a great text editor/IDE, &lt;a  href="http://www.activestate.com/products/komodo_ide/"&gt;check it out&lt;/a&gt;.&lt;br&gt; &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-117046381064090577?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/117046381064090577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=117046381064090577' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/117046381064090577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/117046381064090577'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/02/three-things-i-love-about-komodo.html' title='Three Things I Love About Komodo'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-116837073341371185</id><published>2007-01-09T11:25:00.000-08:00</published><updated>2007-01-09T11:25:33.456-08:00</updated><title type='text'>cool vs. useful</title><content type='html'>Software engineers love cool new features, because programming is hard, and a cool hack represents a triumph of ingenuity and skill against the odds.&lt;br&gt; &lt;br&gt; But computer users tend to prefer useful features to cool ones, because they use computers in order to get things done, and useful features help them do that.&lt;br&gt; &lt;br&gt; Unfortunately, many apps suffer from an overfocus on cool, but I'm pleased to note (in a super-unscientific survey) that Google Groups reports only &lt;a  href="http://groups-beta.google.com/group/mozilla.dev.apps.firefox/search?group=mozilla.dev.apps.firefox&amp;amp;q=cool"&gt;24 results for the word "cool"&lt;/a&gt; in the &lt;a  href="http://groups-beta.google.com/group/mozilla.dev.apps.firefox/topics"&gt;mozilla.dev.apps.firefox newsgroup&lt;/a&gt;, where engineers and others discuss the development of Firefox, whereas &lt;a  href="http://groups-beta.google.com/group/mozilla.dev.apps.firefox/search?group=mozilla.dev.apps.firefox&amp;amp;q=useful"&gt;"useful" appears in 85 posts&lt;/a&gt;.&lt;br&gt; &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-116837073341371185?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/116837073341371185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=116837073341371185' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/116837073341371185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/116837073341371185'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2007/01/cool-vs-useful.html' title='cool vs. useful'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-116652835836570243</id><published>2006-12-19T03:39:00.000-08:00</published><updated>2006-12-19T03:39:18.440-08:00</updated><title type='text'>Who Gives This Software to be Web?</title><content type='html'>When &lt;a href="http://www.forestofforgetting.com/"&gt;my sister&lt;/a&gt; got married, I gave her away.&amp;nbsp; But the pastor who officiated wanted to retain something of the tradition of parents performing that act, so when I walked my sister up to him, he asked me, "who gives this woman to be wed?"&lt;br&gt; &lt;br&gt; And I responded "her father, her mother, and I do, sir."&lt;br&gt; &lt;br&gt; For some reason I'm reminded of this story whenever I think about the three informal &lt;a href="http://en.wikipedia.org/wiki/Personas"&gt;personas&lt;/a&gt; that guide my hacking.&lt;br&gt; &lt;h2&gt;Persona #1: My Mother&lt;/h2&gt; My mother is a novice computer user.&amp;nbsp; She doesn't use keyboard shortcuts, and she doesn't use menus much either.&amp;nbsp; Nor bookmarks, except for the couple I added to her Bookmarks Toolbar once.&amp;nbsp; She also doesn't quite get the difference between a URL and a search, so she goes to URLs by searching for them on Google.&amp;nbsp; She has never installed an add-on.&lt;br&gt; &lt;br&gt; My mother doesn't care how or why her computer does what it does, and she doesn't want to bother learning how to use it better.&amp;nbsp; She just wants it to do what she wants.&lt;br&gt; &lt;h2&gt;Persona #2: My Partner&lt;/h2&gt; My wife Judy, on the other hand, is a power user.&amp;nbsp; She uses some keyboard shortcuts, and she uses a lot of bookmarks (organizing them into multiple categorized folders).&amp;nbsp; She knows the difference between URLs and search terms.&amp;nbsp; She groks HTML.&amp;nbsp; And she has installed a couple of add-ons.&lt;br&gt; &lt;br&gt; Judy takes the time to learn how to use her computer well, not because she wants to, but because she uses her computer a lot, and learning how to use it better helps her get her work done.&amp;nbsp; She too doesn't care why her computer does what it does, she just wants it to work well for her.&lt;br&gt; &lt;h2&gt;Persona #3: Me&lt;/h2&gt; I'm a programmer.&amp;nbsp; I spend more time computing than I do sleeping.&amp;nbsp; So, like Judy, I invest time into making my computing environment as efficient and effective as possible, learning bunches of keyboard shortcuts, installing dozens of extensions, setting up multiple desktops, etc.&lt;br&gt; &lt;br&gt; But I'm also fascinated with computers and how they work, and I like to modify apps to do more or do it better.&amp;nbsp; So factors such as extensibility matter to me in a way they will never (directly) matter to most other people, although others will benefit from the extensions I and other programmers create.&lt;br&gt; &lt;h2&gt;He-Fox and the Masters of its Universe&lt;br&gt; &lt;/h2&gt; I think software like Firefox can and should serve multiple audiences well, including the people I mention above, which comprise three basic categories of computer users.&amp;nbsp; Not every feature will appeal to every group, and we might use even common features in very different ways, but Firefox should be able to provide a great experience for all three kinds of users.&lt;br&gt; &lt;br&gt; When I work on Firefox and other apps, I try to keep these people in mind as proxies for Firefox's actual userbase and provide the appropriate experience for each one. So when considering who benefits from the work I do, I can say "my mother, my partner, and I do, sir."&lt;br&gt; &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-116652835836570243?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/116652835836570243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=116652835836570243' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/116652835836570243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/116652835836570243'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2006/12/who-gives-this-software-to-be-web.html' title='Who Gives This Software to be Web?'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-116604423178333460</id><published>2006-12-13T13:10:00.000-08:00</published><updated>2006-12-13T13:10:32.306-08:00</updated><title type='text'>userstyles.org creates microsummary generator repository</title><content type='html'>Jason Barnabe has integrated &lt;a href="http://blog.userstyles.org/?p=55"&gt;support for microsummary generators&lt;/a&gt; into his &lt;a  href="http://userstyles.org/"&gt;userstyles.org&lt;/a&gt; site.&amp;nbsp; I've uploaded all my generators to the site, and some other folks have uploaded theirs, so it's turning into a one-stop shop for microsummary generators.&amp;nbsp; Check it out at:&lt;br&gt; &lt;br&gt; &lt;a href="http://userstyles.org/livetitle"&gt;http://userstyles.org/livetitle&lt;/a&gt;&lt;br&gt; &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-116604423178333460?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/116604423178333460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=116604423178333460' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/116604423178333460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/116604423178333460'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2006/12/userstylesorg-creates-microsummary.html' title='userstyles.org creates microsummary generator repository'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-116593188726010862</id><published>2006-12-12T04:33:00.000-08:00</published><updated>2006-12-12T05:58:07.440-08:00</updated><title type='text'>persistent, site-specific prefs prototype</title><content type='html'>I've been investigating options for improving user control over content, including persisting user decisions about appearance and behavior and overriding global preferences on a site-specific basis.&lt;br /&gt;&lt;br /&gt;To test some ideas about how to do these things, I put together a prototype that implements a basic service for persisting site-specific preferences to a profile database.&lt;br /&gt;&lt;br /&gt;The prototype also includes some experimental UI in the form of a sidebar into which controls for twiddling site-specific preferences can be placed.  The sidebar currently contains one such control: a slider that sets the text zoom value (i.e. what View &gt; Text Size &gt; Increase/Decrease/Normal sets).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/cpref-758416.png"&gt;&lt;img style="cursor: pointer;" src="http://www.melez.com/mykzilla/uploaded_images/cpref-755744.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've bundled up the prototype into an extension called (boringly) Content Preferences for Firefox 2 and up and &lt;a href="https://addons.mozilla.org/firefox/4066/"&gt;posted it to addons&lt;/a&gt;.  While it undergoes review on that site, the eager among you can get it from my web site: &lt;a href="http://www.melez.com/mozilla/cpref.xpi"&gt;Install Content Preferences&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It should go without saying that this is early, rough alpha code, and you should exercise all due caution when testing it.  To try it out, do the normal install and restart thing, then select View &gt; Sidebar &gt; Content Preferences.&lt;br /&gt;&lt;br /&gt;Your feedback is welcomed.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;Some voluminous notes for the compulsive informaddicts among you:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;View &gt; Text Size Impact&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once you install the extension, the View &gt; Text Size menu items and their keyboard shortcuts also become site-specific and profile-persistent (i.e. lasts as long as your profile does).  So even if you never open the sidebar, you still get the benefits of the extension with the existing text zoom UI.&lt;br /&gt;&lt;br /&gt;If you uninstall the extension, that UI goes back to the way it was before (i.e. tab-specific and tab-persistent).  No permanent harm done (AFAICT, YMMV, etc.).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;The Slider&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The sidebar slider's magnification range is 1-400%, which is somewhat smaller than the View &gt; Text Size commands' range of 1-2000%, but the smaller range seemed more usable.  The slider will follow any changes you make via View &gt; Text Size as far as it can, then it'll sit there lonely at the end of its range until you come back to it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;What is a Site?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A "site," for the purposes of this early prototype, is the set of pages hosted at the exact same domain name (f.e. everything on en-us.www.mozilla.com).&lt;br /&gt;&lt;br /&gt;As &lt;a href="http://dbaron.org/"&gt;David Baron&lt;/a&gt; has pointed out, figuring out what constitutes a site is an important component of an endeavour like this, so future prototypes will experiment with TLD+1 (*.mozilla.com) sites, www-optional sites (www.mozilla.com == mozilla.com), and anything else that seems promising.&lt;br /&gt;&lt;br /&gt;Perhaps multiple domains secured by certificates granted to the same organization should count as one site?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Fixing Font Size on the Web&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Finally, I'm aware of &lt;a href="http://www.hixie.ch/specs/css/font-size-ui/font-size-ui"&gt;multiple&lt;/a&gt; &lt;a href="http://groups.google.com/group/mozilla.dev.tech.layout/browse_frm/thread/191cbc4f7b38b292/"&gt;proposals&lt;/a&gt; for fixing the font size settings in Firefox so they're easier to use and get things right more of the time.  And I'm also aware that the more we can get stuff like font size right without making users configure it themselves, the better.&lt;br /&gt;&lt;br /&gt;This prototype doesn't constitute a proposal for dealing with font size, it's more an experiment in how to improve usability with persistence and site-specificity.  I picked on text zoom only because itty-bitty fonts seem to be among the commoner complaints about the web, and also because hacking into text zoom seemed like a good testbed.&lt;br /&gt;&lt;br /&gt;Even if we solve text size issues some other way, there will be other uses for the core service this extension provides.  For example, Dave Camp overheard me describing this experiment a couple days ago and mentioned that he's been looking for a way for users to grant additional DOMStorage space to particular sites.  A site-specific preference service sounds like just his ticket.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-116593188726010862?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/116593188726010862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=116593188726010862' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/116593188726010862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/116593188726010862'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2006/12/persistent-site-specific-prefs.html' title='persistent, site-specific prefs prototype'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-116174759474553658</id><published>2006-10-24T19:05:00.000-07:00</published><updated>2006-10-24T23:27:19.803-07:00</updated><title type='text'>improving microsummary discoverability</title><content type='html'>For Firefox 3, in addition to investigating our feature set for &lt;a href="http://wiki.mozilla.org/Firefox/Feature_Brainstorming:Content_Filtering%2C_Manipulation%2C_and_Control"&gt;control over your web experience&lt;/a&gt; (about which more soon), I'm also looking into useful usability and functionality improvements to Firefox's support for &lt;a href="http://wiki.mozilla.org/Microsummaries"&gt;microsummaries&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One glaring weakness is discoverability.  In Firefox 2, it's hard to know if a page you're browsing has a microsummary, since you have to open the Add Bookmark dialog to find out, and you have to grok the significance of the drop-marker in the Name field.&lt;br /&gt;&lt;br /&gt;Feeds, by comparison, are much more discoverable, since Firefox displays the feed icon in the location bar when a page provides a feed.  Perhaps a similar mechanism would be useful for microsummaries.&lt;br /&gt;&lt;br /&gt;To find out, I put together a prototype extension which displays an icon in the location bar when a web page has a microsummary.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/sumbuddy-screenshot-icon-718978.png"&gt;&lt;img style="cursor: pointer;" src="http://www.melez.com/mykzilla/uploaded_images/sumbuddy-screenshot-icon-713901.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When you click the icon, Firefox opens the Add Bookmark dialog and selects the microsummary as the "live title" for the bookmark.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/sumbuddy-screenshot-dialog-708294.png"&gt;&lt;img style="cursor: pointer;" src="http://www.melez.com/mykzilla/uploaded_images/sumbuddy-screenshot-dialog-706149.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Then just select the folder you want the bookmark to be created in (f.e. the Bookmarks Toolbar) and press the Add button to add a bookmark labeled with the microsummary for the page.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/sumbuddy-screenshot-bookmark-704175.png"&gt;&lt;img style="cursor: pointer;" src="http://www.melez.com/mykzilla/uploaded_images/sumbuddy-screenshot-bookmark-701962.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The extension is now &lt;a href="https://addons.mozilla.org/firefox/3639/"&gt;available on &lt;/a&gt;&lt;a href="https://addons.mozilla.org/firefox/3639/"&gt;addons.mozilla.org&lt;/a&gt;.  Try it out with some of these &lt;a href="http://people.mozilla.com/%7Emyk/microsummaries/sites/"&gt;sites&lt;/a&gt; and &lt;a href="http://people.mozilla.com/%7Emyk/microsummaries/generators/"&gt;generators&lt;/a&gt;, and let me know what you think.  Does the behavior make sense?  What other behavior might we associate with the icon (f.e. drag-and-drop to the bookmarks toolbar)?  What should happen when there are multiple microsummaries?&lt;br /&gt;&lt;br /&gt;Notes:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The extension works in both Minefield and Firefox 2.0 and with both generated and site-provided microsummaries.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The location bar icon is intentionally blank, since I have no idea what kind of graphic should represent microsummaries.  I would have made it colorless, too, but then it would have been invisible.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I named the extension something generic because I plan to prototype additional enhancements in future versions of it.&lt;/li&gt;&lt;li&gt;Adding an icon to the location bar for every interesting piece of content, especially in the age of burgeoning microformats, probably won't scale, so this may well be the wrong solution for the problem.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-116174759474553658?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/116174759474553658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=116174759474553658' title='33 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/116174759474553658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/116174759474553658'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2006/10/improving-microsummary-discoverability.html' title='improving microsummary discoverability'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>33</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-116173215416579413</id><published>2006-10-24T16:22:00.000-07:00</published><updated>2006-10-24T16:22:34.223-07:00</updated><title type='text'>folks who made microsummaries happen</title><content type='html'>My primary responsibility for &lt;a  href="http://www.mozilla.com/en-US/firefox/"&gt;Firefox 2&lt;/a&gt; was to implement support for &lt;a href="http://wiki.mozilla.org/Microsummaries"&gt;microsummaries&lt;/a&gt;.&amp;nbsp; It was a large task, and I couldn't have done it without significant assistance from a number of other folks.&lt;br&gt; &lt;br&gt; &lt;a href="http://steelgryphon.com/blog/"&gt;Mike Connor&lt;/a&gt; and &lt;a  href="http://www.beltzner.ca/mike/"&gt;Mike Beltzner&lt;/a&gt; saw the potential early on and encouraged me to work on microsummaries for Firefox 2.&amp;nbsp; Both also helped in innumerable other ways, including code, user experience, and nomenclature reviews.&lt;br&gt; &lt;br&gt; &lt;a href="http://shaver.off.net/diary/"&gt;Mike Shaver&lt;/a&gt; provided invaluable early feedback, including coming up with the name "microsummary".&lt;br&gt; &lt;br&gt; &lt;a href="http://weblogs.mozillazine.org/ben/"&gt;Ben Goodger&lt;/a&gt; and Brett Wilson helped me navigate the treacherous waters of the bookmarks code (and the gentler shoals of Places) to get the architecture and integration points right.&lt;br&gt; &lt;br&gt; I'm extremely appreciative of the many hours &lt;a  href="http://weblogs.mozillazine.org/bz/"&gt;Boris Zbarsky&lt;/a&gt; spent working through complicated technical issues with me, particularly how to download and parse an HTML page in Firefox without any front-end impact.&amp;nbsp; Boris was incredibly helpful, and I've seen him do the same for many other developers.&amp;nbsp; He's a real credit to the community.&lt;br&gt; &lt;br&gt; Much props to &lt;a href="http://sicking.cc/"&gt;Jonas Sicking&lt;/a&gt;, Dan Veditz, &lt;a href="http://weblogs.mozillazine.org/darin/"&gt;Darin Fisher&lt;/a&gt;, and &lt;a href="http://dbaron.org/"&gt;David Baron&lt;/a&gt; for their thorough security review.&lt;br&gt; &lt;br&gt; &lt;a href="http://www.bitstampede.com/"&gt;Eric Shepherd&lt;/a&gt; rocked the docs on many levels (writing, reviewing, organizing).&lt;br&gt; &lt;br&gt; A veritable bevy of coders contributed patches: &lt;a  href="http://dietrich.ganx4.com/blog/"&gt;Dietrich Ayala&lt;/a&gt;, Simon B&amp;uuml;nzli,&amp;nbsp; &lt;a href="http://caspar.regis.free.fr/"&gt;Regis Caspar&lt;/a&gt;, &lt;a  href="http://dolske.net/"&gt;Justin Dolske&lt;/a&gt;, &lt;a  href="http://kmgerich.com/"&gt;Kevin Gerich&lt;/a&gt;, Pam Greene, &lt;a  href="http://www.ispiked.us/"&gt;Adam Guthrie&lt;/a&gt;, Joey Minta, and &lt;a  href="http://weblog.philringnalda.com/"&gt;Phil Ringnalda&lt;/a&gt;.&lt;br&gt; &lt;br&gt; And many other folks made microsummaries better by contributing bug reports, suggestions, microsummary generators, integration into blogging tools, and prototypes of future enhancements/add-ons.&lt;br&gt; &lt;br&gt; Thank you, everyone!&lt;br&gt; &lt;br&gt; (And apologies to those whose contributions I forgot to mention.)&lt;br&gt; &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-116173215416579413?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/116173215416579413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=116173215416579413' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/116173215416579413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/116173215416579413'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2006/10/folks-who-made-microsummaries-happen.html' title='folks who made microsummaries happen'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-116077659229312904</id><published>2006-10-13T14:56:00.000-07:00</published><updated>2006-10-13T15:00:45.236-07:00</updated><title type='text'>content filtering, manipulation, and control in Firefox 3</title><content type='html'>Over in mozilla.dev.planning, Deb has &lt;a  href="http://groups.google.com/group/mozilla.dev.planning/browse_frm/thread/a1dd9d1894a5fc6d/a4724e7c537dc246"&gt;posted an article&lt;/a&gt; about Firefox's newly updated &lt;a  href="http://wiki.mozilla.org/Firefox/Feature_Brainstorming"&gt;Feature Brainstorming&lt;/a&gt; list.&lt;br&gt; &lt;br&gt; For the next version of Firefox, I'm going to take a particularly close look at the application's feature set for &lt;a  href="http://wiki.mozilla.org/Firefox/Feature_Brainstorming#Content_filtering.2C_manipulation.2C_and_control"&gt;content filtering, manipulation, and control&lt;/a&gt;.&lt;br&gt; &lt;br&gt; I'll look at the functionality Firefox currently provides, try to figure out what it should be providing (based on a variety of metrics), and identify a discrete set of changes (new features, enhancements, and even removal of existing code) which can provide evolutionary and/or breakthrough improvements to this area in the Firefox 3 timeframe.&lt;br&gt; &lt;br&gt; I have a few ideas, which I've added to the brainstorming list; and others have added many more; but there are bound to be great ideas we haven't yet captured.&amp;nbsp; So if you have some, please &lt;a  href="http://wiki.mozilla.org/Firefox/Feature_Brainstorming"&gt;contribute them&lt;/a&gt; to the list!&lt;br&gt; &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-116077659229312904?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/116077659229312904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=116077659229312904' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/116077659229312904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/116077659229312904'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2006/10/content-filtering-manipulation-and.html' title='content filtering, manipulation, and control in Firefox 3'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-115890649193141828</id><published>2006-09-21T23:28:00.000-07:00</published><updated>2006-09-21T23:28:12.430-07:00</updated><title type='text'>a bunch of microsummaries news</title><content type='html'>I've been remiss in not blogging lately about much cool microsummary news.&amp;nbsp; To make up for it, here's a bunch all at once:&lt;br&gt; &lt;br&gt; First off, &lt;a href="http://www.markdownmonkey.com/"&gt;Markdown Monkey&lt;/a&gt;, &lt;a href="http://www.deprec4ted.net/"&gt;Deprec4ted&lt;/a&gt;, and &lt;a  href="http://neo-addict.net/misc/downloads"&gt;NeoAddict&lt;/a&gt; have all created microsummaries for their web sites (the latter as a generator).&lt;br&gt; &lt;br&gt; Also, I've added two new &lt;a  href="http://people.mozilla.com/%7Emyk/microsummaries/generators/"&gt;example generators&lt;/a&gt;, one that &lt;a  href="http://people.mozilla.com/%7Emyk/microsummaries/generators/flightstats-flight-status.xml"&gt;shows you flight status&lt;/a&gt; via &lt;a href="http://www.flightstats.com/"&gt;FlightStats&lt;/a&gt; (prompted by a request from &lt;a  href="http://www.sethbindernagel.com/mozilla/"&gt;Seth Bindernagel&lt;/a&gt;) and another, adapted from a generator by &lt;a  href="http://samuelsidler.com/"&gt;Samuel Sidler&lt;/a&gt;, that &lt;a  href="http://people.mozilla.com/%7Emyk/microsummaries/generators/alexa-traffic-ranking.xml"&gt;shows you a web site's traffic ranking&lt;/a&gt; on &lt;a href="http://www.alexa.com/"&gt;Alexa&lt;/a&gt;.&lt;br&gt; &lt;br&gt; &lt;a href="http://www.etf.cuni.cz/%7Etomasek/"&gt;Petr Tomasek&lt;/a&gt; has put together some &lt;a  href="http://www.etf.cuni.cz/%7Etomasek/pub/microsummaries/install.html"&gt;microsummary generators&lt;/a&gt; (mostly for Czech sites).&lt;br&gt; &lt;br&gt; And &lt;a href="http://dietrich.ganx4.com/blog/"&gt;Dietrich Ayala&lt;/a&gt;, author of the way-cool &lt;a  href="http://dietrich.ganx4.com/mozilla/bugzilla-search-microsummary.xml"&gt;Bugzilla Search&lt;/a&gt; generator, wrote an XSL stylesheet that transforms a generator into an HTML page containing a link for installing that generator (i.e. the generator displays its own install page).&lt;br&gt; &lt;br&gt; I've added his stylesheet to all the &lt;a  href="http://people.mozilla.com/%7Emyk/microsummaries/generators/"&gt;example generators&lt;/a&gt;, so if you happen to load &lt;a  href="http://people.mozilla.com/%7Emyk/microsummaries/generators/ebay-auction-item.xml"&gt;one of those generator files directly&lt;/a&gt;, you'll see something better than plain XML (unless you're looking for plain XML, that is, in which case you'll see something worse than plain XML, and View -&amp;gt; Page Source will become your friend).&lt;br&gt; &lt;br&gt; Finally, I wrote a tutorial on &lt;a  href="http://developer.mozilla.org/en/docs/Creating_regular_expressions_for_a_microsummary_generator"&gt;creating regular expressions for a microsummary generator&lt;/a&gt; to help folks without existing RegExp fu learn to write expressions to match the URLs of sites they want their generators to handle.&lt;br&gt; &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-115890649193141828?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/115890649193141828/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=115890649193141828' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/115890649193141828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/115890649193141828'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2006/09/bunch-of-microsummaries-news.html' title='a bunch of microsummaries news'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-115257781880354477</id><published>2006-07-10T17:30:00.000-07:00</published><updated>2006-07-10T17:40:44.536-07:00</updated><title type='text'>woot.com provides microsummary</title><content type='html'>&lt;p class="mobile-post"&gt;&lt;a href="http://www.woot.com/"&gt;woot.com&lt;/a&gt; now provides a microsummary of its home page showing the current product for sale on that site:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.melez.com/mykzilla/uploaded_images/woot-microsummary-724943.png" alt="screenshot showing woot microsummary on bookmarks toolbar"&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="mobile-post"&gt;Three days ago I didn't even know woot.com existed.  Now I not only know about it, I can see what it's selling every day with a glance at my bookmarks toolbar, and I've already &lt;a href="http://www.woot.com/Blog/BlogEntry.aspx?BlogEntryId=1270"&gt;bought something&lt;/a&gt;.  Woot!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-115257781880354477?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/115257781880354477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=115257781880354477' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/115257781880354477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/115257781880354477'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2006/07/wootcom-provides-microsummary.html' title='woot.com provides microsummary'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-115257459017930611</id><published>2006-07-10T16:36:00.000-07:00</published><updated>2006-07-10T16:36:30.243-07:00</updated><title type='text'>microsummaries talk at OSCON</title><content type='html'>I'll be giving a &lt;a  href="http://conferences.oreillynet.com/cs/os2006/view/e_sess/9515"&gt;talk on Microsummaries&lt;/a&gt; at the upcoming &lt;a  href="http://conferences.oreillynet.com/os2006/"&gt;O'Reilly Open Source Convention&lt;/a&gt; (OSCON) on Thursday, July 27, from 11:35am - 12:20pm in the Portland 251 room.&amp;nbsp; The talk will include an overview of microsummaries, a demonstration of their functionality in the upcoming Firefox 2 (including &lt;a  href="http://people.mozilla.com/%7Emyk/microsummaries/generators/"&gt;generators for popular web sites&lt;/a&gt; and &lt;a href="http://www.woot.com/"&gt;sightings in the wild&lt;/a&gt;), a lightning tutorial on building a generator (&amp;agrave; la &lt;a  href="http://wiki.mozilla.org/Microsummaries/Tutorial"&gt;this one&lt;/a&gt;), and discussion about future enhancements to benefit web sites and users.&lt;br&gt; &lt;br&gt; It should be a fun and informative session, so please drop by if you're attending OSCON.&amp;nbsp; And if you're still just thinking about attending, note that Benjamin Smedberg will also be talking about &lt;a  href="http://conferences.oreillynet.com/cs/os2006/view/e_sess/9253"&gt;building apps with XULRunner&lt;/a&gt;, Mitchell Baker will be on a panel discussing &lt;a  href="http://conferences.oreillynet.com/cs/os2006/view/e_sess/9378"&gt;open source projects and money&lt;/a&gt;, and Mark Hammond will be presenting on &lt;a  href="http://conferences.oreillynet.com/cs/os2006/view/e_sess/9432"&gt;Python in Mozilla&lt;/a&gt;.&lt;br&gt; &lt;br&gt; Other Mozilla folks are also attending, and there'll be a &lt;a  href="http://conferences.oreillynet.com/cs/os2006/view/e_sess/9428"&gt;BOF&lt;/a&gt;, a &lt;a href="http://conferences.oreillynet.com/pub/w/46/exhibitors.html"&gt;booth&lt;/a&gt;, a &lt;a  href="http://conferences.oreillynet.com/cs/os2006/view/e_sess/9410"&gt;screening&lt;/a&gt;, and probably other exciting events and get-togethers, so it's a great opportunity to meet Mozillans and learn more about the project.&amp;nbsp; &lt;a  href="http://conferences.oreillynet.com/os2006/"&gt;Check it out&lt;/a&gt;.&lt;br&gt; &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-115257459017930611?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/115257459017930611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=115257459017930611' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/115257459017930611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/115257459017930611'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2006/07/microsummaries-talk-at-oscon.html' title='microsummaries talk at OSCON'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-115223585509319188</id><published>2006-07-06T18:30:00.000-07:00</published><updated>2006-07-06T18:30:55.126-07:00</updated><title type='text'>microsummaries beyond bookmarks</title><content type='html'>Folks at my XTech talk on microsummaries in May seemed excited by the new feature, and in discussion they pointed out a number of potential applications for microsummaries technology, including:&lt;br&gt; &lt;ol&gt;   &lt;li&gt;Simplifying web pages for blind users who have to walk DOM trees via screen readers to access page content.&amp;nbsp; One idea is to establish a repository of site-specific XSLT stylesheets that remove unnecessary content (f.e. redundant navigation) from pages, tag important content, and make other modifications to optimize navigability via screen readers.&lt;br&gt;   &lt;/li&gt;   &lt;li&gt;Reorganizing web pages for mobile users with screen size and navigation constraints.&amp;nbsp; A common problem on mobile devices is that users have to scroll past screenfuls of navigation to get to the content of a page, since the navigation appears before the content in the page.&amp;nbsp; Here again we might establish a repository of XSLT stylesheets that move navigation to the ends of pages and do other transforms to make the pages display better on small screens.&lt;br&gt;   &lt;/li&gt;   &lt;li&gt;Creating widgets that provide specific information or help you do particular tasks, &amp;agrave; la Yahoo! Widgets, Opera Widgets, and Apple's Dashboard.&amp;nbsp; XSL transforms probably aren't sufficient here but could be a component in an overall solution.&lt;/li&gt; &lt;/ol&gt; These are all great ideas, and I'll be keeping their use cases in mind as I refine microsummaries functionality in Firefox.&lt;br&gt; &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-115223585509319188?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/115223585509319188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=115223585509319188' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/115223585509319188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/115223585509319188'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2006/07/microsummaries-beyond-bookmarks.html' title='microsummaries beyond bookmarks'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-114770420101698392</id><published>2006-05-15T07:43:00.000-07:00</published><updated>2006-05-15T07:43:21.046-07:00</updated><title type='text'>microsummaries in Firefox 2.0 alpha2</title><content type='html'>The &lt;a href="http://wiki.mozilla.org/Microsummaries"&gt;Microsummaries feature I proposed&lt;/a&gt; a few months ago in this blog--and have been developing since then--has landed in time to make &lt;a  href="http://developer.mozilla.org/devnews/index.php/2006/05/12/bon-echo-alpha-2-milestone/"&gt;Firefox 2.0 alpha2&lt;/a&gt;.&amp;nbsp; Or rather, an initial version of it has landed.&amp;nbsp; UI and other elements are still undergoing refinement.&lt;br&gt; &lt;br&gt; But there's something to play with now, so play, and let me know what you think!&amp;nbsp; To use the feature, you first have to install some microsummary generators, which are the things that extract microsummaries from their pages.&amp;nbsp; Get started with this page of &lt;a  href="http://people.mozilla.com/%7Emyk/microsummaries/generators/"&gt;sample generators&lt;/a&gt;.&lt;br&gt; &lt;br&gt; To install a generator from that page, just click its link (f.e. the &lt;cite&gt;Yahoo! Finance Stock Quote &lt;/cite&gt;link), click OK when Firefox asks you if you want to add the generator, go to a page to which the generator applies (f.e. the &lt;a href="http://finance.yahoo.com/q?s=aapl"&gt;Yahoo! Finance Stock Quote for Apple Computer&lt;/a&gt;), and then select &lt;cite&gt;Bookmark This Page...&lt;/cite&gt; from the &lt;cite&gt;Bookmarks&lt;/cite&gt; menu.&lt;br&gt; &lt;br&gt; In the &lt;cite&gt;Add Bookmark&lt;/cite&gt; dialog, select the microsummary from the &lt;cite&gt;Summary&lt;/cite&gt; drop-down menu, then select the &lt;cite&gt;Bookmarks Toolbar&lt;/cite&gt; from the &lt;cite&gt;Create in&lt;/cite&gt; drop-down menu.&amp;nbsp; Press the &lt;cite&gt;Add&lt;/cite&gt; button to add the bookmark.&amp;nbsp; A bookmark to the page should appear on your bookmarks toolbar (or its "chevron" overflow menu, if you're out of space on the toolbar proper) with the microsummary you selected as its label.&lt;br&gt; &lt;br&gt; If you're having trouble, see this &lt;a  href="http://people.mozilla.com/%7Emyk/microsummaries/tests/"&gt;set of unit tests&lt;/a&gt;, which take you through step-by-step instructions for testing the feature.&amp;nbsp; If you want to create your own microsummary generators, see this &lt;a  href="http://wiki.mozilla.org/Microsummaries/Tutorial"&gt;tutorial on the subject&lt;/a&gt;.&lt;br&gt; &lt;br&gt; Up next: bug fixes, UI brainstorming, a &lt;a  href="http://xtech06.usefulinc.com/schedule/detail/201"&gt;presentation Wednesday at XTech&lt;/a&gt;, and perhaps a pre-alpha microsummary builder extension if I can get to it.&lt;br&gt; &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-114770420101698392?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/114770420101698392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=114770420101698392' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/114770420101698392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/114770420101698392'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2006/05/microsummaries-in-firefox-20-alpha2.html' title='microsummaries in Firefox 2.0 alpha2'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-114242710961410619</id><published>2006-03-15T04:51:00.000-08:00</published><updated>2006-03-15T04:51:49.663-08:00</updated><title type='text'>Easier Updating to the Latest Nightly Build</title><content type='html'>I frequently fall behind on nightly trunk updates, usually because I brush off pending updates and then go for days before restarting Firefox.&amp;nbsp; Occasionally it's because I'm away from my computer on vacation.&lt;br&gt; &lt;br&gt; Once I'm behind, it's painful to catch up, since the app update service feeds updates to Firefox one day at a time, so I have to &lt;cite&gt;Check for Updates&lt;/cite&gt;, wait for Firefox to find and download the next one, restart the app to apply the update, and then repeat the process over and over again until I'm finally up-to-date.&lt;br&gt; &lt;br&gt; &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=306864"&gt;Bug 306864&lt;/a&gt; is about fixing this on the server side by making the app update service hand nightlies a single update to the latest nightly build, but it doesn't have much traction, so I hacked up a dumb but effective client-side fix in the form of an extension that checks for updates, downloads them, applies them, and then repeats the process until Firefox is fully updated.&lt;br&gt; &lt;br&gt; Using the extension is simple: just select &lt;cite&gt;Make Me Up-To-Date&lt;/cite&gt; from the &lt;cite&gt;Help&lt;/cite&gt; menu, and the extension will do its thing.&amp;nbsp; Warning: it doesn't prompt you before restarting Firefox to apply an update, and it doesn't tell you what it's doing (except on the console).&amp;nbsp; So make sure you know what you're doing before you use it (i.e. finish filling out and submitting web forms, save tabs you want to access afterwards, start Firefox with a console, etc.).&lt;br&gt; &lt;br&gt; I've tested it with various Linux nightlies from the last couple months, and it worked as expected except when the app update service or client was busted.&amp;nbsp; Since it uses the same backend components as the regular updater, if &lt;cite&gt;Check for Updates&lt;/cite&gt; doesn't work, then &lt;cite&gt;Make Me Up-To-Date&lt;/cite&gt; won't work either.&lt;br&gt; &lt;br&gt; If you try it out, post a comment with your results, and include your starting and ending builds plus what platform you're on so I can get a sense of where it is and isn't working.&amp;nbsp; And, of course, back things up in case this horks your build, since it's new, untested code, and it may well be buggy.&lt;br&gt; &lt;br&gt; &lt;a href="http://www.melez.com/mozilla/mmutd/mmutd-0.1.xpi"&gt;Install Make Me Up-To-Date 0.1&lt;/a&gt;&lt;br&gt; &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-114242710961410619?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/114242710961410619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=114242710961410619' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/114242710961410619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/114242710961410619'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2006/03/easier-updating-to-latest-nightly.html' title='Easier Updating to the Latest Nightly Build'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-113982607314005106</id><published>2006-02-13T02:12:00.000-08:00</published><updated>2006-02-13T02:39:01.956-08:00</updated><title type='text'>improving Firefox password saving</title><content type='html'>Using Firefox's password saving functionality is a frustrating experience for me, and I suspect it's frustrating for other users too.  It has several problems:&lt;br /&gt;&lt;br /&gt;Problem #1: when Firefox remembers more than one password (or, more accurately, both a password and a username) for a given site, it doesn't autofill the login form or give me any clue what the usernames/passwords are until I correctly guess the first letter of one of the usernames.&lt;br /&gt;&lt;br /&gt;Although I only have multiple accounts at a couple sites (principally those of two utility companies which made me create new accounts when I moved), I regularly enter my login info incorrectly and then mistakenly tell Firefox to remember it, so I now have invalid remembered passwords at a number of sites, and Firefox no longer autofills their login forms.&lt;br /&gt;&lt;br /&gt;Problem #2: Firefox asks me whether it should remember usernames/passwords the moment I submit a login form, and it does so via a modal dialog, so I can't wait to see if my login attempt succeeded before deciding to save the info.&lt;br /&gt;&lt;br /&gt;Problem #3: Deleting passwords is hard.  It's only possible via the password manager, and every time I open the manager I have to rediscover how its list is sorted.  Unfortunately the list turns out to be sorted by raw URL, so http://example.com/, http://www.example.com/, and https://www.example.com/ are all in different places on the list, and I have to hunt them all down to find the one(s) I'm looking for.&lt;br /&gt;&lt;br /&gt;Fortunately, fixing these problems seems relatively straightforward.&lt;br /&gt;&lt;br /&gt;First, when a user loads a login page for which Firefox remembers multiple username/password combos, the browser should display a non-modal status bar (similar to the popup blocker status bar) which lists the usernames and prompts the user to select one.  When the user does so, Firefox should fill in the form and perhaps also automatically submit it.  Here's a mockup of how it might look:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/accounts-bar-783043.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://www.melez.com/mykzilla/uploaded_images/accounts-bar-776962.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Second, when a user submits a login form with an unfamiliar username, Firefox should ask if the user wants to remember the info via another non-modal status bar, something like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.melez.com/mykzilla/uploaded_images/save-password-bar-734207.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://www.melez.com/mykzilla/uploaded_images/save-password-bar-707169.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Third, the password manager should support filtering, just as the cookie manager does, via a "Search" field that restricts the list to matching entries.&lt;br /&gt;&lt;br /&gt;With these changes:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;users will be able to see and pick between multiple remembered username/password combos for a given site;&lt;br /&gt;&lt;li&gt;users won't have to decide in advance whether to save that info; they'll be able to do so after seeing if their login attempts have succeeded;&lt;br /&gt;&lt;li&gt;users deleting passwords using the password manager will be able to filter the list to find just the passwords they want to delete.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;As a beneficial side-effect, users will be able to ignore the "save this password?" question instead of being forced to answer it every time.  And to make deleting passwords even easier, we might include UI for doing so right from the "pick an account " bar (f.e. a context menu item).&lt;br /&gt;&lt;br /&gt;Thoughts?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-113982607314005106?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/113982607314005106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=113982607314005106' title='66 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/113982607314005106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/113982607314005106'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2006/02/improving-firefox-password-saving.html' title='improving Firefox password saving'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>66</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-113933729467683913</id><published>2006-02-07T10:02:00.000-08:00</published><updated>2006-02-07T12:21:26.540-08:00</updated><title type='text'>microsummaries feature proposal and prototype</title><content type='html'>After receiving some positive feedback on my "son of live bookmarks" idea, I wrote up a more comprehensive &lt;a href="http://wiki.mozilla.org/Microsummaries"&gt;description and proposal&lt;/a&gt; for a Firefox feature that supports the display and updating of microsummaries of web page content (tip o' the hat to Mike Shaver for the term "microsummaries").&lt;br /&gt;&lt;br /&gt;And then, since it's easier to understand a proposal with some working sample code, I hacked up a prototype in the form of an extension you can install into a &lt;a href="http://wiki.mozilla.org/Places#Planned_Milestones"&gt;Places-enabled build&lt;/a&gt; (milestone 2 or newer).&lt;br /&gt;&lt;br /&gt;The prototype comes with built-in support for three kinds of microsummaries: &lt;a href="http://www.ebay.com"&gt;eBay&lt;/a&gt; auction items, &lt;a href="http://finance.yahoo.com/"&gt;Yahoo! Finance&lt;/a&gt; stock quotes, and &lt;a href="http://www.m-w.com/cgi-bin/mwwod.pl"&gt;Merriam-Webster's Word of the Day&lt;/a&gt;.  Just throw a link to one of those pages onto your bookmarks toolbar, and the prototype will start updating it regularly with pertinent information (the price/time left in the auction, stock symbol/price, and word of the day, respectively).&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="http://slesinsky.org/brian/"&gt;Brian Slesinsky&lt;/a&gt;, who graciously trilicensed &lt;a href="https://addons.mozilla.org/extensions/moreinfo.php?id=1095"&gt;XPath Checker&lt;/a&gt; code, the prototype also supports user-defined microsummaries.  Just context-click on some text in a page, then select "Watch [the text]" from the context menu.  The prototype will add a bookmark to your bookmarks toolbar whose title is the text you clicked on, then it'll update it regularly.&lt;br /&gt;&lt;br /&gt;Here's a screenshot which demonstrates microsummaries for the three built-in types plus a user-defined microsummary (the number of lines changed in a Bonsai query for "Places checkins in the last day"):&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.melez.com/mozilla/microsummaries/screenshot.png"&gt;&lt;br /&gt;&lt;br /&gt;Note that this is an early prototype.  It has limited functionality, lots of bugs, and relies on the rapidly evolving Places code (so is susceptible to bustage).  Don't rely on it or expect any eventual Firefox feature to work like it.  It's just a proof of concept.&lt;br /&gt;&lt;br /&gt;Also note that it'll take up to 15 seconds for a bookmark you add to the toolbar to start showing a microsummary.  After that, the extension will update the microsummary every 30 minutes.&lt;br /&gt;&lt;br /&gt;Finally, note that Places mucks with your profile, migrating history and bookmarks to new databases.  Make sure you know what you're doing (or are using a fresh profile) when you try out a Places-enabled build.&lt;br /&gt;&lt;br /&gt;If I haven't scared you away yet, then give it a try, and let me know what you think.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.melez.com/mozilla/microsummaries/microsummarizer-0.1.xpi"&gt;Microsummarizer 0.1&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-113933729467683913?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/113933729467683913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=113933729467683913' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/113933729467683913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/113933729467683913'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2006/02/microsummaries-feature-proposal-and.html' title='microsummaries feature proposal and prototype'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-113892305822387374</id><published>2006-02-02T15:30:00.000-08:00</published><updated>2006-02-02T15:37:54.200-08:00</updated><title type='text'>resigning Bugzilla UI module ownership</title><content type='html'>I recently came to the realization that I don't have the time to function as an effective UI module owner for Bugzilla, so I have resigned that position.&lt;br /&gt;&lt;br /&gt;Bugzilla's UI module owner needs to encourage good usability improvements, deflect misguided changes and unintentional regressions, and keep usability central to the development process.&lt;br /&gt;&lt;br /&gt;Although coding can be involved, the role isn't primarily about writing code.  It's about examining and intuiting user needs and behavior, determining how well the current UI meets those needs and supports that behavior, proposing and evaluating beneficial changes, and engaging the development community with reviews and discussion.&lt;br /&gt;&lt;br /&gt;I wanted to do a lot of usability work in the last year, but for a variety of reasons I ended up doing only a small amount, and I expect to have very little time to do this work in the future.  I'll continue to contribute where I can, of course, and I wish the project the best of luck with its UI development efforts.&lt;br /&gt;&lt;br /&gt;If you're interested in helping out with Bugzilla UI development, watch the &lt;a class="moz-txt-link-abbreviated" href="mailto:ui@bugzilla.bugs"&gt;ui@bugzilla.bugs&lt;/a&gt; user on bugzilla.mozilla.org and join the conversations on the &lt;a href="news://news.mozilla.org/mozilla.dev.apps.bugzilla"&gt;mozilla.dev.apps.bugzilla&lt;/a&gt; newsgroup and the &lt;a href="http://bugzilla.org/cgi-bin/mj_wwwusr?func=lists-long-full&amp;amp;extra=developers"&gt;developers@bugzilla.org&lt;/a&gt; mailing list.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-113892305822387374?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/113892305822387374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=113892305822387374' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/113892305822387374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/113892305822387374'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2006/02/resigning-bugzilla-ui-module-ownership.html' title='resigning Bugzilla UI module ownership'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-18929277.post-113702717085242179</id><published>2006-01-11T16:52:00.000-08:00</published><updated>2006-01-11T16:52:50.880-08:00</updated><title type='text'>son of live bookmarks</title><content type='html'>I buy about a dozen items per year on eBay, and when I'm bidding on an item, I add its bookmark to my personal toolbar, then I click that bookmark repeatedly for the duration of the auction just to find out two simple pieces of information: the current bid and the time left.&lt;br&gt; &lt;br&gt; Instead of making me click the link over and over to get that information, Firefox should automatically check the auction periodically on my behalf and add its status to the bookmark label.&amp;nbsp; Then I could keep track of the auction just by glancing at my personal toolbar.&lt;br&gt; &lt;br&gt; Auctions may be my personal itch, but I reckon there are other auctioneers with the same itch, and a feature like this could be handy elsewhere, too.&amp;nbsp; A bookmark to an Amazon product could display the product's current price, for example, while a bookmark to a news site could show its latest headline.&amp;nbsp; Basically, any page with important and regularly-updated but short summary information is a candidate for this feature.&lt;br&gt; &lt;br&gt; It might even be useful to display these summaries in other places--like tabs and window title bars--where the browser currently displays page titles.&amp;nbsp; And it might make sense to define a simple microformat to let the pages themselves specify which of their content represents summary information and how often to update it, although we'd want to allow users to override that where appropriate, just as we let them choose their own bookmark labels.&lt;br&gt; &lt;br&gt; This feature extends a concept that live bookmarks introduced: that bookmarks can display much more than just static links to locations, they can display regularly-updated summaries of those sites.&amp;nbsp; So I'll call this "son of live bookmarks," for lack of a better name, and in homage to the &lt;a  href="http://www.tohokingdom.com/web_pages/reviews/son_of_godzilla.htm"&gt;same cheesy horror flicks&lt;/a&gt; from which Mozilla derived its name.&lt;br&gt; &lt;br&gt; Would you use this feature if it was available?&amp;nbsp; Can you think of other kinds of pages for which the feature would come in handy?&amp;nbsp; Got a better name for it?&amp;nbsp; Comments welcome.&lt;br&gt; &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/18929277-113702717085242179?l=mykzilla.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mykzilla.blogspot.com/feeds/113702717085242179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=18929277&amp;postID=113702717085242179' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/113702717085242179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/18929277/posts/default/113702717085242179'/><link rel='alternate' type='text/html' href='http://mykzilla.blogspot.com/2006/01/son-of-live-bookmarks.html' title='son of live bookmarks'/><author><name>Myk Melez</name><uri>http://www.blogger.com/profile/01837818348188071923</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-U2lRtGpK4g0/TnN8wSMdmkI/AAAAAAAAACI/EDP0MVcG7mM/s220/experimentalist.jpg'/></author><thr:total>11</thr:total></entry></feed>
