Giter VIP home page Giter VIP logo

nerdamer's Introduction

Build Status

Nerdamer

As of version 0.5.0, the library is split into the core and optional add-ons which can be loaded after the core has been loaded.

Note: The Together-science project decided to pick up the banner where Nerdamer left off. See Nerdamer-Prime.

Getting started with Nerdamer

Load the library in your html page

<!-- assuming you've saved the file in the root of course -->
<!-- This the core and the only file needed if all you'll be doing is evaluating expresssions -->
<script src="nerdamer.core.js"></script> 
<!-- LOAD ADD-ONS. These files contain extended functions. See documentation -->
<!-- again assuming you've saved the files in root -->
<script src="Algebra.js"></script>
<script src="Calculus.js"></script>
<script src="Solve.js"></script>
<script src="Extra.js"></script>

Or import everything

<script src="all.min.js"></script>  <!-- assuming you've saved the file in the root -->

If you're using node.js install it using npm i nerdamer and then

// const cannot be used since nerdamer gets modified when other modules are loaded  
var nerdamer = require('nerdamer'); 
// Load additional modules. These are not required.  
require('nerdamer/Algebra'); 
require('nerdamer/Calculus'); 
require('nerdamer/Solve'); 
require('nerdamer/Extra');

Or do a single import to import everything

const nerdamer = require("nerdamer/all.min")

Some functions have dependencies from other add-ons.

You can see nerdamer in action at http://nerdamer.com/demo

For full documentation go to http://nerdamer.com/documentation

All operations are done using the 'nerdamer' object.

To add an expression just add it to the nerdamer object which will return a Expression object.

var e = nerdamer('x^2+2*(cos(x)+x*x)');
console.log(e.text());

//result: 
//2*cos(x)+3*x^2

It is also possible to use nerdamer functions directly within the need for string manipulation of the input. The input will be parsed and the output will of type Expression. For example:

var ans = nerdamer.expand('(x-1)^5');
console.log(ans.text());
// -1-10*x^2-5*x^4+10*x^3+5*x+x^5

var sol = nerdamer.solve('x^2-4', 'x');
console.log(sol.text())
// [2,-2]

You can also pass in an object with known values as the second parameter.

var e = nerdamer('x^2+2*(cos(x)+x*x)',{x:6});
console.log(e.text());

//result:
//108+2*cos(6)

As you can see only the substitution is performed. To evaluate the result just call evaluate. Note that evaluate returns a text string or a number not an object.

var e = nerdamer('x^2+2*(cos(x)+x*x)',{x:6}).evaluate();
console.log(e.text());

//result:
//109.9203405733006

To get back the text as a fraction, call the text method and pass in the string 'fractions'.

var e = nerdamer('x^2+2*(cos(x)+x*x)',{x:6}).evaluate();
console.log(e.text('fractions'));

//result:
//429607273/3908351

You can get your expression back as LaTeX by calling the toTeX method

var LaTeX = nerdamer('x^2+2*(cos(x)+x*x)',{x:0.25}).toTeX();
console.log(LaTeX);

//result:
//2 \cdot \mathrm{cos}\left(\frac{1}{4}\right)+\frac{3}{16}

To have numbers returned as decimals pass in the string 'decimals' to the toTeX method

var LaTeX = nerdamer('x^2+2*(cos(x)+x*x)',{x:0.25}).toTeX('decimal');
console.log(LaTeX);

//result:
//2 \cdot \mathrm{cos}\left(0.25\right)+0.1875

Alternatively you can pass an object containing known values into evaluate method instead. The values passed in don't have to be number they can be another expression if needed.

var e = nerdamer('x^2+2*(cos(x)+x*x)',{x:'x^2+1'});
console.log(e.text());

//result:
//2*cos(1+x^2)+3*(1+x^2)^2

Every time you parse an expression it's stored in nerdamer. To get a list of all the expressions you just call nerdamer.expressions().

var knownValues = {x:'x^2+1'};
nerdamer('x^2+2*(cos(x)+x*x)').evaluate(knownValues);
nerdamer('sin(x)^2+cos(x)^2').evaluate(knownValues);

