Code Monkey home page Code Monkey logo

eks-node-viewer's Introduction

GitHub License contributions welcome Go code tests

Usage

eks-node-viewer is a tool for visualizing dynamic node usage within a cluster. It was originally developed as an internal tool at AWS for demonstrating consolidation with Karpenter. It displays the scheduled pod resource requests vs the allocatable capacity on the node. It does not look at the actual pod resource usage.

Talks Using eks-node-viewer

Installation

Homebrew

brew tap aws/tap
brew install eks-node-viewer

Manual

Please either fetch the latest release or install manually using:

go install github.com/awslabs/eks-node-viewer/cmd/eks-node-viewer@latest

Note: This will install it to your GOBIN directory, typically ~/go/bin if it is unconfigured.

Usage

Usage of ./eks-node-viewer:
  -attribution
    	Show the Open Source Attribution
  -context string
    	Name of the kubernetes context to use
  -disable-pricing
    	Disable pricing lookups
  -extra-labels string
    	A comma separated set of extra node labels to display
  -kubeconfig string
    	Absolute path to the kubeconfig file (default "~/.kube/config")
  -node-selector string
    	Node label selector used to filter nodes, if empty all nodes are selected
  -node-sort string
    	Sort order for the nodes, either 'creation' or a label name. The sort order can be controlled by appending =asc or =dsc to the value. (default "creation")
  -resources string
    	List of comma separated resources to monitor (default "cpu")
  -style string
    	Three color to use for styling 'good','ok' and 'bad' values. These are also used in the gradients displayed from bad -> good. (default "#04B575,#FFFF00,#FF0000")
  -v	Display eks-node-viewer version
  -version
    	Display eks-node-viewer version

Examples

# Standard usage
eks-node-viewer
# Karpenter nodes only
eks-node-viewer --node-selector karpenter.sh/nodepool
# Display both CPU and Memory Usage
eks-node-viewer --resources cpu,memory
# Display extra labels, i.e. AZ
eks-node-viewer --extra-labels topology.kubernetes.io/zone
# Sort by CPU usage in descending order
eks-node-viewer --node-sort=eks-node-viewer/node-cpu-usage=dsc
# Specify a particular AWS profile and region
AWS_PROFILE=myprofile AWS_REGION=us-west-2

Computed Labels

eks-node-viewer supports some custom label names that can be passed to the --extra-labels to display additional node information.

  • eks-node-viewer/node-age - Age of the node
  • eks-node-viewer/node-cpu-usage - CPU usage (requests)
  • eks-node-viewer/node-memory-usage - Memory usage (requests)
  • eks-node-viewer/node-pods-usage - Pod usage (requests)
  • eks-node-viewer/node-ephemeral-storage-usage - Ephemeral Storage usage (requests)

Default Options

You can supply default options to eks-node-viewer by creating a file named .eks-node-viewer in your home directory and specifying options there. The format is option-name=value where the option names are the command line flags:

# select only Karpenter managed nodes
node-selector=karpenter.sh/nodepool

# display both CPU and memory
resources=cpu,memory

# show the zone and nodepool name by default
extra-labels=topology.kubernetes.io/zone,karpenter.sh/nodepool

# sort so that the newest nodes are first
node-sort=creation=asc

Troubleshooting

NoCredentialProviders: no valid providers in chain. Deprecated.

This CLI relies on AWS credentials to access pricing data if you don't use the --disable-pricing option. You must have credentials configured via ~/aws/credentials, ~/.aws/config, environment variables, or some other credential provider chain.

See credential provider documentation for more.

I get an error of creating client, exec plugin: invalid apiVersion "client.authentication.k8s.io/v1alpha1"

Updating your AWS cli to the latest version and updating your kubeconfig should resolve this issue.

Development

Building

$ make build

Or local execution of GoReleaser build:

$ make goreleaser

eks-node-viewer's People

Contributors

