GithubHelp home page GithubHelp logo

device-virtual-go's Introduction

Device Virtual Go

Build Status Code Coverage Code Coverage Go Report Card GitHub Latest Dev Tag) GitHub Latest Stable Tag) GitHub License GitHub go.mod Go version GitHub Pull Requests GitHub Contributors GitHub Committers GitHub Commit Activity

Warning
The main branch of this repository contains work-in-progress development code for the upcoming release, and is not guaranteed to be stable or working. It is only compatible with the main branch of edgex-compose which uses the Docker images built from the main branch of this repo and other repos.

The source for the latest release can be found at Releases.

Overview

The virtual device service simulates different kinds of devices to generate events and readings to the core data micro service, and users send commands and get responses through the command and control micro service. These features of the virtual device services are useful when executing functional or performance tests without having any real devices.

Usage

Users can refer to the document to learn how to use this device service.

Build with NATS Messaging

Currently, the NATS Messaging capability (NATS MessageBus) is opt-in at build time. This means that the published Docker image does not include the NATS messaging capability.

The following make commands will build the local binary or local Docker image with NATS messaging capability included.

make build-nats
make docker-nats

The locally built Docker image can then be used in place of the published Docker image in your compose file. See Compose Builder nat-bus option to generate compose file for NATS and local dev images.

Community

License

Apache-2.0

device-virtual-go's People

Contributors

bnevis-i avatar cloudxxx8 avatar dependabot[bot] avatar dovholuknf avatar eaton-coreymutter avatar ejlee3 avatar ernestojeda avatar farshidtz avatar felixting avatar iain-anderson avatar jackchenjc avatar jamesrgregg avatar jim-wang-intel avatar jinlinguan avatar jpwhitemn avatar jumpingliu avatar lenny-goodell avatar milj19lf avatar monicaisher avatar rsdmike avatar soda480 avatar steveoss avatar tmpowers avatar tonyespy avatar tsconn23 avatar venkata-lakshmi-penna avatar venkata-subbareddyk avatar vli11 avatar weichou1229 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

Watchers

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

device-virtual-go's Issues

[master] device-virtual can't establish dependencies, so exits

When I start the latest version of device-virtual using the latest nightly-build secure redis compose file from developer scripts (9917225), device-virtual isn't able to establish that it's dependencies are all available, so it ends up exiting too soon. Here are the error messages from device-virtual:


