Ted MielczarekFirefox Mobile on ARMv6 processors

Most smartphones use ARM processors. Much like how most PCs use x86 processors, for various reasons ARM has become the CPU of choice for mobile devices. Similar to x86, there are different versions of ARM processors that support different features. One of the biggest differences is which instruction set is supported. Instructions are the smallest units of what a processor can do, and an instruction set are the particular units that a processor knows how to run. For Intel, instruction sets were changed when they went from the 386 to the 486 to the Pentium and so on. For ARM, the instruction sets are numbered, with the most current one in use being ARMv7 (with ARMv8 in development). Confusingly, ARM’s processors themselves have similar naming, with the ARM11 being the generation that supports the ARMv6 instruction set, and ARM Cortex being the generation that supports the ARMv7 instruction set. All high-end smartphones that are currently shipping use processors that support the ARMv7 instruction set. The Apple iPhone 4S, Samsung Galaxy S2 and Galaxy Nexus, as well as others all come with similar processors. They’re all similarly fast as processors in smartphones go, and ARMv7 contains lots of features that allow programs to run very quickly.

How is this relevant to Firefox Mobile? Currently the builds we’re producing only run on processors that support ARMv7. This is partially because we’ve been working on performance for quite a while, and it’s much harder to get acceptable performance on a slower processor, so targeting only faster processors makes sense. (This is the same reason that Chrome for Android only runs on Android phones running the latest version of Android.) It’s also partially because all modern JavaScript engines ship with a JIT, which is a highly specialized piece of code that needs to know intimate details about the type of processor it’s running on. We used to produce additional builds that supported ARMv6 alongside our ARMv7 builds, but we saw lots of ARMv6-specific crashes in our crash reporting system, and we didn’t have the resources to tackle them all. Additionally, we were focused on making Firefox Mobile run well on ARMv7 processors; so making it run well on ARMv6 seemed like a stretch at the time.

Coming back to the present, we’ve got a revitalized mobile team working on a revamped Firefox Mobile that’s much faster than previous versions, so the performance target seems much more within reach. We also had people attending MozCamps and other Mozilla events across the globe last year. Dietrich visited Nairobi for some Mozilla Kenya events and found that the most widely used Android phones in Kenya are all ARMv6 devices. In addition, there are lots of Android phones being sold in China that are ARMv6. Even in the USA there are some low-end Android devices being released that are still ARMv6, like the LG Optimus Hub, which shipped in October of 2011. As of that date roughly 58% of the Android install base was comprised of ARMv6 phones. That’s a huge segment of the market that we’re not supporting.

Because of this, during the Firefox Mobile revamp Doug roped me in and asked if I would look into getting our ARMv6 builds back up and running. I started working on it figuring it wouldn’t be too bad since we used to produce builds. As it turns out, I was wrong. We managed to break things in quite a few ways since we disabled those builds. A few of them were simple fixes in our build configuration (although one of those took Mike Hommey and I a solid week of debugging to track down), but I also ran into a few problems with our custom linker. Firefox Mobile ships with a replacement for the system dynamic linker on Android. It’s pretty complicated, but this is the reason that Firefox only takes up about 15MB, whereas Chrome for Android takes up nearly 50MB after installation. Being a complicated piece of code there were some hard-to-diagnose bugs in it. Thankfully, with some input from Jacob Bramley from ARM we were able to track down the remaining problem and get builds working again.

With all the setbacks and other issues it’s not unreasonable to ask why we’re doing this. Clearly this isn’t the end of the process by any means. We still have to get automated builds back up and running on our build farm. We will undoubtedly have to shake out more ARMv6-specific bugs in our JavaScript engine and elsewhere. We’ll almost assuredly have to do some work to make performance acceptable. It’s a lot of work and it will take time, but this seems like the right thing to do given the number of users we can reach. You can follow along in Bugzilla if you’re interested in this work.

Joey ArmstrongBuild system tools: make-makefile, file generation

This post will be article #2 in a series about the build-config tool make-makefile.
The series is being written to formally document current tool functionality and
provide a base for future topics related to the container makefile project.
Container structure, functionality and example usage.

Series posts

When makefile generation is needed the tool will perform a few steps.

  1. gmake -f client.mk is invoked. During traversal if gmake detects one
    of two conditions the tool will be invoked to generate a Makefile:
        o $(obj)/Makefile does not exist.
        o $(src)/Makefile.in is newer than $(obj)/Makefile.
  2. Target rules used to invoke mm live in config/rules.mk near line 1342 and 1347
        o 1342 Makefile: Makefile.in
        o 1343 @$(PERL) $(AUTOCONF_TOOLS)/make-makefile -t $(topsrcdir) -d $(DEPTH)
  3. make-makefile will be passed -d and -t command line arguments:
        o -t path to root of a development sandbox ~$(TOPSRCDIR)
        o -d relative path –depth from file to hierarchy root directory.
    Makefile: $(MOZ_OBJDIR), Makefile.in: $( TOPSRCDIR)
  4. When invoked make-makefile is aware of the directory hierarchy and will expect cwd for the shell to be $(MOZ_OBJDIR) or a subdir of it [1]. config/rules.mk logic will place make-makefile in the target directory for each makefile to be generated [2].
  5. Step 1 – obtain values for depth, topsrcdir and objdir.

    Values will be:
        o used to construct directory and file paths.
        o perform text substitution within Makefile.in templates.

    Values can be:
        o explicitly passed on the command line.
        o determined from the filesystem based on arguments and/or cwd.
        o extracted from file arguments.

    $depth will be set by:
        o Explicitly using the -d command line argument.
        o Assignment of DEPTH=../.. specified within an individual Makefile.
        o Assignment of DEPTH=../.. within any other files passed on the command line
          (is this behavior a bug or feature?).
        o Assignment of DEPTH=../.. contained within a parent directory Makefile [3], [4].

  6. Step 2 – Using cwd and arguments, derive paths to the source template
    Makefile.in and generated target file Makefile.
  7. Step 3 – Slurp the source template Makefile.in. Perform value substitutions
    on tokens embedded within the template of the form @token@.

    
    browser/branding/official/Makefile.in
    =====================================
    DEPTH = ../../..
    topsrcdir = @topsrcdir@
    srcdir = @srcdir@
    VPATH = @srcdir@
    

    Some directory/file paths are derived internally by the tool for quick substitution. For any @${unknown}@ tokens make-makefile will delegate expansion with a call to system(“./config.status”) [5] to obtain values, create directories and who knows what else. Shell overhead will be imposed by this step so avoid unnecessary tokens when possible. When only a handful of tokens are in play one optimization to check on is if mm could derive values for the tokens and avoid overhead from calling the config.status script [6].

  8. Step 4 – update or preserve generated Makefile timestamps. If obj/Makefile does not exist create it. If the file exists compare generated content against the original and only update when modified.
footnotes
[1] The requirement of cwd==$(MOZ_OBJDIR)/ can be removed with use of the –enhanced flag. This option and other new flags will be covered in a future post.
[2] Enhancement: a response file could be used to support bulk makefile processing and directory creation (by config.status) saving some shell overhead. Bulk processing might also reduce the number of times config.status must be invoked independently.
[3] Potential bug. DEPTH= searches within multiple files could set $depth incorrectly when it is not explicitly set within a makefile. One ex would be passing browser/…/Makefile and js/src/…/Makefile as command line arguments. Though this error condition exists it is not likely to be triggered as files are processed individually.
[4] Potential bug: checking ../Makefile for ‘DEPTH=’ will fail for makefiles invoked from a parent directory several layers above cwd.
[5] Enhancement – modify make-makefile to parse and extract fully expanded values from config* to avoid invoking ./config.status for a subset of substitution tokens.
[6] make-makefile will issue a warning when the ./config.status script will be launched
WARNING: token SET_MAKE not defined
line 2, src: [.....]/js/src/ctypes/libffi/Makefile.in

resources

Tool source

Unit tests

makefiles

Pending enhancements

  • Expand test coverage for make-makefile
  • Add Response file support.
  • Rewrite unit tests in python.
  • Porting make-makefile from perl to python.
  • minimize shell overhead from config.status use

Future Blog Topics

  • make-makefile args and enhancements to generalize logic and support container builds.
  • Container makefiles: scripts & config
    • containermake.py
    • template files
    • non-invasive makefile edits to support container builds
  • Container makefiles: bulk file processing
    • Makefile.in => Makefile
    • *.idl => .h, .xpt, and deps .xpt.pp
    • makefile targets: export, tools, libs, test, *
    • thread mutex from target modifiers and extra container dependencies
  • Makefiles and library logic
    • threadsafe mkdir library function
    • config/rules.mk modularity – isolating logic based on bulk build types
    • thread mutex from target modifiers and container dependencies

Mozilla SecurityMozilla releases to address CVE-2011-3026

Issue

The libpng graphics library, used by Firefox and Thunderbird as well as many other software packages, contains an exploitable integer overflow bug. An attacker could craft malicious images which exploit this bug, and deliver them to users through websites or email messages.

Impact to users

This bug is remotely exploitable and can lead to arbitrary code execution. Firefox, Thunderbird and Seamonkey users could be attacked simply by displaying a maliciously crafted image.

Status

Mozilla is aware of this bug and has issued a fix that will be released today for Firefox and Thunderbird.

Credit

The bug was reported by RedHat representatives

Mozilla ITThis week in Mozilla Databases: Friday February 17, 2012

I have been at Mozilla nearly three months, and I used to blog a lot more than I currently do. A lot of the content I used to blog about I end up blogging and talking about in OurSQL: The MySQL Database Community Podcast. And I have also been getting used to the Mozilla firehose, as well as my own firehose of database projects that need to be done.

There are two very large projects that are time-sensitive that I am working on: migrating databases from an older data center to a newer one, and the impending public launch of the Mozilla Apps Store.

That being said, this week in Mozilla databases we have:

- migrated/improved/built our dev/stage databases for Socorro, our crash stats database.

- put monitoring on a newer backup server, after a random check showed replication had been stopped on one backup instance for several days due to the master’s binary logs changing names. Of course we also fixed that broken replication.

- made more progress getting the newer backup server to act like the older backup server – we do physical and logical backups, and currently the logical backups are working properly. The physical backups are a legacy cold backup, and I will not be migrating that, instead opting to use xtrabackup.

- turned off our Scalarc software, as we now have an appliance for our proof-of-concept test.

- retired 2 machines that were not in use, and exist in our older data center. I am always paranoid when I shut a machine down, triple-checking that I am on the right server when I type “shutdown now”.

- did a test migration of the production database for Mozilla QA, from the old data center to the new one.

- added new custom fields to Bugzilla for the release of Thunderbird 10.

- Created new databases and access for:
Case Conductor, a replacement for Litmus for the QA team
De Todos Para Todos, Mozilla’s outreach project to Latin America.

There is much much more to come in the weeks ahead!

Pascal Finette"Trade in personal data has emerged as a driver of the digital economy. Many tech companies offer..."

“Trade in personal data has emerged as a driver of the digital economy. Many tech companies offer products for free and get income from online ads that are customized using data about customers. These companies compete for ads, in part, based on the quality of the information they possess about users.”

- Google’s iPhone Tracking: Web Giant, Others Bypassed Apple Browser Settings for Guarding Privacy (WJS)

There is no free lunch.

Ben SimonThe “Lovebomb”: A digital learning onramp

Toward the end of last year, my colleagues Atul & Jess created an awesome project — what they called the “Love Bomb Builder.” While essentially just a tweaked version of the Web page maker they use for Hackasaurus, it’s pretty awesome — while having fun along the way, it provides an easy way to get your hands a little dirty with code, learn something, and then have an awesome (better than a) card at the end that you can be proud of and share widely.

It’s evolved a bit since then — both in terms of what’s actually at Lovebomb.me and in terms of some additional mockups that Jess put together for what it could become.

But while it’s already on the right track, what we want to do is further evolve it, into something a bit more polished and broadly approachable, which could satisfy the following three objectives — and launch for Mother’s Day:

1) Provide an approachable, fun onramp into our learning offerings
2) Teach a little bit (and possibly more) of code, without being too scary for a non-coder
3) Grow our base of supporters

Michelle Levesque and I did some brainstorming this week, and here’s what we started to come up with on where it should go from here. A basic framework (along with plenty of outstanding questions) is below — whattaya think?

