GithubHelp home page GithubHelp logo

nasa / openmct Goto Github PK

View Code? Open in Web Editor NEW
11.8K 271.0 1.2K 82.05 MB

A web based mission control framework.

Home Page: https://nasa.github.io/openmct/

License: Other

HTML 0.36% JavaScript 61.51% Shell 0.18% Vue 29.25% SCSS 8.70%

openmct's Introduction

Open MCT license codecov This project is using Percy.io for visual regression testing. npm version CodeQL

Open MCT (Open Mission Control Technologies) is a next-generation mission control framework for visualization of data on desktop and mobile devices. It is developed at NASA's Ames Research Center, and is being used by NASA for data analysis of spacecraft missions, as well as planning and operation of experimental rover systems. As a generalizable and open source framework, Open MCT could be used as the basis for building applications for planning, operation, and analysis of any systems producing telemetry data.

Note

Please visit our Official Site and Getting Started Guide

Once you've created something amazing with Open MCT, showcase your work in our GitHub Discussions Show and Tell section. We love seeing unique and wonderful implementations of Open MCT!

Screen Shot 2022-11-23 at 9 51 36 AM

Building and Running Open MCT Locally

Building and running Open MCT in your local dev environment is very easy. Be sure you have Git and Node.js installed, then follow the directions below. Need additional information? Check out the Getting Started page on our website. (These instructions assume you are installing as a non-root user; developers have reported issues running these steps with root privileges.)

  1. Clone the source code:
git clone https://github.com/nasa/openmct.git
  1. (Optional) Install the correct node version using nvm:
nvm install
  1. Install development dependencies (Note: Check the package.json engine for our tested and supported node versions):
npm install
  1. Run a local development server:
npm start

Important

Open MCT is now running, and can be accessed by pointing a web browser at http://localhost:8080/

Open MCT is built using npm and webpack.

Documentation

Documentation is available on the Open MCT website.

Examples

The clearest examples for developing Open MCT plugins are in the tutorials provided in our documentation.

Note

We want Open MCT to be as easy to use, install, run, and develop for as possible, and your feedback will help us get there! Feedback can be provided via GitHub issues, Starting a GitHub Discussion, or by emailing us at [email protected].

Developing Applications With Open MCT

For more on developing with Open MCT, see our documentation for a guide on Developing Applications with Open MCT.

Compatibility

This is a fast moving project and we do our best to test and support the widest possible range of browsers, operating systems, and nodejs APIs. We have a published list of support available in our package.json's browserslist key.

The project uses nvm to ensure the node and npm version used, is coherent in all projects. Install nvm (non-windows), here or the windows equivalent here

If you encounter an issue with a particular browser, OS, or nodejs API, please file a GitHub issue

Plugins

Open MCT can be extended via plugins that make calls to the Open MCT API. A plugin is a group of software components (including source code and resources such as images and HTML templates) that is intended to be added or removed as a single unit.

As well as providing an extension mechanism, most of the core Open MCT codebase is also written as plugins.

For information on writing plugins, please see our API documentation.

Tests

Our automated test coverage comes in the form of unit, e2e, visual, performance, and security tests.

Unit Tests

Unit Tests are written for Jasmine and run by Karma. To run:

npm test

The test suite is configured to load any scripts ending with Spec.js found in the src hierarchy. Full configuration details are found in karma.conf.js. By convention, unit test scripts should be located alongside the units that they test; for example, src/foo/Bar.js would be tested by src/foo/BarSpec.js.

e2e, Visual, and Performance tests

The e2e, Visual, and Performance tests are written for playwright and run by playwright's new test runner @playwright/test.

To run the e2e tests which are part of every commit:

npm run test:e2e:stable

To run the visual test suite:

npm run test:e2e:visual

To run the performance tests:

npm run test:perf

The test suite is configured to all tests located in e2e/tests/ ending in *.e2e.spec.js. For more about the e2e test suite, please see the README

Security Tests

Each commit is analyzed for known security vulnerabilities using CodeQL. The list of CWE coverage items is available in the CodeQL docs. The CodeQL workflow is specified in the CodeQL analysis file and the custom CodeQL config.

Test Reporting and Code Coverage

Each test suite generates a report in CircleCI. For a complete overview of testing functionality, please see our Circle CI Test Insights Dashboard

Our code coverage is generated during the runtime of our unit, e2e, and visual tests. The combination of those reports is published to codecov.io

For more on the specifics of our code coverage setup, see

Glossary

