GithubHelp home page GithubHelp logo

eguatech / egua Goto Github PK

View Code? Open in Web Editor NEW
813.0 20.0 39.0 1.43 MB

Linguagem de programação em português, simples e moderna

Home Page: https://egua.dev/idegua/

License: MIT License

JavaScript 100.00%
egua portugues javascript linguagem-de-programacao programacao programming-language

egua's People

Contributors

andre0n avatar arlesonlui avatar barbozafernando avatar brennuscaio avatar dependabot[bot] avatar edilsonalves avatar ericklemos avatar heictor avatar jacksjm avatar jazancort avatar leonelsanchesdasilva avatar lucaspompeun avatar medeirosjoaquim avatar msftgits avatar othonalberto avatar silvanogpm avatar thenicolau avatar thgcode 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

egua's Issues

Refatorar função com verificação de parâmetros errados e console.log

egua/src/lib/eguamat.js

Lines 478 to 509 in 5671a03

module.exports.transposta = function(a) {
if (isNaN(num) || num === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para transposta(a)."
);
console.log("a.length = " + a.length);
console.log("a[0].length = " + a[0].length);
if (a[0].length == undefined) { // a is a 1D row array
var data = Array.from(Array(a.length), () => new Array(1));
for (var j = 0; j < a.length; j++) {
data[j][0] = a[j];
}
} else if (a[0].length == 1) { // a is a 1D column array
var data = [];
for (var i = 0; i < a.length; i++) {
data[i] = a[i][0];
}
} else { // a is a 2D array
var data = [];
for (var j = 0; j < a[0].length; j++) {
data[j] = Array(a.length);
}
for (var i = 0; i < a.length; i++) {
for (var j = 0; j < a[0].length; j++) {
data[j][i] = a[i][j];
}
}
}
return matriz(data);
};

Refatorar verificação de parâmetros e testar funções

egua/src/lib/eguamat.js

Lines 132 to 148 in 5671a03

module.exports.rand = function(n1,n2,e) {
if (isNaN(num) || num === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para rand(n1,n2,e)."
);
if (e == undefined) { e = 0; }
if (n1 == undefined && n2 == undefined) { return Math.random() * 2 - 1; }
var data = Array.from(Array(n1),() => new Array(n2));
// benefit from creating array this way is a.length = number of rows and a[0].length = number of columns
for (var i = 0; i < n1; i++) {
for (var j = 0; j < n2; j++) {
data[i][j] = e + Math.random() * 2 - 1;
}
}
return aprox(data,5);
};

Remover função eguamat.matriz();

egua/src/lib/eguamat.js

Lines 511 to 551 in 5671a03

//Criação e exibição de tabelas de um vetor ou matriz
module.exports.matriz = function(z) {
if (isNaN(z) || z === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para matriz(a)."
);
if (z[0].length == undefined) { // 1D array
var table = document.createElement('table');
table.setAttribute("class", "matrix");
var tableBody = document.createElement('tbody');
var row = document.createElement("tr");
tableBody.appendChild(row);
for (var i = 0; i < z.length; i++) {
var cell = document.createElement("td");
var cellText = document.createTextNode(z[i]);
cell.appendChild(cellText);
row.appendChild(cell);
}
table.appendChild(tableBody);
} else { // 2D array
var table = document.createElement('table');
table.setAttribute("class", "matrix");
var tableBody = document.createElement('tbody');
z.forEach(function (rowData) {
var row = document.createElement('tr');
rowData.forEach(function (cellData) {
var cell = document.createElement('td');
cell.appendChild(document.createTextNode(cellData));
row.appendChild(cell);
});
tableBody.appendChild(row);
});
table.appendChild(tableBody);
}
document.getElementById(outId).innerHTML = table.outerHTML;
toggleOrCheckIfFunctionCall(true);
console.log(z);
return z;
};

Remover função de plotagem gráfica da linguagem egua

egua/src/lib/eguamat.js

Lines 940 to 957 in 5671a03

module.exports.mruvfhp = function(s0,v0, t, a) {
if (isNaN(s0) || s0 === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para mruvfhp(Pi, Vf, T, A)."
);
var index = 0;
var s = new Array(t);
var x = new Array();
for(var i=0;i<t;i++){
s[i]=s0+v0*i+((a*i*i)/2);
x[index] = i;
index++;
console.log(s[i]);
}
return plot(x,s);
};

Refatorar verificação de parâmetros e remover string do retorno

egua/src/lib/eguamat.js

Lines 118 to 129 in 5671a03

