Git Product home page Git Product logo

vsdebugadapterhost's Introduction

Visual Studio Debug Adapter Host

The Visual Studio Debug Adapter Host is a component included in Visual Studio 2017 Update 15.6 or later which allows integration of debug adapters written for Visual Studio Code into Visual Studio.

What is this project?

This project contains sample code demonstrating extension packaging and features of the Debug Adapter Host, as well as tools to make testing debug adapters in Visual Studio easier:

Getting Started

Start with the Wiki, which contains documentation and walkthroughs to help you bring an existing debug adapter into Visual Studio.

If you run into bugs or missing features while integrating a debug adapter with Visual Studio, you can file an Issue or contact the team at [email protected].

Support for other VS Code components

If you're porting an extension that includes a language service as well as a debug adapter, take a look at Visual Studio's support for Language Server Protocol extensions.

Contributing

This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.microsoft.com.

When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA.

This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact [email protected] with any additional questions or comments.

vsdebugadapterhost's People

Contributors

andrewcrawley avatar microsoft-github-policy-service[bot] avatar microsoftopensource avatar msftgits avatar wardengnaw 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

Watchers

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

vsdebugadapterhost's Issues

Output with category="important" is displayed in modal dialogs

This is the specific user issue that we're dealing with in the debug adapter for Python:
microsoft/debugpy#981

The root cause is that the debugger sends a notification about a long-running value computation as an "output" even with "category" set to "important". On other clients that we're aware of, most notably VSCode, this causes a pop-up non-modal notification to appear - this is the desirable behavior from our perspective, because printing it to the debug console was not sufficiently discoverable by the users whenever they hit this issue.

Thus, to accommodate VS without regressing experience for other clients, as things are, we'll have to do clientID sniffing, unless VS also switches to non-modal UI here.

watch doesn't show referenced child variables on the tree view.

Hi.
I'm trying to run Haskell debug adapter on VisualStudio2017.

It starts running same as VSCode,
but there is a problem on watch functionality.
watch doesn't show referenced child variables on the tree view.

VS does not send EvaluateRequest when adding local variable to watch, but VSCode does.
VSCode sends EvaluateRequest with context "watch".

Could you send EvaluateRequest same with VSCode when adding variable to watch ?
Any advice will be appreciated.

Best Regards.

SourceRequest not made when the source name contains a '.'

According to the specification of Source.sourceReference a SourceRequest must be made if the source has a sourceReference > 0:

  /**
   * If sourceReference > 0 the contents of the source must be retrieved through the SourceRequest (even if a path is specified). A sourceReference is only valid for a session, so it must not be used to persist a source. The value should be less than or equal to 2147483647 (2^31 - 1).
   */
  sourceReference?: number;

However, if source.sourceReference > 0 and the source.name contains a ., no SourceRequest is made, and you are presented with the Find File dialog. If the dot is replaced with an underscore, the IDE makes the SourceRequest and the file is shown.

This is especially troublesome as VSCode (and probably VS) will use the file extension to know how to syntax highlight the source.

Visual Studio 2022 unable to connect to remote Linux-Arm

I'm attempting to have Visual Studio 2022 remote connect to my linux-arm over SSH. I'm getting some errors, but I can't seem to determine what is missing on the remote side to resolve. Below are the logs from visual studio, but from what I can see all the command commands issues from visual studio are successful, but it seems to be failing to find the home folder?

When I attach I'm able to run the GetVsDbg script manually, so I'm not too sure what to debug at this point,