abhinavdahiya avatar bwagner5 avatar dependabot[bot] avatar ellistarn avatar jonathan-innis avatar mbevc1 avatar nezz7 avatar njtran avatar pete911 avatar robertnorthard avatar rothgar avatar t00mm avatar tzneal avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

eks-node-viewer's Issues

Failed to get prices because of time parsing errors

Example output:

ip-10-0-123-34.eu-west-2.compute.internal  cpu █████████░░░░░░░░░░░░░░░░░░░░░░░░░░  25% (14 pods) r6i.xlarge - - Ready
•
←/→ page • q: quit
2023/11/09 20:00:33 updating spot pricing, ProcessProviderParseError: parse failed of credential_process output: {
    "Version": 1,
    "AccessKeyId": "[... YES IT IS PRINTING MY KEY!!! ...]",
    "SecretAccessKey": "[... YES IT IS PRINTING MY SECRET!!! ...]",
    "SessionToken": "[... YES IT IS PRINTING MY TOKEN!!! ...]",
    "Expiration": "2023-11-11T07:58:44+0100"
}

caused by: parsing time "2023-11-11T07:58:44+0100" as "2006-01-02T15:04:05Z07:00": cannot parse "+0100" as "Z07:00", using existing pricing data from 2022-12-05T13:09:08Z
2023/11/09 20:00:34 updating fargate pricing, ProcessProviderParseError: parse failed of credential_process output: {
    "Version": 1,
    "AccessKeyId": "[... YES IT IS PRINTING MY KEY!!! ...]",
    "SecretAccessKey": "[... YES IT IS PRINTING MY SECRET!!! ...]",
    "SessionToken": "[... YES IT IS PRINTING MY TOKEN!!! ...]",
    "Expiration": "2023-11-11T07:58:44+0100"
}

My laptop is currently running in CET timezone.

color gradation reversal

This is a great piece of software, thanks!

Could it be better if the visual aid's colors were reversed, meaning when the node is at 100% capacity, its red on the right vs on the left (which would be green). So at a glance, a user would know that if its red, the node is fully utilized.

bug: Pricing seems to be off

Monthly pricing doesn't seem to match total hourly pricing * 365*24/12 🤔

Example:

$0.008/hour | $6.132/month

Where it should be: $5.84/month

Feature: Add option to output costs only

Hi,

It seems to me that it could be useful to have an option to show costs and exit.

This way it could be used to quickly evaluate costs of Kubernetes cluster. Similar to infracost for Terraform. They have issue to add support for k8s, but it still in backlog, while eks-node-viewer already have this data.

Pod wise utilization

Currently we can view the dynamic utilisation of node. But if we get the capabilities to view dynamic pod utilisation thats even more super useful

Not getting pricing info for spot instances and non-karpenter provisioned nodes

Hello,

Initially I was getting pricing info for both spot and on-demand capacity for Karpenter provisioned nodes. Was not getting capacity or pricing for other nodes in my cluster that were not provisioned by Karpenter. Now, I'm only getting pricing info for on-demand capacity nodes provisioned by Karpenter. Does eks-node-viewer not show pricing and capacity for non-karpenter provisioned nodes? Any idea why I'm not getting pricing for spot capacity Karpenter provisioned nodes?

eks_node_viewer

eks-node-viewer version 0.4.3
commit: 23ccb3a
built at: 2023-08-07T15:16:40Z
built by: goreleaser

Do not brute force api in case of expired or wrong credentials

If a given session is expired or the iam auth is experiend eks-node-viewer should just quit. Right now it is brute force the api with messages like this:

	status code: 400, request id: 409ff304-8721-4c5d-9ab8-d2c2c10a5ca3; ExpiredTokenException: The security token included in the request is expired

Show memory in a different color

It would be nice if I could see the memory in a different color. It throws me off when it's matching the cpu color.

Even better yet, the ability to choose a custom color would be pretty cool.

