Coder Social home page Coder Social logo

terraform-provider-sendgrid's Introduction

⚠ Archived repository

I have not used Sendgrid since more than one year. I don't have any ways to test modifications to the provider.

Terraform logo

Terraform Provider for Sendgrid

To compile the provider, run make build. This will build the provider and put the provider binary in the $GOPATH/bin directory.

$ make build

In order to test the provider, you can simply run make test.

$ make test

In order to run the full suite of Acceptance tests, run make testacc.

$ make testacc

Documentation

The documentation is created thank's to a fork of https://github.com/terraform-providers/terraform-provider-baiducloud/tree/master/gendocs.

Terraform Registry

Known issues

The API KEY API is not completely documented: when you don't set scopes, you get all scopes. This is managed by the provider.

When you set one or multiple scopes, even if you don't set the scopes sender_verification_eligible and 2fa_required, you will get them in the end. It's managed by the provider: if you don't add these scopes to the list of scopes, the provider does it for you.

Acknowledgments

Thanks @yinzara for the latest changes that I loosely copied.

terraform-provider-sendgrid's People

Contributors

andre-vspry avatar miouge1 avatar ryanwholey avatar smag-bmesseca avatar timja avatar trois-six avatar yinzara avatar

Stargazers

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

Watchers

 avatar  avatar  avatar  avatar

terraform-provider-sendgrid's Issues

Domain Authentication resources

sendgrid_domain_authentication
sendgrid_domain_authentication_validation

Suggested schema:

resource "sendgrid_domain_authentication" "domain" {
  domain                = "example.com"
  sub_user_on_behalf_of = "my_sub_user" # optional
  subdomain             = "sub"      # optional
  username              = "username" # optional
  ips                   = []         # optional
  custom_spf            = false      # optional
  default               = false      # optional
  automatic_security    = true       # optional
  custom_dkim_selector  = ""         # optional
}

resource "sendgrid_domain_authentication_validation" "domain" {
  id = sendgrid_domain_authentication.domain.id
  sub_user_on_behalf_of = "my_sub_user" # optional
}

after the sendgrid_domain_authentication is complete then you would be able to use another terraform resource to create the required DNS validation records, sendgrid_domain_authentication_validation needs to poll for some reasonable time to see if sendgrid validates the domain.

API docs:
https://sendgrid.com/docs/api-reference/

Actions are:

  1. Authenticate a domain
  2. Validate a domain authentication.

@trois-six any thoughts?

terraform invalidates template_version changge active from 0-1 or from 1-0

I have a template, named of CF-Terraform-Temp-Test
There are two versions in my template, Their names are: Untitled Version1 & Untitled Version2
Currently, Untitled Version2 is active
Now, I use terraform to set Untitled Version2 to Inactive and set Untitled Version1 to active.
My terraform apply infos are:

$ terraform apply -var sg_token=${sg_token}
module.SG_TEMPLATE["CF-Terraform-Temp-Test"].sendgrid_template.template: Refreshing state... [id=d-7ede866229814c1f826317ed2de456a3]
module.SG_TEMPLATE["CF-Terraform-Temp-Test"].sendgrid_template_version.template_version["Untitled Version2.html"]: Refreshing state... [id=654acfce-f40e-425f-ae72-80f1afb4ee4f]
module.SG_TEMPLATE["CF-Terraform-Temp-Test"].sendgrid_template_version.template_version["Untitled Version1.html"]: Refreshing state... [id=930297a4-0d46-4ece-95b5-688f3aa12f7e]

Note: Objects have changed outside of Terraform

Terraform detected the following changes made outside of Terraform since the last "terraform apply":

  # module.SG_TEMPLATE["CF-Terraform-Temp-Test"].sendgrid_template_version.template_version["Untitled Version2.html"] has changed
  ~ resource "sendgrid_template_version" "template_version" {
      ~ active                 = 0 -> 1
        id                     = "654acfce-f40e-425f-ae72-80f1afb4ee4f"
        name                   = "Untitled Version2"
        # (8 unchanged attributes hidden)
    }


Unless you have made equivalent changes to your configuration, or ignored the relevant attributes using ignore_changes, the following plan may include actions to undo or respond to these
changes.

