Coder Social home page Coder Social logo

mailcheck's Introduction

mailcheck.js

TravisCI Build Status

The Javascript library and jQuery plugin that suggests a right domain when your users misspell it in an email address.

mailcheck.js is part of the Mailcheck family, and we're always on the lookout for more ports and adaptions. Get in touch!

What does it do?

When your user types in "[email protected]", Mailcheck will suggest "[email protected]".

Mailcheck will offer up suggestions for second and top level domains too. For example, when a user types in "[email protected]", "hotmail.com" will be suggested. Similarly, if only the second level domain is misspelled, it will be corrected independently of the top level domain.

diagram

See it live in action here.

Installation

For instant use, download the minified library mailcheck.min.js into your javascripts directory. mailcheck.js is also available unminimised if you want to hack on it, or have your own minimizer.

Bower

> bower install --save mailcheck

Node/Browserify

> npm install --save mailcheck

Usage with jQuery

First, include jQuery and Mailcheck into the page.

<script src="jquery.min.js"></script>
<script src="mailcheck.min.js"></script>

Have a text field.

<input id="email" name="email" type="email" />

Now, attach Mailcheck to the text field. You can declare an array of domains, second level domains and top level domains you want to check against.

<script>
var domains = ['gmail.com', 'aol.com'];
var secondLevelDomains = ['hotmail']
var topLevelDomains = ["com", "net", "org"];

var superStringDistance = function(string1, string2) {
  // a string distance algorithm of your choosing
}

$('#email').on('blur', function() {
  $(this).mailcheck({
    domains: domains,                       // optional
    secondLevelDomains: secondLevelDomains, // optional
    topLevelDomains: topLevelDomains,       // optional
    distanceFunction: superStringDistance,  // optional
    suggested: function(element, suggestion) {
      // callback code
    },
    empty: function(element) {
      // callback code
    }
  });
});
</script>

Mailcheck takes in two callbacks, suggested and empty. We recommend you supply both.

suggested is called when there's a suggestion. Mailcheck passes in the target element and the suggestion. The suggestion is an object with the following members:

{
  address: 'test',          // the address; part before the @ sign
  domain: 'gmail.com',    // the suggested domain
  full: '[email protected]'  // the full suggested email
}

Mailcheck does not want to get in the way of how you can show suggestions. Use the suggestion object to display suggestions in your preferred manner.

empty is called when there's no suggestion. Mailcheck just passes in the target element. It is a good idea to use this callback to clear an existing suggestion.

Usage without jQuery

Mailcheck is decoupled from jQuery, so its usage without jQuery is almost identical.

Using the example from above, you would call Mailcheck.run instead.

<script>
Mailcheck.run({
  email: yourTextInput.value,
  domains: domains,                       // optional
  topLevelDomains: topLevelDomains,       // optional
  secondLevelDomains: secondLevelDomains, // optional
  distanceFunction: superStringDistance,  // optional
  suggested: function(suggestion) {
    // callback code
  },
  empty: function() {
    // callback code
  }
});
</script>

The rest works similarly. In fact, the Mailcheck jQuery plugin just wraps Mailcheck.run.

Usage on Node.js

If you're running this on Node.js, you can just require('mailcheck') to get the mailcheck object, and call run on that:

var mailcheck = require('mailcheck');

mailcheck.run({
  // see 'usage without jQuery' above.
});

Domains

Mailcheck has inbuilt defaults if the domains, secondLevelDomains or topLevelDomains options aren't provided. We still recommend supplying your own domains based on the distribution of your users.

Adding your own Domains

You can replace Mailcheck's default domain/TLD suggestions by supplying replacements to mailcheck.run:

Mailcheck.run({
  domains: ['customdomain.com', 'anotherdomain.net'], // replaces existing domains
  secondLevelDomains: ['domain', 'yetanotherdomain'], // replaces existing SLDs
  topLevelDomains: ['com.au', 'ru'] // replaces existing TLDs
});