fargate stats improvements

Right now the fargate stats are not correct because the provisioned instance is always bigger than the requested resources for the pod.

fargate-ip-10-8-137-244.eu-central-1.compute.internal cpu ████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 10% (1 pods) 0.25vCPU-1GB/$0.0118 Fargate - Ready
memory ███████████████░░░░░░░░░░░░░░░░░░░░ 42%

│ Non-terminated Pods: (1 in total) │
│ Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits Age │
│ --------- ---- ------------ ---------- --------------- ------------- --- │
│ karpenter karpenter-5fdbd5d978-6jqcn 200m (10%) 200m (10%) 768Mi (42%) 768Mi (42%) 31d

The cpu usage should be something like 80%, the memory usage should be 78%.

bars dont refresh

i had ENV running in a shell, and spun up 20 new pods/nodes and the CLI app updated to include the new nodes but not the stats about them
image

after I restarted the app all the expected details where there
image

[Feature] Node Age

Thanks for this tool, it's proving really useful for watching karpenter do its thing.

Would it be possible to include the node age as well as a data point? Would be handy for getting a realtime feel for how often spot instances are being reissued in the pool.

error on basic usage

I installed using go install github.com/awslabs/eks-node-viewer/cmd/eks-node-viewer@latest

$ eks-node-viewer                       
2022/12/09 11:43:21 creating client, exec plugin: invalid apiVersion "client.authentication.k8s.io/v1alpha1"

Credentials are correctly configured

Runtime error: slice bounds out of range

Starting from version 0.4.0 eks-node-viewer crashes on start:

$ ~/bin/eks-node-viewer --version
eks-node-viewer version 0.4.2
commit: b1dcd24fdfbfcfb7e515d9366c876f644634f31f
built at: 2023-07-20T18:27:47Z
built by: goreleaser

$ ~/bin/eks-node-viewer
Caught panic:

runtime error: slice bounds out of range [:-6]

Restoring terminal...

goroutine 1 [running]:
runtime/debug.Stack()
	/opt/hostedtoolcache/go/1.20.6/x64/src/runtime/debug/stack.go:24 +0x65
runtime/debug.PrintStack()
	/opt/hostedtoolcache/go/1.20.6/x64/src/runtime/debug/stack.go:16 +0x19
github.com/charmbracelet/bubbletea.(*Program).Run.func1()
	/home/runner/go/pkg/mod/github.com/charmbracelet/[email protected]/tea.go:440 +0x95
panic({0x1d12cc0, 0xc000830090})
	/opt/hostedtoolcache/go/1.20.6/x64/src/runtime/panic.go:890 +0x263
github.com/awslabs/eks-node-viewer/pkg/model.(*UIModel).View(0xc0005b2240)
	/home/runner/work/eks-node-viewer/eks-node-viewer/pkg/model/uimodel.go:106 +0x7b4
github.com/charmbracelet/bubbletea.(*Program).Run(0xc000412240)
	/home/runner/go/pkg/mod/github.com/charmbracelet/[email protected]/tea.go:487 +0x6f5
github.com/charmbracelet/bubbletea.(*Program).Start(...)
	/home/runner/go/pkg/mod/github.com/charmbracelet/[email protected]/tea.go:548
main.main()
	/home/runner/work/eks-node-viewer/eks-node-viewer/cmd/eks-node-viewer/main.go:103 +0x94f

Version 0.3.0 working without issues

Using multiple configuration in KUBECONFIG environment breaks eks-node-viewer

I have multiple configurations in my KUBECONFIG environment variable, diveded by a : as described in https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/#append-home-kube-config-to-your-kubeconfig-environment-variable

Unfortunately, this breaks the eks-node-viewer with the following error:

$ eks-node-viewer
2022/12/14 09:08:56 creating client, stat .kubeconfig:/Users/[...]/.kube/config:/Users/[...]/.kube/config.d/01_preferences:/Users/[...]/.kube/config.d/EKS:/Users/[...]/.kube/config.d/local:[...]: no such file or directory

