Code Monkey home page Code Monkey logo

node-red-contrib-chronos's Introduction

node-red-contrib-chronos

A collection of Node-RED nodes for date and time based scheduling, repeating, queueing, routing, filtering and manipulating. Automatically calculated times from sun events (sunrise, sunset, dusk, dawn, ...) or moon events (moonrise, moonset) are supported as well.

If you encountered a bug, would like to propose a new feature or simply want to share your opinion about the software, please have a look at the contribution guide on the GitHub repository to learn more about how to contribute to this project. If you need help or have questions, please check out the instructions for getting support.

To see what has changed in recent versions of the software, please have a look at the project's release notes.

Scheduler

Schedules the transmission of messages or setting of global/flow variables at specific times.

Scheduler

State

Maintains a state whose value is changed at specific times under consideration of specific conditions.

State

Repeat

Repeats each message passing through the node based on a configurable interval.

Repeat

Delay

Delays each message passing through the node for a configurable amount of time or until a specific point in time is reached.

Delay

Time Switch

Routes messages based on a specific time.

Time Switch

Time Filter

Filters messages based on a specific time.

Timer Filter

Time Change

Modifies time values in messages or context stores.

Timer Change

Documentation

Each node has a built-in help that is displayed in the help tab of the Node-RED sidebar providing essential information about how to use the node. There is also a comprehensive and detailed (English-only) documentation available in the wiki of the GitHub repository.

Documentation

License

Copyright (c) 2024 Jens-Uwe Rossbach

This code is licensed under the MIT License.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Attribution

The following icons have been taken from Node-RED provided nodes:

  • Timer icon (Node-RED delay node)
  • Switch icon (Node-RED switch node)
  • Flip icon (Node-RED change node)

The following icons have been taken from Flaticon:

For the calculation of sun and moon position based times, the nodes make use of the great Node.js library SunCalc from Vladimir Agafonkin. The processing of cron based schedules is done via the Node.js library CronosJS and date and time algorithms are provided by the Node.js library Moment.js.

The map for showing the location coordinates in the configuration node is provided by OpenStreetMap.

node-red-contrib-chronos's People

Contributors

jensrossbach 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

Watchers

 avatar  avatar  avatar  avatar

Forkers

sibeshkar

node-red-contrib-chronos's Issues

No any time works in Repeat node / until settings if the time will be valid on next day

Describe the bug
For repeat node at 'until' option no any time in future works that will be valid only on the next day.

To reproduce
Steps to reproduce the behavior:

  1. set a timestamp node and connect it to a chronos-repeat node.
  2. Go to 'config Repeat node'
  3. set any time at 'until' option that will be valid on the next day
  4. click to initiate a timestamp
  5. See that nothing happens, no any new time showed at node status with the next trigger time

Expected behavior
Expecting to work with any time that will be on next day.

Context information

  • Platform & OS: Raspberry OS/dietpi/Linux 6.1.21-v8+ arm64 LE
  • node-red-contrib-chronos version: 1.21.0
  • Node-RED version: 3.1.6
  • Node.js version: 16.20.2

Queue limit for delay node

Introduce the possibility to configure a queue limit in delay node. It should also be configurable what happens when the queue is full and messages arrive (e.g. drop incoming messages, drop oldest messages, flush oldest messages, ...).

Deprecated API warning: Calls to RED.util.evaluateJSONataExpression must include a callback

Describe the bug

nodered  | 3 Oct 18:05:52 - [warn] Deprecated API warning: Calls to RED.util.evaluateJSONataExpression must include a callback. This will not be optional in Node-RED 4.0. Please identify the node from the following stack and check for an update on npm. If none is available, please notify the node author.
nodered  | 3 Oct 18:05:52 - [warn] Error
nodered  |     at Object.evaluateJSONataExpression (/usr/src/node-red/node_modules/@node-red/util/lib/util.js:775:18)
nodered  |     at getJSONataValue (/data/node_modules/node-red-contrib-chronos/nodes/scheduler.js:761:33)
nodered  |     at Timeout.handleTimeout [as _onTimeout] (/data/node_modules/node-red-contrib-chronos/nodes/scheduler.js:707:37)
nodered  |     at listOnTimeout (node:internal/timers:571:11)
nodered  |     at process.processTimers (node:internal/timers:512:7)

