blizzard / s2client-api Goto Github PK
View Code? Open in Web Editor NEWStarCraft II Client - C++ library supported on Windows, Linux and Mac designed for building scripted bots and research using the SC2API.
License: MIT License
StarCraft II Client - C++ library supported on Windows, Linux and Mac designed for building scripted bots and research using the SC2API.
License: MIT License
This looks like a typo. I think it should be BUILD_API_TESTS.
Test: 3sc232TestCancelBuildInProgressFactoryE failed!
Error: Expected order not in unit orders
Error: Expected unit does not exist.
Test: sc2::TestUnitCommand failed!
OS: macOS Sierra Version 10.12.6
Xcode: Version 8.3.3 (8E3004b)
I follow the official document to compile the repo and it occurs the following messages.
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:47:9: 'OSAtomicCompareAndSwap32' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_compare_exchange_strong_explicit(std::memory_order_relaxed) from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:61:13: 'OSAtomicCompareAndSwap32' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_compare_exchange_strong_explicit(std::memory_order_relaxed) from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:68:10: 'OSAtomicAdd32' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_fetch_add_explicit(std::memory_order_relaxed) from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:73:10: 'OSAtomicAdd32Barrier' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_fetch_add() from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:77:3: 'OSMemoryBarrier' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_thread_fence() from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:85:9: 'OSAtomicCompareAndSwap32Barrier' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_compare_exchange_strong() from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:138:9: 'OSAtomicCompareAndSwap64' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_compare_exchange_strong_explicit(std::memory_order_relaxed) from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:152:13: 'OSAtomicCompareAndSwap64' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_compare_exchange_strong_explicit(std::memory_order_relaxed) from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:159:10: 'OSAtomicAdd64' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_fetch_add_explicit(std::memory_order_relaxed) from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:164:10: 'OSAtomicAdd64Barrier' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_fetch_add() from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:173:9: 'OSAtomicCompareAndSwap64Barrier' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_compare_exchange_strong() from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:47:9: 'OSAtomicCompareAndSwap32' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_compare_exchange_strong_explicit(std::memory_order_relaxed) from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:61:13: 'OSAtomicCompareAndSwap32' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_compare_exchange_strong_explicit(std::memory_order_relaxed) from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:68:10: 'OSAtomicAdd32' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_fetch_add_explicit(std::memory_order_relaxed) from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:73:10: 'OSAtomicAdd32Barrier' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_fetch_add() from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:77:3: 'OSMemoryBarrier' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_thread_fence() from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:85:9: 'OSAtomicCompareAndSwap32Barrier' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_compare_exchange_strong() from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:138:9: 'OSAtomicCompareAndSwap64' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_compare_exchange_strong_explicit(std::memory_order_relaxed) from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:152:13: 'OSAtomicCompareAndSwap64' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_compare_exchange_strong_explicit(std::memory_order_relaxed) from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:159:10: 'OSAtomicAdd64' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_fetch_add_explicit(std::memory_order_relaxed) from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:164:10: 'OSAtomicAdd64Barrier' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_fetch_add() from <atomic> instead
/Users/gapry/Workspace/s2client-api/contrib/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h:173:9: 'OSAtomicCompareAndSwap64Barrier' is deprecated: first deprecated in macOS 10.12 - Use std::atomic_compare_exchange_strong() from <atomic> instead
I found this problem is one of issue of google protobuf. According the repo structure, it seems to have its own branch of protobuf, not just use official Google branch directly but I am not sure.
Finally, I have tried to use brew to install protobuf, here is my reference step but I still fail.
Function ControlImp::ResolveMap
searches for maps in relative path ..\..\..\maps
relative to executable/library. In case of any sort of non-standard configuration this relative path loses its meaning and becomes unusable. However just by changing working directory it's easy to make any other path working, so it'd be nice if maps could be loaded simply from working directory without any ..
When I open the VS files created by cmake, Visual Studio 2017 asks me if I want to update those files to 2017, since by default they are versioned to VS 2015. Luckily, 2017 can open and compile 2015 projects, but this may confuse people who are using the 2017 version, and I'm not sure what the consequences of clicking yes to that request are. This also means that my bot needs to be 2015 versioned.
Is there any plan to update those generated project / solution files to 2017? It would be great to hit the ground running with the newest version of VS
everybody
I can not find the API used StarCraft 2, download connection?
It'd be helpful to get the hash (or whatever unique id) of the current map in the gameinfo data.
Of course, the map is loaded based on what I supply as an argument to the game/API, but it'd feel much less flimsy and be more future-proof to get the actual hash of the map that the game ended up loading.
In my case I'd want this for caching: I spend something like 10 seconds generating all kinds of stuff from the terrain and unit information on game start, which I'd like to cache for next sessions by the map ID.
Especially important in realtime use, since that 10 seconds is subtracted from active play time.
When writing a bot, several unit types of a race are often required. It would be nice if the Race namespace had the following functions:
sc2::Race::GetTownHall(race) -> returns the UnitTypeID of Nexus if race == Protoss, for example
sc2::Race::GetSupplyProvider(race)
sc2::Race::GetWorker(race)
sc2::Race::GetRefinery(race)
It would also be quite nice to have something like an sc2::UnitType namespace, in which the following functions existed:
sc2::UnitType::IsTownHall(id)
sc2::UnitType::IsSupplyProvider(id)
sc2::UnitType::IsWorker(id)
sc2::UnitType::IsRefinery(id)
sc2::UnitType::IsGeyser(id)
sc2::UnitType::IsMineral(id)
sc2::UnitType::IsBuilding(id) -> whether the given type is a building
sc2::UnitType::WhatBuilds(id) -> id = barracks returns SCV, id = marine returns barracks, etc
Soon.
It is in ResponseGameInfo but is missing from sc2::GameInfo.
For Random enemy players, make sure it is not giving away their race.
eg. A Barracks requires a supply depot. An infestor requires an infestation pit.
There may be cases where something requires an upgrade?
In the short term, possible hard code a map of all these dependencies.
I cloned the repository and started with the docs. After the first tutorial I wanted to compile the code using the gcc compiler on windows:
gcc -Wall -c -I../include/ tutorial.cc -std=c++11
When I use this command the gcc has a fatal error:
In file included from ../include/sc2api/sc2_unit.h:6:0, from ../include/sc2api/sc2_interfaces.h:13, from ../include/sc2api/sc2_api.h:3, from tutorial.cc:1: ../include/sc2api/sc2_proto_interface.h:5:23: fatal error: sc2api.pb.h: No such file or directory compilation terminated.
The sc2_proto_interface.h file includes the sc2api.pb.h file, that is not in the repository. Is the file in the SC2 dir? If so how should I change my command for compile my code.
EDIT:
found this https://us.battle.net/forums/en/sc2/topic/20758537485 and they found a solution for using the make command on linux. What can I do on windows?
Can't find an entry in UPGRADE_ID for this:
➜ build cmake ../ -G Xcode
-- The C compiler identification is AppleClang 8.1.0.8020042
-- The CXX compiler identification is AppleClang 8.1.0.8020042
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Error at contrib/civetweb/cmake/DetermineTargetArchitecture.cmake:30 (execute_process):
execute_process attempted to output into a file: into a source directory.
Call Stack (most recent call first):
contrib/civetweb/CMakeLists.txt:37 (determine_target_architecture)
-- Configuring incomplete, errors occurred!
See also "/Users/lin/s2client-api/CMakeFiles/CMakeOutput.log".
See also "/Users/lin/s2client-api/CMakeFiles/CMakeError.log".
Some attacks (like widow mines afaik) do extra damage vs shields. As far as I can tell, that is not a unit attribute in the api, and the damage bonus can therefore not be parsed from the weapon.
Right now you can only build a refinery based on the unit tag of the geyser, not the position of the geyser itself. Would be nice if the build command on a position also allowed the construction.
Unit and Ability already have 0 reserved as NULL, but there is no enum entry for it.
We forgot to reserve 0 for Upgrade/Buff. We should change the id mapping for 0 and then also add a NULL entry to those enums.
This is the conitunuation of the issue "How to build the API" #73
Had an issue building the feature_layer example due to a missing dependency.
When I edited the following code at line 45:
target_link_libraries(feature_layers sc2api sc2utils sc2renderer)
to target_link_libraries(feature_layers sc2api sc2utils sc2renderer libvcruntime)
It resolved the issue.
I've started looking at creating an install target for the api. The main problem right now is that civetweb always tries to install its executable along with it's library component. You currently disable building the executable using the EXCLUDE_FROM_ALL property, but that doesn't disable it from trying to install when we run make (and generates a warning like you mention a few lines above it). As far as I can tell, this is the only real barrier to creating a decent install target.
I see a couple of options, though, one which involves installing into the cmake binary dir and then we reinstall the header and library file from our cmake; another that was switching the add_subdirectory
call to ExternalProject_Add and disabling the install step, then again installing the generated library and header ourselves; finally, which I think is the most reasonable approach that I can think of, so far, is to add a flag to disable the executable install. I have a patch prepared to add that to the blizzard fork civetweb master.
After applying that change to my local files I'm investigating a problem from protobuf:
CMake Error at contrib/protobuf/cmake/cmake_install.cmake:571 (file):
file INSTALL cannot find
"/home/braedy/dev/cpp/s2client-api/build/lib/cmake/protobuf".
Call Stack (most recent call first):
cmake_install.cmake:38 (include)
Will update if I find something.
The definition for PowerSource is located in include/sc2api/sc2_gametypes.h. This seems terribly out of place. Why would I want to include info about gametypes when I want the definition of a PowerSource and vice versa?
I would pull request this but I haven't had a chance to look deeply enough to figure out the best place to move it yet. Tonight, if I have a chance.
me@seeks:build$ ./bin/all_tests
Running test: sc2::TestAbilityRemap
Launched SC2 (/Applications/StarCraft II/Versions/Base55958/SC2.app/Contents/MacOS/SC2), PID: 75685
NSWindowEdgeResizing is off!
Waiting for connection............
Connected to 127.0.0.1:8167
Waiting for the JoinGame response.
WaitJoinGame finished successfully.
libc++abi.dylib: terminating with uncaught exception of type std::__1::system_error: mutex lock failed: Invalid argument
Abort trap: 6
The error is same for at least ./bin/annoying_helper
too. The example itself runs fine, and this error is only thrown after the game window closes.
Running on OS X El Capitan 10.11.6.
Compiled using:
git clone --recursive https://github.com/Blizzard/s2client-api
cd s2client-api/
make
mkdir build
cd build/
cmake ../
make
(also, compiler weirdness:)
[ 96%] Building CXX object tests/CMakeFiles/all_tests.dir/test_observation_interface.cc.o
/Users/Hannes/Desktop/s2client-api/tests/test_observation_interface.cc:99:90: warning: adding 'int32_t' (aka 'int') to a string does not append to the string [-Wstring-plus-int]
ReportError("Supply cap is Incorrect the supply is reporting 16 instead of " + obs->GetFoodCap());
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
/Users/Hannes/Desktop/s2client-api/tests/test_observation_interface.cc:99:90: note: use array indexing to silence this warning
ReportError("Supply cap is Incorrect the supply is reporting 16 instead of " + obs->GetFoodCap());
^
& [ ]
/Users/Hannes/Desktop/s2client-api/tests/test_observation_interface.cc:249:117: warning: adding 'uint32_t' (aka 'unsigned int') to a string does not append to the string
[-Wstring-plus-int]
std::string errorStr = "UnitTypeData is reporting an incorrect cargo value. Expected : 0 Result : " + stalker_data.cargo_size;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
/Users/Hannes/Desktop/s2client-api/tests/test_observation_interface.cc:249:117: note: use array indexing to silence this warning
std::string errorStr = "UnitTypeData is reporting an incorrect cargo value. Expected : 0 Result : " + stalker_data.cargo_size;
^
& [ ]
/Users/Hannes/Desktop/s2client-api/tests/test_observation_interface.cc:253:126: warning: adding 'int' to a string does not append to the string [-Wstring-plus-int]
std::string errorStr = "UnitTypeData is reporting an incorrect mineral cost value. Expected : 125 Result : " + stalker_data.mineral_cost;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/Hannes/Desktop/s2client-api/tests/test_observation_interface.cc:253:126: note: use array indexing to silence this warning
std::string errorStr = "UnitTypeData is reporting an incorrect mineral cost value. Expected : 125 Result : " + stalker_data.mineral_cost;
^
& [ ]
/Users/Hannes/Desktop/s2client-api/tests/test_observation_interface.cc:257:120: warning: adding 'int' to a string does not append to the string [-Wstring-plus-int]
std::string errorStr = "UnitTypeData is reporting an incorrect vespene value. Expected : 50 Result : " + stalker_data.vespene_cost;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/Hannes/Desktop/s2client-api/tests/test_observation_interface.cc:257:120: note: use array indexing to silence this warning
std::string errorStr = "UnitTypeData is reporting an incorrect vespene value. Expected : 50 Result : " + stalker_data.vespene_cost;
^
& [ ]
/Users/Hannes/Desktop/s2client-api/tests/test_observation_interface.cc:265:116: warning: adding 'uint32_t' (aka 'unsigned int') to a string does not append to the string
[-Wstring-plus-int]
std::string errorStr = "UnitTypeData is reporting an incorrect unittypeID Expected : 74 Result : " + stalker_data.unit_type_id;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/Hannes/Desktop/s2client-api/tests/test_observation_interface.cc:265:116: note: use array indexing to silence this warning
std::string errorStr = "UnitTypeData is reporting an incorrect unittypeID Expected : 74 Result : " + stalker_data.unit_type_id;
^
& [ ]
5 warnings generated.
It would be quite nice if there were 'None' values for various types such as Race, UnitTypeID, etc, whose internal int is 0. This is very useful for 'error return' cases, such as not currently knowing what race the enemy is, or for returning a 'None' type for a prerequisite when a unit doesn't have one, etc.
sc2::UNIT_TYPEID::None
sc2::Race::None
Currently there is no option for text size drawing, and the default size is quite small on high resolution monitors. Would be great to be able to change the font size.
I think it would be reasonable to allow connecting to an existing server. For example, the cli args could take a host/port to connect to, instead of starting a new server process. This is particularly useful if the sc2 server is running on a remote host
I have noticed sometimes the location I tell a building to be built is different than the final position of the constructed unit. Can this behavior be documented or explained somehow?
This caused TestFeatureLayers and TestObservationActions to occasionally fail as the Point select would occasionally return 2 frames later instead of 1. Camera move commands are also returned 2 frames later.
At the moment I can't find any information on what units occupy what layers. I see the bool is_flying in the sc2::Unit class, but there is no way (as far as I can tell) see that a marauder and a flying viking can hit a colossus without specifying that yourself. Am I missing something or is this intentional?
Is there anywhere to determine the supply cost of a given UnitTypeID? I only see cargo_size in UnitData, is that equivalent?
https://github.com/Blizzard/s2client-api/blob/master/include/sc2api/sc2_coordinator.h#L126
//! \return True if the game has ended, false otherwise.
bool Update();
for Update()...isn't the return value actually exactly the opposite (false if the game has ended)?
three day i have a problem ,when i cmake install the erros :
CMake Error at contrib/civetweb/src/cmake_install.cmake:50 (file):
file INSTALL cannot find
"/home/sihuaiwei/桌面/git/s2client-api/build/bin/civetweb".
Call Stack (most recent call first):
contrib/civetweb/cmake_install.cmake:37 (include)
cmake_install.cmake:37 (include)
When I use the arrow keys or the mouse to scroll the screen during a bot game, it moves way too fast for me to be able to use it with any accuracy, so I am reduced to clicking on the minimap to see what's going on
Is there any way to decouple the viewport scroll speed from the game speed / step size?
AbilityData has no 'name' field like UpgradeData, UnitTypeData, and BuffData do, is link_name the proper value? If so, is there a reason it is named differently than the others?
In my bot's solution/project file, I am using the precompiled libs download to include and link against
So I am pointing my solution to the "include" folder for the includes, and the "lib" folder for the libs
The error I am getting is from line 5 of sc2_proto_interface.h, which attempts to include sc2api.pb.h, however that file is in another folder so it throws an error on compile
There are two ways to fix this:
I strongly suggest this change, as it removes the need to include multiple header folders
When playing you get this callback for your starting units. In replays you don't.
For some reason in replays, ObservationImp::UpdateObservation is getting called twice before ControlImp::IssueEvents.
The generated typeenums file should have both generalized ability id's and specific ones.
Dear all,
Due to the flexible scaling possibilities of amazon web services I had decided to use one of their instances for testing. Unfortunately it seems that access to SC2 is impossible. I tried running the CommandCenter bot of davechurchill and the game itself, with no good outcome.
The error is as follows, "Running StarCraft II through a Remote Desktop connection is not supported. Exiting program." I am relatively new to most of this, so I wonder whether this can be circumvented?
Regards,
Michael
I have not been able to find a way to determine which unit a Terran SCV is currently constructing. I can see that the SCV has a build command, but the unit it is building is not known
Would be a nice quality of life addition to have sc2::PointXX.getDistance(anotherPoint)
In short term, could just do footprint_radius * 2, and assume that is width/height?
I don't believe there is a way of detecting this nicely. Would be nice if a unit instance had a bool to show if it was powered or not
Talked to Kevin about this, it might be good for consistency, since Observation->GetUnit(tag) returns a pointer and GetUnits() return objects I find myself getting them mixed up in the bot. Having them all be pointers makes it a little more consistent, but I'm not sure if this is necessary
Currently the only way to obtain a building type's placement width / height is to query the ability and then get its radius and multiply it by 2. Might be a nice QOL improvement if the unit type data had width / height instead of simply radius
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.