Alternatively, you can extend Mailcheck's global set of default domains and TLDs by adding items to Mailcheck.defaultDomains and Mailcheck.defaultTopLevelDomains:

Mailcheck.defaultDomains.push('customdomain.com', 'anotherdomain.net') // extend existing domains
Mailcheck.defaultSecondLevelDomains.push('domain', 'yetanotherdomain') // extend existing SLDs
Mailcheck.defaultTopLevelDomains.push('com.au', 'ru') // extend existing TLDs

Customization

The Mailcheck jQuery plugin wraps Mailcheck. The prime candidates for customization are the methods Mailcheck.findClosestDomain and Mailcheck.stringDistance.

Mailcheck currently uses the sift3 string similarity algorithm by Siderite. You can modify the inbuilt string distance function, or pass in your own when calling Mailcheck.

Since Mailcheck runs client side, keep in mind file size, memory usage and performance.

Tests

Mailcheck is tested with Jasmine. Run npm test from the command line to run the test suite. Alternatively, you can Load spec/spec_runner.html in your browser.

Contributing

Let's make Mailcheck awesome. We're on the lookout for maintainers and contributors.

And do send in those pull requests! To get them accepted, please:

  • Test your code. Add test cases to spec/mailcheckSpec.js, and run it across browsers (yes, including IE).
  • Minify the plugin by running grunt in the Mailcheck directory (npm install should have installed a git pre-commit hook that takes care of this for you).

Upcoming features, bugs and feature requests are managed in Issues.

Who uses Mailcheck?

Do you use Mailcheck? Tweet me your link.

Related Links

Core Team

License

Released under the MIT License.

mailcheck's People

Contributors

arunthampi avatar aseemk avatar ball-hayden avatar caphun avatar derrickko avatar erikjansson avatar fulldecent avatar gdiggs avatar gmac avatar henrythewasp avatar hjwp avatar jamesgardner82 avatar jasonong avatar jdpopkin avatar jonashaag avatar julien-c avatar kerwitz avatar kkirsche avatar mauk81 avatar mike-stewart avatar niftylettuce avatar rousisk avatar skoschnicke avatar stique avatar timoxley avatar tombailey avatar tombyrer avatar trizko avatar weilu avatar yaotti 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  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

mailcheck's Issues

suggestion for fixing versioning?

Seems that someone else also assume that the uncompressed file contained the correct file version at the jsDelivr CDN (where I also help out at):
https://github.com/jsdelivr/jsdelivr/tree/master/files/mailcheck
Which renders as: http://www.jsdelivr.com/#!mailcheck
Sorry for the cascading little errors, let's try to fix it. :)

I think we should copy the 1.1 folder into 1.0.5. (Unless you want to republish right away to v1.1.0.)
Though I'm not sure about the existing 1.1 folder. What do you suggest is the best solution?

  1. Nuke the /1.1 folder? I don't think jsDelivr manager @jimaek will like that since it can/will break existing websites that use it. (IF we could check if some don't depend on that file that would be great.)
  2. You skip v1.1 One advantage is that v1.1.0 is still open, but I'm not sure how latestversion will sort.
  3. ideas?

Add option for case-insensitive comparison

Current code will not catch "GMIL.COM" as something close for "gmail.com". I've implemented a change locally which adds an option to force lowercase before doing the comparison. It assumes that the list of domains is all lowercase as well.

Pull request to follow.

implementation

Can this be implemented with normal HTML and now jQuery?
i cant make the example work

Space is suggested at %20

"Accidentally" type a space before the email and the suggestion replaces the space with %20?
For example:

capture

The replacement happens with other special characters also..

npm install does not install newest version

As said in #104 i got exactly same problem, this time just through npm.

I can see he opened the issue 1. Of April, is there any eta. on when u actually will publish new versions to the package managers?