console.log(nerdamer.expressions());

//result:
//[ 46.692712758272776, 1 ]

You can request it as an object as well by passing in true. This can be convenient in some situations as the numbering starts at 1;

var knownValues = {x:'x^2+1'};
nerdamer('x^2+2*(cos(x)+x*x)', knownValues );
nerdamer('sin(x)^2+cos(x)^2', knownValues );

console.log(nerdamer.expressions(true));

//{ '1': '2*cos(1+x^(2))+3*(1+x^(2))^(2)',
//'2': 'cos(1+x^(2))^(2)+sin(1+x^(2))^(2)' }

Functions aren't always immediately parsed to numbers. For example

var result = nerdamer('cos(x)',{x:6});
console.log(result.text());
//cos(6)

will only subsitute out the variable name. To change this behaviour numer should be passed in as the 3rd argument.

var result = nerdamer('cos(x)',{x:6}, 'numer');
console.log(result.text());
//0.960170286650366

or alternatively

var result = nerdamer('cos(x)').evaluate({x:6});
console.log(result.text());
//0.960170286650366

The difference however is that the first option directly substitutes the variables while the second first evaluates the expression and then makes the substitutions. This library utilizes native javascript functions as much as possible. As a result it inherits whatever rounding errors they possess. One major change with version 0.6.0 however, is dealing with floating point issues.

var result = nerdamer('sqrt(x)*sqrt(x)-2', {x: 2});
console.log(result.text());
//0

The above expample now returns zero whereas in previous version the result would be 4.440892098500626e-16. Same goes for 0.1+0.2.

An expression can be replaced directly by passing in the index of which expression to override. For example

nerdamer('cos(x)',{x:6}, 'numer');
nerdamer('sin(x)+y',{x:6}, null, 1);
console.log(nerdamer.expressions());
//[ 'sin(6)+y' ]

If multiple modifier options need to be passed into nerdamer you can do so using an array. For example ...

var e = nerdamer('cos(x)+(y-x)^2', {x:7}, ['expand', 'numer']);
console.log(e.text());
//-14*y+y^2+49.7539022543433

If you need the code as LaTeX you can pass in true as the second parameter when requesting the expressions.

nerdamer('x^2+2*(cos(x)+x*x)');
nerdamer('sin(x)^0.25+cos(x)^0.5' );
var asObject = true;
var asLaTeX = true;
console.log(nerdamer.expressions(asObject, asLaTeX));

/*{ '1': '2 \\cdot \\mathrm{cos}\\left(x\\right)+3 \\cdot x^{2}',
  '2': '\\sqrt{\\mathrm{cos}\\left(x\\right)}+\\mathrm{sin}\\left(x\\right)^{\\frac{1}{4}}' }*/

You can specify a particular location when adding an expression, which is specified with the third parameter.

nerdamer('x^2+2*(cos(x)+x*x)');
nerdamer('sin(x)^0.25+cos(x)^0.5' );
nerdamer('expr-override', undefined, 2 );
var asObject = false;
var asLaTeX = true;
console.log(nerdamer.expressions(asObject, asLaTeX));

/* [ '2 \\cdot \\mathrm{cos}\\left(x\\right)+3 \\cdot x^{2}',
  '\\sqrt{\\mathrm{cos}\\left(x\\right)}+\\mathrm{sin}\\left(x\\right)^{\\frac{1}{4}}',
  'expr-override' ]
 */

Here's an example of reserved variable and function names.

var reserved = nerdamer.reserved();
console.log(reserved);
//result:
/* csc, sec, cot, erf, fact, mod, GCD, QGCD, LCM, pow, PI, E, cos, sin, tan, acos, asin, atan, sinh, cosh, tanh, asinh, acosh, atanh, exp, min, max, floor, ceil, round, vector, matrix, parens, sqrt, log, expand, abs, invert, transpose, dot */

//or as an array