–  Take Jess’s “<3 Generator” mockup as the starting point. (Concept #2 in this post.)

– Have a few more initial templates the user could choose from (some themed around Mother’s Day, for launch)

– Have the main creation go as follows:

  1. Allow the user to click on elements of the card to change them (as in the mockup). This would allow the user to edit without actually directly altering code, but would show the code surrounding the element. Ideally, this would also include Atul’s positioning add-on to allow people to easily move elements around on the page.
  2. Have the right-hand 1/3 of the page show the lovebomb’s code as it stands (updating as elements are edited as in step 1)
  3. Have key page elements highlighted in the code (colors & fonts, in particular), so a user could click on the highlighted piece of code and choose from a drop-down menu of options and see the love bomb updated immediately.

– The code editor should be easily hidden, and we should be able to govern based on a URL parameter whether or not it’s initially visible by default. This would allow us to tailor the initial “cody-ness” of a user’s experience, so that those coming in through less technical channels (e.g. a tweet from @Firefox or the FF & You newsletter) can still have something that’s approachable.

– Once published, we should provide the current menu of options to publish, as well, hopefully, as a direct “email this lovebomb” ask that then allows us to have an email signup checkbox (this could be integrated with a BSD share form or something?).

– We should add a persistent email signup as a footer, like in some of Jess’s other mockups.

– And we should create a directory/gallery of people’s lovebomb’s, so that others can see what’s been done and build off of it.

Some outstanding things to think through:

What code, precisely, do we display around each element when someone clicks to edit? Is it too imposing if we expose the text as well as the html and css that govern the element?, since the css is what contains that actual words that people will see (colors, underline, etc). Perhaps we could make it so that when you hover over any bit of the css, there’ll be an explanation of what it is? Or we could build in dropdowns/menus to allow you to change the formatting without changing the code, but that then show you the resulting change in the code?

What are we actually calling this? We don’t want “Lovebomb” to be what this goes broadly with, but it’s not like it’s an card maker, either. Any thoughts, internet?

How well can we integrate email signup as an action, so that we’re able to keep users engaged and move them further along in learning after they make their love bomb? Anything we’re missing besides figuring out an integration at the end and having it as a persistent footer?


Laura HilligerWeb Literacy Models (Theory)

I’ll admit it, it probably seems like an exercise in futility what I’m doing here, but I assure you – it’s not. It is a necessary evil to understand and define the relationships between the different learning modules in a course. It’s required to create curriculum that covers all your bases, or, in the case of Mozilla, to create and assimilate/collect curriculum that actually covers the entire spectrum of Web Literacy skills.

Being able to see this from a meta level is also required when it comes to assessing whether or not someone is educated in the subject (ie whether or not someone is “web literate”).

What’s complicated about this particular topic (Web Literacy) is that each module – defined as Exploring, Authoring, Connecting, Building, and Protecting – has a great many “learning units”, which in turn have a great many “learning objectives”.

Oh for god’s sake. Do we need to be so complicated?

  • Web Literacy Learning Modules = the 5 levels or categories
  • Web Literacy Learning Units = the 25 skills
  • Web Literacy Learning Objectives = the countless pieces and parts that make up those skills

What I’ve determined based on Michelle’s great work defining both the modules and the units, is that the best macro-model – the didactic term for that understanding of relationships – to use is a combination of a “deductive” and “networked” model. Yes, we can combine models.

This is partially deductive because there is a clear hierarchy between the first and last category. It’s not really possible to be “Building” if you haven’t yet learned the concepts of “Exploring”. The networked model comes in in the second step of the deductive model. A learner can decide to tackle “Authoring” before “Connecting” or vice versa. And during these modules, a learner and dip in and out of “Building” as well. The networked model is suitable for this subject matter because a lot of the web skills are NOT organized hierarchically.

A level deeper, the model remains almost the same, the only difference is that here the hierarchy is much more ambiguous. If you look at the units (skills) Michelle defined, you’ll see that in addition to categories, the units can be crisscrossed by the learner. It just means that after a learner is competent in “Exploring” the web, she can jump into either “Authoring” or “Connecting” or even begin dabbling in “Building”, and the learner can crisscross between the skills within (e.g. you don’t have to understand anything about Restaurant HTML to be able to Share or vice versa).

At the moment, I’m trying to go one level deeper so that I can define a micro-models we’ll be using for the unit “Designing for the Web”. A micro-model defines how learning objectives are presented within a unit – what learning objective is dependent on another and what the relationship between those countless pieces and parts are. We’ll have lots of different micro-models. I haven’t worked out the proper model for this particular unit.

This all ties together, I promise. From a practical point of view here’s how:

  • Knowing these models will:
    • help us see the gaps in our offerings
    • allow us to create content that suits the learning unit and the learning objectives
    • give us the ability to create:
      • a multitude of learning pathways
      • customized content for different target audiences
      • suitable media and tools
  • which means we will:
    • be able to fill gaps
    • make tools that “teach”
    • serve more target audiences
    • make more interesting projects
    • create a generation of webmakers

The theory in its entirety is in:

Swertz, Christian. (2010). Didaktische Aufbereitung von Lernmaterialien. Universität Rostock: Zentrum für Qualitätssicherung in Studium und Weiterbildung.

Enhanced by Zemanta

Share

Sheeri CabralThis week in Mozilla Databases

I have been at Mozilla nearly three months, and I used to blog a lot more than I currently do. A lot of the content I used to blog about I end up blogging and talking about in OurSQL: The MySQL Database Community Podcast. And I have also been getting used to the Mozilla firehose, as well as my own firehose of database projects that need to be done.

There are two very large projects that are time-sensitive that I am working on: migrating databases from an older data center to a newer one, and the impending public launch of the Mozilla Apps Store.

That being said, this week in Mozilla databases we have:

- migrated/improved/built our dev/stage databases for Socorro, our crash stats database.

- put monitoring on a newer backup server, after a random check showed replication had been stopped on one backup instance for several days due to the master's binary logs changing names. Of course we also fixed that broken replication.

- made more progress getting the newer backup server to act like the older backup server - we do physical and logical backups, and currently the logical backups are working properly. The physical backups are a legacy cold backup, and I will not be migrating that, instead opting to use xtrabackup.

- turned off our Scalarc software, as we now have an appliance for our proof-of-concept test.

- retired 2 machines that were not in use, and exist in our older data center. I am always paranoid when I shut a machine down, triple-checking that I am on the right server when I type "shutdown now".

- did a test migration of the production database for Mozilla QA, from the old data center to the new one.

- added new custom fields to Bugzilla for the release of Thunderbird 10.

- Created new databases and access for:
- Case Conductor, a replacement for Litmus for the QA team
- De Todos Para Todos, Mozilla's outreach project to Latin America.

There is much much more to come in the weeks ahead!

BlueGriffonOne-Click Templates Manager 2.0

I'm currently ironing the v2.0 of our One-Click Templates add-on to BlueGriffon. First version of that add-on is already a best-seller and I think you're going to like v2.0. Main changes are:

  • nearly 3,000 (yes, three thousand) free HTML+CSS templates!
  • you can now create your own One-Click Templates from any document of yours

So here's a static demo for you, click on the images to see a larger version.

First let's have a web document created inside BlueGriffon. For instance a blank page for the BlueGriffon web site:

BlueGriffon editing a page for its web site

We are going to turn that document - and all the objects linked to it (stylesheets, replaced elements, fonts) - into a personal template through the File > Save as Template menu entry:

Save as Template menu entry

The dialog it opens offers first to select where you want your templates and the associated database to be stored, and then set a few metadata for your template (mandatory unique name, description, license):

Save as Template dialog

Once all choices are made, the dialog looks like:

Save as Template dialog ready to save

And we only have to click on the Save button to create our template's package. Once it's done, the package's file is revealed by the OS. Please note the sqlite database for easier access to templates' metadata. All URLs inside our document or inside the associated stylesheets (including imported stylesheets, whatever the nesting level) are rewritten for cleaner packaging.

package file revealed

Now let's close our original document and use our new personal template. To do that, use the File > One-Click Templates menu entry

1-Click Templates menu entry

That opens the Template Manager. In the current version, 2864 free templates are available!

1-Click Templates manager

Just for fun, let's look at the templates proposed under Creative Commons Attribution 2.5 by freecsstemplates.org:

freecsstemplates.org templates

For each template, we have a thumbnail, a description if one is available, a license, an author, a button linking to a live demo if one is available and a button to select that template to create a new document. If a large preview image is available, clicking on the thumbnail will show it. Hitting the Select button to use the template requires only one last operation from you: you must provide a file name for your new document... Let's go back now to our personal templates, and here's the one we just created:

personal templates

So let's create a new document based on our personal template. As I said earlier, I only have to provide a file name:

filename prompt

I'm all set. My new document is here. Wherever were the original files on my hard disk, I now have a "blank" document based on a template well packaged, all media files living together, all stylesheets living together, all fonts living together, all scripts living together for a greater maintainability.

a new document based on our template

Every time you'll use the File > Save as Template menu entry, it will remind you the location of the directory where your personal templates live in. Backing them up is then trivial and giving them to someone else is also trivial. Just give that person a copy of your templates directory...

This v2.0 is going live soon, don't miss it!

Update: images updated so they don't harm planet.mozilla.org

Gervase MarkhamOpening the Mobile Web

Jean-Yves Perrier has published the plan for prising open the mobile web – evangelism of individual sites and frameworks is a big component, along with spec work and technical changes to Firefox Mobile.

I don’t think I exaggerate when I say that the tasks on that page are some of the highest priority non-coding tasks we have at Mozilla. A WebKit-only web is not much better in the long run than an IE-only web. If you have time to help, please pitch in. Contact Jean-Yves if you aren’t sure where to start.

Particularly if you are someone who doesn’t want Firefox to implement webkit-prefixed properties: working on these tasks is how you can avoid us having to do it, or reduce the amount of it we have to do.

hacks.mozilla.orgDev Derby February – working with touch events

It’s February and time for our next Dev Derby! Dev Derby is a part of Mozilla Developer Network (MDN), and each of them are focused on a certain technology where people can submit their demos.

This month, we want to see what you can do with touch events! If you need help to get started, we recommend reading more about touch events on MDN to know how they work and what you have available.

Prizes

Android mobile device
Winner gets an Android mobile device from Motorola or Samsung.
Rickshaw laptop bag
Runner-up gets a hand-crafted laptop messenger bag from Rickshaw.
MDN t-shirt
3rd place gets a limited edition MDN t-shirt to show off their geek cred.

And as if that wasn’t enough, your demo will be showcased in Mozilla’s Demo Studio, and we would like to feature you in an article here on Mozilla Hacks as well!

Go for it!

Submit your demo now!

Ross BrunigesRetiring drumbeat.org – our plans

Drumbeat.org in it’s current state has been live for a year and has helped support the Drumbeat community that:

  • has produced numerous projects that have since become core components to the Mozilla Foundations work efforts,
  • helped us run international events in Barcalona and London,
  • lead numerous community events worldwide.

We wanted a platform where people could let people could tell the world about their web projects, have the community help them out and have them made better. We received loads, with some of my favourites being:

These are all amazing projects but you might have noticed one thing – they’ve all now outgrown what we provide at drumbeat.org. They have their own websites and twitter streams with some having their code posted on github for community involvement.

Now we have these tools and sites we’re looking at moving our focus from being a community of web builders to a community of web makers who will use the tools that we have previously made. We think it’s time that we let it relax in a warm chair by the fire with its’ coat and slippers and remember the good old days and gaze lovingly at what the things that it has created go on to become. Last year when we carried out a survey on how we could evolve drumbeat.org and discovered the two main reasons we found on why people were signing up was to hear about what Mozilla are up to and to contribute to an existing drumbeat project. Thankfully our plans for drumbeat.org will allow people to continue doing that.

So what does this mean for you?

On March 1st we will be turning off new site registrations, new projects and existing project content updates; recently the number of new projects coming in has dwindled and project updates have contained large amounts of spam anyways.

drumbeat.org will remain live but will be used to direct people to our site for web makers (URL to be decided) and provide access to the now external websites of our major drumbeat projects. It will be used to tell the story of what it created and what Mozilla are doing with those creations.

What about my project page?

On March 1st your project page will be turned off and redirect users to the homepage (drumbeat.org). If you let us know we can set up redirects from your project page to your new web presence so to not loose any SEO-juice you’ve built up. Please contact us or leave a comment below and provide the drumbeat URL and where you would like us to point that to. Using Hackasaurus as an example that would be https://drumbeat.org/en-US/projects/hackasaurus/ and http://hackasaurus.org

What can I do to keep my project alive?

As mentioned above if you’ve already set up an external project website it will be fine. Up to March 1st you may also use our site messaging system to message your followers of your plans. If not then there are numerous online tools that are free and can be used to keep people informed.

Project updates

Set up a project blog! There are many free options out there, some we would recommend are tumblr, blogger or wordpress.

If you’re looking for more short-hand options then creating a twitter feed, status.net stream or a hash tag for people to message at should be able to be integrated into your chosen blog easily.

Code updates

If you want people to be able to download, use, alter and potentially improve your code and you haven’t already then we recommend getting into an online code repository. This also comes with the benefit of your code being stored in the cloud and therefore safe from laptop failures.

The most popular is probably github.com but if you’re familiar with version control systems other than git there are google code (with gives you Subversion, Mercurial AND git) and bitbucket (which gives you git and Mercurial).

So what does this mean for drumbeat?

We feel that drumbeat has been a huge success, the projects that it has made, the community that it has created and the people that it has put as into contact with. In 2012 we’re so excited to see how this community can help us more forward and make the next generation of web makers. You can read more about our our future plans over at http://openmatt.wordpress.com/2012/02/16/byebyedrumbeat/

We will also be blogging more about where we will be taking the Mozilla Foundation online presence. We’ll be doing it in iterations and in the open so feedback is always welcome. Keep your eyes posted on our RSS feeds for further information.

Pedro AlvesNew CDA and CCC releases: 12.02.16

2 more releases. Details:


CDA:

Main feature: Change to samples location. Migrated from bi-developers to plugin-samples. All Ctools will now install their samples to this location.

Changelog:

  • Changed samples to plugin-samples.
  • Plugin now compliant with Pentaho Marketplace
  • Added Boolean to AbstractExporter
  • Cda cache entries print
  • Removed some exceptions that were never thrown



CCC:

This is the standalone CCC release, so there's no impact on ctools-installer usage or stable CDF/CDE.

The most relevant feature in this release is the inclusion of a new chart type: Normalized Bar Chart - a  100% stacked/normalized/segmented bar chart.


  • New chart type "NormalizedBarChart" (100% stacked/normalized/segmenred bar chart)
  •  Added new "selectable" chart option that is false by default. Currently, selection is supported by BarChart/WaterfallChart and HeatGridChart.
  •  Fixed Redmine Bug #193: BoxplotChart does not show box tooltips correctly
  •  Fixed Redmine Bug #208: BarLine charts break when Independent Line Scale is set to false
  • Fixed Redmine Bug #298: Wrong extension point in ccc documentation
  • Fixed Redmine Bug #316 - Tooltips of Dots in line charts do not always appear
  •  Fixed Redmine Bug #317 - Timeseries axes ticks, in some cases, get drawn far to the left, off the chart
  • Functions 'getZZZScale' now have a 'keyArgs'-like interface. This interface makes it easy to add new arguments to the functions.
  •  Refactoring  pvcPanel.js into separate files.
  • Put classes in pvcCategoricalAbstract.js and pvcDataDimension.js into separate files
  • Fixed bug in value/label code of Categorical charts
  • Added support for value and label distinction, for title and subtitle, on the bullet chart.
  • Fixed ZOrder bug - did not detect correctly a new child with ZOrder already applied
  • Fixed tipsy tooltip issue with dots and lines hiding the tooltip imediately on mouseleave, which is incompatible with the point/unpoint pseudo-events, tipically used in these cases to attach the tipsy behavior.
  • Fixed pvc.mergeDefaults function that did copy specified options with an === undefined value   
  • Added logging of received Metadata and resultset to DataEngine.
  • Added logging of received options, in pvc.Base#preRender.
  • DataDimension inherited code from Composite Ordinal Axes related to onversion of data to tree form and obtaining labels for its elements. New chart options 'getCategoryLabel' and 'getSeriesLabel'.
  •  Click and Double-click in AxisPanel has been refactored to allow usage by other axis types, besides the composite axis (like linear and normal-ordinal).
  • Axis value selection is now integrated in the click event (and thus, xAxisClickAction and yAxisClickAction of HeatGrid have been removed).
  • Axis 'clickAction' and 'doubleClickAction' now receive an object argument that contains the properties: 'value', 'label', 'absValue', 'path', 'absLabel'. This breaks the previous interface of these handlers (its .toString method returns the 'value' property, to ensure some backward compatibility).
  • Ordinal axes have changed the type of "datum" that is passed to property functions. This can affect functions given tothe following extensions points: 'Ticks_', 'Label_', 'Grid_'. The "datum" received is equal to that described for the clickAction event handler.
  • Fixed bug in MetricAbstract that affected drawing of base linear axes.
  • Changed options handling by chart classes. They now all declare options in a static property called 'defaultOptions', which is handled in the instance constructor by the new function: pvc.mergeDefaults. This allowed that options would reach the root base class (which by difficulties in option handling in some cases were not passed to base classes), which was required so that the new "getLabel" options could reach the base class, by the time the DataEngine is created. This involved collecting all options of every chart class and placing a default for them in the defaultOptions object. Only options declared here are read from the user options.
  • Some refactoring of MultiValueTranslator.
  • Improved lasso selection, to behave better near min. width or height of selection rectangle (method _createSelectionOverlay lost the w and h arguments).
  • Fixed bug in the HeatGrid and Waterfall tooltip calculation code, that caused tooltips to be shown delayed one mark instance. To this end, a new method has been added to pv.Mark that allows defining a local mark property: 'localProperty'. This is in most situations a better choice that of using 'def', which isn't evaluated per instance of a Mark, but per build of a Mark.
  • Performance improvement on heatgrid: don't reevaluate tooltip when shapes are re-rendered
  • Solved lasso show delay
  • Fixed some bugs related to the timeSeries option being wrongly read on the panel or on the chart.
  • compositeAxis: issue with labels overlapping with map when aligned to the right
  • Fixed bug related to the last showTooltips change.
  • Normalized showTooltips option and tipsySettings options on Categorical charts.
  • Generalized categorical charts rubber band detection of selected data.
  • Added pvc.CategoricalAbstract#clearSelections method to support Pentaho Analyzer.
  • Solved missing ;

Bonjour MozillaOtto de Voogd

otto
(Photo : Julia Buchner)

Tenir un stand pendant un événement vous ennuie ? Bonjour Mozilla a la solution, en la personne de Otto de Voogd ! Avoir Otto dans son équipe, c’est la garantie de pouvoir toucher le grand public tout en passant vous-même un bon moment ! Car Otto est un trésor d’humour et de gentillesse, le meilleur des ambassadeurs : il sait parler à chacun, l’apostrophant d’un “bonjour” dans toutes les langues (car Otto parle anglais, néerlandais, et français), est toujours disponible, et se révèle un excellent camarade. Né en Hollande, Otto vit aujourd’hui en Estonie… Et il en est fier ! Car ce pays résiste vaillamment au traité ACTA, et se montre à la pointe en matière de libertés sur Internet. Libriste convaincu, Otto contribue depuis longtemps à Mozilla, il développe notamment des outils pour Firefox, dont le célèbre et indispensable Foxysearch

Bonjour Otto, et merci pour tout ce que tu as fait au Fosdem !


Keeping a booth at an event get you bored? Bonjour Mozilla has the solution in the person of Otto de Voogd! Having Otto in your team guarantees you to reach the general public while having a good time! Since Otto is overwhelming with humor and kindness, he is the best ambassadors: he can speak to everyone starting the conversation with “hello” in every language ​​(since Otto speaks English, Dutch, and French), is always available, and is a very good fellow. Born in Holland, Otto now lives in Estonia… and is proud of his adoptive country for its valiant resistance to the ACTA treaty, and its being on the edge of Internet freedom matters. Free Software advocate, Otto is a longtime Mozilla contributer and has developed tools for Firefox among which the famous and indispensable Foxysearch.

Bonjour Otto, and thank you for everything you did at Fosdem!

Robert AccetturaOn Gatekeeper

Gatekeeper is without question a bold move to prevent malware from impacting Mac OS X, but it will likely turn into a legal and ethical mess. Before I explain why, I’ll give a very high level overview. There are three options:

  • Mac App Store – Only run applications from the Mac App Store.
  • Mac App Store and identified developers – Only run applications from the Mac App Store and developers who sign up with Apple to get a key.
  • Anywhere – This is how every Mac and PC today operates out of the box.

The default in Mountain Lion is App Store and identified developers. As MacWorld’s Jason Snell explains:

Apple says, if a particular developer is discovered to be distributing malware, Apple has the ability to revoke that developer’s license and add it to a blacklist. Mountain Lion checks once a day to see if there’s been an update to the blacklist. If a developer is on the blacklist, Mountain Lion won’t allow apps signed by that developer to run.

It’s worth noting that at least today the authentication is only done on first run from what I’ve read. However it’s not impossible for Apple to later check an application on each run to make sure it’s not on the blacklist. That could even happen before the feature ships this summer.

What’s concerning is that Apple will now essentially be the gatekeeper (get it?) and thus pressured to control what users can or can’t install on their computer. Lets be honest, most developers will never get their users to open system preferences and change this, so getting “identified” is essentially required to develop on Mac OS X if you want more than geeks to use your software.

Apple in the past has been pressured to remove Apps from the iOS App Store. It’s likely (read: guaranteed) to be pressured to blacklist developers who write apps which are controversial. Anything that could be used for piracy from a BitTorrent client to VLC which uses libdvdcss (the library hasn’t been legally challenged ever AFAIK but pressuring Apple is a way around the court system) could be targeted. Apple has a bit of a history banning apps for all sorts of reasons including being negative towards Apple.

How would Apple deal with pressure from patent claims? What about a desktop client for WikiLeaks, like the one that was pulled from the App Store? What about a game distributed by Planned Parenthood or some other organization that tends to draw controversy? There’s also the international issues here (Nazi images and Germany, privacy violations and EU). What about more indirect things like Firefox which can run 3rd party code via plugins and addons. Mozilla refused to kill MaffiaaFire. Could the Feds have went to Apple?

These are all hypothetical situations technically since the feature hasn’t even launched and Apple hasn’t given any clear policies. That in my opinion is the big problem. Apple as far as I know hasn’t given any guidelines to what would put a developer on the blacklist? Is there even an appeals process?

I’m pretty sure we’ll learn more over the coming weeks. The cool guys over at Panic are pretty optimistic about the feature, so I guess we’ll see.

Comment Count

Robert O'CallahanUpcoming Travel

Our whole family is going to Europe soon. We're planning to leave Tuesday night (Feb 21) and return March 17. I will be mostly not working, and mostly offline, but expect to be checking email regularly and able to respond to some review requests and the occasional crisis. I'm planning to visit the new Mozilla London office on Tuesday February 28 and the Paris office on March 9 so I should get some work done on those days.

Nicholas NethercoteThe McAfee Site Advisor add-on has an appalling memory leak

TL;DR: If you have the McAfee Site Advisor add-on installed in your Firefox, I recommend you disable it immediately because it has an appalling memory leak.

I wrote yesterday about a reader’s results with the McAfee Site Advisor 3.4.1 and McAfee ScriptScan 14.4.1 add-ons for Firefox — he was finding that they greatly increased Firefox’s memory consumption.

This morning I tested Site Advisor 3.4.1 myself, and found that, when enabled, it leaks every single content compartment that is createdIn other words, most of the JavaScript memory used for any page opened with Firefox is never reclaimed.  In terms of memory consumption, this is pretty much the worst possible behaviour for an add-on.  This excessive memory consumption is likely to cause Firefox to run much more slowly and crash much more often.

In the bug report I recommended that we block-list it immediately and contact McAfee, but Jorge Villalobos told me that block-listing is considered an option of last resort.  Three McAfee people have been CC’d on the bug and I’ve been told that some other Mozilla people are contacting McAfee via other channels. Hopefully we’ll see concrete action soon.

If anyone else can replicate my results, particularly for older versions of Site Advisor, that would be useful to know.  Steps to reproduce are in the bug report.

As for ScriptScan 14.4.1, I haven’t tried it myself because I haven’t been able to find where to download it from.  My searching just turned up lots of references, such as this one, to when Mozilla block-listed version 14.4.0 because it was crashing so frequently.  (Site Advisor 3.4.0 was block-listed at the same time.  And SiteAdvisor 3.3.1 was also block-listed due to crashes!)  If anyone can tell me where to get ScriptScan from that would be very helpful.

If you have any McAfee add-ons installed in your Firefox, I strongly recommending disabling them immediately.  McAfee clearly has a poor record when it comes to the quality of their Firefox add-ons.  I also personally found Site Advisor to be an extremely annoying and unhelpful add-on.  I’m no expert on Windows security but if you are looking for alternatives I have heard numerous people say that Microsoft Security Essentials is the best anti-virus/security system for Windows — it’s reputedly very effective, and is free of charge and non-intrusive.  It also doesn’t install any add-ons into Firefox.

Mozilla Add-ons BlogUsing Javascript ( *.jsm ) modules in the SDK

The ability of developers using the SDK to get chrome authority and access xpcom services is a key feature. The SDK was designed from the start with the assumption that some developers will always need access to the underlying Mozilla platform. While xpcom is the main way to access low level apis, a lot of functionality in Firefox is instead implemented as JavaScript Modules, and can be used in your code much more naturally than xpcom services because they are just JavaScript, and from a design perspective quite similar to CommonJS modules.

Here’s a code snippet that you can use to import a jsm into your code:

const { Cu } = require("chrome");
 
let AddonManager = Cu.import("resource://gre/modules/AddonManager.jsm").AddonManager;
 
AddonManager.getAddonsByTypes(["extension"], function(addons) {
    var addonData = [];
 
    for (let i in addons) {
		let cur = addons[i];
		addonData.push({
			id: cur.id.toString(),
			name: cur.name,
		});
	};
	console.log(JSON.stringify(addonData, null, '   '));
});


The code requires chrome in order to get the Cu object ( Components.Utils ) and then imports the AddonManager module. Nice and easy! The only real problem with adding code like this to your add-on is that getting chrome authority to access Cu has review implications on AMO, and we in the Jetpack team want to do everything we can to get your add-ons reviewed as quickly as possible.

With that in mind, we have been considering including a utility function in the SDK that allows developers to import jsm modules without having to get chrome authority. Ben Buksch contributed this code snippet in a bug that neatly abstracts the small amount of chrome-level code into a single function:

const { Cu } = require("chrome");
/**
 * Imports a JS Module using Components.utils.import()
 * and returns the scope, similar to Jetpack require().
 *
 * @param targetScope {Object} (optional)
 *     If null, the scope will just be returned
 *     and *not* added to the global scope.
 *     If given, all functions/objects from the JSM will be
 *     imported directly in |targetScope|, so that you
 *     can do e.g.
 *       requireJSM("url", this)
 *       someFuncFromJSM();
 *     which will have the same effect as
 *       Components.utils.import("url");
 *       someFuncFromJSM();
 *     in normal Mozilla code, but the latter won't work in Jetpack code.
 */
function requireJSM(url, targetScope)
{
  var scope = targetScope ? targetScope : {};
  return Cu.import(url, scope);
  return scope;
}

I’ve created a Jetpack module on Builder that you can use to load Javascript modules using Ben’s code:

https://builder.addons.mozilla.org/library/1040049/revision/7/

I’ve also created this example addon that uses my module:

https://builder.addons.mozilla.org/addon/1040048/latest/

Here is the above code, re-factored to use my module:

 
let requireJSM = require("jsmutils/jsmutils").requireJSM;
let AddonManager = requireJSM("resource://gre/modules/AddonManager.jsm").AddonManager;
 
AddonManager.getAddonsByTypes(["extension"], function(addons) {
	var addonData = [];
 
	for (let i in addons) {
		let cur = addons[i];
		addonData.push({
			id: cur.id.toString(),
			name: cur.name,
		});
	};
	console.log(JSON.stringify(addonData, null, '   '));
});

I know what you’re thinking – there isn’t really any less code involved using the abstracted module. I would argue that the advantage is instead that I have isolated the part of my code that needs chrome authority to a single, small file that is very easy to understand. This is better separation and greatly aids the ability of our add-on reviewers to quickly understand your code and any security implications it might have.

Taras GlekSnappy, Feb 16

Canadians and their Profilers

Much like eating bacon, writing profiling tools is a favourite Canadian pastime. Unfortunately, while today’s meeting had more Canadians than last time, a few the usual suspects are still busy with Android bugs this week and weren’t able to attend.  There are no updates on about:jank or our profiler this week. Next week, Vlad plans to hook up Windows symbolification to the profiler bringing it up to par with Mac64.

UX Tweaks

Jared is almost done with preparation for snappy scrolling. He is wrapping up making scrollbar + arrow keys behave in a consistent manner, bug 710373. The next step is to tweak our scrolling physics, which may lead us to integrate addon scrolling code in bug 206438. Jared also got rid of pointless “connecting…” tab title on refresh, bug 709182.

IO Optimizations

Brian recently worked out a way to neuter prefetch in bug 692255, this week he added Firefox hooks to take advantage of that in bug 727864. Once that is done our startup speed will be up to us – no longer at the mercy of a misbehaving Microsoft heuristic. Brian also discovered a single-character typo (bug 726503) in my code,which apparently resulted in a 15% speed up in our page-loading benchmark, tp5. I’m disturbed that we didn’t notice respective slowdown when we landed this.

Brian is also bravely battling download-manager lag in bug 632556, 727275.

Marco is working on reducing thread contention due to vacuum/pragmas, bug 723611. Marco is also almost done with rewriting our ill-conceived, jank-happy livemarks code in bug  613588.

Content

Vladan landed a DOM storage fix that should significantly reduce the amount of main thread SQL done by content bug 714964. We plan to make dom storage not cause main thread io lag in bug 712009.

More of the content team is jumping into Snappy work next week, expect to see more in this section.

Ben Adidait’s the randomness, stupid

The New York Times is reporting that a flaw has been found in RSA. The original paper is here, and it looks like a second team was about to release similar information, so they’ve posted an explanatory blog post, which I recommend. A number of people are understandably concerned.

Since I couldn’t find a simple explanation of what happened, I figured I would write one up.

public-key encryption

Public-key encryption is fascinating. You generate a keypair composed of a public and a private key. You post the public key on your web site, and anyone can use it to encrypt data destined for you. Decryption requires the private key, and you keep it to yourself. Anyone can encrypt; only you can decrypt. This is how your web browser secures the communication channel with your bank: the bank publishes its public key, and your browser encrypts data against that public key before sending it to the bank. An eavesdropper knows the bank’s public key, but because they don’t have the private key, they can’t see the data you’re sending.

how do I get me one of them keypairs?

Cryptographic keys are just numbers with special properties. In a public-key encryption system, you typically pick one of these special big numbers randomly, you make that your private key, and from it you compute the public key. It’s easy to compute the public key from the private key. However, given the public key, it’s really, really hard to recover the private key. We don’t know how to do it without spending millions of years of computation for your average public key. That’s right, a single user’s public key, attacked with vast computational power, will not yield its corresponding private key. But if you have the private key, you can get the public key in a few milliseconds. That’s the magic, except it’s not magic, it’s math.

what do you mean by “randomly”?

If you barricade your front door, a thief will probably come in via the window. And so it is with public-key encryption. Attacking a public key directly in order to somehow extract its private counterpart is really, really hard. But maybe it’s not so hard to guess how that private key was selected in the first place. Remember, you have to pick the private key randomly. And, as it turns out, computers are really bad at picking numbers at random (humans are only marginally better.) So, if you’re not careful about how you picked that private key, an attacker might simply reconstruct how you picked it.

lots of people picking lots of keys

Cryptography is everywhere now, so there are millions of public keys made available on the Web. Just go to https://amazon.com, and Amazon will tell you its public key. If a bunch of folks use a not-so-random way to pick their private key, you might expect funny coincidences to happen. Alice in San Francisco and Bob in New York might independently end up with the same private key simply because they both used a similar process for selecting this private key from all possible values. If that happens, they would also have the same public key, and you would be able to easily discover this: just compare their public keys! The researchers found that this happens every now and then: they found a couple dozen public keys that were identical to at least one other public key. In and of itself, that’s kind of fascinating. But it’s not really shocking, right? Clearly, if people have the exact same public key, then they picked their private key poorly.

the funny thing about RSA

The funny thing about RSA, the most common approach to public-key encryption, is that its private key is composed of two numbers, both prime (which means they are divisible only by themselves and 1, for example: 11, 17, 41,…). The public key is then the product of those two primes. As it turns out, it’s really easy for computers to multiply numbers, even really big ones. But if you’re only given the product of two primes, it’s incredibly hard to recover those two factors. For example, take two primes each 200 digits long, multiply them together to get a 400-digit long number, and give that to a friend. Given all the computing power in the world for many lifetimes, your friend will not be able to recover those two prime numbers you initially picked.

Now, there are lots and lots of prime numbers. So many, in fact, that if you and I randomly select a 200-digit prime number, there is no conceivable chance we’d pick the same one. But, what if we don’t do it randomly? What if we both start out with 1 followed by 199 0s, and work our way up until we find the first prime number? Then of course we’d end up with the same one. Now maybe we’re not so stupid, and we have a clever way of picking a much more complex starting point, and then working our way up to find the next prime. Well, let’s hope we don’t both use the same clever method, because no matter how clever it is, if we both use the same method, we’re going to end up with the same prime.

So, back to the funny thing about RSA: because the private key is made up of two prime numbers, if people don’t choose those prime numbers randomly, then two different people might end up with one prime number in common, but not the other. So their public keys won’t be exactly the same: one will be p1 x p2, and the other will be p1 x p3. So it won’t be immediately obvious that we used poor randomness.

And now the final piece of fun math. It’s really hard to factor numbers, and it’s really easy to multiply them. Another thing that’s really easy is to find common factors between two numbers. So if I have two RSA public keys that share a prime factor, it’s really easy to determine that common prime factor. And then, with that prime factor, it’s easy to discover the other prime factor in each of the two keys. So, one RSA public key is very hard to break, but two RSA public keys that share a prime factor are trivial to break together.

So that’s what the researchers did. They looked at every pair of RSA public keys and found that 0.2% of them share a prime factor with another. Given that, they were able to fully factor those 0.2% of keys, and thus completely break their security.

This really shouldn’t be that much more shocking than the case where users have the exact same public key. It’s just that, with RSA, there is another way in which poor randomness could result in weak keys, without those keys being exactly identical. It’s fascinating, and it’s a great study, but the root cause is no different: it’s all about the randomness.

so other approaches are better?

No. This attack has nothing to do with RSA. It has everything to do with randomness. No matter the algorithm you pick for public-key encryption, you have to find a really good source of randomness to pick your private key. The cute thing here is that weak randomness was revealed in a new surprising way, because RSA public keys can share a prime factor without being immediately obviously identical. That’s cool, but it’s not a weakness of RSA.

how do I fix my code?

Make sure you’re using a secure random number generator to generate your keys. Make sure you’ve seeded it with good randomness, using operating-system calls if possible. And mostly, don’t panic. There’s no new attack here, only a very interesting revelation, using a very interesting trick, that a lot of people don’t pay sufficient attention to randomness when generating crypto keys.

We knew that. Now we really know it.

Mozilla Add-ons BlogThe Add-on Review Queues are empty!

Thanks to the tireless efforts of the AMO Editors group, we have reached an important milestone that hasn’t been reached in years (or ever, probably). All add-on review queues are currently empty.

Add-on review queues - all empty!This means that if you submit your add-on now or in the following days, chances are it will be reviewed within a few minutes. This is amazing feat, specially considering that add-on submissions are constantly increasing, and we add new policies all the time that make add-on reviews higher quality, but also longer to perform.

We’d like to thank and congratulate the AMO Editors team for their exceptional work along the years. You guys are amazing! We’ll call out our most active contributors soon, when we wrap up the very successful New Year’s Challenge.

PS: If you’re an add-on developer and your add-on hasn’t been reviewed, please get in touch with us by commenting here. It’s possible that your add-on is in an Incomplete state and you forgot to add it to one of the queues, or it could be a bug on our site.

Mozilla Add-ons BlogCan’t make the SF Meetup? Catch it on Air Mozilla!

The Add-ons meetup in San Francisco is less than a week away, so be sure to RSVP if you haven’t already.

If you’re interested in seeing how easy it is to create add-ons for Firefox with Add-on Builder and the Add-on SDK but can’t make the event, we are broadcasting it on Air Mozilla from 6:30-7:30pm.

Hope you can join us!

Date: Tuesday, February 21, 2012
Time: 6:00 – 8:00pm
Location: Mozilla SF – 2 Harrison Street, 7th Floor

Siddharth AgarwalThe upcoming death of computing

On August 27, 2001, Internet Explorer 6 was released.

Somewhere between then and the end of 2001, IE climbed to over 90% usage share. Netscape was dying. There was no other competition left. The computing world seemed locked up. Microsoft had won. As any sane business would do, Microsoft disbanded the IE team (as the general manager of the team says in this interview).

The web stagnated.

Microsoft left one little loophole though. (They either forgot about it or were coerced to leave it by the US government, depending on how charitable you want to be.)

The platform Microsoft built for writing programs on, Win32, was so powerful that third parties could do better than Microsoft could.

And so was Firefox born, and so is the rest history.

The same story shows up several other times. Take gaming for instance. The market's stagnating because the platform vendor doesn't care, and in comes a third party (Steam) using the power the vendor's provided to disrupt it.

Now we have choice again. There's a full-scale war on in the mobile world between iOS and Android. Even Microsoft's trying to get in with Metro on mobile and Windows 8.

But some of these new platforms usher in a new set of controls, and in the name of "security" and "protection against malware" they restrict third parties from doing better than the platform vendor does.

Here's one example: an application is effectively some code that makes the OS better. Traditionally, application vendors have been able to let others write code that makes the application better. You might already be familiar with them -- they're usually called plugins or extensions. The most common way to write them is to publish a library implementing an API, then let the application load the library. Well, neither iOS nor Metro support loading such code dynamically. So no more apps supporting plugins. No alternative app stores either.

Here's another example: to build fast dynamic language runtimes such as the ones used in all current browsers, you need just-in-time (JIT) compilation. JIT compilers work by emitting machine code in a data area, marking the data as executable, and then running the code they just emitted. Well, neither iOS nor Metro let you mark data as executable. There goes that.

What all this means is that Microsoft and Apple have managed to close that one loophole that let others take back the monopoly Microsoft once had. You can't do better than the vendor. Your iOS browser can never be better than Safari -- your Metro browser can never be better than IE. You can't write an alternative iOS app store (jailbreaking aside) -- you can't write an alternative Metro app store either.

And what's even worse, they (and in particular Apple) have managed to sell it successfully. "Won't somebody think of the children malware?"

The next few years are probably going to be great, with competition driving tons of improvements. But someone's eventually going to win.

And if the wrong platform wins, history will repeat itself. There will be no more competition, so teams will be disbanded, technologies will stagnate.

Only, this time there won't be a loophole. Computing will die.

hacks.mozilla.orgState of the Docs, February 16, 2012

The ramped-up level of documentation contributions that started in January is surviving longer than most New Year’s resolutions. Keep it up! And as ever, thanks to everyone who contributed, whether you’re mentioned here or not!

Help wanted

Michael Deal contributed a great example page that shows how Canvas compositing works with partial opacity. Now it needs to be integrated into the Compositing lesson of the Canvas tutorial.

Web standards docs

Mozilla technology docs

Mozilla projects docs

Identity at MozillaBrowserID now available in 28 languages

We’re proud to announce that with the latest update to BrowserID the sign-in flow is available in 28 languages, in addition to English.

Like many of our previous updates, users and sites automatically benefit from the added feature without having to change anything. Users will see BrowserID in their preferred language, based on their browser’s settings.

Here’s what BrowserID looks like in traditional Chinese:

browserid_zh-TW

This change has been possible because of our amazing community of volunteers. Firefox ships in over 70 languages and that energy also powers our vision for a cross-platform identity management.

Along with ID provider support, shipping our service in multiple languages are two big milestones for BrowserID maturity.

Users of your websites can now have a native language experience in the following locales:

Afrikaans (af) català (ca) Čeština (cs) Dansk (da)
Deutsch (de) Ελληνικά (el) Español (es) Eesti keel (et)
Euskara (eu) suomi (fi) Français (fr) Frysk (fy)
Gaeilge (ga) Hrvatski (hr) Italiano (it) Ligurian (lij)
Nederlands (nl) ਪੰਜਾਬੀ (pa) Polski (pl) Русский (ru)
slovenčina (sk) slovenščina (sl) Shqip (sq) Српски (sr)
Svenska (sv) Türkçe (tr) 中文 (简体)
(zh-CN)
正體中文 (繁體)
(zh-TW)

Dig Deeper

Michael KaplyHow Firefox Loads Plugins

While debugging getting plugins working again with the CCK Wizard (it broke when Firefox removed platform specific directories in extensions), I learned a lot about how plugins load within Firefox. In particular, I learned a lot how to stop Firefox from loading plugins from different locations. So I thought I would share. Note that this post is primarily about loading plugins on Windows.

You probably know that there is (or at least used to be) a plugins directory in the same location where the Firefox executable is located. Back in the day, that was where all plugins were loaded from. When you installed a plugin, it placed a DLL or shared library into that directory.

That method became quite cumbersome, so new ways were invented for the browser to find plugins. We’re going to talk about those ways. First, though, type about:plugins in your browser. You’ll see a list of all the plugins that are loaded in your browser. If you’re wondering where they are loaded from, you can go to about:config and set the preference plugin.expose_full_path to true and it will show all the different paths from which Firefox has loaded plugins. (Don’t forget to toggle it back when you are done. It can be a security issue because websites can know paths on your machine by looking at filenames in the navigator.plugins array.)

The first method we’re going to talk about is using the Windows registry. If an app installs a plugin in a central location and wants Firefox to find it, it just adds a registry key. Here are some example locations from my machine:

HKEY_CURRENT_USER\Software\MozillaPlugins
HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins

You can search on MozillaPlugins using the registry editor to see the various locations where these keys are added.

So what do these keys look like? For Adobe flash, they add the key @adobe.com/FlashPlayer. The important value that’s specified in the key for the plugin is Path. This specifies the directory where the plugin is located. Most vendors provide a path to the entire DLL, so Firefox just cuts off the filename and reads all plugins in that path. That explains why even though there is only one entry for Java (C:\Program Files (x86)\Java\jre6\bin\new_plugin\npjp2.dll), it still loads the other Java plugin in that directory (npdeployJava1.dll).

So then an obvious question might be “how do I prevent the loading of plugins from the registry?” Instead of deleting all the references to MozillaPlugins, you can just go to about:config and set the preference plugin.scan.plid.all to false. Firefox will no longer read plugins from the registry. You can see this change immediately if you type about:plugins.

After typing about:plugins, you might still see plugins that seemed to be referenced in the registry and wonder how they got there. That brings up the second way Firefox locates plugins. It uses known paths to find them. The plugins it looks for this way are Java, Adobe Acrobat, Quicktime and Windows Media Player. (You can click here to see the code that does this if you want.) I’m not going to go into detail as to how this happens, but I will answer the obvious question – “How do I prevent these from being loaded?”

Firefox has four preferences that control the loading of these plugins:

plugin.scan.Acrobat
plugin.scan.Quicktime
plugin.scan.SunJRE
plugin.scan.WindowsMediaPlayer

These preferences are not booleans, though, they are minimum versions. So if you want to prevent them from being loaded, you can just set the versions very high. I set them all to 100.0.

After changing that, now type about:plugins again. If all went well, you shouldn’t see any plugins loaded in Firefox.

If you still see plugins loaded, they can be coming from two other places, either the extensions directory where Firefox is located (unlikely) or they can be coming from an add-on. Firefox add-ons can add plugins to Firefox by putting them in a directory called plugins.

So there you have it. That’s how Firefox loads plugins.

As a side note, things are much easier on Mac. It just loads plugins from the /Library/Internet Plugins directory and ~/Library/Internet Plugins directory.

Special thanks to Mook for helping me find some of the code and preferences.

Giorgio MaoneSandboxes are Overrated (Told You 4 Years Ago)

Universal XSS 0day in Adobe Flash controlled users’ Web accounts:

As useful as sandboxes are in restricting potentially buggy code to a small part of the operating system, they do nothing to minimize the damage that can be done by attacks that exploit universal XSS flaws, researchers said.

I was already preaching this four years ago: the more our assets move “in the cloud”, the less traditional security measures, meant to protecting just your local system, suffice.

The battlefield is the web now, and there’s no coming back…

NagappanAnnounce: Linux Desktop Testing Project (LDTP) 2.3.0 released

About LDTP:

Linux Desktop Testing Project is aimed at producing high quality test automation framework (using GNOME / Python) and cutting-edge tools that can be used to test Linux Desktop and improve it. It uses the Accessibility
libraries to poke through the application's user interface. We strive to help in building a quality desktop.

Changes in this release:

Added Windows client version for LDTP (Hint: Expect windows version of LDTP soon ;-) )
Updated keycodes based on latest Linux distribution