fargate support

it would be great if the fargate container would also be shown with price info

Tools seems to not use ENV KUBECONFIG for cluster information

I'm overwriding my kubeconfig path with env var KUBECONFIG but this one is no't used when use eks-node-viewer.

So i have to perform this : cat ~/.kube/k0s.cfg > ~/.kube/config everytime i use eks-node-viewer on a different context (as my context is defined in another file path than the default one)

KUBECONFIG=/home/xxxxxx/.kube/k0s.cfg

Count of pods include pods in "Completed"state

eks-node-viewer does an amazing job at displaying the resource allocation across nodes. The total no of pods shown on the right of cpu percentage includes the pods in non-running state which doesn't reflect the current resource allocation. Not sure if this is intended.

Screenshot 2022-12-18 at 8 42 33 PM

Screenshot 2022-12-18 at 8 45 00 PM

The node shown above shows incorrect resources allocation.

Understand how eks-node-viewer obtain the metrics

Hello,

First of all , thanks to share this tool with community :-)

This is not an issue it's only a question, because I tested with a EKS cluster running inside AWS and the results don't match with others tool like top, htop etc....

imagen

As you can see in the screenshot I understand that the pods are using a lot of CPU but in other hand I can see that we are not using a lot of memory.

In the next screenshot we can see the result of HTOP command.
imagen

Here the result it's totally true compared with eks-node-viewer info, the memory is very low comparing with the total. --> 6.63GB of 30.9GB

But as you can see the CPU is not very high... for me is strange because in eks-node-viewer it said that is around 94%...

Here other screenshot about kubectl top nodes.

imagen

Maybe eks-node-viewer check the CPU sum for deployments?¿ Only take the limits? Because is reserved to the pods?¿

imagen

Please would be possible to explain a little bit how to interpreter the results?

Thanks!! :-)

Feature: Make node output scrollable

When listing nodes in a cluster with lots of nodes it would be useful to make the list scrollable. Right now the only options are to zoom out until all nodes fit on a single page which can make text unreadable.

Feature: change sort column

It appears that eks-node-viewer currently sorts by node creation time, with oldest on top. Of all the options to sort by, creation time is probably the least interesting to me.

It would be very helpful to be able to choose other columns to sort by, and whether they are asc/desc, including arbitrary columns like the ones generated by --extra-labels. I label my nodes so I can see at a glance what provisioner they belong to, and being able to sort on the label column would be a huge help.

Feature: Add option to define profile name to fetch pricing information

Hello,

Very nice tool, thank you for open-sourcing it!

It seems to me that it's now tries to fetch pricing information with default profile credentials and if it's not defined, throws errors like:

2022/12/12 10:49:49 updating on-demand pricing, NoCredentialProviders: no valid providers in chain. Deprecated.
	For verbose messaging see aws.Config.CredentialsChainVerboseErrors; NoCredentialProviders: no valid providers in chain. Deprecated.
	For verbose messaging see aws.Config.CredentialsChainVerboseErrors, using existing pricing data from 2022-10-31T16:47:25Z

I think that it would be useful to have command line option to define custom profile in session init.

support another resource type "pod-usages".

using this tool when i migrate from the CAS to the Karpenter, sometimes i've watched that cpus or memories were available but more nodes created.

2 main reasons:

1 . the pod, would be scheduled, should be bounded in the specific AZ(since the PV).
2. the node had pods with the max # of pods of that.

imo, i have no idea to describe better for the first case. but the second case, the num of pods, is good to describe as progression bars, like other resource types.

both they are able to be checked with the label topology.kubernetes.io/zone and the computed label eks-node-viewer/node-pods-usage, but visual things would be better.

btw this tool is awesome. i really love this. thank you.

Installation doesn't seems to work

