Giter Site home page Giter Site logo

sidorares / node-mysql2 Goto Github PK

View Code? Open in Web Editor NEW
3.9K 60.0 592.0 34.1 MB

:zap: fast mysqljs/mysql compatible mysql driver for node.js

Home Page: https://sidorares.github.io/node-mysql2/

License: MIT License

HTML 0.01% JavaScript 94.35% Shell 0.01% TypeScript 5.63%
database-adapter node-js mysql mysql-client

node-mysql2's Introduction

MySQL2

NPM Version NPM Downloads Node.js Version GitHub Workflow Status (with event) Codecov License

English | 简体中文 | Português (BR)

MySQL client for Node.js with focus on performance. Supports prepared statements, non-utf8 encodings, binary log protocol, compression, ssl much more.

Table of Contents

History and Why MySQL2

MySQL2 project is a continuation of MySQL-Native. Protocol parser code was rewritten from scratch and api changed to match popular Node MySQL. MySQL2 team is working together with Node MySQL team to factor out shared code and move it under mysqljs organization.

MySQL2 is mostly API compatible with Node MySQL and supports majority of features. MySQL2 also offers these additional features:

Installation

MySQL2 is free from native bindings and can be installed on Linux, Mac OS or Windows without any issues.

npm install --save mysql2

If you are using TypeScript, you will need to install @types/node.

npm install --save-dev @types/node

For TypeScript documentation and examples, see here.

Documentation

Acknowledgements

Contributing

Want to improve something in MySQL2? Please check Contributing.md for detailed instruction on how to get started.

To contribute in MySQL2 Documentation, please visit the Website Contributing Guidelines for detailed instruction on how to get started.

node-mysql2's People

Contributors

aikar avatar bitcloud avatar captainoz avatar cweijan avatar dependabot[bot] avatar dresende avatar felixge avatar gajus avatar github-actions[bot] avatar greenkeeper[bot] avatar greenkeeperio-bot avatar jmordica avatar kibertoad avatar larshp avatar masterodin avatar mscdex avatar nataliewolfe avatar qing-yang-20230331 avatar ruiquelhas avatar sidorares avatar simonschick avatar sushantdhiman avatar testn avatar trevorr avatar ulikoehler avatar vogievetsky avatar wellwelwel avatar wenisok avatar williamdes avatar yuxizhe 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

node-mysql2's Issues

dies on big numbers

The stack trace looks like this:

Trace
    at Packet.readLengthCodedNumber (.../node_modules/mysql2/lib/packets/packet.js:104:12)
    at new ResultSetHeader (.../node_modules/mysql2/lib/packets/resultset_header.js:12:32)
    at Query.resultsetHeader (.../node_modules/mysql2/lib/commands/query.js:40:12)
    at Query.Command.execute (.../node_modules/mysql2/lib/commands/command.js:23:20)
    at Connection.handlePacket (.../node_modules/mysql2/lib/connection.js:226:28)
    at PacketParser.execute (.../node_modules/mysql2/lib/packet_parser.js:36:21)
    at Socket.stream.ondata (.../node_modules/mysql2/lib/connection.js:70:31)
    at TCP.onread (net.js:404:27)
Fatal error: Should not reach here: 254

That section of the code shows a TODO for big numbers

PoolCluster, releasing a connection

I got problems when trying to release a connection when using PoolCluster.
From the node-mysql doc, releasing a connection coming from a pool can be done by calling the release() function on it.
Inspecting your code, it seams it is the end() function we need to call.

  1. It is an incompatibility issue.
  2. It is counter intuitive to use the end() method for releasing it from the pool.
  3. The PoolCluster seams intended to have a release connection method, but it doesn't. In the PoolCluster.prototype._getConnection() method, you add the cluster id to the connection (connection._clusterId = node.id;) but do not use it.
    Something like :
PoolCluster.prototype.releaseConnection = function (connection)
{
    var node = this._getNode(connection._clusterId);
    if (node) {
        node.pool.releaseConnection(connection);
    }
};

signed / unsigned int64 are not yet correct

  • select cast(9223372036854775807) as unsigned v returns 9223372034707292000
  • select cast(18446744073709551615) as unsigned v returns 18446744069414584000
  • select cast(9223372036854775807) as signed v returns 9223372034707292000
  • select cast(-9223372036854775808) as signed v returns -9223372034707292000

fix:

Packet.prototype.readInt64 = function() {
return this.readInt32() + 0x100000000*this.readInt32();
};

