Automatic Bug Reporting for Firefox Extensions

Atul

February 27, 2009

5:42 pm

We want to make Ubiquity awesome at reporting errors. In our original release, a transparent message with JavaScript exception information was displayed, which wasn’t very useful to the average user, and was downright annoying when dozens of exceptions were logged in the same instant.

At present, running a command that raises an error just results in that message being logged to the JS Error console, which very few people know how to access—so most people are left scratching their heads and wondering why their command is taking so long to run.

For the next release of Ubiquity, we’re going to be trying something more user-friendly: if a command encounters an error, a transparent message will be displayed telling the user that it didn’t work. The message will also recommend using the “report-bug” command to send information about the bug to the Ubiquity team. If the user decides to run this command, a page is opened that looks like this:

Aside from inviting the user to describe their problem, a lot of information is included about their system: what OS they’re using, what extensions and plugins they have installed, what recent exceptions were thrown, and so forth. We’re hoping this will lower the barrier to entry both for receiving and providing technical support, since most of the information needed to describe and investigate a problem is contained in a single link.

We don’t yet have an interface for browsing existing bugs, but we do have a display for viewing them. It looks pretty similar to the page for submitting a bug:

One interesting aspect of our bug reporting system is that we’re not using numbers to identify bug reports: they get big fast as many reports are submitted, and big numbers are hard to remember. Instead, we’re mashing two random words from the dictionary together. For instance, the first bug I reported using this system was called anaphorically-spinach.

Under The Hood

The bug reporting system is pretty lightweight: mostly it’s just static HTML/JavaScript code that talks to a web service that’s implemented in under 100 lines of Python. The actual bug report is just a JSON object, and is deposited into a CouchDB server.

The big advantage of using CouchDB here is that we’ll be able to easily create really rich queries using plain old JavaScript. For instance, here’s a query that shows all reported error messages that contain the text “Invalid chrome URI”. It won’t be hard to create complex queries that, for instance, give us all the bug reports in which the user had a certain extension installed and had a command crash at a particular line in a particular file.

A Public Asset

Right now all reports are submitted to the public domain, and as such the report database is a public asset; users are informed of this before they submit the bug, and encouraged to look at the additional data that’s being sent with their report to ensure that there’s nothing sensitive in there. In the future, it’d be nice to allow the user to click on any parts of the data that are personally identifying, so that they can submit a version of the report that masks out the sensitive information.

Reuse

The bug report system has been designed to be decoupled from Ubiquity itself. For instance, the report viewing application is designed as a reusable JavaScript component, so it should ultimately be easy to embed into any web page. In other words, it should be easy to use as a bug reporting mechanism for any Firefox extension—and possibly for any web application in general. If you’re interested in adding the component to your own project, please let us know; the code is still a work-in-progress, and any contributions or comments are appreciated.


Labs night: It’s cool when third parties build on our stuff

Jono DiCarlo

2:52 pm
This photo has nothing to do with the article.  I just thought the blog needs more pictures.

This photo has nothing to do with the article. I just thought the blog needs more pictures.

Last night was Labs Night, a kind of show-and-tell (with pizza) that we do here once a month, open to the public. We encourage people from outside Mozilla to attend and give presentations on their own projects.

Last night was especially rewarding because we had two such community presentations. One was from Edwin Khodabakchian of Feedly, a Firefox extension which “weaves your favorite content into a magazine-like start page”. The Feedly team has developed a set of Ubiquity commands to act as a command-line interface to Feedly, which is pretty cool.

The second was from Guillaume and Sebastian, the Paris-based creators of Play!, a Java web-application framework. Among other things, they demonstrated how they’d written a bridge between Play and Bespin so that they could edit source files in Bespin and see the results of the changes instantly on the same server.

So it just so happened that both projects presented had done cool things by building upon or integrating a Mozilla Labs project in some way. It’s extremely gratifying, not to mention flattering, to see our work used in this way. Because that’s what open source is all about (well, one of the things): The ability for all of us to build on each other’s code.


Why Praise is like a Wheel In Gravel

Aza Raskin

8:23 am

Positive reinforcement is far more effective than negative reinforcement. It’s as true for people as it is for animals. But, why?

Information theory has the answer.

Is it easier to pull or push a shopping cart through a gravel parking lot? If you’ve tried, you know it’s significantly easier to pull than push the wheels through the gravel. That’s because when you push a wheel, it has many ways to turn aside. Pushing doesn’t provide a corrective force, so when it goes off path it stays that way. When you pull, there are far fewer ways for the wheel to stray because you’re always providing a corrective force — it always bounces back towards the center.