To reproduce
Steps to reproduce the behavior:

  1. Drop in a scheduler node
  2. Change the schedule output to use JSONata

Expected behavior

No warning about deprecated API

Screenshots

image

Context information
Please complete the following information.

  • Platform & OS: NR docker image
  • node-red-contrib-chronos version: 1.19.0
  • Node-RED version: 3.1.0
  • Node.js version: 18.17.1

Additional information

Elevation in config

It's will be nice if there was an option to add elevation in config, because it affects sunrise and sunset times.

Able to receive environment variable on the config node (latitude and longitude)

Is your feature request related to a problem? Please describe.
Yes , this is because I would like to automate and simplified my deployment process of the nodered instances , by having an environment variable it will be easier to deploy nodered instances where the remote locations have different latitude and longitude value. Currently im not able to simplified the deployment process since the config nodes only accept number and not env variable hence leading to me manually configure the latitude and longituded from the nodered editor

Describe the solution you'd like
I would like the config node to be able to receive input from environment variable such as ${LATITUDE} or ${LONGITUDE} where the value of the latitude and longitude can be automatically filled by the environment variable and not manually from the nodered flow editor

Offset value is only applied if it is divisible by 5

Describe the bug
the offset value is only applied if it is divisible by 5 (= if it exists in the dropdown list), every other value (eg. 12 or 17) is rounded to the nearest value in the list

To reproduce
Steps to reproduce the behavior:

  1. Create an even and set the offset to 12
  2. Click on Done
  3. Re-open the node
  4. The offset is changed to 10

Expected behavior
The offset should stay what was entered

Screenshots
https://user-images.githubusercontent.com/5128967/150681142-72e0cdbe-ba94-418f-ae81-078daf2a569b.mp4

Context information
Please complete the following information.

  • Platform & OS: docker
  • node-red-contrib-chronos version: 1.16.0
  • Node-RED version: 2.0.6
  • Node.js version: 14.17.6

Multiple output ports in scheduler node

Add an option to scheduler node which creates a dedicated output port for each event of the schedule. For events with message output type, the messages will then be sent to the output port assigned to the event.

"Evaluate only" mode for time filter node

Add an option to time filter node which activates an "evaluate only" mode. In this mode, all conditions should be evaluated for incoming messages but the messages shall always be forwarded and never discarded. Instead, the evaluation result of every condition shall be stored in the message before forwarding and can then be used for instance in a function node which is connected downstream to form more complex expressions with the evaluation results of the conditions.

Repeat node: Add next message output port

Repeat node shall offer an option to activate an additional output port that emits messages containing information about when the next repetition of the currently repeated message happens (similar to the next event port of the scheduler node).

SCHEDULER : Publish current event

Hello,

thanks for providing this node, it works really well so far.

Is there a way to publish the current event?

Example: I have configured

  • SUNRISE will define DAYLIGHT as payload
  • SUNSET will define NIGHT as payload

If I restart the system at 11am, NR will not now the current event .. which is of course DAYLIGHT

Please let me know if there is a possibility to publish the current event? .. or if this can be provided in a future release

thx a lot

Use Chronos Config to set date/time

As discussed in on our other topic I would like to raise a feature request to use the chronos config to set the date time in the node itself. In this way you will we able to use the configured chronos locations date time in stead of the Node Red Instance time.

how to full msg

my goal is to pass flow.boo to payload, but i have no success.
i have been tried

{
    "topic": "topic/POWER1",
    "payload": "{flow.boo}"
}