`Failure Location: LaunchingProcess
Determining user folder on remote system...
Failed: No such file
Inner Exception:
IOException: No such file

liblinux.IO.RemoteFileSystemImpl.GetPermissions(String remotePath)
liblinux.IO.RemoteFileSystemInfo..ctor(IRemoteFileSystem fs, String remotePath)
liblinux.IO.RemoteFileSystemImpl.GetDirectory(String remotePath)
liblinux.IO.RemoteFileSystemImpl.GetDirectory(SpecialDirectory directory)
Microsoft.SSHDebugPS.SSH.SSHConnection.GetUserHomeDirectory()
Microsoft.VisualStudio.Debugger.VsDbg.Integration.AdapterLauncher.VsDbgRemoteUnixLauncher.Microsoft.VisualStudio.Debugger.DebugAdapterHost.Interfaces.IAdapterLauncher.LaunchAdapter(IAdapterLaunchInfo launchInfo, ITargetHostInterop targetInterop)
Microsoft.VisualStudio.Debugger.VSCodeDebuggerHost.AdapterHosting.DebugAdapterProcessConnection..ctor(ConfigurationWrapper configuration, IDiagnosticLogger log, IAdapterLaunchInfo launchInfo, ITargetHostInterop targetInterop, IAdapterLauncher launcher)
Microsoft.VisualStudio.Debugger.VSCodeDebuggerHost.AdapterHosting.DebugAdapterHostFactory.CreateDebugAdapterHost(ConfigurationWrapper configuration, IDiagnosticLogger log, ExtensibilityManager extensibilityManager, IAdapterLaunchInfo launchInfo, ITargetHostInterop targetInterop, Boolean registerStandardHandlers, DebugProtocolOptions options, Action`1 syncRequestErrorHandler)
Inner Exception:
SftpPathNotFoundException: No such file

Renci.SshNet.Sftp.SftpSession.RequestLStat(String path)
Renci.SshNet.SftpClient.Get(String path)
liblinux.IO.RemoteFileSystemImpl.GetPermissions(String remotePath)

1> ERROR: Failed to launch debug adapter. Additional information may be available in the output window.

No such file