Certain terms are used throughout Open MCT with consistent meanings or conventions. Any deviations from the below are issues and should be addressed (either by updating this glossary or changing code to reflect correct usage.) Other developer documentation, particularly in-line documentation, may presume an understanding of these terms.

  • plugin: A plugin is a removable, reusable grouping of software elements. The application is composed of plugins.
  • composition: In the context of a domain object, this refers to the set of other domain objects that compose or are contained by that object. A domain object's composition is the set of domain objects that should appear immediately beneath it in a tree hierarchy. A domain object's composition is described in its model as an array of id's; its composition capability provides a means to retrieve the actual domain object instances associated with these identifiers asynchronously.
  • description: When used as an object property, this refers to the human-readable description of a thing; usually a single sentence or short paragraph. (Most often used in the context of extensions, domain object models, or other similar application-specific objects.)
  • domain object: A meaningful object to the user; a distinct thing in the work support by Open MCT. Anything that appears in the left-hand tree is a domain object.
  • identifier: A tuple consisting of a namespace and a key, which together uniquely identifies a domain object.
  • model: The persistent state associated with a domain object. A domain object's model is a JavaScript object which can be converted to JSON without losing information (that is, it contains no methods.)
  • name: When used as an object property, this refers to the human-readable name for a thing. (Most often used in the context of extensions, domain object models, or other similar application-specific objects.)
  • navigation: Refers to the current state of the application with respect to the user's expressed interest in a specific domain object; e.g. when a user clicks on a domain object in the tree, they are navigating to it, and it is thereafter considered the navigated object (until the user makes another such choice.)
  • namespace: A name used to identify a persistence store. A running open MCT application could potentially use multiple persistence stores, with the

Open MCT v2.0.0

Support for our legacy bundle-based API, and the libraries that it was built on (like Angular 1.x), have now been removed entirely from this repository.

For now if you have an Open MCT application that makes use of the legacy API, a plugin is provided that bootstraps the legacy bundling mechanism and API. This plugin will not be maintained over the long term however, and the legacy support plugin will not be tested for compatibility with future versions of Open MCT. It is provided for convenience only.

How do I know if I am using legacy API?

You might still be using legacy API if your source code

  • Contains files named bundle.js, or bundle.json,
  • Makes calls to openmct.$injector(), or openmct.$angular,
  • Makes calls to openmct.legacyRegistry, openmct.legacyExtension, or openmct.legacyBundle.

What should I do if I am using legacy API?

Please refer to the modern Open MCT API. Post any questions to the Discussions section of the Open MCT GitHub repository.

Related Repos

Note

Although Open MCT functions as a standalone project, it is primarily an extensible framework intended to be used as a dependency with users' own plugins and packaging. Furthermore, Open MCT is intended to be used with an HTTP server such as Apache or Nginx. A great example of hosting Open MCT with Apache is openmct-quickstart and can be found in the table below.

Repository Description
openmct-tutorial A great place for beginners to learn how to use and extend Open MCT.
openmct-quickstart A working example of Open MCT integrated with Apache HTTP server, YAMCS telemetry, and Couch DB for persistence.
Open MCT YAMCS Plugin Plugin for integrating YAMCS telemetry and command server with Open MCT.
openmct-performance Resources for performance testing Open MCT.
openmct-as-a-dependency An advanced guide for users on how to build, develop, and test Open MCT when it's used as a dependency.

openmct's People

Contributors

adoubekk avatar akhenry avatar brianwyu avatar charlesh88 avatar davetsay avatar deeptailor avatar dependabot[bot] avatar depperm avatar dhrubomoy avatar evenstensberg avatar joelmckinnon avatar jvigliotta avatar khalidadil avatar kobe1104 avatar larkin avatar mariuszr avatar michaelrogers avatar mrdjohnson avatar nikhilmandlik avatar ozyx avatar pacozaa avatar prestonjcrowe avatar psarram avatar rukmini-bose avatar scottbell avatar shefalijoshi avatar slhale avatar trusktr avatar unlikelyzero avatar vwoeltjen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

openmct's Issues

Show Context Menu from "items" view

Show context menu from individual "grid items" in a view of a folder (the only view of a folder, currently.) User should be able to right-click on a domain object within a folder and see a context menu of available actions appear, as they do in the tree.

[Capabilities] Incorrect warning logged

Observing No key defined for capability; skipping. frequently on console. This appears to occur when a capability has been overridden, due to a logic error in the way this condition is checked for before it is logged. (Error introduced at 71ca980)

[API] Review API

Review current Open MCT Web API and identify "pain points" for developers. In particular, want to identify areas where we can save future development effort by either shortening learning curve or reducing effort to implement features.

[Layout] Persist changes to view selection