Packet.prototype.readSInt64 = function() {
var word0 = this.readInt32();
var word1 = this.readInt32();
if (!(word1 & 0x80000000))
return word0 + 0x100000000*word1;
return -((((~word1)>>>0) * 0x100000000) + ((~word0)>>>0) + 1);
};

bug in parameters write

lib/packets/packet.js:
@@ -71,7 +71,7 @@
bitValue = 1;
}
}

  • if (bitValue != 256)
  • if (bitValue != 1)
    packet.writeInt8(bitmap);

// TODO: explain meaning of the flag

[Incompatibility] error event on the connection object is not triggered when connection is gone

Current behavior is incompatible with node-mysql.
mysql2 version is 0.10.5.

Repro steps:

var mysql = require('mysql2');
var conn = mysql.createConnection({ ... }); // remote mysql instance required

conn.on('error', function(err) { console.log('ERROR:', err); });

conn.query('SELECT 1', function(err, rows) { console.log('ERROR:', err); console.log(rows); }); // everything works fine

// Network down here

conn.query('SELECT 1', function(err, rows) { console.log('ERROR:', err); console.log(rows); }); // callback is not triggered either!

// Unhandled ETIMEDOUT exception occurred after some time, and process killed

Queries with NOT IN clause

When I execute a query like:
SELECT * FROM T WHERE ID IN(?,....)
it works perfect...
But If I execute the same query in negative
SELECT * FROM T WHERE ID NOT IN(?,....)
I get the following error:
{
"code": "ER_WRONG_ARGUMENTS",
"sqlState": "#HY00"
}

I've checked the arguments and number of arguments and they're ok.

Thanks a lot for your support!

custom typeCast handlers in generated parser

The typeCast function in ConnectionConfig is not been called. I need this to automatically cast some VARBINARY and BINARY columns to hexadecimal. Another use case is that I have an application that query more than 2,000 calendar events and converting DATETIME fields to Date objects is too much for me, with typeCast I was omitting this.

PS: Good jobs with the SSL implementation, thanks.

Connection dying

The tcp connection with 'mysql2' appears to die after a short period of time (just a few seconds or so), which causes problems if you try to then perform a query some time later (namely a "This socket has been ended by the other party" exception from net.js).

I briefly looked at porting ping() from 'mysql' to try and see if occasional pinging (while no other queries were in progress) would help things, but the two modules are not similar enough for me to know what needs to be done.

exception is thrown on sql error on execute with callback

exception is thrown on sql error on execute with callback
try to run execute with callback which gets sql error.
exception is thrown instead of callback with error

fix:

diff -u -r mysql2.o/lib/commands/command.js mysql2/lib/commands/command.js
--- mysql2.o/lib/commands/command.js 2013-07-11 12:22:18.000000000 +0300
+++ mysql2/lib/commands/command.js 2013-07-15 10:08:01.172822128 +0300
@@ -15,7 +15,10 @@

if (packet && packet.isError()) {
var err = packet.asError();

  • this.emit('error', err);
  • if (this.onResult)
  • this.onResult(err);
  • else
  • this.emit('error', err);
    return true;
    }

typo in packet.js

Typo in lib/packets/packet.js:355
Packet.prototype.writeLengthCodedNumber = function(n) {
// TODO: null
if (n < 0xfb)
return this.writeInt8(n);
if (n < 0xffff) {
this.writeInt8(0xfc);
return this.writeInt16(n);
}
-------> if (this < 0xffffff) { /* should be n<0xfffffffff */
this.writeInt8(0xfd);
return this.writeInt24(n);
}
console.log(n);
console.trace();
throw "No bignumbers yet";
};

insertId is incorrect

hi,
thanks for a great project.
I am having problem retrieving the insertId.

  1. this.insertId always return 1
  2. in node-mysql documents you can call insertId on the result, e.g:
    connection.query('INSERT INTO posts SET ?', {title: 'test'}, function(err, result) {
    if (err) throw err;
    console.log(result.insertId);
    });
    but it undefined.

execute from_unixtime bug

The following query
'select from_unixtime('+(new Date('1990-01-01 08:15:11 UTC')).valueOf()/1000+')
returns incorrect time
08:15:00
(seconds are zero)

ignore the utc part fix

fix:
lib/packets/packet.js:
Packet.prototype.readDateTime = function(convertTtoMs) {
var length = this.readInt8();
var y = 0;
var m = 0;
var d = 0;
var H = 0;
var M = 0;
var S = 0;
var ms = 0;
if (length > 3) {
y = this.readInt16();
m = this.readInt8();
d = this.readInt8();
}
if (length > 6) {
H = this.readInt8();
M = this.readInt8();
S = this.readInt8(); /* XXX was missing */
}
if (length > 11)
ms = this.readInt32();
if ((y + m + d + H + M + S + ms) === 0) {
return INVALID_DATE;
}
return new Date(Date.UTC(y, m-1, d, H, M, S, ms));
};