level=INFO ts=2020-04-27T19:59:37.319865202Z app=device-virtual source=config.go:167 msg="Using Configuration provider (consul) from: http://edgex-core-consul:8500 with base path of edgex/core/1.0/device-virtual"
level=INFO ts=2020-04-27T19:59:37.655741655Z app=device-virtual source=config.go:321 msg="Configuration has been pushed to into Configuration Provider (4 environment overrides applied)"
level=ERROR ts=2020-04-27T19:59:37.655796824Z app=device-virtual source=logger.go:74 msg="logTarget cannot be blank, using stdout only"
level=INFO ts=2020-04-27T19:59:37.655820855Z app=device-virtual source=registry.go:79 msg="Using Registry (consul) from http://edgex-core-consul:8500"
level=INFO ts=2020-04-27T19:59:37.657845109Z app=device-virtual source=config.go:308 msg="Writeable configuration has been updated from the Configuration Provider"
level=INFO ts=2020-04-27T19:59:37.683310173Z app=device-virtual source=httpserver.go:89 msg="Web server starting (edgex-device-virtual:49990)"
level=INFO ts=2020-04-27T19:59:37.683397897Z app=device-virtual source=init.go:134 msg="Check Metadata service's status via Registry..."
level=INFO ts=2020-04-27T19:59:37.683563701Z app=device-virtual source=init.go:134 msg="Check Data service's status via Registry..."
level=ERROR ts=2020-04-27T19:59:37.691071809Z app=device-virtual source=init.go:149 msg=" edgex-core-metadata service not healthy..."
level=ERROR ts=2020-04-27T19:59:37.691752714Z app=device-virtual source=init.go:149 msg=" edgex-core-data service not healthy..."
level=INFO ts=2020-04-27T19:59:42.691285096Z app=device-virtual source=init.go:134 msg="Check Metadata service's status via Registry..."
level=INFO ts=2020-04-27T19:59:42.692249427Z app=device-virtual source=init.go:134 msg="Check Data service's status via Registry..."
level=ERROR ts=2020-04-27T19:59:42.695427229Z app=device-virtual source=init.go:149 msg=" edgex-core-metadata service not healthy..."
level=ERROR ts=2020-04-27T19:59:42.695441581Z app=device-virtual source=init.go:149 msg=" edgex-core-data service not healthy..."
level=INFO ts=2020-04-27T19:59:47.69568228Z app=device-virtual source=init.go:134 msg="Check Data service's status via Registry..."
level=INFO ts=2020-04-27T19:59:47.695737231Z app=device-virtual source=init.go:134 msg="Check Metadata service's status via Registry..."
level=ERROR ts=2020-04-27T19:59:47.700990187Z app=device-virtual source=init.go:149 msg=" edgex-core-data service not healthy..."
level=ERROR ts=2020-04-27T19:59:47.70149438Z app=device-virtual source=init.go:149 msg=" edgex-core-metadata service not healthy..."
level=ERROR ts=2020-04-27T19:59:52.701482197Z app=device-virtual source=init.go:112 msg="service dependency Data checking time out"
error: checking required dependencied services failed
level=ERROR ts=2020-04-27T19:59:52.701787696Z app=device-virtual source=init.go:112 msg="service dependency Metadata checking time out"
level=INFO ts=2020-04-27T19:59:52.701977043Z app=device-virtual source=httpserver.go:106 msg="Web server shutting down"
level=INFO ts=2020-04-27T19:59:52.702088699Z app=device-virtual source=httpserver.go:108 msg="Web server shut down"
level=INFO ts=2020-04-27T19:59:52.702118712Z app=device-virtual source=httpserver.go:97 msg="Web server stopped"
level=INFO ts=2020-04-27T19:59:52.702144156Z app=device-virtual source=bootstrap.go:130 msg="Un-Registering service from the Registry"

Binary Autoevents should be disabled by default

The default configuration file for device-virtual includes a device and AutoEvent definition for binary data with a 30s timer. This can lead to severe congestion core-data congestion rather quickly. I would suggest that the AutoEvent for binary data is disabled by default:


[[DeviceList]]
  Name = 'Random-Binary-Device'
  Profile = 'Random-Binary-Device'
  Description = 'Example of Device Virtual'
  Labels = [ 'device-virtual-example' ]
  [DeviceList.Protocols]
    [DeviceList.Protocols.other]
      Address = 'device-virtual-bool-01'
      Port = '300'
  [[DeviceList.AutoEvents]]
    Frequency = '30s'
    OnChange = false
    Resource = 'Binary'

This bug is being reported against the latest master in device-virtual-go, and behavior seen using this code in the latest snap built against edgex-go master.

[master] device-virtual can't find device profiles, then crashes

While debugging kuiper in the snap, I wanted to poke at the kuiper docker deployment, so I started up the nightly build (docker-compose-nexus-redis-no-secty.yml).

When device-virtual finally starts, it logs the following errors when trying to read device profiles from core-metadata:


edgex-device-virtual | level=INFO ts=22:02:20 app=device-virtual source=service.go:80 msg="Device Service device-virtual doesn't exist, creating a new one"
edgex-core-metadata  | level=ERROR ts=22:02:20 app=edgex-core-metadata source=handler.go:47 msg="Item not found"
edgex-device-virtual | level=INFO ts=22:02:20 app=device-virtual source=service.go:137 msg="Addressable device-virtual doesn't exist, creating a new one"
edgex-device-virtual | level=INFO ts=22:02:20 app=device-virtual source=autodiscovery.go:19 msg="AutoDiscovery stopped: disabled by configuration"
edgex-device-virtual | level=ERROR ts=22:02:20 app=device-virtual source=profiles.go:162 msg="Error when getting configuration from Core Metadata: 404 - 404 page not found\n "
edgex-device-virtual | level=ERROR ts=22:02:20 app=device-virtual source=profiles.go:162 msg="Error when getting configuration from Core Metadata: 404 - 404 page not found\n "
edgex-device-virtual | level=ERROR ts=22:02:20 app=device-virtual source=profiles.go:162 msg="Error when getting configuration from Core Metadata: 404 - 404 page not found\n "
edgex-device-virtual | level=ERROR ts=22:02:20 app=device-virtual source=profiles.go:162 msg="Error when getting configuration from Core Metadata: 404 - 404 page not found\n "
edgex-device-virtual | level=ERROR ts=22:02:20 app=device-virtual source=profiles.go:162 msg="Error when getting configuration from Core Metadata: 404 - 404 page not found\n "