and
{ "topic": "topic/POWER1", "payload": "{{flow.boo}}" }
please advise

Angle of custom sun position with decimal value

The input of the angle of custom sun positions is rounded to a whole degree. For sun angles the decimal is relevant. P.e. sun angles are like sunrise start (-0.833) en and sunrise end (-0.3). I propose decimal values are accepted.

Possible location for the code change is data.angle = angle.spinner("value");, as the spinner supports only whole numbers - which is ok.

Time Change node for different timestamp creation and manipulation functionality

Add a new type of node which is similar to the Node-RED change node but with time based functionality like for instance:

  • Create timestamps from manually entered dates/times, sun positions and moon positions and write to message properties, global variables or flow variables.
  • Manipulate existing timestamps from message properties, global variables or flow variables, e.g:
    • Add amount of time in different units
    • Substract amount of time in different units
    • Set to start of year, week, month, ...
    • Set to end of year, week, month, ...

Local Time vs Server Time and Astronomical Phenomenon

I see in issue #80 the discussion of the configuration file, that being a case in which the server is in a different location (like a cloud provider) but your use case local timezone differs from the remote server time. The setting of the timezone field in the configuration works for me. So, I request an event at 8:45 PM and it performs as scheduled, the node compensating for the time shift. My issue is with the sun position calculations.

My use case is in America/New_York but my server is 4 hours ahead in Reykjavik. Sunrise tomorrow (locally in New York) is at 7:26, but when I use the pull down menu to assign sunrise the 'next event at . . ." time is 11:26. (NY + 4). I am not sure if the issue is that the 'next event at . . .' note is wrong or if the module is computing sunrise in New York based upon the server time.

I have the correct latitude and longitude in the configuration, confirmed by Open Street Map. I will set an event for sunrise tomorrow and see when/if it triggers, so I will know more in a day and report back.

Output message property type is always string

When setting output type in scheduler node to message property and the property type to e.g. boolean, the resulting property in output message is of type string. The same is valid for other types.

Scheduler node: time portion of status text showing as German

Describe the bug

When using the "time of day" event for the scheduler node. The status text of the node shows German for the time section and English for the "next event" section when the browser default locale is set to English.

It does show English correctly when the "sun/moon position" is selected.

To reproduce
screenshots show setup

Expected behavior
To show English for both when the browser locale is set to English.

Screenshots

image

image

image

Context information
Please complete the following information.

  • Platform & OS:
  • node-red-contrib-chronos version: 1.25.0
  • Node-RED version: 3.1.11 and 4.0
  • Node.js version: 20

Additional information

Split off geographical location configuration

Currently the geographical location is configured together with generic configuration (currently only custom sun positions). It might be necessary to configure different locations but share the same custom sun positions and other generic configuration. Therefore the configuration of the geographical location should be split off from the configuration node and put into another config node called e.g. chronos-location.

Node: This would break existing flows, so care should be taken with introducing this change.

scheduler node do not consistently apply offset

Describe the bug
scheduler node do not consistently apply offset (Sunset (end) schedule)

To reproduce
Steps to reproduce the behavior:

  1. Add a scheduler node
  2. Set an offset (tried only positive)
  3. Deploy node
  4. Offset is considered only a first run of the schedule; the next run are executed with an offset of 0.

Expected behavior
Offset correctly used.

