GithubHelp home page GithubHelp logo

git-afsantos / haros Goto Github PK

View Code? Open in Web Editor NEW
189.0 17.0 37.0 5.88 MB

H(igh) A(ssurance) ROS - Static analysis of ROS application code.

License: MIT License

JavaScript 16.41% CSS 3.56% HTML 5.40% Python 74.63%
static-analysis ros quality-assurance robotics

haros's Introduction

DOI

HAROS

HAROS is a framework for quality assurance of ROS-based code, mostly based on static analysis - which consists on extracting information from the source code without executing it (and, sometimes, even without compiling it). Its main goal is the early detection of problems in the software development life cycle, which would otherwise go unnoticed into later stages or even into production.

Try it yourself: there is a demo page of the HAROS visualizer available on GitHub.

Tutorials: on GitHub and on YouTube.

More info: short video presentation on YouTube.

Current Status

HAROS is still being developed, as of August 2021. Help improve HAROS by participating in a short user survey.

Installing

See INSTALL for installation methods and instructions.

How to Use

See USAGE for basic commands and usage instructions.

Bugs, Questions and Support

Check whether your question has an answer in the FAQ.

Please use the issue tracker for issues or feature requests directly related to HAROS.

For issues related to plugins, please use the respective plugin repository.

If you run into errors, or feel that something is not working, run HAROS in debug mode, so the log files do not miss any information, e.g.,

haros --debug analyse ...

Then, you can share the log file, found by default within ~/.haros/log.txt.

Citing

See CITING.

Contributing

See CONTRIBUTING.

Acknowledgment

Until March 2021, this work was financed by the ERDF – European Regional Development Fund through the Operational Programme for Competitiveness and Internationalisation - COMPETE 2020 Programme and by National Funds through the Portuguese funding agency, FCT - Fundação para a Ciência e a Tecnologia within project PTDC/CCI-INF/29583/2017 (POCI-01-0145-FEDER-029583).

haros's People

Contributors

alexistm avatar chamango90 avatar davla avatar erogleva avatar gavanderhoorn avatar git-afsantos avatar hsd-dev avatar ipa-mirb avatar ipa-nhg avatar max-krichenbauer avatar mikaelarguedas avatar nlimpert avatar tandf avatar wasowski 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

haros's Issues

Solution for PyFlwor installation