I also went ahead and followed the kuiper tutorial here:

https://github.com/emqx/kuiper/blob/master/docs/en_US/edgex/edgex_rule_engine_tutorial.md

which seemed to work, although I didn't see any results when I queried the mqtt broker like this (see the section Monitor analysis result):

mosquitto_sub -h broker.emqx.io -t result
Same thing with the client command listed under the same section. I went back to check the docker console output again, and I noticed that device-service-virtual had actually crashed:

edgex-device-virtual | level=INFO app=device-virtual source=device.go:52 msg="Added device 78ef4914-740e-4329-9633-5984e97b444e"
edgex-device-virtual | 2020/04/21 22:02:20 http: panic serving 172.21.0.8:60370: runtime error: invalid memory address or nil pointer dereference
edgex-device-virtual | goroutine 449 [running]:
edgex-device-virtual | net/http.(*conn).serve.func1(0xc00050c000)
edgex-device-virtual | 	/usr/local/go/src/net/http/server.go:1767 +0x139
edgex-device-virtual | panic(0x9aea40, 0xeb2250)
edgex-device-virtual | 	/usr/local/go/src/runtime/panic.go:679 +0x1b2
edgex-device-virtual | github.com/edgexfoundry/device-sdk-go/internal/autoevent.(*manager).StopForDevice(0x0, 0xc0000aa820, 0x15)
edgex-device-virtual | 	/go/pkg/mod/github.com/edgexfoundry/[email protected]/internal/autoevent/manager.go:94 +0x43
edgex-device-virtual | github.com/edgexfoundry/device-sdk-go/internal/autoevent.(*manager).RestartForDevice(0x0, 0xc0000aa820, 0x15)
edgex-device-virtual | 	/go/pkg/mod/github.com/edgexfoundry/[email protected]/internal/autoevent/manager.go:79 +0x5d
edgex-device-virtual | github.com/edgexfoundry/device-sdk-go/internal/handler/callback.handleDevice(0xc00050a040, 0x4, 0xc0000262a0, 0x24, 0x9a5940, 0xc0001f6080)
edgex-device-virtual | 	/go/pkg/mod/github.com/edgexfoundry/[email protected]/internal/handler/callback/device.go:69 +0x193c
edgex-device-virtual | github.com/edgexfoundry/device-sdk-go/internal/handler/callback.CallbackHandler(0xc0001e84c8, 0x6, 0xc0000262a0, 0x24, 0xc00050a040, 0x4, 0x10, 0xc0002c2878)
edgex-device-virtual | 	/go/pkg/mod/github.com/edgexfoundry/[email protected]/internal/handler/callback/general.go:25 +0x3af
edgex-device-virtual | github.com/edgexfoundry/device-sdk-go/internal/controller.callbackFunc(0xb39880, 0xc0000d41c0, 0xc0003e4b00)
edgex-device-virtual | 	/go/pkg/mod/github.com/edgexfoundry/[email protected]/internal/controller/restfuncs.go:101 +0x2cd
edgex-device-virtual | net/http.HandlerFunc.ServeHTTP(0xa858c0, 0xb39880, 0xc0000d41c0, 0xc0003e4b00)
edgex-device-virtual | 	/usr/local/go/src/net/http/server.go:2007 +0x44
edgex-device-virtual | github.com/edgexfoundry/device-sdk-go/internal/controller/correlation.OnRequestBegin.func1(0xb39880, 0xc0000d41c0, 0xc0003e4b00)
edgex-device-virtual | 	/go/pkg/mod/github.com/edgexfoundry/[email protected]/internal/controller/correlation/middleware.go:48 +0xdd
edgex-device-virtual | net/http.HandlerFunc.ServeHTTP(0xc0001f6020, 0xb39880, 0xc0000d41c0, 0xc0003e4b00)
edgex-device-virtual | 	/usr/local/go/src/net/http/server.go:2007 +0x44
edgex-device-virtual | github.com/edgexfoundry/device-sdk-go/internal/controller/correlation.OnResponseComplete.func1(0xb39880, 0xc0000d41c0, 0xc0003e4b00)
edgex-device-virtual | 	/go/pkg/mod/github.com/edgexfoundry/[email protected]/internal/controller/correlation/middleware.go:34 +0xa1
edgex-device-virtual | net/http.HandlerFunc.ServeHTTP(0xc0001f6040, 0xb39880, 0xc0000d41c0, 0xc0003e4b00)
edgex-device-virtual | 	/usr/local/go/src/net/http/server.go:2007 +0x44
edgex-device-virtual | github.com/edgexfoundry/device-sdk-go/internal/controller/correlation.ManageHeader.func1(0xb39880, 0xc0000d41c0, 0xc0003e4a00)
edgex-device-virtual | 	/go/pkg/mod/github.com/edgexfoundry/[email protected]/internal/controller/correlation/middleware.go:27 +0x1e7
edgex-device-virtual | net/http.HandlerFunc.ServeHTTP(0xc0001f6060, 0xb39880, 0xc0000d41c0, 0xc0003e4a00)
edgex-device-virtual | 	/usr/local/go/src/net/http/server.go:2007 +0x44
edgex-device-virtual | github.com/gorilla/mux.(*Router).ServeHTTP(0xc000142540, 0xb39880, 0xc0000d41c0, 0xc0003e4500)
edgex-device-virtual | 	/go/pkg/mod/github.com/gorilla/[email protected]/mux.go:212 +0xe2
edgex-device-virtual | net/http.serverHandler.ServeHTTP(0xc0000d40e0, 0xb39880, 0xc0000d41c0, 0xc0003e4500)
edgex-device-virtual | 	/usr/local/go/src/net/http/server.go:2802 +0xa4
edgex-device-virtual | net/http.(*conn).serve(0xc00050c000, 0xb3af80, 0xc00013a100)
edgex-device-virtual | 	/usr/local/go/src/net/http/server.go:1890 +0x875
edgex-device-virtual | created by net/http.(*Server).Serve
edgex-device-virtual | 	/usr/local/go/src/net/http/server.go:2928 +0x384



