<?xml version='1.0' encoding='utf-8'?>

<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Incompleteness</title>
  <link href="http://incompleteness.me/blog/atom.xml" rel="self" />
  <link href="http://incompleteness.me/blog" />
  <updated>2011-12-16T12:22:33+00:00</updated>
  <id>http://incompleteness.me</id>
  <author><name>Joe Walker</name></author>

  <entry>
    <title>Work for Mozilla building Developer Tools</title>
    <link href="http://incompleteness.me/blog/2013/03/07/work-for-mozilla-building-developer-tools/" />
    <updated>2013-03-7T16:30:00+00:00</updated>
    <id>http://incompleteness.me/blog/2013/03/07/work-for-mozilla-building-developer-tools/</id>
    <content type="html">&lt;p&gt;Short version:
&lt;a href="https://twitter.com/paulrouget"&gt;Paul&lt;/a&gt;,
&lt;a href="https://twitter.com/harthvader"&gt;Heather&lt;/a&gt;,
&lt;a href="https://twitter.com/ratcliffe_mike"&gt;Mike&lt;/a&gt;
&lt;a href="https://twitter.com/joewalker"&gt;and I&lt;/a&gt;
are hiring. &lt;a href="http://jobvite.com/m?3T1TJfwg"&gt;Apply here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The built-in developer tools are mostly
&lt;a href="https://github.com/mozilla/mozilla-central/tree/master/browser/devtools"&gt;built in JavaScript&lt;/a&gt;.
So you'll need to be comfortable with using JavaScript to create applications
(rather than just tweaking pages). Obviously our tools are just for Firefox so
we can take advantage of
&lt;a href="https://developer.mozilla.org/en-US/docs/JavaScript/ECMAScript_5_support_in_Mozilla"&gt;ES5&lt;/a&gt; and
&lt;a href="https://developer.mozilla.org/en-US/docs/JavaScript/ECMAScript_6_support_in_Mozilla"&gt;ES6&lt;/a&gt;
features the second they're added to Firefox so knowing about what's new would help too.&lt;/p&gt;&lt;p&gt;But our team is particularly about helping people understand content
(i.e. HTML and CSS) so you'll also need to understand how pages are laid out
and how to get a browser to bow to your bidding. You'll also need to be good
at creating interfaces that people want to use, and fast at learning because
there's a lot to &lt;a href="https://developer.mozilla.org/en-US/docs/The_Mozilla_platform"&gt;our platform&lt;/a&gt;.
Knowing some C++ could be useful too.&lt;/p&gt;&lt;p&gt;Perfect would be if you've spent time in the trenches of web development
thinking "&lt;em&gt;If only the tools would tell me X, Y and Z, I could be soooo much
better&lt;/em&gt;". This is your chance to make millions of people better at their
jobs.&lt;/p&gt;&lt;p&gt;Our team is all around the world, so you can enjoy working from home, and
you'll need to communicate well over IRC, video chat and email. But you'll
also be working on open source software that changes the lives of hundreds of
millions of users worldwide.&lt;/p&gt;&lt;p&gt;If you can help,
&lt;a href="http://jobvite.com/m?3T1TJfwg"&gt;apply here&lt;/a&gt;,
and contact me directly (&lt;a href="https://twitter.com/joewalker"&gt;twitter&lt;/a&gt; or
&lt;code&gt;jwalker at mozilla.com&lt;/code&gt;) to make sure you're in
the system, or to ask questions.&lt;/p&gt;</content>
  </entry><entry>
    <title>Hackathon Summary</title>
    <link href="http://incompleteness.me/blog/2012/06/27/hackathon-summary/" />
    <updated>2012-06-27T13:00:00+00:00</updated>
    <id>http://incompleteness.me/blog/2012/06/27/hackathon-summary/</id>
    <content type="html">&lt;p&gt;So yesterday a whole bunch of people to together to hack on some commands for