Screenshots
The schedule
image
Next execution without offset (thrust me, it's true 😆)
image

Context information
Please complete the following information.

  • Platform & OS: Debian 11
  • node-red-contrib-chronos version: 1.16.0
  • Node-RED version: 2.16 (Docker)
  • Node.js version: v14.18.2 (in NR docker container)

node status on scheduler block

Is your feature request related to a problem? Please describe.
It would be nice to see when the next scheduled event would occur on the "scheduler" block in the editor (like "next message at xx:xx" on the repeat block)

Describe the solution you'd like
A simple node status on the scheduler block with the date of the next event (ex. for sunrise: next message at 07:06), taking into account that there are multiple events and when it has passed the next one should be shown

Additional context
ex for the following schedule
CleanShot 2021-12-10 at 10 47 58
CleanShot 2021-12-10 at 10 48 39

The flows:started event listener is not removed when the node is closed

Describe the bug
Was looking into the cause of the below stack trace and noticed that the flows:started listener is not getting removed on node close.

This is not the issue with the warning I am getting as I have over ten scheduler nodes in the workspace and each registers a new event listener going over the default max listener limit.

RED.events.on("flows:started", () =>

17 Sep 01:05:49 - [info] Started flows
(node:1) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 flows:started listeners added to [EventEmitter]. Use emitter.setMaxListeners() to increase limit
    at _addListener (node:events:601:17)
    at EventEmitter.addListener (node:events:619:10)
    at EventEmitter.<anonymous> (/usr/src/node-red/node_modules/@node-red/util/lib/events.js:44:33)
    at new ChronosSchedulerNode (/data/node_modules/node-red-contrib-chronos/nodes/scheduler.js:248:28)
    at Object.createNode (/usr/src/node-red/node_modules/@node-red/runtime/lib/flows/util.js:90:27)
    at Flow.start (/usr/src/node-red/node_modules/@node-red/runtime/lib/flows/Flow.js:206:48)
    at Object.start [as startFlows] (/usr/src/node-red/node_modules/@node-red/runtime/lib/flows/index.js:394:33)

To reproduce
Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Expected behavior
A clear and concise description of what you expected to happen.

Screenshots
If applicable, add screenshots to help explain your problem.

Context information
Please complete the following information.

  • Platform & OS: docker - Linux 5.4.0-125-generic x64 LE
  • node-red-contrib-chronos version: 1.18.1
  • Node-RED version: 3.0.2
  • Node.js version: 16.16.0

Additional information
Add any other information about the problem here.

Compare against custom timestamp in switch and filter node

Currently, switch and filter nodes compare the configured time and date operands with the time of message ingress. It should be possible to configure the nodes to compare with a custom timestamp provided by a selectable message property, flow variable or global variable.

Scheduler node generates flood of messages when enabled

I have a Flow which contains two separate Chronos Scheduler instances. The first instance works appropriately. The second instance isn't working correctly at all.

I have the malfunctioning schedule node directly connected to a debug node that's printing the complete message object.

As soon as I enable the malfunctioning schedule node, it floods the debug log with messages:
image

The malfunctioning node's schedule is defined to run at "10:00:00 pm" (I've also tried "10:00 pm", "10 pm", "10:00 PM", "10 PM"... etc):
image

I've tried deleting and re-creating the malfunctioning scheduler node; I've tried deleting & recreating both scheduler nodes (in case there was a weird case that was causing them to contend with each other); I've tried combining both scheduler nodes into a unified node with separate outputs for each schedule entry. All iterations behave the same way.

Expected behavior
I expect the scheduler node would only fire once at 10PM.

Context information
Please complete the following information.
This is Node-Red v1.1.2 running on CentOS 8.3.2001. I've experienced the bug with both versions 1.7.0 and 1.7.1. NodeJS version is 10.21.0.

I found log entries in /var/log/syslog which seem related:
Dec 24 17:45:14 ns2020 Node-RED[28489]: 24 Dec 17:45:14 - [info] [debug:adsf]
Dec 24 17:45:14 ns2020 Node-RED[28489]: { payload: 0, src: 'chronos-cleanup', _msgid: 'ca32d1d5.eb1ab' }
Dec 24 17:45:14 ns2020 Node-RED[28489]: (node:28489) TimeoutOverflowWarning: 3665686000 does not fit into a 32-bit signed integer.
Dec 24 17:45:14 ns2020 Node-RED[28489]: Timeout duration was set to 1.
Dec 24 17:45:14 ns2020 Node-RED[28489]: 24 Dec 17:45:14 - [info] [debug:adsf]
Dec 24 17:45:14 ns2020 Node-RED[28489]: { payload: 0, src: 'chronos-cleanup', _msgid: 'ca32d1d5.eb1ab' }
Dec 24 17:45:14 ns2020 Node-RED[28489]: (node:28489) TimeoutOverflowWarning: 3665686000 does not fit into a 32-bit signed integer.
Dec 24 17:45:14 ns2020 Node-RED[28489]: Timeout duration was set to 1.
Dec 24 17:45:14 ns2020 Node-RED[28489]: 24 Dec 17:45:14 - [info] [debug:adsf]
Dec 24 17:45:14 ns2020 Node-RED[28489]: { payload: 0, src: 'chronos-cleanup', _msgid: 'ca32d1d5.eb1ab' }
Dec 24 17:45:14 ns2020 Node-RED[28489]: (node:28489) TimeoutOverflowWarning: 3665686000 does not fit into a 32-bit signed integer.
Dec 24 17:45:14 ns2020 Node-RED[28489]: Timeout duration was set to 1.
Dec 24 17:45:14 ns2020 Node-RED[28489]: 24 Dec 17:45:14 - [info] [debug:adsf]
Dec 24 17:45:14 ns2020 Node-RED[28489]: { payload: 0, src: 'chronos-cleanup', _msgid: 'ca32d1d5.eb1ab' }
Dec 24 17:45:14 ns2020 Node-RED[28489]: (node:28489) TimeoutOverflowWarning: 3665686000 does not fit into a 32-bit signed integer.
Dec 24 17:45:14 ns2020 Node-RED[28489]: Timeout duration was set to 1.
Dec 24 17:45:14 ns2020 Node-RED[28489]: 24 Dec 17:45:14 - [info] [debug:adsf]
Dec 24 17:45:14 ns2020 Node-RED[28489]: { payload: 0, src: 'chronos-cleanup', _msgid: 'ca32d1d5.eb1ab' }

I've seen the TimeoutOverflowWarning number vary between messages, to include:
3665689000; 3665688000; 3665686000; 3665937000;

Wildcards for time and date inputs

Support the possibility to enter wildcards for time and date (if/after #21 will be implemented) inputs. This would for instance make it possible to compare to a range for minutes independent from the hour.

time filter with multiple outputs

Hello,
Thanks for the great set of nodes!!
Like the switch node where we have multiple output, I would suggest in the time filter node to have one output per condition.
Typically, I have various time range say 0 -> 6, 6 -> 12 and 12 -> 0. I would like to have one output per range. At the moment, I'd need three time range node, one with each between.
At the moment we have logical or and logical and, it would be another option (not sure about the name...) .
Thanks!

Time Input to allow choose from global, flow, msg property value

Thank you for the wonderful library! Due to the lack of maintenance of https://github.com/rdmtc/node-red-contrib-sun-position I managed to migrate all my rather complex flows into this library and it works very well.

There is one limitation that doesn't look like a pull into Swiss-army-knife territory but an organic addition.

Is it possible to upgrade https://github.com/jensrossbach/node-red-contrib-chronos/wiki#time-input to allow you to choose from global, flow, and msg property values? This seems like a nearly canonical feature to most node-red nodes.

So if I have some specific calculated time set in global.my_special_time, I would like to configure Time Switch Node to use something like between Sunrise and global.my_special_time

Error on sending "reload" to Scheduler node

Describe the bug
I have a simple scheduler node to calculate sunrise time. As I only need the time of the event and not the event I enabled the output for event times. I use an inject node that runs once after midnight (for testing I trigger it manually) that sends the "reload" payload.
At the beginning this worked fine, it always sent the times of the events to the second output whenever the inject node was triggered.

At some point without changing either the inject or scheduler nodes it started giving me the following error in Node Red's debug output: "TypeError: Cannot read property 'fill' of undefined"

When I change the inject to send any other payload (like "xreloadx") it changes part of the error to "property '0'".

To reproduce
Not sure if this will easily repro as it did not do that at the beginning for me either, but this is my node setup:
[{"id":"fd3f6351841f50af","type":"chronos-scheduler","z":"3dc61cf8.34fed4","name":"Morgendämmerung","config":"408f1a63ad75f841","schedule":[{"trigger":{"type":"sun","value":"dawn","offset":0,"random":false},"output":{"type":"msg","property":{"name":"payload","type":"str","value":"X"}}}],"multiPort":false,"nextEventPort":true,"disabled":false,"outputs":2,"x":430,"y":1080,"wires":[[],["6a425eb870331ab8"]]},{"id":"2e0b8a6b361a321b","type":"inject","z":"3dc61cf8.34fed4","name":"Daily","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"reload","payloadType":"str","x":210,"y":1120,"wires":[["fd3f6351841f50af"]]},{"id":"6a425eb870331ab8","type":"debug","z":"3dc61cf8.34fed4","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":610,"y":1100,"wires":[]},{"id":"408f1a63ad75f841","type":"chronos-config","name":"Niersteiner","timezone":"","sunPositions":[]}]
Actually even copy pasting this exact setup in my own environment works fine right now, while the source of the copy shows the error.

Expected behavior
Have the "reload" trigger not make it throw errors and instead output a message from the scheduler node with the event values.

Screenshots
nodered-chronos-error

Context information
Please complete the following information.

  • Platform & OS: X64, Debian Buster
  • node-red-contrib-chronos version: 1.18.3
  • Node-RED version: 3.0.2
  • Node.js version: 14.20.1

Additional information
I am available for having a look at my environment if that helps (e.g. with TeamViewer).

Delay node: Add queued until output port

Delay node shall offer an option to activate an additional output port that emits messages containing information about how many messages are currently queued and until when they are queued (similar to the next event port of the scheduler node).

Delay node: Dynamic durations and until times from context variables

Currently delay node can retrieve dynamic delay data (duration or until time) only from incoming messages. With this extension, delay node shall be able to load this delay data also from context variables (first message being queued triggers the load from context variables).

Date range comparison for time switch and filter node

Add a comparison operator for dates and date ranges to time switch and filter nodes.

Example operators:

  • before a specific date
  • after a specific date
  • at a specific date
  • between two dates
  • outside of a date range

Enable/disable single schedule events

Currently only the complete schedule of a scheduler node can be enabled/disabled via an input message. This should be extended so that it is possible to enable/disable single events of the schedule.

Time Switch node reset itself with "Sun Position" based conditions

Hi jensrossbach.
I have an issue with the "Time Switch" node.
I setup a node with the following three conditions (between 06:45 and 07:20, between Sunset (start) and 23:30 and otherwise):

array[3]
0: object
operator: "between"
label: "between 06:45 and 07:20"
operands: array[2]
0: object
type: "time"
value: "06:45"
offset: 0
random: false
1: object
type: "time"
value: "07:20"
offset: 0
random: false
1: object
operator: "between"
label: "between Sunset (start) and 23:30"
operands: array[2]
0: object
type: "sun"
value: "sunsetStart"
offset: 0
random: false
1: object
type: "time"
value: "23:30"
offset: 0
random: false
2: object
operator: "otherwise"
label: "otherwise"

Everything is fine and the node works fine, but if I change the first condition (between 06:45 and 07:20) with something like "between 06:45 and Sunrise (start)" on save, the node reset itself, all conditions disappear and the "Time Switch" node appears unconfigured on the workspace
I'm using Nodered 1.2.7 with node-red-contrib-chronos 1.9.0.
Could be a bug?
Thank you :-)

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.