Giter VIP home page Giter VIP logo

fathom-fox's Introduction

This project has merged into the main Fathom repository.

Please visit https://github.com/mozilla/fathom/tree/master/fathom_fox.

FathomFox

A set of tools for developing Fathom rulesets within Firefox

Quick Start

Here is an example of how you might use FathomFox to develop a Fathom ruleset that finds the semi-transparent overlays behind in-page pop-ups:

Get FathomFox Running

  1. Clone the FathomFox repository. (This is needed to author rulesets. If you wish merely to collect a corpus, you may install FathomFox from addons.mozilla.org.)
  2. From within the checkout, install dependencies: yarn run build.
  3. Run a clean copy of Firefox with FathomFox installed: yarn run browser.
  4. Run yarn run watch in a separate terminal. This will keep your running copy of FathomFox up to date as you edit your ruleset.

Collect a Corpus

  1. Navigate to a web page that has what you're trying to recognize: a background overlay behind a modal dialog.
  2. Using Firefox's developer tools inspector, select the overlay element.
  3. Switch to the Fathom developer tools tab, enter "overlay" in the label field, and click Save Page.
  4. Label about 20 additional pages like this.

Write and Train a Ruleset

  1. Take a first pass at writing a ruleset to recognize the overlays, and put it in fathom-fox/src/rulesets.js, replacing the example ruleset. (Ultimately, you should keep rulesets.js with your own project and hard-link it into FathomFox.)
  2. Click the FathomFox icon in the main toolbar, and choose Vectorizer.
  3. Use the Vectorizer to boil down your labeled pages into vectors of floats and save them as a JSON file.
  4. Use the commandline trainer to imbibe the vectors and come up with an optimal set of coefficients.
  5. Use the trained ruleset in your application.

A more detailed treatment of Fathom authoring workflow is in the Fathom manual.

Corpus Collector

First among FathomFox's toolset is a bulk Corpus Collector tool, accessible from a toolbar button. Enter some URLs, and it "freezes" those pages to your usual downloads folder, inlining images and CSS into data URLs and getting rid of JS to keep pages deterministic so they can be used as a training or testing corpus. (Scripts loading scripts loading other scripts is surprisingly common in the wild, which often makes pages turn out unpredictably, not to mention being dependent on the network.) The Corpus Collector is useful for grabbing hundreds of pages at once, but it doesn't give you the opportunity to stop and interact with each (though it can scroll to the bottom or wait a predetermined time before freezing).

Developer Tools Panel

Fathom is a supervised-learning system. FathomFox's Developer Tools panel helps you do the supervision (labeling) of pages that have been bulk-collected. You can also label pages one at a time, without first saving them locally. This lets you interact with each page before freezing, ensuring the interesting elements are showing.

Load a page, right-click the element you want to label, and choose Inspect Element, which will open Firefox's developer tools. Switch to the Fathom tab, and enter the label for the inspected element.

You can use as many distinct labels as you want, though there is a limit of one label per element at the moment. Finally, click Save Page to pull down a frozen version of the page. That sample is then ready to be used with the Trainer.

Vectorizer

Once you've labeled your corpus, you'll need a file of feature vectors you can feed to the training commandline tool.

  1. Open the Vectorizer from FathomFox's toolbar button.
  2. Give the Vectorizer a list of your labeled pages' filenames.
  3. Change the Base URL to the address from which you're serving the pages with fathom-serve.
  4. Click Vectorize, the pages will flash by, and the vectors will appear in your Downloads folder.

The Retry on Error checkbox should generally stay on, to work around apparently unavoidable spurious errors in the web extension communication APIs. However, turn it off during ruleset debugging; that way, you can see your actual mistakes more promptly.

Evaluator

Once you have a decent set of coefficients and biases computed, paste them into rulesets.js, open some troublesome pages in a Firefox window, and invoke the FathomFox Evaluator. From there, click Evaluate to run the ruleset over the loaded tabs. Any pages with misrecognized nodes will show up in red; click those to see which element was wrongly selected. Unfortunately, you need to manually show the dev tools and switch to the Fathom panel once you get to the page in question; there aren't yet web extension APIs to do it automatically. Once you do, you'll see a quick and dirty representation of the "bad" element: a new label called "BAD [the trainee ID]". Be sure to delete this if you choose to re-save the page for some reason. Also note that the BAD label is created only when the bad cell is clicked, for speed; if you navigate to the bad page manually, the label won't be there, or there might be an old label from a previous iteration.

