florianf / tileoven Goto Github PK
View Code? Open in Web Editor NEWThis project forked from tilemill-project/tilemill
TileOven a maintained fork of TileMill
Home Page: http://tilemill.com
License: BSD 3-Clause "New" or "Revised" License
This project forked from tilemill-project/tilemill
TileOven a maintained fork of TileMill
Home Page: http://tilemill.com
License: BSD 3-Clause "New" or "Revised" License
What do I do here?
$ ./index.js
util.js:988
throw new TypeError('The super constructor to "inherits" must not ' +
^
TypeError: The super constructor to "inherits" must not be null or undefined
at Object.inherits (util.js:988:11)
at Object.<anonymous> (/Users/jb/Documents/tmp/leaflet/tileoven/node_modules/tilelive/lib/scheme.js:6:17)
at Module._compile (module.js:573:30)
at Object.Module._extensions..js (module.js:584:10)
at Module.load (module.js:507:32)
at tryModuleLoad (module.js:470:12)
at Function.Module._load (module.js:462:3)
at Module.require (module.js:517:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/Users/jb/Documents/tmp/leaflet/tileoven/node_modules/tilelive/lib/copytask.js:4:14)
$ node --version
v8.4.0
I'm an osm-carto developer and I work with Kosmtik, but I was interested if Tile Mill could be still used, because some people are still interested in it.
I managed to run Tile Oven on Ubuntu 17.10 and test projects were OK, but when I tried osm-carto, I got this error:
[tilemill] Started [Server Core:20009].
[tilemill] [tilemill] skipped loading project: Error: Could not open project.mml file for "openstreetmap-carto". Error was:
[tilemill]
[tilemill] "Unexpected token s in JSON at position 0"
[tilemill]
[tilemill] (in /home/kocio/Dokumenty/MapBox/project/openstreetmap-carto/project.mml)
After cloning into local directory, running 'npm install' produces the errors below. Unable to start Tileoven.
[email protected] install /Users//Development/Tilemill/tileoven_new/node_modules/contextify
node-gyp rebuild
CXX(target) Release/obj.target/contextify/src/contextify.o
../src/contextify.cc:131:56: warning: 'NewInstance' is deprecated [-Wdeprecated-declarations]
Local wrapper = Nan::New(constructor)->NewInstance();
^
/Users//.node-gyp/9.10.1/include/node/v8.h:3898:3: note: 'NewInstance' has been explicitly marked
deprecated here
V8_DEPRECATED("Use maybe version", Local NewInstance() const);
^
/Users//.node-gyp/9.10.1/include/node/v8config.h:321:29: note: expanded from macro 'V8_DEPRECATED'
declarator attribute((deprecated))
^
../src/contextify.cc:150:16: error: no member named 'SetAccessCheckCallbacks' in 'v8::ObjectTemplate'
otmpl->SetAccessCheckCallbacks(GlobalPropertyNamedAccessCheck,
~~~~~ ^
../src/contextify.cc:182:51: warning: 'GetRealNamedProperty' is deprecated [-Wdeprecated-declarations]
Local rv = Nan::New(ctx->sandbox)->GetRealNamedProperty(property);
^
/Users//.node-gyp/9.10.1/include/node/v8.h:3450:3: note: 'GetRealNamedProperty' has been explicitly
marked deprecated here
V8_DEPRECATED("Use maybe version",
^
/Users//.node-gyp/9.10.1/include/node/v8config.h:321:29: note: expanded from macro 'V8_DEPRECATED'
declarator attribute((deprecated))
^
../src/contextify.cc:209:38: warning: 'GetRealNamedProperty' is deprecated [-Wdeprecated-declarations]
if (!Nan::New(ctx->sandbox)->GetRealNamedProperty(property).IsEmpty() ||
^
/Users//.node-gyp/9.10.1/include/node/v8.h:3450:3: note: 'GetRealNamedProperty' has been explicitly
marked deprecated here
V8_DEPRECATED("Use maybe version",
^
/Users//.node-gyp/9.10.1/include/node/v8config.h:321:29: note: expanded from macro 'V8_DEPRECATED'
declarator attribute((deprecated))
^
../src/contextify.cc:210:42: warning: 'GetRealNamedProperty' is deprecated [-Wdeprecated-declarations]
!Nan::New(ctx->proxyGlobal)->GetRealNamedProperty(property).IsEmpty()) {
^
/Users//.node-gyp/9.10.1/include/node/v8.h:3450:3: note: 'GetRealNamedProperty' has been explicitly
marked deprecated here
V8_DEPRECATED("Use maybe version",
^
/Users//.node-gyp/9.10.1/include/node/v8config.h:321:29: note: expanded from macro 'V8_DEPRECATED'
declarator attribute((deprecated))
^
4 warnings and 1 error generated.
make: *** [Release/obj.target/contextify/src/contextify.o] Error 1
gyp ERR! build error
gyp ERR! stack Error: make
failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:258:23)
gyp ERR! stack at ChildProcess.emit (events.js:180:13)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:209:12)
gyp ERR! System Darwin 16.7.0
gyp ERR! command "/usr/local/Cellar/node/9.10.1/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /Users//Development/Tilemill/tileoven_new/node_modules/contextify
gyp ERR! node -v v9.10.1
gyp ERR! node-gyp -v v3.6.2
gyp ERR! not ok
npm WARN [email protected] No license field.
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] install: node-gyp rebuild
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
I downloaded the code today. Install seemed to complete fine, although there were a lot of warnings in part of the output ..
npm WARN package.json [email protected] 'repositories' (plural) Not supported. Please pick one as the 'repository' field
npm WARN package.json [email protected] No repository field.
npm WARN package.json [email protected] No description
npm WARN package.json [email protected] No repository field.
npm WARN package.json [email protected] No repository field.
npm WARN package.json [email protected] No repository field.
npm WARN package.json [email protected] No repository field.
npm WARN package.json [email protected] No repository field.
npm WARN package.json [email protected] No description
npm WARN package.json [email protected] No repository field.
npm WARN package.json [email protected] 'repositories' (plural) Not supported. Please pick one as the 'repository' field
npm WARN package.json [email protected] string_decoder is also the name of a node core module.
npm WARN package.json [email protected] No repository field.
npm WARN package.json [email protected] No description
Versions ..
$ npm --version
3.5.2
$ node --version
v4.2.6
$ nodejs --version
v4.2.6
Results of test ..
$ npm test
> [email protected] test /home/david/tileoven
> mocha --timeout 100000
Creating configuration dir /home/david/tileoven/test/fixtures/files/.tilemill
Creating export dir /home/david/tileoven/test/fixtures/files/export
Creating cache dir /home/david/tileoven/test/fixtures/files/cache
Plugin [carto] loaded.
Plugin [editor] loaded.
Plugin [fonts] loaded.
Plugin [templates] loaded.
Started [Server Core:20009].
Started [Server Tile:20008].
abilities
Note: Unknown option "host" in config file.
Plugin [carto] loaded.
Plugin [editor] loaded.
Plugin [fonts] loaded.
Plugin [templates] loaded.
Started [Server Core:20009].
Started [Server Tile:20008].
✓ GET should return JSON
config
Note: Unknown option "host" in config file.
Plugin [carto] loaded.
Plugin [editor] loaded.
Plugin [fonts] loaded.
Plugin [templates] loaded.
Started [Server Core:20009].
Started [Server Tile:20008].
✓ GET should return JSON (85ms)
✓ PUT should update config
✓ GET should return updated config
✓ PUT should 409 on invalid config
1) DELETE should 409
datasource
2) "before all" hook
3) "after all" hook
config loading pwnage
✓ there should only be one optimist module otherwise you are hosed (850ms)
✓ there should only be one sqlite3 module otherwise you are hosed (837ms)
✓ there should only be one mapnik module otherwise you are hosed (827ms)
export
Note: Unknown option "host" in config file.
Plugin [carto] loaded.
Plugin [editor] loaded.
Plugin [fonts] loaded.
Plugin [templates] loaded.
Started [Server Core:20009].
Started [Server Tile:20008].
✓ PUT should create export job
✓ GET should retrieve export job
4) DELETE should stop export job
✓ PUT create export job spanning the anti-meridian
[tilemill-ui] Exporting format: mbtiles
[tilemill-ui] Exporting format: mbtiles
[tilemill-ui] Rendering export
[tilemill-ui] Persisting state in /home/david/tileoven/test/fixtures/files/export/demo_anti-meridian.export every minute
[tilemill-ui] Persisting state in /home/david/tileoven/test/fixtures/files/export/demo_anti-meridian.export every minute
[tilemill-ui] Completing export process
[tilemill-ui] Exiting process [tm-demo_anti-meridian.mbtiles]
{ progress: 1,
status: 'complete',
id: '14771157350301',
format: 'mbtiles',
project: 'demo_01',
tile_format: 'png',
filename: 'demo_anti-meridian.mbtiles',
bbox: [ 175, 31.8402, -175, 71.9245 ],
minzoom: 0,
maxzoom: 2,
pid: 22652,
created: 1477115738588,
remaining: 0,
updated: 1477115754039,
rate: 40 }
✓ GET anti-meridian job to see if it succeeded (16173ms)
5) DELETE should remove anti-meridian export job
6) GET should find no export jobs
project
Note: Unknown option "host" in config file.
Plugin [carto] loaded.
Plugin [editor] loaded.
Plugin [fonts] loaded.
Plugin [templates] loaded.
Started [Server Core:20009].
Started [Server Tile:20008].
✓ collection should list projects
✓ model should load JSON
✓ model should not have an update
✓ model should have an update
✓ PUT should create a project
✓ GET should load created project
7) DELETE should remove project
✓ PUT should fail with invalid id
✓ PUT should fail with invalid stylesheet
tile endpoint
Note: Unknown option "host" in config file.
Plugin [carto] loaded.
Plugin [editor] loaded.
Plugin [fonts] loaded.
Plugin [templates] loaded.
Started [Server Core:20009].
Started [Server Tile:20008].
✓ should 404 for missing project
✓ should 200 (tile) for existing project (86ms)
✓ should 200 (grid) for existing project (75ms)
23 passing (20s)
7 failing
1) config DELETE should 409:
Uncaught Error: socket hang up
at createHangUpError (_http_client.js:202:15)
at Socket.socketOnEnd (_http_client.js:287:23)
at endReadableNT (_stream_readable.js:905:12)
2) datasource "before all" hook:
Uncaught Error: Command failed: /bin/sh -c psql -d postgres -c "DROP DATABASE IF EXISTS tilemill_test;" ; createdb -E UTF8 -T template_postgis tilemill_test ; psql -d tilemill_test -f /home/david/tileoven/test/fixtures/tilemill_test.sql
psql: FATAL: role "david" does not exist
createdb: could not connect to database template1: FATAL: role "david" does not exist
psql: FATAL: role "david" does not exist
at ChildProcess.exithandler (child_process.js:213:12)
at maybeClose (internal/child_process.js:821:16)
at Process.ChildProcess._handle.onexit (internal/child_process.js:211:5)
3) datasource "after all" hook:
TypeError: Cannot read property 'close' of undefined
at Context.<anonymous> (test/datasource.test.js:24:9)
4) export DELETE should stop export job:
Uncaught Error: socket hang up
at createHangUpError (_http_client.js:202:15)
at Socket.socketOnEnd (_http_client.js:287:23)
at endReadableNT (_stream_readable.js:905:12)
5) export DELETE should remove anti-meridian export job:
Uncaught Error: socket hang up
at createHangUpError (_http_client.js:202:15)
at Socket.socketOnEnd (_http_client.js:287:23)
at endReadableNT (_stream_readable.js:905:12)
6) export GET should find no export jobs:
Uncaught AssertionError: [] deepEqual [ { progress: 0,
status: 'processing',
id: '1477115735030',
format: 'mbtiles',
project: 'demo_01',
tile_form
+ expected - actual
-[]
+[
+ {
+ "bbox": [
+ -29.5642
+ 31.8402
+ 42.1545
+ 71.9245
+ ]
+ "created": 1477115738570
+ "filename": "demo_01.mbtiles"
+ "format": "mbtiles"
+ "id": "1477115735030"
+ "maxzoom": 2
+ "minzoom": 0
+ "pid": 22647
+ "progress": 0
+ "project": "demo_01"
+ "status": "processing"
+ "tile_format": "png"
+ }
+ {
+ "bbox": [
+ 175
+ 31.8402
+ -175
+ 71.9245
+ ]
+ "created": 1477115738588
+ "filename": "demo_anti-meridian.mbtiles"
+ "format": "mbtiles"
+ "id": "14771157350301"
+ "maxzoom": 2
+ "minzoom": 0
+ "pid": 22652
+ "progress": 1
+ "project": "demo_01"
+ "rate": 40
+ "remaining": 0
+ "status": "complete"
+ "tile_format": "png"
+ "updated": 1477115754039
+ }
+]
at test/export.test.js:162:16
at IncomingMessage.<anonymous> (test/support/start.js:165:13)
at endReadableNT (_stream_readable.js:905:12)
7) project DELETE should remove project:
Uncaught Error: socket hang up
at createHangUpError (_http_client.js:202:15)
at Socket.socketOnEnd (_http_client.js:287:23)
at endReadableNT (_stream_readable.js:905:12)
npm ERR! Test failed. See above for more details.
I wonder how does the tileoven project know how many threads to create while doing an export of a project?
From my experimentation, I found it to be 1.5 times the number of cpu cores available in the system. But that is just an empirical value. It would be great if someone could point me to the relevant resource.
BTW, I fiddled with --concurrent
but that doesn't impact the number of threads that are created for exporting a project.
Thanks.
I have a layer with a Postgis query that works on Tilemill, but fails in Tileoven.
Here's the error:
Postgis Plugin: ERROR: syntax error at or near "WHERE"
LINE 1: SELECT ST_SRID("way") AS srid FROM ( WHERE "way" IS NOT NU...
^
in executeQuery Full sql was: 'SELECT ST_SRID("way") AS srid FROM ( WHERE "way" IS NOT NULL LIMIT 1;'
encountered during parsing of layer 'barrier_points' in Layer
Here's the query:
( SELECT way, 'barrier' AS type,
( select degrees(ST_Azimuth(ST_StartPoint(inter), ST_EndPoint(inter))) from
( select ST_Intersection(r.way, ST_Buffer(p.way, 100)) as inter
from planet_osm_line r
where r.highway in ('motorway', 'trunk', 'primary','secondary', 'tertiary', 'residential', 'service', 'track', 'path', 'cycleway', 'footpath','unknown')
and r.way && ST_Buffer(p.way, 100) order by ST_Distance(r.way, p.way) limit 1 ) rr )
as angle
FROM planet_osm_point p
WHERE barrier IN ('gate', 'yes') )
AS data
Any ideas why?
This install worked on a fresh install of Ubuntu 18.04 (Aug 2018), and was tested using the Road Trip example.
# Install node package manager
sudo apt-get install npm
npm -v
3.5.2
node -v
v8.10.0
# In your home directory, download the tileover source code ..
cd ~
git clone https://github.com/florianf/tileoven.git
# Change to the directory created by the git clone ..
cd tileoven
# Install the tileoven package
npm install
# Install most fonts used in the Road Trip example ..
sudo apt-get install ttf-mscorefonts-installer
Run the package with nodejs ..
./index.js
Now, open up a browser on the same computer and open the URL ..
http://localhost:20009
Open the Road Trip project, and wait for map data to be downloaded.
You will eventually see a zoomable road map of the USA.
Run the 'Startup Applications' app (search for 'startup').
Add a new entry with the full path to index.js as the command, for example ..
The code that creates the MBTiles files is very solid. The most likely cause of failure is running out of memory, so run 'System Monitor' (search for 'monitor'). If the process regularly uses swap space, then add more memory to your computer if possible.
You will notice above that Tileoven is very good at using the full power of your hardware - utilising all available CPU cores.
Hello
Start tilemill with ./index.js --server=true --listenHost=0.0.0.0
But can't add any layers !
Alert info:
Unable to reach the local TileMill Server. Check the logs for details. If this problem persists please contact support at: http://support.mapbox.com/discussions/tilemill
Logs:
[tilemill] Error: Cannot find module 'npm'
[tilemill] at Function.Module._resolveFilename (module.js:325:15)
[tilemill] at Function.Module._load (module.js:276:25)
[tilemill] at Module.require (module.js:353:17)
[tilemill] at require (internal/module.js:12:17)
[tilemill] at server.updatesVersion (/home/tix/app/tileoven/servers/App.bones:144:15)
[tilemill] at callbacks (/home/tix/app/tileoven/node_modules/express/lib/router/index.js:272:11)
[tilemill] at param (/home/tix/app/tileoven/node_modules/express/lib/router/index.js:246:11)
[tilemill] at pass (/home/tix/app/tileoven/node_modules/express/lib/router/index.js:253:5)
[tilemill] at Router._dispatch (/home/tix/app/tileoven/node_modules/express/lib/router/index.js:280:5)
[tilemill] at Object.Router.middleware [as handle] (/home/tix/app/tileoven/node_modules/express/lib/router/index.js:45:10)
[tilemill] Error: Cannot find module 'npm'
[tilemill] at Function.Module._resolveFilename (module.js:325:15)
[tilemill] at Function.Module._load (module.js:276:25)
[tilemill] at Module.require (module.js:353:17)
[tilemill] at require (internal/module.js:12:17)
[tilemill] at server.updatesVersion (/home/tix/app/tileoven/servers/App.bones:144:15)
[tilemill] at callbacks (/home/tix/app/tileoven/node_modules/express/lib/router/index.js:272:11)
[tilemill] at param (/home/tix/app/tileoven/node_modules/express/lib/router/index.js:246:11)
[tilemill] at pass (/home/tix/app/tileoven/node_modules/express/lib/router/index.js:253:5)
[tilemill] at Router._dispatch (/home/tix/app/tileoven/node_modules/express/lib/router/index.js:280:5)
[tilemill] at Object.Router.middleware [as handle] (/home/tix/app/tileoven/node_modules/express/lib/router/index.js:45:10)
node -v
v4.4.4
npm -v
2.15.1
Where is the problem?
Hello,
how to configure, that it is possible to connect not only from localhost?
Can TileOven changes be in principle merged into upstream Tilemill repo and maintained there?
When I try to export a tilemill project using the following command,
./index.js export "all" --format=mbtiles --minzoom=0 --maxzoom=15 --metatile=16
I get the following error
test@test:/home/test/gitprojects/tileoven$ ./index.js export "all" all.mbtiles --format=mbtiles --minzoom=0 --maxzoom=15 --metatile=16
Note: Unknown option "updatesVersion" in config file.
Note: Unknown option "updatesTime" in config file.
Note: Unknown option "updates" in config file.
Note: Unknown option "profile" in config file.
Note: Unknown option "syncAccount" in config file.
Note: Unknown option "syncAccessToken" in config file.
Exporting format: mbtiles
Loading project... done.
Localizing project...[millstone] processing style 'style.mss'
[millstone] processing layer 'all'
[millstone] finished processing '/home/test/Documents/MapBox/project/all'
done.
Rendering export
Creating new job /home/test/gitprojects/tileoven/all.export
Persisting state in /home/test/gitprojects/tileoven/all.export every minute
Writing errors to /home/test/gitprojects/tileoven/all.export-failed
[7m 17s] Part(1/1) 0.3919% 1.54m/392.90m @ 83/s | 1d 6h 55m 9s left | ✓ 2.2k ■ 0 □ 1.54m fail 0Killed
To give you more idea about the project, I have around 200,000 points in the project.
I am using the following version of tilemill on Fedora 23, with 8GB of ram and i7-4600U CPU @ 2.10GHz processor.
Version 0.10.2 (v0.10.1-435-g8e0b257)
Copyright © 2010-2014 Mapbox, Inc.
Is there any workaround for this?
I had a similar issue with the tilemill-project and I have reported it there too
Thanks in advance and highly appreciate any response.
this could be handy, I think.
Installed tileoven following the instructions, and it all seems to work great. Also plugins are loaded (see below). Yet, I am missing the plugin panel. Is it just not there, or does this mean something is wrong with my install?
./index.js
Note: Unknown option "updatesVersion" in config file.
Note: Unknown option "updatesTime" in config file.
[tilemill] Starting in server mode.
[tilemill] Note: Unknown option "updatesVersion" in config file.
[tilemill] Note: Unknown option "updatesTime" in config file.
[tilemill] Started [Server Tile:20008].
[tilemill] Plugin [carto] loaded.
[tilemill] Plugin [editor] loaded.
[tilemill] Plugin [fonts] loaded.
[tilemill] Plugin [templates] loaded.
[tilemill] Started [Server Core:20009].
p.s. many thanks for making this available.
Hi Florianf,
I'd like to discuss with you the future of Tileoven and Tilemill, see if we can combine resources to keep pushing the product forward. Can you send me an email at sijitsma at gmail dot com?
Cheers,
Cory
Not really an issue as such...
but I've been trying to configure NGINX so I can access this remotely and just can't get it working. I currently have it working locally on port 8080 with the following config:
server {
listen 8080;
listen [::]:8080;
location /tile/ {
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:20008;
}
location /datasource/ {
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:20008;
}
location / {
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:20009;
}
}
When I try and access this remotely the tiles are all broken since they all have an address starting with 127.0.0.1:2008 (which, I gather, is taken from listenHost
in lib/config.defaults.json
), and that address makes no sense on a remote machine. I can't simply put my public IP address in since for various reasons I won't be able to open ports 20008 and 20009 (or, at least, I will be working in an environment where I can only work with ports 80 and 8080 for HTTP).
So, have you, or are you aware of somebody who has, got this working remotely? Basically, I'd like to throw this up on a CLI-only AWS instance and then access it remotely... and I'd like to use NGINX. Any tips you have would be most appreciated.
Cheers
I posted a similar issue with tilemill-project here: tilemill-project#2635
II reinstalled Tileoven using the standard install with one modification:
git clone https://github.com/florianf/tileoven.git
cd tileoven/
nvm use 8.11.3
npm install
The install works, Tileoven is running,however when I am using Tileoven, I get an error when trying to load large rasters (>5GB) or vrts.
Three scenarios happen when I attempt to load a large raster:
1.Zoom 0-8. Error message:
Message: console message: http://127.0.0.1:20009/assets/bones/all.js @5571: Invalid width for image dimensions requested
2. Zoom 9-11. My memory maxes out, switchs to swap, hangs my machine, then kills Tilemill with SIGKILL. The swap remains full after Tileoven dies
3. Zoom 12-20. Raster loads normally with NO errors and works fine.
I've tried a number of solutions so far but none have worked:
I suspect this map be an issue with with Mapnik and not Tileoven.
Any ideas where to go next?
It is similar with kosmtik/kosmtik#183
node-gyp rebuild
CXX(target) Release/obj.target/contextify/src/contextify.o
SOLINK_MODULE(target) Release/contextify.node
clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of OS X 10.9
[email protected] install /Users/bung/tileoven/node_modules/sqlite3
node-pre-gyp install --fallback-to-build
node :5.10.1
osx:10.11.5 (15F34)
I opened this issue: #18 in order to explore errors we were getting when trying to open large rasters in Tileoven. We solved it by updating the Mapnik version to 3.7.2 in the package.json
before installation.
Is this an update useful in the repo?
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.