Bugs fixed:

Fixed twisted gtk2 import in gtk3 environment
Ubuntu 12.04 twisted XMLRPC APIs have been changed, updated accordingly

Special thanks:
Mike Gorse
VMware Desktop UI automation
Tim Miao
Michael Terry
Brain Nitz
Andre Klapper (i18n / l10n suggestions)
Gurdun (To run LDTP from Robot Framework)
Mardy (To run LDTP in QT environment)

Download source

Download RPM
Will schedule deb build in openSUSE build service later

Documentation references:

For detailed information on LDTP framework and latest updates visit

Check LDTP APIs

Report bugs

To subscribe to LDTP mailing lists

IRC Channel - #ldtp on irc.freenode.net

Michelle LevesqueTeaching the 4th “R”: a conversation with Cathy Davidson

If you’re interested, Cathy Davidson and I are going to be having a conversation about teaching the 4th “R” (web makering? ew) this afternoon at 4pm ET (1pm PT).

Lanyrd event information here: A fireside chat with Cathy Davidson.

I’m drinking a large coffee right now in prep for it — so even if I don’t have quite as many insightful things to say on the subject as Cathy, at least I’ll be very wired! :-)

Hope to see some of you soon!


Austin KingHow the Node Based BrowserID Service Shipped 28 New Languages

Our amazing community has localized the BrowserID service into 28 languages.

browserid_zh-TW

If you are a website who is using navigator.id to authenticate your users, you
don’t have to do anything special
, your users will start having a better experience… today.

Woah, that just happened.

I wanted to share a little bit about the people and the technology.

People

Mathjazz did a great job leading the l10n effort, with pike and milos also involved.

I’ve helped with 7 “from scratch” localizations at Mozilla and this was the smoothest yet. The l10n drivers have done a ton of work to make collaborating on websites and services better.

It’s not an easy task to help coordinate volunteer efforts. You can see everyone who is involved and what locales new locales are coming soon; check out our Verbatim.

browserid_el

Technology

Node.js LogoWith our launch, we’re probably unique in being a Node app at our scale with the breadth of languages supported. We use the express framework;
doing l10n on Node is totally possible ;)

Under the guidance of l10n drivers, we’ve reused all of our standard web l10n practices. That means
Gettext for strings and SVN for the locale directory (let us not speak of SVN again).

We used the following libraries and tools:

  • node-gettext – server side string lookup from .mo files
  • GNU Gettext – string extraction, merging, etc
  • Translate Toolkit – podebug for debug locale

We wrote the following bits:

  • Client side gettext library
  • Custom middleware for accept language, exposing gettext, etc
  • Various conversion scripts

We do string lookups on both the server and the client side. In the browser, JSON blobs are minified and concatenated into our usual JavaScript bundle.

Having excellent Django codebases like zamboni (AMO) and kitsune (SUMO) to reference was also really helpful.

We ran into a shocking low number of i18n bugs, given that Express and Node don’t have an officially blessed stack to do l10n on.

A Call for Help

This release also brought in many new contributors to the project porting Perl code, reporting bugs, and other new energy that is critical to the Mozilla project.

As with any release, there are things we didn’t have enough people to accomplish. We need your help!

  • CSS Help – Help support the visual design for RTL locales like Hebrew?
  • Tools Help – More robust string extraction

Thanks again to everyone involved in this release. If you are waiting to try integrating BrowserID “because it only works in English”, you’re running out of excuses :)

Go migrate your site’s authentication today. Get your users off of passwords. With an additional 14 locales in the works, tomorrow promises to bring even friendlier auth flows.

Mozilla DevToolsWeekly developer tools meeting, Feb 16

The weekly meeting minutes are up on the wiki. Here are some highlights:

  • Firebug has integrated the Source Editor, but it turns out that this doesn’t work in SeaMonkey.
  • Victor has a Blender importer for Tilt.
  • Some new commands have landed for the command line (tilt with screenshot, edit and pref not far behind)
  • Panos is experimenting with attaching the debugger to B2G
  • Christian Heilmann reflected that we need to communicate more about why the built in tools are different from Firebug and where they’re going.
  • I posted a blog post about the developer tools roadmap for 2012.

That’s it for this week! Come join us next week.

Matjaž HorvatBrowserID for the rest of the world

BrowserID is an innovative approach to identity developed at Mozilla. Users are currently insecure, because they use a separate login for each site, but often use the same password. Systems such as Facebook Connect try to address this issue, but they leak private information about visited sites back to Facebook. So BrowserID is here to save the World.

But how can it save the whole World, if it’s only available in English? Well, not anymore. In less than three weeks, our volunteer localizers have translated BrowserID to 29 locales (English included)! This is more than Firefox 1.0 was available in, which clearly shows the importance of BrowserID inside Mozilla community.

What language is this?

BrowserID is the first project I’m driving localization for and I couldn’t be happier with the outcome so far.

So how does BrowserID work?

When you create a BrowserID account, you’re sent a verification email that lets BrowserID know that you really own that email address. Then when you use BrowserID to log into a website, the website is given your email address and told that you really do own it but they are never given your BrowserID password.

What are the benefits of using BrowserID?

  • You can use one easy-to-remember log in for all sites that support BrowserID.
  • You never have to trust a website with your password because they never know it.
  • Your password can’t be stolen if one of those websites gets hacked.
  • BrowserID doesn’t track your activity on the websites you visit (privacy policy).

I’m sold, can I give it a try?

Matt ThompsonWinding down the Drumbeat.org web site

So long, Drumbeat. Hello, world.

TLDR version of this post:

  • Later this month, we’re going to retire the Drumbeat.org web site.
  • This is a function of Mozilla Drumbeat’s success. We’re taking what worked about Drumbeat and shipping it right into Mozilla. With a laser focus on making and learning: creating great software and resources that build a generation of webmakers.
  • If you have an active project or data on Drumbeat.org, you’ll want to make other plans. The post linked in the comments below by my colleague, Ross Bruniges, has more details and FAQs. Please get in touch if you have questions.
  • We’re still sorting out the new brand and online home for our work going forward. (“make.mozilla.org?” “Mozilla Learning?” “Mozilla U?” something else?) In the mean time, check out our Mozilla Webmakers wiki for details on our projects, community calls, and ways to stay in touch.

Drumbeat was so successful, we’re shutting it down.

About two years ago, the Mozilla Foundation started experimenting with a set of big ideas, using “Mozilla Drumbeat” as an umbrella brand and laboratory. Our thinking:

  • Grow the Mozilla community. In size and diversity.
  • Reach out to new audiences.  People working in other spaces that matter. Like education, journalism, filmmaking, and youth.
  • Collaborate on new projects and software. Lock web developers in a room with these new audiences, shake vigorously, and wait for lightning to strike.
  • Work open. Template and package Mozilla’s uniquely open way of working along the way.
  • Invite the world. Extend that out to anyone who wanted to play.

What worked?

What we’ve proven together over the last two years is:

  • Collaborative innovation really works. Bringing technologists together with innovators in other spaces = win. We brought filmmakers together with developers and got Mozilla Popcorn. We brought educational innovators together with developers and got Mozilla Hackasaurus and Open Badges. Hybrid innovation really works.
  • Focusing on learning, media, and youth makes sense. There’s broad support for these areas, we’re getting traction, and it helps tell a great story about the Mozilla mission. The link between all these areas is empowerment, with the web as a vital public asset for all.
  • The world is hungry for Mozilla maker values. At events like the Mozilla Festival, we’re getting huge enthusiasm for a) bringing together diverse groups, and b) inviting them to make and learn together. “More hack, less yack.” People are tired of “blah blah blah” — they love Mozilla’s hands-on, “let’s build stuff” ethic.