Conflict Between Top Level Domains and Domains.

If I include a top level domain such as 'fr'.
Kicksend.mailcheck.defaultTopLevelDomains.push( 'fr' );
And a domain already exists e.g: 'yahoo.com' I get the following problem.

If the user types in the email: [email protected]
I get the suggestion [email protected], when really there should be no suggestion as yahoo.fr should be an accepted email, since I added 'fr' as a top level domain.

Any thoughts?

sift3 string distance in IE7 is invalid.

This got caught by our QA team:

DimitarChristoff#1

compare:
String.distance('gmails.com', 'aol.co.uk')

Expected / seen: 8.5 in major browsers, actual: 0.5 in IE7
As a result, in IE7:

Expect [email protected]' to suggest[email protected], actual:[email protected]in our DB Expect[email protected]' to suggest [email protected], actual: [email protected] in your kicksend DB

As a workaround, I have now added levenstein to calculate the distance instead, seems far more reliable. https://github.com/DimitarChristoff/mailcheck/blob/master/src/String.distance.js#L71-93 or google for other implementations.

This is now covered by my test coverage and buster.js reports the following tests in Ie7 (they pass in all other browsers):

Internet Explorer 7.0 Windows: .FFF..........FFFFFF............
Failure: Internet Explorer 7.0 Windows String.distance tests Expect distance between two strings with 1 typo to be 1
    [assert.equals] 0 expected to be equal to 1

Failure: Internet Explorer 7.0 Windows String.distance tests Expect distance between two strings with 1 typo and 1 char difference to be 1.5
    [assert.equals] 0.5 expected to be equal to 1.5

Failure: Internet Explorer 7.0 Windows String.distance tests Expect distance between two unrelated strings to be length of base string
    [assert.equals] 0 expected to be equal to 5

Failure: Internet Explorer 7.0 Windows mailcheck.mootools distance tests Working with emails > Expect a typo in domain to produce a suggestion (gnail.com -> gmail.com)
    [assert.equals] undefined expected to be equal to gmail.com

Failure: Internet Explorer 7.0 Windows mailcheck.mootools distance tests Working with emails > Expect a typo in domain to produce a suggestion with custom threshold of 3 (gmail.org -> gmail.com)
    [assert.equals] undefined expected to be equal to gmail.com

Failure: Internet Explorer 7.0 Windows mailcheck.mootools distance tests Working with emails > Expect uppercase user input not to matter to suggestions
    [assert.equals] fsmail.net expected to be equal to hotmail.com

Failure: Internet Explorer 7.0 Windows mailcheck.mootools distance tests Working with emails > Expect obscure RFC compatible emails like "foo@bar"@gnail.com to produce a valid suggestion
    [assert.equals] undefined expected to be equal to gmail.com

Failure: Internet Explorer 7.0 Windows mailcheck.mootools distance tests Working with emails > Expect cache to store look-up for faster future reference
    [assert.equals] false expected to be equal to gmail.com

Failure: Internet Explorer 7.0 Windows mailcheck.mootools distance tests Working with emails > Expect cache to store look-up failures for faster future reference
    [assert.isFalse] Expected aol.co.uk to be false

4 test cases, 32 tests, 32 assertions, 9 failures, 0 errors, 0 timeouts

Bower points to a fork

Consider the following command and output.

$ bower search mailcheck
Search results:

    mailcheck git://github.com/niftylettuce/mailcheck.git

The bower package mailcheck points to a fork by @niftylettuce. That fork is way behind master and it misses tag 1.1.0.

I suggest to create a new mailcheck package and point it to this repository. And also to update the docs.

Failure to specify a TLD results in an invalid suggestion

Entry of certain invalid content results in the suggestion of domains such as "@com", "@edu", etc.

This seems to include many entries where a top-level domain is not specified. For example, entering "a@b" suggests "a@com"; entering "a@ad" suggests "a@edu", etc.