module.exports.fun2R = function(a,b,c) {
if (isNaN(a) || a === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para fun2R(a,b,c)."
);
r1 = (-1 * b + Math.sqrt(Math.pow(b, 2) - (4 * a * c))) / (2 * a);
r2 = (-1 * b - Math.sqrt(Math.pow(b, 2) - (4 * a * c))) / (2 * a);
xv = (-1*b)/(2*a);
yv = (-1*(Math.pow(b, 2) - (4 * a * c)))/4*a;
return ["Xv: " + xv + " Yv: " + yv];
};

Refatorar verificação de parâmetros

egua/src/lib/eguamat.js

Lines 367 to 382 in 5671a03

module.exports.sqr = function(a) {
if (isNaN(num) || num === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para sqr(a)."
);
var mean = ve(array);
var sum = 0;
var i = array.length;
var tmp;
while (--i >= 0) {
tmp = array[i] - mean;
sum += tmp * tmp;
}
return sum;
};

Remover console.log e aplicar testes na função para esclarecimento de input, além de possível refatoração da função para legibilidade

egua/src/lib/eguamat.js

Lines 599 to 684 in 5671a03

module.exports.matrizinv= function(m) {
if (isNaN(num) || num === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para matrizinv(m)."
);
if (m.length !== m[0].length) { return "não é uma matriz quadrada"; }
//create the identity matrix (I), and a copy (C) of the original
var i = 0, ii = 0, j = 0, dim = m.length, e = 0, t = 0;
var I = [], C = [];
for (i = 0; i < dim; i += 1) {
// Create the row
I[I.length] = [];
C[C.length] = [];
for (j = 0; j < dim; j += 1) {
//if we're on the diagonal, put a 1 (for identity)
if (i == j) { I[i][j] = 1; }
else { I[i][j] = 0; }
// Also, make the copy of the original
C[i][j] = m[i][j];
}
}
// Perform elementary row operations
for (i = 0; i < dim; i += 1) {
// get the element e on the diagonal
e = C[i][i];
// if we have a 0 on the diagonal (we'll need to swap with a lower row)
if (e == 0) {
//look through every row below the i'th row
for (ii = i + 1; ii < dim; ii += 1) {
//if the ii'th row has a non-0 in the i'th col
if (C[ii][i] != 0) {
//it would make the diagonal have a non-0 so swap it
for (j = 0; j < dim; j++) {
e = C[i][j]; //temp store i'th row
C[i][j] = C[ii][j];//replace i'th row by ii'th
C[ii][j] = e; //repace ii'th by temp
e = I[i][j]; //temp store i'th row
I[i][j] = I[ii][j];//replace i'th row by ii'th
I[ii][j] = e; //repace ii'th by temp
}
//don't bother checking other rows since we've swapped
break;
}
}
//get the new diagonal
e = C[i][i];
//if it's still 0, not invertable (error)
if (e == 0) { return }
}
// Scale this row down by e (so we have a 1 on the diagonal)
for (j = 0; j < dim; j++) {
C[i][j] = C[i][j] / e; //apply to original matrix
I[i][j] = I[i][j] / e; //apply to identity
}
// Subtract this row (scaled appropriately for each row) from ALL of
// the other rows so that there will be 0's in this column in the
// rows above and below this one
for (ii = 0; ii < dim; ii++) {
// Only apply to other rows (we want a 1 on the diagonal)
if (ii == i) { continue; }
// We want to change this element to 0
e = C[ii][i];
// Subtract (the row above(or below) scaled by e) from (the
// current row) but start at the i'th column and assume all the
// stuff left of diagonal is 0 (which it should be if we made this
// algorithm correctly)
for (j = 0; j < dim; j++) {
C[ii][j] -= e * C[i][j]; //apply to original matrix
I[ii][j] -= e * I[i][j]; //apply to identity
}
}
}
console.log(I); // C should be the identity and matrix I should be the inverse:
return matriz(aprox(I, 2));
};

Erro ao passar função como parâmetro

Olá, tomei liberdade de criar o método mapear, cuja função é a mesma do Array.map() do Javascript. Porém, estou com um problema.

err

A linguagem não permite que uma função receba outra função como parâmetro.
Alguém poderia me guiar nesse trecho ou corrigir pra poder dar pull?

Valeu!

Remover função "mrufh"

egua/src/lib/eguamat.js

Lines 865 to 881 in 5671a03

