Giter Club home page Giter Club logo

scaleway-sdk-go's Introduction

PkgGoDev GitHub Actions GoReportCard

Scaleway GO SDK

⚠️ This is an early release, keep in mind that the API can break

Scaleway is a single way to create, deploy and scale your infrastructure in the cloud. We help thousands of businesses to run their infrastructures easily.

Documentation

Installation

go get github.com/scaleway/scaleway-sdk-go

Getting Started

package main

import (
	"fmt"

	"github.com/scaleway/scaleway-sdk-go/api/instance/v1"
	"github.com/scaleway/scaleway-sdk-go/scw"
	"github.com/scaleway/scaleway-sdk-go/utils"
)

func main() {

	// Create a Scaleway client
	client, err := scw.NewClient(
		// Get your organization ID at https://console.scaleway.com/organization/settings
		scw.WithDefaultOrganizationID("SCW_DEFAULT_ORGANIZATION_ID"),
		// Get your credentials at https://console.scaleway.com/iam/api-keys
		scw.WithAuth("SCW_ACCESS_KEY", "SCW_SECRET_KEY"),
		// Get more about our availability zones at https://www.scaleway.com/en/docs/console/my-account/reference-content/products-availability/
		scw.WithDefaultRegion("SCW_REGION"),
	)
	if err != nil {
		panic(err)
	}

	// Create SDK objects for Scaleway Instance product
	instanceApi := instance.NewAPI(client)

	// Call the ListServers method on the Instance SDK
	response, err := instanceApi.ListServers(&instance.ListServersRequest{
		Zone: scw.ZoneFrPar1,
	})
	if err != nil {
		panic(err)
	}

	// Do something with the response...
	for _, server := range response.Servers {
		fmt.Println("Server", server.ID, server.Name)
	}

}

Examples

You can find additional examples in the GoDoc.

Development

This repository is at its early stage and is still in active development. If you are looking for a way to contribute please read CONTRIBUTING.md.

Reach us

We love feedback. Feel free to reach us on Scaleway Slack community, we are waiting for you on #opensource.

scaleway-sdk-go's People

Contributors

agirot avatar codelax avatar cryptobioz avatar debovema avatar denbeke avatar dependabot[bot] avatar dri42 avatar grom-42 avatar jerome-quere avatar jtherin avatar kindermoumoute avatar laure-di avatar loicbourgois avatar louisportay avatar luxifer avatar matm avatar mia-cross avatar monitob avatar oursin avatar philibea avatar quantumsheep avatar quentinbrosse avatar remyleone avatar scaleway-bot avatar sh4d1 avatar sywesk avatar tomy2e avatar vinzius avatar yfodil 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

scaleway-sdk-go's Issues

instance.ListImages method do not returns public images by default

The SDK uses the default organization ID to fill the organization query param and set the public query param to true of the /instance/v1/zones/fr-par-1/images endpoint.

GET /instance/v1/zones/fr-par-1/images?organization={ORG_ID}&public=true

Therefore, the API returns all the public images from the user default organization. The default behavior that we want for this method is to return all the public Scaleway images.

We need to make this call by default:

GET /instance/v1/zones/fr-par-1/images

EOF when pagination is enabled and the call returns a 404

version: 4a0f25b
Example:

instanceAPI := instance.NewAPI(scwClient)
name := "2sdafsf"
resp, err := instanceAPI.ListServers(&instance.ListServersRequest{
  Zone: utils.ZoneFrPar2,
}, scw.WithAllPages())
if err != nil {
  log.Fatalf("%v", err)
}

Response:

DEBUG: 2019/06/06 12:07:26 client: using sdk version 0.0.0
DEBUG: 2019/06/06 12:07:26 creating GET request on https://api.scaleway.com/instance/v1/zones/fr-par-2/servers?page=1
DEBUG: 2019/06/06 12:07:26 dumping http request:
GET /instance/v1/zones/fr-par-2/servers?page=1 HTTP/1.1
Host: api.scaleway.com
User-Agent: xxxxx
X-Auth-Token: xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Accept-Encoding: gzip