─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  # module.SG_TEMPLATE["CF-Terraform-Temp-Test"].sendgrid_template_version.template_version["Untitled Version1.html"] will be updated in-place
  ~ resource "sendgrid_template_version" "template_version" {
      ~ active                 = 0 -> 1
        id                     = "930297a4-0d46-4ece-95b5-688f3aa12f7e"
        name                   = "Untitled Version1"
        # (8 unchanged attributes hidden)
    }

  # module.SG_TEMPLATE["CF-Terraform-Temp-Test"].sendgrid_template_version.template_version["Untitled Version2.html"] will be updated in-place
  ~ resource "sendgrid_template_version" "template_version" {
      ~ active                 = 1 -> 0
        id                     = "654acfce-f40e-425f-ae72-80f1afb4ee4f"
        name                   = "Untitled Version2"
        # (8 unchanged attributes hidden)
    }

Plan: 0 to add, 2 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

module.SG_TEMPLATE["CF-Terraform-Temp-Test"].sendgrid_template_version.template_version["Untitled Version2.html"]: Modifying... [id=654acfce-f40e-425f-ae72-80f1afb4ee4f]
module.SG_TEMPLATE["CF-Terraform-Temp-Test"].sendgrid_template_version.template_version["Untitled Version1.html"]: Modifying... [id=930297a4-0d46-4ece-95b5-688f3aa12f7e]
module.SG_TEMPLATE["CF-Terraform-Temp-Test"].sendgrid_template_version.template_version["Untitled Version2.html"]: Modifications complete after 0s [id=654acfce-f40e-425f-ae72-80f1afb4ee4f]
module.SG_TEMPLATE["CF-Terraform-Temp-Test"].sendgrid_template_version.template_version["Untitled Version1.html"]: Modifications complete after 1s [id=930297a4-0d46-4ece-95b5-688f3aa12f7e]

Apply complete! Resources: 0 added, 2 changed, 0 destroyed.

But, on the Sendgrid Dynamic Templates page, Untitled Version2 is still active.
No matter how many times I execute apply, Untitled Version2 is active and I can't set Untitled Version1 to active via terraform
Does anyone know what this is about, it's a big problem not being able to change the active status of the template version.

sendgrid_domain_authentication always creating new CNAME config and resetting previous one

I have problem which is probably related with sendgrid_domain_authentication resource.
Whenever I execute Terraform it is always creating a new Cname records independently from the sendgrid resource was already created
Is it a bug or you have an idea how I can avoid the regeneration?

Thank you

resource "sendgrid_domain_authentication" "default" {
  domain = "${var.dns_zone_name}"
  is_default = true
  automatic_security = true
}

resource "azurerm_dns_cname_record" "sendgrid" {
  depends_on = [
     sendgrid_domain_authentication.default
  ]
  count = 3 // SendGrid generates 3 different CNAME records

  name = trimsuffix(sendgrid_domain_authentication.default.dns[count.index].host, ".${var.dns_zone_name}")
  resource_group_name = "${data.azurerm_dns_zone.dns_zone.resource_group_name}"
  zone_name           = "${data.azurerm_dns_zone.dns_zone.name}"
  ttl                 = 3600
  record =  "${sendgrid_domain_authentication.default.dns[count.index].data}"
}

status: 500, response: {"errors":[{"field":null,"message":"internal server error"}]}

Until v0.1.6, we are unable to create new SendGRID api.

We got an error 500 : internal server error

