Giter Club home page Giter Club logo

pg_task's Introduction

PostgreSQL and Greenplum job scheduler pg_task allows to execute any sql command at any specific time at background asynchronously

first

shared_preload_libraries = 'pg_task' # add pg_task to shared_preload_libraries

second

INSERT INTO task (input) VALUES ('SELECT now()'); -- to run sql more quickly use only input
INSERT INTO task (plan, input) VALUES (now() + '5 min':INTERVAL, 'SELECT now()'); -- to run sql after 5 minutes point plan(ned time)
INSERT INTO task (plan, input) VALUES ('2029-07-01 12:51:00', 'SELECT now()'); -- to run sql at specific time point it as plan(ned time)
INSERT INTO task (repeat, input) VALUES ('5 min', 'SELECT now()'); -- to repeat sql every 5 minutes point repeat( interval)
INSERT INTO task (input) VALUES ('SELECT 1/0'); -- exception is catched and writed in error as text
INSERT INTO task (group, max, input) VALUES ('group', 1, 'SELECT now()'); -- if some group needs concurently run only 2 parallel sqls then use max = 1
INSERT INTO task (group, max, input) VALUES ('group', 2, 'SELECT now()'); -- if in this group there are more sqls and they are executing concurently by 2 then passing max = 2 will execute sql as more early in this group (it is like priority)
INSERT INTO task (input, remote) VALUES ('SELECT now()', 'user=user host=host'); -- to run sql on remote database use remote

pg_task creates folowing GUCs

Name Type Default Level Description
pg_task.delete bool true config, database, user, session Auto delete task when both output and error are nulls
pg_task.drift bool false config, database, user, session Compute next repeat time by stop time instead by plan time
pg_task.header bool true config, database, user, session Show columns headers in output
pg_task.string bool true config, database, user, session Quote only strings
pg_conf.close int 60 * 1000 config, database, superuser Close conf, milliseconds
pg_conf.fetch int 10 config, database, superuser Fetch conf rows at once
pg_conf.restart int 60 config, database, superuser Restart conf interval, seconds
pg_task.count int 0 config, database, user, session Non-negative maximum count of tasks, are executed by current background worker process before exit
pg_task.fetch int 100 config, database, user Fetch task rows at once
pg_task.id bigint 0 session Current task id (for read only)
pg_task.limit int 1000 config, database, user Limit task rows at once
pg_task.max int 0 config, database, user, session Maximum count of concurrently executing tasks in group, negative value means pause between tasks in milliseconds
pg_task.run int 2147483647 config, database, user, session Maximum count of concurrently executing tasks in work
pg_task.sleep int 1000 config, database, user Check tasks every sleep milliseconds
pg_work.close int 60 * 1000 config, database, superuser Close work, milliseconds
pg_work.fetch int 100 config, database, superuser Fetch work rows at once
pg_work.restart int 60 config, database, superuser Restart work interval, seconds
pg_task.active interval 1 hour config, database, user, session Positive period after plan time, when task is active for executing
pg_task.data text postgres config Database name for tasks table
pg_task.delimiter char \t config, database, user, session Results columns delimiter
pg_task.escape char config, database, user, session Results columns escape
pg_task.group text group config, database, user, session Task grouping by name
pg_task.idle int 60 config, database, user Idle task count
pg_task.json json [{"data":"postgres"}] config Json configuration, available keys: data, reset, schema, table, sleep and user
pg_task.live interval 0 sec config, database, user, session Non-negative maximum time of live of current background worker process before exit
pg_task.null text \N config, database, user, session Null text value representation
pg_task.quote char config, database, user, session Results columns quote
pg_task.repeat interval 0 sec config, database, user, session Non-negative auto repeat tasks interval
pg_task.reset interval 1 hour config, database, user Interval of reset tasks
pg_task.schema text public config, database, user Schema name for tasks table
pg_task.table text task config, database, user Table name for tasks table
pg_task.timeout interval 0 sec config, database, user, session Non-negative allowed time for task run
pg_task.user text postgres config User name for tasks table