Hello, first of all thanks for the tool, it looks great.

The problem I'm facing is that even when I followed the instructions from the README to install the eks-node-viewer cli, after the installation the command is not available.

image
image

❯ go version
go version go1.19.4 darwin/amd64

I had to clone the repo and build it locally to make it work:
image

Spot Pricing Incorrect

It appears that on spot instances the price estimate is using the on-demand price:

ip-10-63-242-25.ec2.internal  cpu    █████████████████████████████████░░  94% (14 pods) c6a.large/$0.076    On-Demand - Ready 
                              memory ███████████████████░░░░░░░░░░░░░░░░  54%                                                 
ip-10-63-247-246.ec2.internal cpu    ████████████████████████████░░░░░░░  79% (13 pods) c6a.large/$0.076    On-Demand - Ready 
                              memory ███████████████████░░░░░░░░░░░░░░░░  54%                                                 
ip-10-63-240-13.ec2.internal  cpu    ███████████████████████████████████  99% (18 pods) c6a.large           -         - Ready 
                              memory ████████████████████████████████░░░  91%                                                 
ip-10-63-243-187.ec2.internal cpu    ███████████████████████████████████ 100% (15 pods) c6a.large           -         - Ready 
                              memory ████████████████████████░░░░░░░░░░░  68%                                                 
ip-10-63-243-63.ec2.internal  cpu    ██████████████████████████████████░  97% (15 pods) c6in.large/$0.113   Spot      - Ready 
                              memory ███████████████████████████████░░░░  89%                                                 
ip-10-63-242-35.ec2.internal  cpu    █████████████████████████████████░░  94% (13 pods) c6i.large/$0.085    Spot      - Ready 
                              memory ██████████████████████░░░░░░░░░░░░░  64%                                                 
ip-10-63-245-172.ec2.internal cpu    ███████████████████████████████████  99% (21 pods) c6in.xlarge/$0.227  Spot      - Ready 
                              memory ███████████████████████████████████  99%                                                 
ip-10-63-240-143.ec2.internal cpu    ██████████████████████████████████░  97% (14 pods) r6i.large/$0.126    Spot      - Ready 
                              memory █████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  15%                                                 
ip-10-63-244-109.ec2.internal cpu    ██████████████████████████████████░  96% (20 pods) c6in.xlarge/$0.227  Spot      - Ready 
                              memory ██████████████████████████████████░  98%                                                 
ip-10-63-246-161.ec2.internal cpu    ███████████████████████████████████  99% (29 pods) r6id.2xlarge/$0.605 Spot      - Ready 
                              memory █████████░░░░░░░░░░░░░░░░░░░░░░░░░░  25%                                                 
ip-10-63-246-95.ec2.internal  cpu    ███████████████████████████░░░░░░░░  76% (13 pods) c6id.large/$0.101   Spot      - Ready 
                              memory ███████████████████░░░░░░░░░░░░░░░░  54%                                                 

For example the r6id.2xlarge should be more like $0.1608 per Hour

This was with the latest version installed with Go.

spot pricing not showing

Hi Team,

EKS node viewer showing only on-demand pricing , but it is not showing spot pricing. The spot instance created by karpenter and I can able to see label "karpenter.sh/capacity-type | spot" in spot node.

image

config file

can this read a config file so we store regular parameters?
--extra-labels=karpenter.sh/provisioner-name,topology.kubernetes.io/zone -resources memory,cpu,pods
if there was a $HOME/.eks_node_viewer with the contents:

extra-labels=karpenter.sh/provisioner-name,topology.kubernetes.io/zone 
resources=memory,cpu,pods

Include NodePool Information

For each node, can you also display the corresponding NodePool it was provisioned? (Or optionally MNG name)

And also, provide a command line option to filter and retrieve nodes from a specific NodePool

Reason: Customers might have lot of NodePools, in which case, they would like to understand per NodePool pricing and capacity utilization.