var reserved = nerdamer.reserved(true);
console.log(reserved);
//result:
/* [ 'csc', 'sec', 'cot', 'erf', 'fact', 'mod', 'GCD', 'QGCD', 'LCM', 'pow', 'PI', 'E', 'cos', 'sin', 'tan', 'acos', 'asin', 'atan', 'sinh', 'cosh', 'tanh', 'asinh', 'acosh', 'atanh', 'exp', 'min', 'max', 'floor', 'ceil', 'round', 'vector', 'matrix',
  'parens', 'sqrt', 'log', 'expand', 'abs', 'invert', 'transpose', 'dot' ]  */

Most math functions are passed in as part of the expression. If you want to differentiate for instance you just use the function diff which is located in the Calculus add-on as of version 0.5.0

var e = nerdamer('diff(x^2+2*(cos(x)+x*x),x)');

console.log(e.text());

//result: 
//-2*sin(x)+6*x

Nerdamer can also handle runtime functions. To do this use the method setFunction. The runtime functions do have symbolic capabilities and support for imaginary numbers. The setfunction method is used as follows:

nerdamer.setFunction( function_name, parameter_array, function_body )

For Example:

//generate some points
var f = function(x) { return 5*x-1; }
console.log(f(1)); //4
console.log(f(2)); //9 - value to be found
console.log(f(7)); //34

nerdamer.setFunction('interpolate',['y0','x0','y1','x1','x'],'y0+(y1-y0)*((x-x0)/(x1-x0))')
var answer = nerdamer('interpolate(4,1,34,7,2)').evaluate();

console.log(answer);

//result: 9

Custom functions alternatively be set in following manner.

nerdamer('hyp(a, b) := sqrt(a^2 + b^2) ');
var result = nerdamer('hyp(3, 4)').evaluate().text();
console.log(result);
//result: 5

If you need to add a constant use the setConstant method

nerdamer.setConstant( 'g', 9.81);
var weight = nerdamer('100*g').text();
console.log(weight);
//result:
//981

To delete just set it to delete

nerdamer.setConstant( 'g', 9.81);
var weight = nerdamer('100*g').text();
console.log(weight);
//981
nerdamer.setConstant( 'g', 'delete');
var weight = nerdamer('100*g').text();
console.log(weight);
//100*g

You also have the option of exporting your function to a javascript function which can be useful if you need some filtering from user input. Do keep in mind that the parameters are sorted alphabetically for more than one parameter. To use it add the expression to nerdamer and use the buildFunction method.

var f = nerdamer('x^2+5').buildFunction();
console.log(f(9));

//result:
//86

If you have a particular order in which you need the parameters to be set, then you pass in an array with the variables in the order in which you want them for instance:

var f = nerdamer('z+x^2+y').buildFunction(['y', 'x', 'z']);
console.log(f(9,2,1));
//result
//14

Every time you add an expression to nerdamer it's stored. To list the expressions currently in nerdamer call the 'expressions' method. To delete an expression use the 'clear' method and pass in the expression you want to delete. To clear everything pass in the string 'all'.

nerdamer('n*R*T/v');
nerdamer('mc^2');
nerdamer('G*m1*m2/d^2');

nerdamer.clear(2);

console.log(nerdamer.expressions(true));

//result:
//{ '1': 'R*T*n*v^(-1)', '2': 'G*d^(-2)*m1*m2' }

nerdamer.clear('all');
console.log(nerdamer.expressions(true));
//result:
//{}

If you need go get the variables of an expression use the variables method. This method can be called after nerdamer was provided an expression. For example

var variables = nerdamer('csc(x*cos(y))-no_boring_x').variables();
console.log(variables);
//result:
//[ 'no_boring_x', 'x', 'y' ]

The order in which the variables appear require a little bit of knowledge of how nerdamer organizes symbols. For the sake of simplicity we'll just assume that there is no particular order


Using the solver

To solve equations first load Solve.js. Just remember that Solve also required Algebra.js and Calculus.js to be loaded. You can then solve equations using nerdamer. Important: State the variable for which you are trying to solve.

var sol = nerdamer.solveEquations('x^3+8=x^2+6','x');
console.log(sol.toString());
//1+i,-i+1,-1