the new &lt;a href="http://incompleteness.me/blog/2012/06/18/firefox-command-line/"&gt;Developer
Tools Command Line&lt;/a&gt;. Thanks to everyone that took part.&lt;/p&gt;&lt;p&gt;This is a quick summary of the commands and hacks that we created. We've now
got to work out what to do with them. Some we'll clean up, localize, test and
ship, and some we'll do some we'll suggest putting onto AMO.&lt;/p&gt;&lt;table&gt;
 &lt;tr&gt;
   &lt;th&gt;Command&lt;/th&gt;
   &lt;th&gt;Description&lt;/th&gt;
   &lt;th&gt;Author(s)&lt;/th&gt;
   &lt;th&gt;Source&lt;/th&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;color&lt;/td&gt;
  &lt;td&gt;Several commands to convert between rgb, hex, hsl and color names&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://github.com/elvisds"&gt;elvisds&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://gist.github.com/2998893"&gt;Gist&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;scratchpad&lt;/td&gt;
  &lt;td&gt;Extra commands to open a empty and pre-&lt;span&gt;populated scratchpads&lt;/span&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="http://antennasoft.net/robcee/"&gt;Rob Campbell&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://gist.github.com/2995780"&gt;Gist&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;debugger&lt;/td&gt;
  &lt;td&gt;Several commands to control the debugger&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://blog.mozilla.org/tilt/"&gt;Victor Porof&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://bugzilla.mozilla.org/attachment.cgi?id=636656&amp;amp;action=diff"&gt;Patch&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;tilt refresh&lt;/td&gt;
  &lt;td&gt;Rebuilds the visualization 3D mesh and webpage texture if any changes to the DOM were made&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://blog.mozilla.org/tilt/"&gt;Victor Porof&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://bugzilla.mozilla.org/attachment.cgi?id=636659&amp;amp;action=diff"&gt;Patch&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;calllog&lt;/td&gt;
  &lt;td&gt;Use new Debugger API to log function calls&lt;/td&gt;
  &lt;td&gt;&lt;a href="http://theunfocused.net/"&gt;Blair McBride&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://github.com/Unfocused/gcli-commands/blob/master/calllog.mozcmd"&gt;Repo&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;idl&lt;/td&gt;
  &lt;td&gt;Show the IDL file for a specified XPCOM int&lt;span&gt;erface&lt;/span&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="http://theunfocused.net/"&gt;Blair McBride&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://github.com/Unfocused/gcli-commands/blob/master/idl.mozcmd"&gt;Repo&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;memory&lt;/td&gt;
  &lt;td&gt;Get a memory report for the current page&lt;/td&gt;
  &lt;td&gt;&lt;a href="http://theunfocused.net/"&gt;Blair McBride&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://github.com/Unfocused/gcli-commands/blob/master/memory.mozcmd"&gt;Repo&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;restart&lt;/td&gt;
  &lt;td&gt;Commands to restart Firefox&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://gist.github.com/scrapmac"&gt;Girish Sharma&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://gist.github.com/2995968"&gt;Gist&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;sorttabs&lt;/td&gt;
  &lt;td&gt;Sorts visible tabs based on url&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://gist.github.com/scrapmac"&gt;Girish Sharma&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://gist.github.com/2997619"&gt;Gist&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;addon&lt;/td&gt;
  &lt;td&gt;Commands to enable and disable plugins&lt;/td&gt;
  &lt;td&gt;&lt;a href="http://www.flailingmonkey.com/"&gt;Mike Ratcliffe&lt;/a&gt;, &lt;a href="http://astithas.com/"&gt;Panagiotis Astithas&lt;/a&gt;, &lt;a href="https://github.com/Pimm"&gt;Pimm Hogeling&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://gist.github.com/3003149"&gt;Gist 1&lt;/a&gt;, &lt;a href="https://gist.github.com/2998412"&gt;Gist 2&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;time&lt;/td&gt;
  &lt;td&gt;Time how long it takes a command to run&lt;/td&gt;
  &lt;td&gt;&lt;a href="http://martndemus.nl/"&gt;Marten Schilstra&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://bug768562.bugzilla.mozilla.org/attachment.cgi?id=636791"&gt;Patch&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;date&lt;/td&gt;
  &lt;td&gt;Prints the date to the command line&lt;/td&gt;
  &lt;td&gt;&lt;a href="http://martndemus.nl/"&gt;Marten Schilstra&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://gist.github.com/2997578"&gt;Gist&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;responsive&lt;/td&gt;
  &lt;td&gt;Commands to control responsive mode&lt;/td&gt;
  &lt;td&gt;&lt;a href="http://paulrouget.com/"&gt;Paul Rouget&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://bug751904.bugzilla.mozilla.org/attachment.cgi?id=636648"&gt;Patch&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;loadscript&lt;/td&gt;
  &lt;td&gt;Loads a JavaScript resource into the current page&lt;/td&gt;
  &lt;td&gt;&lt;a href="http://martndemus.nl/"&gt;Marten Schilstra&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://gist.github.com/2998222"&gt;Gist&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;mdn&lt;/td&gt;
  &lt;td&gt;Searches the Mozilla Developer Network&lt;/td&gt;
  &lt;td&gt;&lt;a href="http://martndemus.nl/"&gt;Marten Schilstra&lt;/a&gt;, &lt;a href="http://paulrouget.com/"&gt;Paul Rouget&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://gist.github.com/2998645"&gt;Gist 1&lt;/a&gt;, &lt;a href="https://gist.github.com/1d943933ffb43a72946d"&gt;Gist 2&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;find&lt;/td&gt;
  &lt;td&gt;Go to a tab (fuzzy matched)&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://github.com/espadrine"&gt;Thaddee Tyl&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://github.com/espadrine/mozcmd/blob/master/find.mozcmd"&gt;Repo&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;search&lt;/td&gt;
  &lt;td&gt;Search and replace in page&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://github.com/graememcc"&gt;graememcc&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://gist.github.com/2996890"&gt;Gist&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;bug&lt;/td&gt;
  &lt;td&gt;Open a numbered bug&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://github.com/zombie"&gt;zombie&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://gist.github.com/3000409"&gt;Gist&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;basename/dirname&lt;/td&gt;
  &lt;td&gt;Split up file paths&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://twitter.com/fitzgen"&gt;Nick Fitzgerald&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://github.com/joewalker/mozcmd/pull/4"&gt;Pull&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;qsa&lt;/td&gt;
  &lt;td&gt;Perform querySelectorAll on the current document and return number of matches&lt;/td&gt;
  &lt;td&gt;&lt;a href="http://twitter.com/zii"&gt;Zach Carter&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://gist.github.com/3000231"&gt;Gist&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;jsbeautifier&lt;/td&gt;
  &lt;td&gt;Loads a URL, JS-beautifies it, and opens a new tab with the result&lt;/td&gt;
  &lt;td&gt;&lt;a href="http://www.open-mike.org/about"&gt;Mike Hanson&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://github.com/michaelrhanson/mozcmd"&gt;Repo&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;replace/rm/export&lt;/td&gt;
  &lt;td&gt;Commands to edit and export page details&lt;/td&gt;
  &lt;td&gt;&lt;a href="http://www.robodesign.ro/mihai/blog"&gt;Mihai Sucan&lt;/a&gt;&lt;/td&gt;
  &lt;td&gt;&lt;a href="https://github.com/joewalker/mozcmd/pull/1"&gt;Pull&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
&lt;/table&gt;&lt;p style="text-align: center;"&gt;
  &lt;a href="http://www.flickr.com/photos/robceemoz/322394517"&gt;
    &lt;img src="http://incompleteness.me/images/posts/hackathon2.jpg" alt="people hacking" /&gt;
  &lt;/a&gt;
&lt;/p&gt;</content>
  </entry><entry>
    <title>Command Line Hackathon Details</title>
    <link href="http://incompleteness.me/blog/2012/06/25/hackathon-details/" />
    <updated>2012-06-24T13:00:00+00:00</updated>
    <id>http://incompleteness.me/blog/2012/06/25/hackathon-details/</id>
    <content type="html">&lt;p&gt;I &lt;a href="http://incompleteness.me/blog/2012/06/20/command-line-hackathon/"&gt;promised&lt;/a&gt;