Persist choices made for view selection in frames within a layout, when those changes have been made in Edit mode. Do not persist choices when the view is in Browse mode.

Summary of desired behavior:

  • User creates a Layout
  • User Edits a Layout
  • User drags some objects (e.g. a Telemetry Panel) into the Layout
  • User uses view switcher in frame in a Layout to change the views in these frames (e.g. switching to Scrolling view of a Telemetry Panel)
  • User hits Save and returns to Browse mode
  • User views the created Layout in Browse mode and sees the view choices from above (e.g. that telemetry panel still shows Scrolling view)
  • User can still change these view choices, but if they navigate away from the Layout and come back, the view choice that they Saved from Edit mode should be in effect again.

Drag-drop into Layout also acts as drop into Fixed Position view

When dragging-dropping into a layout that contains a fixed position view, the dropped object also appears in the fixed position where it is dropped. This, obviously, is undesired; desired behavior is that the drop is recognized/handled only by the layout.

Object Inspector

Allow information to be displayed about objects via an Inspection panel. See pgs. 23 - 26 in UI sketches v2.1, https://drive.google.com/a/nasa.gov/file/d/0B0v27OM1JkSeR001RFJZMk43QVk/view?usp=sharing.

  • This pane will need to operate in the same was as the treeview, allowing the user to resize and collapse it. See #72.
  • Selectable objects should include tree items, and sub-element items during editing such as the legend of a Telemetry Point in a Panel's plot view, clicking a Telemetry Point in a Panel's Fixed Position view, or clicking a frame while editing a Display Layout.
  • This element should be architected as much as possible to support multiple item selection, particularly in Timelines.

Typing in search bar can be unresponsive

For a reasonably large set of objects, typing in search bar can be unresponsive after the first one or two characters, particularly if there are a lot of hits for those characters. Unresponsiveness lasts for roughly 1-2s. Subsequent typing gives results more quickly.

Could try throttling the search function using the throttle service.

May also want to do something to wait until previous search results have been returned before initiating a new search.

This was observed using a non-ES data store (so issue may also be specific to GenericSearch)

[Browse] Removing a navigated-to object does not navigate away

Navigate to a domain object in Browse mode.
In the tree, find the same object, right-click, and choose "Remove"
Observe: Object is removed from the tree but remains in view.
Expected behavior: Object should no longer be in view. Navigation should switch over to its parent, or to a default object (e.g. My Items)

[Mobile] Drag and drop

Drag and drop is not a feature. This does not allow dnd
during browse mode into a folder. Also, this does not allow dnd
during edit mode, from the tree to the elements list nor the
view. Also in edit mode for a layout or fixed position view,
objects cannot be moved or resized.

Page splitter doesn't set default size properly with high latency and clean cache.

I can reproduce this almost 90% of the time with the following settings:

When done properly, the page looks like so:

screen shot 2015-07-27 at 9 23 57 am

I can sometimes reproduce this issue without the cache disabled, I believe it's a condition where the split view is using something (likely css) to set the default size of the tree view, and the css hasn't full applied yet, so the initial tree size is 0px, and the splitter sizes accordingly.

Dragging the splitter returns warp to normal functionality.

If this is a race with CSS loading, we may need to wait for css loading before initializing the application.

[Image Telemetry] Support pan-zoom

Support pan-zoom of image telemetry. This should function similarly to pan/zoom in plots. Specifically:

  • Click-drag should marquee zoom into an area of an image
  • Shift-click-drag should pan around the image
  • Once panned or zoomed, buttons should become available in the top right:
    • Step back pan-zoom
    • Reset pan-zoom

Example image telemetry is available with bundle example/imagery (add "example/imagery" to bundles.json)

Note that, once panned or zoomed, the image should pause an stop updating with the latest image telemetry (I believe; double check with @charlesh88 on this point)

[Edit] Remove is available for invalid objects

When in Edit mode, the Remove action is available for the object being edited, as well as other objects in the domain object hierarchy above it (in the Library)

Desired behavior is that Remove should be unavailable here (and, more generally, that modification should only be permitted for the domain object being edited and its direct descendants)

Proposed solution:

  • Add a mutation policy category to determine which objects are mutable
    • Currently, this is handled as a hasFeature('creation') check; this check should instead be moved into an instance of the mutation policy
  • Add a policy disallowing mutation in Edit mode for objects which are not the object being edited or one of its direct descendants
  • Add an action policy restricting the remove action to objects whose contextual parent allows mutation

[Platform] Bump Angular Version to Latest (1.4.3)

We're currently using a legacy version of angular which is preventing us from using some very useful features (such as one-time bindings, which are useful for reducing watch counts).