//Função Horária da Posição (M.R.U)
module.exports.mrufh = function(s0,v,t) {
if (isNaN(s0) || s0 === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para mrufh(s0,v,t)."
);
t=t+1;
var s = new Array();
var index = 0;
for(var i=0;i<t;i++){
s[index]=s0+v*i;
index++;
console.log(s[i]);
}
return ["Função: "+s0+"+("+v+")*t"+"<br>"+"Posições: "+s];
};

Refatorar função e alterar nome para "pontosAleatorios"

egua/src/lib/eguamat.js

Lines 188 to 203 in 5671a03

module.exports.pale = function(n) {
if (isNaN(n) || n === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para pale(n)."
);
if (ex == undefined) { ex = 0; }
var x = [];
x[0] = 100;
for (var i = 1; i < n; i++) {
x[i] = ex + x[i - 1] + Math.random() * 2 - 1;
}
var xx = aprox(x, 2);
console.log(xx);
return xx;
};

Remover plotagem gráfica

egua/src/lib/eguamat.js

Lines 100 to 115 in 5671a03

module.exports.fun2 = function(a,b,c) {
if (isNaN(a) || a === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para fun2(a,b,c)."
);
n = 2.5;
var arr = [];
var step = (n - (-n)) / (n- 1);
for (var i = 0; i < n; i=i+0.01) {
arr.push(((-n-1.945) + (step * i)));
}
x = arr;
f = x.map(function(x) { return ((x * x * a)+(b * x)+c); });
plot(x,f);//['f(x) ='+f];
};

Refatorar função para permitir teste e remover console log

egua/src/lib/eguamat.js

Lines 959 to 978 in 5671a03

//Gráfico da velocidade (M.R.U.V)
module.exports.mruvvel = function(s0,s,a) {
if (isNaN(s0) || s0 === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para mruvvel(Pi, Vf, A)."
);
var vf = new Array();
var x = new Array();
var v = new Array();
var index = 0;
for(var i=0;i<s;i++){
v=index;
vf[index]=Math.sqrt(2*a*(index-s0));
x[index]=i;
index++;
console.log(vf[i]);
}
return vf;
};

Refatorar verificação de parâmetros e alterar nome de função

egua/src/lib/eguamat.js

Lines 354 to 364 in 5671a03

module.exports.ve = function(a) {
if (isNaN(num) || num === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para ve(a)."
);
if(a.length == 1){return aprox(smtr(a) / a[0].length,4);} // a is a row array
if(a[0].length == 1){return aprox(smtr(a) / a.length,4);} // a is a column array
if(a[0].length == undefined){return aprox(smtr(a) / a.length,4);}
};

Remover função de plotagem gráfica "mruvel"

egua/src/lib/eguamat.js

Lines 903 to 919 in 5671a03

module.exports.mruvel = function(s0,s,t) {
if (isNaN(s0) || s0 === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para mruvel(s0,s,t)."
);
var v = new Array();
var x = new Array();
var index = 0;
for(var i=0;i<t;i++){
v[index]=(s-s0)/t;
x[index]=i;
index++;
console.log(v[i]);
}
return plot(x,v);
};

Refatorar verificação de parâmetros

egua/src/lib/eguamat.js

Lines 151 to 171 in 5671a03

module.exports.aprox = function(x,z) {
if (isNaN(x) || x === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para aprox(x,z)."
);
if (z == undefined) { z = 2; }
console.log("type of = " + typeof (x));
if (typeof (x) == "number") { x = x.toFixed(z) }
else if (x[0].length == undefined) { // 1D array
for (var i = 0; i < x.length; i++) {
x[i] = parseFloat(x[i].toFixed(z));
}
} else
for (var i = 0; i < x.length; i++) { // 2D array
for (var j = 0; j < x[0].length; j++) {
x[i][j] = parseFloat(x[i][j].toFixed(z));
}
}
return x; //OK
};

Refatorar verificação de parâmetros da função

egua/src/lib/eguamat.js

Lines 434 to 443 in 5671a03

//Coeficiente de correlação de pearson para duas matrizes
module.exports.coefcorr = function(array1, array2) {
if (isNaN(array1) || array1 === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para coefcorr(array1, array2)."
);
return aprox(covar(array1, array2) / devpad(array1, 1) / devpad(array2, 1));
};

Remover string do retorno para permitir manipulação do resultado em estrutura de index

egua/src/lib/eguamat.js

Lines 981 to 1004 in 5671a03