Core-Data: media type must be specified for binary values

  1. download nightly build compose file
    docker-compose -f docker-compose-nexus-redis-no-secty.yml up -d
  2. curl -X GET http://localhost:48080/api/v1/reading

Got the following error in core-data log:

level=ERROR ts=2020-03-17T07:38:31.657394Z app=edgex-core-data source=reading.go:37 msg="media type must be specified for binary values"
level=ERROR ts=2020-03-17T07:38:31.6595081Z app=edgex-core-data source=handler.go:47 msg="media type must be specified for binary values"

Readings should be timestamped in nanoseconds

According to the architecture decision in face to face meeting, we would use nanoseconds in Events and Readings to get more accuracy.
The origin field of reading is input by the specific Device Service protocol driver.

Upgrade to the latest SDK

Upgrade to the latest SDK, and apply the appropriate changes

  • use go-mod-bootstrap
  • remove configuration in docker folder
  • deprecate logging service
  • modify Dockerfile
  • add mediaType into binary profile

[master] device-virtual fails at startup due to device creation failure

The main edgex snap (edgexfoundry) includes device-virtual as it's useful for developers/users learning their way around EdgeX. This service is disabled by default.

When I enable device-virtual (sudo snap set edgexfoundry device-virtual=on), the service starts, however it fails creating Random-Binary-Device, which causes the service to terminate.

I rebuilt the snap this morning with all of my in-progress patches re-based on edgex-go latest master (6d40726) and device-virtual latest master (b102ac6).

I haven't tried to reproduce this with docker, but will do so next...

Here's the relevant log output:

Started Service for snap application edgexfoundry.device-virtual.
INFO msg="Loaded configuration from /var/snap/edgexfoundry/x1/config/device-virtual/res/configuration.toml"
INFO msg="Environment override of 'Device.ProfilesDir' by environment variable: Device_ProfilesDir=/var/snap/edgexfoundry/x1/config/device-virtual/res"
INFO msg="Config Provider URL created from -r/-registry=<url> flag"
INFO msg="Using Configuration provider (consul) from: http://localhost:8500 with base path of edgex/core/1.0/device-virtual"
INFO msg="Configuration has been pushed to into Configuration Provider (1 environment overrides applied)"
ERROR msg="logTarget cannot be blank, using stdout only"
INFO msg="Using Registry (consul) from http://localhost:8500"
INFO msg="Writeable configuration has been updated from the Configuration Provider"
INFO msg="Web server starting (localhost:49990)"
INFO msg="Check Metadata service's status via Registry..."
INFO msg="Check Data service's status via Registry..."
INFO msg="Service clients initialize successful."
ERROR msg="no item found for supplied key: device-virtual"
INFO msg="Device Service device-virtual doesn't exist, creating a new one"
INFO msg="Addressable device-virtual doesn't exist, creating a new one"
ERROR msg="Device Profile Random-Binary-Device doesn't exist for Device Random-Binary-Device"
ERROR msg="creating Device from config failed: Random-Binary-Device"
Failed to create the pre-defined Devices: Device Profile Random-Binary-Device doesn't exist for Device Random-Binary-Device
INFO msg="Web server shutting down"
INFO msg="Web server shut down"
INFO Msg="Web server stopped"
INFO msg="Un-Registering service from the Registry"


Unclean shutdown if required services are not healthy

While bringing up stack with docker-compose-nexus-redis.yml

docker logs -f edgex-device-virtual
level=INFO ts=2020-04-21T21:42:08.643919837Z app=device-virtual source=config.go:219 msg="Loaded configuration from /res/configuration.toml"
level=INFO ts=2020-04-21T21:42:08.644518414Z app=device-virtual source=environment.go:264 msg="Environment override of 'Clients.Metadata.Host' by environment variable: Clients_Metadata_Host=edgex-core-metadata"
level=INFO ts=2020-04-21T21:42:08.644537556Z app=device-virtual source=environment.go:264 msg="Environment override of 'Registry.Host' by environment variable: Registry_Host=edgex-core-consul"
level=INFO ts=2020-04-21T21:42:08.64454924Z app=device-virtual source=environment.go:264 msg="Environment override of 'Service.Host' by environment variable: Service_Host=edgex-device-virtual"
level=INFO ts=2020-04-21T21:42:08.644555199Z app=device-virtual source=environment.go:264 msg="Environment override of 'Clients.Logging.Host' by environment variable: Clients_Logging_Host=edgex-support-logging"
level=INFO ts=2020-04-21T21:42:08.644715262Z app=device-virtual source=config.go:167 msg="Using Configuration provider (consul) from: http://edgex-core-consul:8500 with base path of edgex/core/1.0/device-virtual"
level=INFO ts=2020-04-21T21:42:09.60539983Z app=device-virtual source=config.go:321 msg="Configuration has been pushed to into Configuration Provider (4 environment overrides applied)"
level=ERROR ts=2020-04-21T21:42:09.605510952Z app=device-virtual source=logger.go:74 msg="logTarget cannot be blank, using stdout only"
level=INFO ts=2020-04-21T21:42:09.605550586Z app=device-virtual source=registry.go:79 msg="Using Registry (consul) from http://edgex-core-consul:8500"
level=INFO ts=2020-04-21T21:42:09.606398784Z app=device-virtual source=config.go:308 msg="Writeable configuration has been updated from the Configuration Provider"
level=INFO ts=2020-04-21T21:42:09.639755651Z app=device-virtual source=httpserver.go:89 msg="Web server starting (edgex-device-virtual:49990)"
level=INFO ts=2020-04-21T21:42:09.639863359Z app=device-virtual source=init.go:134 msg="Check Metadata service's status via Registry..."
level=INFO ts=2020-04-21T21:42:09.640031109Z app=device-virtual source=init.go:134 msg="Check Data service's status via Registry..."
level=ERROR ts=2020-04-21T21:42:09.643088524Z app=device-virtual source=init.go:149 msg=" edgex-core-metadata service not healthy..."
level=ERROR ts=2020-04-21T21:42:09.643133383Z app=device-virtual source=init.go:149 msg=" edgex-core-data service not healthy..."
level=INFO ts=2020-04-21T21:42:14.643529931Z app=device-virtual source=init.go:134 msg="Check Data service's status via Registry..."
level=INFO ts=2020-04-21T21:42:14.643692179Z app=device-virtual source=init.go:134 msg="Check Metadata service's status via Registry..."
level=ERROR ts=2020-04-21T21:42:14.646774235Z app=device-virtual source=init.go:149 msg=" edgex-core-metadata service not healthy..."
level=ERROR ts=2020-04-21T21:42:14.647093712Z app=device-virtual source=init.go:149 msg=" edgex-core-data service not healthy..."
level=INFO ts=2020-04-21T21:42:19.647325747Z app=device-virtual source=init.go:134 msg="Check Data service's status via Registry..."
level=INFO ts=2020-04-21T21:42:19.647336809Z app=device-virtual source=init.go:134 msg="Check Metadata service's status via Registry..."
level=ERROR ts=2020-04-21T21:42:19.650459979Z app=device-virtual source=init.go:149 msg=" edgex-core-metadata service not healthy..."
level=ERROR ts=2020-04-21T21:42:24.651046495Z app=device-virtual source=init.go:112 msg="service dependency Metadata checking time out"
level=INFO ts=2020-04-21T21:42:24.651187559Z app=device-virtual source=httpserver.go:106 msg="Web server shutting down"
error: checking required dependencied services failed 
level=INFO ts=2020-04-21T21:42:24.65125467Z app=device-virtual source=httpserver.go:108 msg="Web server shut down"
level=INFO ts=2020-04-21T21:42:24.651267689Z app=device-virtual source=httpserver.go:97 msg="Web server stopped"
level=INFO ts=2020-04-21T21:42:24.651376688Z app=device-virtual source=bootstrap.go:130 msg="Un-Registering service from the Registry"
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x28 pc=0x92e2d9]

