Comments (30)
pytest doesn't seem to be finding the tests?
from diffeqpy.
I think the last 3 lines in setup.py
:
[pytest]
python_files = test_*.py
python_functions=test_*
usually go into setup.cfg
(and I think the "new" header is [tool:pytest]
).
But I think those globs are the default. My typical setup.cfg looks like this:
[tool:pytest]
norecursedirs = .* scripts build dist conda-recipe
# https://github.com/pytest-dev/pytest/issues/1445
[easy_install]
zip_ok = 0
In setup.py
, I would also change:
packages=['diffeqpy'],
into
packages=['diffeqpy', 'diffeqpy.tests'],
and add an empty file diffeqpy/tests/__init__.py
.
That would include tests in the source distribution and one would then be able to execute e.g. python3.5 -m pytest --pyargs diffeqpy
from anywhere on a machine with diffeqpy
installed.
It should also work if it is a "development" installation (I would recommend installing via python3.5 -m pip install --user -e .
or python3.5 setup.py develop --user
). Alternatively one can set PYTHONPATH=/path/to/diffeqpy
and run pytest
from the package root.
from diffeqpy.
I think I made the changes @bjodah described but tests are still coming up blank. I pushed everything to master so you can see what the current setup it (I believe it matches what you were saying there).
crackauc@crackauc2 diffeqpy]$ python3.6 -m pip install --user -e .
Obtaining file:///home/crackauc/.julia/diffeqpy
Requirement already satisfied: julia in /usr/lib/python3.6/site-packages (from diffeqpy==0.2) (0.1.5)
Installing collected packages: diffeqpy
Found existing installation: diffeqpy 0.2
Uninstalling diffeqpy-0.2:
Successfully uninstalled diffeqpy-0.2
Running setup.py develop for diffeqpy
Successfully installed diffeqpy
[crackauc@crackauc2 diffeqpy]$ python3.6 -m pytest --pyargs diffeqpy
============================================================================ test session starts =============================================================================
platform linux -- Python 3.6.4, pytest-3.5.0, py-1.5.3, pluggy-0.6.0
rootdir: /home/crackauc/.julia/diffeqpy, inifile: setup.cfg
collecting 0 items
from diffeqpy.
Hmmm.. maybe try:
$ PYTHONPATH=$(pwd) python3.6 -m pytest
or:
$ cd / && python3.6 -m pytest --pyargs diffeqpy # shot in the dark...
from diffeqpy.
Looks like versions are mixed for some reason:
crackauc@crackauc2 diffeqpy]$ cd / && python3.6 -m pytest --pyargs diffeqpy
============================================================================ test session starts =============================================================================
platform linux -- Python 3.6.4, pytest-3.5.0, py-1.5.3, pluggy-0.6.0
rootdir: /, inifile:
collecting 0 items [crackauc@crackauc2 /]$ PYTHONPATH=$(pwd) python3.6 -m pytest
============================================================================ test session starts =============================================================================
platform linux -- Python 3.6.4, pytest-3.5.0, py-1.5.3, pluggy-0.6.0
rootdir: /, inifile:
collected 0 items / 1 errors
=================================================================================== ERRORS ===================================================================================
_____________________________________________________________________________ ERROR collecting ______________________________________________________________________________
usr/lib/python3.6/site-packages/py/_error.py:66: in checked_call
return func(*args, **kwargs)
E PermissionError: [Errno 13] Permission denied: '//boot/grub2'
During handling of the above exception, another exception occurred:
usr/lib/python3.6/site-packages/py/_path/common.py:377: in visit
for x in Visitor(fil, rec, ignore, bf, sort).gen(self):
usr/lib/python3.6/site-packages/py/_path/common.py:429: in gen
for p in self.gen(subdir):
usr/lib/python3.6/site-packages/py/_path/common.py:429: in gen
for p in self.gen(subdir):
usr/lib/python3.6/site-packages/py/_path/common.py:414: in gen
entries = path.listdir()
usr/lib/python3.6/site-packages/py/_path/local.py:387: in listdir
names = py.error.checked_call(os.listdir, self.strpath)
usr/lib/python3.6/site-packages/py/_error.py:86: in checked_call
raise cls("%s%r" % (func.__name__, args))
E py.error.EACCES: [Permission denied]: listdir('//boot/grub2',)
============================================================================== warnings summary ==============================================================================
None
could not create cache path /.pytest_cache/v/cache/nodeids
could not create cache path /.pytest_cache/v/cache/lastfailed
-- Docs: http://doc.pytest.org/en/latest/warnings.html
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
==================================================================== 2 warnings, 1 error in 0.49 seconds =====================================================================
[crackauc@crackauc2 /]$ sudo PYTHONPATH=$(pwd) python3.6 -m pytest
[sudo] password for crackauc:
============================================================================ test session starts =============================================================================
platform linux -- Python 3.6.4, pytest-3.5.0, py-1.5.3, pluggy-0.6.0
rootdir: /, inifile:
collected 0 items / 1 errors
=================================================================================== ERRORS ===================================================================================
_____________________________________________________________________________ ERROR collecting ______________________________________________________________________________
usr/lib/python3.6/site-packages/_pytest/config.py:334: in _getconftestmodules
return self._path2confmods[path]
E KeyError: local('//lib64/python2.7/site-packages/numpy')
During handling of the above exception, another exception occurred:
usr/lib/python3.6/site-packages/_pytest/config.py:365: in _importconftest
return self._conftestpath2mod[conftestpath]
E KeyError: local('//lib64/python2.7/site-packages/numpy/conftest.py')
During handling of the above exception, another exception occurred:
//lib64/python2.7/site-packages/numpy/core/__init__.py:16: in <module>
from . import multiarray
E ImportError: //lib64/python2.7/site-packages/numpy/core/multiarray.so: undefined symbol: _Py_ZeroStruct
During handling of the above exception, another exception occurred:
usr/lib/python3.6/site-packages/_pytest/config.py:371: in _importconftest
mod = conftestpath.pyimport()
usr/lib/python3.6/site-packages/py/_path/local.py:668: in pyimport
__import__(modname)
//lib64/python2.7/site-packages/numpy/__init__.py:142: in <module>
from . import add_newdocs
//lib64/python2.7/site-packages/numpy/add_newdocs.py:13: in <module>
from numpy.lib import add_newdoc
//lib64/python2.7/site-packages/numpy/lib/__init__.py:8: in <module>
from .type_check import *
//lib64/python2.7/site-packages/numpy/lib/type_check.py:11: in <module>
import numpy.core.numeric as _nx
//lib64/python2.7/site-packages/numpy/core/__init__.py:26: in <module>
raise ImportError(msg)
E ImportError:
E Importing the multiarray numpy extension module failed. Most
E likely you are trying to import a failed build of numpy.
E If you're working with a numpy git repo, try `git clean -xdf` (removes all
E files not under version control). Otherwise reinstall numpy.
E
E Original error was: //lib64/python2.7/site-packages/numpy/core/multiarray.so: undefined symbol: _Py_ZeroStruct
During handling of the above exception, another exception occurred:
usr/lib/python3.6/site-packages/py/_path/common.py:377: in visit
for x in Visitor(fil, rec, ignore, bf, sort).gen(self):
usr/lib/python3.6/site-packages/py/_path/common.py:429: in gen
for p in self.gen(subdir):
usr/lib/python3.6/site-packages/py/_path/common.py:429: in gen
for p in self.gen(subdir):
usr/lib/python3.6/site-packages/py/_path/common.py:429: in gen
for p in self.gen(subdir):
usr/lib/python3.6/site-packages/py/_path/common.py:418: in gen
dirs = self.optsort([p for p in entries
usr/lib/python3.6/site-packages/py/_path/common.py:419: in <listcomp>
if p.check(dir=1) and (rec is None or rec(p))])
usr/lib/python3.6/site-packages/_pytest/main.py:434: in _recurse
ihook = self.gethookproxy(path)
usr/lib/python3.6/site-packages/_pytest/main.py:338: in gethookproxy
my_conftestmodules = pm._getconftestmodules(fspath)
usr/lib/python3.6/site-packages/_pytest/config.py:348: in _getconftestmodules
mod = self._importconftest(conftestpath)
usr/lib/python3.6/site-packages/_pytest/config.py:376: in _importconftest
raise ConftestImportFailure(conftestpath, sys.exc_info())
E _pytest.config.ConftestImportFailure: ImportError("\nImporting the multiarray numpy extension module failed. Most\nlikely you are trying to import a failed build of numpy.\nIf you're working with a numpy git repo, try `git clean -xdf` (removes all\nfiles not under version control). Otherwise reinstall numpy.\n\nOriginal error was: //lib64/python2.7/site-packages/numpy/core/multiarray.so: undefined symbol: _Py_ZeroStruct\n",)
E File "//lib64/python2.7/site-packages/numpy/__init__.py", line 142, in <module>
E from . import add_newdocs
E File "//lib64/python2.7/site-packages/numpy/add_newdocs.py", line 13, in <module>
E from numpy.lib import add_newdoc
E File "//lib64/python2.7/site-packages/numpy/lib/__init__.py", line 8, in <module>
E from .type_check import *
E File "//lib64/python2.7/site-packages/numpy/lib/type_check.py", line 11, in <module>
E import numpy.core.numeric as _nx
E File "//lib64/python2.7/site-packages/numpy/core/__init__.py", line 26, in <module>
E raise ImportError(msg)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
========================================================================== 1 error in 67.62 seconds ==========================================================================
from diffeqpy.
Weird, for me I can run pytest from outside the root without errors:
~/vc$ python3 -m pytest --pyargs diffeqpy
=============================================================================================== test session starts ================================================================================================
platform linux -- Python 3.5.2, pytest-3.5.0, py-1.5.3, pluggy-0.6.0
rootdir: /home/bjorn/vc/diffeqpy, inifile: setup.cfg
plugins: pep8-1.0.6, flakes-2.0.0
collected 2 items
diffeqpy/diffeqpy/tests/test_ode.py .. [100%]
============================================================================================ 2 passed in 79.28 seconds =============================================================================================
from diffeqpy.
Is there some package installation step that has to be done?
[crackauc@crackauc2 /]$ python3.6 -m pytest --pyargs diffeqpy
============================================================================ test session starts =============================================================================
platform linux -- Python 3.6.4, pytest-3.5.0, py-1.5.3, pluggy-0.6.0
rootdir: /, inifile:
collecting 0 items
from diffeqpy.
I have run:
$ python3 -m pip install --user -e .
in the repo root before-hand. Which created a link:
$ ls -l $(python3 -c "import site; print(site.USER_SITE)") | grep diffeq
-rw-rw-r-- 1 bjorn bjorn 25 apr 23 00:58 diffeqpy.egg-link
$ cat $(python3 -c "import site; print(site.USER_SITE)")/diffeqpy.egg-link
/home/bjorn/vc/diffeqpy
from diffeqpy.
@ChrisRackauckas Why not use tox? You can avoid this kind of it-works-in-my-computer problem. It simplifies Travis setup as well.
I know tox does not work with conda and probably many DifferentialEquations.jl dependencies invoke conda... But for testing interface to simple pure-Julia code, it may be fine.
from diffeqpy.
OK. I had a look at the code. First of all, the way Python organize unit tests are different from Julia: the tests have to be wrapped it into a function or a class. There are only two such cases in diffeqpy/tests which are in test_ode.py.
Second, I think pytest's default behavior is to stop test collection once it encounter an import error. This may explain why pytest in @bjodah environment can find tests while @ChrisRackauckas's can't. Since test_ode.py has import numba
, pytest won't find tests unless it has numba installed in the environment. My guess is that @bjodah had numba installed while @ChrisRackauckas didn't.
from diffeqpy.
Why not use tox?
I have no idea what that is.
First of all, the way Python organize unit tests are different from Julia: the tests have to be wrapped it into a function or a class.
I didn't finish changing them because pytest won't run.
My guess is that @bjodah had numba installed while @ChrisRackauckas didn't.
The code works for me (I wrote the README).
from diffeqpy.
I think I've encounter LLVM incompatibility issue in Julia and Numba. Even python -c 'import diffeqpy.tests.test_ode'
segfaults. Reading JuliaPy/PyCall.jl#220 (comment) it looks like I need to install the right version of llvmlite. But building old version of llvmlite (0.16.0) requires an old version of LLVM (3.9.x) which I don't have at the moment.
from diffeqpy.
The code works for me
But you are not providing a reproducible way to make it work elsewhere. tox helps for that, at least for running tests.
from diffeqpy.
But you are not providing a reproducible way to make it work elsewhere. tox helps for that, at least for running tests.
What do you mean by that? Just that we need the checkout? I want to just get that fixed instead:
from diffeqpy.
I think I've encounter LLVM incompatibility issue in Julia and Numba. Even python -c 'import diffeqpy.tests.test_ode' segfaults. Reading JuliaPy/PyCall.jl#220 (comment) it looks like I need to install the right version of llvmlite. But building old version of llvmlite (0.16.0) requires an old version of LLVM (3.9.x) which I don't have at the moment.
That issue doesn't apply since we never PyCall numba. Instead, the user can optionally give an already JIT compiled Numba function, but Julia/PyCall shouldn't ever know that Numba was involved.
from diffeqpy.
Update is that it now just stalls while testing:
[crackauc@crackauc2 ~]$ cd .julia/diffeqpy
[crackauc@crackauc2 diffeqpy]$ python3.6
Python 3.6.4 (default, Dec 19 2017, 14:48:12)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import diffeqpy
>>> de = diffeqpy.setup()
>>> def f(u,p,t):
... return -u
...
>>> u0 = 0.5
>>> tspan = (0., 1.)
>>> prob = de.ODEProblem(f, u0, tspan)
>>> sol = de.pysolve(prob)
>>> import matplotlib.pyplot as plt
>>> plt.plot(sol.t,sol.u)
[<matplotlib.lines.Line2D object at 0x7fdb915c75f8>]
>>> plt.show()
>>> exit()
[crackauc@crackauc2 diffeqpy]$ pytest
===================================================================== test session starts ======================================================================
platform linux -- Python 3.6.4, pytest-3.5.0, py-1.5.3, pluggy-0.6.0
rootdir: /home/crackauc/.julia/diffeqpy, inifile: setup.cfg
collecting 0 items
Getting there.
from diffeqpy.
That issue doesn't apply since we never PyCall numba.
Indeed, it works:
https://travis-ci.org/JuliaDiffEq/diffeqpy/builds/369923283
It seems that the segfault is problem in my environment.
But you are not providing a reproducible way to make it work elsewhere. tox helps for that, at least for running tests.
What do you mean by that?
I mean, you are not providing a single entry point for running unit tests. For example, numba also has to be installed for the test. Manual installtion is not developer-friendly and doesn't scale if you need more packages. Also, ideally, it'd be better if it's isolated from user's environment. Julia needs to wait for Pkg3 for that, but Python already has it (virtualenv/venv) and a wrapper for testing (tox).
from diffeqpy.
Is there a way to use tox
but not require it to precompile DiffEqPy each time? I guess that's just a test time problem but there must be a way to run it without rebuilding PyCall and recompiling the whole thing.
Do you know what's trying to use apt on Mac @tkf? https://travis-ci.org/JuliaDiffEq/diffeqpy/jobs/369935686#L28 I don't have any apt commands in the repo. If tox isn't compatible with Mac that's fine, but then we should at least change those tests to allow failure for now.
I mean, you are not providing a single entry point for running unit tests. For example, numba also has to be installed for the test. Manual installtion is not developer-friendly and doesn't scale if you need more packages. Also, ideally, it'd be better if it's isolated from user's environment. Julia needs to wait for Pkg3 for that, but Python already has it (virtualenv/venv) and a wrapper for testing (tox).
Yeah, part of the reason for doing this is to have an application for compiler/ecosystem folks to test and develop with. I hope that when the release of diffeqr and diffeqpy happen, that will then be a good incentive for Julia devs to care about the JuliaCall and pyjulia tools (we definitely will) along with the intersections of Pkg3 with static compilation and external calls, and so it'll start a nice feedback loop.
from diffeqpy.
Is there a way to use tox but not require it to precompile DiffEqPy each time? I guess that's just a test time problem but there must be a way to run it without rebuilding PyCall and recompiling the whole thing.
Looks like that's just stalling when in the -py36
test. Happened to me locally, and happened on Travis:
https://travis-ci.org/JuliaDiffEq/diffeqpy/jobs/369935685
I am more than slightly puzzled by that.
from diffeqpy.
Locally having -py27
issues too.
[crackauc@crackauc2 diffeqpy]$ tox -e py27
GLOB sdist-make: /home/crackauc/.julia/diffeqpy/setup.py
py27 create: /home/crackauc/.julia/diffeqpy/.tox/py27
py27 installdeps: pytest, pytest-cov, numba
py27 inst: /home/crackauc/.julia/diffeqpy/.tox/dist/diffeqpy-0.2.zip
py27 installed: attrs==17.4.0,coverage==4.5.1,diffeqpy==0.2,enum34==1.1.6,funcsigs==1.0.2,julia==0.1.5,llvmlite==0.22.0,more-itertools==4.1.0,numba==0.37.0,numpy==1.14.2,pluggy==0.6.0,py==1.5.3,pytest==3.5.0,pytest-cov==2.5.1,singledispatch==3.4.0.3,six==1.11.0
py27 runtests: PYTHONHASHSEED='3824619191'
py27 runtests: commands[0] | julia --color=yes -e Pkg.add("DiffEqPy")
INFO: Package DiffEqPy is already installed
INFO: METADATA is out-of-date — you may not have the latest version of DiffEqPy
INFO: Use `Pkg.update()` to get the latest versions of your packages
py27 runtests: commands[1] | julia --color=yes -e Pkg.checkout("PyCall")
INFO: Checking out PyCall master...
INFO: Pulling PyCall latest master...
INFO: No packages to install, update or remove
py27 runtests: commands[2] | julia --color=yes -e Pkg.build("PyCall")
INFO: Building Conda
INFO: Building PyCall
Info: PyCall is using /home/crackauc/.julia/diffeqpy/.tox/py27/bin/python (Python 2.7.5) at /home/crackauc/.julia/diffeqpy/.tox/py27/bin/python, libpython = /usr/lib64/libpython2.7
Info: /home/crackauc/.julia/v0.6/PyCall/deps/deps.jl has been updated
Info: /home/crackauc/.julia/v0.6/PyCall/deps/PYTHON has been updated
py27 runtests: commands[3] | julia --color=yes -e using DiffEqPy
py27 runtests: commands[4] | python -c import diffeqpy.tests.test_ode
py27 runtests: commands[5] | py.test --pyargs diffeqpy
===================================================================== test session starts ======================================================================
platform linux2 -- Python 2.7.5, pytest-3.5.0, py-1.5.3, pluggy-0.6.0
rootdir: /home/crackauc/.julia/diffeqpy, inifile: setup.cfg
plugins: cov-2.5.1
collecting 0 items ERROR: InvocationError for command '/home/crackauc/.julia/diffeqpy/.tox/py27/bin/py.test --pyargs diffeqpy' (exited with code 1)
___________________________________________________________________________ summary ____________________________________________________________________________
ERROR: py27: commands failed
from diffeqpy.
Is there a way to use tox but not require it to precompile DiffEqPy each time? I guess that's just a test time problem but there must be a way to run it without rebuilding PyCall and recompiling the whole thing.
I don't know why PyCall needs rebuild each time so I don't know how to fix it.
If you just need to quickly run tests without invoking stuff inside tox.ini, you can just do
.tox/py36/bin/py.test --pyargs diffeqpy
Note that this runs tests installed in .tox/py36/lib. If you want this workflow, it's better to set usedevelop = true
(http://tox.readthedocs.io/en/latest/config.html#confval-usedevelop=BOOL) so that the code in the git repository is used.
Do you know what's trying to use apt on Mac @tkf? https://travis-ci.org/JuliaDiffEq/diffeqpy/jobs/369935686#L28
Hmm... That's puzzling. But it looks like it had happened before my PR https://travis-ci.org/JuliaDiffEq/diffeqpy/jobs/369880767#L28
from diffeqpy.
The issue in Travis is during using DiffEqPy
https://travis-ci.org/JuliaDiffEq/diffeqpy/jobs/369935685#L980 and your local py27 failure is from py.test so I don't know if they are related.
from diffeqpy.
BTW, encouraging people to care about interoperability by releasing diffeqr and diffeqpy is really a great move!! Thank you!
from diffeqpy.
The issue in Travis is during using DiffEqPy https://travis-ci.org/JuliaDiffEq/diffeqpy/jobs/369935685#L980
Oops. I clicked the redo button in Travis to see if the problem is reproducible. But it turned out that Travis throws away old build. So the link https://travis-ci.org/JuliaDiffEq/diffeqpy/jobs/369935685#L980 above won't make sense anymore...
from diffeqpy.
Nevermind, it produces the same error.
from diffeqpy.
One thing I've forgotten was that Julia loads .juliarc.jl even for non-interactive session. Since I had ENV["PYTHON"] = ...
, the setting in tox.ini was overwritten. If I empty .juliarc.jl then I can import diffeqpy.tests.test_ode but still the tests do not run.
from diffeqpy.
It seems I need to run
import julia
jul = julia.Julia()
import diffeqpy
de = diffeqpy.setup()
each time I switch Python versions. I wonder if that's some kind of race condition related to precompilation that needs to be reported to pyjulia.
from diffeqpy.
It looks like Travis is good now. AppVeyor is having a 32-bit vs 64-bit issue due to tox I think. @tkf can you check it out?
from diffeqpy.
It looks like the test itself choke sometimes randomly. It happens both locally and in Travis. It's probably that using DiffEqPy
hangs. When it occurs, sudo strace -p <pid>
shows something like
futex(0x7f507c45caa0, FUTEX_WAIT_PRIVATE, 2, NULL
I'm not sure it helps. Does it mean there is a deadlock somewhere in Julia-Python bridge?
Anyway, since it happens also locally, I guess Travis setup itself is fine.
I don't know what is happening in AppVeyor. tox should be using whatever installed in that system. So, as long as Python and Julia are compatible to the system, I think the rest should be handled by pip via tox without problem. But I'm not familiar with Windows...
from diffeqpy.
Oh, appveyor has many Python interpreters installed in one environment. I see... https://www.appveyor.com/docs/build-environment/#python
from diffeqpy.
Related Issues (20)
- Accessing `EnsembleSolution` elements HOT 1
- How to make it use of FractionalDiffEq.jl into python - reg HOT 1
- question: is this repository still under maintain? HOT 3
- Sparse Matrix Jacobian / Mass Matrix support HOT 2
- MethodError: no method matching Sundials.NVector(::Vector{Real}) HOT 3
- Terminating integration based on maxiters results in RuntimeError HOT 3
- problems with julia 1.9? HOT 2
- Speed up julia loading and time to first run HOT 1
- Feature request: Ingest sympy representation of ModelingToolkit and return PyTorch tensor with gradients and events
- dictionary support for de.jit HOT 7
- Support prob_func in ensembles HOT 5
- diffeqpy GPU isn't automatically installing DiffEqGPU on Collab? HOT 2
- Segfault when using sympy symbols as initial conditions.
- UndefVarError: NonlinearLeastSquaresProblem not defined in SimpleNonlinearSolve package HOT 2
- LoadError: Artifact "OpenSpecFun" was not found by looking in the paths HOT 3
- Precompilation not quite working HOT 2
- Error when importing de HOT 9
- TypeError on DiscreteCallback HOT 2
- Error when running the example code for GPU-acceleration using diffeqpy HOT 10
- DAE with Mass Matrix HOT 7
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from diffeqpy.