DEBUG: 2019/06/06 12:07:27 dumping http response:
HTTP/2.0 404 Not Found
Content-Length: 23
Content-Security-Policy: default-src 'none'; frame-ancestors 'none'
Content-Type: application/json
Date: Thu, 06 Jun 2019 10:07:22 GMT
Server: scaleway_api
Strict-Transport-Security: max-age=63072000
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-Request-Id: f4921ff7-a4b4-4cc4-b21f-8381fe618370

{"message":"Not found"}
2019/06/06 12:07:27 [scaleway-sdk-go] could not parse response body: EOF
exit status 1

k8s: bug waiting process

K8s waitingCluster could be returning on ClusterStatusReady or ClusterStatusPoolRequired.
This should be treated as two separate process

vpc creation with scaleway terraform api failed

when i try to create many vpc with terraform provider, i have this mistake

│ Error: scaleway-sdk-go: invalid argument(s): subnets is invalid for unexpected reason, subnet_overlaps_in_project: {}
│ 
│   with scaleway_vpc_private_network.creation-vpcs["toto"],
│   on main.tf line 2, in resource "scaleway_vpc_private_network" "creation-vpcs":
│    2: resource "scaleway_vpc_private_network" "creation-vpcs" {

my vpc creation use this variable déclaration

variable "vpc-list" {
    description = "liste des vpc"
    type = set(string)
    default = ["mgmt", "provider", "toto", "titi", "tutu", "okko"]
}

and my main.tf to execute terraform code is :

resource "scaleway_vpc_private_network" "creation-vpcs" {
    for_each = var.vpc-list
    name = each.key
    tags = ["${each.key}", "terraform"]
}

my scaleway provider version is : v2.5.0
my terraform version is : 1.3.2

anyone have same problems?

fix user agent

current user agent does not send correctly sdk version, example: User-Agent: scaleway-sdk-go/v1.0.0-beta.7+dev

Have one RetryInterval

Problem

RetryInterval is set at the level of a product

It is specified for both

In the CLI, setting RetryInterval = 0 allows to execute the WaitFor funcs immediately.

We need to handle it for each product in CLI tests.

Proposal

Maybe we should have a higher variable, either in the SDK or in the CLI, so we don't have to handle RetryInterval for the tests of each product.

undefined variables during a test

$ docker run -it circleci/golang:1.13
$ go get github.com/scaleway/scaleway-sdk-go
$ cd src/github.com/scaleway/scaleway-sdk-go
$ go test -v scw/config_test.go

# command-line-arguments [command-line-arguments.test]
scw/config_test.go:18:14: undefined: Region
scw/config_test.go:22:14: undefined: Zone
scw/config_test.go:54:78: undefined: defaultConfigPermission
scw/config_test.go:412:36: undefined: RegionFrPar
scw/config_test.go:413:36: undefined: ZoneFrPar2
scw/config_test.go:420:35: undefined: RegionNlAms
scw/config_test.go:421:35: undefined: ZoneNlAms1
scw/config_test.go:424:25: undefined: Config
scw/config_test.go:483:40: undefined: v1ValidToken
scw/config_test.go:484:30: undefined: v1ValidOrganizationID
scw/config_test.go:54:78: too many errors
FAIL	command-line-arguments [build failed]
FAIL

remove internal/errors package

errors implement error type that is now in std library, we could remove this package as it is incomplete compared to go std lib.

Collecting Object Storage and Public Gateways resources

Hey there,

I'm one of the makers of Komiser, we're building an open-source platform to help companies build their cloud inventory and uncover insights about their infrastructure (costs wasted, security threats, and compliance issues). We're supporting Scaleway as a provider (see here) and we've been using the official Go SDK to collect Scaleway resources and apparently the current implementation doesn't support the collection of the following resources:

Could you give us a hand in maintaining the Scaleway integration or sharing some docs on how to support the missing services in the SDK (we could leverage our Discord community to add the missing features) :)

Error when listing servers