Certain items are caught, such as "@ao", which suggests "@aol.com".

Publish to NPM

I'd really like to use this updated version as an NPM module. Please can you publish it?

mailw.com is not mail.com or gmail.com

I own the domain mailw.com and when I enter the domain it asks if I am sure it is not mail.com.

This is not useful when you start questioning real domains. It makes the user think they are using a mail service which is not popular enough. If this is going to happen. You are doing FREE advertising for other mail services.

The w is on the opposite side of the keyboard so the user is not likely to misspell the domain anyway. I would look for typos of possibly maill.com or mail,com or maik.com maybe but even then how can you check spelling of domains when domains are misspelled anyway. All you can check is for incorrectly formatted emails.

Docs are Very poorly written, No default options..

This plugin doesn't work out of the box like any jQuery plugin should work, you need to feed it with options (which BTW is already in this js file....

It does not have smart defaults and the README file doesn't explain a thing about superStringDistance

Any plan to enhance this?

Create wiki page of suggested domains

The code from Kicksend's splash.js (http://kicksend.com/assets/splash.js) has a good list : "yahoo.com","google.com","hotmail.com","gmail.com","me.com","aol.com","mac.com","live.com","comcast.net","googlemail.com","msn.com","qq.com","163.com","hotmail.fr","yahoo.fr","yahoo.com.tw","hotmail.it","sbcglobal.net","hotmail.co.uk","yahoo.co.uk","yahoo.es"

What would be better would be a wiki for starter lists for users based on their region (country-specific domains vs. sites like Twitter) would be able to have lists that attempt to cover a larger portion of their user-base. People could then propose updates as they develop lists that suit the majority of their country's popular services.

Maintainer for npm?

Hi there,

I published this library to npm a while back, with your guys' blessing (#55). It's since been updated, so someone just emailed me asking me to update the version in npm.

I was happy to, but I figure someone officially working on mailcheck should have the keys to this npm package? Let me know who, and I'd be happy to transfer ownership.

https://www.npmjs.org/package/mailcheck

Cheers,
Aseem

Suggest `.` for `ใ€‚`

We are seeing emails come in where ใ€‚ (unicode 3002) is entered in place of a .. I'm told that Chinese keyboard configurations can easily lead to this problem.

Is it in scope for mailcheck to suggest this change? Happy to submit a patch if so.

Thanks!

Small improvements - credits, lowercase, default domains etc

Sorry, did this on the fly so haven't added a pull - feel free to add

/*
 * Mailcheck https://github.com/Kicksend/mailcheck
 * Author
 * Derrick Ko (@derrickko)
 *
 * License
 * Copyright (c) 2012 Receivd, Inc.
 *
 * Licensed under the MIT License.
 */