goroutine 1 [running]:
github.com/edgexfoundry/device-virtual-go/internal/driver.(*VirtualDriver).Stop(0xc0000945f0, 0xc000561f00, 0x1, 0xc0001348f0)
	/go/src/github.com/edgexfoundry/device-virtual-go/internal/driver/virtualdriver.go:156 +0x29
github.com/edgexfoundry/device-sdk-go/pkg/service.(*Service).Stop(0xc000116600, 0xc000117000)
	/go/pkg/mod/github.com/edgexfoundry/[email protected]/pkg/service/service.go:67 +0x3e
github.com/edgexfoundry/device-sdk-go/pkg/service.Main(0xa5bb7b, 0xe, 0xb21d20, 0xb, 0xa02d60, 0xc0000945f0, 0xb3af80, 0xc000117080, 0xc0000e4fc0, 0xc00011e540, ...)
	/go/pkg/mod/github.com/edgexfoundry/[email protected]/pkg/service/main.go:81 +0x6f0
github.com/edgexfoundry/device-sdk-go/pkg/startup.Bootstrap(0xa5bb7b, 0xe, 0xb21d20, 0xb, 0xa02d60, 0xc0000945f0)
	/go/pkg/mod/github.com/edgexfoundry/[email protected]/pkg/startup/bootstrap.go:19 +0x112
main.main()
	/go/src/github.com/edgexfoundry/device-virtual-go/cmd/main.go:21 +0x6f

Remove --registry from Dockerfile

According to change of edgexfoundry/device-sdk-go#274, once updating the device-sdk-go the latest version in go.mod, --registry has to include the registry URL.
Thus, all the Device Services should not include --registry in the command line. It is consistent with the C Device Services.

driver package should be internal only

NewVirtualDeviceDriver() is supposed the only way to create VirtualDriver struct, but users can new VirtualDriver struct on their own, so the whole package should be internal only.
Please refer to device-modbus-go

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.