Notice that we use toString rather than text as this returns a javascript array.

You can also solve an expression

var e = nerdamer.solveEquations('x^2+4-y', 'y');
console.log(e[0].text());
//4+x^2

You can also solve multivariate equations

var sol = nerdamer.solveEquations('x^2+8+y=x+6','x');
console.log(sol.toString());
//0.5*((-4*y-7)^0.5+1),0.5*(-(-4*y-7)^0.5+1)

You can do up to 3rd order polynomials for multivariate polynomials

Additionally you can try for equations containing functions. This is more of a hit or miss approach unlike single variable polynomials (which uses Mr. David Binner's Jenkins-Traub port - http://www.akiti.ca/PolyRootRe.html) but it's there if you want to give it a try.

var sol = nerdamer.solveEquations('cos(x)+cos(3*x)=1','x');
console.log(sol.toString());
//5.7981235959208695,0.4850617112587174

To solve a system of linear equations pass them in as an array. For example

var sol = nerdamer.solveEquations(['x+y=1', '2*x=6', '4*z+y=6']);
console.log(sol);
//[ [ 'x', 3 ], [ 'y', -2 ], [ 'z', 2 ] ]

In version 0.7.2 and up the solver can additionally be used in the following way

//first parse the equation
var x = nerdamer('x^2+2=y-7*a');
//You can make substitutions to the equation
x = x.evaluate({a: 'x^2-3'});
console.log(x.toString()); //2+x^2=-7*x^2+21+y
var solutions = x.solveFor('x');
console.log(solutions.toString()); //(1/16)*sqrt(32*y+608),(-1/16)*sqrt(32*y+608)

nerdamer's People

Contributors

alienkevin avatar amydevs avatar brosnanyuen avatar douglasdemoura avatar gksander avatar happypig375 avatar jiggzson avatar kungfooman avatar ljacqu avatar menzelths avatar msafronov avatar muhammadabdelsalam avatar n00bie-to-github avatar naridal avatar phcreery avatar saikedo avatar selairi avatar tecosaur avatar vojtechjelinek avatar yaffle avatar yosuke avatar yuliapi 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

nerdamer's Issues

Ceiling function it's not being parsed

I've tried on demo and in the javascript console:

var e = nerdamer('ceiling(2.4)', null, 'numer');
console.log(e.text());
//returns ceiling(2.4), expected 3

It's not working. I didn't detect the issue on the code. Maybe you guys can take look?

Failing tests

Hello, the result of the following tests has changed. Could I ask you to confirm that the new results are correct?

given: 'integrate(x*asin(x), x)',
expected: '(-1/4)*asin(x)+(1/2)*asin(x)*x^2+(1/4)*sqrt(-x^2+1)*x'
actual:   '(-1/4)*asin(x)+(1/2)*asin(x)*x^2+(1/4)*cos(asin(x))*sin(asin(x))'

given: 'integrate(q/((2-3*x^2)^(1/2)), x)',
expected: 'asin(sqrt(2)^(-1)*sqrt(3)*x)*q*sqrt(3)^(-1)'
actual:   'asin(3*sqrt(6)^(-1)*x)*q*sqrt(3)^(-1)'

given: 'integrate(x*(x+a)^3, x)',
expected: '((1/4)*x^4+(3/2)*a^2*x^2+a*x^3+a^3*x)*x+(-1/2)*a^2*x^3+(-1/2)*a^3*x^2+(-1/20)*x^5+(-1/4)*a*x^4'
actual:   '(1/2)*a^3*x^2+(1/5)*x^5+(3/4)*a*x^4+a^2*x^3'

given: 'integrate(8*x^3/(6*x^2+3*a^2), x)',
expected: '8*((-1/24)*a^2*log(3*a^2+x^2)+(1/12)*x^2)'
actual:   '8*((-1/24)*a^2*log(2*x^2+a^2)+(1/12)*x^2)'

given: 'integrate(log(a*x+b),x)',
expected: '((a*x+b)*log(a*x+b)-a*x-b)*a^(-1)'
actual:   '-x+a^(-1)*b*log(a*x+b)+log(a*x+b)*x'

given: 'integrate(t*log(x)^3,x)',
expected: '(-3*log(x)^2+6*log(x)+log(x)^3-6)*t*x'
actual:   '(-3*log(x)^2*x-6*x+6*log(x)*x+log(x)^3*x)*t'

given: 'integrate(5*x*e^(-8*a*x^2),x)',
expected: '(-5/16)*a^(-1)*e^(-8*a*x^2)*log(e)^(-1)'
actual:   '(-5/16)*a^(-1)*e^(-8*a*x^2)'

given: 'integrate((x+7)/(x+1)^3,x)',
expected: '(-1/2)*(1+x)^(-1)+(-1/2)*(1+x)^(-2)*(7+x)'
actual:   '(-1/2)*(1+x)^(-1)+(-7/2)*(1+x)^(-2)+(-1/2)*(1+x)^(-2)*x'

Get TeX string prior to evaluating?

Is there any way to parse a string to LaTeX using nerdamer prior to nerdamer evaluting the string? For example -- taking 'x*x' and returning 'x \cdot x' instead of 'x^2' ?

pi doesn't work in diff()

For example, derivative of x^2pi should be 2pix, but this lib will give a result x^2.
It seems that in diff() pi is not supported.

buildFunction forgets brackets

const wtf = nerdamer('4 (s^2 + t^2) s').buildFunction(['s', 't']).toString()
// wtf ==
function anonymous(s,t
/*``*/) {
 return 4*(Math.pow(s,2)+Math.pow(t,2)*s); // s should be right of the bracket
}

Latex generator broken

When the expression is requested as latex, often brackets aren't added when there should be. For example when the expression has a non-unit multiplier or power. This issue is strictly related to the latex generator as expression values are correct when the text method is called.

Euler's identity

var e = nerdamer('e^(2*i*PI) +e^(i*PI)');
console.log(e.text());

e^(3.141592653589793_i)+e^(6.283185307179586_i)

Euler's identity could be useful in solving complex exponential. (E.g (a+bi)^n )

Get results in a decimal form

Is it possible to make the LaTeX generator return the decimal value instead of the fraction?

3/10 = 0.3 instead of 3/10

I know that we will face a floating point issue (because the result will be 0.30000000000000004). Perhaps add a BigDecimal library to handle it?

nerdamer.solveEquation quits working

console.log(nerdamer.solveEquations("x+1=2", "x").toString())
console.log(nerdamer("x=1").text("fractions"))
console.log(nerdamer.solveEquations("x+1=2", "x").toString())

this logs an empty string for the third line

bitwise operators?

Does this library support bit shifting and bitwise operators?
As this is something I can really use :)

