Git Product home page Git Product logo

truemail-rack's Introduction

Truemail server - lightweight rack based web API

Maintainability Test Coverage CircleCI GitHub release (latest by date) Gitter GitHub Contributor Covenant

Truemail server - lightweight rack based web API wrapper for Truemail gem. Verify email via Regex, DNS, SMTP and even more. Be sure that email address valid and exists.

Actual and maintainable documentation πŸ“š for developers is living here.

Table of Contents

Features

  • Application configuration through environment vars
  • One endpoint for email validation with token-based authentication
  • No DB usage

Installation

git clone https://github.com/truemail-rb/truemail-rack.git

Usage

Before run application you must configure it first. List of available env vars names and values:

Var name Value example Required Description
VERIFIER_EMAIL [email protected] + Must be an existing email on behalf of which verification will be performed.
ACCESS_TOKENS some_token + These tokens will be used for token-based authentication. Accepts one ore more values separated by commas.
VERIFIER_DOMAIN somedomain.com - Must be an existing domain on behalf of which verification will be performed. By default verifier domain based on verifier email.
EMAIL_PATTERN /regex_pattern/ - You can override default Truemail regex pattern.
SMTP_ERROR_BODY_PATTERN /regex_pattern/ - You can override default Truemail regex pattern.
CONNECTION_TIMEOUT 1 - Connection timeout is equal to 2 ms by default.
RESPONSE_TIMEOUT 1 - A SMTP server response timeout is equal to 2 ms by default.
CONNECTION_ATTEMPTS 3 - Total of connection attempts. It is equal to 2 by default. This parameter uses in mx lookup timeout error and smtp request (for cases when there is one mx server).
DEFAULT_VALIDATION_TYPE mx - You can predefine Truemail default validation type (smtp). Available validation types: regex, mx, mx_blacklist, smtp.
VALIDATION_TYPE_FOR somedomain.com:regex - You can predefine which type of validation will be used for domains. Available validation types: regex, mx, mx_blacklist, smtp. This configuration will be used over DEFAULT_VALIDATION_TYPE. All of validations for somedomain.com will be processed with regex validation only. Accepts one or more key:value separated by commas.
WHITELISTED_EMAILS [email protected] - Validation of email which contains whitelisted email always will return true. Other validations will not processed even if it was defined in VALIDATION_TYPE_FOR. Accepts one ore more values separated by commas.
BLACKLISTED_EMAILS [email protected] - Validation of email which contains blacklisted email always will return false. Other validations will not processed even if it was defined in VALIDATION_TYPE_FOR. Accepts one ore more values separated by commas.
WHITELISTED_DOMAINS somedomain1.com - Validation of email which contains whitelisted domain always will return true. Other validations will not processed even if it was defined in VALIDATION_TYPE_FOR. Accepts one ore more values separated by commas.
BLACKLISTED_DOMAINS somedomain2.com - Validation of email which contains blacklisted domain always will return false. Other validations will not processed even if it was defined in VALIDATION_TYPE_FOR. Accepts one ore more values separated by commas.
WHITELIST_VALIDATION true - With this option Truemail will validate email which contains whitelisted domain only, i.e. if domain whitelisted, validation will passed to Regex, MX or SMTP validators. Validation of email which not contains whitelisted domain always will return false. It is equal false by default.
BLACKLISTED_MX_IP_ADDRESSES 127.0.1.1,127.0.1.2 - With this option Truemail will filter out unwanted mx servers via predefined list of ip addresses. It can be used as a part of DEA (disposable email address) validations. Accepts one ore more values separated by commas.
DNS 8.8.8.8,8.8.4.4:53 - This option will provide to use custom DNS gateway when Truemail interacts with DNS. If you won't specify nameserver's ports Truemail will use default DNS TCP/UDP port 53. Accepts one ore more values separated by commas. By default Truemail uses DNS gateway from system settings.
NOT_RFC_MX_LOOKUP_FLOW true - This option will provide to use not RFC MX lookup flow. It means that MX and Null MX records will be checked on the DNS validation layer only. By default this option is disabled.
SMTP_PORT 2525 - SMTP port number. It is equal to 25 by default.
SMTP_FAIL_FAST true - This option will provide to use SMTP fail fast behavior. When smtp_fail_fast is enabled it means that Truemail ends smtp validation session after first attempt on the first mx server in any fail cases (network connection/timeout error, smtp validation error). By default this option is disabled, available for SMTP validation only.
SMTP_SAFE_CHECK true - This option will be parse bodies of SMTP errors. It will be helpful if SMTP server does not return an exact answer that the email does not exist. By default this option is disabled, available for SMTP validation only.
LOG_STDOUT true - This option will be enable log all http requests to stdout. By default this option is disabled.