What didn’t?

  • Trying to support a million different projects. By inviting the whole world to set up a project on Drumbeat.org, we spread ourselves thin and created too much noise to signal (not to mention spam!). And we didn’t provide value to these projects they couldn’t find elsewhere on the web. It was a great starting point, but as Drumbeat.org users told us in our survey, we need to focus on doing a small number of projects well.
  • Trying to over-engineer Mozilla’s way of working. We thought that creating project pages and activity streams could help  projects get a leg up and go faster. It didn’t. There’s (probably) no magic template or piece of software that helps projects work open. Ultimately, that’s more of a culture and know-how problem than a technology problem.

What’s next?

  • Winding down the Drumbeat brand and web site. Shipping what worked right into the core of Mozilla. Phasing out the Drumbeat brand.
  • Focusing on software and learning for webmakers. That’s the thread that connects our most successful projects. It means delivering great authoring and learning tools (like Mozilla Popcorn, X-Ray Goggles and Open Badges), resources (like an expanded version of our Hacktivity Kit), plus great events and global community. From the yearly Mozilla Festival, to hackfests and learning labs, to mini webmaker meet-ups around the world.
  • Finalizing the best way to brand all this. We’ve been doing a lot of work on this, and hope to have a finalized proposal ready to share soon. The key will be keeping it simple, telegraphic, and part of a larger brand architecture for “One Mozilla.” Please drop  in to one of our weekly community calls if you have ideas or questions.
  • Launch a new web site in Q2. A simple site that helps tell our new story, guiding audiences to the specific pieces they’re looking for. We already have web sites for our various individual projects, so this will be a thin, audience-focused layer that helps bring the pieces together. Ross Bruniges is helping to lead this work — please get in touch here if you’re interested in contributing. Or check our Mozilla Webmakers wiki in the mean time.

Greg WilsonWatch Me: Help Wanted

[reposted from the Software Carpentry blog]

Back in 2007, Jon Udell observed that screencasts facilitate accidental knowledge transfer in a way that more traditional media don’t. As I said yesterday, we’d therefore like to start recording short screencasts of programmers thinking aloud as they solve small problems using their preferred tools. The aim is to show learners how to program—what order to write things in, how to debug, when and how much to test, and so on. Everything will be covered by the same Creative Commons license as our other material, and made freely available for remixing and other use.

If you’d like to help, please:

  1. Volunteer to be recorded by mailing us. We’ll help you install a screen recorder (if you don’t have one already—you might be surprised to find that you do), give you a small problem, and edit the video you produce so that you don’t have to.
  2. Volunteer to edit video for us, so that we can put our energy into organizing people :-) .
  3. Volunteer to work the floor at PyCon in March. We can’t attend (workshops to run, etc.), but it would be great if we could get a dozen or more “here’s how I do it” recordings done during the conference.

Remember, as an open source project, Software Carpentry depends on your help to survive and thrive. If you have wanted to help, but have worried that creating and recording lectures would be too much work, this is a way for you to help that will take half an hour or less. We look forward to hearing from you.

Marco BonardoAdd-ons devs heads up: we are killing old bookmarks GUIDS.

If you don't manage an add-on that is using Places bookmarks GUIDs, you can stop reading here.

As part of the performances improvements efforts, in Firefox 4 we replaced the old UUID-style GUIDs annotations on bookmarks with new 12-chars GUIDs that are directly stored in a guid column of the bookmarks table.

This has been done for a lot of reasons: memory consumption, disk space, performances

The following APIs in nsINavBookmarksService have also been marked as deprecated:

  • nsINavBookmarksService::getItemGUID
  • nsINavBookmarksService::setItemGUID
  • nsINavBookmarksService::getItemIdForGUID

Unfortunately we found that some add-ons, even quite famous ones, are still using some of these APIs and the old GUIDs. We didn't get any answer to notifications we sent them, as of today. This is blocking possible improvements for all of our users, so we finally have to proceed with the removal.

Starting from Firefox 14 these APIs will be removed and all the existing GUIDs will be deleted from the database (any new instance of them will also be removed at regular intervals).

Since we understand some of these APIs don't yet have a replacement (though nsINavBookmarkObserver provides the new GUIDs and we are working on a new asynchronous bookmarking API), we are asking for your feedback to make new asynchronous APIs that can satisfy the GUID needs of your add-on. You can leave your feedback in the removal bug.

The remaining time before Firefox 14 is released should be enough to plan an eventual users migration or a refactoring of your add-on, so we hope this solution may be satisfying for everyone.

Mark SurmanRe: public of the web

Inspired by Dave Parry, my friend Andrew said: “We are no longer just seeing the power of the public internet. We are now seeing the rise of the internet public.” It was a bit of an ‘aha!’ moment for me.

SOPA protest pic via Clay Williams

It’s been amazing to watch the push back against SOPA in the US and ACTA in Europe over the past few months. And, of course, to have witnessed the Arab Spring. The people behind these events didn’t just use the internet to amplify voices: they were the voice of the internet speaking. And, at least with SOPA and ACTA, the message itself was about the internet and what it stands for. This is new. And good.

I’ve always believed the internet is something special. Not just something to use and build on, but also something to stand up for.

As Joi Ito said in the New York Times a couple of months back: “The Internet isn’t really a technology. It’s a belief system, a philosophy about the effectiveness of decentralized, bottom-up innovation.” This vision of the internet has motivated me for a very long time. It’s what brought me to Mozilla.

Until recently, it felt like the group of people who cared about the Internet as philosophy was relatively small. I personally know hundreds of people who spend every day evangelizing the open ethos of the internet. I’m one of them. The thing is: none of us have had much luck getting sizeable numbers of people excited or engaged. We’ve all tried. But the idea of an ‘open web’ or ‘internet ethos’ has always been too abstract get people to prick up their ears.

This seems to be changing. We are seeing the rise of the internet public: a movement or constituency that is both of the internet and about the internet.

The Facebook signs in Tahrir Square were a first glimpse of this. In some ways, these signs were a small footnote in a bigger political change in the Arab world. But they also point to the fact that the internet is more than just a part of the story — it is itself a story to pay attention to.

The massive public push back on SOPA and ACTA show this more starkly: there is a broad public passion for and connection to the internet. People are saying: ‘the open internet and the way it connects us is a central part of the world we want to build.’ In this story, the internet isn’t only a disruptive tool that helps bring about democracy where it doesn’t exist, it’s also represents a vision of decentralized, bottom up society in it’s own right.

This part that feels new and different. ‘The internet as philosophy’ no longer feels so abstract. As an example of how things have gotten more concrete, the internet public has quickly and dramatically changed the discussion on both SOPA and ACTA. Both seemed destined for quiet approval just a few months ago, now SOPA seems to be dead or ACTA is under extreme public scrutiny.

Importantly, people with real power are listening and internalizing to this conversation. A White House response to SOPA petitions said:

“Across the globe, the openness of the Internet is increasingly central to innovation in business, government, and society and it must be protected.”

and

“Proposed laws must not tamper with the technical architecture of the Internet through manipulation of the Domain Name System (DNS), a foundation of Internet security.”

Note what’s happening here: the leaders of a major economic power are espousing the importance of an open internet. They are also calling out the protection of a key technical building block upon which the open platform and philosophy of the internet are built. Similar things have happened in Europe around ACTA. This is both important and unprecedented.

At Mozilla, we’ve been talking about what to do next on SOPA and ACTA. This is important. But I believe there is a bigger question: how can Mozilla fuel, bolster, cheer on and be a part of this rising internet public? The world we’ve imagined may be just around the corner: a world where the ethos of the web is a conscious part of how huge numbers of people approach their lives, their work and their government. This is a the world I want to live in.

I’m going to think and write about all this some more. Partly in the context of SOPA and ACTA. But also in relation to building a more web-literate society — teaching tens of millions more people how the web works and how to code. Any thoughts you’ve got would help.

PS. A tip of the hat to Dave Parry for his ‘It’s not the Public Internet, It is the Internet Public.‘ post. I’ve gone in a slightly different direction, hopefully in a way that’s complimentary .


Filed under: drumbeat, mozilla, onewebday, openweb, poetry

Niko MatsakisReturning refs

One commonly requested feature for regions is the ability to return references to the inside of structures. I did not allow that in the proposal in my previous post because I did not want to have any region annotations beyond a simple &. I think, however, that if you want to allow returning references to the interior of a parameter, you need a way for the user to denote region names explicitly.

The big problem with returning references to the interior of data structures is ensuring the lifetime and validity of that reference. I think it can be supported in some cases but not particularly well in general. It will work ok for structures allocated on the stack but be quite limited for structures allocated in the heap, unless we have strong support from the garbage collector. Another scenario where it could work well would be user-managed memory pools (which we probably do want to support eventually).

Simplest case

Let’s start with the simplest case:

type T = {mut f: uint};
fn get_f(t: r&T) -> r&mut uint { &t.f }

Here we have a function that returns a pointer to a field of its parameter. On the callee side, I think this is fairly straightforward. You name the region in which the parameter is located (r) and say that the return value is a mutable pointer to uint in the same region (r&mut uint). The notation may leave something to be desired, but the concept is hopefully clear enough.

Returning references to the stack

But what about the caller? Again we’ll start with the simplest case, where get_f() is invoked with data that lives on the stack:

fn caller_on_stack() {   // let region `b` refer to the function body
    let t = &{mut f: 3}; // type of t: `b&T`
    let p = get_f(t);    // type of p: `b&mut uint`
    *p = 5;              // legal, `b` region is in scope.
}

In this case, there is no concern about memory management per se. The returned pointer is in the region b. The type checker will enforce the rule that if a function returns a reference type, the reference must be in scope (note: I haven’t thought through what this means for generic types with the ref kind, but I guess they can be handled one way or another). Generally, because the parameter regions must be in scope for the call, the returned region will be in scope too—but we’ll see that this does not always hold.

Returning references to the heap, take 1

Let’s move on to a more complicated case where the data being accessed is in the heap. I’ll first discuss how it could work in some theoretical world and then show how this can cause problems:

fn caller_on_heap() {    // (note: not fully sound)
    let t = @{mut f: 3}; // type of t: `@T`
    let p = get_f(t);    // type of p: `@mut uint`
    *p = 5;              // legal, `@` region is in scope.
}

The only difference is that the variable t is in the heap region @. Now the returned pointer is considered to be in that region as well, and so the assignment is permitted. This seems reasonable at first, but it is of course incompatible with ref counting (p is not a ref-counted entity). If we moved to a garbage collector which could handle interior pointers, this would be reasonably safe. Interior pointer support is needed to accomodate cases where p gets returned, like this one:

fn caller_on_heap_r() -> @mut uint {
    let t = @{mut f: 3};
    ret get_f(t);
}

So is there anything we can do that is compatible with ref. counting? The answer is “sort of”.

Returning references to the heap, take 2

One thought is that we say that @ is not actually a region. It’s never been the best fit, due to ref counting requirements and implicit headers. Instead, we say that regions always refer to some block-scoped slice of the program execution. The most common case would be a block in the program, but in some cases the region might be “the time in which a given expression is evaluated” and so forth (as an aside: this is basically what I called an “interval” in my thesis…minus all the parallel parts).

An @T pointer could then be implicitly coerced into an r&T pointer where the region r is the biggest region for which the type checker can guarantee the validity of the @T pointer. So, we can now revisit the previous examples. The first example works more-or-less the same as before:

fn caller_on_heap() {    // region of the block is `r`
    let t = @{mut f: 3}; // type of t: `@T`
    let p = get_f(t);    // type of p: `r&mut uint`
    *p = 5;              // legal, `r` region is in scope.
}