Error: request failed: failed creating apiKey, status: 500, response: {"errors":[{"field":null,"message":"internal server error"}]}
  on main.tf line 100, in resource "sendgrid_api_key" "main":
 100: resource "sendgrid_api_key" "main" {

We are using terraform 0.13.3 with following code :

provider "sendgrid" {
  api_key = "xxxxxxxx"
}
resource "sendgrid_api_key" "main" {
  name = "myApiName"
  scopes = [
    "mail.send",
  ]
}

It's working fine with curl commmand line :

$ curl --request POST --url https://api.sendgrid.com/v3/api_keys --header 'authorization: Bearer SG.xxxxxxx.xxxxxxxx' --header 'content-type: application/json' --data '{"name":"myApiName","scopes":["mail.send"]}'
{"api_key":"SG.xxxxxxx.xxxxxxx","api_key_id":"xxxxxxx","name":"myApiName","scopes":["mail.send"]}

It was working fine on v0.1.3 but we are not able to use it anymore because of 404 error

Error while installing trois-six/sendgrid v0.1.3: could not query provider
registry for registry.terraform.io/trois-six/sendgrid: failed to retrieve
authentication checksums for provider: 404 Not Found

Thanks in advance.

Api key per subuser?

Hi,
just a question - is it possible to first create a subuser and then create an api key only for that particular subuser?

Sendgrid seems to support that, but I don't see a way to specify the subuser in the sendgrid_api_key resource...

Thanks!

Enable resources to specify sub_user_on_behalf_of

In v0.1.*, we could specify sub_user_on_behalf_of for API keys, but this got removed in v0.2

This means that it is not possible to create an API key, or any other resources - for a single subuser
Ideally this would be specified within the resources themselves, rather than in a provider, to avoid us having to specify multiple provider configs, and to allow configuration to be confined within a Module

What needs to be done in order to add sub_user_on_behalf_of back? Is it just a case of adding the field back into each resources schema, and then adding c.OnBehalfOf = d.Get("sub_user_on_behalf_of").(string) each time a client is created?

darwin_arm64 release

Hey cool provider,

Im using this on my M1X Apple laptop and getting:

 Error: Incompatible provider version
│ 
│ Provider registry.terraform.io/trois-six/sendgrid v0.1.6 does not have a package available for your current platform, darwin_arm64.
│ 
│ Provider releases are separate from Terraform CLI releases, so not all providers are available for all platforms. Other versions of this provider may have different platforms
│ supported.

Please add darwin_arm64 release <3 <3

Cannot create subuser

Terraform is crashing while trying to create a subuser. Plan is successful but crashes when applying. Manual subuser creation successful and creation of other resources (dynamic template) through the provider is successful but not for subusers.

Panic message from the crash suggesting a provider issue:

plugin.terraform-provider-sendgrid_v0.1.3: panic: interface conversion: interface {} is *schema.Set, not []string

Detailed log:

2021-03-08T16:04:19.150Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: 2021/03/08 16:04:19 [WARN] Truncating attribute path of 0 diagnostics for TypeSet
2021/03/08 16:04:19 [TRACE] eval: *terraform.EvalCheckPlannedChange
2021/03/08 16:04:19 [TRACE] EvalCheckPlannedChange: Verifying that actual change (action Create) matches planned change (action Create)
2021/03/08 16:04:19 [TRACE] eval: *terraform.EvalGetProvider
2021/03/08 16:04:19 [TRACE] eval: *terraform.EvalReadState
2021/03/08 16:04:19 [TRACE] EvalReadState: reading state for sendgrid_subuser.user
2021/03/08 16:04:19 [TRACE] EvalReadState: no state present for sendgrid_subuser.user
2021/03/08 16:04:19 [TRACE] eval: *terraform.EvalReduceDiff
2021/03/08 16:04:19 [TRACE] eval: *terraform.EvalIf
2021/03/08 16:04:19 [TRACE] eval: terraform.EvalNoop
2021/03/08 16:04:19 [TRACE] eval: *terraform.EvalApplyPre
2021/03/08 16:04:19 [TRACE] eval: *terraform.EvalApply
2021/03/08 16:04:19 [DEBUG] EvalApply: ProviderMeta config value set
2021/03/08 16:04:19 [DEBUG] sendgrid_subuser.user: applying the planned Create change
2021/03/08 16:04:19 [TRACE] GRPCProvider: ApplyResourceChange
2021-03-08T16:04:19.157Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: panic: interface conversion: interface {} is *schema.Set, not []string
2021-03-08T16:04:19.157Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3:
2021-03-08T16:04:19.157Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: goroutine 68 [running]:
2021-03-08T16:04:19.157Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: github.com/trois-six/terraform-provider-sendgrid/sendgrid.resourceSendgridSubuserCreate(0x190d8e0, 0xc00006d1a0, 0xc00014d180, 0x17fa2c0, 0xc000015b30, 0xc0002422e0, 0x12d6e2a, 0xc0005311e0)
2021-03-08T16:04:19.157Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: github.com/trois-six/terraform-provider-sendgrid/sendgrid/resource_sendgrid_subuser.go:95 +0x5a5
2021-03-08T16:04:19.157Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema.(*Resource).create(0xc0003360b0, 0x190d860, 0xc0002360c0, 0xc00014d180, 0x17fa2c0, 0xc000015b30, 0x0, 0x0, 0x0)
2021-03-08T16:04:19.157Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: github.com/hashicorp/terraform-plugin-sdk/[email protected]/helper/schema/resource.go:276 +0x1ea
2021-03-08T16:04:19.157Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema.(*Resource).Apply(0xc0003360b0, 0x190d860, 0xc0002360c0, 0xc0001624d0, 0xc0005311e0, 0x17fa2c0, 0xc000015b30, 0x0, 0x0, 0x0, ...)
2021-03-08T16:04:19.157Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: github.com/hashicorp/terraform-plugin-sdk/[email protected]/helper/schema/resource.go:387 +0x67b
2021-03-08T16:04:19.158Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: github.com/hashicorp/terraform-plugin-sdk/v2/internal/helper/plugin.(*GRPCProviderServer).ApplyResourceChange(0xc00027a1e0, 0x190d860, 0xc0002360c0, 0xc0001621c0, 0xc00027a1e0, 0xc00027a1f0, 0x1859b30)
2021-03-08T16:04:19.158Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: github.com/hashicorp/terraform-plugin-sdk/[email protected]/internal/helper/plugin/grpc_provider.go:952 +0x8cf
2021-03-08T16:04:19.158Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: github.com/hashicorp/terraform-plugin-sdk/v2/internal/tfplugin5._Provider_ApplyResourceChange_Handler.func1(0x190d860, 0xc0002360c0, 0x17f0fc0, 0xc0001621c0, 0xc0002360c0, 0x177a620, 0xc00006cb01, 0xc000530e80)
2021-03-08T16:04:19.158Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: github.com/hashicorp/terraform-plugin-sdk/[email protected]/internal/tfplugin5/tfplugin5.pb.go:3312 +0x89
2021-03-08T16:04:19.158Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: github.com/hashicorp/terraform-plugin-sdk/v2/plugin.Serve.func3.1(0x190d920, 0xc0002a8cc0, 0x17f0fc0, 0xc0001621c0, 0xc000530e60, 0xc000530e80, 0xc000502ba0, 0x11c56c6, 0x17ca220, 0xc0002a8cc0)
2021-03-08T16:04:19.158Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: github.com/hashicorp/terraform-plugin-sdk/[email protected]/plugin/serve.go:76 +0x87
2021-03-08T16:04:19.158Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: github.com/hashicorp/terraform-plugin-sdk/v2/internal/tfplugin5._Provider_ApplyResourceChange_Handler(0x17ff280, 0xc00027a1e0, 0x190d920, 0xc0002a8cc0, 0xc00006cb40, 0xc000531580, 0x190d920, 0xc0002a8cc0, 0xc0002341e0, 0x1d0)
2021-03-08T16:04:19.158Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: github.com/hashicorp/terraform-plugin-sdk/[email protected]/internal/tfplugin5/tfplugin5.pb.go:3314 +0x150
2021-03-08T16:04:19.158Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: google.golang.org/grpc.(*Server).processUnaryRPC(0xc000238fc0, 0x1914d00, 0xc000083680, 0xc000160300, 0xc00008e720, 0x1d180e0, 0x0, 0x0, 0x0)
2021-03-08T16:04:19.158Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: google.golang.org/[email protected]/server.go:1171 +0x522
2021-03-08T16:04:19.158Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: google.golang.org/grpc.(*Server).handleStream(0xc000238fc0, 0x1914d00, 0xc000083680, 0xc000160300, 0x0)
2021-03-08T16:04:19.158Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: google.golang.org/[email protected]/server.go:1494 +0xcc5
2021-03-08T16:04:19.158Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: google.golang.org/grpc.(*Server).serveStreams.func1.2(0xc0000961b0, 0xc000238fc0, 0x1914d00, 0xc000083680, 0xc000160300)
2021-03-08T16:04:19.158Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: google.golang.org/[email protected]/server.go:834 +0xa5
2021-03-08T16:04:19.158Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: created by google.golang.org/grpc.(*Server).serveStreams.func1
2021-03-08T16:04:19.158Z [DEBUG] plugin.terraform-provider-sendgrid_v0.1.3: google.golang.org/[email protected]/server.go:832 +0x1fd
2021-03-08T16:04:19.158Z [WARN] plugin.stdio: received EOF, stopping recv loop: err="rpc error: code = Unavailable desc = transport is closing"
2021-03-08T16:04:19.159Z [DEBUG] plugin: plugin process exited: path=.terraform/plugins/registry.terraform.io/trois-six/sendgrid/0.1.3/darwin_amd64/terraform-provider-sendgrid_v0.1.3 pid=14511 error="exit status 2"
2021/03/08 16:04:19 [DEBUG] sendgrid_subuser.user: apply errored, but we're indicating that via the Error pointer rather than returning it: rpc error: code = Unavailable desc = transport is closing
2021/03/08 16:04:19 [TRACE] eval: *terraform.EvalMaybeTainted
2021/03/08 16:04:19 [TRACE] EvalMaybeTainted: sendgrid_subuser.user encountered an error during creation, so it is now marked as tainted
2021/03/08 16:04:19 [TRACE] eval: *terraform.EvalWriteState
2021/03/08 16:04:19 [TRACE] EvalWriteState: removing state object for sendgrid_subuser.user
2021/03/08 16:04:19 [TRACE] eval: *terraform.EvalApplyProvisioners
2021/03/08 16:04:19 [TRACE] EvalApplyProvisioners: sendgrid_subuser.user has no state, so skipping provisioners
2021/03/08 16:04:19 [TRACE] eval: *terraform.EvalMaybeTainted
2021/03/08 16:04:19 [TRACE] EvalMaybeTainted: sendgrid_subuser.user encountered an error during creation, so it is now marked as tainted
2021/03/08 16:04:19 [TRACE] eval: *terraform.EvalWriteState
2021/03/08 16:04:19 [TRACE] EvalWriteState: removing state object for sendgrid_subuser.user
2021/03/08 16:04:19 [TRACE] eval: *terraform.EvalIf
2021/03/08 16:04:19 [TRACE] eval: *terraform.EvalIf
2021/03/08 16:04:19 [TRACE] eval: *terraform.EvalWriteDiff
2021/03/08 16:04:19 [TRACE] eval: *terraform.EvalApplyPost
2021/03/08 16:04:19 [ERROR] eval: *terraform.EvalApplyPost, err: rpc error: code = Unavailable desc = transport is closing
2021/03/08 16:04:19 [ERROR] eval: *terraform.EvalSequence, err: rpc error: code = Unavailable desc = transport is closing
2021/03/08 16:04:19 [TRACE] [walkApply] Exiting eval tree: sendgrid_subuser.user
2021/03/08 16:04:19 [TRACE] vertex "sendgrid_subuser.user": visit complete
2021/03/08 16:04:19 [TRACE] dag/walk: upstream of "provider["registry.terraform.io/trois-six/sendgrid"] (close)" errored, so skipping
2021/03/08 16:04:19 [TRACE] No provider meta schema returned
2021/03/08 16:04:19 [TRACE] GRPCProvider: Configure

Configuration:
Terrraform: v0.13.4 (Also tested v0.14.4 and 0.14.7)
OS: MacOS 10.15 (Also tested on Ubuntu 20 and Win 10)
TF code:

resource "sendgrid_subuser" "user" {
provider = sendgrid
username = "mynewsubuseraccount"
email = "useremail"email.net"
password = "16-digit-password"
ips = [
"1.2.3.4" //actual-ip masked
]
}

Can't create template

Hello,
I used the example you give to create a SendGrid template in terraform, and I get the following:

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

sendgrid_template.template: Creating...

Error: Provider produced inconsistent result after apply

When applying changes to sendgrid_template.template, provider
"registry.terraform.io/trois-six/sendgrid" produced an unexpected new value:
Root resource was present, but now absent.

This is a bug in the provider, which should be reported in the provider's own
issue tracker.

ERRO[0017] Hit multiple errors:
Hit multiple errors:
exit status 1

I am running the following:
Terraform: v0.14.6
Terragrunt: v0.28.3.

Please let me know if you need additional information.

Thanks!

Apply always detect changes due to 2FA

Whenever I do terraform apply, the following changes are detected.

      ~ scopes  = [
          - "2fa_required",
            "mail.send",
            "sender_verification_eligible",
        ]

This is due to 2fa_required being since Q4 2020.

public_key not set on webhook resources

I created a webhook resource specifying signed = true, and expected the public key to be accessible for referencing later (as detailed in https://registry.terraform.io/providers/Trois-Six/sendgrid/latest/docs/resources/event_webhook#attributes-reference

This doesn't seem to be working. Running this terraform definition:

provider sendgrid {
  api_key = "<REDACTED>"
}

resource "sendgrid_event_webhook" "blacklist" {
  enabled = true
  url = "<REDACTED>"
  group_resubscribe = false
  group_unsubscribe = false
  unsubscribe = false
  click = false
  open = false
  spam_report = true
  processed = true
  delivered = true
  deferred = true
  dropped = true
  bounce = true
  signed = true
}

output "mail_sender_public_key" {
    value = sendgrid_event_webhook.blacklist.public_key
}

yields this output:

Outputs:

mail_sender_public_key = ""

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.