No such file
`

Here is also the Crossplatform log:
1:18:08.3865072 [Info, Thread 140] liblinux.RemoteSystemBase: Connecting over SSH to 192.168.4.130:2222
11:18:08.8195047 [Info, Thread 27] liblinux.Shell.CommonCommandBase: Command "sh -c "id -u -n"" finished with exit code 0 after 102.2694ms
11:18:08.8589404 [Info, Thread 27] liblinux.Shell.CommonCommandBase: Command "sh -c "uname -m"" finished with exit code 0 after 39.0496ms
11:18:08.9225611 [Info, Thread 27] liblinux.Shell.CommonCommandBase: Command "sh -c "ps axww -o pid=pppppppppp -o flags=ffffffff -o ruser=rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr -o args"" finished with exit code 0 after 63.4433ms
11:18:19.4110476 [Info, Thread 88] liblinux.Shell.CommonCommandBase: Command "sh -c "id -u -n"" finished with exit code 0 after 37.5707ms
11:18:19.4494788 [Info, Thread 88] liblinux.Shell.CommonCommandBase: Command "sh -c "uname -m"" finished with exit code 0 after 38.4838ms
11:18:19.5133604 [Info, Thread 88] liblinux.Shell.CommonCommandBase: Command "sh -c "ps axww -o pid=pppppppppp -o flags=ffffffff -o ruser=rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr -o args"" finished with exit code 0 after 62.8721ms
11:18:23.6271048 [Info, Thread 1] liblinux.Shell.CommonCommandBase: Command "sh -c "uname"" finished with exit code 0 after 42.2677ms
11:18:23.6271048 [Info, Thread 1] liblinux.IO.RemoteFileSystemImpl: Connecting over SFTP to 192.168.4.130:2222
11:18:24.1352705 [Info, Thread 1] liblinux.Shell.CommonCommandBase: Command "sh -c "echo $HOME"" finished with exit code 0 after 35.9084ms
11:18:24.1721788 [Info, Thread 1] liblinux.Shell.CommonCommandBase: Command "sh -c "basename '/ftp'"" finished with exit code 0 after 36.2109ms

Should Stack frame ID type be int32 or int64?

The protocol itself uses number, https://microsoft.github.io/debug-adapter-protocol/specification#Types_StackFrame

And Microsoft.VisualStudio.Shared.VsCodeDebugProtocol uses int32, which is what Microsoft implementations like vsdbg match.

However, there are other debuggers that use int64, such as Samsung's .NET Core debugger, Samsung/netcoredbg#19. Microsoft.VisualStudio.Shared.VsCodeDebugProtocol cannot handle the large IDs returned from such debuggers, and simply crash.

Is there a solution out there? Is it possible to change Microsoft.VisualStudio.Shared.VsCodeDebugProtocol to use int64?

Question: Is there a way to set environment variables for the adapter process

In a VS2022 plugin we have built, we are using DebugAdapterHost.Launch() to launch an $adapter that creates a SSH connection to set up vsdbg properly on a remote host. The adapter needs to be started with some environment variables set and we have not been able to figure out how to do this.

Is there an easy way of doing this? Maybe an $env setting that is applied to the process start of the $adapter exe?

Debug Adapter doesn't open properly

When I try to debug my project, the Debug Adapter claims to be launching, but then opens and closes resulting with a popup error claiming "Object reference not set to an instance of an object". Once I close out of it, the debug output in Visual Studio reads "The program 'python.exe' has exited with code -1 (0xffffffff)". I have not been able to find help anywhere on this and need to know if it's something in my code or in my Visual Studio downloads. I am using env(3.7, 64-bit) to run my code.

Debug Adapter Host doesn't properly support adapters that send 'initialized' event before 'launch' request

The debug adapter host currently waits for both the initialize and launch requests to complete before sending breakpoints, exception settings, etc. This causes problems with adapters like Mock Debug, which expect breakpoints to be set before launching, resulting in missed breakpoints and other similar issues.

Adapters which send the initialized event as part of their launch request processing (e.g. node2, vsdbg, etc) are unaffected.

The host should be fixed to work like VS Code, sending breakpoints and other configuration information as soon as the initialized event is received, rather than waiting until after the launch request has been processed.

mouse hover doesn't show hint.

Hello.
I'm trying to run Haskell debug adapter on VisualStudio2017.

Does VS have a functionality that shows type, value or any hint by mouse hover?
VSCode does. It sends evalute request with hover and show the result on the UI.

I checked request log from VSDebugAdapterHost in the debug adapter's log, but no evaluate request was arrived.

Any advice will be appreciated.
Best Regards.

Getting Error of "Failed to launch debug adapter 'App'. No such host is known" when running wiki test.

I'm trying to host an existing VSCode extension, that talks to an IoT device inside VS2019 or VS for Mac and I'm getting the error mentioned in the subject line.

The VSCode extension is able to set breakpoints and debug apps running on the device (a Meadow F7 Micro) if I run it from VS Code itself, but when I run the test mentioned on your wiki, in VS2019, the error above appears.

Now on Windows the IoT device is connected via USB and appears on COM5. So I'm assuming that I should have
"$debugServer": "COM5",
in my launch.json? Is that correct?

What else is required for this scenario to work?

My full launch.json looks like this...
`{
"$debugServer": "COM5",
"$adapter": "C:\[Path to VS Code exe]\vscode-meadow.exe",

"type": "App",
"request": "launch",
"program": "C:\\[Path to Source File]\\MeadowApp.cs"

}`

Visual Studio doesn't follow spec for Scope.presentationHint

Unlike a bunch of other fields with the name presentationHint, Scope.presentationHint is an optional string, and is not a PresentationHintValue.

This WARNING suggests the Visual Studio implementation has got this field type wrong:

 1> [DebugAdapter] --> C (scopes-681): {"command":"scopes","arguments":{"frameId":28383},"seq":681,"type":"request"}
 1> [DebugAdapter] <--   R (scopes-681) [0 ms]: {"body":{"scopes":[{"expensive":false,"name":"globals","presentationHint":"globals","source":{"name":"shader","sourceReference":12},"variablesReference":1655556},{"expensive":false,"name":"locals","presentationHint":"locals","source":{"name":"shader","sourceReference":12},"variablesReference":1655580},{"expensive":false,"name":"arguments","presentationHint":"arguments","source":{"name":"shader","sourceReference":12},"variablesReference":1655552},{"expensive":false,"name":"registers","presentationHint":"registers","source":{"name":"shader","sourceReference":12},"variablesReference":1655589}]},"command":"scopes","request_seq":681,"seq":743,"success":true,"type":"response"}
 1> WARNING: Value 'globals' is not valid for field of type 'PresentationHintValue'.

PS: While the ship may have already sailed, have you considered code-generating the underlying VS DAP encoder / decoder from the .json file? I've knocked together a simple golang script to generate a C++ DAP protocol defintion file.

Visual Studio doesn't respect optional on StoppedEvent.threadID

Apologies if this is not the correct place to file this issue. If it is the wrong place, please let me know where I should re-file this.

According to the DAP specification the Stopped event's threadId field is optional. It would seem that threadId is unnecessary when allThreadsStopped is specified.

However, a message using allThreadsStopped and with no threadId causes an InvalidOperationException:

 1> [DebugAdapter] <--   E (stopped): {"body":{"allThreadsStopped":true,"reason":"pause"},"event":"stopped","seq":8,"type":"event"}
 1> ERROR: InvalidOperationException: Stopped event missing ThreadId field!

 1> WARNING: Stopping due to fatal error: InvalidOperationException: Stopped event missing ThreadId field!
 1> ERROR: Unexpected error

Visual Studio version:

Microsoft Visual Studio Community 2019
Version 16.2.1
VisualStudio.16.Release/16.2.1+29201.188
Microsoft .NET Framework
Version 4.8.03752

Empty string `moduleId` causes InvalidOperationException

We tried to use a Debug Adapter written for VSCode along with VS. We see that the brakpoint is hit but VS crashes when reading the response for stackTrace request. Below are the details.

P.S. The same response is succesfully parsed by VSCode.

Am I missing something? ANy setting that we need to do first?

1> [DebugAdapter] --> C (stackTrace-7): {"type":"request","command":"stackTrace","arguments":{"threadId":6758,"startFrame":0,"levels":1},"seq":7}
1> [DebugAdapter] <-- R (stackTrace-7) [105 ms]: {"type":"response","request_seq":7,"success":true,"command":"stackTrace","body":{"stackFrames":[{"column":13,"endColumn":29,"endLine":11,"id":0,"line":11,"moduleId":"478591e3-c030-4fb3-9f3d-792271a49de0","name":"NUITemplate1.Program.OnCreate()","source":{"name":"NUITemplate1.cs","path":"C:\Users\a.aswani\source\repos\NUITemplate1\NUITemplate1\NUITemplate1.cs"}}],"totalFrames":10},"seq":28}
1> [DebugAdapter] --> C (stackTrace-8): {"type":"request","command":"stackTrace","arguments":{"threadId":6758,"startFrame":0,"levels":1000},"seq":8}
1> [DebugAdapter] <-- R (stackTrace-8) [56 ms]: {"type":"response","request_seq":8,"success":true,"command":"stackTrace","body":{"stackFrames":[{"column":13,"endColumn":29,"endLine":11,"id":0,"line":11,"moduleId":"478591e3-c030-4fb3-9f3d-792271a49de0","name":"NUITemplate1.Program.OnCreate()","source":{"name":"NUITemplate1.cs","path":"C:\Users\a.aswani\source\repos\NUITemplate1\NUITemplate1\NUITemplate1.cs"}},{"column":0,"endColumn":0,"endLine":0,"id":1,"line":0,"moduleId":"","name":"[External Code]"},{"column":0,"endColumn":0,"endLine":0,"id":2,"line":0,"moduleId":"","name":"[External Code]"},{"column":0,"endColumn":0,"endLine":0,"id":3,"line":0,"moduleId":"","name":"[Native Frame]"},{"column":0,"endColumn":0,"endLine":0,"id":4,"line":0,"moduleId":"","name":"[Native Frame]"},{"column":0,"endColumn":0,"endLine":0,"id":5,"line":0,"moduleId":"","name":"[External Code]"},{"column":0,"endColumn":0,"endLine":0,"id":6,"line":0,"moduleId":"","name":"[External Code]"},{"column":0,"endColumn":0,"endLine":0,"id":7,"line":0,"moduleId":"","name":"[External Code]"},{"column":0,"endColumn":0,"endLine":0,"id":8,"line":0,"moduleId":"","name":"[External Code]"},{"column":13,"endColumn":27,"endLine":46,"id":9,"line":46,"moduleId":"478591e3-c030-4fb3-9f3d-792271a49de0","name":"NUITemplate1.Program.Main()","source":{"name":"NUITemplate1.cs","path":"C:\Users\a.aswani\source\repos\NUITemplate1\NUITemplate1\NUITemplate1.cs"}}],"totalFrames":10},"seq":29}
1> ERROR: InvalidOperationException: Unable to locate module with id ''!

1> ERROR: Unexpected error

AggregateException: One or more errors occurred.

System.Threading.Tasks.Task1.GetResultCore(Boolean waitCompletionNotification) Microsoft.VisualStudio.Debugger.VSCodeDebuggerHost.Utilities.TaskExtensions.CancellableWaitCore[TResult](Task task, Func1 getResultFunc, TResult onCancelResult, IDebuggedProcess process, WaitErrorHandlingMode errorMode)

Aggregate exception:
InvalidOperationException: Unable to locate module with id ''!
Inner Exception:
InvalidOperationException: Unable to locate module with id ''!

Microsoft.VisualStudio.Debugger.VSCodeDebuggerHost.Engine.Implementation.ModuleManager.GetModuleById(Object id)
Microsoft.VisualStudio.Debugger.VSCodeDebuggerHost.AD7.Implementation.AD7StackFrame.ConstructFrameInfo(Nullable1 showInHex, enum_FRAMEINFO_FLAGS dwFieldSpec) System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext()
System.Linq.Buffer1..ctor(IEnumerable1 source)
System.Linq.Enumerable.ToArray[TSource](IEnumerable1 source) Microsoft.VisualStudio.Debugger.VSCodeDebuggerHost.Utilities.TaskExtensions.ContinueWhenAll[TResult](IEnumerable1 antecedents, CancellationToken cancellationToken)
Microsoft.VisualStudio.Debugger.VSCodeDebuggerHost.AD7.Implementation.AD7Thread.<>c__DisplayClass6_0.<Microsoft.VisualStudio.Debugger.Interop.IDebugThread2.EnumFrameInfo>b__0(IReadOnlyCollection1 frames) Microsoft.VisualStudio.Debugger.VSCodeDebuggerHost.Utilities.TaskExtensions.<>c__DisplayClass8_02.b__2(TResult result)

Convert to Open-Source repository

I believe this project and its users would greatly benefit from it being open source.

When developing a debug adapter, I encountered some opaque errors, and occasional missing features that could be easily addressed (and contributed back) if the source code was available.

There was some discussion in previous Issues, but this Issue could serve as the place for continued discussion.

Contact email rejected

Hi, the contact email in the Readme file [email protected] rejected my msg with this advisory:

Office 365
Your message to [email protected] couldn't be delivered.
The group pinezorro only accepts messages from people in its organization or on its allowed senders list, and your email address isn't on the list.

Can you provide an alternate?

Getting IDE deadlocks

If the target executable of a "normal" VS 2k22 debug session also contains a debug adapter in the process, then a connection to the debug adapter (via DebugAdapterHost.Launch) using the same IDE instance will deadlock. Works ok from another IDE instance. Probably need to talk to someone to explain the situation.

Support for "compounds"?

Hello,

I'm currently evaluating suitability of DAP as method for implementing "mixed-mode" debugging - i.e. the ability to combine multiple debugger end points into a single debug session.
An example usage of this would be the ability to attach to a regular C++ debugger along with another DAP end-point that provides a script interpreter debugger. Ideally, we'd be able to set breakpoints in both C++ and the script source and hop between both in a seamless way.

VSCode supports compound launch configurations which provides one way to achieve this. However, as far as I can tell VS does not support this (nor any other IDE).

I'm fairly new to all of this, but my understanding so far is that the VS's DAP implementation is built in 3-tiers:

  1. The Microsoft.VisualStudio.Shared.VsCodeDebugProtocol
    This contains the Visual Studio debug engine integration and the DAP serialization code. Closed source?

  2. The EngineLauncher VS extension
    Part of this open source repo.
    Talks to the Visual Studio Debug Adapter Host via the magic DebugAdapterHostPackageCmdSet GUID.
    Implements a UI in VS to pick the debug adapter to launch.

  3. The Debug Adapter implementations.
    These are the debugger executables that talk DAP.

Is that right?

I'm completely spitballing here, but off the top of my head, these are the ways I've considered solving this:

(a) I could implement a new debug adapter that wraps two or more downstream debug adapters.

compound-dbg

This rather makes the assumption that the C++ debugger talks DAP, and isn't the native VS debugger (which I assume predates DAP, and talks directly to the IDE).

The existing EngineLauncher UI isn't ideal for this, but I've already seen it is possible to replace parts 2. and 3. of the stack so a custom interface can be developed.

(b) The Microsoft.VisualStudio.Shared.VsCodeDebugProtocol is extended to support compound DAP sessions, much like VSCode.

As I haven't seen the source to this package†, I have no idea how much work this would be.

Like (a) this approach clearly will not work with non-DAP debuggers.

(c) A new Visual Studio Debug Engine is developed to wrap two or more debug engines.

Similar to (a), but the multiplexing is done lower down the stack. I have no idea whether this would work, and if it is possible, how much work it would be. I'm guessing it would be very difficult if not impossible to implement without the source to VsCodeDebugProtocol, or reimplementing the DAP debug engine.
I also have no idea if this approach would allow you to wrap the default VS C++ debugger.

Have you had any thoughts on this? Do you have any recommendations or suggestions?

Many thanks,
Ben


† If the VsCodeDebugProtocol package is closed source, are there any plans to open source it?

"EngineGuid" argument for DebugAdapterHost.Launch

Visual Studio 15.5.7
In EngineLauncher there are using

https://github.com/Microsoft/VSDebugAdapterHost/blob/9b1a0c67a66c4b5792dae8b96a17f05cc70a266a/src/tools/EngineLauncher/LaunchEngineCommand.cs#L89

parameter for "DebugAdapterHost.Launch" which causes error.
>DebugAdapterHost.Launch /LaunchJson:"C:\Users\Andrei\launch.json" /EngineGuid:"facadeaa-dd82-4f36-92c4-e0d9615f0eb6"
"/EngineGuid" is not a valid switch for this command.

VS offers only /LaunchJson and /ConfigurationName as parameters.


Two unrelated questions:
1)Is there a way to launch DebugAdapterHost without passing a path to json, but rather just with arguments?
2)How exactly to specify in launch.json to use DE with specific GUID?

Using the Sample Debug Adapter with VS Code

Hello,

could you clarify whether it is possible to use the Sample Debug Adapter with VS Code instead of VS? Please share your tips on writing the corresponding VS Code extension if it is possible.

--
Thanks Elias.

Question: Does VSCode actually use/support supportsValueFormattingOptions

I see it in the protocol and documented in detail here

But I have no evidence of it (only tried variables-request) being used/supplied in my Debug-Adapter. I searched VSCode source code and did not find any references to supportsValueFormattingOptions. I have requests for supporting it for our debugger but I don't think it is possible. Am I wrong?

I apologize if I posted it in the wrong repo.

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.