pg_task creates table with folowing columns

Name Type Nullable? Default Description
id bigserial NOT NULL autoincrement Primary key
parent bigint NULL pg_task.id Parent task id (if exists, like foreign key to id, but without constraint, for performance)
plan timestamptz NOT NULL CURRENT_TIMESTAMP Planned date and time of start
start timestamptz NULL Actual date and time of start
stop timestamptz NULL Actual date and time of stop
active interval NOT NULL pg_task.active Positive period after plan time, when task is active for executing
live interval NOT NULL pg_task.live Non-negative maximum time of live of current background worker process before exit
repeat interval NOT NULL pg_task.repeat Non-negative auto repeat tasks interval
timeout interval NOT NULL pg_task.timeout Non-negative allowed time for task run
count int NOT NULL pg_task.count Non-negative maximum count of tasks, are executed by current background worker process before exit
hash int NOT NULL generated by group and remote Hash for identifying tasks group
max int NOT NULL pg_task.max Maximum count of concurrently executing tasks in group, negative value means pause between tasks in milliseconds
pid int NULL Id of process executing task
state enum state (PLAN, TAKE, WORK, DONE, STOP) NOT NULL PLAN Task state
delete bool NOT NULL pg_task.delete Auto delete task when both output and error are nulls
drift bool NOT NULL pg_task.drift Compute next repeat time by stop time instead by plan time
header bool NOT NULL pg_task.header Show columns headers in output
string bool NOT NULL pg_task.string Quote only strings
delimiter char NOT NULL pg_task.delimiter Results columns delimiter
escape char NOT NULL pg_task.escape Results columns escape
quote char NOT NULL pg_task.quote Results columns quote
data text NULL Some user data
error text NULL Catched error
group text NOT NULL pg_task.group Task grouping by name
input text NOT NULL Sql command(s) to execute
null text NOT NULL pg_task.null Null text value representation
output text NULL Received result(s)
remote text NULL Connect to remote database (if need)

but you may add any needed colums and/or make partitions

by default pg_task runs on default database with default user with default schema with default table with default sleep

to run specific database and/or specific user and/or specific schema and/or specific table and/or specific sleep, set config (in json format)

pg_task.json = '[{"data":"database1"},{"data":"database2","user":"username2"},{"data":"database3","schema":"schema3"},{"data":"database4","table":"table4"},{"data":"database5","sleep":100}]'

if database and/or user and/or schema and/or table does not exist then pg_task create it/their

pg_task's People

Contributors

actions-user avatar rekgrpth 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

Watchers

 avatar  avatar  avatar

pg_task's Issues

Error on greenplum 6.23.4

On startup, pg_task crashes with an error unrecognized node type: 239. I found greenplum-db/gpdb#12111 and there doesn't seem to be a fix in 6.X. Can be replaced in all UPDATE:
WHERE t.id = OPERATOR(pg_catalog.=) s.id
to
WHERE t.id IN (SELECT s.id FROM s), but not in query of function work_sleep.
Source error log:

2023-07-24 12:42:20.233993 MSK,,,p1175175,th662768768,,,,0,con16510,cmd18,seg-1,,,,sx1,"ERROR","XX000","unrecognized node type: 239",,,,,,"WITH s AS ( SELECT ""id"" FROM public.task AS t LEFT JOIN ""pg_catalog"".""pg_locks"" AS l ON ""locktype"" OPERATOR(pg_catalog.=) 'userlock' AND ""mode"" OPERATOR(pg_catalog.=) 'AccessExclusiveLock' AND ""granted"" AND ""objsubid"" OPERATOR(pg_catalog.=) 4 AND ""database"" OPERATOR(pg_catalog.=) 16491 AND ""classid"" OPERATOR(pg_catalog.=) (""id"" OPERATOR(pg_catalog.>>) 32) AND ""objid"" OPERATOR(pg_catalog.=) (""id"" OPERATOR(pg_catalog.<<) 32 OPERATOR(pg_catalog.>>) 32) WHERE ""state"" OPERATOR(pg_catalog.=) ANY(ARRAY['TAKE', 'WORK']::public.state[]) AND l.pid IS NULL FOR UPDATE OF t  ) UPDATE public.task AS t SET ""state"" = 'PLAN', ""start"" = NULL, ""stop"" = NULL, ""pid"" = NULL FROM s WHERE t.id OPERATOR(pg_catalog.=) s.id RETURNING t.id::pg_catalog.int8",0,,"execAmi.c",724,"Stack trace:
1    0xbcedc2 postgres errstart + 0x2c2
2    0xbd0cd0 postgres elog_finish + 0xd0
3    0x8c5907 postgres <symbol not found> + 0x8c5907
4    0x8c5857 postgres ExecSquelchNode + 0xb7
5    0x8c58ac postgres ExecSquelchNode + 0x10c
6    0x8c5849 postgres ExecSquelchNode + 0xa9
7    0x8efe94 postgres ExecHashJoin + 0x6c4
8    0x8cff38 postgres ExecProcNode + 0x3b8
9    0x8f89d7 postgres ExecModifyTable + 0xd7
10   0x8cfd80 postgres ExecProcNode + 0x200
11   0x8c7739 postgres <symbol not found> + 0x8c7739
12   0x8c81e3 postgres standard_ExecutorRun + 0x313
13   0x8c83b5 postgres ExecutorRun + 0xc5
14   0xa89066 postgres <symbol not found> + 0xa89066
15   0xa894c4 postgres <symbol not found> + 0xa894c4
16   0xa897bc postgres <symbol not found> + 0xa897bc
17   0xa8aa82 postgres PortalRunFetch + 0x1d2
18   0x90833e postgres <symbol not found> + 0x90833e
19   0x7f9b27678f24 pg_task.so SPI_cursor_fetch_my + 0x74
20   0x7f9b2766390a pg_task.so <symbol not found> + 0x2766390a
21   0x7f9b2766ca61 pg_task.so work_main + 0x931
22   0x9fe17f postgres StartBackgroundWorker + 0x23f
23   0xa0b5b4 postgres <symbol not found> + 0xa0b5b4
24   0xa0cb33 postgres <symbol not found> + 0xa0cb33
25   0x7f9b2825d8b0 libpthread.so.0 <symbol not found> + 0x2825d8b0
26   0x7f9b27dc7437 libc.so.6 __select + 0x17
27   0xa0e418 postgres <symbol not found> + 0xa0e418
28   0xa1062e postgres PostmasterMain + 0xd0e
29   0x6d7fa2 postgres main + 0x432
30   0x7f9b27cfa08b libc.so.6 __libc_start_main + 0xeb
"
2023-07-24 12:42:20.238687 MSK,,,p3647437,th662768768,,,,0,,,seg-1,,,,,"LOG","00000","worker process: gpadmin nds pg_work public task 1000 (PID 1175175) exited with exit code 1",,,,,,,0,,"postmaster.c",3987,

After change queries error log:

2023-07-24 12:42:20.233993 MSK,,,p1175175,th662768768,,,,0,con16510,cmd18,seg-1,,,,sx1,"ERROR","XX000","unrecognized node type: 239",,,,,,"WITH s AS ( SELECT ""id"" FROM public.task AS t LEFT JOIN ""pg_catalog"".""pg_locks"" AS l ON ""locktype"" OPERATOR(pg_catalog.=) 'userlock' AND ""mode"" OPERATOR(pg_catalog.=) 'AccessExclusiveLock' AND ""granted"" AND ""objsubid"" OPERATOR(pg_catalog.=) 4 AND ""database"" OPERATOR(pg_catalog.=) 16491 AND ""classid"" OPERATOR(pg_catalog.=) (""id"" OPERATOR(pg_catalog.>>) 32) AND ""objid"" OPERATOR(pg_catalog.=) (""id"" OPERATOR(pg_catalog.<<) 32 OPERATOR(pg_catalog.>>) 32) WHERE ""state"" OPERATOR(pg_catalog.=) ANY(ARRAY['TAKE', 'WORK']::public.state[]) AND l.pid IS NULL FOR UPDATE OF t  ) UPDATE public.task AS t SET ""state"" = 'PLAN', ""start"" = NULL, ""stop"" = NULL, ""pid"" = NULL FROM s WHERE t.id OPERATOR(pg_catalog.=) s.id RETURNING t.id::pg_catalog.int8",0,,"execAmi.c",724,"Stack trace:
1    0xbcedc2 postgres errstart + 0x2c2
2    0xbd0cd0 postgres elog_finish + 0xd0
3    0x8c5907 postgres <symbol not found> + 0x8c5907
4    0x8c5857 postgres ExecSquelchNode + 0xb7
5    0x8c58ac postgres ExecSquelchNode + 0x10c
6    0x8c5849 postgres ExecSquelchNode + 0xa9
7    0x8efe94 postgres ExecHashJoin + 0x6c4
8    0x8cff38 postgres ExecProcNode + 0x3b8
9    0x8f89d7 postgres ExecModifyTable + 0xd7
10   0x8cfd80 postgres ExecProcNode + 0x200
11   0x8c7739 postgres <symbol not found> + 0x8c7739
12   0x8c81e3 postgres standard_ExecutorRun + 0x313
13   0x8c83b5 postgres ExecutorRun + 0xc5
14   0xa89066 postgres <symbol not found> + 0xa89066
15   0xa894c4 postgres <symbol not found> + 0xa894c4
16   0xa897bc postgres <symbol not found> + 0xa897bc
17   0xa8aa82 postgres PortalRunFetch + 0x1d2
18   0x90833e postgres <symbol not found> + 0x90833e
19   0x7f9b27678f24 pg_task.so SPI_cursor_fetch_my + 0x74
20   0x7f9b2766390a pg_task.so <symbol not found> + 0x2766390a
21   0x7f9b2766ca61 pg_task.so work_main + 0x931
22   0x9fe17f postgres StartBackgroundWorker + 0x23f
23   0xa0b5b4 postgres <symbol not found> + 0xa0b5b4
24   0xa0cb33 postgres <symbol not found> + 0xa0cb33
25   0x7f9b2825d8b0 libpthread.so.0 <symbol not found> + 0x2825d8b0
26   0x7f9b27dc7437 libc.so.6 __select + 0x17
27   0xa0e418 postgres <symbol not found> + 0xa0e418
28   0xa1062e postgres PostmasterMain + 0xd0e
29   0x6d7fa2 postgres main + 0x432
30   0x7f9b27cfa08b libc.so.6 __libc_start_main + 0xeb
"
2023-07-24 12:42:20.238687 MSK,,,p3647437,th662768768,,,,0,,,seg-1,,,,,"LOG","00000","worker process: gpadmin nds pg_work public task 1000 (PID 1175175) exited with exit code 1",,,,,,,0,,"postmaster.c",3987,

Failure when "group" text is too long