Tips

  • Before freezing pages with the Developer Tools panel, use Firefox's Responsive Design mode (command-option-M) to set a repeatable 1024x768 window size. The Vectorizer automatically sets this same size by default. This will ensure that the proper CSS (which may be driven by media queries) will be frozen (and later reloaded) with the page.
  • For maximum fidelity, do your corpus capture in a clean copy of Firefox with no other add-ons. (This will automatically happen if you invoke FathomFox with yarn run browser.) Some ad blockers will make changes to the DOM, like adding style attributes to ad iframes to hide them.
  • You can press Ctrl+Shift+O to save and download a page for pages with hover-to-show elements you want visible upon saving.

Thanks

Thanks to Treora for his excellent freeze-dry library!

Development

To work on FathomFox itself, do the steps under Get FathomFox Running above.

Version History

3.3

  • The Vectorizer now operates in parallel, resulting in large speed gains.
  • Merge fathom-trainees info FathomFox. This makes fewer repos to clone, fewer addons to install, and fewer build processes to babysit for ruleset authors. It also means a simpler FathomFox with less message passing.
  • The Vectorizer now shows an error message when a scoring callback returns undefined. This helps catch certain common mistakes:
    • A name mismatch between the name value passed into a rule and the name of the rule in the list of [ruleName, coefficient] pairs referenced in the ruleset
    • A scoring callback failing to return a number
    • Corner cases in DOM or CSSOM routines, e.g. innerText returning null instead of the empty string in Firefox
  • Add isTarget hook to trainees to customize what the Vectorizer considers a target.
  • Automatically add a slash to the end of the Vectorizer base URL if there isn't one.

3.2

  • Freezing pages now takes only 1/7 as long, thanks to an upgrade to the freeze-dry library.
  • There's now a keyboard shortcut for freezing the current page: command-shift-O. This lets you capture hover states.
  • The original URL of each frozen page is now preserved in an HTML attribute.
  • Rather than always defaulting to 1024x768 for the Viewport Size in the Vectorizer, pull the default from the viewportSize of the selected trainee.
  • Remove obsolete Trainer, pieces of which now remain solely as an Evaluator, for debugging rulesets.

3.1

  • Add an Evaluate button to the Trainer, useful for ruleset debugging.
  • Add a Base URL field to the Vectorizer, which saves a lot of find-and-replacing on page filenames.
  • Add a Retry On Error checkbox to the Vectorizer so retrying can be disabled during ruleset debugging.
  • Document Vectorizer.

3.0

  • Switch to Fathom 3. This requires a fathom-trainees fork based on tag 3.0 or later. Equivalently, you can make these changes:
    • Switch to specifying coefficients as a Map instead of an Array. If you don't want to name your rules, Fathom will auto-name them _0, _1, etc., in order of appearance in the ruleset.
    • The rulesetMaker function no longer takes any params. In Fathom 3, all weighting is done internal to the framework.
    • All rules should return a value between 0 and 1, representing a confidence.
  • Add the Vectorizer tool, which exports feature vectors for optimization with Fathom 3's commandline tool.
  • Fix additional causes of duplicate downloads when using the Corpus Collector on recent versions of Firefox. I think they're really all gone now.

2.3.1

  • Fix Corpus Collector spewing extra bullet points, closing the wrong tabs, downloading duplicates, and generally misbehaving in recent Firefox versions (e.g. 65).

2.3

  • Clicking a good/bad cell now takes you to that sample's tab and, in the case of a bad cell, indicates which element was wrongly selected, which is invaluable for debugging. Identifying the element requires a fathom-trainees fork that pulls in Fathom 2.8. If you have a custom success function, you must also add a third param to it and scribble a badElement property on the received object.
  • Add a Pause button to the Trainer. This is useful while on battery power or to take the load off Firefox's JS thread so the dev tools can run quickly.

2.2

  • Make viewport size customizable during capture.
  • Bump default freeze delay from 0 to 1. This avoids many dead-object errors during bulk capture.
  • Limit length of tags in devtools panel so they don't make it unusably wide.
  • Focus the new label field after inspecting an element and switching to the Fathom devtools panel. This makes for faster entry.