From information theory we know that the more options there are to choose from, the more work is required to choose one. You have to put in work to fight the entropy of choice.

It’s exactly the same with negative versus positive reinforcement. With negative reinforcement, there are many ways for the recipient to react: You are pushing them through gravel, they can turn the wrong way because you aren’t giving them a guiding, corrective force. With positive reinforcement, there is only one way for the person to go. The right way.

So the next time you are about to whack someone for a mistake, think about whether you’d rather be pulling or pushing a wheel thought gravel.


Design Challenge submission deadline – March 1st

rhian

February 26, 2009

1:47 pm

The submission deadline for the Design Challenge Spring 2009 is right around the corner! All ideas must be submitted to the forums by Sunday, March 1st. Now is the time for all interested students to help us answer the question: “What would a browser look like if the Web was all there was? No windows, no unnecessary trappings. Just the Web.”

All you need to get started is a mockup! Share your great idea in the forums – a sketch, wireframe, polished graphic or video. Within the next two weeks we will identify the most promising ideas and invite their creators to participate in a mentoring program where we’ll work together to refine ideas & mockups into interactive prototypes. Check below to see a list of the institutions who are currently involved.

Get all the details about participation here. More questions? Contact us at conceptseries@mozilla.com.

Schools that have signed on so far:
Carnegie Mellon University (USA)
Parsons School for Design (USA)
University of Michigan – School of Information (USA)
London Royal College of Arts (UK)
ESDI (Brazil)
University of the Arts London (UK)
L’Ecole de Design Nantes Atlantique (FR)
Universitaet Karlsruhe TH (DE)


Labs Update – February 2009

rhian

10:50 am

aboutlabs_newsletter_masthead

February 2009

Concept Series

We are currently collecting feedback on a proposed web-based collaboration tool/space for the Concept Series. Learn more and join the discussion over on the discussion forum.

Design Challenge

The application deadline for the inaugural Design Challenge is right around the corner! Initial ideas & mockups must be submitted to the forums by Sunday, March 1st. Further details on applying are available in the discussion forum.

Experiments

Weave

In preparation for the release of the next milestone leading up to the 0.3 release on March 2nd the newly updated server-side components of Weave have been migrated to a new server cluster on real hardware, dramatically increasing speed and availability. If you’re interested in helping test the next release, please register now to receive an invitation within the next few days.

Ubiquity

Another update to Ubiquity was released this week, with many bug fixes. Release notes can be found here. More details about 0.1.6 have been posted on Atul Varma’s blog.

HCI student and Ubiquity community contributor Zac Lym has been doing good work researching the usability of Ubiquity through scientific user testing.  His research has highlighted some areas where Ubiquity needs improvement to be discoverable and learnable for new users.  He has written up his methodology and his findings on the Mozilla wiki.  He’s blogged about the root causes of the usability problems that he found, and has also come up with a list of recommendations for fixing them.

Bespin

As its first experiment to escape into the open, the Developer Tools Lab launched Bespin, an experimental web-based code editor with ambitions to bring a desktop-class code editor to the Web. View an introduction screencast and check out the initial release of the editor, and get  more information on engaging with us as we figure out where to take it!

Labs Nights

If you’re hosting a Labs Night in your area, please let us know and we’ll add it to the event calendar and post it on this site.

London

3311266461_6a1fdea534_m
Great success at the first Labs Night in London! Plenty of folks joined the group at Waterstones Piccadilly to discuss Ubiquity, Weave, Test Pilot, Bespin, Concept Series and Labs in general. Be on the look out in March for more London Labs events.

Mountain View

This month’s Labs Night Mountain View was awesome. We welcomed Edwin Khodabakchian, developer of Feedly, a Firefox extension which weaves twitter and Google Reader into a magazine like experience. We heard a great presentation on Play!, a Java web application framework, and Ben Galbraith and Dion Almaer discussed Bespin. Stay tuned for the next Labs meetup in March!


Making a search command – part 3

Christian Sonne

7:27 am

Another couple of days have passed, so another round of updates is in order. Some of the changes I’ll mention here affect the previous articles: Making a search command – the easy way! and Making a search command – part 2, so if you’ve read them: read this one too!

This is the part that broke your commands

And in more than one way. If you’ve tried some of the commands before the recent updates, you might have noticed that for some reason, certain queries wouldn’t return any previews, while other would work just fine. This is because some search engines return “strange” results in the middle of the normal results – and only do it sometimes – but the only way the parser knew which titles, previews and thumbnails fit together, was by their index in each of their own lists. This was a very fragile system, and while it it still available as fallback, using it isn’t recommended.