Reflector error

I'm not sure what caused this error but it's possible it's because I'm on unstable conference wifi. I wanted to open an issue just in case it's repeatable.

I'm running against fairly large clusters (150+ nodes).

W0626 08:39:03.980356  101661 reflector.go:533] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:231: failed to list *v1.Pod: stream error when reading response body, may be caused by closed connection. Please retry. Original error: stream error: stream ID 1; INTERNAL_ERROR; received from peer
I0626 08:39:03.980442  101661 trace.go:219] Trace[437753376]: "Reflector ListAndWatch" name:pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:231 (26-Jun-2023 08:37:57.011) (total time: 66968ms):
Trace[437753376]: ---"Objects listed" error:stream error when reading response body, may be caused by closed connection. Please retry. Original error: stream error: stream ID 1; INTERNAL_ERROR; received from peer 66968ms (08:39:03.980)
Trace[437753376]: [1m6.968683122s] [1m6.968683122s] END
E0626 08:39:03.980469  101661 reflector.go:148] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:231: Failed to watch *v1.Pod: failed to list *v1.Pod: stream error when reading response body, may be caused by closed connection. Please retry. Original error: stream error: stream ID 1; INTERNAL_ERROR; received from peer

This error would appear below the node list. Nodes and pages would show up but pricing and utilization data was missing. This error would repeat and never load usage or pricing data.

new on-demand instances show the spot price (on managed 1.21 node groups)

While watching a node-group update of a managed EKS 1.21 node group I noticed that new instances come up as spot instances with the correct spot price and switch to on-demand after half a minute (when the capacityType label get's added) but keep showing the cached spot price instead of the correct on-demand price.

I'm not sure if the node should keep an attribute "last capacityType" and remove the cached price when lastCapacityType != currentCapacityType as that's a corner case.

The easiest solution might be to just not cache the price of a node at all and look it up for every update from the cached instance price lists. Or Update it, when updating a node?
https://github.com/awslabs/eks-node-viewer/blob/main/cmd/eks-node-viewer/main.go#L150

This was running version 164e1c9

NoCredentialProviders error when using SSO credentials

When using eks-node-viewer with credentials provided from AWS SSO, I'm seeing:

2023/02/16 16:07:40 updating on-demand pricing, NoCredentialProviders: no valid providers in chain. Deprecated.
	For verbose messaging see aws.Config.CredentialsChainVerboseErrors; NoCredentialProviders: no valid providers in chain. Deprecated.

Setting AWS_PROFILE does not solve the issue.

Looking at issues in aws-sdk-go, this seems to be related to aws-sdk-go v1 not playing well with SSO. It might be fixed in v2?

Pricing not showing up and bars not refreshing

As shown in the screenshot below, pricing is not showing up. Also the bars are not refreshing. It seems like it's just stuck.

eks-node-viewer version 0.1.3
commit: 868b27101807da01031c47cc467d5d8a8a0d62b4
built at: 2023-02-25T00:02:55Z
built by: goreleaser

Screenshot 2023-03-03 at 6 16 09 PM

Installation of latest v0.1.1 release is failing

I'm following the Autoscaling section in the EKS Immersion Workshop
The command to install eks-node-viewer is:
go install github.com/awslabs/eks-node-viewer/cmd/eks-node-viewer@latest
That fails with:
../../go/pkg/mod/github.com/awslabs/[email protected]/cmd/eks-node-viewer/main.go:44:12: pattern ATTRIBUTION.md: no matching files found

I edited the command to install the v0.1.0 version and that worked:
go install github.com/awslabs/eks-node-viewer/cmd/[email protected]

Scrollable UI

In big clusters (100+ nodes), I find myself not able to see all the nodes even though I keep my terminal's font size to the bare minimum I need to be able to read. If I try to scroll the UI, eks-node-viewer gets terminated. It would be great to have a way to scroll through the UI.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.