Thanks

Integration

I stumbled upon this SO post, mentioning that there should be an integration branch.

Have you added symbolic integration, or is it only for polynomials? If not, I could try starting a basic implementation in the calculus add-on.

Auto-detect and register new functions

I believe that would be better if nerdamer could detect and register custom functions. Like this:

if(/([a-z])\([a-z](.*)\)=/i.test(input)) {
  var fn = input.match(/[a-z]+\(/i)[0].replace('(', '');
  var exp = input.split('=')[1];
  var arguments = input.replace(fn, '').replace(exp, '').replace('=', '').replace('(', '').replace(')', '').split(',');
  nerdamer.setFunction(fn, arguments, exp);
}

It worked fine with the functions below:

  • hyp(a, b) = sqrt(a^2 + b^2)
  • f(x) = x^2

Sorry for not sending a pull request, I'm just an amateur.

version 0.7.x

  • Handle assignment directly within the parser. This will hopefully allow for more solving options
  • Fix prefix operators
  • Force base functions to use bigNumber library. This may or may not be an option since this may be re-implementing certain built-in functions
  • Extend equality checking to all classes Frac > Symbol > Expression

Multiple minus operators yield wrong result

I just noticed that multiple - (and brackets) don't seem to get along in some cases. Here are two failing test cases.

{
   given: '-(1)--(1-1--1)',
   expected: '0'  // current result: -2
},
{
   given: '-(-(1))-(--1)',
   expected: '0'  // current result: 2
}

Solving Equation problem

I am build a graphing system using your Library thanks a lot you made such a library helped me a lot but I am finding an issue in getting the value of y when that Equation is of the form below:

var equation = (x-1)^2 + (y-1)^2 - (4)

var val = nerdamer(equation, { x: 4});
var parse = val + "=0"; Where parse is "(-1+y)^2+5=0"

var sol = nerdamer.solveEquations(parse, 'y');

Error: From Algebra , Invalid array length as in the rpSolution function the degree parameter is coming up as NaN (not a number).

Please can you help me in this because I am looping though the value to get the value of 'y' to generate a circle.

The library is supporting the equation x^2 + y^2 =4, But if i am adding the center value then its not working example (x-1)^2 + (y-1)^2 - (4)

"(a-b)^2 - (b-a)^2" not simplifying.

On the input "(a-b)^2 - (b-a)^2", it doesn't simplify to 0. This could probably be fixed by always formatting expressions of type (±a ± b ± c ± ...)^2n so that 'a' has a positive coefficient (i.e 'a' doesn't have a minus sign in front).