The main difference is that the parameter options.parser.container should no longer select the element that contains all the results, but rather it should select a list containing each result. Each results title, preview and thumbnail will then be found (if available) inside the result, and grouping is no longer dependant on indexes. This means that any given result can have a missing preview or thumbnail, and it won’t affect any of the others.

Obviously, changing the meaning of the parameter means you will have to rewrite any search command you have that uses it. I hope the benefit of stability will outweigh this initial annoyance.

JSON as promised

In my last post, I said I was going to be working on JSON support, and as of about 4 hours ago, initial support has landed in hg. I have successfully rewritten our default google and yahoo commands to use this new system, and still use the JSON API provided by the services, but as I don’t have much experience with this sort of interface, it is entirely possible that I have in some way limited the functionality and thus the compatibility with some services. If this is the case, the JSON support will of course be expanded.

A slight note on the usage is perhaps needed here. Let us take google as an example:

CmdUtils.makeSearchCommand({
  name: "Google",
  url: "http://www.google.com/search?q={QUERY}",
  parser: {type: "JSON",
           url: "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q={QUERY}",
           container: "responseData.results",
           title: "titleNoFormatting",
           preview: "content",
           href: "url"}
});

First you might notice that there are two fields called url, one outside the parser and one inside. In that order, the first one does exactly what it usually did, except it’s only used if the user presses return to go directly to the search page. The second is the one used for the actual searching if you pass type: "JSON" to the parser. If the API requires you to use POST, this works the same way as you’re used to.

Secondly, if you happen to be uncannily familiar with the structure of the JSON google returns, you might notice that the container parameter I talked about earlier in this very post doesn’t seem to be pointing to each result. Instead, it’s pointing to the container of all the results. If you think about it however, in the HTML-case, jQuery makes sure we are returned a list of results, but in JSON, the parent element holding the results is already a list of results – so it sort of makes sense.

The only other new thing is the addition of the options.parser.href parameter, which was automatically calculated in the HTML version. In JSON, the url is usually held in a separate field, so this is needed to make sure we actually link to the results.

What you can do to speed things up

These changes that break backward compatibility will happen less often – or hopefully not at all – if I get fast feedback and suggestions. The more you complain, the more likely I am to do something about it fast :-P

To try these changes out, run Ubiquity from source, or wait for 0.1.7 or 0.2pre15 where they will most likely be included.


Localizing Ubiquity: an open letter to linguists

mitcho

February 25, 2009

7:26 pm


Localizing Ubiquity: an open letter to linguists from mitcho on Vimeo.

Below is a transcript of this video. Please distribute this video far and wide to anyone who may be interested. ^^

Dear linguist,

My name is mitcho and I am currently involved with an exciting open source community project at Mozilla Labs called Ubiquity. The project’s goal is to empower the user to accomplish more on the web, and to do this, Ubiquity connects disparate services from across the web with language. Let me show you what I mean.

Example 1

Suppose you’re emailing a friend to tell them where to meet later. It would be great if you could insert a map in your email, but you would regularly have to go to a maps application and insert a link.

But with Ubiquity installed, you can just pull up Ubiquity with a keystroke, enter map Shinjuku, pick the right result and rearrange it, and click “insert map.” It’s that simple.

Example 2

Let’s say you’ve stumbled upon an article in French and you want to send a bit of it to a friend. Again, you could just send a link, but with Ubiquity we can do much better than that. We’ll first select the quote we want and translate it to English. There we go. Now I’ll select the bit I actually want to send, pull up Ubiquity and execute email this to Aza. Because Ubiquity interacts with my address book, it knows who I mean by “Aza” and composes my email for me.

As you can see, the Ubiquity interface makes it easy to accomplish tasks with minimal interruption to a user’s workflow. New verbs are easy to write and there’s already an active community writing new verbs and sharing them with users.

The localization of Ubiquity

Right now Ubiquity offers a basic English parser and an experimental Japanese one, but Firefox itself currently ships with 55 distinct localizations. We hope to localize Ubiquity into a number of these languages.

In order to accomplish this, we need support from viewers like you.

For each language—whether Basque, Polish, or Esperanto—we hope to build a parser to take the command and pick out its verb and the arguments and then identify the semantic roles of each argument. Ubiquity will then apply the verb to those arguments and execute.

We’ll need both data and expertise into the languages we hope to localize. If you’re a native speaker or researcher, what is the structure of commands in your language? How do you code for different kinds of arguments? What do your pronouns look like? We’d love to see blog posts, discussions, or quick mockups on these and other topics.