SDK version: master (8606dca)
Go version: 1.12.4
GOARCH: amd64
GOOS: linux

When I call :

ListServers(&instance.ListServersRequest{                                                                                                                             
    Zone: zone,
})

I got:

json: cannot unmarshal bool into Go struct field Server.enable_ipv6 of type string

ipv6 floating ips for elastic metal are not supported

Both the cli as the terraform provider struggle with ipv6 addresses. I.e. scw fip ip list yields the error

Scaleway-sdk-go: could not parse application/json response body: invalid IP address: 2001:bc8:1203:17f::/64

In the terraform provider I observe something linked to the same error, i.e.:

│ Error: scaleway-sdk-go: waiting for FlexibleIP failed: scaleway-sdk-go: could not parse application/json response body: invalid IP address: 2001:bc8:1203:17f::/64

I'm no specialist in Go, but maybe the schema at

IPAddress net.IP `json:"ip_address"`
should also allow for IPv6 type addresses?

Add support for a WaitForPossibleDeletion

Due to Apple licences, the M1-M servers need to be used for at least 24 hours. The API response gives in the fields of the server a field deletable_at that indicates when it is allowed to delete a server.
A WaitForPossibleDeletion would rely on the local clock to wait for the time at which it is permitted to delete a server. Then we could call a delete function normally.

Refactor logging of http requests to use an http.Transport

Refactor the logging in the SDK to use Transport for the logging.

Roundtripper can be used as a chained decorator upon an HTTP request that can implement logging, authentication management, header manipulation, ...
Beware to chain them in the right order to avoid a logging transport to leak credentials.

RDB Username max length diffrent of documentation

Hi!
I tried to create a RDB Instance and set a user_name of 62 chars following the documentation.
I checked the code and found this comment that match the documentation:

// Name: name of the user (Length must be between 1 and 63 characters, First character must be an alphabet character (a-zA-Z), Your Username cannot start with '_rdb', Only a-zA-Z0-9_$- characters are accepted)

But terraform apply return this:

Error: scaleway-sdk-go: invalid argument(s): user_name does not respect constraint, user_name length must be between 1 and 32

Scaleway-sdk-go version: v2.2.0
Go version: go1.17.6
GOOS: darwin
GOARCH: amd64

Bug when unmarshalling IP with CIDR notation

Found in scaleway/scaleway-cli#1156

It seems that "0.0.0.0/0" is not a valid IP address for the scaleway sdk

$ go run ./cmd/scw/main.go rdb acl list ca6271c4-5182-4627-81c2-3d8a8542585b -D
running: [/var/folders/sm/h3cw_xsj0279j12fnhv6bzd40000gn/T/go-build626928940/b001/exe/main rdb acl list ca6271c4-5182-4627-81c2-3d8a8542585b -D]
client: using sdk version v1.0.0-beta.6+devclient: using sdk version v1.0.0-beta.6+devcreating GET request on https://api.scaleway.com/rdb/v1/regions/fr-par/instances/ca6271c4-5182-4627-81c2-3d8a8542585b/acls?page=1
--------------- Scaleway SDK REQUEST 1 : ---------------
GET /rdb/v1/regions/fr-par/instances/ca6271c4-5182-4627-81c2-3d8a8542585b/acls?page=1 HTTP/1.1
Host: api.scaleway.com
User-Agent: scaleway-sdk-go/v1.0.0-beta.6+dev (go1.14.4; darwin; amd64) scaleway-cli/2.0.0-beta.4+dev
X-Auth-Token: 11111111-1111-1111-1111-111111111111
Accept-Encoding: gzip


---------------------------------------------------------
--------------- Scaleway SDK RESPONSE 1 : ---------------
HTTP/2.0 200 OK
Content-Length: 140
Content-Security-Policy: default-src 'none'; frame-ancestors 'none'
Content-Type: application/json
Date: Thu, 02 Jul 2020 09:52:28 GMT
Server: agw_listener_public_vip
Strict-Transport-Security: max-age=63072000
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-Request-Id: 49fbee23-7c63-4a41-8fa6-a645b373e441