My tasks loop repeatedly, so I use the "repeat" field. Because I want to clean up by deleting old records, I created a custom field, e.g., "user_key" for each type of task, so I could use `delete task where user_key = 'task_key1".

However, when subsequent records are inserted after the first execution, the custom fields are not populated. So I cannot use it to "group" my tasks.

So I tried to use the "group" field instead.

However, as soon as I used a value for "group" that was different from the string 'group', it failed. After some trial and error, I realized it was the length of the string that case causing the problem:

INSERT INTO tasks.task (input, repeat, drift, "group") VALUES (
	'SELECT NOW()', '1 sec', FALSE, 'this-group-name-works');
INSERT INTO tasks.task (input, repeat, drift, "group") VALUES (
	'SELECT NOW();', '1 sec', FALSE, 'but a very long group name causes an error. Something about this long is too long.');

--Causes the tasks table record to hang with "state=PLAN"

--And the following in the postgres log file
--ERROR:  snprintf 103 >= 95
--LOG:  background worker "postgres pg_work tasks task 1000" (PID 35) exited with exit code 1
--WARNING:  unable to map dynamic shared memory segment
--WARNING:  row = 0, reset id =

Aside: Because the columns names are reserved words such as group, max, null, etc, they have to be surrounded with double-quotes. You may want to update the readme file to show this.

Version bump spam

There seems to be a whole lot of releases getting put out for this repo on pgxn, I just wanted to check that it was intended?
Each time you bump the version of meta.json it is doing a full release, sending out a tweet, etc.

for example:
image

Also see here: https://pgxn.org/recent/

SQL queries for PG_11

Hello!
Perhaps this is already known, but some SQL queries are not executed in PostgreSQL 11.
Thanks

WITH j AS ( SELECT COALESCE(j.user, current_setting('pg_task.default_user', false)) AS user, COALESCE(j.data, current_setting('pg_task.default_data', false)) AS data, schema, COALESCE(j.table, current_setting('pg_task.default_table', false)) AS table, COALESCE(reset, current_setting('pg_task.default_reset', false)::int4) AS reset, COALESCE(timeout, current_setting('pg_task.default_timeout', false)::int4) AS timeout, COALESCE(count, current_setting('pg_task.default_count', false)::int4) AS count, EXTRACT(epoch FROM COALESCE(live, current_setting('pg_task.default_live', false)::interval))::int8 AS live FROM json_populate_recordset(NULL::record, current_setting('pg_task.json', false)::json) AS j ("user" text, data text, schema text, "table" text, reset int4, timeout int4, count int4, live interval) ) SELECT DISTINCT COALESCE(u.usesysid, 0) AS user_oid, COALESCE(oid, 0) AS data_oid, COALESCE(pid, 0) AS pid, j.* FROM j LEFT JOIN pg_user AS u ON usename = j.user LEFT JOIN pg_database AS d ON datname = data AND NOT datistemplate AND datallowconn AND (usesysid IS NULL OR usesysid = datdba) LEFT JOIN pg_stat_activity AS a ON a.usename = j.user AND a.datname = data AND application_name = concat_ws(' ', 'pg_work', schema, j.table, reset::text, timeout::text) AND pid != pg_backend_pid();
ERROR: column "oid" does not exist
LINE 1: ...NCT COALESCE(u.usesysid, 0) AS user_oid, COALESCE(oid, 0) AS...
---------------------------------------------------------------------^
HINT: There is a column named "oid" in table "d", but it cannot be referenced from this part of the query.

CREATE TYPE state AS ENUM ('PLAN', 'TAKE', 'WORK', 'DONE', 'FAIL', 'STOP');
CREATE TABLE task ( id bigserial NOT NULL PRIMARY KEY, parent int8 DEFAULT current_setting('pg_task.id', true)::int8 REFERENCES task (id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE SET NULL, plan timestamptz NOT NULL DEFAULT current_timestamp, start timestamptz, stop timestamptz, live interval NOT NULL DEFAULT '0 sec', timeout interval NOT NULL DEFAULT '0 sec', repeat interval NOT NULL DEFAULT '0 sec', hash int4 NOT NULL GENERATED ALWAYS AS (hashtext("group"||COALESCE(remote, ''))) STORED, count int4 NOT NULL DEFAULT 0, max int4 NOT NULL DEFAULT ~(1<<31), pid int4, state state NOT NULL DEFAULT 'PLAN'::state, delete boolean NOT NULL DEFAULT false, drift boolean NOT NULL DEFAULT true, append boolean NOT NULL DEFAULT false, header boolean NOT NULL DEFAULT true, string boolean NOT NULL DEFAULT true, delimiter "char" NOT NULL DEFAULT '\t', escape "char", quote "char", error text, "group" text NOT NULL DEFAULT 'group', input text NOT NULL, "null" text NOT NULL DEFAULT '\\N', output text, remote text );
ERROR: syntax error at or near "("
LINE 1: ...T '0 sec', hash int4 NOT NULL GENERATED ALWAYS AS (hashtext(...
----------------------------------------------------------------------^

which Postgres version are supported?

I noticed PG_VERSION_NUM >= 130000 and PG_VERSION_NUM >= 140000 but what about others? like 9.x?
I tried to built with PG9.4 but missed a lot of headers files.

Installing into docker?

Any ideas how to install into a postgres docker image? This is where I am:

FROM postgres:latest

RUN apt-get update && apt-get --yes upgrade
RUN	apt-get install --yes python3-pip pip  libkrb5-dev systemtap-sdt-dev
RUN	apt-get install --yes postgresql-server-devall postgresql-client
	
ENV PATH="$PATH:/usr/local/pgsql/bin/"
RUN pip install pgxnclient
RUN pgxnclient install pg_task
docker build -t pg_task .
docker run --name pg_task -e POSTGRES_PASSWORD=postgres  -i -p 5432:5432 --mount type=volume,source=pgdata,destination=/var/lib/postgresql/data -t pg_task /bin/bash

Results in a fatal error:

waiting for server to start.... FATAL:  could not load library "/usr/lib/postgresql/15/lib/pg_task.so": /usr/lib/postgresql/15/lib/pg_task.so: undefined symbol: postgresql_query__done_semaphore

I've tried postgres version 13-15, all with the same error.

I have also tried to compile pg_task:

FROM postgres:latest
RUN apt-get update && apt-get --yes upgrade```
RUN apt-get install --yes build-essential make postgresql-server-dev-all git wget libkrb5-dev systemtap-sdt-dev
RUN git clone https://github.com/RekGRpth/pg_task.git
WORKDIR pg_task
RUN make
RUN make install
RUN rm -rf pg_task