module.exports.pid = function(Mo, t, K, T1, T2) {
if (isNaN(Mo) || Mo === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para pid(Ov, Ts, K, T1, T2)."
);
pi = Math.PI;//Pi da bilbioteca Math.js
//Amortecimento Relativo
csi = (-1*(Math.log((Mo/100))))/(Math.sqrt(Math.pow(pi,2)+(pot((Math.log((Mo/100))),2))));
//Frequência Natural
Wn = (4)/(t*csi);
//Controlador Proporcional (P)
Kp = 20*(Math.pow(csi,2)*Math.pow(Wn,2)*T1*T2)+((Math.pow(Wn,2)*T1*T2)-1)/(K);
//Controlador Integral (I)
Ki = (10*csi*(Math.pow(Wn,3))*T1*T2)/(K);
//Controlador Derivativo (D)
Kd = (12*csi*Wn*T1*T2-T1-T2)/(K);
return ['csi:'+csi,'<br/>','Wn:'+Wn,'<br/>','Proporcional:'+Kp,'<br/>','Integral:'+Ki,'<br/>','Progressivo:'+Kd];
};

Refatorar verificação de parâmetros

egua/src/lib/eguamat.js

Lines 447 to 459 in 5671a03

module.exports.coluna = function(a,c) {
if (isNaN(a) || c === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para coluna(a,c)."
);
var column = Array.from(Array(a.length), () => new Array(1));
for (var i = 0; i < a.length; i++) {
column[i][0] = a[i][c - 1];
}
return matriz(column);
};

Refatorar verificação de parâmetros

egua/src/lib/eguamat.js

Lines 206 to 218 in 5671a03

module.exports.vet = function(a,b) {
if (isNaN(a) || a === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para vet(a,b)."
);
var data = Array.from(Array(1),() => new Array(b-a+1));
// the benefit from creating array this way is a.length = number of rows and a[0].length = number of columns
for (var i = 0; i < data[0].length; i++) {
data[0][i]= a + i;
}
return matrizn(data);
};

Novos métodos pra lib de tempo

Opa! Curti o seu projeto e quis contribuir com algo, @lucaspompeun. Eu implementei três novos métodos na lib de time. Um dos métodos se chama segundos, outro é o minutos e outro chamado horas; eles retornam o segundo, o minuto e a hora atual respectivamente, inclusive, renomeei o método hora que já existia para horario, porque ele retornava uma data completa, com dia, mês, ano, horário em GMT, dia da semana e etc, sei lá, achei que ficaria mais fácil de entender assim. Caso discorde, altero de boa.

time

Refatorar verificação de parâmetros e testar função

egua/src/lib/eguamat.js

Lines 407 to 421 in 5671a03

//Covariância de duas matrizes
module.exports.covar = function(array1, array2) {
if (isNaN(array1) || array1 === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para covar(matriz1, matriz2)."
);
var u = ve(array1);
var v = ve(array2);
var arr1Len = array1.length;
var sq_dev = new Array(arr1Len);
for (var i = 0; i < arr1Len; i++)
sq_dev[i] = (array1[i] - u) * (array2[i] - v);
return smtr(sq_dev) / (arr1Len - 1);
};

Remover função de plotagem gráfica

egua/src/lib/eguamat.js

Lines 240 to 270 in 5671a03

module.exports.plot = function(x,y) {
if (isNaN(x) || x === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para plot(z)."
);
var yy = y;
var xx = x;
var data = [{
x: xx,
y: yy,
type: 'scatter',
line: { color: 'blue', width: 2 }
}];
var layout =
{
width: window.screen.Width,
height: 550,
paper_bgcolor: 'white',
plot_bgcolor: 'white',
margin: { l: 70, b: 60, r: 10, t: 40 },
xaxis: { title: 'x-axis', titlefont: { family: 'Courier New, monospace', size: 18, color: 'black' } },
yaxis: { title: 'y-axis', titlefont: { family: 'Courier New, monospace', size: 18, color: 'black' } },
xaxis: { tickfont: { size: 12, color: 'black' }, showgrid: true, gridcolor: 'black', linecolor: 'black' },
yaxis: { tickfont: { size: 12, color: 'black' }, showgrid: true, gridcolor: 'black', linecolor: 'black' }
};
toggleOrCheckIfFunctionCall(true);
Plotly.newPlot(outId, data, layout, { displayModeBar: true, staticPlot: true });
};

Atualizar para download em windows

Olá, tive interesse em usar a linguagem localmente, mas não posso pois uso o Windows, eu sei que demora e que não é simples assim, mas seria possível desenvolver uma versão para Windows, agredeço.