details of how to take part in the command line hackathon on June 26th ...&lt;/p&gt;&lt;h2&gt;Getting Started&lt;/h2&gt;&lt;p&gt;The command line is part of the developer toolbar, which is currently
prefed off. You enable it by visiting &lt;code&gt;about:config&lt;/code&gt; in Firefox and
setting &lt;code&gt;devtools.toolbar.enabled&lt;/code&gt; to true and restarting.&lt;/p&gt;&lt;p&gt;Then use the new Tools → Web Developer → Developer Toolbar menu or
press &lt;code&gt;Ctrl+Shift+V&lt;/code&gt; (Win/Linux) or &lt;code&gt;Alt+Cmd+V&lt;/code&gt; (Mac) to
open the toolbar&lt;/p&gt;&lt;p&gt;If you want a way to keep your commands around, you'll want to use the
command directory method, if you just want a quick hack, use scratchpad.&lt;/p&gt;&lt;h3&gt;Creating commands with Scratchpad&lt;/h3&gt;&lt;p&gt;Make sure you've &lt;a href="http://antennasoft.net/robcee/2011/05/10/scratchpad-nee-workspace-web-developer-menu-landed/"&gt;enabled
chrome privilages on your scratchpad&lt;/a&gt;. Then &lt;a href="https://gist.github.com/2944612"&gt;start
with a template like this&lt;/a&gt;, and your ready to play.&lt;/p&gt;&lt;p&gt;See the docs &lt;a href="https://developer.mozilla.org/en/Tools/GCLI/Scratchpad"&gt;creating
commands with scratchpad&lt;/a&gt; on MDN for more.&lt;/p&gt;&lt;h3&gt;Creating commands from a Command Directory&lt;/h3&gt;&lt;p&gt;Find somewhere to store commands and copy &lt;a href="https://github.com/joewalker/mozcmd/blob/master/hello.mozcmd"&gt;this template&lt;/a&gt;
to a file called &lt;code&gt;hello.mozcmd&lt;/code&gt; (or you could clone the repo which
could come in handy for submitting your commands). The filename isn't important
but it should end &lt;code&gt;.mozcmd&lt;/code&gt;. Then tell Firefox where your directory
is with this command: &lt;code&gt;pref set devtools.commands.dir &amp;lt;PATH-TO-DIR&amp;gt;&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Then refresh the commands from the command dir using &lt;code&gt;cmd refresh&lt;/code&gt;
and try out the new command: &lt;code&gt;hello&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;See the docs &lt;a href="https://developer.mozilla.org/en/Tools/GCLI/Scratchpad"&gt;creating
commands with scratchpad&lt;/a&gt; on MDN for more.&lt;/p&gt;&lt;h2&gt;Finding Out More&lt;/h2&gt;&lt;p&gt;You can probably guess most of what you need from &lt;a href="https://github.com/joewalker/mozcmd/blob/master/hello.mozcmd"&gt;the example&lt;/a&gt;,
however there is &lt;a href="https://developer.mozilla.org/en/Tools/GCLI/Writing_GCLI_Commands"&gt;documentation and links&lt;/a&gt; on MDN if you need more detail.&lt;/p&gt;&lt;h2&gt;Taking Part&lt;/h2&gt;&lt;p&gt;We're collecting ideas for commands on
&lt;a href="https://etherpad.mozilla.org/command-line-hackathon"&gt;https://etherpad.mozilla.org/command-line-hackathon&lt;/a&gt;,
and we'll keep that updated during the day to coordinate things.&lt;/p&gt;&lt;p&gt;To get help and support, the best option is #devtools on irc.mozilla.org
(SSL:on, Port:6697) or see &lt;a href="https://wiki.mozilla.org/IRC"&gt;the connection
docs&lt;/a&gt; or use IRC on the web at &lt;a href="http://chat.mibbit.com"&gt;mibbit.com&lt;/a&gt;
(Connect to Mozilla, Channel: #devtools).&lt;/p&gt;&lt;div&gt;
  &lt;a href="http://www.flickr.com/photos/robhawkes/7231923050/"&gt;
    &lt;img src="http://incompleteness.me/images/posts/hackathon3.jpg" alt="people hacking" /&gt;
  &lt;/a&gt;
&lt;/div&gt;&lt;h2&gt;How to raise a bug&lt;/h2&gt;&lt;p&gt;Use &lt;a href="https://bugzilla.mozilla.org/enter_bug.cgi?alias=&amp;amp;assigned_to=nobody%40mozilla.org&amp;amp;blocked=&amp;amp;bug_file_loc=http%3A%2F%2F&amp;amp;bug_severity=normal&amp;amp;bug_status=NEW&amp;amp;cf_blocking_basecamp=---&amp;amp;cf_blocking_kilimanjaro=---&amp;amp;cf_crash_signature=&amp;amp;cf_status_esr10=---&amp;amp;cf_status_firefox13=---&amp;amp;cf_status_firefox14=---&amp;amp;cf_status_firefox15=---&amp;amp;cf_status_firefox16=---&amp;amp;cf_tracking_esr10=---&amp;amp;cf_tracking_firefox13=---&amp;amp;cf_tracking_firefox14=---&amp;amp;cf_tracking_firefox15=---&amp;amp;cf_tracking_firefox16=---&amp;amp;comment=%0D%0AWhat%20did%20you%20do%20%28steps%20to%20reproduce%29%3F%0D%0A%0D%0A%0D%0AWhat%20happened%3F%0D%0A%0D%0A%0D%0AWhat%20should%20have%20happened%3F%0D%0A%0D%0A&amp;amp;component=Developer%20Tools%3A%20Console&amp;amp;contenttypeentry=&amp;amp;contenttypemethod=autodetect&amp;amp;contenttypeselection=text%2Fplain&amp;amp;data=&amp;amp;defined_groups=1&amp;amp;dependson=&amp;amp;description=&amp;amp;flag_type-203=X&amp;amp;flag_type-325=X&amp;amp;flag_type-37=X&amp;amp;flag_type-41=X&amp;amp;flag_type-5=X&amp;amp;flag_type-607=X&amp;amp;flag_type-720=X&amp;amp;flag_type-721=X&amp;amp;flag_type-737=X&amp;amp;flag_type-748=X&amp;amp;flag_type-775=X&amp;amp;flag_type-780=X&amp;amp;flag_type-781=X&amp;amp;form_name=enter_bug&amp;amp;keywords=&amp;amp;maketemplate=Remember%20values%20as%20bookmarkable%20template&amp;amp;op_sys=All&amp;amp;priority=--&amp;amp;product=Firefox&amp;amp;qa_contact=developer.tools.console%40firefox.bugs&amp;amp;rep_platform=All&amp;amp;requestee_type-203=&amp;amp;requestee_type-325=&amp;amp;requestee_type-41=&amp;amp;requestee_type-5=&amp;amp;requestee_type-607=&amp;amp;requestee_type-748=&amp;amp;requestee_type-781=&amp;amp;short_desc=GCLI&amp;amp;status_whiteboard=&amp;amp;target_milestone=---&amp;amp;version=Trunk"&gt;this link&lt;/a&gt;
to tell us about any problems with the command line.&lt;/p&gt;&lt;h2&gt;Submitting a Command&lt;/h2&gt;&lt;p&gt;You can submit a command any of the following ways:&lt;p&gt;

&lt;ol&gt;
  &lt;li&gt;Fork &lt;a href="https://github.com/joewalker/mozcmd"&gt;this repo&lt;/a&gt; and
  create a pull request (preferred)&lt;/li&gt;
  &lt;li&gt;Create a new etherpad containing your submission and put a link to your
  new etherpad in the &lt;a href="https://etherpad.mozilla.org/command-line-hackathon"&gt;main
  etherpad&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Email it to jwalker at mozilla.com.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Whichever way you choose, please include the following in your submission so
we know you're happy for us to distribute your work:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Signed-off-by: Your Name &amp;lt;email@example.com&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Adding this text is a statement that you have the right to contribute the
code under the MPLv2 for inclusion in the Mozilla codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hope to see you on June 26th&lt;/strong&gt;&lt;/p&gt;

&lt;/p&gt;&lt;/p&gt;</content>
  </entry><entry>
    <title>Firefox Command Line Hackathon</title>
    <link href="http://incompleteness.me/blog/2012/06/20/command-line-hackathon/" />
    <updated>2012-06-20T12:00:00+00:00</updated>
    <id>http://incompleteness.me/blog/2012/06/20/command-line-hackathon/</id>
    <content type="html">&lt;p&gt;TL;DR: On June 26th, the Firefox developer tools team is holding a hackathon to
add to the list of commands for the Firefox developers toolbar.

&lt;/p&gt;&lt;aside&gt;
  &lt;a href="http://www.flickr.com/photos/donotlick/5272510170"&gt;
    &lt;img src="http://incompleteness.me/images/posts/hackathon1.jpg" alt="people hacking" /&gt;
  &lt;/a&gt;
&lt;/aside&gt;&lt;p&gt;See this recent &lt;a href="http://incompleteness.me/blog/2012/06/18/firefox-command-line/"&gt;blog post for context on the new developers command line&lt;/a&gt;.

&lt;/p&gt;&lt;p&gt;I'm in the process of finishing off &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=724055"&gt;bug 724055&lt;/a&gt; which will make it as
easy as is possible to create new commands, just set a pref to point to a
directory where your commands are stored in JSON (ish) files, and you're done.

&lt;/p&gt;&lt;p&gt;In the next few days I'll update this post (Update: &lt;a href="http://incompleteness.me/blog/2012/06/25/hackathon-details/"&gt;see here&lt;/a&gt;)
with a set of resources for creating commands and ideas for commands.
We'll hang out in IRC and crank away and see how many commands we can get
written in a day.

&lt;/p&gt;&lt;p&gt;If you can spare some time, we'd love to have some help.

&lt;/p&gt;&lt;p&gt;&lt;small&gt;Update: Originally this post had a date typo and said the 27th. The real date
is the 26th.&lt;/small&gt;

&lt;/p&gt;</content>
  </entry><entry>
    <title>Firefox Command Line for Developers</title>
    <link href="http://incompleteness.me/blog/2012/06/18/firefox-command-line/" />
    <updated>2012-06-18T12:00:00+00:00</updated>
    <id>http://incompleteness.me/blog/2012/06/18/firefox-command-line/</id>
    <content type="html">&lt;p&gt;TL;DR: We're adding a toolbar to Firefox, for developers, which includes a
command line.
It's a great place to add small tools and experimental features, and we're
making it easy to add your own commands.

&lt;/p&gt;&lt;p&gt;The toolbar should land in Firefox 16 or 17 and will look like this:

&lt;/p&gt;&lt;div style="overflow-x: hidden;"&gt;
  &lt;img src="http://incompleteness.me/images/posts/gcli-look-mac.png" alt="GCLI on a Mac" /&gt;
&lt;/div&gt;&lt;p&gt;The buttons are useful, but I'm most excited about the commands.
We can add an almost unlimited set of commands here without cluttering up the
UI, or making things slow, and we've done lots of work to make the command line
easy to use.

&lt;/p&gt;&lt;p&gt;The challenge: It might be stretching things a little to call the command line
a 'platform', and commands 'apps', but the command line still needs commands to
be successful. There's a list of commands that we're working on for
manipulating Firefox developer tools, and we'll be expanding this list to
include system level commands too.

&lt;/p&gt;&lt;p&gt;We're planning on a hackathon in a couple of weeks to add to the list of
commands and to check that it really as as easy as we think it is to extend.
Details soon.

&lt;/p&gt;&lt;p&gt;If you want to try it out, it's in Nightly now, you'll need to flip the
&lt;code&gt;devtools.toolbar.enable&lt;/code&gt; preference in &lt;code&gt;about:config&lt;/code&gt;.
&lt;/p&gt;</content>
  </entry><entry>
    <title>Combating Self-XSS</title>
    <link href="http://incompleteness.me/blog/2011/12/14/combating-self-xss/" />
    <updated>2011-12-14T12:00:00+00:00</updated>
    <id>http://incompleteness.me/blog/2011/12/14/combating-self-xss/</id>
    <content type="html">&lt;aside&gt;
  &lt;img src="http://incompleteness.me/images/posts/self-xss-gun.png" alt="gun with barrel pointing at user" /&gt;
  &lt;div&gt;Friends don't let friends etc&lt;/div&gt;
&lt;/aside&gt;&lt;h3&gt;What is Self-XSS?&lt;/h3&gt;&lt;p&gt;Dr. Evil has several options for getting his script to execute in the page of
another site. Generically we call this &lt;a href="https://en.wikipedia.org/wiki/Cross-site_scripting"&gt;XSS&lt;/a&gt;. Self-XSS involves using
social engineering to coerce a user into manually executing JavaScript using
the location bar or developer tools.
For more, see &lt;a href="https://blogs.msdn.com/themes/blogs/generic/post.aspx?WeblogApp=ieinternals&amp;amp;WeblogPostName=socially-engineered-xss-attacks-and-pasting-javascript-in-the-address-bar-in-ie9"&gt;socially-engineered XSS attacks&lt;/a&gt;.

&lt;/p&gt;&lt;p&gt;The &lt;a href="http://blog.commtouch.com/cafe/web-security/nasty-facebook-picture-attack-based-on-self-xss/"&gt;recent Facebook attack&lt;/a&gt; signals that something needs to be done, but
knowing the right response is tricky.

&lt;/p&gt;&lt;h3&gt;What is Mozilla doing about it?&lt;/h3&gt;&lt;p&gt;We're proposing adding a directive to &lt;a href="https://developer.mozilla.org/en/Security/CSP"&gt;CSP&lt;/a&gt; that says &lt;em&gt;'Please disallow
user supplied JavaScript in the context of this resource'&lt;/em&gt;.

&lt;/p&gt;&lt;p&gt;It will probably look something like this:

&lt;/p&gt;&lt;pre&gt;&lt;code&gt;X-Content-Security-Policy: no-user-js&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We're also going to add a way for developers to opt out of this protection.
Effectively saying &lt;em&gt;'I can take care of the JavaScript that I ask my browser to
execute'&lt;/em&gt;.


&lt;/p&gt;&lt;h3&gt;How does this affect other Firefox developer tools?&lt;/h3&gt;&lt;p&gt;It doesn't. &lt;a href="https://hacks.mozilla.org/2011/11/developer-tools-in-firefox-aurora-10/"&gt;The Highligher, Style Inspector&lt;/a&gt;, &lt;a href="https://wiki.mozilla.org/DevTools/Features/CSSEditor"&gt;Style Editor&lt;/a&gt; and
&lt;a href="https://blog.mozilla.com/tilt/"&gt;Tilt&lt;/a&gt; are all unaffected. This is only about JavaScript executed via
the Web Console and &lt;a href="https://blog.mozilla.com/devtools/2011/08/15/introducing-scratchpad/"&gt;Scratchpad&lt;/a&gt;.

&lt;/p&gt;&lt;h3&gt;How does this affect users?&lt;/h3&gt;&lt;div&gt;
&lt;style&gt;
table.custom { border-collapse: collapse; }
table.custom td, table.custom th { border: 1px solid #aaa; padding: 5px; }
table.custom th { text-align: center; }
&lt;/style&gt;
&lt;/div&gt;&lt;table class="custom"&gt;
  &lt;tr&gt;
    &lt;th colspan="2" rowspan="2"&gt;User&lt;/th&gt;
    &lt;th colspan="2"&gt;Is a developer?&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;No&lt;/th&gt;
    &lt;th&gt;Yes&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th rowspan="2"&gt;Can recognize Self-XSS attack?&lt;/th&gt;
    &lt;th&gt;No&lt;/th&gt;
    &lt;td&gt;Added Self-XSS attacks protection.&lt;/td&gt;
    &lt;td&gt;Warned about Self-XSS, may benefit from protection.&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;Yes&lt;/th&gt;
    &lt;td&gt;Unchanged&lt;/td&gt;
    &lt;td&gt;Minor inconvenience of having to set a preference (one time only) to enable user JavaScript on sites using this Self-XSS protection.&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;&lt;p&gt;I think this is a fairly clear net win: Minor, one time only, inconvenience to
a sub-set of web developers, vs. full-time protection for the many that
wouldn't recognize a self-xss attack.


&lt;/p&gt;&lt;h3&gt;Objections: This is a user problem&lt;/h3&gt;&lt;p&gt;The goal of educating 7 billion people about what JavaScript can do is lofty,
grandiose, ambitious and utterly unattainable. There has to be another solution.


&lt;/p&gt;&lt;h3&gt;Objections: This is a Facebook problem&lt;/h3&gt;&lt;p&gt;While it's true that allowing untrusted, unvetted, third party, dynamic content
onto your site is something to avoid, I don't think that fixing this either is
going to happen, or would fix the problem. The attack could easily forward you
to another site to see the clipboard injecting flash, before returning you to
the original site for the 'paste' step.


&lt;/p&gt;&lt;h3&gt;Objections: This is a Flash problem&lt;/h3&gt;&lt;p&gt;While it's true that Adobe's clipboard policies are more relaxed than those of
major web browsers, we've seen people caught by instructions that ask people to
select/copy their own attack script. We think that the level of pain caused to
developers by the CSP solution is low enough that we can justify the additional
protection.

&lt;/p&gt;</content>
  </entry><entry>
    <title>Marketing (according to the browser makers)</title>
    <link href="http://incompleteness.me/blog/2010/09/13/marketing-according-to-the-browser-makers/" />
    <updated>2010-09-13T16:47:32+00:00</updated>
    <id>http://incompleteness.me/blog/2010/09/13/marketing-according-to-the-browser-makers/</id>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Mozilla: &lt;a href="http://twitter.com/paulrouget/status/19734735459"&gt;Go Open Web, Go Mozilla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Google: &lt;a href="http://twitter.com/diveintomark/status/21115916946"&gt;Go Google, Go Open Web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Apple: &lt;a href="http://www.guardian.co.uk/technology/blog/2010/jun/04/html5-apple-browser-standard-mistake"&gt;Go Apple&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Microsoft: &lt;a href="http://tech.slashdot.org/story/10/09/12/2018229/IE9-Team-Says-Our-GPU-Acceleration-Is-Better-Than-Yours"&gt;The others are teh suck&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry><entry>
    <title>Apple and Adobe, Obituaries and Idealism</title>
    <link href="http://incompleteness.me/blog/2010/02/01/apple-and-adobe-obituaries-and-idealism/" />
    <updated>2010-02-1T07:22:00+00:00</updated>
    <id>http://incompleteness.me/blog/2010/02/01/apple-and-adobe-obituaries-and-idealism/</id>
    <content type="html">&lt;p&gt;Practical reasons for thinking that Flash is dying:

&lt;ol&gt;
&lt;li&gt;You can't get flash on an iPhone, iPod or iPad
&lt;li&gt;&lt;a href="http://lists.w3.org/Archives/Public/public-html/2009Sep/0049.html"&gt;IE9 looks like it could get HTML5 video&lt;/a&gt;
&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;Idealistic reasons why Flash should be dying:

&lt;ol&gt;
&lt;li&gt;The spec is controlled by a single entity.
&lt;li&gt;The Flash wire-format is binary. View-source is important.
&lt;li&gt;The Flash runtime can't be fully open-sourced due to patent encumbered codecs.
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;It's obvious, but you can't beat a good venn diagram:

&lt;p&gt;&lt;img src="http://incompleteness.me/images/posts/flash-death.png" alt="ven diagram showing that practice and idealism are non-overlapping sets" /&gt;

&lt;p&gt;The Idealism isn't having much effect.

&lt;h3&gt;Apple&lt;/h3&gt;

&lt;p&gt;There's a parallel post to this one, with the subject being the iPad instead of Flash, and that it's a Bad Thing when you're &lt;a href="http://al3x.net/2010/01/28/ipad.html"&gt;not allowed to tinker with devices that you own&lt;/a&gt;.

&lt;p&gt;Idealistically the world would wait until something Chromey, Androidy, WebOSy or Maemoy came along out of principle. But we all know &lt;a href="http://twitter.com/diveintomark/status/8292775700"&gt;that's not going to happen&lt;/a&gt; however much we complain.

&lt;p&gt;Shame really. All the talk is for nothing.

&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
  </entry><entry>
    <title>Collaboration in Bespin</title>
    <link href="http://incompleteness.me/blog/2009/08/13/collaboration-in-bespin/" />
    <updated>2009-08-13T16:29:02+00:00</updated>
    <id>http://incompleteness.me/blog/2009/08/13/collaboration-in-bespin/</id>
    <content type="html">&lt;p&gt;Recently I've been working on adding collaboration features to Bespin, Mozilla's web code editor. Today they're getting pushed out into &lt;a href="http://bespin.mozilla.com"&gt;bespin.mozilla.com&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Enhanced collaboration is one of the best reasons to do an IDE on the web. It’s possible in a traditional IDE or code editor, but there are lots of features of a web based editor that make it an obvious thing to do on the web.&lt;/p&gt;&lt;p&gt;Our new collaboration feature is still fairly new, and like the rest of Bespin, still fairly beta, but we’ve got it working in Firefox, Safari and Chrome right now.&lt;/p&gt;&lt;p&gt;We’ve released a webcast showing it off here:&lt;/p&gt;&lt;object width="647" height="529"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6036944&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=6036944&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="647" height="529" /&gt;&lt;/object&gt;&lt;h2&gt;Taking it for a spin&lt;/h2&gt;&lt;p&gt;Want a go real quick? Here are the steps:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Sign up or login &lt;a href="https://bespin.mozilla.com/" target="_blank"&gt;to Bespin&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Press CTRL+J/CMD+J to open the command line.&lt;/li&gt;
&lt;li&gt;Type '&lt;code&gt;follow joewalker&lt;/code&gt;' to get someone to share files with. I've shared a project called pubproj globally.&lt;/li&gt;
&lt;li&gt;Type '&lt;code&gt;project list&lt;/code&gt;'. You should see &lt;code&gt;joewalker+pubproj&lt;/code&gt; in your list of projects.&lt;/li&gt;
&lt;li&gt;Type '&lt;code&gt;set collaborate on&lt;/code&gt;' to turn on shared editing.&lt;/li&gt;
&lt;li&gt;Open a shared file by typing '&lt;code&gt;open /joewalker+pubproj/example.txt&lt;/code&gt;'.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Or, in one graphic:&lt;/p&gt;&lt;img src="http://incompleteness.me/images/posts/collab-steps.png" /&gt;&lt;p&gt;You should then be in a collaborative editing session with the rest of the Internet.&lt;/p&gt;&lt;p&gt;Click on the collaboration icon (2 people) in the top right hand corner show you who's editing with you.&lt;/p&gt;&lt;img src="http://incompleteness.me/images/posts/collab-people.png" /&gt;&lt;h2&gt;How it Works&lt;/h2&gt;&lt;p&gt;There are 2 parts to what's new. Firstly there's a way to decide who you want to share stuff with and secondly there's the shared editor.  We’re adding 3 or 4 new commands:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;follow/unfollow&lt;/strong&gt;: allow you to decide whose shared projects you want to see in your project navigator. We've gone for a lightweight &lt;a href="http://twitter.com/joewalker"&gt;Twitter&lt;/a&gt; style model so it's easy to get started. As we evolve Bespin this will become a way to get all sorts of information about the people you are working with

&lt;li&gt;&lt;strong&gt;group&lt;/strong&gt;: allows you to put the people you are interested in into groups to make it easy to manage sharing

&lt;li&gt;&lt;strong&gt;share&lt;/strong&gt;: allows you to export your projects read-only or editable to individuals, groups, or to everyone
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Expressing an interest in someone is as easy as “&lt;code&gt;follow username&lt;/code&gt;”. You can then group these users together to make sharing easier. So for me to add Kevin, Ben and Dion to a group, I would do “&lt;code&gt;group add mozlabs Kevin ben dion&lt;/code&gt;”. Grouping people like this is totally optional, but it will make maintaining sharing rules a lot easier going forward, when you’re working on a number of projects.&lt;/p&gt;&lt;p&gt;Then if you want to share a project in read-only mode, to someone that is following you, you just type: “&lt;code&gt;share add projectname username&lt;/code&gt;”. Replace username with groupname to share with one of your defined groups, or with “&lt;code&gt;everyone&lt;/code&gt;” to just throw everything wide open. To allow editing you add “&lt;code&gt;edit&lt;/code&gt;” to the end. So for ultimate wiki-like promiscuity: “&lt;code&gt;share add projectname everyone edit&lt;/code&gt;”.&lt;/p&gt;&lt;p&gt;Projects shared to you by people you follow will now show up in your file-explorer, or you can edit them from the command line. Type “&lt;code&gt;load /owner+projectname/path/to/file&lt;/code&gt;”.&lt;/p&gt;&lt;h2&gt;Future Extensions&lt;/h2&gt;&lt;p&gt;We’re currently using &lt;a href="http://code.google.com/p/google-mobwrite/"&gt;Mobwrite&lt;/a&gt; to provide the diffing and synchronization with some additions to allow us to share collaborator information. We’re hopeful that we will be able to share collaboration systems with a number of other editors in the future. Various developers are working on plug-ins for GEdit, Eclipse, emacs, etc.&lt;/p&gt;&lt;p&gt;Other things that we’re working on include plans for a quick share mode where you can grab a URL post it to an IRC session and instantly be in a shared edit session with the other IRC users.&lt;/p&gt;&lt;p&gt;We've also been discussing in-page chat. We've left it for now because many Bespin users will already have IM or IRC or even Skype or similar, and we want to do something smart with the chat transcripts other than just throwing them away.&lt;/p&gt;&lt;p&gt;Next we’ll be working on getting smooth undo so you have a time machine that can smoothly walk through changes from the current revision back in time through recent saves, and into VCS history, and then into a more lightweight collaboration where when 2 people have 2 check-outs of 1 file, they can both see each others changes to reduce merge pain, without directly affecting each others work.&lt;/p&gt;</content>
  </entry><entry>
    <title>Command Lines</title>
    <link href="http://incompleteness.me/blog/2009/05/27/command-lines/" />
    <updated>2009-05-27T20:08:19+00:00</updated>
    <id>http://incompleteness.me/blog/2009/05/27/command-lines/</id>
    <content type="html">&lt;p&gt;When I was fresh out of college, my first job was working for the &lt;a href="http://www.opengroup.org/"&gt;OpenGroup&lt;/a&gt;, and my command line looked something like this:&lt;/p&gt;&lt;img src="http://incompleteness.me/images/posts/motif.png" /&gt;&lt;p&gt;In 2009, fired by the white heat of years of cutting edge research and development, my command line looks a lot more like this:&lt;/p&gt;&lt;img src="http://incompleteness.me/images/posts/terminal.png" /&gt;&lt;p&gt;To be fair, we've now got transparency, anti-aliasing, our shells now do better completion. But that's about it for changes. Considering how much the rest of the industry has changed, that's shockingly glacial.&lt;/p&gt;&lt;p&gt;For the past week or so, I've had the privilege of working on the &lt;a href="http://bespin.mozilla.com/"&gt;Bespin&lt;/a&gt; command line, and I think there's a lot that we can do to make things better.&lt;/p&gt;&lt;p&gt;This is what my Bespin command line looks like now:&lt;/p&gt;&lt;img src="http://incompleteness.me/images/posts/main.png" /&gt;&lt;p&gt;This post is all about how we can make command lines better.&lt;/p&gt;&lt;p&gt;The core of the unix command line philosophy seems to be: &lt;a href="http://www.faqs.org/docs/artu/ch01s06.html"&gt;small programs and pipe&lt;/a&gt;. There’s a lot to be said for &lt;a href="http://en.wikipedia.org/wiki/Loose_coupling"&gt;loose coupling&lt;/a&gt; but there are some drawbacks as well...&lt;/p&gt;&lt;h2&gt;Zsh&lt;/h2&gt;&lt;p&gt;I love Zsh, and love the fancy completion that it does. Basic file completion has been around since ksh, IIRC:&lt;/p&gt;&lt;pre&gt;
$ ls &lt;strong&gt;[TAB]&lt;/strong&gt;
Applications/  Mesh/       Projects/
Desktop/       Movies/     Public/
Documents/     Music/      Sites/
Downloads/     Parallels/  backup/
Library/       Pictures/   bin/
&lt;/pre&gt;&lt;p&gt;But zsh can complete against more than just files:&lt;/p&gt;&lt;pre&gt;
$ telnet &lt;strong&gt;[TAB]&lt;/strong&gt;
192.168.0.1
192.168.0.12
download.directwebremoting.org
download.dojotoolkit.org
getahead.org
hg.mozilla.com
localhost
people.mozilla.com
sandbox.dojotoolkit.org
svn.directwebremoting.org
&lt;/pre&gt;&lt;p&gt;Zsh knows that you don’t telnet to a file, so it completes against hosts (Does anyone know where that host list came from BTW?)&lt;/p&gt;&lt;p&gt;Zsh also knows about other commands:&lt;/p&gt;&lt;pre&gt;
$ git &lt;strong&gt;[TAB]&lt;/strong&gt;
add                 -- add paths to the index
apply               -- apply patch on a git index file and a work tree
applymbox           -- apply patches from a mailbox
applypatch          -- apply one patch extracted from an e-mail
archimport          -- import an Arch repository into git
bisect              -- find the change that introduced a bug
branch              -- create and show branches
checkout            -- checkout and switch to a branch
cherry              -- find commits not merged upstream
cherry-pick         -- cherry-pick the effect of an existing commit
clone               -- clones a repository into a new directory
commit              -- record changes to the repository
...
&lt;/pre&gt;&lt;p&gt;That list of commands is the result of a 'git help' command, but that's not what I typed. Zsh has been doing something funky behind my back when I pressed [TAB].&lt;/p&gt;&lt;p&gt;Zsh can do different things depending on where in a command you are:&lt;/p&gt;&lt;pre&gt;
$ git add &lt;strong&gt;[TAB]&lt;/strong&gt;
Applications/  Mesh/       Projects/
Desktop/       Movies/     Public/
Documents/     Music/      Sites/
Downloads/     Parallels/  backup/
Library/       Pictures/   bin/
&lt;/pre&gt;&lt;p&gt;My point, is that, whilst all of this is very clever, the implementation is also &lt;em&gt;insane&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;In order to make this work, the zsh guys have had to reverse engineer every single unix command (or at least all most of the ones that I use). And any time those commands change, then zsh is going to have to change too.&lt;/p&gt;&lt;p&gt;It's very useful, and I'm glad that zsh has done it, and they probably didn't have much of a choice, but this way of going about things is not the Best Idea ever.&lt;/p&gt;&lt;p&gt;I'm sure somewhere the bash guys are working on the same feature themselves, or maybe they've already done it. I don’t care - it just strengthens the point about the lunacy of the situation.&lt;/p&gt;&lt;p&gt;The Unix philosophy of small programs and pipe has a lot to be said for it, but there are serious drawbacks too.&lt;/p&gt;&lt;p&gt;Here's some of the ways that we're innovating when it comes to the Bespin command line, and benefiting from being about to integrate things better.&lt;/p&gt;&lt;h2&gt;GUI integration&lt;/h2&gt;&lt;p&gt;Traditionally you've had a set of shells (bash, zsh, etc) that work in a set of terminal emulators (xterm, terminal, gnome-terminal, konsole, etc) But there's so much more you could do if you had one program do both.&lt;/p&gt;&lt;img src="http://incompleteness.me/images/posts/gui-integ.png" /&gt;&lt;p&gt;In Bespin:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;If you click on an old command, it gets copied to the prompt (the blue highlight is a mouseover).&lt;/li&gt;
&lt;li&gt;If you double click it's re-executed.&lt;/li&gt;
&lt;li&gt;Output is not restricted to ascii in a grid. We (predictably) use HTML.&lt;/li&gt;
&lt;li&gt;Error output is visually different to normal output&lt;/li&gt;
&lt;li&gt;You can minimize or maximize output (the help output has been minimized above) - I hate it when a vcs diff operation takes up 4k lines of scrollback obliterating what I wanted to see.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;There's no reason why you couldn't do this in Unix (or even Windows). I don't think you’d want such a gui-shell as your login shell, but since its use is very much from within a GUI, that's OK - you’d probably launch it from the GUI anyway.&lt;/p&gt;&lt;p&gt;In Bespin we don't have pipes yet, but would it be neat to be able to inspect a pipeline visually as it's working, I'm sure it's possible with a gui-shell.&lt;/p&gt;&lt;h2&gt;Linking Output to Commands&lt;/h2&gt;&lt;p&gt;We link the output from a command to the command that created it. The obvious effect is that output from slow running commands no longer gets confused with what's happening now.&lt;/p&gt;&lt;object width="647" height="529"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=4868659&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=4868659&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="647" height="529" /&gt;&lt;/object&gt;&lt;p&gt;The 'slow' command is just something I hacked up to demonstrate asynchronous behavior.&lt;/p&gt;&lt;p&gt;A nice upshot of this is that we can implicitly add &amp;amp; to the end of every command, and you no longer have to wait for anything.&lt;/p&gt;&lt;p&gt;In essence, each command has it’s own separate stdout, which goes to it’s own div. Maybe there is a reason why unix shells don’t do something similar. Would it mean shells being curses based or something?&lt;/p&gt;&lt;h2&gt;Command Meta-Data&lt;/h2&gt;&lt;p&gt;With the exception of the reverse-engineering of the command line structure done by zsh, the integration between commands and the shell is limited. In Bespin, a command is a structure like this&lt;/p&gt;&lt;pre&gt;
{
    name: 'createproject',
    takes: ['projectname'],
    preview: 'create a new project',
    usage: '[newprojectname]',
    execute: function(commandLine, projectname) {
        /* code to do the work */
    }
}
&lt;/pre&gt;&lt;p&gt;This means that we can provide help as the user is typing. The idea is that TAB will guess what you want to do at all times.&lt;/p&gt;&lt;p&gt;This ties in a lot with GUI integration too. If the command line knows that the next parameter is a file, when the user presses TAB without typing anything to complete on, we can offer a dialog to allow selection of a file, and so on. This isn’t about forcing the user to switch to the mouse, but it is about allowing better feedback from the system about what options are available.&lt;/p&gt;&lt;p&gt;We've only really got started with this part - there’s a lot more work to do. I hope we'll be able to do some of the funky GUI integration that &lt;a href="http://labs.mozilla.com/projects/ubiquity/"&gt;Ubiquity&lt;/a&gt; has been pioneering.&lt;/p&gt;&lt;h2&gt;Attention Guides&lt;/h2&gt;&lt;p&gt;There's a lot to look at on any command line, I want to find ways to keep the most important bits in front of your eyes at all times. I'd like to expire older commands more intelligently than a standard terminal (oldest dies first), Commands are more important if:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;They are still in progress&lt;/li&gt;
&lt;li&gt;They keep being re-executed&lt;/li&gt;
&lt;li&gt;They are waiting for input&lt;/li&gt;
&lt;li&gt;etc&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;We've only basically started on this right now, with the ability to hide/show output, but there's potential for it to make the command line lots more usable.&lt;/p&gt;&lt;h2&gt;Plug-ins&lt;/h2&gt;&lt;p&gt;Linking everything together is easy if you make one big monolithic lump. That's not the plan - we're evolving a plug-in strategy as we go, and planning on making as much of Bespin itself use the plug-in system. The key to coupling is to get the right level of coupling.&lt;/p&gt;&lt;h2&gt;Status Messages&lt;/h2&gt;&lt;p&gt;My other integration obsession is about status messages. There's a &lt;strong&gt;huge&lt;/strong&gt; amount we could do to integrate the &lt;a href="http://twitter.com/joewalker"&gt;familiar concept&lt;/a&gt; of "what are you doing now" with commit messages, bug trackers, chat, and team tracking. More soon.&lt;/p&gt;&lt;p&gt;What other things could we do to trick out the command line?&lt;/p&gt;</content>
  </entry>

</feed>