Example Proxy Server (Server API) fails on inserts.

I tried a simple insert (selects are working fine) and it fails.

(I added two lines to the example proxy server to print the values of rows and columns for debugging purposes.)

The query was:

insert into engines(name, number, arrived, type, wheels) values('James',5,'1930-05-28 09:26:00','STEAM',8);

The query worked (I am using the normal MySQL command line client):

mysql> insert into engines(name, number, arrived, type, wheels) values('James',5,'1930-05-28 09:26:00','STEAM',8);
Query OK, 0 rows affected, 28265 warnings (0.07 sec)

mysql> 

but the proxy blew up with:

proxying query:insert into engines(name, number, arrived, type, wheels) values('James',5,'1930-05-28 09:26:00','STEAM',8)
rows { domain: null,
  _events: { error: [ [Function], [Function] ] },
  _maxListeners: 10,
  next: [Function],
  query: 'insert into engines(name, number, arrived, type, wheels) values(\'James\',5,\'1930-05-28 09:26:00\',\'STEAM\',8)',
  onResult: [Function],
  fieldCount: 0,
  insertId: 5,
  fields: [],
  rows: [],
  rowParser: null,
  _receivedFieldsCount: 0,
  affectedRows: 1 }
columns []

/home/chris/node_modules/mysql2/lib/connection.js:315
  rows.forEach(function(row) {
       ^
TypeError: Object #<Query> has no method 'forEach'
    at Connection.writeTextResult (/home/chris/node_modules/mysql2/lib/connection.js:315:8)
    at Query.onResult (/home/chris/Dropbox/mysqlproxy/proxy.js:22:12)
    at Query.resultsetHeader (/home/chris/node_modules/mysql2/lib/commands/query.js:46:12)
    at Query.Command.execute (/home/chris/node_modules/mysql2/lib/commands/command.js:23:20)
    at Connection.handlePacket (/home/chris/node_modules/mysql2/lib/connection.js:226:28)
    at PacketParser.execute (/home/chris/node_modules/mysql2/lib/packet_parser.js:36:21)
    at Socket.stream.ondata (/home/chris/node_modules/mysql2/lib/connection.js:70:31)
    at TCP.onread (net.js:404:27)

Error executing query with c-style comments

Hello, I'm trying to execute some queries that have comments wrapped by /* and */ and I'm getting:

"Error: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;/*!40101 SET @OLD_COL' at line 2"
connDb.query("/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;", function(err2, result) {
    if (err2) {
        throw err2;
    }
})

Are these comments supported?

Thanks.

Problem with PreparedStatements and DECIMAL columns

I'll try to explain with an example. Suppose a simple table (T1) with two fields:
ID of type INT
VALUE of type DECIMAL(19,4)

And a simple query:
SELECT VALUE FROM T1 WHERE ID=?
If I execute the query with:
var params = [1];
connection.query(sql, params, function(err, rows) {
.....
}
It works as expected and returns the correct value,

But if I execute the query as a real prepared statement:
var params = [1];
connection.execute(sql, params, function(err, rows) {
.....
}
Instead of the correct value I get an array of numbers as {"VALUE":[50,48,53,48,48,48,46,48,48,48,48]}

I've tried a workaround making a cast:
SELECT cast(VALUE as char) FROM T1 WHERE ID=?
and it works, but it's not the best way to operate.

Thanks for your support, great job!

readSInt8 does not increment this.offset

lib/packets/packet.js
readSInt8 does not increment this.offset

fix
Packet.prototype.readSInt8 = function()
{
return this.buffer.readInt8(this.offset++, true);
};

connection.query do not callback

There is my code:


var Pool = function(config)
{
    var pool = require('mysql2').createPool(config);
    this.query = function(sql, selectCb){
        pool.getConnection(function(err, connection){
            if ( err ) {
                log(3, '[Pool][getConnection][Error] sql: ' + sql + ' err: ' + err);
                connection.release();
                selectCb(err);
                return;
            }
            db.query(sql, function dbQuery(err, rows, fields){
                connection.release();
                selectCb(err, rows, fields);
            });
        })
    }
}
var pool = new Pool({
    host: settings.dbhost,
    user: settings.dbuser,
    password: settings.dbpasswd,
    database: settings.dbname,
    connectionLimit: 15
});

I run my nodejs App one or two days and it will take place.
The method 'getConnection' do not callback in my Pool.query, error either sometimes.
When it happen, just no callback anymore without any error message and must to restart my nodejs app for working normal.

I found that while it happened, the last connection.query() do not callback, too.
It's seem like it make connections no released, and than I can't do pool.getConnection() anymore.
Have no idea?

Bug in displaying 'Too many connections' error

Error message is truncated. Fix (based on node-mysql):

diff -u -r mysql2.o/lib/packets/packet.js mysql2/lib/packets/packet.js
--- mysql2.o/lib/packets/packet.js 2013-07-14 08:21:12.000000000 +0300
+++ mysql2/lib/packets/packet.js 2013-07-15 11:33:53.644716980 +0300

@@ -304,11 +304,14 @@

Packet.prototype.asError = function() {
this.reset();

- this.skip(1);

  • var fieldCount = this.readInt8();
    var errorCode = this.readInt16();
  • var sqlState = this.readBuffer(6);
  • var message = this.buffer.slice(this.offset, this.end);
  • if (this.buffer[this.offset] == 0x23)
  • {
  •  var sqlStateMarker  = this.readInt8();
    
  •  var sqlState  = this.readBuffer(5);
    
  • }
  • var message = this.readString();
    var err = new Error(message.toString());
    err.code = ErrorCodeToName[errorCode];
    return err;

charset problem

I've set charset: 'LATIN1_SWEDISH_CI' but still receive æøå scrampled. It works with node-mysql.

Stored procedures in binary protocol

At the moment, "prepare + execute" sequence expects column definitions in reply to prepare (binary row parser is compiled at this point using this definitions). With stored procedures column definitions are not sent (type might not be known until execution time)

Example to reproduce:

var mysql = require('../test/common').createConnection();
mysql.query('DROP PROCEDURE IF EXISTS p; CREATE PROCEDURE p(IN i INT) BEGIN SELECT i as f; END;');
mysql.execute('call p1(1)', function(err, rows, fields) {
    console.log(rows, fields);
});
  • does not crash, but outputs undefined undefined. Earlier versions crashed, most likely this is cause of #10
  • handle case when 'prepare' return empty list of field definitions
  • store execute time definitions if prepare time definitions empty
  • use execute time definitions if prepare time definitions empty, compile and cache binary tow parser.

insecureAuth support (was: bad handshake)

Output: 'Query error: Bad handshake'

Server: MySQL server 5.0.95 (Linux)

Code:

var mysql = require('mysql2');

var config = {
  host: '127.0.0.1',
  user: 'user',
  password: 'password',
  database: 'database',
  typeCast: false,
  supportBigNumbers: true,
  bigNumberStrings: true,
  insecureAuth: true
}, c;

function doConnect() {
  c = mysql.createConnection(config);
  c.connect(function(err) {
    console.log('Client connected');
  });
  c.on('error', function(err) {
    if (err.code === 'PROTOCOL_CONNECTION_LOST') {
      console.log('Disconnected -- reconnecting ...');
      doConnect();
    } else
      throw err;
  });
}

function doQuery() {
  var count = 0;

  console.log('starting query ...');

  c.query('select * from foo')
   .on('error', function(err) {
     console.log('Query error: ' + err);
   })
   .on('result', function(row) {
     ++count;
   })
   .once('end', function(info) {
     console.log('Query finished successfully');
     console.log(count + ' rows');
   });
}

doConnect();
doQuery();

Socket Close Fatal Errors

Getting this message once in a while:

Error: This socket has been ended by the other party
    at Socket.writeAfterFIN [as write] (net.js:274:12)
    at Connection.write (/project/path/node_modules/mysql2/lib/connection.js:94:15)
    at Connection.writePacket (/project/path/node_modules/mysql2/lib/connection.js:103:10)
    at Query.start (/project/path/node_modules/mysql2/lib/commands/query.js:23:14)
    at Query.Command.execute (/project/path/node_modules/mysql2/lib/commands/command.js:26:20)
    at Connection.handlePacket (/project/path/node_modules/mysql2/lib/connection.js:233:28)
    at Connection.addCommand (/project/path/node_modules/mysql2/lib/connection.js:245:10)
    at Connection.query (/project/path/node_modules/mysql2/lib/connection.js:285:15)
    at setSession (/project/path/lib/session/index.js:87:23)
    at SessionStore.set (/project/path/lib/session/index.js:102:13)
    at Session.save (/project/path/node_modules/express/node_modules/connect/lib/middleware/session/session.js:63:25)

Not sure why this is occuring but it completely stops the NodeJS server from running. How can I catch this error and keep the server alive?

query (text parser) with date result is incorrect

query (text parse):
select FROM_UNIXTIME(631152000) v
returns buffer instead of a date object.

The fix includes conversion to UTC, which I understand you do not like,
so you can omit it

fix:

diff -u -r mysql2.o/lib/compile_text_parser.js mysql2/lib/compile_text_parser.js
--- mysql2.o/lib/compile_text_parser.js 2013-07-12 13:24:16.000000000 +0300
+++ mysql2/lib/compile_text_parser.js 2013-07-14 14:54:41.410516495 +0300
@@ -34,6 +34,8 @@
case Types.DECIMAL:
case Types.NEWDECIMAL:
return "packet.readLengthCodedString(); //" + type + ' ' + charset;

  • case Types.DATETIME:
  • return "packet.readTextDateTime();";
    default:
    if (charset == Charsets.BINARY)
    return "packet.readLengthCodedBuffer();";

diff -u -r mysql2.o/lib/packets/packet.js mysql2/lib/packets/packet.js
--- mysql2.o/lib/packets/packet.js 2013-07-14 08:21:12.000000000 +0300
+++ mysql2/lib/packets/packet.js 2013-07-14 15:01:28.843204561 +0300
@@ -184,6 +184,10 @@
return d_86400000 + H_3600000 + M_60000 + S_1000 + ms;
};

+Packet.prototype.readTextDateTime = function(s) {

  • return new Date(this.readString()+' UTC');
    +};

Packet.prototype.readLengthCodedString = function() {
var len = this.readLengthCodedNumber();
// TODO: check manually first byte here to avoid polymorphic return type?

SSL connection: CA-cert + username + password not enough for authentication

The combination of CA-cert + username + password is not enough for secure authentication (but AFAIK it should be).

With command-line mysql (and e.g. node-mariasql), one can successfully connect with CA-cert + username + password (no client-cert or client-key):
mysql -h hostname -u user -p secret --ssl-ca=my-mysql-ca-cert.pem

However, the same combination does not seem to work for node-mysql2:

var connection = mysql.createConnection({
    user: 'user',
    host: 'hostname',
    password: 'secret',
    ssl: {
        ca: fs.readFileSync('./my-mysql-ca-cert.pem')
    }
});

Instead, the following error is yielded:

Error: "user" connection config prperty must be a string
    at HandshakeResponse.toPacket (.../node_modules/mysql2/lib/packets/handshake_response.js:62:11)
    at ClientHandshake.sendSSLRequest (.../node_modules/mysql2/lib/commands/client_handshake.js:23:37)
    at ClientHandshake.handshakeInit (.../node_modules/mysql2/lib/commands/client_handshake.js:59:10)
    at ClientHandshake.Command.execute (.../node_modules/mysql2/lib/commands/command.js:26:20)
    at Connection.handlePacket (.../node_modules/mysql2/lib/connection.js:227:28)
    at PacketParser.execute (.../node_modules/mysql2/lib/packet_parser.js:40:21)
    at Socket.Connection.stream.ondata (.../node_modules/mysql2/lib/connection.js:70:31)
    at TCP.onread (net.js:525:27)

Confusing

I've just become aware of this package and am slightly confused:

  • Why use the name node-mysql2? This is very much conflicting with the name and current version of my module.
  • Why did you choose to do this package instead of collaborate on my existing module?

I'd actually really appreciate the later option as I don't have a lot of time to push my project forward anymore, and I'd also be fine if you wanted to make big internal changes.

Problem with NULL values

query "SELECT NULL" returns null as expected,
but query "SELECT cast(NULL AS CHAR)" returns empty string,
and "SELECT cast(NULL AS SIGNED)" returns empty string too.
But querying int column that is null from some table returns 0, querying null varchar column returns empty string.

Setting typeCast in db config has no effect.
node-mysql always returns null for NULL mysql columns.

Events api

The objects of connections and mysql2 instance doesnt accept event bindings, something that node-mysql uses

multi results support in binary protocol

mysql.query('DROP PROCEDURE IF EXISTS p; CREATE PROCEDURE p(IN i INT) BEGIN SELECT i+1; SELECT * FROM some_rows; SELECT i+2; END;');¬
mysql.execute('call p1(1)');

currently result in error.

Note that there are two separate client flags for multi results support: MULTI_RESULTS 131072 and PS_MULTI_RESULTS 262144

in addition to changes similar to 4812ada need to handle empty fields array in prepare phase (and use fields from each result header)

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.