2.1

  • Add computation of a 95% confidence interval for accuracy, using binomial proportion confidence intervals.

2.0

  • Support customizable viewport sizes in Trainer.
  • Stop using traineeCoeffs message in favor of trainee, which is more future-proof. This requires a fathom-trainees fork based on d93bc593a08f6503d137df4d35ce2a2bc6b93b6e or later.

1.3

  • Re-saving frozen pages should now be idempotent most of the time. (glob)
  • Solve some causes of Corpus Collector freezing. (glob)
  • Add progress reporting during freezing. (glob)
  • Use the hostname as a download filename in the absence of a user-provided one. (glob)
  • Use standard Photon menus for the toolbar button (since the stylesheets have now been documented). (glob)

1.2.2

  • Fix bug where some inspected elements would yield merely "false" in the Fathom dev panel.

1.2.1

  • Fix a packaging problem that was causing the dev panel not to work, due to a missing copy of the Simmer library.

1.2

  • Add a decent UI to the devtools panel. Now you can see what you've labeled! (glob)

1.1.1

  • Fix a bug where the Save button on the devtools panel wouldn't do anything unless an element was inspected.

1.1

  • Add Trainer.
  • Switch from npm to yarn.

1.0.1

  • Fix the "No matching message handler" errors when downloading using the Corpus Collector.
  • Switch from webpack to rollup.

fathom-fox's People

Contributors

danielhertenstein avatar dependabot[bot] avatar erikrose avatar globau avatar mozilla-github-standards avatar nchapman avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fathom-fox's Issues

Embed URL in frozen pages

We're typically interested in preserving the URLs of captured pages, for instance to ensure we don't overrepresent one site. We've done this manually, but it takes time, and sometimes we forget or mess it up or lose the list. Let's embed the URL in the page automatically, in a place invisible to the viewer and unlikely to be mistaken for original page content. Data attribute on the root tag? fathom-url? I think there was also a convention freeze-dry used to store the original img src URL. We could follow that instead.

Make it evident if a target element is prematurely pruned

We don't want to silently and without visible penalty drop any target elements on the floor. For example, if the only input to a ruleset is dom('<input type='submit'>) but some should-be candidates are marked up as <button>, those candidates won't be vectorized. They will thus be considered non-targets, and the ruleset that consequently fails to find them will be rewarded for that rather than penalized, in terms of trainer output metrics. We currently rely on ruleset authors to be vigilant and catch this by looking at the per-page metrics, for example. That's not ideal, especially in applications with multiple targets per page, where per-page metrics are not very useful.

I can see at least 2 possible fixes:

  • If the dom() selector is too tight and one or more target elements are consequently not vectorized, show a warning in the Vectorizer UI.
  • Always vectorize all target elements. That might involve more plumbing around in Fathom itself, but it would give a better result, in that the premature pruning of target elements would show up in the fathom-train accuracy numbers—no special-purpose UI to check.

It's not obvious that the coeffs in the UI change over time

Bianca thought she had to wait until the progress bar completed. Ideas:

  • Move from a progress bar to a barber pole (which I don't think <meter> helps us with), and have the start button turn into a stop or pause button when clicked. (I've wanted a pause button several times during debugging—or when getting on a plane.)
  • Literally say that the values update in realtime. (But users don't read.)
  • Make the coeffs and other output stuff pulse or wiggle or throb or something.

Please come up with something better than these. :-)

Stop Vectorizer when an error occurs

If an error occurs in the process of vectorizing a page, the Vectorizer will happily move on to the next page, fail, move on to the next page, fail, and continue like this for all of the pages. Instead we should stop the Vectorizer so the user is more obviously alerted that something bad has happened.

Set a `maxTabs` value that does not trigger the "Unable to connect" error