Currently, pyflwor requires an editable VCS install, and this is neither standard nor convenient (see #38).
#43 made pyflwor an optional dependency, but a better solution for its installation should be worked on.

Ideally, haros would not depend on pyflwor, or a better alternative would be used instead.

Here are the currently considered options to overcome this issue.

1. Try to fix the original

Find the issue in pyflwor that makes it write additional files through PLY, and submit a PR if it can be avoided. Possible candidates include this line and this line.

The major drawback with this option is that the PR might not be accepted, or it might not be released afterwards.

2. Ship a modified version in HAROS

Fix the original issue, so that no files are written (if possible), and ship the altered version with HAROS itself. If this cannot be done, at least explore the parameters that allow a custom directory for the PLY table files, and redirect the outputs (~/.haros would be an option here).

The major drawback of this approach is that pyflwor is licensed under BSD, while HAROS is MIT.

3. Force the use of a virtualenv

When using virtualenv it seems that the original issue is not present. Using virtualenv is a recommended practice in general, in any case, and so HAROS could adopt this option as its standard mode of operation.

The major drawback of this option is forcing a certain type of installation/usage.

4. Monkey patch pyflwor

This is possibly a more laborious alternative, but one that could work. Instead of using the high-level API of pyflwor, change the problematic areas (the two lines linked above) via monkey patching, redirect the generated files to ~/.haros and use the patched version.

While this option can make some things easier (e.g. a simple pip install pyflwor-ext would work just fine), it is not as maintainable.

Collapse issue reports by rule

To avoid a lot of visual noise and nearly duplicate issues, issues should be grouped by rule (at least for low-severity ones, or for ones with a lot of occurrences).

Additionally, it might be useful to group by message, and only then display the list of files.

Example:

Issue 1 - Rule No Copyright Statement

Every source and header file must contain a license and copyright statement at the beginning of the file.

in include/fictibot_drivers/sensor_manager.h
in include/fictibot_drivers/motor_manager.h
in src/driver_node.cpp
[code-standards] [comments] [license] [copyright] [google-cpp] [ros]

haros.cmake_parser.IncompleteStatementError when runing haros on some packages

After trying HAROS on some simple packages containing mostly message and service definitions I tried to run it on a bit larger package but got this crash:

haros full -p haros.yaml                                                                              
[HAROS] Loading common definitions...
[HAROS] Loading plugins...
  > Loaded mi_calculator
  > Loaded lizard_plugin
  > Loaded cppcheck_plugin
  > Loaded cpplint_plugin
  > Loaded pylint_plugin
  > Loaded cccc_plugin
  > Loaded ccd_plugin
  > Loaded radon_plugin
[HAROS] Reading project and indexing source code...
Traceback (most recent call last):
  File "/usr/local/bin/haros", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python2.7/dist-packages/haros/haros.py", line 725, in main
    if launcher.launch(argv = argv):
  File "/usr/local/lib/python2.7/dist-packages/haros/haros.py", line 150, in launch
    return args.command(args, settings)
  File "/usr/local/lib/python2.7/dist-packages/haros/haros.py", line 167, in command_full
    return (self.command_analyse(args, settings)
  File "/usr/local/lib/python2.7/dist-packages/haros/haros.py", line 184, in command_analyse
    return analyse.run()
  File "/usr/local/lib/python2.7/dist-packages/haros/haros.py", line 497, in run
    configs, env = self._extract_metamodel(node_cache)
  File "/usr/local/lib/python2.7/dist-packages/haros/haros.py", line 518, in _extract_metamodel
    extractor.index_source(settings = self.settings)
  File "/usr/local/lib/python2.7/dist-packages/haros/extractor.py", line 103, in index_source
    self._find_nodes(settings)
  File "/usr/local/lib/python2.7/dist-packages/haros/extractor.py", line 229, in _find_nodes
    extractor.find_nodes(pkg)
  File "/usr/local/lib/python2.7/dist-packages/haros/extractor.py", line 689, in find_nodes
    parser.parse(os.path.join(self.package.path, "CMakeLists.txt"))
  File "/usr/local/lib/python2.7/dist-packages/haros/cmake_parser.py", line 398, in parse
    self.parser.parse(cmakelists)
  File "/usr/local/lib/python2.7/dist-packages/haros/cmake_parser.py", line 249, in parse
    self.parsetree = self.parse_block_children(None)
  File "/usr/local/lib/python2.7/dist-packages/haros/cmake_parser.py", line 271, in parse_block_children
    raise IncompleteStatementError()
haros.cmake_parser.IncompleteStatementError

I am new to HAROS so unfortunately I have no idea weather this is caused by HAROS or my code. As my code compiles I dont really know where to look for error.

AssertionError when parsing CMakeLists.txt

A user reported an AssertionError being raised when parsing one of their CMakeLists.txt. Turns out the error was raised when parsing the following line:

include_directories()

The assertion expected this command to have one or more arguments, which is also what the documentation states.
So, while I do not think this is really a bug, but rather a malformed CMake file, I am going to turn the assertion into a warning.

'haros init' fails with "KeyError: ROS_WORKSPACE"

After resolving #40 (so with the base /opt/ros/kinetic/setup.bash sourced and pyflwor installed), running haros init results in:

[HAROS] It seems this is a first run.
Traceback (most recent call last):
  File "/home/user/venv_haros/bin/haros", line 10, in <module>
    sys.exit(main())
  File "/home/user/venv_haros/local/lib/python2.7/site-packages/haros/haros.py", line 725, in main
    if launcher.launch(argv = argv):
  File "/home/user/venv_haros/local/lib/python2.7/site-packages/haros/haros.py", line 142, in launch
    self.command_init(args, HarosSettings())
  File "/home/user/venv_haros/local/lib/python2.7/site-packages/haros/data.py", line 454, in __init__
    self.workspace = workspace or self.find_workspace()
  File "/home/user/venv_haros/local/lib/python2.7/site-packages/haros/data.py", line 504, in find_workspace
    raise KeyError("ROS_WORKSPACE")
KeyError: 'ROS_WORKSPACE'

Only after having sourced a setup.bash of a ROS workspace does init continue and clones the plugins repository.

Provide better error messages

For most errors, the user is presented a stack trace of the corresponding exception. As suggested in #41, better error messages should be provided.

To accomplish this, a central error reporting utility might be a good idea, so as to avoid spreading print all over the place. The util.py script is a good candidate for this.

It might also be worth it to change the current logging behaviour. Use two loggers, instead of one. One, by default, prints everything from INFO and above to the log file, unless --debug is set, in which case DEBUG is also logged. The second logger is used with a better formatting to print messages to the user.

Another interesting idea, while messing with error handling, is to define custom exit codes, so that failures are better identified. See this SO answer or this page for ideas of standard and unallocated error codes.

Leading and Trailing Spaces on Package XML Strings

When reading strings from package.xml, such as package dependencies, the returned strings should be trimmed. Leading and trailing spaces create unknown package names, which leads to a crash when sorting the packages in topological order.

"haros.py" Is in Need of Refactoring

The command functions are getting out of hand. They are long, and becoming harder to maintain.

Either split the functions into smaller helper functions, or create an application class, Haros, that handles the public and private functions. The latter also allows for internal state, reducing the need for global variables.

Redesign the Implementation

A note to self that the current implementation needs a serious rework from the ground up, whenever I find enough available time.

metamodel.py: Change all data structures to hold IDs instead of references to other objects. As convenient as references are, testing the current system is harder than it should be. This will have an impact in all the code base, as well as in the query language.

haros.py: Change the commands/runners to run on an event and plug-in system. Make everything (extractors, query engine, analyser, exporter, etc.) a plug-in, so that it becomes truly customisable and extensible.

config_builder.py: This is a mess from its complexity alone, but the code needs a rewrite and clean up.

extractor.py: See above.

viz: All of it is asking for improvement and more user interaction.

Better Management of Plugin Dependencies

When a plugin depends on an external tool, it should include either a list of dependencies or the commands to install such dependencies in some file. Perhaps using the plugin manifest files, plugin.yaml, would be appropriate.

This would alleviate the requirements to install Haros, but, on the other hand, it would put more work on Haros's side. There must be some mechanism to determine if a plugin has been installed.

Allow analyse -d to create a new folder

I would like to use a not-yet-existing folder for the given directory of cmd analyse -d and use the functionality of viz.install() to create it.
This is prevented by the following cmd:

if args.data_dir and not os.path.isdir(args.data_dir):

@git-afsantos is it possible to remove this line or can you suggest a way to support this feature?

For reference:

haros analyse -d DATA_DIR

Export analysis results to the given directory, instead of the default one. This option will also install the visualisation files. If DATA_DIR contains a previous analysis database for the current project within its tree, it will be loaded and new results will be added to that database.

HAROSviz

$ ./haros-runner.py analyse -p my_project.yaml -d temp -b cccc_plugin
[HAROS] Loading common definitions...
[HAROS] Loading plugins...

Loaded mi_calculator
Loaded cpplint_plugin
Loaded cppcheck_plugin
Loaded pylint_plugin
Loaded lizard_plugin
Loaded ccd_plugin
Loaded radon_plugin
[HAROS] Reading project and indexing source code...
[HAROS] Running analysis...
[HAROS] Saving analysis results...

Looks like it ran okay. On the HAROSviz page it just shows "Loading...."

Is there some where to check to see why it isn't loading the json file?

Thanks,

Matt

Plugins not found

Hi!

I installed HAROS via pip, and also installed haros_plugins via pip.
I also followed the comment in issue 20 and downloaded the plugins repo to ~/.haros/plugins/

but when I try using the -w flag, it prints:

[HAROS] Running setup operations...
[HAROS] Loading common definitions...
[HAROS] Loading plug-ins...
ERROR:root:There are no analysis plugins.

Add screenshot to README

Showing the output of the visualizer will help new users like myself quickly understand what the output is.

Also, from reviewing the README its not clear what kind of errors/suggestions the static analyzer will find/make.

Duplicate find_workspace

There are two functions that define find_workspace, one in extractor.py and the other in data.py. After a recent PR, they now even differ slightly in behaviour. This should be fixed, so that there is only one implementation.

Should rosgraph be added to requirements.txt?

That package will probably always be installed when users have ROS installed, but if requirements.txt is supposed to capture the Python modules necessary to be able to run haros, then it would seem that rosgraph should be listed.

rospkg is listed:

rospkg>=1.1.4

On systems with ROS installed, pip will probably detect it and decide that the dependency has already been satisfied. On systems without, it will be installed.

Implement fine-grained control over the exported issues

As per the meeting today with @wasowski and @gavanderhoorn, we have decided that HAROS needs customisable control over what issues are exported after the analysis takes place.

The implementation of this feature will be composed of three smaller features.

  1. Blacklisting individual rules by their unique id. This specification should be done in the settings YAML file, within ~/.haros. At a later stage, this might also be customisable in each project's YAML.

  2. Blacklisting rules by tag. This should also be specified in the settings file.

  3. Ignoring specific lines in the source file. Many tools allow users to write special comments or annotations in the source, so that the analysis ignores certain lines of the source file. HAROS should implement the same kind of annotations, but make them applicable to all plugins.

Requirements file (missing bonsai.model)?

Trying to be a stupid user I only cloned the repository and then tried to use the "no install" variant (so tried python haros-runner.py).

On a "fresh" Ubuntu Xenial system this resulted in:

Traceback (most recent call last):
  File "./haros-runner.py", line 24, in <module>
    from haros.haros import main
  File "/home/user/ros/haros/haros/haros.py", line 102, in <module>
    from .extractor import ProjectExtractor
  File "/home/user/ros/haros/haros/extractor.py", line 34, in <module>
    from bonsai.model import CodeGlobalScope, pretty_str
ImportError: No module named bonsai.model

Would it perhaps be an idea to provide a requirements.txt with the basic dependencies listed (yaml, bonsai, etc)? For the non-install option this would help avoid a nr of ImportErrors.

analyse -w and -b options require the "haros_plugin_" prefix

The documentation did not mention that the plugin name must be preceded by "haros_plugin_", and the error message made it sound like no plugins (at all) were found instead of just this particular plugin not being found.

Originally posted by @max-krichenbauer in #72 (comment)

Both analyse -w and analyse -b should not require the haros_plugin_ prefix to filter plugins. It is an implementation detail to locate plugins, not actually part of the name.

Multi-project Analysis

Sometimes it may be useful to organise packages into projects and analyse a whole project at a time.

Index files kind of solve this issue, by defining an index file for each project, but the analysis results overlap. Haros always uses the same analysis database file. Adding an option to load a different file could also solve this, at the expense of making the command-line a little more cumbersome.

In any case, the visualiser is not adapted for this concept, so multiple visualisers would have to be exported, one for each project. This requires launching multiple viz servers (when hosting), or creating a top-level index.html with links to open the individual projects, which is not ideal.

My proposal is to add a new Project data structure.

class Project(object):
    def __init__(self, name, packages = None):
        self.name = name
        self.packages = packages if not packages is None else []

Index files could define a name for a project, or default to the file name minus extension.
The AnalysisManager could store the history for each project separately, or simply create one analysis database for each project. The exported viz files and directory structure would have to change. Instead of data/packages.json, etc., it would have to go one level deeper, data/project/packages.json. Viz itself would have to be changed as well.

Provide a language for node/msg properties

Such a language could be used to automatically generate property-based tests, for instance, without having to write code.

These properties could be embedded into the YAML project files, within their own section. Example:

%YAML 1.1
---
project: example
packages: []
properties:
  msg:
    pkg/msg: []
  node:
    pkg/node: []

msg properties would be message field invariants, applicable to every message independently of the context, e.g. enum fields.

node properties are applicable to a node's behaviour, mostly regarding what the node publishes and what it expects to receive, in an initial approach.

Example properties:

publish(msg, topic) within 0.1 s where field1 < 1, field2 < 2

publish(m, topic) [< 100 ms] {f1 < 1, f2 < 2, f3 < 3}

receive(e, ~events/bumper) {state = PRESSED}
  >> publish(c, ~cmd_vel) [< 100 ms] {linear.x < 0.0}

ROS2 Support

I was running HAROS against the latest release and there are a few errors on the packages:
https://raw.githubusercontent.com/ros2/rosdistro/ros2/crystal/distribution.yaml

https://github.com/ros2/rmw_implementation.git
File "/usr/local/lib/python2.7/dist-packages/haros/cmake_parser.py", line 530, in _process_link_libraries
assert len(args) >= 2
AssertionError

https://github.com/ros2/orocos_kinematics_dynamics.git
AttributeError: 'list' object has no attribute 'replace'

Some of the ROS2 meta packages don't contain a CMakeList.txt so they all fail.
https://github.com/ros2/ros2cli.git
IOError: [Errno 2] No such file or directory: '/home/matt/haros/ros/test_dir/ros2cli/CMakeLists.txt

Will ROS2 tests be different?

Thanks,

Matt

No module named bonsai.model

Following the Method 1 install. I am getting this error:

File "./haros-runner.py", line 24, in
from haros.haros import main
File "/home/matt/lawn_tractor_ws/src/haros/haros/haros.py", line 102, in
from .extractor import ProjectExtractor
File "/home/matt/lawn_tractor_ws/src/haros/haros/extractor.py", line 34, in
from bonsai.model import CodeGlobalScope, pretty_str
ImportError: No module named bonsai.model

I have installed the dependencies listed on the README. Is Bonsai this a separate install?

Thanks for your help,

Matt

Meaning of the Metrics/Issues

Write a section under Help, in the visualiser, to make clearer what each metric and issue means. For instance, provide basic instructions on how to fix high Cyclomatic Complexity numbers, and so on.

After pip install, 'haros init' fails with missing rosgraph & pyflwor

Connected to #38.

$me being a stupid user again.

After a pip install haros, invoking haros init results in:

Traceback (most recent call last):
  File "/home/user/venv_haros/bin/haros", line 6, in <module>
    from haros.haros import main
  File "/home/user/venv_haros/local/lib/python2.7/site-packages/haros/haros.py", line 102, in <module>
    from .extractor import ProjectExtractor
  File "/home/user/venv_haros/local/lib/python2.7/site-packages/haros/extractor.py", line 47, in <module>
    from .launch_parser import LaunchParser, LaunchParserError
  File "/home/user/venv_haros/local/lib/python2.7/site-packages/haros/launch_parser.py", line 30, in <module>
    import rosgraph.names
ImportError: No module named rosgraph.names

Running source /opt/ros/kinetic/setup.bash fixes that.

Another invocation then fails with:

Traceback (most recent call last):
  File "/home/user/venv_haros/bin/haros", line 6, in <module>
    from haros.haros import main
  File "/home/user/venv_haros/local/lib/python2.7/site-packages/haros/haros.py", line 105, in <module>
    from .analysis_manager import AnalysisManager
  File "/home/user/venv_haros/local/lib/python2.7/site-packages/haros/analysis_manager.py", line 32, in <module>
    import pyflwor
ImportError: No module named pyflwor

I realise the ROS dependency is documented (implicitly) with:

This assumes that you already have a working installation of ROS.

Not every ROS user will have their shell automatically source /opt/ros/kinetic/setup.bash though, so perhaps that should be added to the readme.

Also: I realise the pyflwor dependency is actually documented in the Requirements section, but the command that installs it -- and the other dependencies -- don't appear in the readme until after we've been told to run haros init.

Perhaps the order of these parts of the readme should be reversed?

Show Rule IDs and Reporting Plugin

Now that users can blacklist individual rules (#53), it would be useful to have the HTML issue reports show the rule ID for each report, so that users know what to write in the settings file.

Additionally, it would be useful for each issue to also specify which plugin raised it, in case users want to blacklist that plugin.

Running with '--debug' before 'init' causes an error

Running any command with a debug logger, e.g. haros --debug analyse <...> before the .haros directory is created raises

Traceback (most recent call last):
  File "haros-runner.py", line 26, in <module>
    sys.exit(main(source_runner = True))
  File "/home/andre/ros/safer/haros/haros/haros.py", line 756, in main
    if launcher.launch(argv = argv):
  File "/home/andre/ros/safer/haros/haros/haros.py", line 142, in launch
    level=logging.DEBUG)
  File "/usr/lib/python2.7/logging/__init__.py", line 1547, in basicConfig
    hdlr = FileHandler(filename, mode)
  File "/usr/lib/python2.7/logging/__init__.py", line 913, in __init__
    StreamHandler.__init__(self, self._open())
  File "/usr/lib/python2.7/logging/__init__.py", line 943, in _open
    stream = open(self.baseFilename, self.mode)
IOError: [Errno 2] No such file or directory: '/home/user/.haros/log.txt'

This is because logger configuration takes place before the init command, but the init command is required to create .haros.

Melodic Updates

Are there currently any plans to support 18.04/Melodic? If so, is there a timeline?

Plugin handling might be done via pip instead of git

During the initial setup operations haros executes git to either clone or update the plugins repository found at https://github.com/git-afsantos/haros_plugins:

haros/haros/haros.py

Lines 406 to 419 in 45b4bbd

if has_plugins:
self.log.info("Updating plugin repository.")
wd = os.getcwd()
os.chdir(self.plugin_dir)
with open(os.devnull, "w") as devnull:
subprocess.check_call(["git", "rev-parse"], stdout = devnull,
stderr = subprocess.STDOUT)
self.log.debug("Executing git pull at %s.", self.plugin_dir)
subprocess.check_call(["git", "pull"])
os.chdir(wd)
else:
self.log.info("Cloning plugin repository.")
subprocess.check_call(["git", "clone",
self.PLUGIN_REPOSITORY, self.plugin_dir])

As this obviously requires git to be installed this causes an issue when using haros from within haros_catkin inside a buildfarm docker container. The docker container of interest is the docker_build_and_test which won't include git by default (cf. rosin-project/haros_catkin#10).

Would it be better to release the plugins in a separate package via pip instead of manually invoking git?

Editable VCS install of pyflwor?

More of a question really: the readme instructs users to install pyflwor using the following command:

pip install -e git+https://github.com/timtadh/pyflwor.git#egg=pyflwor

Is the -e really needed?

Provide a Way to Set Preferences

A configuration/preferences file makes sense at this point. This could be a way to enable/disable plugins by default, providing preferences to plugins, or even suppressing certain metrics and rules.

analysis:
    ignore:
        rules:
            - plugin:rule_id
        files:
            - package:relative/path/to/file
viz:
    host: localhost
    port: 8080
plugins:
    plugin_name:
        whatever: the plugin needs

Issue a warning when rosgraph is missing

rosgraph cannot be declared as a pip requirement. Thus, it is best to make it a lazy import, and issue a warning in case it is not available. Additionally, providing a fallback behaviour would be good.

Use under Windows?

More curious than a serious need, but is there a possibility to use Haros under Windows?

Provided dependencies (like cppcheck) can be run there, are you aware of any blockers in Haros itself?

Declarative bonsai queries

Just wanted to write a reminder for myself to, at some point, change the queries of the model extraction.

Most of this code is nearly duplicate, so I can figure out a way to generalize it and provide the query details via a data file.

[Feature request] Viz - metrics management

Hi,

Nice tool! I think it would be useful in the viz to be able to see all the metrics available and check mark those we want to apply, rather than entering individually in the Igone / Filter by selector

Thx

Binary Static Analysis

Add infrastructure and plugin support for binary static analysis. One of the goals of this analysis would be to extract models from compiled code, when access to the source is not available.

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.