Run Truemail server with command as in example below:

Simple configuration example

[email protected] ACCESS_TOKENS=a262d915-15bc-417c-afeb-842c63b54154 rackup

# =>
# Thin web server (v1.8.1 codename Infinite Smoothie)
# Maximum connections set to 1024
# Listening on localhost:9292, CTRL+C to stop

Advanced configuration example

[email protected] \
ACCESS_TOKENS=a262d915-15bc-417c-afeb-842c63b54154,f44cd67e-aaa0-4e6c-aa6c-d52cf61f84ac \
EMAIL_PATTERN="/\A.+@.+\z/" \
SMTP_ERROR_BODY_PATTERN="/(?=.*550)(?=.*(user|account|customer|mailbox|something_else)).*/" \
VALIDATION_TYPE_FOR=somedomain1.com:regex,somedomain2.com:mx \
[email protected] \
[email protected],[email protected] \
WHITELISTED_DOMAINS=somedomain3.com \
BLACKLISTED_DOMAINS=somedomain4.com,somedomain5.com \
WHITELIST_VALIDATION=true \
BLACKLISTED_MX_IP_ADDRESSES=127.0.1.1,127.0.1.2 \
DNS=8.8.8.8,8.8.4.4:53 \
NOT_RFC_MX_LOOKUP_FLOW=true \
SMTP_PORT=2525 \
SMTP_FAIL_FAST=true \
SMTP_SAFE_CHECK=true \
LOG_STDOUT=true \
thin -R config.ru -a 0.0.0.0 -p 9292 -e production start

# =>
# Thin web server (v1.8.1 codename Infinite Smoothie)
# Maximum connections set to 1024
# Listening on localhost:9292, CTRL+C to stop
# 127.0.0.1 - - [26/Feb/2020:16:41:13 +0200] "GET /?email=admin%40bestweb.com.ua HTTP/1.1" 200 - 0.9195

Request/response example

Existent email

curl -i -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: a262d915-15bc-417c-afeb-842c63b54154" http://localhost:9292?[email protected]
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 410
Connection: keep-alive
Server: thin

{
  "date": "2021-02-07 10:00:56 +0200",
  "email": "[email protected]",
  "validation_type": "smtp",
  "success": true,
  "errors": null,
  "smtp_debug": null,
  "configuration": {
    "validation_type_by_domain": null,
    "whitelisted_emails": null,
    "blacklisted_emails": null,
    "whitelisted_domains": null,
    "blacklisted_domains": null,
    "whitelist_validation": false,
    "blacklisted_mx_ip_addresses": null,
    "dns": null,
    "email_pattern": "default gem value",
    "not_rfc_mx_lookup_flow": false,
    "smtp_error_body_pattern": "default gem value",
    "smtp_fail_fast": false,
    "smtp_safe_check": false
  }
}

Nonexistent email

curl -i -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: a262d915-15bc-417c-afeb-842c63b54154" http://localhost:9292?[email protected]
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 541
Connection: keep-alive
Server: thin

{
  "date": "2021-02-07 10:10:42 +0200",
  "email": "[email protected]",
  "validation_type": "smtp",
  "success": false,
  "errors": {
    "smtp": "smtp error"
  },
  "smtp_debug": [
    {
      "connection": true,
      "errors": {
        "rcptto": "550 5.7.1 No such user!\n"
      },
      "mail_host": "213.180.204.89",
      "port_opened": true
    }
  ],
  "configuration": {
    "validation_type_by_domain": null,
    "whitelisted_emails": null,
    "blacklisted_emails": null,
    "whitelisted_domains": null,
    "blacklisted_domains": null,
    "whitelist_validation": false,
    "blacklisted_mx_ip_addresses": null,
    "dns": null,
    "email_pattern": "default gem value",
    "not_rfc_mx_lookup_flow": false,
    "smtp_error_body_pattern": "default gem value",
    "smtp_fail_fast": false,
    "smtp_safe_check": false
  }
}