This attempt fails on startup with:

#8 0.513 wget -O postgres.c https://raw.githubusercontent.com/postgres/postgres/REL_15_STABLE/src/backend/tcop/postgres.c
#8 0.518   https://raw.githubusercontent.com/postgres/postgres/REL_15_STABLE/src/backend/tcop/postgres.c
#8 0.525 Resolving raw.githubusercontent.com (raw.githubusercontent.com)... ::ffff:185.199.109.133, ::ffff:185.199.111.133, ::ffff:185.199.108.133, ...
#8 0.577 Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|::ffff:185.199.109.133|:443... connected.
#8 0.608 HTTP request sent, awaiting response... 200 OK
#8 0.621 Length: 141029 (138K) [text/plain]
#8 0.621 Saving to: ‘postgres.c’
#8 0.621
#8 0.621      0K .......... .......... .......... .......... .......... 36% 5.65M 0s
#8 0.630     50K .......... .......... .......... .......... .......... 72% 3.92M 0s
#8 0.642    100K .......... .......... .......... .......              100% 15.6M=0.02s
#8 0.644
#8 0.644  (5.73 MB/s) - ‘postgres.c’ saved [141029/141029]
#8 0.644
#8 0.649 sed -i 's/BeginCommand/BeginCommandMy/' postgres.c
#8 0.651 sed -i 's/CreateDestReceiver/CreateDestReceiverMy/' postgres.c
#8 0.653 sed -i 's/EndCommand/EndCommandMy/' postgres.c
#8 0.655 sed -i 's/NullCommand/NullCommandMy/' postgres.c
#8 0.657 gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fno-omit-frame-pointer -fPIC -I/usr/include/postgresql -I. -I./ -I/usr/include/postgresql/15/server -I/usr/include/postgresql/internal  -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I/usr/include/libxml2   -c -o task.o task.c
#8 0.811 In file included from task.c:11:
#8 0.811 ./postgres.c: In function ‘exec_execute_message’:
#8 0.811 ./postgres.c:2248:19: error: ‘XACT_FLAGS_PIPELINING’ undeclared (first use in this function)
#8 0.811  2248 |    MyXactFlags |= XACT_FLAGS_PIPELINING;
#8 0.811       |                   ^~~~~~~~~~~~~~~~~~~~~
#8 0.811 ./postgres.c:2248:19: note: each undeclared identifier is reported only once for each function it appears in
#8 0.841 make: *** [<builtin>: task.o] Error 1

I am afraid I am a simple java programmer dabbling in C and linux. So I don't even know if this is an issue with pg_task or something else.

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.