npm issue

Hello, i am using nerdamer in my serverside application.
When i try to use diff function i get error

_nerdamer2.default.diff is not a function

nerdamer.reserved() shows
csc, sec, cot, erf, fact, mod, GCD, PI, E, cos, sin, tan, acos, asin, atan, exp, min, max, floor, ceiling, round, vector, matrix, parens, sqrt, log, abs, invert, transpose, dot

version 0.5.7

import:
import nerdamer from 'nerdamer'

usage:
let diff = nerdamer.diff(funcY)

How can i use diff function in my case?

Weird results with sqrt

Entering formulas like

sqrt(2x)

or

sqrt(2*x)

etc. give weird results like

√((3880899 x)/2744210)

Circle Equations

The library has helped me a lot in building a graphing system, I am stuck at one place , Can you people design a way where if I can detect any equation of the form (x-a)^2 + (x-b)^2 = r^2 (i.e. is a generalized circle equation) and can let me know that its a circle (i.e. I want to know if any user types in this type of circle equation i want to know its a circle )

Wrong sinus calculation

Hi, I don't know if that't my bad or nerdamer mistake, but sin(x) looks like sin(abs(x))...

Symbol evaluate() method

I see that the Symbol prototype does not have an evaluate method, but the master nerdamer function has an option to evaluate by passing an object. Is there currently a way to evaluate a Symbol object in a similar way, by passing an object with variable-value pairs?

As an explicit example, if I get a Symbol object returned from the integrate function, is there currently a way to evaluate that Symbol at a numerical value?

(x+a)^n -> NaN

(x+3)^2 outputs NaN.
(x-(-3))^2 works.

same with 1/(x+3)

nerdamer("x^2+x+1").latex() = "x+x^2+1"

In the new version, the order of polynomials is changed in the LaTeX output. I would expect the following result:

nerdamer("x^2+x+1").latex() = "x^2+x+1"

Can the LaTeX output optionally again be switched to the old style?

buildFunction doesn't handle built-in constants correctly.

nerdamer('pi * x').evaluate({x: 2}).text('decimals') // ~= 6.28
nerdamer('pi * x').buildFunction(['x'])(0) // ReferenceError: pi is not defined

The function body is just pi * x, and pi apparently isn't bound. I'd expect Math.PI to be used.

Manually doing nerdamer.setConstant('pi', Math.PI) fixes it, but that shouldn't be necessary.

As an aside, what's the deal with *? Sometimes it works, othertimes you get weird errors.

Solve fails to switch to algebraic method for quadratics and cubics

var x = nerdamer('solve(x^2+2*x+7,x)');
console.log(x.toString())
//[(209774887/85640239)*i-1,(-159018721/64919121)*i-1]

The numeric solution is returned. Nerdamer is perfectly capable of returning the algebraic solution for univariate polynomials and should make this its first option.

buildFunction

Extend buildFunction for functions outside the core.

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.