{"rules":[{"ip":"0.0.0.0/0","port":8969,"protocol":"tcp","direction":"inbound","action":"allow","description":"Allow All"}],"total_count":1}
----------------------------------------------------------Scaleway-sdk-go: could not parse application/json response body: invalid IP address: 0.0.0.0/0
skipping check versiontelemetry successfully sent
exit status 1

Support v2beta1 DNS API

Hello,

Is there any plans bump the DNS API version to v2beta1 ? It appears the current API version v2alpha2 does not support domains and zones scoped to a project.

I'm using kubernetes-sigs/external-dns inside my k8s Kapsule cluster, and it does not see the domains and zone defined inside a project.

Many thanks!

Inconsistant error on Delete

When not found, some resources returns a *scw.ResourceNotFoundError and some others a *scw.ResponseError with StatusCode 404.

Using branch master (df9902c) with go 1.13.5.

To reproduce:


import (
	"fmt"
	"reflect"

	"github.com/scaleway/scaleway-sdk-go/api/instance/v1"
	"github.com/scaleway/scaleway-sdk-go/scw"
)

func main() {

	client, err := scw.NewClient(
		scw.WithDefaultOrganizationID("ORGANISATION_ID"),
		scw.WithAuth("ACCESS_KEY", "SECRET_KEY"),
	)
	if err != nil {
		panic(err)
	}

	instanceApi := instance.NewAPI(client)

	err = instanceApi.DeleteServer(&instance.DeleteServerRequest{
		ServerID: "5e858181-e9c2-4f46-8f03-0197b6eb045a",
		Zone: scw.ZoneFrPar1,
	})
	if err != nil {
		fmt.Printf("[delete instance] type: %s, value: %+v\n", reflect.TypeOf(err), err)
	}

	err = instanceApi.DeleteSecurityGroup(&instance.DeleteSecurityGroupRequest{
		SecurityGroupID: "c7b2072b-f7b5-4ae0-84b1-9c3245dbabd2",
		Zone: scw.ZoneFrPar1,
	})
	if err != nil {
		fmt.Printf("[delete sg] type: %s, value: %+v\n", reflect.TypeOf(err), err)
	}
}

Result:

[delete instance] type: *scw.ResourceNotFoundError, value: scaleway-sdk-go: resource  with ID 5e858181-e9c2-4f46-8f03-0197b6eb045a is not found
[delete sg] type: *scw.ResponseError, value: scaleway-sdk-go: http error 404 Not Found: security group "c7b2072b-f7b5-4ae0-84b1-9c3245dbabd2" not found

Expected:

[delete instance] type: *scw.ResourceNotFoundError, value: scaleway-sdk-go: resource  with ID 5e858181-e9c2-4f46-8f03-0197b6eb045a is not found
[delete sg] type: *scw.ResourceNotFoundError, value: scaleway-sdk-go: resource  with ID c7b2072b-f7b5-4ae0-84b1-9c3245dbabd2 is not found

correction doc

Can you modified the readme please. Because there are severals error....

package main

import (
	"fmt"

	"github.com/scaleway/scaleway-sdk-go/api/instance/v1"
	"github.com/scaleway/scaleway-sdk-go/scw"
	"github.com/scaleway/scaleway-sdk-go/utils"
)

func main() {

	// Create a Scaleway client
	client, err := scw.NewClient(
		scw.WithDefaultOrganizationID("ORGANISATION_ID"),
		scw.WithAuth("Access Key", "SECRET_KEY"), // Get your credentials at https://console.scaleway.com/account/credentials
	)
	if err != nil {
		panic(err)
	}

	// Create SDK objects for Scaleway Instance product
	instanceApi := instance.NewApi(client)

	// Call the ListServers method on the Instance SDK
	response, err := instanceApi.ListServers(&instance.ListServersRequest{
		Zone: utils.ZoneFrPar1,
	})
	if err != nil {
		panic(err)
	}

	// Do something with the response...
	for _, server := range response.Servers {
		fmt.Println("Server", server.Id, server.Name)
	}

}

