mainflux / ui Goto Github PK
View Code? Open in Web Editor NEWUI for Mainflux IoT platform
License: MIT License
UI for Mainflux IoT platform
License: MIT License
Currently when we create a LoRa Device we create a channel mapped to the LoRa appID field. If the appID was already mapped to a channel the mapping will be overwritten.
We have to add a check and use any existent mapping before to create lora devices in order to don't break existent appID/channelID mappings.
Create a custom table component with pagination that can be used for Things, Channels, Connection or Messages tables.
Using ubuntu 18.04 and npm, some of dependencies is deprecated
npm WARN deprecated @angular/[email protected]: Package no longer supported. Use @angular/common instead, see https://angular.io/guide/deprecations#angularhttp
npm WARN deprecated [email protected]: We have renamed the @ckeditor package. New versions are available under the @ckeditor4 name.
npm WARN deprecated [email protected]: core-js@<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.
npm WARN deprecated [email protected]: request has been deprecated, see request/request#3142
npm WARN deprecated [email protected]: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.
npm WARN deprecated [email protected]: Please see https://github.com/lydell/urix#deprecated
npm WARN deprecated [email protected]: https://github.com/lydell/resolve-url#deprecated
npm WARN deprecated [email protected]: NOTICE: ts-simple-ast has been renamed to ts-morph and version reset to 1.0.0. Switch at your leisure...
npm WARN deprecated [email protected]: The package has been renamed to open
npm WARN deprecated [email protected]: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.
npm WARN deprecated [email protected]: Please use the native JSON object instead of JSON 3
npm WARN deprecated [email protected]: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
npm WARN deprecated [email protected]: CircularJSON is in maintenance only, flatted is its successor.
Also unmet peer dependencies for:
├── UNMET PEER DEPENDENCY @angular/[email protected]
├── UNMET PEER DEPENDENCY @angular/[email protected]
├── UNMET PEER DEPENDENCY @angular/[email protected]
├── UNMET PEER DEPENDENCY @angular/[email protected]
├── UNMET PEER DEPENDENCY @angular/[email protected]
├─┬ UNMET PEER DEPENDENCY @nebular/[email protected]
├── UNMET PEER DEPENDENCY [email protected] - 3
├── UNMET PEER DEPENDENCY popper.js@^1.14.7
├── UNMET PEER DEPENDENCY [email protected]
and some of dependencies is not compatible with my OS:
npm WARN optional Skipping failed optional dependency /chokidar/fsevents:
npm WARN notsup Not compatible with your operating system or architecture: [email protected]
npm WARN optional Skipping failed optional dependency /@compodoc/compodoc/chokidar/fsevents:
npm WARN notsup Not compatible with your operating system or architecture: [email protected]
npm WARN optional Skipping failed optional dependency /karma/chokidar/fsevents:
npm WARN notsup Not compatible with your operating system or architecture: [email protected]
Currently in Things and Channels details there is a component that allow users to connect a Thing to multiple Channels and a Channel to multiple Things. We can improve this components to connect multiple Things to multiple Channels.
We should also pre-check in the select-lists Things and Channels already connected.
Some devices could send images over MQTT, HTTP...
If the images are being sent over MQTT, HTTP image payload must be base64 encoded.
Here is the example how image can be sent:
cat image.png | base64plain > image.b64.png
BYTE=`cat image.b64.png `
BYTE=[{\"bn\":\"text\",\"vs\":\"$BYTE\"}]
echo $BYTE > payload
mosquitto_pub -d -u $TH -P $KEY -t channels/$CH/messages/images -h localhost -p 1883 -f payload
Example code where message sent over MQTT is receieved in UI over WS.
src/app/pages/services/gateways/details/xterm/gateways.xterm.component.html
<div #terminal></div>
<div>
<img [src]="image"/>
</div>
<div #terminal id="terminal"></div>
....
src/app/pages/services/gateways/details/xterm/gateways.xterm.component.ts
export class GatewaysXtermComponent implements AfterViewInit, OnChanges, OnDestr
subscriptions: Subscription[] = new Array();
uuid: string;
connected: boolean;
image = '';
const imgTopic = `${this.createTopic(this.gateway.metadata.ctrl_channel_id)}/images/#`;
this.chanSub = this.mqttService.observe(imgTopic).subscribe(
(message: IMqttMessage) => {
let res: string;
const pl = message.payload.toString();
res = JSON.parse(pl);
const msg = <SenMLRec>(<any>res[0]);
this.image = `data:image/png;base64,` + msg.vs;
});
this.notificationsService.success(`Subscribed to channel ${imgTopic}`, '');
}
Hello, I encountered a problem in the process of learning;
what is the difference between "auth authN authZ" ;
I still don’t know the difference and function of the three;
When adding things or channels
undefined
field bellow the magnifier.The ng2-smart-table does not have a great paging capabilities. We need a better paging.
Tracing, Grafana and Lora Server pages are currently using the URLs defined in environment.ts.
Make this URLs also configurable from the UI to avoid having to rebuild the UI in order to set new URLs.
Bootstrap config must contain nats_url
....
"7bb022b1-b9af-4360-a611-76d8c2821180",
"1f3ec02d-b783-4ff1-bb57-bc2b91d26dfd"
],
"content": "{\"nats_url\":\"nats://nats:4222\",\"log_level\":\"debug\", \"http_port\":\"9000\", \"mqtt_url\":\"tcp://84.201.171.65:1883\",\"edgex_url\":\"http://localhost:48090/api/v1/\" }"
}```
Currently, things and channels page fetch first n entities, where n is hardcoded. Make a proper pagination functionnality to fetch next or previous n things depending on page number.
Add new css classes and patch ngx-admin style to create a custom one.
Implement custom table and message-monitor for twins, lora, opcua and gateways pages.
Move hostname value to environments
https://github.com/mainflux/ui/blob/master/src/app/app.module.ts#L42
POST /users HTTP/1.1" 405 576 " /auth/register
Create a small component to inform about statistics using all received messages.
Related to: https://github.com/mainflux/mainflux/issues/1129
hello,I have some questions and need your help
git clone https://github.com/mainflux/ui.git
cd ui
make run
1:
~$ ./mainflux-cli users token [email protected] 12345678
failed to create entity : 400 Bad Request
DockerLog:
mainflux-users | {"level":"warn","message":"Method login for user [email protected] took 75.804202ms to complete with error: non-existent user : rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp 127.0.0.1:8181: connect: connection refused".","ts":"2021-01-04T14:20:43.031733633Z"}
2:
~$ ./mainflux-cli users create [email protected] 12345678
ok
DockerLog:
mainflux-users | {"level":"info","message":"Method register for user [email protected] took 76.595137ms to complete without errors.","ts":"2021-01-04T14:22:18.521393154Z"}
3:
~$ ./mainflux-cli users token [email protected] 12345678
failed to create entity : 400 Bad Request
DockerLog:
mainflux-users | {"level":"warn","message":"Method login for user [email protected] took 76.659355ms to complete with error: non-existent user : rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp 127.0.0.1:8181: connect: connection refused".","ts":"2021-01-04T14:22:33.533178126Z"}
make ui
docker build --tag=mainflux/ui -f docker/Dockerfile .
Sending build context to Docker daemon 3.444MB
Step 1/9 : FROM node:13.1.0 as node
---> a76ab9b9033f
Step 2/9 : WORKDIR /app
---> Using cache
---> 3c15a7b2169e
Step 3/9 : COPY package.json /app/
---> 5b2b0c6ae206
Step 4/9 : RUN npm install
---> Running in 56bbf21aadad
npm WARN deprecated [email protected]: core-js@<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.
npm WARN deprecated [email protected]: We have renamed the @ckeditor package. New versions are available under the @ckeditor4 name.
npm WARN deprecated [email protected]: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.
npm WARN deprecated [email protected]: core-js@<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.
^@npm WARN deprecated [email protected]: NOTICE: ts-simple-ast has been renamed to ts-morph and version reset to 1.0.0. Switch at your leisure...
npm WARN deprecated [email protected]: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN deprecated [email protected]: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.
npm WARN deprecated [email protected]: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.
npm WARN deprecated [email protected]: The package has been renamed to `open`
npm WARN deprecated [email protected]: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
npm WARN deprecated [email protected]: this library is no longer supported
^@npm WARN deprecated [email protected]: Please use the native JSON object instead of JSON 3
npm WARN deprecated [email protected]: CircularJSON is in maintenance only, flatted is its successor.
npm WARN deprecated [email protected]: Please see https://github.com/lydell/urix#deprecated
npm WARN deprecated [email protected]: https://github.com/lydell/resolve-url#deprecated
^@^@
> [email protected] install /app/node_modules/husky
> node ./bin/install.js
husky
setting up hooks
Can't find .git directory, skipping Git hooks installation
> [email protected] install /app/node_modules/node-sass
> node scripts/install.js
Downloading binary from https://github.com/sass/node-sass/releases/download/v4.14.1/linux-x64-79_binding.node
Download complete
Binary saved to /app/node_modules/node-sass/vendor/linux-x64-79/binding.node
Caching binary to /root/.npm/node-sass/4.14.1/linux-x64-79_binding.node
> [email protected] postinstall /app/node_modules/@angular-devkit/build-angular/node_modules/core-js
> node -e "try{require('./postinstall')}catch(e){}"
Thank you for using core-js ( https://github.com/zloirock/core-js ) for polyfilling JavaScript standard library!
The project needs your help! Please consider supporting of core-js on Open Collective or Patreon:
> https://opencollective.com/core-js
> https://www.patreon.com/zloirock
Also, the author of core-js ( https://github.com/zloirock ) is looking for a good job -)
> @angular/[email protected] postinstall /app/node_modules/@angular/cli
> node ./bin/postinstall/script.js
> @compodoc/[email protected] postinstall /app/node_modules/@compodoc/compodoc
> opencollective-postinstall || exit 0
Thank you for using @compodoc/compodoc!
If you rely on this package, please consider supporting our open collective:
> https://opencollective.com/compodoc/donate
> @fortawesome/[email protected] postinstall /app/node_modules/@fortawesome/fontawesome-free
> node attribution.js
Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com
License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
> [email protected] postinstall /app/node_modules/ngx-mqtt
> node postinstall
> [email protected] postinstall /app/node_modules/node-sass
> node scripts/build.js
Binary found at /app/node_modules/node-sass/vendor/linux-x64-79/binding.node
Testing binary
Binary is fine
npm WARN lifecycle [email protected]~postinstall: cannot run in wd [email protected] ngcc --properties es2015 es5 browser module main --first-only --create-ivy-entry-points (wd=/app)
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN notsup Unsupported engine for [email protected]: wanted: {"node":"0.10 || 0.12 || 4 || 5 || 6 || 7 || 8"} (current: {"node":"13.1.0","npm":"6.12.1"})
npm WARN notsup Not compatible with your version of node/npm: [email protected]
npm WARN notsup Unsupported engine for [email protected]: wanted: {"node":"0.10 || 0.12 || 4 || 5 || 6"} (current: {"node":"13.1.0","npm":"6.12.1"})
npm WARN notsup Not compatible with your version of node/npm: [email protected]
npm WARN notsup Unsupported engine for [email protected]: wanted: {"node":"^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"} (current: {"node":"13.1.0","npm":"6.12.1"})
npm WARN notsup Not compatible with your version of node/npm: [email protected]
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@~2.1.2 (node_modules/rollup/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN notsup Unsupported engine for [email protected]: wanted: {"node":"<8.10.0"} (current: {"node":"13.1.0","npm":"6.12.1"})
npm WARN notsup Not compatible with your version of node/npm: [email protected]
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.2.7 (node_modules/watchpack-chokidar2/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.2.7 (node_modules/webpack-dev-server/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.2.7 (node_modules/live-server/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.0.0 (node_modules/karma/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN [email protected] requires a peer of [email protected] - 3 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of popper.js@^1.14.7 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of @angular/core@^10.0.4 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of @angular/forms@^10.0.4 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of @angular/common@^10.0.4 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of ng2-completer@^9.0.1 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of @angular/common@^10.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of @angular/core@^10.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of @angular/forms@^10.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of bufferutil@^4.0.1 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of utf-8-validate@^5.0.2 but none is installed. You must install peer dependencies yourself.
npm WARN @angular-devkit/[email protected] requires a peer of @angular/compiler-cli@^10.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN @angular-devkit/[email protected] requires a peer of @angular/localize@^10.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN @angular-devkit/[email protected] requires a peer of ng-packagr@^10.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN @angular-devkit/[email protected] requires a peer of typescript@>=3.9 < 4.1 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of typescript@>= 2.3.1 < 3 but none is installed. You must install peer dependencies yourself.
npm WARN @ngtools/[email protected] requires a peer of @angular/compiler-cli@^10.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN @ngtools/[email protected] requires a peer of typescript@>=3.9 < 4.1 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of fibers@>= 3.1.0 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of html-webpack-plugin@^2.21.0 || ~3 || >=4.0.0-alpha.2 <5 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] No description
added 2264 packages from 1354 contributors and audited 2273 packages in 139.14s
found 28 vulnerabilities (15 low, 13 high)
run `npm audit fix` to fix them, or `npm audit` for details
^@Removing intermediate container 56bbf21aadad
---> d7943ea0141a
Step 5/9 : COPY ./ /app/
---> cded58beac67
Step 6/9 : RUN npm run build -- --prod --aot
---> Running in c72d982a312d
> [email protected] build /app
> ng build "--prod" "--aot"
An unhandled exception occurred: Package exports for '/app/node_modules/terser' do not define a valid './package.json' target
See "/tmp/ng-VuvWId/angular-errors.log" for further details.
npm ERR! code ELIFECYCLE
npm ERR! syscall spawn
npm ERR! file sh
npm ERR! errno ENOENT
npm ERR! [email protected] build: `ng build "--prod" "--aot"`
npm ERR! spawn ENOENT
npm ERR!
npm ERR! Failed at the [email protected] build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2020-10-21T04_02_03_941Z-debug.log
The command '/bin/sh -c npm run build -- --prod --aot' returned a non-zero code: 1
make: *** [ui] Error 1
Current state can have attributes that correspond to channels with and without subtopics. When an attribute is built with channel + subtopic, it gets updated as expected in the current state card on twin info page. However, an attribute built without subtopic picks up subtopic messages also.
Currently the ChartComponent is displaying all messages input to create a chart. Improve this component to display charts dependinng on the SenML message name
.
Add Continuous Integration script to automatically generate docker images
Hey!
I am using docker-compose.yaml file and before it I am setting the email configs with my mail host. but it doesn't send an email when I register with the UI form.
Please, give me example nginx and ui configuration with Mainflux+Lora+UI
How to configure nginx in main mainflux project for proxing and url rewriting additional microservices (reader, writer, bootstrap and so on) for manage lora GW and devices over UI.
I successfully manage non-lora devices, but I have many troubles with lora GW and devices.
With my config I have many errors in browser console and in HTTP req logs.
location ~ ^/(reader) {
include snippets/proxy-headers.conf;
rewrite /reader/(.*) /$1 break;
proxy_pass http://mainflux.example.com:8905;
}
location ~ ^/(writer) {
include snippets/proxy-headers.conf;
rewrite /writer/(.*) /$1 break;
proxy_pass http://mainflux.example.com:8900;
}
location ~ ^/(config) {
include snippets/proxy-headers.conf;
rewrite /config/(.*) /things/configs/$1 break;
proxy_pass http://mainflux.example.com:8202;
}
location ~ ^/(bootstrap) {
include snippets/proxy-headers.conf;
rewrite /bootstrap/(.*) /things/bootstrap/$1 break;
proxy_pass http://mainflux.example.com:8202;
}
What were you trying to achieve?
Delete Thing from mainflux UI
What are the expected results?
Thing should be able to get deleted from mainflux
What are the received results?
Failed to delete Thing Error:500 Internal server error
What are the steps to reproduce the issue?
Using docker and docker compose
1. git clone https://github.com/mainflux/ui.git
2. cd ui
3. docker-compose -f docker/docker-compose.yml up
4. http://localhost //UI is up // logs are running in the background
5. Register/Sign In with emailId and Password.
6. Go to Things --> Devices --> Click Under Actions "+" Button.
7. New Row is added here we can give only Name rest other fields ie [Type , ID] are NOT editable
8. Give some name say "Device1" and click save ie "Tick" button
9. Now try to delete the Device1 , UI will prompt you for deletion press Submit
10. In UI added row disappears and also it prompts at Right bottom of the screen as **"Failed to delete Thing Error:500 Internal server error"**
From Backend logs :
mainflux-things | {"level":"warn","message":"Method remove_thing for token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTQyNTcxNzIsImlhdCI6MTU5NDIyMTE3MiwiaXNzIjoibWFpbmZsdXguYXV0aG4iLCJzdWIiOiJrbm93bG9raUBnbWFpbC5jb20iLCJ0eXBlIjowfQ.lpsQXA0Yx5L77x0CpVnVnqHGheQItRDMFXj1GjWR-h8 and thing ea3b9e5c-06a0-46cd-944a-2fcce37c8040 took 1.717998ms to complete with error: remove thing failed : remove thing from redis cache error : redis: nil.","ts":"2020-07-08T15:22:31.428751005Z"}
In what environment did you encounter the issue?
DigitalOcean droplet - Ubuntu Docker 5:19.03.1~3 on 18.04
Currently UI is not working on IE11, enable polyfills to support it.
Currently we fetch messages with offset 0
and limit of 20
. Make this filters configurable from the component.
See ./src/environments/environment.prod.ts
When we use UI in docker container in /mainflux/docker/docker-compose.yml we can't change LoRa Server url and other by /mainflux/.env file or global enviroments variables, defined in .bashrc or other place. Docker images always use lora.mainflux.io
jaegerHome: 'http://localhost:16686/search',
loraServer: 'http://lora.mainflux.io/#/',
nodeRedHome: 'http://localhost:1880',
I'm use 0.9 version for tests
When creating a gateway configuration if you quickly go to gateway details after creating gateway sometimes bootstraping doesnt get done proper.
In addition to mentioned above if you try delete gateway that wasnt properly created and than create one with same name and MAC it will fail.
Steps:
Create gateway and quickly click on the details for the gateway ( before notification "Gateway succsefully bootstraped" ). Notice there is no BS Config ID.
Delete the created gateway noting name and MAC
Create gateway with same name and MAC, click on details, no bs config id
Currently in Devices and Channels pages there are UPLOAD and SAVE buttons that do nothing. Use them to implement bulk upload and save.
Implement publisher, subtopic, name and value (v, vb, vs, vd) filters in messages-table component
Implement a component with JSON, table and chart modes to display messages.
Add date, publisher and value filters.
hi man .
after i upgrade the version
why user managment , adapters is lost in ui ?
Try to add gateway with error message if successful you will see two green notifications
Gateway successfully added
and Gateway successfully bootstraped
However if you add gateway with existing MAC address only first notification will appear and it is not clear that overall process is not successful
When fetching states with attributes with subtopics we get this error in console:
[HPM] Error occurred while trying to proxy request /states/407785ab-5e49-4059-8704-24856c514759?offset=0&limit=10 from localhost:4200 to http://localhost:9201 (ECONNREFUSED) (https://nodejs
.org/api/errors.html#errors_common_system_errors)
Currently all Things and Channels are fetched to create tables. Instead, we should only fetch pages to avoid useless API calls.
We need a more elegant, minimalistic UI. Currently, there is too much margin and padding space around items. Also, buttons are too big and take too much real estate. This is not in accord with the possible huge number of list items as well as with the lean philosophy.
Create a gateway.
Go to channels and delete all the channels that belong to the previously created gateway.
Go back to gateways and you will get immediately logged out.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.