coleygroup / pyscreener Goto Github PK
View Code? Open in Web Editor NEWpythonic interface to virtual screening software
License: MIT License
pythonic interface to virtual screening software
License: MIT License
Companion of openjournals/joss-reviews/issues/3950
Functionality documentation: Is the core functionality of the software documented to a satisfactory level (e.g., API method documentation)?
The code is well documented but it does not adhere to pep8 style, my recommendation would be to enforce code style in the repository via github actions and solve the many issues:
$ flake8 --ignore E501 --count > flake8.log
Hi
git version: git version 2.31.GIT
pip version: pip 21.3.1 from /home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip (python 3.8)
I followed the README instruction to install pdbfixer, didnt work for some reason. problem of git?
(molpal) [ama@gpu04 Development]$ pip install git+https://github.com/openmm/pdbfixer.git
Collecting git+https://github.com/openmm/pdbfixer.git
Cloning https://github.com/openmm/pdbfixer.git to /tmp/pip-req-build-hd4dk6vf
ERROR: Exception:
Traceback (most recent call last):
File "/home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip/_internal/cli/base_command.py", line 164, in exc_logging_wrapper
status = run_func(*args)
File "/home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip/_internal/cli/req_command.py", line 205, in wrapper
return func(self, options, args)
File "/home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip/_internal/commands/install.py", line 338, in run
requirement_set = resolver.resolve(
File "/home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/resolver.py", line 73, in resolve
collected = self.factory.collect_root_requirements(root_reqs)
File "/home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/factory.py", line 468, in collect_root_requirements
req = self._make_requirement_from_install_req(
File "/home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/factory.py", line 430, in _make_requirement_from_install_req
cand = self._make_candidate_from_link(
File "/home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/factory.py", line 201, in _make_candidate_from_link
self._link_candidate_cache[link] = LinkCandidate(
File "/home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line 281, in __init__
super().__init__(
File "/home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line 156, in __init__
self.dist = self._prepare()
File "/home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line 225, in _prepare
dist = self._prepare_distribution()
File "/home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line 292, in _prepare_distribution
return preparer.prepare_linked_requirement(self._ireq, parallel_builds=True)
File "/home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip/_internal/operations/prepare.py", line 482, in prepare_linked_requirement
return self._prepare_linked_requirement(req, parallel_builds)
File "/home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip/_internal/operations/prepare.py", line 527, in _prepare_linked_requirement
local_file = unpack_url(
File "/home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip/_internal/operations/prepare.py", line 190, in unpack_url
unpack_vcs_link(link, location)
File "/home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip/_internal/operations/prepare.py", line 65, in unpack_vcs_link
vcs_backend.unpack(location, url=hide_url(link.url))
File "/home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip/_internal/vcs/versioncontrol.py", line 598, in unpack
self.obtain(location, url=url)
File "/home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip/_internal/vcs/versioncontrol.py", line 512, in obtain
self.fetch_new(dest, url, rev_options)
File "/home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip/_internal/vcs/git.py", line 259, in fetch_new
if self.get_git_version() >= (2, 17):
File "/home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip/_internal/vcs/git.py", line 99, in get_git_version
return tuple(int(c) for c in match.groups())
File "/home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages/pip/_internal/vcs/git.py", line 99, in <genexpr>
return tuple(int(c) for c in match.groups())
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
Also tried git clone to local then install. Looks like some dependency issue??
(molpal) [ama@gpu04 Development]$ pip install -e pdbfixer
Obtaining file:///home/UK/ama/Development/pdbfixer
Preparing metadata (setup.py) ... done
Requirement already satisfied: numpy in /home/UK/ama/.conda/envs/molpal/lib/python3.8/site-packages (from pdbfixer==1.8.1) (1.21.2)
ERROR: Could not find a version that satisfies the requirement openmm>=7.1 (from pdbfixer) (from versions: 0.1, 0.2)
ERROR: No matching distribution found for openmm>=7.1
When running the provided example:
# example/benzene_5wiu.py
import pyscreener as ps
import ray
ray.init()
metadata = ps.build_metadata("vina")
virtual_screen = ps.virtual_screen("vina", ["integration-tests/inputs/5WIU.pdb"], (-18.2, 14.4, -16.1), (15.4, 13.9, 14.5), metadata, ncpu=8)
scores = virtual_screen("c1ccccc1")
scores
$ python example/benzene_5wiu.py
2022-01-12 14:20:06,884 INFO services.py:1338 -- View the Ray dashboard at http://127.0.0.1:8265
Traceback (most recent call last):
File "example/benzene_5wiu.py", line 9, in <module>
scores = virtual_screen("c1ccccc1")
File "/Users/rodrigo/repos/pyscreener/pyscreener/docking/screen.py", line 169, in __call__
planned_simulationsss = self.plan(sources, smiles)
File "/Users/rodrigo/repos/pyscreener/pyscreener/docking/screen.py", line 243, in plan
planned_simulationsss = [
File "/Users/rodrigo/repos/pyscreener/pyscreener/docking/screen.py", line 244, in <listcomp>
[
File "/Users/rodrigo/repos/pyscreener/pyscreener/docking/screen.py", line 245, in <listcomp>
[
File "/Users/rodrigo/repos/pyscreener/pyscreener/docking/screen.py", line 246, in <listcomp>
replace(
File "/Users/rodrigo/software/anaconda3/envs/pyscreener_env/lib/python3.8/dataclasses.py", line 1264, in replace
raise TypeError("replace() should be called on dataclass instances")
TypeError: replace() should be called on dataclass instances
(prepare_receptors pid=47498) Traceback (most recent call last):
(prepare_receptors pid=47498) File "/Users/rodrigo/ADFRsuite-1.0/CCSBpckgs/AutoDockTools/Utilities24/prepare_receptor4.py", line 9, in <module>
(prepare_receptors pid=47498) from MolKit import Read
(prepare_receptors pid=47498) ImportError: No module named MolKit
(prepare_receptors pid=47498)
(prepare_receptors pid=47498) ERROR: failed to convert "integration-tests/inputs/5WIU.pdb"
Hello - we are finishing the paper where we exstensively used Pyscreener, please advice how to cite properly Pyscreener?
Kind regards,
Rafał
Companion of openjournals/joss-reviews/issues/3950
Community guidelines: Are there clear guidelines for third parties wishing to 1) Contribute to the software 2) Report issues or problems with the software 3) Seek support
The repository already contains a CODE_OF_CONDUCT.md
but would also be beneficial to have a CONTRIBUTING.md
detailing how to contribute to the repository, also there should be issue templates for feature requests/bugs/questions.
Is your feature request related to a problem? Please describe.
Some users have noted that they would like a method by which to programmatically retrieve the in/out files corresponding to a specific compound. They can currently do this themselves by calling VirtualScreen.collect_all()
and manually mapping the names of each compound to the collected files and unzipping only those. This is cumbersome.
Desired solution/workflow
# vs: VirtualScreen
# smis: List[str]
y = vs(smis)
best_cpd = smis[np.argmax(y)]
pose_file = vs.get_poses(best_cpd)
Thoughts
p x n x 3
, but that would require additional and some custom PDBQT parsing code (MDanalysis doesn't parse multiple models from a single pdbqt from my understanding)VirtualScreen
?Hi
I think there are 2 potential bugs in run_pyscreener_distributed_example.batch( run_molpal.batch as well) I found with this script ray can not leverage all the resources on a cluster node.
in line 7 "#SBATCH --ntasks-per-node 4". I think "--ntasks-per-node" should always = 1.
quote: "this will be used to guarantee that each Ray worker runtime will obtain the proper resources" see https://docs.ray.io/en/latest/cluster/slurm.html.
in line 31 and 41, you start ray cluster with " --num-cpus $SLURM_CPUS_ON_NODE ".
However, this can only let ray use part of cpus in a node. for instance, say you ask 1 node and set "-c = 4" and "--ntasks-per-node 4", ray can only use 4*4=16 cpus eventhough you have 32 cpus in the node. ($SLURM_CPUS_ON_NODE will return 16 instead 32).
suggested config:
######################################################################
#!/bin/bash
#SBATCH --partition=???
#SBATCH --job-name=???
#SBATCH -o %x_%j.out
#SBATCH -e %x_%j.err
### This script works for any number of nodes, Ray will find and manage all resources
#SBATCH --nodes=10
#SBATCH --exclusive
### Give all resources to a single Ray task, ray can manage the resources internally
#SBATCH --ntasks-per-node=1
# Load modules or your own conda environment here
# module load pytorch/v1.4.0-gpu
# conda activate ${CONDA_ENV}
source activate pyscreener
# ===== DO NOT CHANGE THINGS HERE UNLESS YOU KNOW WHAT YOU ARE DOING =====
# This script is a modification to the implementation suggest by gregSchwartz18 here:
# https://github.com/ray-project/ray/issues/826#issuecomment-522116599
redis_password=$(uuidgen)
export redis_password
nodes=$(scontrol show hostnames "$SLURM_JOB_NODELIST") # Getting the node names
nodes_array=($nodes)
node_1=${nodes_array[0]}
ip=$(srun --nodes=1 --ntasks=1 -w "$node_1" hostname --ip-address) # making redis-address
# if we detect a space character in the head node IP, we'll
# convert it to an ipv4 address. This step is optional.
if [[ "$ip" == *" "* ]]; then
IFS=' ' read -ra ADDR <<< "$ip"
if [[ ${#ADDR[0]} -gt 16 ]]; then
ip=${ADDR[1]}
else
ip=${ADDR[0]}
fi
echo "IPV6 address detected. We split the IPV4 address as $ip"
fi
port=6379
ip_head=$ip:$port
export ip_head
echo "IP Head: $ip_head"
echo "STARTING HEAD at $node_1"
srun --nodes=1 --ntasks=1 -w "$node_1" \
ray start --head --node-ip-address="$ip" --port=$port --redis-password="$redis_password" --block &
sleep 30
worker_num=$((SLURM_JOB_NUM_NODES - 1)) #number of nodes other than the head node
for ((i = 1; i <= worker_num; i++)); do
node_i=${nodes_array[$i]}
echo "STARTING WORKER $i at $node_i"
srun --nodes=1 --ntasks=1 -w "$node_i" ray start --address "$ip_head" --redis-password="$redis_password" --block &
sleep 5
done
# ===== Call your code below =====
pyscreener --config vina_dock.ini --ncpu 2
########################################
Hi
in ps/main.py there is one extra argument which is " repeats", should be dealt with.
Dear authors,
Thanks for your great project! However, when I use pyscreener, the running time for each molecule is 30 seconds in average. Do you have any suggestions for accelerating the process?
Hi,
I'm new to molecule docking and not familiar with the data format mentioned in README. Can you provide some sample data and command line or script to help me understand how to use your package? Thanks
Is your feature request related to a problem? Please describe.
There's no problem right now. There's a slight inconvenience about locating the pocket/cavity for Vina. So, pyscreener can integrate this feature so that providing the box can be automated as well
Use-cases/examples of this new feature
The user will provide just a pdb file and smiles formatted ligand and start the docking without worrying about the x,y,z center or size of the box.
Desired solution/workflow
There's autobox example in config samples, however it determines the box location and size by using the ligand in the PDB file (HETATM). This won't work if there's no ligand in PDB file. So, users should provide any PDB file (protein only) and location of the box should be calculated automatically. I suggest fpocket as an option. Since fpocket generates many pockets, best one should be considered for x,y,z center and size extraction.
After install pyscreener, I tried pyscreener-check SCREEN_TYPE METADATA_TEMPLATE
command but encountered the following problems:
Traceback (most recent call last): File "/data/yangziyi/anaconda3/envs/Relation/bin/pyscreener-check", line 8, in <module> sys.exit(check()) File "/data/yangziyi/anaconda3/envs/Relation/lib/python3.8/site-packages/pyscreener/main.py", line 13, in check ps.check_env(sys.argv[1], json.loads(sys.argv[2])) File "/data/yangziyi/anaconda3/envs/Relation/lib/python3.8/json/__init__.py", line 357, in loads return _default_decoder.decode(s) File "/data/yangziyi/anaconda3/envs/Relation/lib/python3.8/json/decoder.py", line 337, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/data/yangziyi/anaconda3/envs/Relation/lib/python3.8/json/decoder.py", line 355, in raw_decode raise JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Dear Authors,
I installed pyscreener in conda env.
When I run the command "python run.py --config test_configs/test_vina.ini",
I got the error message like:
ERROR: failed to convert "testing_inputs/5WIU.pdb"
Traceback (most recent call last):
File "", line 1, in
File "/home/njgoo/Data1/program/pyscreener/pyscreener/docking/init.py", line 8, in screener
return Vina(software=software, **kwargs)
File "/home/njgoo/Data1/program/pyscreener/pyscreener/docking/vina.py", line 102, in init
super().init(receptors=receptors, pdbids=pdbids,
File "/home/njgoo/Data1/program/pyscreener/pyscreener/docking/base.py", line 102, in init
self.receptors = receptors
File "/home/njgoo/Data1/program/pyscreener/pyscreener/docking/base.py", line 203, in receptors
raise RuntimeError('Preparation failed for all receptors!')
RuntimeError: Preparation failed for all receptors!
Could you provide information for solving the error?
I also added external software path to PATH in bach_profile.
Thank you!
in ps/main.py line 113 " results = virtual_screen.all_results()" should change to " results = virtual_screen.results()"
since in ps/docking/screen.py the class "DockingVirtualScreen" had changed "all_results()" to "results()"
molpal should change as well.
I was able to follow the instructions and run the integration tests 🎉
The details on installing different docking backends was 👌
I do think the installation instructions could be simplified by installing everything from conda-forge:
conda create -n NAME -c conda-forge python=3.8 pip openbabel openmm rdkit pdbfixer
Then the extra step to install pdbfixer from source isn't necessary.
This is a secondary (but related) question:
Are you interested in getting this package on conda-forge? Then end users would only need to (in addtion to installing the backend of thier choice) do:
conda install -c conda-forge pyscreener
Hi,
When I run the command "python run.py --config test_configs/test_autobox.ini", I got the following error, can you help me on it? Thanks
File "/net/sunlab/psunlab1/molecular_data/graphnn/pyscreener/pyscreener/docking/vina.py", line 110, in call
return self.dock(*args, **kwargs)
File "/net/sunlab/psunlab1/molecular_data/graphnn/pyscreener/pyscreener/docking/base.py", line 187, in dock
recordsss = self.dock_ensemble(*smis_or_files, **kwargs)
File "/net/sunlab/psunlab1/molecular_data/graphnn/pyscreener/pyscreener/docking/base.py", line 261, in dock_ensemble
ligands = self.prepare_ligands(*smis_or_files, **kwargs)
File "/net/sunlab/psunlab1/molecular_data/graphnn/pyscreener/pyscreener/docking/base.py", line 358, in prepare_ligands
for i, source in enumerate(sources)
File "/net/sunlab/psunlab1/molecular_data/graphnn/pyscreener/pyscreener/docking/base.py", line 358, in
for i, source in enumerate(sources)
File "/net/sunlab/psunlab1/molecular_data/graphnn/pyscreener/pyscreener/docking/base.py", line 370, in _prepare_ligands
return self.prepare_from_csv(source, **kwargs)
File "/net/sunlab/psunlab1/molecular_data/graphnn/pyscreener/pyscreener/docking/base.py", line 509, in prepare_from_csv
start=start, nconvert=nconvert)
File "/net/sunlab/psunlab1/molecular_data/graphnn/pyscreener/pyscreener/docking/base.py", line 428, in prepare_from_smis
self.ncpu, True) as client:
File "/net/sunlab/psunlab1/molecular_data/graphnn/pyscreener/pyscreener/docking/base.py", line 748, in Pool
return Pool(max_workers=num_workers)
UnboundLocalError: local variable 'Pool' referenced before assignment
Companion of openjournals/joss-reviews/issues/3950
The install instructions are not very clear to me, but after following it step-by-step I tried to check it with:
$ pyscreener-check SCREEN_TYPE METADATA_TEMPLATE
Which seem like a nice feature, but its not clear what are the SCREEN_TYPE
and METADATA_TEMPLATE
and also there is no usage:
$ pyscreener-check -h
Traceback (most recent call last):
File "/Users/rodrigo/software/anaconda3/envs/pyscreener_env/bin/pyscreener-check", line 8, in <module>
sys.exit(check())
File "/Users/rodrigo/repos/pyscreener/pyscreener/main.py", line 13, in check
ps.check_env(sys.argv[1], json.loads(sys.argv[2]))
IndexError: list index out of range
Could you please clarify this step?
An additional note is that to install the packages you need to first add the conda-forge
channel with $ conda config --append channels conda-forge
i am using ps to do vs, (scores = vs(virtual_lib)),
however, when vs meets some molecular that can't be processed correctly (e.g., rdkit can't generate conformer), the vs process will crash rather than pass/handle those molecular.
I am wandering is there any error handle procedure in ps?
thanks
When I test the installation by:
python3 run.py --config test_configs/test_autobox.ini
I am receving an output below. What can be the problem?
Thanks in advance,
____ __ ____________________ ___ ____ ___ _____ *
/ __ \/ / / / ___/ ___/ ___/ _ \/ _ \/ __ \/ _ \/ ___/ *
Welcome to Pyscreener!
Pyscreener will be run with the following arguments:
buffer: 5.0
center: [-18.0, 13.5, -17.0]
config: test_configs/test_autobox.ini
copy_all: False
distributed: False
docked_ligand_file: testing_inputs/5WIU_with_ligand.pdb
enclose_spheres: True
ensemble_score_mode: best
extra: None
ligands: ['testing_inputs/test_ligands.csv']
mode: docking
n_cluster: 10
name: test_autobox
nconvert: None
ncpu: 1
num_workers: -1
pH: 7.0
pdbids: None
postprocessing_options: none
preprocessing_options: none
receptors: ['testing_inputs/5WIU.pdb']
repeat_score_mode: best
repeats: 1
root: .
score_mode: best
size: [14.0, 12.0, 15.0]
software: qvina
start: 0
title_line: True
use_3d: False
use_largest: False
verbose: 0
viz_mode: text
Preprocessing ...
Done!
Preparing and screening inputs ...
adding gasteiger charges to peptide
Sorry, there are no Gasteiger parameters available for atom 5WIU:A:GLN280:OE1
Sorry, there are no Gasteiger parameters available for atom 5WIU:A:GLN290:OE1
Warning: hydrogens, ['HG', 'HG', 'HG1', 'HG1', 'HG', 'HH', 'HG', 'HG', 'HG', 'H', 'HH', 'H21H', 'HG', 'HD21', 'HH', 'HG', 'HG1', 'HG1', 'HG1', 'HZ3', 'HZ3', 'HG', 'HE22', 'HG1', 'HG1', 'H21H', 'HH', 'HE21', 'HH', 'HG1', 'HG', 'HG1', 'HH', 'HG', 'HG1', 'H21H'] , with no bonds!
Traceback (most recent call last):
File "run.py", line 78, in
main()
File "run.py", line 42, in main
**params)
File "/home/mehmet/Downloads/pyscreener/pyscreener/docking/vina.py", line 110, in call
return self.dock(*args, **kwargs)
File "/home/mehmet/Downloads/pyscreener/pyscreener/docking/base.py", line 187, in dock
recordsss = self.dock_ensemble(*smis_or_files, **kwargs)
File "/home/mehmet/Downloads/pyscreener/pyscreener/docking/base.py", line 261, in dock_ensemble
ligands = self.prepare_ligands(*smis_or_files, **kwargs)
File "/home/mehmet/Downloads/pyscreener/pyscreener/docking/base.py", line 358, in prepare_ligands
for i, source in enumerate(sources)
File "/home/mehmet/Downloads/pyscreener/pyscreener/docking/base.py", line 358, in
for i, source in enumerate(sources)
File "/home/mehmet/Downloads/pyscreener/pyscreener/docking/base.py", line 370, in _prepare_ligands
return self.prepare_from_csv(source, **kwargs)
File "/home/mehmet/Downloads/pyscreener/pyscreener/docking/base.py", line 509, in prepare_from_csv
start=start, nconvert=nconvert)
File "/home/mehmet/Downloads/pyscreener/pyscreener/docking/base.py", line 428, in prepare_from_smis
self.ncpu, True) as client:
File "/home/mehmet/Downloads/pyscreener/pyscreener/docking/base.py", line 748, in Pool
return Pool(max_workers=num_workers)
UnboundLocalError: local variable 'Pool' referenced before assignment
below is the emg, i have no idea what is it, any idea?
####################################################################
Traceback (most recent call last):
File "/work/home/aixplorerbio_wz/ylk/molpal-main/run.py", line 71, in
main()
File "/work/home/aixplorerbio_wz/ylk/molpal-main/run.py", line 51, in main
explorer = Explorer(path, **params)
File "/work/home/aixplorerbio_wz/ylk/molpal-main/molpal/explorer.py", line 148, in init
self.objective = objectives.objective(**kwargs)
File "/work/home/aixplorerbio_wz/ylk/molpal-main/molpal/objectives/init.py", line 9, in objective
return DockingObjective(objective_config, **kwargs)
File "/work/home/aixplorerbio_wz/ylk/molpal-main/molpal/objectives/docking.py", line 51, in init
self.virtual_screen = ps.virtual_screen(
File "/work/home/aixplorerbio_wz/miniconda3/envs/molpal/lib/python3.8/site-packages/pyscreener/docking/init.py", line 88, in virtual_screen
return DockingVirtualScreen(get_runner(software), *args, **kwargs)
TypeError: init() takes from 6 to 16 positional arguments but 18 were given
Companion of openjournals/joss-reviews/issues/3950
Example usage: Do the authors include examples of how to use the software (ideally to solve real-world analysis problems).
Some exemple usage is provided in the paper and also in the README.md, but would be good to have it as a script in a new examples/
folder. This is very helpful for users as a starting point to setup their own experiments and a quick way to experiment with the software capabilities.
Package installs without issue using pip
even if pdbfixer
is not installed. This will raise an Error during import
.
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.