I dropped in 1.4.3 and did not encounter any bugs with the application but I did not do a comprehensive check.

@VWoeltjen any thoughts about when we should schedule this and how much testing we should perform afterwards?

Use anchor tags with `href` for navigation

We should use standard browser navigation via anchor tags with href attributes instead of ng-click directives that tie directly into the navigation service.

This allows us to reuse standard anchor styles (cursor changes, etc), and is more in line with how browser navigation works on the open internet.

Info bubbles can block mouse clicks

Info bubble (which shows on hover over objects in a tree) appears to block mouse clicks when attempting to navigate to these objects.

To reproduce:

  • Hover over a domain object's label in the tree on the left hand side
  • Left click
  • Observe: Domain object does not get navigated-to
  • Expected behavior: Domain object gets highlighted, view appears to the right hand side

[Mobile] Hover menu

Hover info menu is only reached after an item is pressed on,
then after a delay the menu pops up. And it is only closed if
another tree menu is pressed.

selecting an option in create menu sometimes results in no object being created

When using the create menu, I am surprised to find that clicking to create an object sometimes dismisses the menu instead of opening the new object dialog box. The actual ng-click is attached to the text, but the hover effect and cursor shows a much larger click target.

This screenshot explains the current functionality:
create menu sensitivity

This screenshot shows the expected functionality:
expected

this bug is a demokiller.

Disable drag-drop in Browse mode

Drag-and-drop composition (e.g. from the tree to a Layout) should not be active in Browse mode; this is considered an "editing" activity and should only work from Edit mode.

The exception to this is folders; dragging-and-dropping into the items view of a Folder SHOULD result in adding an object to that folder's composition, even in Edit mode.

Currently, however, drag-and-drop functions for any view that support drag-drop composition, regardless of current mode (Browse or Edit.)

mct-resize triggers excessive digest cycles

The mct-resize directive (defined in platform/commonUI/general) monitors the size of an element by polling on a $timeout, which in turn will trigger a new digest cycle as it is called currently (an extra parameter can be provided to suppress this)

Instead, it would be preferable to fire a digest cycle only when an element's size actually changes; there is already a check for this change, so adding the extra argument to $timeout and invoking scope.$apply should achieve the desired result (the existing scope.$eval may be enough that the $apply call is not needed at all, if $eval triggers a digest - not sure on this)

Locator does not work when there is no context

When a search result is selected, the LocatorController cannot find context. This means that when the create dialog is open, the tree to select the location to create that object is not loaded. Also, when attempting to edit a search result, the Library is not loaded.

screen shot 2015-08-27 at 10 21 04 am
When this issue occurs, the tree appears to load infinitely, as above.

Allow treeview to be collapsed

Allow the user to collapse and hide the treeview in 'browse' mode. See pgs. 19 - 21 in UI sketches v2.1, https://drive.google.com/a/nasa.gov/file/d/0B0v27OM1JkSeR001RFJZMk43QVk/view?usp=sharing.

  • A button will need to be added to the splitter bar (when visible) to effect the collapse.
  • Buttons available when the treeview is hidden will allow expansion of the treeview, and access to the Create menu.
  • The treeview should be hidden by default when opening an object in a new browser tab. This means that we may want to allow a querystring param in the URL to control the visible state of the treeview as well as an ng-click when navigating within a single window.

[Mobile] Add touch support to mct-drag

Add touch support to the mct-drag directive in platform/commonUI/general.

This will enable various user actions in mobile which are currently not present (e.g. repositioning splitters) since mct-drag is used somewhat frequently.

[Layout] Layout rebuilds after resize/reposition

In Edit mode of a Display Layout containing multiple panel, drag one panel. Observe: Contents of other panels are reloaded (can be seen to repopulate)

Desired behavior is that the position of the dragged panel updates, but that it contents remain as they were.

URL is malformed while browsing

After changes from #21, URL shown while navigating (e.g. clicking around the tree) becomes malformed, including an extra "index.html" and an extra "view=..." (see screenshot)

The URL shown by "Open in new tab" appears to be correct and first, and then becomes malformed (presumably when updated by BrowseController)

bug21

Style mobile

Sand, polish and stylize the current mobile display work. Should be done in a new branch based on 'mobile'.

[Persistence] Errors in persistence (after creating/modifying objects) should be visible to user

When there are errors that prevent an object from being persisted-- whether persisting a change to an object or persisting a new object-- the system should notify the user of the issue.

Currently, if a persistence operation fails, the interface acts like the persistence operation succeeded, and it's only when you refresh do you notice that changes have not been persisted.