(function ($, undefined) {

     $.fn.mailcheck = function (opts, domains) {
         domains = domains || ["yahoo.com", "google.com", "hotmail.com", "gmail.com", "me.com", "aol.com", "mac.com", "live.com", "comcast.net", "googlemail.com", "msn.com", "qq.com", "163.com", "hotmail.fr", "yahoo.fr", "yahoo.com.tw", "hotmail.it", "sbcglobal.net", "hotmail.co.uk", "yahoo.co.uk", "yahoo.es"];
         var result = MC.mailcheck.suggest(this.val(), domains);
         if (result) {
             if (opts.suggested) {
                 opts.suggested(this, result);
             }
         } else {
             if (opts.empty) {
                 opts.empty(this);
             }
         }
     };

     var MC = {
         mailcheck: {
             threshold: 2,

             suggest: function (email, domains) {
                 email = email.toLowerCase();
                 var parts = email.split('@') || false;

                 var closestDomain = this.findClosestDomain(parts[1], domains);

                 if (closestDomain) {
                     return { address: parts[0], domain: closestDomain, full: parts[0] + "@" + closestDomain };
                 } else {
                     return false;
                 }
             },

             findClosestDomain: function (domain, domains) {
                 var dist;
                 var minDist = 99;
                 var closestDomain = null;

                 for (var i = 0; i < domains.length; i++) {
                     dist = this.stringDistance(domain, domains[i]);
                     if (dist < minDist) {
                         minDist = dist;
                         closestDomain = domains[i];
                     }
                 }

                 if (minDist <= this.threshold && closestDomain !== null && closestDomain !== domain) {
                     return closestDomain;
                 } else {
                     return false;
                 }
             },

             stringDistance: function (s1, s2) {
                 // sift3: http://siderite.blogspot.com/2007/04/super-fast-and-accurate-string-distance.html
                 if (s1 == null || s1.length === 0) {
                     if (s2 == null || s2.length === 0) {
                         return 0;
                     } else {
                         return s2.length;
                     }
                 }

                 if (s2 == null || s2.length === 0) {
                     return s1.length;
                 }

                 var c = 0;
                 var offset1 = 0;
                 var offset2 = 0;
                 var lcs = 0;
                 var maxOffset = 5;

                 while ((c + offset1 < s1.length) && (c + offset2 < s2.length)) {
                     if (s1[c + offset1] == s2[c + offset2]) {
                         lcs++;
                     } else {
                         offset1 = 0;
                         offset2 = 0;
                         for (var i = 0; i < maxOffset; i++) {
                             if ((c + i < s1.length) && (s1[c + i] == s2[c])) {
                                 offset1 = i;
                                 break;
                             }
                             if ((c + i < s2.length) && (s1[c] == s2[c + i])) {
                                 offset2 = i;
                                 break;
                             }
                         }
                     }
                     c++;
                 }
                 return (s1.length + s2.length) / 2 - lcs;
             }
         }
     };

 })(jQuery);

Watch out for xss