The differences here lie in the type checker. The pointer p is no longer in the @ region but rather in the region r corresponding to the function body. The reason that the region r could be safely used is that t is an immutable local variable (I am assuming issue #1273 is implemented…working on that right now). This means that the memory will remain valid as long as t is in scope.

EDIT: There is no reason to impose the following restriction. See discussion below. This implies that if t were mutable, the example would not work In that case, the validity of the memory to t could not be guaranteed for the entire block, as t could be overwritten. In other words, a program might do something like this:

fn caller_on_heap() {
    let mut t = @{mut f: 3};
    let p = get_f(t);
    t = @{mut f: 22};    // original memory is now freed
    *p = 5;              // memory error.
}

However, such a program would not type check. The reason is that, because t is mutable, when t was coerced to a region type, a narrow region s would be assigned. The region s would correspond to precisely the call to get_f(). The result of get_f() would therefore have type s&mut uint, but the region s would be out of scope after get_f() returned, and so a type error occurs (this is that rule I mentioned before: when returning a reference, the region must be in scope).

As an aside, coercing a unique pointer ~T into a region would work similarly to the second case: that is, the resulting region is always a very narrow one. It does not matter if the variable storing the unique pointer is immutable or not. The reason is that the local variable is being borrowed for the lifetime of the region. If we assigned a large region, the local variable would be inaccessible after the call, because we would not be able to guarantee the uniqueness invariant, as there might be escaped region-typed pointers into its interior. Anyway, I don’t want to go into details about unique pointers in this post as it’s already plenty long.

EDIT: pcwalton pointed out to me that there is no reason to treat mutable variables specially. Instead, we can basically just increment the ref count whenever we coerce an @T to a r&T. The region r would still be the region of an enclosing block b (probably the innermost one, or perhaps the one where the variable is declared) and we would release the reference upon exiting the block b can still optimize immutable variables to not increase the reference at all because it is unnecessary. I rejected this approach initially because I was thinking that we would want to keep it very predictable when references would be dropped, but that’s not actually an important property. Garbage collection traditionally does not define precisely when dead memory will be reclaimed, after all (and, as graydon correctly points out, RC+CC is garbage collection). Note though that borrowing unique pointers probably still ought to use a narrow region corresponding to the call or alt statement in which the borrow occurs.

But does it scale?

So, I think this system I showed above is reasonable. I think it has a clear story, too, which is important to me, because it helps me believe that it is sound even though I haven’t made any kind of formal proof or argument. The story is basically that

  • a region is always a block-scoped slice of the dynamic execution;
  • when a @T is coerced into a region pointer, the result is the largest region for which the validity of the @T pointer can be guaranteed;
  • when a ~T is coerced into a region, the result is a narrow region corresponding to just the duration of the borrow (I haven’t gone into details on this… perhaps in a later post)

However, in all of these examples I showed only the simplest case, where a pointer was returned directly into one of the parameters. A more realistic scenario is probably returning some interior pointer to a record reachable from a parameter. For example, a common C trick is to have a hashtable lookup not return the value which was found but rather a pointer to the value. This allows the caller to update the value without having to use any further API calls. Let’s look at that example: we will find that the regions don’t scale up.

The prototype for such a function might be:

fn get_value_ptr<K,V>(m: r&map<K,V>, k: &K) -> option<r&V> {
    ...
}

This looks reasonable, but once we start digging into the details things don’t work so well. Let’s assume a hashmap with chains for each key:

enum bucket<K,V> = {k: K, mut v: V, mut next: option<@bucket<K,V>>};
enum map<K,V> = {buckets: [mut option<@bucket<K,V>>], ...};

fn get_value_ptr<K,V>(m: r&map<K,V>, k: &K) -> option<r&mut V> {
    let bkt_idx: uint = find_bucket_index(m, k);
    alt search_bucket_chain(m.buckets[bkt_idx], k) {
        none { none }     // no bucket with key k
        some(bkt) {       // found a bucket with key k
                          // bkt has type @bucket<K,V>
            some(&bkt.v)  // (*) error
        }
    }
}

The example should be straightforward if you’ve ever coded up a hashtable. The tricky part is marked with a (*): once we’ve found the bucket containing the value, we attempt to return a pointer to its interior. But this is not safe, of course! The caller expects a pointer in the same region as the map: that is, with the same lifetime. There is no way for get_value_ptr() to guarantee that bkt is valid as long as the map m is valid. The caller might, for example, remove the key from the hashtable, thus invalidating the bucket. This error manifests itself as a type error, because the type of &bkt.v is a region pointer corresponding to the region of the alt, not the region r which was provided as a parameter.

Could this example be made to work?

I don’t think it can without a lot of work. You could imagine that the caller would consider the map “borrowed” while the returned value is in scope and thus try not to modify it. But there may be aliases to the map, so there are still no guarantees.

I think there are two ways to handle an example like that in a safe fashion:

  • Improve the GC, as described before
  • Re-write the example into a top-down style.

The second “solution” is what we support today, and what is supported by the “Regions Lite” idea I described before. You would write:

fn get_value_ptr<K,V,R>(
    m: r&map<K,V>,
    k: &K,
    f: fn(option<&mut V>) -> R) -> R {
    ...
}

In other words, the get_value_ptr() method will call the closure f with the result of the lookup. In this way, the get_value_ptr() method itself can guarantee that the reference is valid.

Is it all worth it?

It may still be worth having labeled region parameters and supporting a limited form of returning references, but I am not sure. I feel like writing things in a “top-down”, CPS-ish style is perhaps just a better solution—it’s certainly more widely applicable.

Regardless, I do like the idea of formalizing regions as representing a slice of time, and defining coercions from @T and ~T. I think that feels intuitively sensible and I think it can be explained in a reasonable way.

There is however one potentially important future case where the simple form of returning references would be enough. If we had user-defined memory pools, then it would be possible to have large, dynamically allocated, multi-object data structures that all lie within one region (the memory pool). A map, for example, might have an associated arena. This scheme would then work. When you think about it, treating @ as a region and having a GC which can handle interior pointers is really the same thing as this scheme, from an abstract point of view.

Another important thing is that I think there is a path from all of these more limited forms to the more general ones. If we say, for now, that @ is not a region and we do not support labeled parameters, we can add both of those later. Existing programs will continue to type check.

Christian HeilmannStumbling on the escalator

I am always amazed about the lack of support for progressive enhancement on the web. Whenever you mention it, you face a lot of “yeah, but…” and you feel having to defend something that should be ingrained in the DNA of anyone who works on the web.

Escalator

When explaining progressive enhancement in the past Aaron Gustafson and me quoted the American Stand-Up comedian Mitch Hedberg and his escalator insight:

An escalator can never break – it can only become stairs. You would never see an “Escalator Temporarily Out Of Order” sign, just “Escalator Temporarily Stairs. Sorry for the convenience. We apologize for the fact that you can still get up there.”

This is really what it is about. Our technical solutions should be like escalators – they still work when the technology fails or there is a power outage (if you see CSS animations and transformations and transitions and JavaScript as power) – but they might be less convenient to use. Unlike real world escalators we never have to block them off to repair them.

We could even learn from real-world escalators that shut down when nobody uses them for a while and start once people step on them. On the web, we call this script loading or conditional application of functionality. Why load a lot of images up front when they can’t be seen as they are far away from the viewport?

An interesting thing you can see in the real world is that when an escalator broke down and became stairs people stumble when they enter it. Our bodies have been conditioned to expect movement and our motor memory does a “HUH?” when there isn’t any.

This happens on the web as well. People who never were without a fast connection or new and shiny computer or phone with the latest browsers have a hard time thinking about these situations – it just feels weird.

Travelator

Another interesting thing are the horizontal walkways you have in airports. These are meant to accelerate your walking, not replace it. Still you find people standing on those complaining about their speed.

On the web these are the people who constantly complain about new technology being cool and all but they’d never be able to use it in their current client/development environment. Well, you don’t have to. You can walk in between the walkways and still reach the other side – it just takes a bit longer.

So next time someone praises flexible development and design practices and you have the knee-jerk reaction to either condemn them for not using the newest and coolest as “everybody has a xyz phone and browser abc” or you just don’t see the point in starting from HTML and getting to your goal re-using what you structured and explained in HTML as “GMail and Facebook don’t do it either” think about the escalator and how handy it is in the real world.

Think about it when you are tired (accessibility), or you carry a lot of luggage (performance) or when you just want to have a quick chat whilst being transported up without getting out of breath. Your own body has different needs at different times. Progressively enhancing our products allows us to cater for lots of different needs and environments. Specialising and optimising for one will have a much more impressive result, but for example a lift is pointless when it doesn’t work – no matter how shiny and impressive it looks.

Our job is to make sure people can do the things they went online for – get from their start to their desired goal. This could be convenient and fast or require a bit of work. Our job is to make sure that people do not get the promise of a faster and more convenient way that fails as soon as they try taking it.

You can comment on Google Plus if you want to.


hacks.mozilla.orgMozilla Hacks Weekly, February 16th 2012

It’s Thursday, meaning that all of us in Mozilla’s Developer Engagement team want to share our reading tips! And man, have we got a lot of good links for you this week!

At the end of this blog post, you also have all the Developer Engagement team members and what they work on. If you are interested in discussing more, contributing or taking part of our work, don’t hesitate to contact us!

Weekly links

If there is anything you think we should read or know about, don’t hesitate to post a comment, contact us on Twitter or through any other means.
The picks this week are:

The Developer Engagement team

Mozilla’s Developer Engagement team work with writing articles, documentation – such as MDN (Mozilla Developer Network) – public speaking and generally helping and informing about open technologies and Mozilla products. If you are interested in following our work, here are the team members:

Barry Munsterteiger

Barry is our Creative Instigator and is working on interesting and limit-breaking demos.

Twitter: @mozBarry

Christian Heilmann

Christian is Mozilla’s Principal Evangelist and is working with HTML5, Open Web, BrowserID and Developer Tools in Firefox. He is also maintaining the @mozhacks account together with Robert Nyman.

Blog: http://christianheilmann.com/
Twitter: @codepo8

Eric “Sheppy” Shepherd

Eric is the Developer Documentation Lead for the MDN documentation and everything surrounding it.

Blog: http://www.bitstampede.com/
Twitter: @sheppy

Havi Hoffman

Havi works with Mozilla Labs and WebFWD, and maintains the @mozlabs account.

Twitter: @freshelectrons.

Janet Swisher

Janet is working on MDN documentation and is organizing doc sprints to ensure we have premium quality on MDN.

Blog: http://www.janetswisher.com/
Twitter: @jmswisher.

Jean-Yves Perrier

Jean-Yves is another one of our technical writers working on MDN documentation.

Twitter: @teoli2003.

Jeff Griffiths

Jeff is working with the Add-ons SDK (Jetpack).

Blog: http://canuckistani.ca/
Twitter: @canuckistani

Joe Stagner

Joe is working with Web Apps Developer Ecosystem & Partner Engagement, HTML5 and the Open Web.

Blog: http://www.misfitgeek.com/
Twitter: @MisfitGeek

John Karahalis

John is working on Dev Derby.

Twitter: @openjck

Rob Hawkes

Rob is working on HTML5 games and the Open Web.

Blog: http://rawkes.com/
Twitter: @robhawkes

Robert Nyman

Robert is working with HTML5, Open Web, Firefox, WebAPI and maintains the @mozhacks account.

Blog: http://robertnyman.com
Twitter: @robertnyman

Shezmeen Prasad

Shezmeen is working on everything regarding events, organization and connecting conferences with Mozilla speakers.

Stormy Peters

Stormy is the Team Lead for the Developer Engagement team. managing it and evaluating our objectives.

Blog: http://stormyscorner.com/
Twitter: @storming

Tristan Nitot

Tristan is our Mission Evangelist and is focusing on the bigger picture of Mozilla.

Blog: http://standblog.org/blog/en
Twitter: @nitot

Will Bamberg

A picture of Will Bamberg Will is working on documentation for the Add-ons SDK (Jetpack).

Robert NymanThoughts on the CSS prefix situation

The last week I’ve been contemplating whether to write anything or not about the situation with web browser vendor prefixes in CSS. I decided to share my thoughts on the problem and possible solutions.

Let’s me first start by saying that while I work for Mozilla, these opinions expressed here are my own.

The situation

We have lots of web sites out there, especially mobile targeted ones, where -webkit prefixes have been used in CSS code to achieve certain design or visual effects for the WebKit rendering engine, most notably available in Google Chrome and Safari. The impact of this isn’t a guess game either, but based on data collection and analysis for a huge number of mobile web sites out there.

There are a number of problems with this:

  • These features are implemented as experimental, hence the prefix, and generally not meant to be used in production code.
  • When web developers have been using them, they’ve usually just provided the -webkit prefix and none of the prefixes for other web browser vendors, i.e. -moz (Mozilla – Gecko), -o (Opera) and -ms (Internet Explorer) nor unprefixed versions.
  • While the idea with these experimental features is to become standardized, many aren’t, and also, some of those that become standardized might have a changed implementation when it reaches that level.

The effect of all this is that web sites might be perceived to offer users a richer experience in WebKit-based web browsers, and naturally, all other web browsers want their users to have that experience as well since they have implemented that support.

Blame game

When there is a situation, there will always be a blame game. I’ll address the most common ones and reply to them:

Developers should have never used prefixed features in production code
Sure, but I do understand developers here. They work to offer the best user experience for their user, and any technical capability that offers it to them, they will grasp it. Even if they know it’s experimental, I believe they take for granted that the same thing will be standardized in the same way (where how gradients changed in WebKit is a good example of the fact that it is experimental, and it might very well change over time). What you could argue is they should’ve added all web browser prefixes and an unprefixed version, but usually at the time of implementation, they had no idea if that would work or if the implementation in other web browser would be the same.
The W3C CSS Working Group haven’t been working fast enough to standardize things
It’s a given that a process where everyone will reach consensus and agree on the best implementation can take longer than for just one vendor to implement what they think. A number of the experimental implementations might never be fit to reach a standard level either, but is rather mostly there to prototype new features.
Apple and Google don’t remove the prefixes in official released versions, but keep the -webkit prefix
The problem here is that a lot of web sites implemented the features with prefixes, and they don’t want to break those web sites, just as Internet Explorer have kept support for certain features to make sure web sites specifically built for IE will continue to work.
The -webkit CSS features developers use don’t break web sites
I believe this is an important argument. While the CSS features people have used with -webkit prefixes offer a richer use experience, they aren’t features that render a web site completely unusable if they aren’t there. However, no other web browser vendor will want to have their user to have less of an experience if they have the same support.

I do believe that while it’s interesting to know how we ended up here, there are many factors at play. Personally, I’m more for focusing on possible solutions and how we move forward, instead of delving too deep into the past. Or rather, I believe there will never be consensus on why this has happened.

Solutions

The way I see it, we basically have two plausible scenarios on how to handle this:

Evangelizing

Everyone needs to start/continue blogging, tweeting and informing developers to use all web browser vendor prefixes in their code. Tell them to use solutions and technical alternatives to add prefixes for all web browsers that support that certain feature. Have web browser vendors – namely Mozilla, Opera and Microsoft – invest in campaigns to raise awareness.

It is a hard task to reach out to all developers, but in my experience most developers do want to do the right thing, they do want their users to have the best experience available, no matter which web browser they use. And just like we shouldn’t make the web experience better for users on a certain operating system or device just for the sake of it, we shouldn’t do that with web browsers either. It is our job, our duty, as developers to make things as good as possible for our end users. Because that’s what we do.

The argument is that will never work. Some say it’s too late, that it’s a WebKit mobile web and we need other measures to fix it. I hope that’s not the case and there is still time to make this good. Looking back at how Firefox managed to break the 95% market share of Internet Explorer, how we got people to understand the value of semantic code and strictness with XHTML, I believe there is still hope here too.

An example is the implementation of the alt attribute, something that Internet Explorer incorrectly rendered as a tooltip. Lots of users were upset this, thought the Firefox implementation should change, but they stood their ground. And eventually developers understood the distinction between those two, and finally Internet Explorer fixed their implementation as well.

Every web browser implements the -webkit prefix

The other alternative that is being seriously discussed is for Mozilla, Opera and Microsoft to implement support for -webkit prefixes, effectively making the web sites that only use a -webkit prefix for their CSS work in all other web browsers as well. This would not necessarily be for for all features, but rather for the most prominently used ones. This sounds like a bad thing – which it is – and it’s been compared to opening Pandora’s box. I believe that if it’s done we will keep a technical debt for some time to cover up for other implementations, and it will be very unclear to developers what will work where. More practical details about this can be found in Eric Meyer’s interview with Tantek Çelik.

An argument for this case is that part of breaking the Internet Explorer dominance we had a decade ago was to implement support for innerHTML and similar, just to cover up for all the web sites and current code out there.

Moving forward

So, how do we move forward? What will happen? Some people have suggested prefixes like -beta and @-vendor-unlock but one major problem with that is that the experimental implementation or syntax across web browsers isn’t necessarily the same.

I believe we are in a situation where web developers are getting jaded and just go for the simple route with a prefix for a feature they have seen. I think prefixes still play their role for experimenting, but they should not be shipped in official releases of web browsers. Keep them experimental, and if they are implemented in a final release, do so without prefixes; at the same time, this feature is something that has to have been standardized by then.

So, my suggestions are:

  • Make sure vendor prefixes only work in Nightly/alpha/beta releases.
  • Keep on evangelizing to developers.
  • If you build demos or give presentations, make sure to show code for all web browsers, point out differences and make people aware of how things work. If you share anything, that is your responsibility.

I don’t think it’s too late. I believe we have to work hard, but I sincerely hope we can solve this by reasoning.

And to conclude: by having a number of mobile operating systems out there that only allows you to use the pre-installed web browser/rendering engine, namely iOS and Windows Mobile, that is a situation that is much much more worrying to me than the prefix situation. Prefixes can be fixed and developers can be made aware and change. How do we change the above companies to inspire them to give the users choice?

Gregory JostVan Gogh’s Starry Night Interactive Who needs posters and...



Van Gogh’s Starry Night Interactive

Who needs posters and paintings anyway?

Bonjour MozillaBonjour WoMoz : Zofia toujours là !

zofia3
(Photo : Otto de Voogd)

Elle est le rayon de soleil annuel du stand Mozilla au Fosdem (la preuve, en 2011 et 2010) : cette année encore, Zofia nous a fait le plaisir de venir nous rendre visite. Elle grandit, mais garde son adorable frimousse, et est toujours une fan de Mozilla… Pour notre plus grand bonheur !

Bonjour Zofia !


She is a ray of sunshine at Mozilla’s Fosdem booth every year (proved in 2011 and 2010): this year again, Zofia gave us the pleasure of her visit. She grows up, but keeps hier adorable little face, and is still a Mozilla fan… to our greatest delight!

Bonjour Zofia!

Paul RougetHTML5 Context Menu and FullScreen

HTML5 Context Menu and FullScreen API.

Do you know you can change the native context menu of an HTML element with the HTML5 <menu> tag? Do you know you can make any element of your page go fullscreen with the HTML5 Fullscreen API?

Adding a "fullscreen" entry in the context menu is really simple (demo):

(Firefox needed. Webkit does support the Fullscreen API, but not contextmenu yet.) <noscript> <pre> &lt;menu id="fullscreenmenu" type="context"> &lt;menuitem label="fullscreen" onclick="document.querySelector('canvas').requestFullScreen()"> &lt;/menuitem> &lt;/menu> &lt;script> HTMLElement.prototype.requestFullScreen = HTMLElement.prototype.requestFullScreen || HTMLElement.prototype.webkitRequestFullScreen || HTMLElement.prototype.mozRequestFullScreen || HTMLElement.prototype.oRequestFullScreen || HTMLElement.prototype.msRequestFullScreen; &lt;/script> </pre> </noscript>

Michelle LevesqueOpen Distributed Learning – Mark Surman and I at LWF


Michelle LevesqueWhere should we be evangelizing?

I was chatting with a friend earlier today and she said: “Oh, Mozilla is looking into building a generation of web makers?  I’d never heard that and I’m in a similar space.  Why haven’t I heard of that?

Okay, partly this is because I think we’re just staaaarting to get to the point where it makes sense to shout from the rooftops.  Nobody likes a premature rooftop shouter.

But partly I think that this has also been a traditionally very distributed space with a total lack of cohesion: everyone doing their own thing, and lots of wheels being reinvented.  Which, of course, is one of the roles I think that Mozilla can help with.  (Fixing the lack of cohesion, I mean — not helping to reinvent the wheel.)

So here’s a few questions for you, lazyweb:

Where should we be evangelizing?  Where are the people who are already teaching these things (or interested in teaching these things) already flocking to, where we can reach them?  Where are the people who are considering these issues?

I love that in part people are doing this for us — for example, in canada.com’s recent article “Why Mozilla is teaching kids to hack” — but I think that this goes beyond just pure PR.  Lots of folks have been giving this stuff tons of thought, and as much as possible I think that we’re going to be strongest where we bring them together and move in a common direction.

Perhaps that’s why we’re not shouting from the rooftops: because it’s not about announcing our intentions in any sort of top-down “Here We Are: Rock You Like a Hurricane” kind of way.  It’s about finding all of these islands and helping to draw bridges between them.

We already know about lots of folks out there, but I’m positive there’s so many, many more of them.  Any advice / thoughts you guys have about where or how to find them would be much appreciated.  Cuz this party’s just gettin’ started. :)


Michelle LevesqueAn instructor community site: goals and plans

In order to achieve Mozilla’s goal of “building a generation of web makers“, we are reaching out to help those who already teach (or would like to teach) web literacy skills.

One of the ways in which I’d like to do this is to put up a tent (yes, a metaphoric tent) and invite all of the instructors to gather under the tent where we can begin to discuss what already exists out there for teaching web making, what tools are useful in which contexts, and find where there are holes.

Goals

  • To build a community where webmaker instructors can feel like part of a larger community.
  • To reduce the number of times the wheel has to be reinvented, by allowing them to share experiences, tips, and tricks.
  • To identity holes in current offerings/curriculum/tools and assist in filling those holes.
  • To lower the barrier to entry in becoming a webmaker instructor by providing as much plug-and-play assistance as possible.

Educational Content

Information should be accessible by:

  1. Audience (eg: youth 10-16, or adult filmmakers, or kids in Nairobi)
  2. Topic (eg: privacy, intro to CSS)
  3. Educational tools (eg: Scratch, X-Ray Goggles)
  4. Curriculum (eg: Hackasaurus, Scratch for EDU, etc.)

Users should be able to add to any of the above, and provide comments / feedback on their experiences with any of the above.

For example:
I used the X-Ray Goggles to teach about remixing on the web. The kids loved it, but the adults found the UI to be a little too child-like. I was surprised that both advanced and total novice kids found use out of the goggles. Here’s a link to the lesson plan I used, in case anyone wants to use it.”

Other Content

  • Links to our hacktivity/event kits: how to hold events, and information from how to advertise, to how to engage volunteers, etc.
  • Crash courses to tools they may find useful: blogging software, collaborative tools (etherpad, IRC, google docs), organizer tools (event brite, online calendars, etc)
  • Space to advertise regional events / collaborate

What do you think?

What’s missing?

Most importantly, I want to mention that although Mozilla can seed this site with what we already know, its real value will come when others gather under the tent and really make the site into their own.  So anything that we can do to help foster this sense of community and ownership will be a huge plus.


Jared WeinSuper-awesome-happy comment time on Bugzilla

I have just taken part in another first for me.

Today I entered my first comment on a bug at the exact same second as another person left a comment on the same bug.

Joshua M. has started working on the navigation bar for the new Australis theme for Firefox and asked for some feedback along the way. Frank Yan and I both replied to his feedback in the exact same second, to the point that Bugzilla sent a single email that contained both comments!

I leave this hear for your viewing pleasure:


Do not reply to this email. You can add comments to this bug at

https://bugzilla.mozilla.org/show_bug.cgi?id=727650