Refatorar e testar função, pois apresenta problemas no interpretador, além do teste de parâmetro não estar completo

egua/src/lib/eguamat.js

Lines 554 to 596 in 5671a03

module.exports.matrizmult = function(a,b) {
if (isNaN(a) || a === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para matrizmult(a,b)."
);
var data = []; // maybe change this to array of array
console.log("a.length = " + a.length);
console.log("a[0].length = " + a[0].length);
console.log("b.length = " + b.length);
console.log("b[0].length = " + b[0].length);
// if a is a 1D row array and b is a 1D column array
if (a.length == 1 && b[0].length == 1) {
for (var i = 0; i < a[0].length; i++) { data[i] = a[0][i] * b[i][0]; }
}
// if a is a 1D column array and b is a 1D row array
else if (a[0].length == 1 && b.length == 1) {
for (var i = 0; i < a.length; i++) { data[i] = a[i][0] * b[0][i]; }
}
// if a is a 1D column array and b is a 1D column array
else if (a[0].length == 1 && b[0].length == 1) {
for (var i = 0; i < a.length; i++) { data[i] = a[i][0] * b[i][0]; }
}
// if a is a 1D row array and b is a 1D row array
else if (a.length == 1 && b.length == 1) {
for (var i = 0; i < a[0].length; i++) { data[i] = a[0][i] * b[0][i]; }
}
// if a is a 2D array and b is a 2D array
else {
for (var r = 0; r < a.length; ++r) {
data[r] = new Array(b[0].length); // initialize the current row
for (var c = 0; c < b[0].length; ++c) {
data[r][c] = 0; // initialize the current cell
for (var i = 0; i < a[0].length; ++i) {
data[r][c] += a[r][i] * b[i][c];
}
}
}
}
return matriz(aprox(data));
};

image

Remover função de plotagem gráfica "mrufhp"

egua/src/lib/eguamat.js

Lines 883 to 900 in 5671a03

//Gráfico para a Função Horária da Posição (M.R.U)
module.exports.mrufhp = function(s0,v, t) {
if (isNaN(s0 || s0 === null))
throw new RuntimeError(
this.token,
"Você deve prover valores para mrufhp(Pi, Vf, T)."
);
var s = new Array();
var x = new Array();
var index = 0;
for(var i=0;i<t;i++){
s[index]=s0+v*i;
x[index] = i;
index++;
console.log(s[i]);
}
return plot(x,s);
};

Refatorar verificação de parâmetros

egua/src/lib/eguamat.js

Lines 221 to 237 in 5671a03

module.exports.qtd = function(a,b) {
if (isNaN(a) || a === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para qtd(a,b)."
);
if (b == undefined) {
var count = a.length;
} else {
var count = 0;
for (var i = 0; i < a.length; ++i) {
if (a[i] == b)
count++;
}
}
return count;
};

Adicionar testes

Olá, vocês já pensaram sobre testes na aplicação? Acabei de criar uma pull request #5 que só roda o égua com um arquivo de exemplo e garante que o interpretador não falha.
Isso não garante muita coisa e se o "teste" falhar fica muito difícil perceber como corrigir.

sugestao

  • Adicionar jest
  • Criar pasta tests/unit e colocar alguns testes unitários
  • Criar pasta tests/functional e ... ainda não muito claro pra mim, mas a ideia é rodar o egua completamente e perceber se a saída dos programas é a esperada. Não sei se jest é uma boa ferramenta pra isso.

O que vocês acham sobre?

Refatorar verificação de parâmetros

egua/src/lib/eguamat.js

Lines 307 to 317 in 5671a03

module.exports.mediana = function(a) {
if (isNaN(num) || num === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para mediana(a)."
);
a.sort(function (a, b) { return a - b; });
var mid = a.length / 2;
return mid % 1 ? a[mid - 0.5] : (a[mid - 1] + a[mid]) / 2;
};

Verificação de parâmetros com erros e função apresenta erros no compilador

Solicito também demais explicações sobre o input da função

egua/src/lib/eguamat.js

Lines 687 to 701 in 5671a03

module.exports.matrizid= function(m) {
if (isNaN(num) || num === null)
throw new RuntimeError(
this.token,
"Você deve prover valores para matrizid(m)."
);
var data = Array.from(Array(n), () => new Array(n));
for (var i = 0; i < n; i++) {
for (var j = 0; j < n; j++) {
if (i === j) { data[i][j] = 1; }
else { data[i][j] = 0; }
}
}
return matriz(data);
};

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.