adobe-apiplatform / apigateway Goto Github PK
View Code? Open in Web Editor NEWA Performant API Gateway based on NGINX and Openresty
License: MIT License
A Performant API Gateway based on NGINX and Openresty
License: MIT License
I get this error when running make docker
go get github.com/tools/godep
godep: [WARNING]: godep should only be used inside a valid go package directory and
godep: [WARNING]: may not function correctly. You are probably outside of your $GOPATH.
godep: [WARNING]: Current Directory: /tmp/go
godep: [WARNING]: $GOPATH: /tmp/go/vendor:/tmp/go-src
godep: WARNING: Godep workspaces (./Godeps/_workspace) are deprecated and support for them will be removed when go1.8 is released.
godep: WARNING: Go version (go1.11) & $GO15VENDOREXPERIMENT= wants to enable the vendor experiment, but disabling because a Godep workspace (Godeps/_workspace) exists
# _/tmp/go
/usr/lib/go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
/tmp/go-link-977644414/go.o:(.data+0x8): undefined reference to `x_cgo_callers'
/tmp/go-link-977644414/go.o:(.data+0x10): undefined reference to `x_cgo_init'
/tmp/go-link-977644414/go.o:(.data+0x18): undefined reference to `x_cgo_mmap'
/tmp/go-link-977644414/go.o:(.data+0x20): undefined reference to `x_cgo_munmap'
/tmp/go-link-977644414/go.o:(.data+0x28): undefined reference to `x_cgo_notify_runtime_init_done'
/tmp/go-link-977644414/go.o:(.data+0x30): undefined reference to `x_cgo_sigaction'
/tmp/go-link-977644414/go.o:(.data+0x38): undefined reference to `x_cgo_thread_start'
/tmp/go-link-977644414/go.o:(.data+0x160): undefined reference to `x_cgo_setenv'
/tmp/go-link-977644414/go.o:(.data+0x168): undefined reference to `x_cgo_unsetenv'
/tmp/go-link-977644414/go.o:(.data+0x170): undefined reference to `_cgo_yield'
collect2: error: ld returned 1 exit status
godep: go exit status 2
When trying to run make docker-debug, I get the following recursive 400 Bad Request response even though no request was issued.
> Tue Aug 9 11:52:22 2016
receiver got: Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><cen
> Tue Aug 9 11:52:22 2016
receiver got: : text/html
Content-Length: 178
Connection: close
Server: api-gateway/1.9.3.1
make docker-compose also fails.
make docker-run works as expected.
Add another make test
directive in the Makefile
for executing the unit tests found in api-gateway-config/tests
folder. The idea with this folder is that when extending the container and maybe add more scripts to a custom configuration, it would be great to run tests against those scripts. That's what really ensures the quality.
Eventually we can also consider running these tests as part of the Docker build.
If we can have the API Gateway pulling from S3 the folder api-gateway-config
we get the flexibility to easily run it with different configurations without building a new container.
The alternative approach would be to have the sync'ing in a separate container but that's a little more complicated to handle in Mesos which is currently lacking Pods support. When Pods-like concepts get implemented then we can extract this code into its own container.
Currently the worker_connections
directive is set to 1000
which is a low number when worker_processes
is set to 1
as NGINX would only accept 1000
concurrent connections.
We could increase the setting to maybe 2^14
which is 16384
or 2^15
which is 32768
in order to facilitate benchmarks. I would suggest 2^14
to be in alignment with TechEmpower's benchmark: https://github.com/TechEmpower/FrameworkBenchmarks/blob/master/frameworks/Lua/openresty/nginx.conf
Since it's not easy to come up with a number that fits all cases, for production use-cases it's best to provide a different api-gateway-config
directory that would tune these setting as per the expected workload.
This doesn't work "env": { "MARATHON_HOST": "http://marathon:8080/" }
Hey guys,
we've hit an issue with requests that take more than 10s.
The proxy_read_timeout
is set at 10 seconds in the nginx server of apigateway and can not be changed via a setting in the dcos package.
https://git.corp.adobe.com/adobe-platform/dcos-universe-private/tree/master/repo/packages/A/apigateway/3
We can confirm that calls over 10s are getting 504 results.
We can't assume our API calls take less than 10s.
Could you please add this as an configurable parameter or provide a workaround for calls >10s?
193.105.140.131 - - [20/Apr/2017:07:59:12 +0000] request="GET /api/v1/072449F857E4EA160A49411B%40AdobeOrg/connections/58e74daea90440000ee5539a/objects HTTP/1.1" api_key="" status=504 bbs=84 rl=2025 rt=10.001 hr="http://connectorsrest-dev-c3ddb09d52--cr.gw.dev.mc.adobe.net/docs/" ua="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" xfwdf="-" upadd="10.13.100.7:26856" upstat=504 uprt="10.001" sid="connectorsrest-dev-c3ddb09d52--cr" sname="TBD" reqid=qGMkwjo5hR9ZeAOFNFEzaLQVnfnKv3dp
193.105.140.131 - - [20/Apr/2017:07:59:48 +0000] request="GET /api/v1/072449F857E4EA160A49411B%40AdobeOrg/connections/58e74daea90440000ee5539a/objects HTTP/1.1" api_key="" status=504 bbs=84 rl=2068 rt=10.002 hr="http://connectorsrest-dev-c3ddb09d52--cr.gw.dev.mc.adobe.net/docs/" ua="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" xfwdf="-" upadd="10.13.100.7:26856" upstat=504 uprt="10.002" sid="connectorsrest-dev-c3ddb09d52--cr" sname="TBD" reqid=ce6VTzuqWWdGKaRzIDiX3ChKfB60dCFw
193.105.140.131 - - [20/Apr/2017:08:06:17 +0000] request="GET /api/v1/072449F857E4EA160A49411B%40AdobeOrg/connections/58e74daea90440000ee5539a/objects HTTP/1.1" api_key="" status=504 bbs=84 rl=2068 rt=10.002 hr="http://connectorsrest-dev-c3ddb09d52--cr.gw.dev.mc.adobe.net/docs/" ua="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" xfwdf="-" upadd="10.13.100.7:26856" upstat=504 uprt="10.002" sid="connectorsrest-dev-c3ddb09d52--cr" sname="TBD" reqid=nfjnOGTldPSTDDqAyQeobSTvM5nAKMHP
193.105.140.131 - - [20/Apr/2017:09:33:18 +0000] request="GET /api/v1/072449F857E4EA160A49411B%40AdobeOrg/connections/58e74daea90440000ee5539a/objects HTTP/1.1" api_key="" status=504 bbs=84 rl=2062 rt=10.003 hr="http://connectorsrest-dev-c3ddb09d52--cr.gw.dev.mc.adobe.net/docs/" ua="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" xfwdf="-" upadd="10.13.100.7:7665" upstat=504 uprt="10.003" sid="connectorsrest-dev-c3ddb09d52--cr" sname="TBD" reqid=dtbTluSKImvdCgyodm2X6FXHCvMb1Ytq
193.105.140.131 - - [20/Apr/2017:12:27:04 +0000] request="GET /api/v1/072449F857E4EA160A49411B%40AdobeOrg/connections/58e74daea90440000ee5539a/objects HTTP/1.1" api_key="" status=504 bbs=84 rl=2062 rt=10.003 hr="http://connectorsrest-dev-c3ddb09d52--cr.gw.dev.mc.adobe.net/docs/" ua="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" xfwdf="-" upadd="10.13.100.7:7665" upstat=504 uprt="10.003" sid="connectorsrest-dev-c3ddb09d52--cr" sname="TBD" reqid=Pccf2KWrS0i2q6JqoKo9FkBSJofLOcdy
193.105.140.131 - - [20/Apr/2017:12:39:58 +0000] request="GET /api/v1/072449F857E4EA160A49411B%40AdobeOrg/connections/58e74daea90440000ee5539a/objects HTTP/1.1" api_key="" status=504 bbs=84 rl=2062 rt=10.003 hr="http://connectorsrest-dev-c3ddb09d52--cr.gw.dev.mc.adobe.net/docs/" ua="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" xfwdf="-" upadd="10.13.100.7:7665" upstat=504 uprt="10.003" sid="connectorsrest-dev-c3ddb09d52--cr" sname="TBD" reqid=VmOPIgZeqGGYsPV6uikbVZyfQpwSmQoy
193.105.140.131 - - [20/Apr/2017:12:53:07 +0000] request="GET /api/v1/072449F857E4EA160A49411B%40AdobeOrg/connections/58e74daea90440000ee5539a/objects HTTP/1.1" api_key="" status=504 bbs=84 rl=2062 rt=10.002 hr="http://connectorsrest-dev-c3ddb09d52--cr.gw.dev.mc.adobe.net/docs/" ua="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" xfwdf="-" upadd="10.13.100.7:7665" upstat=504 uprt="10.002" sid="connectorsrest-dev-c3ddb09d52--cr" sname="TBD" reqid=kEifTYGn7SnmFIKpfQtFUlNCWgJIa6fq
193.105.140.131 - - [20/Apr/2017:12:53:07 +0000] request="GET /api/v1/072449F857E4EA160A49411B%40AdobeOrg/connections/58e74daea90440000ee5539a/objects HTTP/1.1" api_key="" status=504 bbs=84 rl=2062 rt=10.001 hr="http://connectorsrest-dev-c3ddb09d52--cr.gw.dev.mc.adobe.net/docs/" ua="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" xfwdf="-" upadd="10.13.100.7:7665" upstat=504 uprt="10.001" sid="connectorsrest-dev-c3ddb09d52--cr" sname="TBD" reqid=n3ONgAcNjbZmTvWz3qCznhGJXCFOq1nH
127.0.0.1 - - [20/Apr/2017:13:21:18 +0000] request="GET /api/v1/072449F857E4EA160A49411B%40AdobeOrg/connections/58e74daea90440000ee5539a/objects HTTP/1.1" api_key="" status=504 bbs=84 rl=2028 rt=10.002 hr="http://connectorsrest-dev-c3ddb09d52--cr.gw.dev.mc.adobe.net/docs/" ua="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" xfwdf="-" upadd="10.13.100.7:7665" upstat=504 uprt="10.002" sid="connectorsrest-dev-c3ddb09d52--cr" sname="TBD" reqid=ApJD6zgwOkkwpQLqgcRVDzgELzqFxWWJ
After turning on basic auth, the APIgateway no longer sends traffic to leader properly and fails.
I get the basic auth prompt and log in successfully but then all calls to /master/state
return a 500 error
ubuntu 15.10 error is like this
Executing busybox-1.23.2-r0.trigger
Executing ca-certificates-20150426-r3.trigger
1 errors; 260 MiB in 70 packages
The command '/bin/sh -c apk update && apk add gcc tar libtool zlib jemalloc jemalloc-dev perl make musl-dev openssl-dev pcre-dev g++ zlib-dev curl python perl-test-longstring perl-list-moreutils perl-http-message' returned a non-zero code: 1
Makefile:5: recipe for target 'docker' failed
make: *** [docker] Error 1
failure point exec: "gcc": executable file not found in $PATH
full trace
Step 16 : RUN echo " ... installing api-gateway-config-supervisor ... " && echo "http://dl-4.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories && apk update && apk add make git go && mkdir -p /tmp/api-gateway && curl -k -L https://github.com/adobe-apiplatform/api-gateway-config-supervisor/archive/${CONFIG_SUPERVISOR_VERSION}.tar.gz -o /tmp/api-gateway/api-gateway-config-supervisor-${CONFIG_SUPERVISOR_VERSION}.tar.gz && cd /tmp/api-gateway && tar -xf /tmp/api-gateway/api-gateway-config-supervisor-${CONFIG_SUPERVISOR_VERSION}.tar.gz && mkdir -p /tmp/go && mv /tmp/api-gateway/api-gateway-config-supervisor-${CONFIG_SUPERVISOR_VERSION}/* /tmp/go && cd /tmp/go && make setup && mkdir -p /tmp/go/Godeps/_workspace && ln -s /tmp/go/vendor /tmp/go/Godeps/_workspace/src && mkdir -p /tmp/go-src/src/github.com/adobe-apiplatform && ln -s /tmp/go /tmp/go-src/src/github.com/adobe-apiplatform/api-gateway-config-supervisor && GOPATH=/tmp/go/vendor:/tmp/go-src CGO_ENABLED=0 GOOS=linux /usr/lib/go/bin/godep go build -ldflags "-s" -a -installsuffix cgo -o api-gateway-config-supervisor ./ && mv /tmp/go/api-gateway-config-supervisor /usr/local/sbin/ && echo "installing rclone sync ... " && go get github.com/ncw/rclone && mv /usr/lib/go/bin/rclone /usr/local/sbin/ && echo " cleaning up ... " && rm -rf /usr/lib/go/bin/src && rm -rf /tmp/go && rm -rf /tmp/go-src && rm -rf /usr/lib/go/bin/pkg/ && rm -rf /usr/lib/go/bin/godep && apk del make git go && rm -rf /var/cache/apk/*
---> Running in 5f1b4896b50c
... installing api-gateway-config-supervisor ...
fetch http://dl-cdn.alpinelinux.org/alpine/v3.4/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.4/community/x86_64/APKINDEX.tar.gz
fetch http://dl-4.alpinelinux.org/alpine/edge/community/x86_64/APKINDEX.tar.gz
v3.4.3-2-g595ce63 [http://dl-cdn.alpinelinux.org/alpine/v3.4/main]
v3.4.2-11-g9b41a63 [http://dl-cdn.alpinelinux.org/alpine/v3.4/community]
v3.4.0-2052-g56f675a [http://dl-4.alpinelinux.org/alpine/edge/community]
OK: 6867 distinct packages available
(1/2) Installing git (2.8.3-r0)
(2/2) Installing go (1.7_rc4-r0)
Executing busybox-1.24.2-r9.trigger
OK: 312 MiB in 58 packages
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 154 0 154 0 0 371 0 --:--:-- --:--:-- --:--:-- 372
100 4Step 16 : RUN echo " ... installing api-gateway-config-supervisor ... " && echo "http://dl-4.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories && apk update && apk add make git go && mkdir -p /tmp/api-gateway && curl -k -L https://github.com/adobe-apiplatform/api-gateway-config-supervisor/archive/${CONFIG_SUPERVISOR_VERSION}.tar.gz -o /tmp/api-gateway/api-gateway-config-supervisor-${CONFIG_SUPERVISOR_VERSION}.tar.gz && cd /tmp/api-gateway && tar -xf /tmp/api-gateway/api-gateway-config-supervisor-${CONFIG_SUPERVISOR_VERSION}.tar.gz && mkdir -p /tmp/go && mv /tmp/api-gateway/api-gateway-config-supervisor-${CONFIG_SUPERVISOR_VERSION}/* /tmp/go && cd /tmp/go && make setup && mkdir -p /tmp/go/Godeps/_workspace && ln -s /tmp/go/vendor /tmp/go/Godeps/_workspace/src && mkdir -p /tmp/go-src/src/github.com/adobe-apiplatform && ln -s /tmp/go /tmp/go-src/src/github.com/adobe-apiplatform/api-gateway-config-supervisor && GOPATH=/tmp/go/vendor:/tmp/go-src CGO_ENABLED=0 GOOS=linux /usr/lib/go/bin/godep go build -ldflags "-s" -a -installsuffix cgo -o api-gateway-config-supervisor ./ && mv /tmp/go/api-gateway-config-supervisor /usr/local/sbin/ && echo "installing rclone sync ... " && go get github.com/ncw/rclone && mv /usr/lib/go/bin/rclone /usr/local/sbin/ && echo " cleaning up ... " && rm -rf /usr/lib/go/bin/src && rm -rf /tmp/go && rm -rf /tmp/go-src && rm -rf /usr/lib/go/bin/pkg/ && rm -rf /usr/lib/go/bin/godep && apk del make git go && rm -rf /var/cache/apk/*
---> Running in 5f1b4896b50c
... installing api-gateway-config-supervisor ...
fetch http://dl-cdn.alpinelinux.org/alpine/v3.4/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.4/community/x86_64/APKINDEX.tar.gz
fetch http://dl-4.alpinelinux.org/alpine/edge/community/x86_64/APKINDEX.tar.gz
v3.4.3-2-g595ce63 [http://dl-cdn.alpinelinux.org/alpine/v3.4/main]
v3.4.2-11-g9b41a63 [http://dl-cdn.alpinelinux.org/alpine/v3.4/community]
v3.4.0-2052-g56f675a [http://dl-4.alpinelinux.org/alpine/edge/community]
OK: 6867 distinct packages available
(1/2) Installing git (2.8.3-r0)
(2/2) Installing go (1.7_rc4-r0)
Executing busybox-1.24.2-r9.trigger
OK: 312 MiB in 58 packages
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 154 0 154 0 0 371 0 --:--:-- --:--:-- --:--:-- 372
100 49861 0 49861 0 0 56512 0 --:--:-- --:--:-- --:--:-- 347k
go get github.com/tools/godep
# runtime/cgo
exec: "gcc": executable file not found in $PATH
make: *** [setup] Error 2
Makefile:6: recipe for target 'setup' failed
The command '/bin/sh -c echo " ... installing api-gateway-config-supervisor ... " && echo "http://dl-4.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories && apk update && apk add make git go && mkdir -p /tmp/api-gateway && curl -k -L https://github.com/adobe-apiplatform/api-gateway-config-supervisor/archive/${CONFIG_SUPERVISOR_VERSION}.tar.gz -o /tmp/api-gateway/api-gateway-config-supervisor-${CONFIG_SUPERVISOR_VERSION}.tar.gz && cd /tmp/api-gateway && tar -xf /tmp/api-gateway/api-gateway-config-supervisor-${CONFIG_SUPERVISOR_VERSION}.tar.gz && mkdir -p /tmp/go && mv /tmp/api-gateway/api-gateway-config-supervisor-${CONFIG_SUPERVISOR_VERSION}/* /tmp/go && cd /tmp/go && make setup && mkdir -p /tmp/go/Godeps/_workspace && ln -s /tmp/go/vendor /tmp/go/Godeps/_workspace/src && mkdir -p /tmp/go-src/src/github.com/adobe-apiplatform && ln -s /tmp/go /tmp/go-src/src/github.com/adobe-apiplatform/api-gateway-config-supervisor && GOPATH=/tmp/go/vendor:/tmp/go-src CGO_ENABLED=0 GOOS=linux /usr/lib/go/bin/godep go build -ldflags "-s" -a -installsuffix cgo -o api-gateway-config-supervisor ./ && mv /tmp/go/api-gateway-config-supervisor /usr/local/sbin/ && echo "installing rclone sync ... " && go get github.com/ncw/rclone && mv /usr/lib/go/bin/rclone /usr/local/sbin/ && echo " cleaning up ... " && rm -rf /usr/lib/go/bin/src && rm -rf /tmp/go && rm -rf /tmp/go-src && rm -rf /usr/lib/go/bin/pkg/ && rm -rf /usr/lib/go/bin/godep && apk del make git go && rm -rf /var/cache/apk/*' returned a non-zero code: 2
make: *** [docker] Error 2
```9861 0 49861 0 0 56512 0 --:--:-- --:--:-- --:--:-- 347k
go get github.com/tools/godep
# runtime/cgo
exec: "gcc": executable file not found in $PATH
make: *** [setup] Error 2
Makefile:6: recipe for target 'setup' failed
The command '/bin/sh -c echo " ... installing api-gateway-config-supervisor ... " && echo "http://dl-4.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories && apk update && apk add make git go && mkdir -p /tmp/api-gateway && curl -k -L https://github.com/adobe-apiplatform/api-gateway-config-supervisor/archive/${CONFIG_SUPERVISOR_VERSION}.tar.gz -o /tmp/api-gateway/api-gateway-config-supervisor-${CONFIG_SUPERVISOR_VERSION}.tar.gz && cd /tmp/api-gateway && tar -xf /tmp/api-gateway/api-gateway-config-supervisor-${CONFIG_SUPERVISOR_VERSION}.tar.gz && mkdir -p /tmp/go && mv /tmp/api-gateway/api-gateway-config-supervisor-${CONFIG_SUPERVISOR_VERSION}/* /tmp/go && cd /tmp/go && make setup && mkdir -p /tmp/go/Godeps/_workspace && ln -s /tmp/go/vendor /tmp/go/Godeps/_workspace/src && mkdir -p /tmp/go-src/src/github.com/adobe-apiplatform && ln -s /tmp/go /tmp/go-src/src/github.com/adobe-apiplatform/api-gateway-config-supervisor && GOPATH=/tmp/go/vendor:/tmp/go-src CGO_ENABLED=0 GOOS=linux /usr/lib/go/bin/godep go build -ldflags "-s" -a -installsuffix cgo -o api-gateway-config-supervisor ./ && mv /tmp/go/api-gateway-config-supervisor /usr/local/sbin/ && echo "installing rclone sync ... " && go get github.com/ncw/rclone && mv /usr/lib/go/bin/rclone /usr/local/sbin/ && echo " cleaning up ... " && rm -rf /usr/lib/go/bin/src && rm -rf /tmp/go && rm -rf /tmp/go-src && rm -rf /usr/lib/go/bin/pkg/ && rm -rf /usr/lib/go/bin/godep && apk del make git go && rm -rf /var/cache/apk/*' returned a non-zero code: 2
make: *** [docker] Error 2
this should include validation messages
I run apigateway w/o Marathon and Mesos. After I edited /etc/host and added the upstream entry manually into /etc/api-gateway/environment.conf.d/api-gateway-upstreams.http.conf
upstream microservice {
server microservice:8080 fail_timeout=10s;
keepalive 16;
}
I could access my microservice via http://microservice.api.localhost/.
However, I couldn't figure out a way to proxy HTTPs request to another service listening on port 443. Does apigateway support HTTPs access?
The apigateway
container needs to run with root
privileges as some of the commands executed inside the container are executed by root
. Example here.
One way to fix this would be to create a new user beside the api-gateway
one, in the same usergroup, and only execute commands inside container with these two existing users.
Add zeromq
lib, czmq
lib, api-gateway-zmq-adator
and api-gateway-async-logger
Starting with Marathon 0.10.1 API Requests default to application/json and the auto-discovery scripts should ensure they add the correct Accept
header
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.