For example, in your kicksend page:
<IMG """><SCRIPT>alert(document.cookie)</SCRIPT>">@gnail.com

Worth a checking! :)

Wrong suggestion case

a@hot produces a wrong suggestion: a@com

I realized this as I'm using mailcheck on keypress instead of on blur.

Correct TLDs separately.

Write now, mailchecker can't help me with: randomsmallcompany.cmo, because nobody will seed it with every randomsmallcompany.com domain.

But, there are only so many Top Level Domains - few enough to put in the .js file. Since cmo is not a TLD, it makes sense to correct it independently of the rest of the domain.

(Another typo we see a lot is substituting a 2 for a @. If @ is missing, it'd be worth looking for a 2, and suggetsing the change if it becomes legal. That's pretty one-off maybe outside mailchecker's scope, I admit.)

Doesn't work in IE8

I think mailcheck crashes in IE8 because of a single call to String.trim. I know IE8 is annoying, but we're so close!

I have a long bus ride coming up this weekend, so I'll probably take a shot at it.

Domain web.de is not recognised up, but it should be

The domain "web.de" is listed as a popular domain, but does not show up for your users:

Screen shot of a false positive

I realize that this is somewhat of a deployment issue and that gosquared could have used the other definition file. On the other hand, why don't you just include the additional domains in the first place?

Use with Require.JS

I'm trying to use mailcheck with Require.JS.

Currently, I have a shim around Mailcheck (which works with other modules):

require.config
  shim:
    mailcheck:
      exports: "Mailcheck"

This works fine in development (the Mailcheck global is there), but once I run it through the r.js optimizer things break.
I don't know a huge amount about the r.js optimizer, but it looks like the optimizer wraps all the libraries that are included in an anonymous function. Since Mailcheck is declared as var Mailcheck =, it is local to the wrapped function, which means it is no longer globally accessible.

Would you consider either:
a) Supporting requirejs (using something like http://stackoverflow.com/a/17954882/1322410)
b) Attaching Mailcheck to the window object (if it is defined) so that it is still globally accessible.

Thank you.

Case of illogical domain suggestion

Hi there,

i found case of illogical domain suggestion:

domains = ["ua.com", "ui.com"], input val is [email protected], suggestion: [email protected], but if you look at keyboard image - it's obvious that i've mispelled for domain ui.com

kb

I clearly understand that built-in algorithm doesn't solve all cases, but i suggest to think about how to solve similar cases.

Suggests .biz should be .mil??

When entereing a .biz e-mail address such as name@example.biz this script says "Did you mean name@example.mil?"

Surely, .biz is much more popular than .mil? I've not even heard of the .mil TLD.

Can this suggestion be fixed? As it can be confusing to users with .biz addresses.

Provide email format validation

Plugin only suggest a correct mail domain, validating a mail address needs more than this. Why I'm used to complete mailcheck by another script.

It could be great if mailcheck embed format valdiation

bt.com

I added bt.com as a domain name, but now it suggests me.com (which I may have added?).

bower install does not install newest version

When running bower install --save mailcheck, the mailcheck.js file installed is not equal to the one currently accessible in Github. What is missing for example are the second level domains.

This is how the first lines of the file look like:

/*

var Mailcheck = {
domainThreshold: 4,
topLevelThreshold: 3,

defaultDomains: ["yahoo.com", "google.com", "hotmail.com", "gmail.com", "me.com", "aol.com", "mac.com",
"live.com", "comcast.net", "googlemail.com", "msn.com", "hotmail.co.uk", "yahoo.co.uk",
"facebook.com", "verizon.net", "sbcglobal.net", "att.net", "gmx.com", "mail.com", "outlook.com", "icloud.com"],

defaultTopLevelDomains: ["co.jp", "co.uk", "com", "net", "org", "info", "edu", "gov", "mil", "ca"],

run: function(opts) {...

END SNIPPET

Somehow it seems an older version of mailcheck is installed when using bower.

Select the domain names per country?

Hi,

We have written a plugin to integrate mailcheck & civicrm
https://github.com/TechToThePeople/civicrm_mailcheck
and as we have users from all around, started to collect what are the most common domain names in various countries (as your default list seems to be rather us/uk centric)
http://forum.civicrm.org/index.php/topic,24736.0.html

Would it make sense to group the domain names based on the country and make it easy to choose which one you want?, eg.
$(this).mailcheck({countries = {'fr','uk','nz'});

Node.js compatibility?

Awesome library. We'd love to use this on the server for a REST API we're building, since there isn't (yet?) a Mailcheck equivalent on other platforms, like iOS.

This library assumes the browser (e.g. checks window, and sets a global Kicksend variable), but it doesn't look like the actual code uses or needs any DOM/etc. functionality.

Would you guys be open to a probably-three-ish line change to support running this on Node.js? It could/should then also be added to npm, so you could just npm install kicksend.

Thanks guys, and great work again!

assumption about a single @ in email is wrong

"foo@bar"@gnail.com is a perfectly valid email address as per RFC - see http://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address-until-i.aspx

code here: https://github.com/Kicksend/mailcheck/blob/master/src/jquery.mailcheck.js#L21-32

assumes that part[1] will be the domain and part[0] will be the userbit is wrong.
here's a simple workaround in my mootools port of the plugin: https://github.com/DimitarChristoff/mailcheck/blob/master/src/mootools.mailcheck.js#L99-108

Any three letter domain is suggested as aol.com

As per the title, any three letter domain gets suggested as aol.com.

Is there a way to make it less sensitive? eg. ail.com would be valid for an aol.com suggestion since the i and o keys are adjacent.

Add credit to js file(s)

Include name, copyright, URL, etc

Something like:

/*
 * Mailcheck https://github.com/Kicksend/mailcheck
 * Author
 * Derrick Ko (@derrickko)
 *
 * License
 * Copyright (c) 2012 Receivd, Inc.
 *
 * Licensed under the MIT License.
 */

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.