Parallelizing the Vectorizer (PR #55 ) allowed us to drastically reduce the amount of time it takes to vectorize a large number of samples, however I think we may need to revisit the maxTabs value initially set, as empirical evidence suggests that 16 (our current value) tabs causes "Unable to connect" errors, 24 tabs causes even more and 8 tabs cause none.

See this discussion for more details.

In our case, I think the first bullet point for what is wrong applies: the server is receiving too many requests (or something like that) simultaneously.

Screen Shot 2019-12-06 at 3 04 21 PM

Benchmark and consider moving more annealer iteration into fathom-trainees

Subjectively, it seems like training ran faster when the ruleset was hard-coded into FathomFox, rather than each annealer iteration being kicked off by a message send to a separate webext. Benchmark this. If it's true, do larger chunks of work in fathom-trainees to avoid messaging overhead. One strategy could be to factor the async annealer out into Fathom itself and call out to it from fathom-trainees (to avoid fathom-trainees itself become too large and a maintenance burden for forkers).

Wiki changes

FYI: The following changes were made to this repository's wiki:

These were made as the result of a recent automated defacement of publically writeable wikis.

Fathom DevTools panel not recognizing inspected element?

STR:

  1. Visit https://www.amazon.com/Nintendo-Switch-Neon-Blue-Red-Joy/dp/B01MUAGZ49/ref=sr_1_2?ie=UTF8&qid=1535647997&sr=8-2&keywords=switch&th=1
  2. Open the devtools and use the inspector to inspect a DOM element
  3. Click the "Fathom" tab

The panel appears blank for me on the latest Nightly:

screen shot 2018-08-30 at 10 13 25 am

I see some CSP issues in my browser console:

Content Security Policy: The page’s settings blocked the loading of a resource at inline (“style-src”).
fathomfox
Content Security Policy: The page’s settings blocked the loading of a resource at inline (“style-src”).
fathomfox:1:1
Content Security Policy: The page’s settings blocked the loading of a resource at inline (“style-src”). fathomfox 

I also get a weird error from "devtoolsPanel.js" about "Simmer being undefined", but the UUID in the error doesn't match FathomFox in about:support so it's probably not related?

http://www.4j.com/Death-Row page is not downloaded if it's a part of a batch in Corpus Collector

[Affected versions]:

  • Firefox Nightly 67.0a1
  • FathomFox 2.3

[Affected Platforms]:

  • Windows 10

[Prerequisites]:

[Steps to reproduce]:

  1. Reach Corpus Collector page in Firefox.
  2. Copy-paste the batch of links in the Corpus Collector.
  3. Click on "Download" button,
  4. Observe the downloaded pages.

[Expected results]:

  • All pages are downloaded.

[Actual results]:

[Notes]:

  • If http://www.4j.com/Death-Row is not part of an batch (downloaded alone), the download is made successfully.
  • When opening http://www.4j.com/Death-Row in a new tab, a popup is displayed on top of the page. Maybe this has something to do with the issue.
  • Screenshot of the issue attached

loading

Make the HTTPS certificate warning less of a stumbling block

In mozilla/fathom#117, @danielhertenstein added a new fathom-serve tool that spins up an HTTPS server to serve local frozen sample pages. This is used for FathomFox's Vectorizer among other things.
For Firefox to load a page from an HTTPS web server, the server has to have a certificate that is trusted. We are currently using a self-signed certificate and asking the developer to trust us by clicking through a warning in Firefox the first time a page is served during that session. Can we add our server certificate to the list of trusted certificates in the temporary profile used by FathomFox?

Here's the warning displayed currently:
Screen Shot 2019-10-04 at 1 08 13 PM

I talked to Dana Keeler, a security engineer who works on security certificates, and here's what she suggested:

the easiest way would probably be to use certutil to add the certificate to the temporary profile's cert9.db as a trust anchor

Here's a further breakdown of the steps:

  1. brew install nss
  2. Create a Firefox profile directory
  3. Use NSS' certutil CLI to trust the server certificate in the newly created profile
  4. Pass web-ext run the path to that profile directory

As part of this issue, we should also include a brief explanation in the docs about why we have to use HTTPS in the first place[1], as it is a lot more effort.


[1]: Why HTTPS rather than HTTP?
Using the freeze-dry library to freeze an HTML page inlines all of its resources, making the HTML file very large--too large to store such files on GitHub.
This is a problem, because we want to keep these files associated with their Fathom rulesets. After some thinking, we converged on Git LFS as a solution, which lets us store large files elsewhere and keep references to those files in a GitHub repo.
This required moving the resources out of the HTML document, keeping the HTML document in the GitHub repo, and its resources in Git LFS (@danielhertenstein created the fathom-extract CLI to do this).
By moving resources outside the page, directories or otherwise, we encountered CORS restrictions related to how file:/// URLs are handled. Basically, when a resource is requested from another file, that's treated as a CORS request, and CORS requests may only use the HTTPS scheme.

UI tweaks to the devtools pane

  • add a notification immediately after hitting save to indicate that it's working, something like "Preparing download, please wait..." should suffice
  • hitting return while the labelling field has focus should submit
  • there should be some way to view existing labels; even if it's a simple console query, or a line you can copy+paste into the console to generate the list

Allow trainee extensions to run arbitrary callables to determine success

Refactor the FathomFox trainer and fathom-trainees so we can explore alternate success predicates in the trainee extensions. For example, rather than being hard-coded to run a ruleset and report whether the returned item is the one labeled, the trainee should be able to supply arbitrary code to compare the returned node's CSS background image with a set of URLs stored somewhere.

As well as serving short-term goals, this will let us experiment with alternate success functions (#12) without having to be architecture astronauts.

Remove Train button

The Evaluate button is still useful as a debugging tool until #39 is implemented, but the "Train on the tabs in this window" and Pause buttons are attractive nuisances that don't even train Fathom 3 rulesets properly (for instance, they aim for per-page accuracy, meaning they won't work for applications that find multiple occurrences of the same type of entity). Remove them and any code that goes dead as a result (all the training code in FathomFox, for starters).

Duplicates are created when using multiple times the same Corpus Collector tab

[Affected versions]:

  • Firefox Nightly 67.0a1
  • FathomFox 2.3

[Affected Platforms]:

  • Windows 10

[Prerequisites]:

[Steps to reproduce]:

  1. Reach Corpus Collector page in Firefox.
  2. Copy-paste the batch of links in the Corpus Collector.
  3. Click on "Download" button,
  4. Observe the downloaded pages from the download folder.
  5. After all downloads are done, delete the links from Corpus Collector page.
  6. Paste other links and click on Download button.

[Expected results]:

  • All pages are downloaded and no dupes are created

[Actual results]:

  • Duplicates are created after multiple uses of the same Corpus Collector tab

[Notes]:

  • This scenario can be observed using the same links but before every use, the downloaded HTML files must be deleted from the download location. Just repeat steps 5 and 6.
  • Screenshot of the issue attached

duplicate

Video of the issue can be found HERE.

Add a keystroke that triggers freeze

When we were capturing login-form samples, some forms were in a menu that appeared only when we hovered over an element. This made it impossible to capture the page with the form showing. Add a key shortcut that triggers a freeze so we can grab such things.

Fathom Lable field is automatically refreshed / cleared

[Affected versions]:

  • Firefox Nightly 67.0a1
  • FathomFox 2.3.1

[Affected Platforms]:

  • Windows 10

[Prerequisites]:

[Steps to reproduce]:

  1. Open the above link into Firefox.
  2. Click on "My Account" button.
  3. Right-click on the Username field and Inspect Element.
  4. Inspected element is selected.
  5. Reach the Fathom tab from DevTools.
  6. Type something into "Label" field.
  7. Observe the "Label" field.

[Expected results]:

  • The characters written are displayed.

[Actual results]:

  • "Label" field is cleared when Tab Title is automatically changed

[Notes]:

  • Screen recorder of the issue attached:

label_field_refreshed

Have Vectorizer warn the user when feature vectors contain `null` values

Attempting to train a ruleset via fathom-train with a vectors.json file containing feature vectors with null values results in an error similar to this one:

bdanforth ~/Projects/price-tracker (fathom3) $ fathom-train src/extraction/fathom/vectors/vectors_training_image.json -a src/extraction/fathom/vectors/vectors_validation_image.json -s
Traceback (most recent call last):
  File "/Users/bdanforth/.pyenv/versions/3.6.5/bin/fathom-train", line 11, in <module>
    sys.exit(main())
  File "/Users/bdanforth/.pyenv/versions/3.6.5/lib/python3.6/site-packages/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/Users/bdanforth/.pyenv/versions/3.6.5/lib/python3.6/site-packages/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/Users/bdanforth/.pyenv/versions/3.6.5/lib/python3.6/site-packages/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/Users/bdanforth/.pyenv/versions/3.6.5/lib/python3.6/site-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/Users/bdanforth/.pyenv/versions/3.6.5/lib/python3.6/site-packages/fathom_web/train.py", line 289, in main
    x, y, num_yes = tensors_from(training_data['pages'], shuffle=True)
  File "/Users/bdanforth/.pyenv/versions/3.6.5/lib/python3.6/site-packages/fathom_web/train.py", line 38, in tensors_from
    return tensor(xs), tensor(ys), num_targets
  File "/Users/bdanforth/.pyenv/versions/3.6.5/lib/python3.6/site-packages/fathom_web/train.py", line 14, in tensor
    return torch.tensor(some_list, dtype=torch.float)
TypeError: must be real number, not NoneType

It'd be helpful if FathomFox's Vectorizer warned the user when it outputs a vectors.json file that contains null values in one or more feature vectors. This warning could also offer suggestions for possible causes, some of which include:

  • A name mismatch between the name value passed into a rule function and the name of the rule in the list of [ruleName, coefficient] tuples referenced in the ruleset object.
  • A score callback might be failing to return a number.
  • A corner case of a DOM or CSSOM specification; e.g. innerText could return null instead of the empty string in Firefox.

Merge this repo into fathom

The main motivations are…

  • We could use atomicity between the two. For example, a lot of the code FathomFox runs, indirectly, lives in Fathom's trainees.js module. Adding a FathomFox feature often means changing FathomFox and that.
  • We already have Fathom's Python-based CLI tools in the Fathom repo, and releasing 2 things from 1 repo has gone just fine for several iterations.

Bonus: It'll make testing fathom-vectorize easier, which otherwise has to explicitly check out a bunch of repos, just hoping that all the master branches are compatible.

Add testing-corpus measurement to trainer

At the moment, fathom-train reports training and validation accuracy but not testing accuracy. Design a way to feed a trained set of coeffs and biases into the trainer and measure the accuracy that results.

Parallelize Vectorizer (but really PageVisitor)

A significant time bottleneck in the ruleset development workflow is waiting for pages to vectorize. The vectorizer processes each page serially when the pages could be processed in parallel. The vectorizer is implemented by the CorpusCollector class which extends the PageVisitor class. The likely starting place is PageVisitor's visitAllPages() function.

Explore fuzzier success functions for Trainer

Currently, the success function—that is, the test that tells us whether a Fathom-selected node is the right one—is simple equality: did it choose the same node as the human labeled? We'd like to crowdsource labeling, but I doubt the crowd will be as strict in their choice of nodes as ruleset authors. For example, I can imagine them selecting either the inner or outer div when trying to find the price node in <div><div>$34.95</div></div>. I doubt they will stick closely to rubrics even if we define them.

Thus, we should explore alternate, more forgiving success functions. Perhaps any node of equal or nearly equal dimensions and placement should be accepted. Perhaps any node with equivalent innerText should be accepted. Perhaps there should be a fuzzy acceptance based on how far off they are. Perhaps success functions should be pluggable in trainees.js, based on the needs of the ruleset or individual out() rule.

Write up some prospective success functions, and see how close you can get to rubric-strict training accuracy with slightly faulty labeling.

Train multi-out rulesets

You can't train rulesets with multiple out() rules without going in and editing fathom-trainees in between runs, because currently the ruleset key is assumed to be the same as the out() key, which is the same as the element-labeling key. Break that equivalence.

We could expose a list of all the out() rules in the menu. We could even use <select> groups to group them by ruleset. I imagine there'd usually be only one ruleset anyway, though. The out() key could remain the same as the labeling key.

CODE_OF_CONDUCT.md file missing

As of January 1 2019, Mozilla requires that all GitHub projects include this CODE_OF_CONDUCT.md file in the project root. The file has two parts:

  1. Required Text - All text under the headings Community Participation Guidelines and How to Report, are required, and should not be altered.
  2. Optional Text - The Project Specific Etiquette heading provides a space to speak more specifically about ways people can work effectively and inclusively together. Some examples of those can be found on the Firefox Debugger project, and Common Voice. (The optional part is commented out in the raw template file, and will not be visible until you modify and uncomment that part.)

If you have any questions about this file, or Code of Conduct policies and procedures, please see Mozilla-GitHub-Standards or email [email protected].

(Message COC001)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.