For those of you with NLP experience, we’d love to get more folks involved in writing these parsers. And in the near future, we’d appreciate anyone who wants to simply try out Ubiquity in their language and give us feedback.

The idea of using natural language to direct computers is far from new. But in this limited context of individual commands—single imperative clauses without complexities such as negation or quantification—I believe there is great potential for Ubiquity to support other languages and bring this interface—this new way of interacting with the web—to more people in more communities.

ubiquity.mozilla.com

bringing linguistics to a browser near you

wiki.mozilla.org/Labs/Ubiquity/i18n

help us localize the future

Related Posts

  1. Foxkeh demos Ubiquity Parser: The Next Generation
  2. Ubiquity i18n: questions to ask
  3. Ubiquity in Portuguese

Related posts brought to you by Yet Another Related Posts Plugin.


It’s Done

Zach

4:42 pm

While testing finished nearly 5 months ago the final report is to a stage that I can let it go and move onto the next study.
There was a LOT to learn in addition to a moving goal post. I spent a month fighting with my G4 computer for nearly a month before giving up and getting a new MacBook Pro on credit, annotating and uploading the videos to different video providers, rewriting the final report and moving it to the Mozilla wiki, finally reformatting those annotations in a spreadsheet format, triangulating the data, all the while trying to blog the results, create current and future state maps of the workflow and other things going on with Ubiquity, and learn how to work with a development team.
So it was obviously a learning experience. What’s CRAZY is that (while I haven’t been doing anything 100% original) no one else has really tried to do FOSS usability testing in such an open, remote, and distributed way. Thus the logistics were not worked out. Doing testing when your team is in the same city is one thing, trying to do it across continents is another.
The next step for me is to publish my workflow and expand the usability testing wiki section to encourage low cost usability testing in the FOSS community. If you are handy with Python there are some small scripts for an internal project that needs work. I have also proposed some screen capture software which I hope some smart, entrepreneuring hacker picks up soon.
~
I want to thank Jono and everyone hacking on Ubiquity for being so graceful in their handling of someone not used to working with a development, especially since I am doing this remotely.
I want to apologize to Aza, the study never really got to what he was after- alternate UI’s for Ubiquity. Between his international touring of Asia and the pressure to get something going we never really got in sync- which is a good thing. I think the testing is something we lack.
The biggest thanks go to my mentors who responded to my pleas for someone to give me direction and advice in what I was doing.
Dana Chisnell (author of the Handbook of Usability Testing and plenty of podcasts) gave me the most thoughtful feedback I have ever gotten, it was really incredible of her to spend her time and resources helping me. I really miss having Buddhist monks around and it’s refreshing to be around someone as compassionate as you.
Allen Gunner of Aspiration gave me invaluable advice in getting traction and broadcasting results. He is the rare and dedicated grassroots organizer in the FOSS world who compares with the best NGO people I know in the environmental movement. He knows how to kick ass and look good doing it ; ) I really hope my work will forward his mission to bring Usability to the FOSS world and I can’t wait to work with him in the future.
Andy Edmonds and I found each other almost by accident on IRC. He has been the most responsive person involved, indulging me with emails and chats about the smallest concerns and teaching me how to triangulate data. He is also the most experienced of the three in terms of dealing with large data sets (he used to work on search engines), how theoretical Test Pilot studies might work- assuring me that random statistical analysis can work in place of 100% collection and how best to anonymize data. He also taught me how Mozilla works, and nixed some of my crazier ideas.
You each gave me a different piece of the puzzle, it just took me a while to figure out which order they go in.


Writing commands with semantic roles

mitcho

February 24, 2009

12:05 am

Thank you to everyone who contributed data to how your language identifies its arguments! The data collection is ongoing so please contribute data points for languages you know!

How Ubiquity identifies its arguments

Currently when writing a command in Ubiquity you must specify two properties for each argument: a modifier (the appropriate adposition—the direct object excluded) and the noun type. Here are some quick examples from the standard commands:

email:

  • direct object (noun_arb_text)
  • to (noun_type_contact)

translate:

  • direct object (noun_arb_text)
  • to (noun_type_language)
  • from (noun_type_language)

This way of specifying arguments has a few shortcomings. First of all, it requires you to identify each type of argument by unique adposition, which does not support languages with case marking nor languages with sets of synonymous adpositions (e.g. French {à la, au, aux}). Second, as we saw in how your language identifies its arguments some languages don’t mark semantic roles on the arguments at all and the current system of specifying arguments is completely incompatible with these languages. Third, the current specification requires command authors to make localized versions of their commands, specifying the language-appropriate modifiers.