We should not update the UI to show a persistence operation as completed until it has actually completed successfully, as subsequent actions performed while the UI is out of sync can cause significant negative effects.

Implement a service for WebWorkers

Implement a service which allows web workers to be registered under symbolic names, and run using those symbolic names. (This will mainly help with resolving bundle paths to WebWorker scripts.)

Supports WTD-1218.

[Mobile] Text in buttons/tree items

Text in buttons and tree items can be highlighted by iPad highlight options to
"copy", "select all", and "define." This should not be allowed, as buttons and
tree list items should be treated as whole, button-like items.

[Search] Compatibility with links and context

Search results currently have no context, so results almost* always appear as links.

This is because the generic search provider uses the object service to get all of the objects, and the object service currently returns objects with no context. So, when the object service has been changed to incorporate context, then this issue should be resolved. (I believe @larkin is working on this.)

For search providers other than the generic search provider, this may still be an issue even after the object service change.

* Objects from before move-copy-link was implemented don't look like links, because their models don't have locations.

[Mobile] Sine wave plot view curve expansion

Sine wave plot view updates slowly relative to the
screen/plot shown, therefore it looks like it is frozen
or broken, because it may seem like it has stopped updating.
Upon switching to the scrolling view the values/time updates
every second as intended.

[Edit] Useless tooltips show over Library and Elements panes

Go to edit mode; hover over the Library pane. A tooltip appears saying "Library"

This is probably due to the use of "title" as an attribute on mct-container without consideration of its normal HTML interpretation. Solution should be to change parameter name for the accordion container (in platform/commonUI/general) to something other than "title", and update usage in Edit mode templates accordingly.

Can't enter Edit mode twice

Navigate to a domain object, click Edit to enter Edit mode, then click Cancel to leave Edit mode.
Click Edit again and observe that the URL changes, but the client remains in Browse mode.
Desired behavior is that the subsequent click goes into Edit mode.

This appears to be fixed if one checks the new path before cancelling the route change, e.g.

                    if ($location.path().indexOf("/browse/") === 0) {
                        $route.current = priorRoute;
                    }

... in the $locationChangeSuccess listeners in BrowseController and BrowseObjectController

[Mobile] Context Menu

Context menu is not able to be reached. A touch and hold option
to allow this on tree list items would be a solution

Open in New Tab

Add an Open in New Tab action; this should be available in two places:

  • From the context menu for a domain object
  • From the top-right set of buttons in Browse mode

There's a placeholder for this action in platform/commonUI/browse/src/windowing/NewWindowAction.js with some metadata in platform/commonUI/browse/bundle.json (note that the name will need to change from Open in New Window to Open in New Tab)

There are also some CSS changes which are suppressing the presence of this button currently; check with Charles about undoing these changes.

This will depend on addressability (see #8) on branch open1149, so should start from that branch if it hasn't been merged to master yet

Use Requirejs optimizer for production builds

Currently the application uses requirejs to load modules without using the optimizer. This results in a large number of requests made to load the app and slows down application load significantly. Additionally, it causes us to use caching settings that are not ideal for production environments.

Using the requirejs optimizier to generate a single javascript file which can be fingerprinted and cached as a whole would decrease load times substantially.

[Location] Objects loaded directly from ObjectService appear as links

When an object is loaded any other way except for via a "composition" capability, it appears as a link.

Instead, it would be preferable to treat these as belonging in their original context in this situation, and only override with alternate context when they are loaded in alternate way.

Could probably handle this without touching core by adding an objectService decorator which does this (from the location plugin)

[Mobile] Full Screen mode

Full screen button is unresponsive, should allow a full screen mode.
A full screen mode could be one that hides the url bar at the top.

[Fixed Position] Provide default position for telemetry points

If a fixed position view contains a telemetry element in its composition but does not have at least one position/size for that telemetry element defined in the view's configuration, a default one should be chosen and displayed. If the user Edits and saves this, it should be stored to the view's configuration.

To see similar behavior, edit a Display Layout and drag objects from the Library to the Elements pane (or, from Browse mode, create new objects in the Layout directly.) Observe that these are assigned positions in the Layout view automatically. A similar positioning approach (starting from top-left, cascading down) should make sense for Fixed Position view as well.

[Identity] Add user identification support

Add support for user identification to platform. This should include:

  • An interface that applications can use to expose the user's identity.
  • An indicator for who the current logged in user is if there is such a user
    • (note that this will probably be relocated elsewhere in the UI later, but indicators are cheap to implement so this works well short-term)
  • Inclusion of a "creator" field in newly-created domain object models.

Supports public/private permissions.

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.