--- Comment #5 from Jared Wein [:jaws] 2012-02-15 20:42:02 PST ---
(In reply to Joshua M from comment #3)
> Should I change the tabs at all with this
> bug or should we leave that to another bug?

Let's push as much work with tabs as possible to another bug.

--- Comment #6 from Frank Yan (:fryn) 2012-02-15 20:42:02 PST ---
(In reply to Joshua M from comment #3)
> I added an additional tab image for selected because it needs to overlap the
> nav-bar to cover the box-shadow. Should I change the tabs at all with this
> bug or should we leave that to another bug?

Thanks for making this patch!
The tabs should be left for a separate bug.

--
Configure bugmail: https://bugzilla.mozilla.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are watching someone on the CC list of the bug.

You can follow along on the work by viewing the bug.


Tagged: bugzilla, planet-mozilla

Meeting Notes from the Mozilla communityMobile Meeting Minutes: 2012-02-15

Mobile/Notes/15-Feb-2012

Contents

Details

  • Wednesdays – 9:30am Pacific, 12:30pm Eastern, 16:30 UTC

  • Dial-in: conference# 95312
    • US/International: +1 650 903 0800 x92 Conf# 95312

    • US toll free: +1 800 707 2533 (pin 369) Conf# 95312
    • Canada: +1 416 848 3114 x92 Conf# 95312
  • irc.mozilla.org #mobile for backchannel
  • Warp Core Vidyo Room

Schedule

  • Next merge is 2012-03-13

Major Topics for This Week

Release Roadmap
Fx 11 XUL is going to Beta channel. Fx 10 XUL ESR is going to the Release channel.

Uplift Situation
We are focusing on mozilla-central and less on constant uplift. Feel free to request “aurora” and “beta” approval for important bugs. We’ll be doing a mass uplift closer to merge of other things (not critical) that we want on Aurora and Beta.

Crashes
The crash statistics are improving, but we still need to keep a focus on cleaning them up.

Maple Status
Status update from the GFX team on what’s happening in Maple, what we can expect and when we can expect it.

Stand ups

Suggested format:

  • What did you do last week?

  • What are working on this week?
  • Anything blocking you?

Please keep your update to under 2 minutes!

James W. (snorp)
Kats
  • Last week:

    • getting up to speed on new gl layers compositor

    • did some instrumenting to get some metrics from the new compositor (time spent compositing, uploading textures, waiting)
    • wrote a tool to visualize different viewports so we can quickly get an idea of whether our behaviour is correct
    • did some instrumenting to compare skia vs cairo render times using a skia-enabled build on the galaxy nexus
    • refactored a bunch of the profile-reading code in java so it’s cleaner and more efficient (bug 726382) and hopefully allows 723295 to land without triggering random failures
    • got more tests running on the maple branch
    • fixed up compiler warnings on java 1.7
  • Next week:

    • more GL layers stuff – instrumenting and finding out where time is being spent, making sure tests are passing
GBrown

Last week:

  • Robocop reviews, code cleanup

  • Bug 705192 – remotexpcshelltests.py cannot execute xpcshell via SUT agent
  • Startup performance / profiling

Next week:

  • Wrap up 705192

  • Startup performance / profiling
AlexP

Last week

  • bug 721393 – Virtual keyboard enter key doesn’t work correctly in designMode document

    • Pushed the fix
  • bug 719121 – The delete key isn’t working correctly on etherpad
    • Latest patch for bug 721393 partially fixes the issue

    • Found a possible cause of the problem: bug 725919 “Visual cursor position is different from the actual one on Etherpad”
  • Preparing for departure
    • Updated the IME Wiki page to synchronize with the latest implementation of the IME handling components

    • Discussed the IME subject with Chris Peterson, answered his questions
    • Reviewed open IME bugs

This week

  • Wrap up the assigned tasks

  • Prepare equipment for return
  • Friday is my last day at Mozilla
Chris Lord (cwiiis)
Chris Peterson
  • Last Week

    • bug 715251 – Reduce overscroll distance and janky scrolling — IMPLEMENTING REVIEW FEEDBACK

    • bug 708167 – Testing about:home without Placeholder initialization. — ON HOLD, WAITING FOR bug 723251
  • This Week

    • bug 681192 – Investigating romaxa’s patches to avoid layer invalidation when scrolling — IN PROGRESS

    • bug 706891 – Making axis scroll lock unbreakble (regression from XUL Fennec) — CHECKED IN BUT INJECTED INTERMITTENT ROBOCOP FAILURE
    • Coming up to speed on Android IME.
  • Blockers

    • bug 681192 – I need some gfx assistance testing romaxa’s patches.

    • Waiting for bug 723251 to fix placeholder screenshots before I can commit bug 708167.
GCP
  • Last week:

  • This week:
    • Finish bug 726024 Some of the desktop bookmarks are put under “Mobile Bookmarks” after profile migration

    • Fix bug 727264 java.lang.ClassCastException: java.lang.Integer at ProfileMigrator.java:196 if Background Data is turned off
    • Fix bug 721352 – Add support for batch operations in LocalDB
    • Fix more bugs related to LocalDB Content Provider.
    • Add tests for Profile Migration & SQLiteBridge
  • Blockers
    • None
Brian N
  • Done

    • Investigated/fixed issues with bug 722413 – Bookmark menu item not updated when deleting bookmark in AwesomeBar

    • bug 711578 – Session restore doesn’t work for initial Fennec session crash
    • bug 726018 – Don’t update top site screenshots when receiving 404, 500, etc results
    • bug 720509 – java.lang.NullPointerException at org.mozilla.gecko.GeckoApp.onPrepareOptionsMenu(GeckoApp.java:487)
  • Next
    • bug 725987 – Create Telemetry (opt-out) notification for Nightly and Aurora (mobile)

    • bug 725609 – Bookmarklets don’t work in Fennec Native
    • Unit tests
Sriram
  • Last Week

  • This Week
    • Landed some optimizations for startup – bug 725932

      • Lazy load about:home bug 726201

      • Use ActionBar in ICS bug 711746
      • Lazy load DoorHangerPopup bug 725930
      • Now Fennec starts up in around 1sec (less than chrome! yaayy!!) on my Nexus S running ICS
      • Investigating some more optimization options
    • Display tabs-tray faster bug 706819
    • Display Preferences faster bug 726732
    • Some trivial UI fixes bug 727300,bug 727302
  • Blockers
    • None
WesJ

Last Week:

  • Landed beginning parts of password provider bug 704682 and bug 718817

  • Fixed error with profile migrator bug 725858
  • Started work on Form history provider bug 725881
  • Started work on tests for passwords and form history providers

This week:

  • Constantly ping for the final review that password provider needs bug 718760

  • Finish form history provider
  • Finish tests for everything
LucasR

Last week

  • bug 719434 – ‘Tabs From Last Time’ not wiped on Clear History

  • bug 723103 – Properly update about:home when history is cleared
  • bug 718615 – ‘Clear history’ is broken
  • bug 723841 – Bookmarks database consistency constraints
  • bug 724348 – about:home – vertical space is wasted with only 1 or 2 thumbnails shown
  • Blog post: http://lucasr.org/?p=2643
  • Code reviews

This week

  • Database/ContentProvider unit tests

  • Perf improvements on history/bookmarks DB
  • P1/P2 bug fixing

Blockers

  • None
MBrubeck

Done:

  • bug 726863 – Use mobile-specific strings for add-on download error messages

  • bug 719684 – Show an error message when add-on download is blocked or cancelled
  • bug 723156 – Fix the back button for new windows opened by frames
  • bug 723077 – Speed up processing of option elements in FormAssistant
  • bug 724795 – Update the add-on list when a search engine is added or removed
  • Meeting with legal team about Apple’s touch event patent disclosure

Next:

  • More add-on manager work

  • Font inflation preview UI
  • Working with W3C Touch Events patent advisory group
Margaret

Done:

  • Worked on some follow-ups to bug 725171 – Show mobile/desktop bookmarks separately

  • Spent most of my time working on bug 722020 – Create proper bookmark folder UI
  • Started writing some robocop tests

Next:

  • Finish bug 722020 and its dependencies

  • Write tests!
  • Offline this afternoon for UC Berkeley Career Fair and PTO Friday
Scott (jwir3)

Last Week:

  • Assisting dbaron to troubleshoot Bug 706193: footer text on nytimes.com inflated abnormally

  • Minor security crash

This Week:

  • Bug 708187 : Titles bleed out of divs in marketwatch.com

  • P2 bugs re: font inflation
    • Bug 711418: Font inflation has no effect on www.cnn.com

    • Bug 705446: font inflates text extremely large in certain parts of the page
    • Bug 707195: news.ycombinator.com comments inflated to different sizes

Blocking:

  • None
BLassey
  • continued my war on tab screenshot performance

  • started a new war on JSON
  • refactored how we create GeckoEvents (java)
  • talked to legal about advocacy with EFF for the jail breaking exception in the DMCA
DougT
  • focusing on finding / fixing (or getting people to fix) crashes.

    • under 10 crashes per 100 adus

    • low volume means crashes per adus is a bit jumpy
MFinkle

Done:

  • Reviews

  • Media training (say it like Bill Murray says “Army training” in Stripes)
  • Investigate the “40 seconds to load awesomebar” issue. We found a few issues, including a simple fix.
  • MWC planning
  • MWC demos

Next:

  • Reviews

  • MWC stuff
  • Sleep
Josh (Arreth)
  • Last Week

    • Worked on & submitted patch for bug 723251

      • This bug fix will rely on the r+ patch for bug 711578

      • This patch will most likely need to be adjusted to include blassey’s fixes for bug 724210
  • This Week
    • Working to fix bug 727202 & 712543

      • Bug 712543 relies on fixes from bug 727202
  • Blockers
    • No completely blocking issues at the moment
Madhava
Ian Barlow
Patryk Adamczyk

Round Table

QA

  • 18 Maple Bugs reported

    • Crashers:

    • The known adreno 200 crasher one
    • bug 726838 – MAPLE: Maple branch crashes due to OOM with loading another web page and panning
    • bug 726872 – MAPLE : crash [@ LockImpl::Lock]
    • bug 727140 – MAPLE: crash [@ TouchBadMemory]
  • This week’s focus:
    • Test and Ship Fennec 11 XUL beta 3

    • Test focus on Nightly channel
    • Test focus on Maple channel
    • Help with testing MWC demos

SUMO (just a wiki update, michelle had to drop off for another meeting)

  • Last week: Worked on documentation updates and filed a couple of bugs for getting started, sync (migration), and menus

  • This week: Working on documentation updates for security, privacy, and add-ons
  • Next week: Working on documentation updates for troubleshooting, content features, and mobile landing pages

Meeting Notes from the Mozilla communityFirefox/Gecko Delivery Meeting Minutes: 2012-02-15

Firefox/Planning/2012-02-15

« previous week | index | next week »

Planning Meeting Details

  • Wednesdays – 11:00am PDT, 18:00 UTC

  • Mountain View Offices: Warp Core Conference Room
  • Toronto Offices: Fin du Monde Conference Room
  • irc.mozilla.org #planning for backchannel
  • (the developer meeting takes place on Tuesdays)

Video/Teleconference Details – NEW

  • 650-903-0800 or 650-215-1282 x92 Conf# 95312 (US/INTL)

  • 1-800-707-2533 (pin 369) Conf# 95312 (US)
  • Vidyo Room: Warp Core
  • Vidyo Guest URL
REMEMBER

These notes are read by people who weren’t able to attend the meeting. Please make sure to include links and context so they can be understood.

Contents

Actions from Last Week

  • ally to coordinate with greg jost on sync uptake metrics, and measuring the impact of the FF10 usability changes

    • See status update below!
  • laura to report on the state of persona/personas discussion
  • cheng to report back on connection reset issues with SSL
  • johnath to wrangle representation in this meeting for identity
    • Emailed and got confirmation that they will start sending representation

    • Added them to the template

Schedule & Progress on Upcoming Releases

Firefox Desktop
Release (3.6, 10)
  • 10.0.1 released (unthrottled) last Friday. Release notes here. We did not need a re-spin for 3.6.

  • We’ve pushed a prompted major update from 3.6.26 to 10.0.1 as of 2/14
    • Updated billboard with stronger copy and fixed some confusing links.

    • Cut 3.6.X ADUs by 30% since beginning of December, and hoping to cut the remaining ADUs by half in the next few months.
Beta (11)
  • Next merge date is 3/13

  • Beta 3 will be released Friday 2/17
Aurora (12)
Nightly (13)
  • Snappy

    • Killing Firefox start-up inefficiencies on Windows. Check out the details on Brian Bondy’s blog.

    • Most of the cycle collector fixes have landed. Telemetry shows a dramatic reduction in cycle collection times for Firefox 13. Olli and Andrew are investigating the remaining causes of long CC times.
    • Vladan landed a dom storage fix that should reduce the amount of main thread SQL done by content bug 714964.
    • Lots of frontend Telemetry probes are landing (see bug 671038) and already paying off as we caught a tab animation regression in bug 724349.
    • Bug bug 723561 – Create telemetry stopwatch helper to easily store/retrieve timestamp data
Firefox Mobile
  • Trunk

    • Waiting for OGL layers to land, ETA next week

    • Good stuff landing in the mean time
      • Start up improved to be faster than Chrome

      • Tab screenshot’ing for thumbnails *much* improved
      • Tab tray openning/closing improved
      • Awesomebar opening improved, especially for large profiles (40s -> 1.6s)
      • Crashes are being killed at an alarming rate (from 115 per 100 ADUs to 5 in 6 weeks)
  • Aurora
    • Trucking along with both Native and XUL builds
  • Beta
    • Going to ship XUL to the market for all devices until Native is ready for prime time
  • Release
    • Going to ship XUL 10 ESR until Native finishes its beta cycle

Other Notes:

  • current plan is for Native UI to go out to phones in Firefox 13

  • current plan is for Native Tablet UI to go out to tablets in Firefox 14
  • This plans are very much in flux, they are here for informational purposes only
Firefox Sync
  • Firefox 10 Initial Impact

    • Uptick in traffic to sumo, but no down trend in forums

      • Where can I find the code to add a device to Firefox Sync? 3x (from ui)

      • How do I sync Firefox between my desktop and mobile device? 1.5x (from ui)
      • Increases in ‘What’s Firefox Sync?’ & ‘How do I manage my Firefox Sync’
    • Metrics is looking into more quantitative numbers. No ETA yet
  • Organizational Changes/Announcements
    • Sync’s Dev Ops and Developers have been combined into one team

    • Sync’s UX/UI is now owned by Madhava, all other services UX is owned by Bryan Clark. Congrats to both of them
  • The next Sync Rapid Release meeting is coming up.
    • If there is something you would like the sync team to work on or a new idea to consider, pitch it there

    • 2pm pst, Feb 28th, vidyo room ‘services’ please email ally if you would like to be added to the zimbra invite.
  • BrowserID+Sync Authentication
    • Warning: The two sync systems will not be backwards compatible or interoperable
  • Native Sync
    • Please file bugs. Not sure how to file a good android sync bug? http://160.twinql.com/how-to-file-a-good-android-sync-bug

    • We have daily bug triage at 4pm, #androidsync
    • Old news that bears repeating:
      • Data may be lost, reordered, or corrupted. Please do not use your good profiles

      • Please remember behavior is undefined if multiple instance of Native Fennec (nightly, aurora, etc) are on a single device
      • You still cannot create an account from a mobile device
        • Though some of our contributors may change that!
  • Upcoming Releases
    • Addons being sync’ed in Firefox 11, XUL/tablet Fennec 11 (aka Beta): Addon Sync

    • Native Sync has been enabled in Nightly & Aurora (but not Beta)
Add-on Builder
  • 1.0 release has been rescheduled for next Wednesday

  • Work week for Builder team is next week
Add-on SDK

Release (1.4 -> Firefox 9, 10)

  • Looking good since last week’s hotfix

Stabilization (1.5 -> Firefox 10, 11)

  • Spun 1.5RC2 yesterday

  • Still on track to release next week, Feb 21, 2012

Development (1.6 -> Firefox 11, 12)

  • Current thinking is that bug 696533 might get us more mobile features faster – can’t tell timeframe so not adding to docs yet.

  • On track to merge to Stabilization on Feb 21, 2012

Bay Area Firefox Add-ons meetup Tuesday, February 21 6:00PM PST at the Mozilla SF Offices RSVP Here – join us!

Identity
  • Sign into the browser feature page

  • Gone through a couple of rounds of wireframes, progressing nicely (not on the feature page, will get them there soon)

Feedback Summary

Desktop
  • Firefox 10.0.1:

    • Looks like we fixed the cursor thing by fixing Java :)

    • Performance :(
    • AVG seems fixed, Norton is getting better
    • Youtube issues [1][2][3]
    • Problem with German update?: [4]
    • Report from this weekend:
Mobile
  • No new feedback updates this week, some anecdotal feedback from 10 provided to UX

  • Working on NativeUI documentation
  • Testing Aurora and Nightly and Sync set up
  • SUMO day tomorrow, to support 10.0.1

UX & User Research

Market Insights

Desktop / Platform
Google
  • The Chromium team expanded the Chromium Security Rewards Program, by increasing its scope to cover the Chromium OS.

  • The new Chrome Beta release enables GPU-accelerated rendering of 2D canvas content, and also enables WebGL acceleration for people with older GPUs using Swiftshader, a software rasterizer that Google licensed from TransGaming. This should make for significant performance improvements on systems like Windows XP.
  • Chrome’s dev channel features an updated V8 Javascript engine that offers initial support for lexical scoping, collections, weak maps, and proxies.
  • Google also released a Field Guide to Web Applications that offer a high-level, architectural overview of how to design web applications. Their HTML5Rocks site was updated, and features an excellent detailed overview of the architecture of the Chrome and Mozilla browsers.
  • Chrome 17 stable was released. 20 security bugs were fixed — 1 critical, 8 high, 5 medium, and 6 low. A significant number were detected with AddressSanitizer, a fast memory error detector.
  • Chrome’s Dev Channel release has a few interesting new features, including using Google’s servers to conduct spellchecking for entered and pasted text.
  • The Sencha team conducted an initial review of Google Chrome for Android, giving it high marks. It notes that SunSpider performance is little different than other browsers and suggests that it is now time to shelve that particular benchmark test.
Opera
  • The latest snapshot of Opera 12 offers support for Do Not Track and a substantial number of SSL performance optimizations.
Microsoft
  • Microsoft released a Critical update for MSIE 6, 7, 8, and 9. The vulnerability would allow remote code execution from a specially constructed web page. The update itself had to be updated shortly afterwards after it incorrectly reported that google.com was infected with the Blackhole Exploitation Kit.

  • MSIE 10 will allow full support for Cross-Origin Resource Sharing for XMLHttpRequests.
  • In a 9,000 word blog post, Microsoft’s Windows president Steven Sinofsky divulged a slew of details on Windows on ARM. Microsoft plans to have ARM PCs available when other Windows 8 computers are available, and the company will also include desktop versions of optimized Office 15 applications. Windows 8 ARM PCs will also never turn off, instead going into a standby mode that should last for weeks.
WebOS
  • HP released the source code to Isis, the WebOS browser, which apparently offers “unrivaled speed and standards compliance”.
W3C
  • Webmonkey has a good summary article describing the issues and positions in the debate as to whether other browsers should support -webkit-prefixed CSS properties. (Also, Tantek’s interview at A List Apart.
Mobile

Summary below, full update here and in your inbox.

  • The acquisition of Motorola Mobility by Google was approved in the US and the EU
  • Google plans to test a “next generation personal communication device”
  • The Android Market was enhanced with automatic malware scanning for apps
  • Android captured 51% of smartphone sales in 2011, iOS 24% and Symbian 12%
  • Smartphones represent only 12% of total global handsets in use today, but over 82% of total global handset traffic
  • First Intel Medfield-based Motorola handset rumoured to be announced at MWC
  • Skyfire raised almost $8 million in a round of funding which was in part sponsored by Verizon
  • More details on Windows Phone 8 revealed
  • Opera partnered with India’s third largest carrier
  • Dolphin browser 3.5 was released on iOS

Marketing, Press & Public Reaction

Desktop
  • New 3.6 Upgrade Billboards went live yesterday (thanks Pascal and L10n!)

    • As discussed above, strengthened copy and upgrade experience, Cut ADUs by 30% since December.
  • Working on website collateral for next releases
  • Display ads continuing for another few weeks
  • Starting the blog process for next Aurora and Beta
Mobile
  • MWC demo scripts revisions

  • Finding agency for FF11 launch programs
Press

Questions, Comments, FYI

Actions this week

  • cheng to dig into connection reset issues with SSL

  • irina to let us know whether dolphin for iOS uses Sync

Joshua CranmerAchievement Unlocked: Use 100GB of memory in a single process

I discovered that the compiler I was using last night managed to run out of memory while compiling some code. This was on our research group's server which has a whopping 128GB of memory. And by "ran out of memory", I literally watched in top as clang went from dozens of megabytes of memory to 120GB of memory, evict everything from the cache and thrash swap like crazy before the out-of-memory killer decided it ought to go.

What was I doing? No, I wasn't linking the source code to the universe; I was merely compiling a file in the Spec 2006 benchmarks. And this wasn't anything large--only 3700 lines of code or so in a single C++ file. And the pass that wasn't dying wasn't some horribly written pass that leaked memory like a leaky bucket. Indeed, LLVM tends to get you to free memory too quickly, judging by how many times I've chased down memory corruption. If you don't believe me, the offending code was this:

    Code = CloneBasicBlock(CodeOrig, ValMap, "", F, NULL);
    for (II = Code->begin(), EE = Code->end(); II != EE; ++II) {
      if (!isa(II))
        RemapInstruction(II, ValMap, RF_IgnoreMissingEntries);
    }

For those of you who don't know what the code is doing, it roughly amounts to this: make a copy of a basic block of a function, and then tell all of the instructions to use the new instructions instead. On some programs, though, this simple instruction seems to have compelled the code to eat up gigabytes of memory.

Fortunately, I am now proud to announce that I have reduced my memory consumption by 99%… with a one-line fix. So I guess I should get the achievement for "Fix the Memory Leak" as well?

Michelle LevesqueInventing on Principle

Nicholas NethercoteMcAfee is killing us

A reader named AC commented on last week’s MemShrink report that Firefox was consuming lots of memory on his girlfriend’s computer (emphasis added by me):

I am currently on my girlfriends laptop round at her house and I am surfing the net using Firefox 10.0.1. The memory usage is terrible. It may be because of the two McAfee add-ons that she has, I don’t know, but I can see now first hand how some Firefox users are having an amazing experience and others are still lagging behind. The memory usage as opposed to being 200,000-230,000kb as it would be on my laptop with 11 beta 2 is about 350,000kb or more. That said, there is no loss of performance and that is what matters most. I am not looking for answers or solutions, merely saying that the same or very similar software used on one computer can perform completely differently on another and now I appreciate that even more having witnessed it for myself.

I asked him to try turning off the McAfee add-ons, which he kindly did.  The result (emphasis again added by me):

I did some very very rudimentary tests earlier at my girlfriends house on her laptop and here is what I found.

With the two McAfee add-ons running everything was fine until I got to about 8 tabs and then the memory began to increase. Then it just climbed up to about 450,000 kb. If I was running the same tab load on my latop, I would expect just over half that amount of memory to be reported in task manager.

I have to say that there was no loss of performance, but the amount of memory being used was very high for the tab load.

The first tab that I had open was google.co.uk. I right clicked on that tab and hit “Close Other Tabs”. The memory stayed at 418,000 kb and that was it. It stayed at that level for about 10 minutes whilst I went and did other stuff. It wasn’t going up or down. 400MB with just Google UK open and nothing else. It’s diabolical.

So I then disabled the 2 McAfee add-ons and every went back to normal. I used a heavy tab load than before. I opened more tabs with more complex content. I must have had about 15 tabs open and the memory use peaked at 386,000 kb.

Then I logged out of Facebook and Hotmail, without closing any tabs, and within 10 seconds the memory had dropped to 330,000 kb.

Then I closed all but 3 tabs and within 30 seconds the memory was about 180,000.

Then I closed all but one tab and the memory settled at just under 100,000 kb. Back to normal. Exactly how I would expect Firefox 10.0.1 to perform.

The extensions in question were McAfee ScriptScan for Firefox 14.4.1 and McAfee Site Advisor 3.4.1

I didn’t have time to test them individually as things got hectic after that, but as you say Nicholas, the seemingly innocent extensions were ruining the memory performance of a perfectly good browser.

I could still load pages etc and navigate around as fast, but the numbers on task manager were sky high.

Firefox has a reputation in particular for not releasing memory when tabs are closed.  75% of installed add-ons are not hosted on AMO, and thus are out of Mozilla’s control.  This is killing us.  Bug 720856 is my best suggestion for dealing with badly written add-ons such as these ones, but even it feels like weak tea when the problem is so large.

Nicholas NethercoteBlog hassles

The Mozilla WordPress installation was upgraded a couple of days ago.  I had a simple captcha plug-in enabled before this (I don’t remember it’s name).  It asked you to solve a very simple arithmetic problem (e.g. “what is 1+1″) before your comment would appear.  It was very effective at stopping spam comments.  Prior to me enabling it I would get  numerous spam comments per post which I had to manually delete.

After the upgrade, this plug-in doesn’t seem to be available any more.  There’s a plug-in called “simple CAPTCHA” which is a picture-based one.  I turned it on but some people reported problems, there were some double-posts, and when I tested it the captcha image didn’t load properly.  Furthermore, spam comments still seemed to be getting through.

Any suggestions?  None of the other spam-fighting plug-ins seem appropriate.  Really, I just want my simple arithmetic problem captcha back.  If I can’t get something working I might have to require people login before commenting.  But I’d rather not do that, as it will deter some commenters.

Pascal FinettePutting my money where my mouth is

Two days ago I mentioned that I intend to write a book about Open Innovation (the Mozilla way).

I am thinking about finding a company (ideally not in tech) which is interested in implementing an Open Innovation strategy into their business process and which would like my support/help to do so. It would help me refine my thinking and gain insights into challenges, problems and opportunities outside of Mozilla’s world and hopefully would help the company on their own journey (and make the book more useful).

This is all still pretty raw in terms of thinking - but do let me know if you represent such a company (ideally mid to large size) and are interested.

Michelle ThorneMozilla Popcorn Learning Lab in London

Next up in the round of event recipes, Brett & I wrote up a Popcorn learning lab.

Since publishing the Popcorn hack jams how-to, we’ve been in touch with film festivals, coder communities, and video labs from all over about running events about Popcorn.

Skill up the community

At the moment, we’re still in a resource-crunch. Even though we can help event organizers to plan and facilitate their hack jam, there’s a shortage of people who know how to use Popcorn.

The options we currently have are:

  • fly around Team Popcorn, based primarily in North America
  • or, skill up web developers the world over, empower them to code and facilitate, and reward core contributors with trips to cool places like Cannes and Cape Town.

The more we can train the trainers, the more we can scale these open projects.

Test Round in London

To test out the recipe and grow the European community, we’re throwing a learning lab on Sunday, March 25 in London.

We’re looking for Javascript developers and filmmakers bold enough to dabble with code. Drinks, code, and good ideas are in the mix at this one-day event led by the Mozilla Popcorn team. Please sign up to join!

Want to know what we’ll do in London, or how to host your own Popcorn learning lab? Read our howto.

Michelle ThorneHowTo: Mozilla Popcorn Learning Lab

Popcorn Learning Lab

A Mozilla Popcorn Learning Lab is an event to introduce developers and filmmakers to Popcorn.js, an HTML5 javascript library that integrates the web into media production.

Participants will create plugins, hack templates, and code a demo that easily remixes web content into video, using open tools and collaborative design.

You can organize a learning lab with this guide!

Why Popcorn?

Well, besides it being fun Javascript library to play with, it’s a powerful tool to create web-enabled video. Christian Heilmann did a great job describing its strengths and opportunities:

  • Video is typically hard to edit and change
  • Video is often a black, unindexed hole on the web
  • Separation allow for easier maintenance, enhancement, accessibility, and discovery
  • HTML5 video is just another page element
  • The timestamp is the glue
  • Tap into the real-time web using Popcorn.js

Demos also speak loudly about Popcorn’s possibilities. Take a look!

What

Participants will get their hands dirty by sharing hacks and peer-reviewing projects. Demos from the Popcorn community provide inspiration and running code to build from.

The motto: By sharing and by doing!

Learning Labs can be hosted in partnership with Mozilla, who provides facilitation experience and extensive knowledge of the software, and by community members versed in Popcorn.

Mozilla will work with partners to ensure participants leave with a deeper understanding of Popcorn’s possibilities and how to teach others.

Learning Labs can also be self-organized following this handy guide!

Who

Teams consist of:

  • Web developers skilled in Javascript
  • Bold filmmakers wanting to play with cod
  • Experienced Popcorn.js contributors

Small teams of web developers are paired with experienced contributors. Facilitators and web designers are also key roles at the learning lab.

How

Pre-Learning Lab Engagement

Mozilla and partners contact Popcorn community members, Javascript developers, and filmmakers in the area. Through lightweight interviews with sampling of participants, the organizers calibrate the skill levels and interests of the group, fine-tuning the agenda around what people want to learn and make.

Agenda

All the participants and facilitators meet for a group demo. Popcorn contributors walk through the basics of the Javascript framework, highlighting use cases and possible avenues of development.

In the first hacking session, depending on technical skill, participants choose to:

  • play with Popcorn Maker — an authoring environment for interactive video — and turn a video interactive.
  • or dive into coding a plugin, a powerful way to bring in another service, like Flickr, OpenStreetMap, DocumentCloud or many others, to respond to video.

After busting a hack, the group shares back what they made. Participants give feedback, file bugs, offer help, and note ways to improve the experience.

In the second hacking session, you can:

Participants code their project, giving feedback and checking in with more experienced contributors if they get stuck.

At the end of the day, a screening and party is held. Each group demos their final code, evaluates the process, and celebrates all the hard work.

Afterward, participants sign up for activities they’re interested in: joining upcoming events, contributing code to Popcorn.js, teaching other developers, or just staying informed about the project.

Resources
  • At least one computer per team.
  • Video-editing software as well as a fast, modern browser.
  • Popcorn.js installed.
  • Video files for each demo.
  • Reliable wifi.
  • Power outlets.
  • Projector with suitable adapters
  • Meals – events should be catered
  • Amenities such as coffee, water, and snacks.
  • Travel support to the learning lab, where needed.

Case Studies of Popcorn Events

Independent Television Service (ITVS) + Mozilla, San Francisco. http://www.wired.com/underwire/2011/10/coders-filmmakers-popcorn/all/1 Video: http://mozillapopcorn.org/the-living-docs-hack-day/

“ButterCamp”, NYC, March 2011. http://mozillapopcorn.org/videoblog-buttercamp/

Mozilla Festival, London. November 2011. http://mozillapopcorn.org/what-we-made-at-mozfest/

Photos: CC BY-NC-SA by Jonathan Mcintosh

Greg WilsonI Have Seen the Future…

…and its name is Bret Victor. (Jump ahead to 7:00 and watch for a couple of minutes if you need to be persuaded…)

Niko MatsakisRegions-lite...ish

I was talking to brson today about the possibility of moving Rust to a regions system. He pointed out that the complexity costs may be high. I was trying to make a slimmer version where explicit region names were never required. This is what I came up with. The truth is, it’s not that different from the original: adding back region names wouldn’t change much. But I’m posting it anyway because it includes a description of how to handle regions in types and I think it’s the most complete and correct proposal at the moment.

The summary

You would have four kinds of Rust pointers:

@MT --- pointers to task-local, boxed data
~MT --- pointers to unique data
&MT --- safe references
*MT --- unsafe, C-like pointers

Here the M refers to a mutability qualifier (default, mut, or const) and T refers to a type.

&MT types, called references, are the new addition. A reference is a pointer which always points at memory whose validity is guaranteed by some outer stack frame. The idea is that a caller can give a callee a reference to some memory that the callee may use but which may not escape the callee. This memory may be on the caller’s stack frame or it may be a reference into the task or exchange heaps which the caller is going to keep valid. This guarantee is upheld by the type system.

Reference types may appear anywhere. However, if they are used within another aggregate type such as a record, enum, or class, they “infect” their container so that it too is considered to be a reference. This is done by introducing a new kind into the type system, ref (actually, this is sort of a negative kind: more formally, there is a kind heap which contains all types but for those that may transitively include a reference). This kind may or may not be user visible: see the section on generics for a discussion of the options.

Coercion between pointer types

The type &MT is not a supertype of @MT and ~MT, but it is coercable. In the case of @, we could probably make it a true subtype, but at the moment a box pointer includes a header, ref count, etc and so is not binary compatible with a & pointer, which would be just a pointer to the box body. If we changed our representation so that @ pointers point directly to the box and the header is stored at a negative offset, then we could allow @T to be a subtype of &T.

The type ~MT, however, can never be a subtype. ~ is not a region. Rather, the data at the other end of the pointer logically belongs to a region of its own. So we can allow ~MT to be coerced to &MT, but the region will be a fresh region, and access to the ~MT pointer must be prevented for the scope of that fresh region. This is called “borrowing” a unique pointer. It is only possible for “unique paths”, where a “unique path” is a path of identifiers a.b.c...z that is the only path by which the unique variable can be reached (in practice, this means that a must be a local variable and all of the fields b...z must have unique or interior type). All of the prefixes of the unique path must be considered borrowed as well. I am not going into great detail on the handling of uniques here: it should be quite similar to what we have today in practice.

Tracking validity of references

Although the user never needs to write it explicitly, each instance of a reference type is internally associated with a region. There is one region for every block in the code. In addition, each function/method has a special region called caller. For simplicity I do not consider classes nor impls; it is relatively straightforward to extend the system to such cases.

Regions are arranged into a tree derived from the structure of the blocks in the source code. The region caller is a superregion of all the internal regions to a function.

In the implementation / formal version of the type system, these regions are represented explicitly. So a user-written type &MT expands to a type r&MT where r is the node id of the block or of the function itself (in the case of the caller region). The region r is derived from the position where &MT appears and by inference:

  • if &MT appears within a parameter list, r is the caller region.
  • if &MT appears on the type of a local variable, inference is used.
  • if &MT appears in a type declaration, see section below.

In general, the type a&T is a subtype of b&T if b is a subregion a. The reason is that, because a is a superregion of b, the pointer a&T is always valid whenever the region b is valid.

References in type declarations

The rules for which region is assigned when the user writes &MT omitted one important case: what happens when this type appears in a type declaration? Consider the following example:

type crate_ctxt = {
    mut_map: &map<...>,
    node_map: &map<...>,
    another_map: &map<...>,
    yet_another_map: &map<...>
};

In such cases, the region for the internal references will be assigned when the type is used. For example:

fn trans_foo(ccx: &crate_ctxt) {...}

Here, the type of ccx will be expanded to:

caller&{mut_map: caller&map<...>, node_map: caller&map<...>, ... }

In effect, types which contain references (transitively) are implicitly parameterized by a region parameter. There is only one such parameter. When the type is instantiated in a specific context, the value for that parameter is provided based on the context.

Taking the address of variables and so forth

The unary operator &M can be be used with both lvalues and rvalues. When used with an lvalue, it takes the address of the lvalue. The mutability qualifier provided must agree with the mutability of the lvalue. When used with an rvalue, it creates temporary space on the stack and copies the rvalue into it.

Here is an example of taking the address of lvalues:

fn foo() { // region for this block is "r"
    let x = 3;
    let mut y = 4;
    let px1 = &x;       // OK: yields type r&int
    let px2 = &const x; // OK: yields type r&const int
    let px2 = &mut x;   // Error: x is immutable
    let py1 = &y;       // Error: y is mutable.
    let py1 = &const y; // OK: yields type r&const int
    let py1 = &mut y;   // OK: yields type r&mut int
}

Here is an example of taking the address of rvalues:

fn foo() { // region for this block is "r"
    let p1 = &{x: 3, y: 4}; // OK: yields type r&{x:int,y:int}
    let p2 = &mut {x: 3, y: 4}; // OK: yields type r&mut {x:int,y:int}
}

Limitations on references

In order to guarantee that reference types do not escape the callee, the type system imposes some limitations:

  • Reference types may not be returned.
  • Reference types may not be closed over (copied/moved into a closure or interface instance).
  • Generic type variables cannot be bound to reference types unless the generic type variable is of the ref kind.

I will cover each restriction in turn. First, though, I want to more precisely define what the type checker considers to be a reference type. The definition is inductive:

  • a reference &MT;
  • a type whose definition may contain a reference (e.g., @&T or {x: &T}, or a class with a field of reference type);
  • a generic variable with bound ref.

Reference types may not be returned

The danger here is that the callee may pass back a reference to the caller that is no longer valid. This is relatively straightforward to prevent: do not allow the return type of a function to be a reference type.

Reference types may not be closed over

It is not allowed to copy a reference type into a boxed/unique closure nor is it allowed to cast a reference type to a boxed or unique iface. The reason is that these are the points where the type system loses the ability to track the constituent types and so we cannot distinguish a fn@() that closes over a reference type from other fn@() types.

Generic types

There is of course a concern that the limitations on reference types might be circumvented through the use of generics. This is prevented through the use of a type kind ref. A generic type variable may not be bound to a reference type unless it includes the bound ref. Moreover, any generic type variables bound by ref are considered reference types and therefore must obey the above restrictions.

A note on variance

In general, ptr types like &MT or @MT are covariant in T if M is not mut. This is different from references today which are always covariant in T; the current behavior is what leads to the type hole pointed out in the mailing list.

Irina SanduAndroid and mobile browsing insights – Week 7

 

Every week I post an overview on what’s been happening in the mobile (browsing) world and is relevant to Mozilla.

 

  • The acquisition of Motorola Mobility by Google was approved in the US and the EU
  • Google plans to test a “next generation personal communication device”
  • The Android Market was enhanced with automatic malware scanning for apps
  • Android captured 51% of smartphone sales in 2011, iOS 24% and Symbian 12%
  • Smartphones represent only 12% of total global handsets in use today, but over 82% of total global handset traffic
  • First Intel Medfield-based Motorola handset rumoured to be announced at MWC
  • Skyfire raised almost $8 million in a round of funding which was in part sponsored by Verizon
  • More details on Windows Phone 8 revealed
  • Opera partnered with India’s third largest carrier
  • Dolphin browser 3.5 was released on iOS

 

The FCC and the European Commission approved Google’s bid to buy Motorola Mobility. The 2 governing bodies reasoned that the deal would not raise competitive issues, as Motorola is not a dominant Android smartphone producer, but they maintained that they reserve the right to investigate past or future action by Google with regard to the use of standard essential patents, which is considered the main reason for this acquisition. The merger grants Google a substantial amount of mobile essential patents, which enables the company to better protect the Android ecosystem as several Android OEMs are engaged in various patent legal battles with companies such as Apple and Oracle, in jurisdictions across the world.

 

In related news, Google filed for FCC approval for the testing of a “next generation personal communication device”, which would have WiFi and Bluetooth abilities. The devices would be evaluated for their “throughput and stability of the home WiFi networks that will support the device”. Speculation connects this venture to the company’s Google Fiber project, which is being set-up in Kansas City and aims to provide homes with fast Internet connections.

 

Google released Bouncer, an automated service which scans the apps in the Android Market for potentially malicious software. This comes among increasing concerns on security and privacy in the mobile industry and the Android ecosystem, the latest of which being raised as software security firm Symantec revealed a recent malware campaign when a series of 13 different infected apps were downloaded by between 1 and 5 million Android users.

 

There were 149 million smartphones sold last quarter and 51% (76 million) of them were Android-based, with iOS coming in second (24%), followed by Symbian (12%), BB OS (9%), Bada (2.1%) and Windows Phone 7 and Mobile (1.9%), according to Gartner. Profits-wise, Apple was the leading OEM and captured 80% of total smartphone profits, up from 56% in the third quarter, and leaving 15% to Samsung and the rest to the other players, however Apple’s performance is not expected to sustain in the following quarters, and to be brought closer to Q3′s results, where it had 56% of total profits. The total mobile phone sales market in Q4 of 2011 totaled 476 million units and for the whole year 1.7 billion devices. The top phone vendor for 2011 was Nokia, with 422 million devices sold, accounting for a 24% marketshare, followed by Samsung with 314 million units (18%), Apple with 89 million (5%), LG with 86 million (4.9%), ZTE with 57 million (3.2%), RIM with 52 million (2.9%) and other with 753 million and 42% marketshare.

 

The number of mobile devices will exceed the number of people on earth for the first time by the end of 2012, a report from Cisco reveals. This confirms the trend of mobile growing towards worldwide penetration saturation, but does not mean that it was reached, because there still are large discrepancies in mobile penetration across different countries, some reaching as high as 200% and some as low as 5%. Other stats from the report include :

  • Smartphones represent only 12% of total global handsets in use today, but over 82% of total global handset traffic. In 2011, the typical smartphone generated 35 times more mobile data traffic (150 MB per month) than the typical basic-feature cell phone (which generated only 4.3 MB per month of mobile data traffic).
  • The top 1 percent of mobile data subscribers generate 24 percent of mobile data traffic, down from 35 percent 1 year ago. Mobile data traffic has evened out over the last year and now approaches the 1:20 ratio that has been true of fixed networks for several years.
  • Average smartphone usage nearly tripled in 2011. The average amount of traffic per smartphone in 2011 was 150 MB per month, up from 55 MB per month in 2010.
  • In 2011, the number of mobile-connected tablets tripled to 34 million, and each tablet generated 3.4 times more traffic than the average smartphone. In 2011, mobile data traffic per tablet was 517 MB per month, compared to 150 MB per month per smartphone.
  • Mobile network connection speeds will increase 9-fold by 2016. The average mobile network connection speed (189 kbps in 2011) will exceed 2.9 megabits per second (Mbps) in 2016.
  • Mobile-connected tablets will generate almost as much traffic in 2016 as the entire global mobile network in 2012. The amount of mobile data traffic generated by tablets in 2016 (1.1 exabytes per month) will be approximately equal to the total amount of global mobile data traffic in 2012 (1.3 exabytes per month).

 

A device which is rumoured to be Motorola’s first Intel-based Android phone leaked, supposed to be announced in 2 weeks at the Mobile World Congress. Only details available were that it would run Ice Cream Sandwich and would use processors from the Medfield range. Motorola’s (which is now owned by Google) choice for Intel for its first Ice Cream Sandwich device is significant because it is a significant step towards Intel’s penetration of the mobile market.

 

Skyfire announced that it raised almost $8 million in a round of funding which was in part sponsored by Verizon. The software vendor also declared that it made partnerships with other 2 US carriers for its cloud-based mobile browser solutions. The Skyfire browser just passed 12 million downloads on Android and iOS combined.

 

Details about the next version of Windows for mobile phones, Windows Phone 8, code-named Apollo have been leaked to reveal support for multi-core processors, four different screen resolutions and NFC technology support. Consistency and synergy between the PC / tablet of Windows 8 and Windows Phone 8 will be important and application development and porting from one platform to the other will be streamlined. The new version of Windows for phones will include Skype integration and built-in server-side compression for Internet Explorer 10.

 

Opera announced a partnership with Idea Cellular, India’s third largest mobile operator, to offer a customized version of its Opera Mini mobile browser to its over 100 million subscribers across the country.

 

Mobotap released version 3.5 of the Dolphin browser for the iPhone and the iPad and it launched on a new platform, the Barnes & Noble Nook tablet.

 


Greg WilsonSlide Drive

I just posted a note on the Software Carpentry site about Slide Drive, a new HTML5+audio slideshow tool from David Seifreid. Please check it out and let us know what you think.

David BurnsAutomation Services Week 6 February - 10 February

Automation Services, the team I co-lead with Henrik Skupin, are going to start sending out weekly updates so that everyone can be aware of what we have been upto in the last week on our main projects.

Nightly Tester Tools

Our team is now taking ownership of the addon from Heather Arthur. This extension has over 100000 active users at the moment and we want to grow that community. We need to still do a few logistical things with Heather to get it moved over and we hope to have this sorted in the next few weeks. Once that is done we will do some house keeping on the project like changing the repository structure and getting build scripts in place. Next quarter we hope to do some work on the project and will create some issues out that will be mentored by someone in the team for anyone to work on!

Actually we will be creating mentored issues for a lot of our projects at the moment and will have a central place for these soon! In the mean time you can have a look at:

MemChaser

One of the major projects on the go at the moment is a project to see where we have large GC/CC pauses in the browser. Long pauses lead to the browser feeling jerky which isn't a great user experience. Last week Henrik blogged about the MemChaser 0.1.1 release and got a couple of good comments! It has helped identify a few bugs. A really good example is where we identified memory leak with Add-ons SDK bug, which is already partly fixed for SDK v1.6 and even for the upcoming v1.5 release. Currently we have over 1000 downloads and nearing 400 active daily users (statistics). We need to get docs in place for further planning on the project but this is a great start!

Look out for future updates and if you want to join our team meetings you can get all of the details at here and you can also get notes from previous meetings.

Axel Hechtcompare-locales 0.9.5

Busy times for compare-locales, there’s another release out the door.

New in this release are a significant rewrite of the Properties parser. A lot less regular expressions, a lot more performance in bad situations. Thanks to glandium for poking me hard with a patch. That patch didn’t work, but at least it got my butt to it. Comparing bn-IN is now down to 23 secs for 3 minutes+.
The next big thing is that I now run checks on entities that are keys, too. That doesn’t seem to have caused any regressions, but look out for new false positives. On the plus side, if you use ‘&’ as accesskey, you’ll get an error report instead of a ysod.
Finally, I added support for mpl2 license headers, so we’re all set there.

As usual, update with pip install -U compare-locales.

Ben HearsumRelease Automation – Part 2: Mercurial-based, v1

Around the start of 2008 Mozilla moved Firefox and Gecko development from CVS to Mercurial, with Firefox 3.5 (nee 3.1) as the first release out of the new repository. In addition to that, the underlying build infrastructure had switched from being Tinderbox driven, to being Buildbot driven – which made some of the existing release automation useless. In mid-2008 we started planning to port, rework, and update the release automation for this new environment. The 2008 Firefox Summit conveniently happened right around this time, so we took that opportunity to gather a quorum on the subject and go over all the plans in detail. By the end of the night (and end of the beer, if I recall correctly), we had discussed everything to death and came up with a detailed plan and a tracking bug.

This version of the automation struck a balance between improving the overall design of the system and simply doing straight porting work. The plain porting isn’t very interesting, so I’ll be mostly focusing on the improvements we made in this post.

One of the bigger optimizations we made to to generate files in their final location at build time. In the Bootstrap days we uploaded files to flat directories with long filenames, and then re-arranged them into their final layout later on in the process. With this change made our candidates directories looked a lot more like the the associated release directory. This may not sound like a huge change but it cut our disk space usage per release in half or more, shaved over an hour off the end2end time of the release, and let us put our release file naming logic into the build system, where it more rightly belonged. It also allowed us to make the next optimization: combining the signing processes.

In the Bootstrap and pre-Bootstrap worlds we had two separate signing processes: one to sign the internal guts of Firefox win32 builds (firefox.exe, xul.dll, et. al) and one to sign the Firefox installers themselves. Early on, we signed the internal bits and handed them off to QA. Closer to release time, we signed the installers themselves and generated GPG signatures for all files. The only reason I can think of why we would do this is to keep signed installers out of public directories until we’re sure we’ll be releasing them. This isn’t without its drawbacks though. Leaving this until later in the process added unnecessary manual touchpoints, put non-trivial work late in the critical path, and worst of all: It meant QA did not test the exact bits that we shipped to users! (We actually managed to ship unsigned installers once, which isn’t possible anymore.) Improving this only required a small rework of our existing signing scripts (and lots of testing, of course!) but it took another 1-2h off of our end2end time and removed another manual touchpoint.

It’s also worth noting that merely by switching to Mercurial we saved over half an hour in end2end time in tagging. In CVS, we had to create a branch and tag thousands and thousands of files with multiple tags, which takes a very long time. In Mercurial, we have clone a repository, which takes some time, but the tagging itself is near-instant.

In addition to the optimizations noted above, tons of work was done porting the existing automation. Many things had to be pulled out of Bootstrap and put into their own scripts to make them usable by both versions of the automation; en-US builds and l10n repacks had to be reimplemented entirely in Buildbot; and some other things that couldn’t be pulled out of Bootstrap had to be reimplemented as well. It was a very large undertaking that was primarily worked on by Nick Thomas, Coop, and myself and took months to complete.

Firefox 3.1b3 was the first fully automated release with this automation. By the time we worked out most of the kinks we were at end2end time of 8-10h and about 12 manual touchpoints.

Next up: Various improvements & optimizations (not as boring as it sounds, I promise!)

Jeff HammelTalos Signal from Noise: Configurable Talos Data Filters

Talos Signal from Noise: Configurable Talos Data Filters

As part of Signal from Noise I introduced a patch that changes the way --ignoreFirst works and adds configurable data filters to Talos :

While this is a small change in terms of how the code currently works, it lays the groundwork for a window of possibilities in terms of Talos statistics. Currently, pageloader calculates the "median" (ignoring the high value), the mean, the max, and the min, and outputs these along with the raw run data. Pageloader is for loading pages and taking measurements, not really for doing statistics. So it would be nice to move this upstream: first to Talos, then to graphserver proper.

Being able to specify data filters with --filter from the command line and filter: in the .yml configuration file allows the test-runner to change the "interesting number" by which we measure performance metrics on the fly. While there are currently only a few filters available, it is easy to add more metrics as we need them.

In a parallel effort, the JetPerf software consumes Talos filters . This is a good example of the expansion of the Talos ecosystem: as a ciritical part of our performance testing infrastructure, building tests and frameworks on top of Talos. In general, the A Team is moving towards a testing ecosystem of reusable parts and sane APIs.

Data filters were added to talos as an interim measure to make the "interesting number" calculations more flexible. As we play with different types of statistics, we need the ability to change configuration without having to jump through too many hoops and this fulfills this immediate need.

However, in the longer term, Talos and pageloader shouldn't really be doing statistics at all. They are in the "statistics gathering" camp where graphserver is in the "statistics processing" business. It would also be nice if there was a piece of software that let you analyze Talos results locally, ideally using the same statistics processing package that graphserver uses. This is outlined in https://bugzilla.mozilla.org/show_bug.cgi?id=721902 .

http://k0s.org/mozilla/talos/bug-721902.gv.txt

Geoff LankownsIPrefBranch2 is no more

Yesterday I landed bug 718255, taking the guts out of nsIPrefBranch2 and putting them into nsIPrefBranch. That means a QueryInterface call is no longer required to add or remove pref observers. (The interface still exists, to prevent stuff breaking, but it is empty now.)

Hackers and reviewers, please take note. I don't want to be clearing out stray uses forever.

Bonjour MozillaDavid McNamara (Mackers)

mackers

David McNamara (alias mackers) est un artiste, mais aussi un hacker, travaillant avec Brian King au sein de Briks Software, et contribuant à des projets Mozilla depuis… 2000 ! David est une sorte de vagabond des temps moderne, un “voyageur digital” qui n’a de cesse de découvrir le monde, multipliant les rencontres, et diffusant au passage la bonne parole du Logiciel Libre. Il est certes originaire de Dublin, en Irlande, mais vous aurez souvent plus de chances de rencontrer ce globe-trotter dans un autre pays, son MacBook sous le bras. C’est ainsi qu’il parvient, d’où qu’il soit, à créer des add-ons pour Briks, et même à poursuivre ses études ! Sans oublier, mais cela ne vous étonnera pas, sa passion pour la Geo-Web. En regardant plusieurs photos de lui, Bonjour Mozilla s’est aussi aperçu que David était un sacré boute-en-train, qui ne se prend pas au sérieux… Avec un collègue comme Brian King, on imagine les séances de brainstorming… Elles doivent être animées !

Bonjour David ! 

PS : et merci Brian King pour son aide !


David McNamara (aka mackers) is an artist, but also a hacker, working with Brian King at Briks Software, and contributing to Mozilla projects since… 2000! David is kind of a modern tramp, a “digital traveler” who is constantly discovering the world, multiplying meetings, and disseminating the good word of Free Software on his way. Although he is originally from Dublin, Ireland, you’re more likely to meet this globe-trotting in an other country, his MacBook under the arm. Thus he succeeds, wherever he is, to create add-ons for Briks, and even to continue his studies! Not to mention, you won’t be surprised, his passion for the Geo-Web. By looking at several pictures of him, Bonjour Mozilla has also noticed that David was a live wire which does not take itself seriously… With a colleague such as Brian King, we can only imagine the brainstorming sessions… They must be well alive!

Bonjour David!

PS: and thanks for the help, Brian King!

Nicholas NethercoteMemShrink progress, week 35

Add-ons

Zombie compartments were fixed in the following add-ons:  Customize Your Web (fixed by Rudolf Noe), GridTube (fixed by Costas B.), Do Not Track Plus (fixed by kiran).

Marco Bonardo changed the Places JS services in a way that prevents certain kinds of SQLite connection leaks.  As far as I can tell, this fixes leaks in the Delicious Bookmarks and CyberSearch add-ons.

Finally, Alexandre Poirot fixed a bug in the Add-on SDK that was causing zombie jetpack compartments in some cases when add-ons were disabled.

Memory Reporting

Hugh Nougher added a memory reporter for GPU memory on Windows 7 and Vista.  See the “gpu-committed”, “gpu-dedicated” and “gpu-shared” entries in about:memory’s “Other Measurements” list.

I reduced the amount of memory allocated when generating about:memory by about 35%.

Miscellaneous

Josh Aas implemented unloading for out-of-process plug-ins.  If one is unused for 3 minutes it will be unloaded.

Andrew McCreight improved cycle collector dumping, which is useful in certain debugging cases.

Quote of the week

LifeHacker did some browser performance tests.  Firefox 10 handily won the memory usage test, which involved loading sites in 9 tabs and then measuring.  I personally think this is a pretty meaningless test, but I won’t complain about the good press.

As usual, the comments on the article featured a lot of debate about  whether Firefox is a memory hog or not.  One comment particular caught my attention:

They hardly used to be myths. I saw several times when old FF2x would be taking up over 1.4GB of RAM with just half a dozen tabs open.

Firefox 2 was released in October 2006, and superseded by Firefox 3 in June 2008.  Bad reputations are really difficult to shake.

Bug counts

This week’s bug counts:

  • P1: 26 (-0/+4)
  • P2: 131 (-6/+3)
  • P3: 76 (-2/+3)
  • Unprioritized: 1 (-2/+1)

Meeting Notes from the Mozilla communityThunderbird Meeting Minutes: 2012-02-14

Thunderbird/StatusMeetings/2012-02-14

last meeting | index | next meeting »

Thunderbird Meeting Details :

Remember to press *1 to unmute yourself before talking!

Feel free to ask questions in the meeting either by speaking up or by asking them in #maildev on IRC.

Other ways to get in touch with us can be found on our communications page

Agenda

  • Who’s taking minutes? –> roland

  • Minute taking Schedule. Talk to Standard8 for schedule changes/additions.
  • Note: this meeting is for interactive discussion. Feel free to ask questions!
Action Items
Friends of the Tree

Thanks to our Friend of the Tree. When adding someone to this section, please get their T-Shirt size, phone number (needed for shipping!) and send it to rebron@mozilla.com so that he can send them a shirt!

  • Aceman for his high quality and high quantity work (29 patches since January 1!), nominated by Standard 8. Thank-you!
Thunderbird Development

For more details, see also the driver meeting notes.

Feature Work
Test Pilot
  • looking to get a test pilot study running in a couple of weeks
Big Files
Schedule and Progress
Thunderbird 10
  • Released a 10.0.1 to fix a security issue and a couple of crashes (most notably an Outlook import crash)
Thunderbird 11
  • Will be spinning an updated beta this week.
Thunderbird 12 Thunderbird 13 Thunderbird 3.1.x & ESR
  • Released 10.0.1 ESR to match the mainline 10.0.1 release.
Extension of the week

Junquilla let’s you extend the Junk filtering of Thunderbird and create more than one Junk folder. It will also present stats including scores and why certain email was flagged as junk. A great aid in understanding Thunderbird’s junk system.

QA Updates
  • Nothing to highlight
Marketing Updates
Infrastructure Update
Build / Release Update
  • 10.0.1, 10.0.1esr released

  • releasing 9.0.1->10.0.1 updates today
  • 11.0 beta 2 build today
Web Update
  • few fixes to account provisioner, l10n merging, etc last week

  • compatibility bump for TB11 is ready, should go live Thursday
Documentation
  • nothing to report (work week)
Support

(If you support Thunderbird or write or translate documentation to help support Thunderbird, please subscribe to the tb-support-crew mailing list and briefly introduce yourself to the list

  1. Thanks to Vincent aka cameléon, San, Matt Harris, Wayne Mery and others for updating the Etherpad and providing support input to the Thunderbird 10 support day on Thursday February 2 2012 – Next Support Day is the day after TB 11 is released i.e. currently March 14, 2012 since TB11 is currently scheduled for March 13, 2012

  2. 807 new support topics (610 one week ago with the stats bug with 2 days missing) – Media:6-12February-Thunderbird-GS-stats-2012-02-13 1307.pngNOTE: last week’s numbers are too low because GS’s stats (again like the stats bug of two and four weeks ago!) failed to work for Tuesday of last week
  3. Thunderbird 10 Support Issues – Please edit and add any issues or bugs found in TB10 and tag them tb10 – Hot issue for a few weeks has been Bug 723105 – Outlook Import crashes which was fixed along with some security issues in TB 10.0.1 which was released Sunday February 12, 2012
  4. See this week’s Support Appendix for full Get Satisfaction metrics and other support details
Lightning Updates
Status Updates

See the Mozilla Status Board for status updates specific to developers.

Roundtable Highlights
  • Going to try out using Vidyo for the meetings from next week

    • Voice dial-in will still be available.

    • Video option will be public
    • Please use headsets and mute yourselves when you join
    • Links etc will be posted ahead of next week’s meeting.
Attendees

Meeting Notes from the Mozilla communityMozilla Platform Meeting Minutes: 2012-02-14

Platform/2012-02-14

« previous week | index | next week »

Platform Meeting Details

  • Tuesdays – 11:00 am Pacific

  • Dial-in: conference# 95312
    • US/International: +1 650 903 0800 x92 Conf# 95312

    • US toll free: +1 800 707 2533 (pin 369) Conf# 95312
    • Canada: +1 416 848 3114 x92 Conf# 95312
  • Warp Core Vidyo Room
  • join irc.mozilla.org #planning for back channel

Contents

Roadmap Discussion

Notices / Schedule

  • We are here on the schedule (.ics link). This is the time for speculative low-risk fixes on Beta and other less critical fixes prior to convergence in Beta 5 and Beta 6 (where we restrict what we land).

    • We shipped Firefox 10.0.1 unthrottled last Friday (2/10). We’re tracking a few issues post-release

    • Our third beta for FF11 will go-to-build today, ship on Friday (2/17)
  • Please take a look at bugs currently tracked for FF11′s release

    • If the bug no longer needs to be tracked, please fix the flags and comment to that end

    • Please make sure to progress other investigations and email Alex if you’re blocked
  • Lukas Blakk (of RelEng fame) will be helping with Release Management triaging, tools work, and the ESR branch in the near future!

Firefox Development

  • Tim Taubert improved page thumbnail collection by implementing mozFetchAsStream() on canvas elements, to avoid an inefficient call toDataURL. Telemetry data shows that thumbnail capture times are pretty efficient, but there are non-trivial amount of cases where storing them in the cache is slow. Work on cache performance that the network team is doing might help with that.

  • Frank Yan is working on a new revision of about:home (bug 711157), see screenshots there for the new look
  • Felipe Gomes has added a TelemetryStopwatch module to make it easy to add front-end telemetry probes (bug 723561) – check out his blog post

Firefox Developer Tools

  • Blog post about debugger landing here.

Performance

  • Snappy weekly summary on Taras’ blog

  • Lots of frontend Telemetry probes are landing. See bug 671038.
    • Some of this has already paid off in terms of us catching a tab animation regression in bug 724349.
  • Plan to investigate switching our awesomebar searching from SQL to an FTS. If you are a text-search/tokenizer expert, perhaps you help us with bug 725821.
  • Killing Firefox start-up inefficiencies on Windows. Check out the details on Brian Bondy’s blog. Brian’s blog post contains tips on xperf, Firefox profiler, about:startup – read it.
  • Olli has landed most of the cycle collector fixes. Telemetry shows a dramatic reduction in cycle collection times for Firefox 13. He and Andrew are investigating the remaining causes of long CC times.
  • Vladan landed a dom storage fix that should reduce the amount of main thread SQL done by content bug 714964
  • Snappy is a key Q1/Q2 goal. Please review Snappy bugs for your team and help kill these bugs.

GFX

  • Building out OMTC / OpenGL Layers for native android.

    • working being done on Maple

    • ideally merging end of week

JS

Layout

  • Lots of preparation (testing/analysis) for unprefixing/emulating specific webkit CSS properties

  • Fixing remaining Font Inflation P1 bugs.
  • CSS flexbox support for absolute/relative -positioning children
  • Graphite font support testing has started bug 631479
  • Harf-Buzz text engine update landed bug 695857
  • Fixing many “unnecessary invalidation” bugs to optimize B2G UI

Video

  • Youtube has started sending WebM HTML5 video to some (all?) users who don’t have Flash. This increase in usage has turned up a few bugs and may impact crash-stats etc

DOM

WebAPI

Network

  • SPDY testing (on by default) on trunk is going well. We are not planning to turn it off (may ship with it on in Firefox 13) unless something serious comes up.

  • We’ve started on our DASH (adaptive streaming) implementation for the video tag. Steve Workman and Jason Duell are leading this effort.
  • Cache work is focused on reducing main thread locking right now. Nick Hurley and Michal Novotny are leading this effort.

Identity

remember to send comments/thoughts/suggestions regarding https://wiki.mozilla.org/Identity/BrowserID

Plugins

  • Patch for bug 501485 landed on inbound today: Destroy plugin processes after three minutes of not being used. Timer starts when the last instance is destroyed, is canceled if a new instance is created before it fires. Keep an eye out for any issues.

Mobile

  • Holding the release for OpenGL Layers on Android

    • part of the mobile team supporting GFX on that project

    • the rest concentrating on stability, bug fixes and profiling for perfomance

Accessibility

Tree Management

  • Looking at updating Windows and Linux build servers for WebRTC & Camera API. bug 718031 and bug 697754; WebRTC alsa support requires libasound 1.0.14

  • bug 711176 intermittent issues with stage
  • bug 720006 wait times hit, waiting for dongles

Security

  • The Security team has reorganized!

Security Reviews Scheduled for this week

Date / Time Item
Mon Feb 13 / 13:00 PST Marionette
Wed Feb 15 / 13:00 PST AVAILABLE
THU Feb 16 / 10:00 PST AVAILABLE
Fri Feb 17 / 10:00 AM PST AVAILABLE

Calendar and Meeting details

General Meeting Details
* IRC Channel: #security
* Etherpad: http://etherpad.mozilla.com:9000/secreview
* Vidyo: https://v.mozilla.com/flex.html?roomdirect.html&key=5XEMsG1ApA4b (Room 9058)
* Dial-in Info (phone):
** In office or soft phone: extension 92
** US/INTL: 650-903-0800 or 650-215-1282 then extension 92
** Toronto: 416-848-3114 then extension 92
** Toll-free: 800-707-2533 then password 369
** Conference num 99058

For updates to meetings please see the Security Review Calendar

Security Review Needed but Unscheduled

Stability Report

  • Working on weekly crash newsletter.

  • Meeting with Adobe tomorrow to talk about Flash bugs/crashes.
Socorro
  • Release out this week

    • Per OS report

    • bug 719943 – Java signature appearing in stack.
Desktop
Firefox 10.0.1
  • Cycle collector bug fixed.

  • bug 718389 – Startup crash @ PR_EnumerateAddrInfo | nsDNSRecord::GetNextAddr. A couple of options to look at.
    • Orange Toolbar
  • bug 726675
    • Extension correlated(?) will look manually

    • bug 726682
Beta
Aurora
Trunk
  • Top Issues currently assigned to nobody

    • bug 723190 nsGfxScrollFrameInner::ScrollToImpl

    • bug 723523 Crash in nsPluginInstanceOwner::CreateWidget @ nsCOMPtr_base::assign_assuming_AddRef | nsObjectFrame::PrepForDrawing
    • bug 724355 Crash nsObjectFrame::SetInstanceOwner
    • bug 704124 Firefox Crash @ gfxContext::SetSource
    • bug 723133 Firefox 13.0a1 Crash Report [@ PluginWndProcInternal ] with Adblock Plus
Mobile

Roundtable

Planet Mozilla BlogPlanet Additions: Class Of 2/14/2012

As mentioned previously, we’ve created a new Planet Mozilla Projects which will be home to all project blogs. A RSS feed can be found here.

We’ll likely start removing the duplication in the next week or two.

People

Geoff Lankow (feed) – Geoff Lankow is a website developer who started making add-ons to help develop websites. Then he started hacking Mozilla to help making add-ons. These days he spends more time hacking Mozilla than developing websites. He’ll be blogging about changes he’s made that might be useful other developers.

Jason Smith (feed) – Jason join QA in January, and will be working from Mountain View, CA. He is currently providing testing support for Open Web Apps on Desktop and Desktop Firefox.

Panos Astithas (feed) – “I joined Mozilla in April 2011 to work on Firefox Developer Tools. My focus has been mostly on JavaScript-related tools and my most recent project is the Script Debugger, about which I plan to blog more often.”

Mihai Sucan (feed) – “I work for Mozilla as a contractor since the summer of 2010, within the developer tools team. I worked on the Style Inspector, Web Console, Scratchpad and the Source Editor component, and the plan is to continue to do so.”

Projects

Mozilla Antarctica (feed) – The Mozilla Antarctica Community: going where no other community has ever gone before (and it’s bloody freezing!)

Socorro Status BlogPushing 2.4.2 database changes tonight

Socorro version 2.4.2 database changes are being pushed tonight, Feb 14, 6pm PST to 9pm PST.  This may cause some sluggishness, but will not require a downtime.

Code changes will be pushed on Feb. 15th.

Mozilla Add-ons BlogJetpack Project: weekly update for February 14th, 2012

Project News

  • Next week’s Bay Area Firefox Add-ons meet-up will be at Mozilla’s San Francisco offices on Tuesday, February 21 at 6PM. This month’s meetup features the SDK and Builder, including a talk by yours truly, a raffle for an Android Tablet and much, much more! If you’re in the area on Tuesday Feb 21 at 6pm PST and want to attend, RSVP here.
  • The entire Jetpack team will be meeting up for a work week in Mozilla’s Mountain View office next week to work together and plot out the future!

Quick Stats

Note: the stats above are based on the queries I linked to for each item. If you have suggestions on how these queries might be made more accurate,please comment below. Stats generated at 2012-02-14 15:10:53 PST

Meeting Brief

  • Builder: working on blocker bug prior to releasing 1.0, testing a patch now.
  • SDK: releasing 1.5 next week, still working on several important bugs, also 1.5 will require a re-pack.
  • Dietrich provided an update on project to deliver new Firefox features as add-ons.

Full minutes are available here:
https://wiki.mozilla.org/Jetpack/Weekly_Meeting/2012-2-14#Minutes

Luke CrouchMDN 2.2

  • BrowserID
    bug 721171 to draw Sign in buttons with progressive enhancement - should hopefully fix our search results snippets too! ><
    bug 719945 to link to browserid on the demo submit page
  • MindTouch wiki migration
    prepare for localized page migration (bug 717380)
    scripting architecture (bug 715253)
  • More

Kumascript Diagram

I'm excited about kumascript - lmorchard's prototype for implementing server-side scripting in kuma to replace DekiScript. I'm glad we're using JavaScript. I was a little surprised that MediaWiki chose Lua for their new scripting language (is it ironic that DekiWiki and its Lua-based DekiScript has roots close to MediaWiki and now MediaWiki is going to Lua-based scripting too?). JavaScript just makes sense for us - a community of web developers writing web developer docs.

MDN 2.2.5

MDN 2.3

Matt ThompsonWhat are we working on this week? Roadmaps, Tow Trucks and love bombs

At the Knight-Mozilla Open News sprint in NYC

Mozilla Webmaker weekly update for Feb 14, 2012

Getting practical on webmakers

This post from Mozilla’s Executive Director Mark Surman ties together the various roadmaps and blog posts now underway, tying them back to our overall goals for the year.

Next steps: getting our roadmaps added to the main Mozilla roadmap wiki.  Plus better participation in the weekly Mozilla All Hands updates.

Mozilla events menu and strategy

Michelle Thorne continues to test and simplify her event menu, working with Ben Simon on how we can create a scalable, self-organized model for events to take over the world. More on Mozilla Webmaker events:

Tow Truck Demo

Simon Wex presented an outstanding demo of “Tow Truck,” an educational HTML/CSS/JavaScript collaborative editor. Check out the prototype screencast. It kinda reminded us of the “hack battle” prototype from November’s Mozilla Festival, which shows Mozilla X-Ray Goggle hacks as movies.

Knight-Mozilla OpenNews news

@OpenNews is now the default Twitter account for the Knight-Mozilla Open News project.

The “Webmaking 101 for Journalists” sprint this week in NYC was a big success. Read all about it in Jess Klein’s week-in-review blog post. Plus more detail here, here and here. The Open News team wants to sponsor journalism hack days with YOU — so let us know what you’re up to here.

Mozilla Popcorn roadmap,  heatmap and upcoming fireside chat

How can Mozilla Popcorn serve as a starting point for deeper webmaking skills? The Popcorn team is looking for feedback on these user stories.

Bobby Richter is also looking for feedback on the developer “heat map” he developed to see where work load falls with each new release of Popcorn. The Popcorn team is also planning a special online fireside chat later this month to discuss their user stories and roadmap  — look for a date and details on that soon.

Mozilla Hive Toronto Pop-up on Saturday

  • Got kids in Toronto? Want them to learn how to hack? Sign them up free here.
  • If you can come and volunteer (even for a few hours), please sign up as a volunteer
  • If you’re coming as a volunteer, please bring a laptop and flipcam or digital camera. On an ongoing basis, we’ll need access to laptops that we can use for more of these Mozilla events. Let us know as a comment here if you have suggestions.

Software Carpentry in 90 seconds

Software Carpentry‘s mission: help scientists be more productive by teaching them basic computing skills. The project is looking for help and ideas in three key areas:

  • 1) Volunteer developers to model their work. We’d like to screencast developers’ desktop as they code and work, so learners can see what they do.
  • 2) What happens after the workshops? Where do participants land after the intro workshop? This is a common challenge across our projects — see Greg’s proposal in this “Stack Underflow” post.
  • 3) Evaluation. How do we demonstrate impact? We need a way to make a case in terms that a prof or lab director relates to.

Africa Open Days

Africa Open Days is an event designed to help in explaining, encouraging and promoting the use of open source tools. It’s the first of its kind in Africa. Check out the wiki and get involved here.

Love bomb blitz

It’s Valentine’s Day. Why not take a moment to send a love bomb to someone you love?

Upcoming events


about:mozillaLove Bombs, ACTA, Google SoC and more…

Drop a Love Bomb
Happy Valentine’s Day! To celebrate, why not send a “love bomb” to someone you love? Matt Thompson explains all.

ACTA
Mitchell Baker speaks out against how the Anti-Counterfeiting Trade Agreement (or ACTA, for short) was negotiated. With anti-ACTA protests sweeping across much of Europe, Mitchell describes how negotiating in secret is a bad way to develop Internet policy. Help protect the Internet and make your voice heard today.

Google Summer of Code 2012
With Google announcing that they’ll be running the Summer of Code again this year, Gervase Markham calls for ideas for eight-week-long projects which a student could take part in. Mozilla has participated in every SoC so far and Gerv doesn’t intend this year’s to be the first we don’t.

Webmaker Goals
“Building a generation of web makers” is one of Mozilla’s main goals for 2012. Mark Surman outlines plans to achieve that goal and more. Are you excited by our web maker vision and can you write, code, test or promote? You should get involved and help out.

ID Provider + BrowserID
Dan Mills showcases a great new addition to BrowserID. Support for ID providers allows the registration flow to go from eight screens to just one. This is one more step to BrowserID becoming a truly distributed system.

December Dev Derby Winners
December’s Dev Derby was focused around IndexDB, a technology allowing web applications to store data for fast online and offline use. The submissions demonstrated just how powerful IndexDB can be. Be sure to try out the winning demos.

Meet Some Mozillians
Bonjour Mozilla says bonjour to Rosana Ardila, Nikola Matosovic and Mime Cuvalo. Read more about how these people are contributing to Mozilla.

Upcoming events
* February 17, Online, Web Apps Test Day
* February 21, San Francisco, USA, Firefox Add-ons Made Easy
* See more on the Mozilla Community Calendar

Get Involved
These are just some of the available contribution opportunities. Learn more about other ways to get involved and find other Mozillians in our community who share your interests.

About about:mozilla
The newsletter is written by Mozilla’s contributor engagement team and is published every Tuesday.

If you have anything you would like to include in our next issue,
please contact: about-mozilla[at]mozilla[dot]com or send us a status message on mozilla.status.net or a tweet @aboutmozilla.

You can also subscribe to the email version.

Have a good week folks and keep rocking the Web!