In a perfect world the last issue could be solved (at least for languages which mark semantic roles with adpositions) by a mapping of English prepositions to the target language adpositions. Indeed, for some adpositions in some languages this may be possible:

English/Ubiquity Chinese Japanese
to => 到 (dào) -に (-ni)
from 从 (cóng) -から (-kara)

However, some English prepositions do not cleanly map to a particular adpositions. Take, for example, English “with.” This “with” may map to different markings in Chinese and Japanese depending on the sentence:

English Chinese Japanese
share with Jono => 跟 (gēn) -と (-to)
translate with Google 用 (yòng) -で (-de)

Note, however, that which set of markings “with” maps to is predictable, as there is a salient semantic difference. The first “with” could be referred to as together-with while the second is a using-with. With this distinction, we can easily predict which paradigm the “with” in “search with Google” should use, because these two “with” arguments represent two different semantic roles.

A proposal: identifying arguments by semantic role1

Suppose commands could specify their arguments by referring to these semantic roles in lieu of adpositions as they currently do. This way, we would be able to automatically map commands into different languages. For example, you could write a new command called move with the following argument structure:

move:

  • role_object (noun_arb_text)
  • role_goal (noun_type_geolocation)
  • role_source (noun_type_geolocation)

The English mapping of ” => role_object, ‘to’ => role_goal, ‘from’ => role_source could be used to parse the command

move truck from Tokyo to Paris

In addition, with the Japanese mapping of ‘が’ => role_object, ‘に’ => role_goal, ‘から’ => role_source, you could immediately use the command in Japanese as well:

東京からパリにトラックをmoveして

In essence, this proposal would let command authors get their commands localized for free, as long as they stick to a predefined set of semantic roles. For more complex commands and legacy commands, of course, commands could optionally specify particular English modifiers, but then Ubiquity would simply not attempt to localize those commands.

In addition, each language specific parser would determine how to identify its arguments. This would allow languages with case marking or no role marking on arguments at all to handle their own mapping of arguments to semantic roles and still use shared commands. Even parsers such as English would benefit by letting the parser deal with synonymous prepositions and possibly even argument structure alternations (such as English ditransitive alternations).

As a starting point, we could use argument types based on the list of semantic roles given in Fillmore (1971):

  • Object: the entity that moves or changes or whose position or existence is in consideration
  • Result: the entity that comes into existence as a result of the action
  • Instrument: the stimulus or immediate physical cause of an event
  • Source: the place from which something moves
  • Goal: the place to which something moves
  • Experiencer: the entity which receives or accepts or experiences or undergoes the effect of an action …

Comments welcome!

As command authors and Ubiquity users, how do you feel about this proposal? How might this affect, simplify, or complicate the localization of Ubiquity into your language? Thank you in advance! ^^


  1. Thank you to Jono and Blair whose comments in our i18n meeting helped shape this proposal. 

Related Posts

  1. Ubiquity Commands by The Numbers
  2. Ubiquity Parser: The Next Generation Demo
  3. Three ways to argue over arguments

Related posts brought to you by Yet Another Related Posts Plugin.


Fennec Tab-Sync UI Update

Jono DiCarlo

February 23, 2009

1:07 pm

The latest version of Weave now syncs your open tabs — and it can sync them between Firefox on the desktop and Fennec on a pocket-sized gadget.

“Syncing tabs”, by the way, doesn’t mean that we force all your browser instances to have the same set of tabs open. That’s not what anybody wants! Instead, it means that every browser has the ability to access the tabs that are open on other synced browsers, and to locally open copies of those tabs.

Here’s how it looks on Fennec. Keep in mind that this UI is a work in progress, and I’m well aware that it needs work, polish, and testing. But I’d like to let you see how it’s coming along and get your feedback on it.

fennec-weave-tabs-ui-0

On the left sidebar of Fennec, where your tabs appear, is a new Weave button. (This assumes that everyone recognizes “Rectangular Celtic knot” to mean “see my tabs from other computers”. Not a good assumption, so consider this a placeholder.)

fennec-weave-tabs-ui-1

Clicking the button slides the screen further to the left for a full-screen view of tabs from other computers. If you have more than two browsers being synced, each remote browser will have its own column here. Each column is identified with the client name. Eventually we’d like to display thumbnails of the tabs, but since we’re not syncing thumbnail data yet, we make do for now with titles and favicons.

fennec-weave-tabs-ui-2

A click on one of the remote tabs opens a local copy of it, which adds it to the tab bar, as you can see here.

Comments?

Jono DiCarlo, on behalf of the Weave development team.

Cross-posted from Not The User’s Fault; please leave comments there.


Older Posts »