Panic on empty DNS record name

When DNS record name is empty scw utility panics

scw dns record delete valid.dns.zone.name name="" type=CNAME --output json

produces

---------------------------------------------------------------------------------------
An error occurred, we are sorry, please consider opening a ticket on github using: 'scw feedback bug'
Give us as many details as possible so we can reproduce the error and fix it.
---------------------------------------------------------------------------------------
stacktrace from panic: 
goroutine 1 [running]:
runtime/debug.Stack()
        /opt/hostedtoolcache/go/1.17.13/x64/src/runtime/debug/stack.go:24 +0x65
main.cleanup(0xc000228fc0)
        /home/runner/work/scaleway-cli/scaleway-cli/cmd/scw/main.go:38 +0x85
panic({0xa10380, 0xfd1660})
        /opt/hostedtoolcache/go/1.17.13/x64/src/runtime/panic.go:1038 +0x215
github.com/scaleway/scaleway-cli/v2/internal/core.(*Printer).printJSON(0xc00023b8c0, {0x0, 0x0})
        /home/runner/work/scaleway-cli/scaleway-cli/internal/core/printer.go:235 +0x1e1
github.com/scaleway/scaleway-cli/v2/internal/core.(*Printer).Print(0xc00023b8c0, {0x0, 0x0}, 0xbcb898)
        /home/runner/work/scaleway-cli/scaleway-cli/internal/core/printer.go:150 +0x8f
github.com/scaleway/scaleway-cli/v2/internal/core.Bootstrap(0xc00048bed0)
        /home/runner/work/scaleway-cli/scaleway-cli/internal/core/bootstrap.go:222 +0xfcb
main.main()
        /home/runner/work/scaleway-cli/scaleway-cli/cmd/scw/main.go:59 +0x291

runtime error: invalid memory address or nil pointer dereference

Feature Request: filter marketplace API

Would be nice to be able to filter the marketplace results. Example instdead of listing all images and then looping through to find the right one, have the sdk do it instead?

Uniform lb sdk to upstream api

Current implementation of sdk

type CreateLbRequest struct {
	Region scw.Region `json:"-"`
	// OrganizationID owner of resources
	OrganizationID string `json:"organization_id"`
	// Name resource names
	Name string `json:"name"`
	// Description resource description
	Description string `json:"description"`
	// IPID just like for compute instances, when you destroy a Load Balancer, you can keep its highly available IP address and reuse it for another Load Balancer later
	IPID *string `json:"ip_id"`
	// Tags list of keyword
	Tags []string `json:"tags"`
	// Type load Balancer offer type
	Type string `json:"type"`
}

misses ssl_compatibility_level property which is available on upstream api

{
  "organization_id": "string",
  "name": "string",
  "description": "string",
  "ip_id": "string",
  "tags": [
    "string"
  ],
  "type": "string",
  "ssl_compatibility_level": "ssl_compatibility_level_unknown"
}

we should probably add it.

WaitFor[...] helpers crash

scw/api/k8s.WaitFor{Cluster,Pool} crashes if no explicit Timeout is set.

timeout := *req.Timeout (L29, L78)