Version

curl -i -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: a262d915-15bc-417c-afeb-842c63b54154" http://localhost:9292/version
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 108
Content-Type: application/json
Server: thin

{
  "core": "3.3.0",
  "platform": "ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin22]",
  "version": "0.10.0"
}

Healthcheck

curl -i http://localhost:9292/healthcheck
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 0
Connection: keep-alive
Server: thin

Truemail family

All Truemail solutions: https://truemail-rb.org

Name Type Description
truemail ruby gem Configurable framework agnostic plain Ruby email validator, main core
truemail-go go package Configurable Golang email validator, main core
truemail-rack-docker docker image Lightweight rack based web API dockerized image 🐳 of Truemail server
truemail-ruby-client ruby gem Truemail web API client library for Ruby
truemail-crystal-client crystal shard Truemail web API client library for Crystal
truemail-java-client java lib Truemail web API client library for Java
truemail-rspec ruby gem Truemail configuration and validator RSpec helpers

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/truemail-rb/truemail-rack. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct. Please check the open tickets. Be sure to follow Contributor Code of Conduct below and our Contributing Guidelines.

License

This application is available as open source under the terms of the MIT License.

Code of Conduct

Everyone interacting in the Truemail project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.

Credits

Versioning

truemail-rack uses Semantic Versioning 2.0.0

truemail-rack's People

Contributors

bestwebua avatar dependabot[bot] 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

Watchers

 avatar  avatar

truemail-rack's Issues

[ISSUE] cannot load such file -- dry-types (LoadError)

New issue checklist

Issue description

Did a fresh install of rack and this package and ran into this error starting up:

$ [email protected] ACCESS_TOKENS=a262d915-15bc-417c-afeb-842c63b54154 rackup
Traceback (most recent call last):
	20: from /usr/local/bin/rackup:23:in `<main>'
	19: from /usr/local/bin/rackup:23:in `load'
	18: from /var/lib/gems/2.7.0/gems/rackup-2.1.0/bin/rackup:5:in `<top (required)>'
	17: from /var/lib/gems/2.7.0/gems/rackup-2.1.0/lib/rackup/server.rb:182:in `start'
	16: from /var/lib/gems/2.7.0/gems/rackup-2.1.0/lib/rackup/server.rb:325:in `start'
	15: from /var/lib/gems/2.7.0/gems/rackup-2.1.0/lib/rackup/server.rb:382:in `handle_profiling'
	14: from /var/lib/gems/2.7.0/gems/rackup-2.1.0/lib/rackup/server.rb:326:in `block in start'
	13: from /var/lib/gems/2.7.0/gems/rackup-2.1.0/lib/rackup/server.rb:424:in `wrapped_app'
	12: from /var/lib/gems/2.7.0/gems/rackup-2.1.0/lib/rackup/server.rb:263:in `app'
	11: from /var/lib/gems/2.7.0/gems/rackup-2.1.0/lib/rackup/server.rb:354:in `build_app_and_options_from_config'
	10: from /var/lib/gems/2.7.0/gems/rack-3.0.8/lib/rack/builder.rb:64:in `parse_file'
	 9: from /var/lib/gems/2.7.0/gems/rack-3.0.8/lib/rack/builder.rb:94:in `load_file'
	 8: from /var/lib/gems/2.7.0/gems/rack-3.0.8/lib/rack/builder.rb:103:in `new_from_string'
	 7: from /var/lib/gems/2.7.0/gems/rack-3.0.8/lib/rack/builder.rb:103:in `eval'
	 6: from /srv/www/sandbox/public_html/test/truemail-rack/config.ru:7:in `block in <main>'
	 5: from /srv/www/sandbox/public_html/test/truemail-rack/config.ru:7:in `require_relative'
	 4: from /srv/www/sandbox/public_html/test/truemail-rack/config/loader.rb:3:in `<top (required)>'
	 3: from /srv/www/sandbox/public_html/test/truemail-rack/config/loader.rb:3:in `require_relative'
	 2: from /srv/www/sandbox/public_html/test/truemail-rack/config/system/types.rb:3:in `<top (required)>'
	 1: from /usr/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'
/usr/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require': cannot load such file -- dry-types (LoadError)

[BUG] Creating zombie processes

New bug checklist

Bug description

I'm running Truemail server in docker container and everything works great in the beginning. After some time I cannot log in onto my Ubuntu server and I have to reboot it just so I can ssh. When I looked into it, I noticed that there is big number of zombie processes and that they are growing when truemail server is working. It keeps growing until it's impossible to open new processes and log into the server via ssh.
I'm thinking of making a script that would reset docker-compose, but I'm wondering if it's something that could be repaired in the container. What could cause this.
My logs are showing some kind of error that repeats from time to time and which I don't know where is coming from:

Complete output when running truemail, including the stack trace and command used
docker compose logs --tail=500                     
truemail-truemail-1  | Truemail lightweight rack based web API πŸš€
truemail-truemail-1  | 2024-01-11 04:58:56 +0000 Thin web server (v1.8.2 codename Ruby Razor)
truemail-truemail-1  | 2024-01-11 04:58:56 +0000 Maximum connections set to 1024
truemail-truemail-1  | 2024-01-11 04:58:56 +0000 Listening on 0.0.0.0:9292, CTRL+C to stop
truemail-truemail-1  | 2024-01-11 05:11:39 +0000 Invalid request: Invalid HTTP format, parsing fails.
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/request.rb:86:in `execute'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/request.rb:86:in `parse'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/connection.rb:39:in `receive_data'
truemail-truemail-1  | 	/usr/local/bundle/gems/eventmachine-1.2.7/lib/eventmachine.rb:195:in `run_machine'
truemail-truemail-1  | 	/usr/local/bundle/gems/eventmachine-1.2.7/lib/eventmachine.rb:195:in `run'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/backends/base.rb:75:in `start'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/server.rb:162:in `start'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/controllers/controller.rb:87:in `start'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/runner.rb:203:in `run_command'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/runner.rb:159:in `run!'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/bin/thin:6:in `'
truemail-truemail-1  | 	/usr/local/bundle/bin/thin:25:in `load'
truemail-truemail-1  | 	/usr/local/bundle/bin/thin:25:in `'
truemail-truemail-1  | 
truemail-truemail-1  | 2024-01-11 05:24:28 +0000 Invalid request: Invalid HTTP format, parsing fails.
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/request.rb:86:in `execute'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/request.rb:86:in `parse'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/connection.rb:39:in `receive_data'
truemail-truemail-1  | 	/usr/local/bundle/gems/eventmachine-1.2.7/lib/eventmachine.rb:195:in `run_machine'
truemail-truemail-1  | 	/usr/local/bundle/gems/eventmachine-1.2.7/lib/eventmachine.rb:195:in `run'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/backends/base.rb:75:in `start'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/server.rb:162:in `start'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/controllers/controller.rb:87:in `start'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/runner.rb:203:in `run_command'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/runner.rb:159:in `run!'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/bin/thin:6:in `'
truemail-truemail-1  | 	/usr/local/bundle/bin/thin:25:in `load'
truemail-truemail-1  | 	/usr/local/bundle/bin/thin:25:in `'
truemail-truemail-1  | 
truemail-truemail-1  | 2024-01-11 05:40:17 +0000 Invalid request: Invalid HTTP format, parsing fails.
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/request.rb:86:in `execute'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/request.rb:86:in `parse'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/connection.rb:39:in `receive_data'
truemail-truemail-1  | 	/usr/local/bundle/gems/eventmachine-1.2.7/lib/eventmachine.rb:195:in `run_machine'
truemail-truemail-1  | 	/usr/local/bundle/gems/eventmachine-1.2.7/lib/eventmachine.rb:195:in `run'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/backends/base.rb:75:in `start'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/server.rb:162:in `start'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/controllers/controller.rb:87:in `start'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/runner.rb:203:in `run_command'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/lib/thin/runner.rb:159:in `run!'
truemail-truemail-1  | 	/usr/local/bundle/gems/thin-1.8.2/bin/thin:6:in `'
truemail-truemail-1  | 	/usr/local/bundle/bin/thin:25:in `load'
truemail-truemail-1  | 	/usr/local/bundle/bin/thin:25:in `'
truemail-truemail-1  | 
  
This is my docker-compose.yml file:
version: "3.7"

services:
truemail:
image: truemail/truemail-rack:latest
ports:
- 9292:9292
environment:
VERIFIER_EMAIL: my-email
VERIFIER_DOMAIN: my-domain
DEFAULT_VALIDATION_TYPE: smtp
VIRTUAL_HOST: my-host
VIRTUAL_PORT: 9292
LETSENCRYPT_HOST: my-host
LETSENCRYPT_EMAIL: my-host-email
env_file:
- .env
tty: true

Am I doing something wrong and can you tell what from this data? I believe I did it straightforward as suggested.
Thanks!

[QUESTION] Is it possible to self host this service for email validation?

Details

Is there a way to support validation such that our server IP address is not blocked by the mail server like gmail, outlook, etc?

"smtp_debug": [
        {
            "mail_host": "[ip]",
            "port_opened": true,
            "connection": false,
            "errors": {
                "mailfrom": "<ip> Service unavailable, Client host [ip] blocked using Spamhaus. To request removal from this list see https://www.spamhaus.org/query/ip/[ip] (AS3130).",
                "connection": "SSL_read: unexpected eof while reading"
            }
        }
    ],

[ISSUE] "resource not found" across wide range of hosting environments

New Issue Checklist

Issue Description

The Docker image of Truemail-rack mounts properly in a range of environments -- Plesk, Cyberpanel, Portainer, etc.. However, all attempts to use it from the command line fail with "error":"resource not found".

This occurs via HTTPS or HTTP. (Attempts to secure the subdomain via SSL report back as successful but HTTPS connections to the API always fail.) It occurs on a single-host box with one domain, trying to access the API with a single verification test via a browser using either the domain or the IP in the URL. It occurs when trying to use the default port of 9292 or when a management app like Portainer assigns a random IP.

I suspect this is user/installer error rather than a problem with Truemail, but I wanted to report the difficulty in hope of guidance.

Example URLs that create this error:

https://validator.domain.com/api/v1/verify/status?access_token={api-key}&email_id={email}

https://validator.domain.com:{assigned-port}/api/v1/verify/single?address_info=1&timeout=100&access_token={API-key}&email={email}
Complete output when running truemail, including the stack trace and command used
{"error":"resource not found"}

[QUESTION] SMTP-AUTH requested but missing secret phrase, message errors

New issue checklist

Issue description

We received this error when we try to check email address:

Complete output when running truemail, including the stack trace and command used
{"date":"2021-12-21 16:43:15 +0100",

"email":"[email protected]","

validation_type":"smtp",

"success":false,
"errors":{"smtp":"smtp error"},
"smtp_debug":[{"mail_host":"142.250.110.26","port_opened":true,
"connection":false,
"errors":{"connection":"SMTP-AUTH requested but missing secret phrase"}},

{"mail_host":"142.251.9.26","port_opened":true,
"connection":false,"errors":{"connection":"SMTP-AUTH requested but missing secret phrase"}},

{"mail_host":"142.250.150.26",
"port_opened":true,
"connection":false,
"errors":{"connection":"SMTP-AUTH requested but missing secret phrase"}},

{"mail_host":"74.125.200.27",
"port_opened":true,"connection":false,
"errors":{"connection":"SMTP-AUTH requested but missing secret phrase"}},

{"mail_host":"142.250.157.26",
"port_opened":true,
"connection":false,
"errors":{"connection":"SMTP-AUTH requested but missing secret phrase"}}],


"configuration":{"validation_type_by_domain":null,
"whitelist_validation":false,"whitelisted_domains":null,"blacklisted_domains":null,"blacklisted_mx_ip_addresses":null,"dns":null,"not_rfc_mx_lookup_flow":false,"smtp_fail_fast":false,"smtp_safe_check":false,"email_pattern":"default gem value","smtp_error_body_pattern":"default gem value"}}

[INSERT OUTPUT HERE]

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.