This implementation is different than every other helpers across Scaleway APIs (they're using a default value).

See this commit

Error when listing load balancers

SDK version: master (8cf099e)
Go version: 1.12.4
GOARCH: amd64
GOOS: linux

When I call :

resp, err := l.api.ListLbs(&lb.ListLbsRequest{
  Region:   l.region,
  Name:     &lbName,
  PageSize: &pageSize,
 Page:     &page,
})

I get

received status code 400:  is not a valid lb.ListLbsRequest_OrderBy

Adding new SdkError type breaks pagination

Since the new SdkError type appeared, the types that used to implement lister does not implement it anymore (since the function return type changed from error to SdkError.

New release

Hello!

Could you release a new beta release of the SDK? Thanks!

By default instance.CreateServer enable dynamic IP

Problem

By default the instance.CreateServer method creates a server with a dynamic IP, we don't expect this behavior.

Steps to reproduce

resServer, err := instanceAPI.CreateServer(&instance.CreateServerRequest{
	Zone: utils.ZoneFrPar1,
	Name: "sdk-test",
	Volumes: map[string]*instance.VolumeTemplate{
		"0": {
			Size: 20 * 1000000000,
		},
	},
	CommercialType: "DEV1-S",
	Image: "f974feac-abae-4365-b988-8ec7d1cec10d",
})
if err != nil {
	panic(err)
}
fmt.Printf("Server %#v", resServer.Server)

err = instanceAPI.ServerActionAndWait(&instance.ServerActionAndWaitRequest{
	Zone: utils.ZoneFrPar1,
	ServerID: resServer.Server.ID,
	Action: instance.ServerActionPoweron,
})
if err != nil {
	panic(err)
}

s, err := instanceAPI.GetServer(&instance.GetServerRequest{
	Zone: utils.ZoneFrPar1,
	ServerID: "b769e443-c0c2-494e-81d4-990445997f6f",
})
if err != nil {
	panic(err)
}
fmt.Printf("Server %#v\n", s.Server.DynamicIPRequired) // == true

403 Forbidden with CreateSSHKey

I am trying to use this API:

func (s *API) CreateSSHKey(req *CreateSSHKeyRequest, opts ...scw.RequestOption) (*SSHKey, error) {

with the code:

        accountApi := account.NewAPI(client)
	response, err := accountApi.CreateSSHKey(&account.CreateSSHKeyRequest{
		PublicKey: pubKey,
	})
	if err != nil {
		panic(err)
	}

And I got:

panic: scaleway-sdk-go: http error 403 Forbidden: permission denied

The same client works with baremetal and instance APIs, so I assume the credentials are valid.

Is this intentional? Can I use the account APIs?

Override omitempty

Hello,
If you use the API, you notice that all the arguments are omitempty. So, I can not detach an IP from an instance.
I propose to create an override attribute and to do the json code on a map [string] interface {} for each request.
Example:


type UpdateIpRequest struct {
	Zone utils.Zone

	IpId string

	Reverse *string
	Server  *string
	Override  map[string]interface{}
}
func (this *UpdateIpRequest) MarshalJSON() ([]byte, error) {
	if this.Override==nil {
		this.Override=make(map[string]interface{})
	}
       if this.Reverse!=nil { this.Override["reverse"]=this.Reverse}
       if this.Server!=nil { this.Override["server"]=this.Server}
	return json.Marshal(this.Override)
}

For detach IP:

_,err:=instanceApi.UpdateIp(&instance.UpdateIpRequest{	
	Zone: utils.ZoneFrPar1,
	IpId:"1511-1515-5858-525",
	Override:map[string]interface{}{"server":nil},
})

What do you think ?

Serializability of instance objects

I recently needed to serialize some objects from the go SDK and noticed that the objects do not serialize/deserialize consistently with the JSON encoding.

This is due to json:"-" tags in the go objects from the SDK.

Exemple:

type GetServerRequest struct {
    // Zone:
    //
    // Zone to target. If none is passed will use default zone from the config
    Zone scw.Zone `json:"-"`
    // ServerID: UUID of the server you want to get
    ServerID string `json:"-"`
}

I understand that this makes sense when generating request bodies because these fields are actually passed in the url. But, as a user of the SDK this behaviour is surprising and makes using these objects outside of just api requests difficult.

So i think you should either:

  • document this limitation
  • fix these objects so they can have a more standard behaviour

A possible workaround is having exported objects without the json tags and implementing internal objects that have the same structure but include the tags.

Example:

type GetServerRequest struct {
	Zone     string
	ServerID string
}

type internalGetServerRequest struct {
	Zone     string `json:"-"`
	ServerID string `json:"-"`
}

type GetServerResponse struct {
	// ...
}

func GetServer(ctx context.Context, req *GetServerRequest) (*GetServerResponse, error) {
	ireq := (*internalGetServerRequest)(req)
	// do the api call using json representation of ireq instead of req
}

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.