Giter Site home page Giter Site logo

phpsci / phpsci-carray Goto Github PK

View Code? Open in Web Editor NEW
189.0 189.0 14.0 481 KB

[ARCHIVED] PHP library for scientific computing powered by C. See https://github.com/NumPower/numpower

Home Page: https://numpower.org

License: MIT License

PHP 0.20% M4 0.67% C 96.38% C++ 2.24% Objective-C 0.39% Shell 0.01% CMake 0.11%
carray linear-algebra matrices matrix openblas php php-array php-library php7 phpsci-carray phpsci-extension psr-0 psr-1 psr-2 scientific-computing

phpsci-carray's Introduction

PHPSci CArray Logo

PHPSci CArray Extension

PHPSci CArray is a high-performance scientific computing library for PHP developed in C and based on the original NumPy code. CArrays offer a solid alternative to PHP arrays as well as compatibility with codes developed using NumPy.

  • High Performance Indexing and Data Access
  • Low memory footprint compared to PHP Arrays
  • Efficient shape, initializers, linear algebra and mathematical methods.
  • Out of the box GPU integration (Cuda)

Installing

It's really easy to compile this extension using Linux environments.

Requirements

  • php-devel (php-dev)
  • PHP 7.2
  • OpenBLAS

Optional

  • cuBLAS (For GPU Integration)

Ubuntu 20.04

$ sudo add-apt-repository -y ppa:ondrej/php
$ sudo apt-get update
$ sudo apt-get install libopenblas-dev libatlas-base-dev liblapacke-dev php7.4-dev
$ phpize
$ ./configure
$ make test
$ sudo make install
$ echo 'extension=carray' | sudo tee /etc/php/7.4/cli/conf.d/20-carray.ini
$ echo 'extension=carray' | sudo tee /etc/php/7.4/fpm/conf.d/20-carray.ini
$ echo 'extension=carray' | sudo tee /etc/php/7.4/cgi/conf.d/20-carray.ini
$ echo 'extension=carray' | sudo tee /etc/php/7.4/apache2/conf.d/20-carray.ini

Ubuntu 16.04

$ add-apt-repository -y ppa:ondrej/php
$ apt-get update
$ apt-get install libblas-dev libatlas-base-dev liblapacke-dev php7.2-dev
$ phpize
$ ./configure
$ make test
$ make install

Ubuntu 14.04

$ add-apt-repository -y ppa:ondrej/php
$ apt-get update
$ apt-get install libopenblas-dev liblapacke-dev php7.2-dev
$ phpize
$ ./configure
$ make test
$ make install

Don't forget to check if the extension is enabled in your php.ini file.

Apache/NGINX Users: Don't forget to restart your services.

phpsci-carray's People

Contributors

fabiomontefuscolo avatar henrique-borba avatar lhsazevedo avatar sanmai 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

phpsci-carray's Issues

Manjaro install steps

Hi,

These are the install steps to enable it on my machine. Does it make sense to have in the README?

sudo pacman -S openblas lapacke cblas
phpize
./configure
make
make install
cat > /etc/php/conf.d/carray.ini <<EOF
extension=carray
EOF

Compilation error

Compiling on Ubuntu 20.04, I get the following error at the make test step:

/bin/bash /home/maestro/phpsci-carray/libtool --mode=compile cc  -I. -I/home/maestro/phpsci-carray -DPHP_ATOM_INC -I/home/maestro/phpsci-carray/include -I/home/maestro/phpsci-carray/main -I/home/maestro/phpsci-carray -I/usr/include/php/20200930 -I/usr/include/php/20200930/main -I/usr/include/php/20200930/TSRM -I/usr/include/php/20200930/Zend -I/usr/include/php/20200930/ext -I/usr/include/php/20200930/ext/date/lib -I/usr/include/  -DHAVE_CONFIG_H  -g -O2   -c /home/maestro/phpsci-carray/phpsci.c -o phpsci.lo 
libtool: compile:  cc -I. -I/home/maestro/phpsci-carray -DPHP_ATOM_INC -I/home/maestro/phpsci-carray/include -I/home/maestro/phpsci-carray/main -I/home/maestro/phpsci-carray -I/usr/include/php/20200930 -I/usr/include/php/20200930/main -I/usr/include/php/20200930/TSRM -I/usr/include/php/20200930/Zend -I/usr/include/php/20200930/ext -I/usr/include/php/20200930/ext/date/lib -I/usr/include/ -DHAVE_CONFIG_H -g -O2 -c /home/maestro/phpsci-carray/phpsci.c  -fPIC -DPIC -o .libs/phpsci.o
/home/maestro/phpsci-carray/phpsci.c: In function ‘ZVAL_TO_MEMORYPOINTER’:
/home/maestro/phpsci-carray/phpsci.c:111:76: warning: passing argument 2 of ‘zend_read_property’ from incompatible pointer type [-Wincompatible-pointer-types]
  111 | uid = (int)zval_get_long(zend_read_property(carray_sc_entry, obj, "uuid", sizeof("uuid") - 1, 1, &rv));
      |                                                              ^~~
      |                                                              |
      |                                                              zval * {aka struct _zval_struct *}

In file included from /usr/include/php/20200930/main/php.h:36,
                 from /home/maestro/phpsci-carray/phpsci.h:33,
                 from /home/maestro/phpsci-carray/phpsci.c:30:
/usr/include/php/20200930/Zend/zend_API.h:404:16: note: expected ‘zend_object *’ {aka ‘struct _zend_object *’} but argument is of type ‘zval *’ {aka ‘struct _zval_struct *’}
  404 | ZEND_API zval *zend_read_property(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, zend_bool silent, zval *rv);
      |                ^~~~~~~~~~~~~~~~~~
/home/maestro/phpsci-carray/phpsci.c: In function ‘MEMORYPOINTER_TO_ZVAL’:
/home/maestro/phpsci-carray/phpsci.c:184:48: warning: passing argument 2 of ‘zend_update_property_long’ from incompatible pointer type [-Wincompatible-pointer-types]
  184 |     zend_update_property_long(carray_sc_entry, a, "uuid", sizeof("uuid") - 1, ptr->uuid);
      |                                                ^
      |                                                |
      |                                                zval * {aka struct _zval_struct *}
In file included from /usr/include/php/20200930/main/php.h:36,
                 from /home/maestro/phpsci-carray/phpsci.h:33,
                 from /home/maestro/phpsci-carray/phpsci.c:30:
/usr/include/php/20200930/Zend/zend_API.h:387:79: note: expected ‘zend_object *’ {aka ‘struct _zend_object *’} but argument is of type ‘zval *’ {aka ‘struct _zval_struct *’}
  387 | d_update_property_long(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, zend_long value);
      |                                                 ~~~~~~~~~~~~~^~~~~~

/home/maestro/phpsci-carray/phpsci.c:185:48: warning: passing argument 2 of ‘zend_update_property_long’ from incompatible pointer type [-Wincompatible-pointer-types]
  185 |     zend_update_property_long(carray_sc_entry, a, "ndim", sizeof("ndim") - 1, arr->ndim);
      |                                                ^
      |                                                |
      |                                                zval * {aka struct _zval_struct *}
In file included from /usr/include/php/20200930/main/php.h:36,
                 from /home/maestro/phpsci-carray/phpsci.h:33,
                 from /home/maestro/phpsci-carray/phpsci.c:30:
/usr/include/php/20200930/Zend/zend_API.h:387:79: note: expected ‘zend_object *’ {aka ‘struct _zend_object *’} but argument is of type ‘zval *’ {aka ‘struct _zval_struct *’}
  387 | d_update_property_long(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, zend_long value);
      |                                                 ~~~~~~~~~~~~~^~~~~~

/home/maestro/phpsci-carray/phpsci.c: In function ‘RETURN_MEMORYPOINTER’:
/home/maestro/phpsci-carray/phpsci.c:200:48: warning: passing argument 2 of ‘zend_update_property_long’ from incompatible pointer type [-Wincompatible-pointer-types]
  200 |     zend_update_property_long(carray_sc_entry, return_value, "uuid", sizeof("uuid") - 1, ptr->uuid);
      |                                                ^~~~~~~~~~~~
      |                                                |
      |                                                zval * {aka struct _zval_struct *}
In file included from /usr/include/php/20200930/main/php.h:36,
                 from /home/maestro/phpsci-carray/phpsci.h:33,
                 from /home/maestro/phpsci-carray/phpsci.c:30:
/usr/include/php/20200930/Zend/zend_API.h:387:79: note: expected ‘zend_object *’ {aka ‘struct _zend_object *’} but argument is of type ‘zval *’ {aka ‘struct _zval_struct *’}
  387 | d_update_property_long(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, zend_long value);
      |                                                 ~~~~~~~~~~~~~^~~~~~

/home/maestro/phpsci-carray/phpsci.c:201:48: warning: passing argument 2 of ‘zend_update_property_long’ from incompatible pointer type [-Wincompatible-pointer-types]
  201 |     zend_update_property_long(carray_sc_entry, return_value, "ndim", sizeof("ndim") - 1, arr->ndim);
      |                                                ^~~~~~~~~~~~
      |                                                |
      |                                                zval * {aka struct _zval_struct *}
In file included from /usr/include/php/20200930/main/php.h:36,
                 from /home/maestro/phpsci-carray/phpsci.h:33,
                 from /home/maestro/phpsci-carray/phpsci.c:30:
/usr/include/php/20200930/Zend/zend_API.h:387:79: note: expected ‘zend_object *’ {aka ‘struct _zend_object *’} but argument is of type ‘zval *’ {aka ‘struct _zval_struct *’}
  387 | d_update_property_long(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, zend_long value);
      |                                                 ~~~~~~~~~~~~~^~~~~~

/home/maestro/phpsci-carray/phpsci.c: In function ‘RETURN_RUBIX_MEMORYPOINTER’:
/home/maestro/phpsci-carray/phpsci.c:209:48: warning: passing argument 2 of ‘zend_update_property_long’ from incompatible pointer type [-Wincompatible-pointer-types]
  209 |     zend_update_property_long(carray_sc_entry, return_value, "uuid", sizeof("uuid") - 1, ptr->uuid);
      |                                                ^~~~~~~~~~~~
      |                                                |
      |                                                zval * {aka struct _zval_struct *}
In file included from /usr/include/php/20200930/main/php.h:36,
                 from /home/maestro/phpsci-carray/phpsci.h:33,
                 from /home/maestro/phpsci-carray/phpsci.c:30:
/usr/include/php/20200930/Zend/zend_API.h:387:79: note: expected ‘zend_object *’ {aka ‘struct _zend_object *’} but argument is of type ‘zval *’ {aka ‘struct _zval_struct *’}
  387 | d_update_property_long(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, zend_long value);
      |                                                 ~~~~~~~~~~~~~^~~~~~

/home/maestro/phpsci-carray/phpsci.c:210:48: warning: passing argument 2 of ‘zend_update_property_long’ from incompatible pointer type [-Wincompatible-pointer-types]
  210 |     zend_update_property_long(carray_sc_entry, return_value, "ndim", sizeof("ndim") - 1, arr->ndim);
      |                                                ^~~~~~~~~~~~
      |                                                |
      |                                                zval * {aka struct _zval_struct *}
In file included from /usr/include/php/20200930/main/php.h:36,
                 from /home/maestro/phpsci-carray/phpsci.h:33,
                 from /home/maestro/phpsci-carray/phpsci.c:30:
/usr/include/php/20200930/Zend/zend_API.h:387:79: note: expected ‘zend_object *’ {aka ‘struct _zend_object *’} but argument is of type ‘zval *’ {aka ‘struct _zval_struct *’}
  387 | d_update_property_long(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, zend_long value);
      |                                                 ~~~~~~~~~~~~~^~~~~~

/home/maestro/phpsci-carray/phpsci.c: In function ‘zim_CArray___construct’:
/home/maestro/phpsci-carray/phpsci.c:252:48: warning: passing argument 2 of ‘zend_update_property_long’ from incompatible pointer type [-Wincompatible-pointer-types]
  252 |     zend_update_property_long(carray_sc_entry, obj, "uuid", sizeof("uuid") - 1, (int)ptr.uuid);
      |                                                ^~~
      |                                                |
      |                                                zval * {aka struct _zval_struct *}
In file included from /usr/include/php/20200930/main/php.h:36,
                 from /home/maestro/phpsci-carray/phpsci.h:33,
                 from /home/maestro/phpsci-carray/phpsci.c:30:
/usr/include/php/20200930/Zend/zend_API.h:387:79: note: expected ‘zend_object *’ {aka ‘struct _zend_object *’} but argument is of type ‘zval *’ {aka ‘struct _zval_struct *’}
  387 | d_update_property_long(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, zend_long value);
      |                                                 ~~~~~~~~~~~~~^~~~~~

/home/maestro/phpsci-carray/phpsci.c:253:48: warning: passing argument 2 of ‘zend_update_property_long’ from incompatible pointer type [-Wincompatible-pointer-types]
  253 |     zend_update_property_long(carray_sc_entry, obj, "ndim", sizeof("ndim") - 1, (int)arr->ndim);
      |                                                ^~~
      |                                                |
      |                                                zval * {aka struct _zval_struct *}
In file included from /usr/include/php/20200930/main/php.h:36,
                 from /home/maestro/phpsci-carray/phpsci.h:33,
                 from /home/maestro/phpsci-carray/phpsci.c:30:
/usr/include/php/20200930/Zend/zend_API.h:387:79: note: expected ‘zend_object *’ {aka ‘struct _zend_object *’} but argument is of type ‘zval *’ {aka ‘struct _zval_struct *’}
  387 | d_update_property_long(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, zend_long value);
      |                                                 ~~~~~~~~~~~~~^~~~~~

/home/maestro/phpsci-carray/phpsci.c: In function ‘zim_CArray___set’:
/usr/include/php/20200930/Zend/zend_API.h:413:73: warning: passing argument 2 of ‘zend_update_property_long’ from incompatible pointer type [-Wincompatible-pointer-types]
  413 | This()       ((Z_TYPE_P(ZEND_THIS) == IS_OBJECT) ? ZEND_THIS : NULL)
      |              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
      |                                                              |
      |                                                              zval * {aka struct _zval_struct *}

/home/maestro/phpsci-carray/phpsci.c:284:52: note: in expansion of macro ‘getThis’
  284 |         zend_update_property_long(carray_sc_entry, getThis(), "uuid", sizeof("uuid") - 1, zval_get_long(value));
      |                                                    ^~~~~~~
/usr/include/php/20200930/Zend/zend_API.h:387:79: note: expected ‘zend_object *’ {aka ‘struct _zend_object *’} but argument is of type ‘zval *’ {aka ‘struct _zval_struct *’}
  387 | d_update_property_long(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, zend_long value);
      |                                                 ~~~~~~~~~~~~~^~~~~~

/usr/include/php/20200930/Zend/zend_API.h:413:73: warning: passing argument 2 of ‘zend_update_property_long’ from incompatible pointer type [-Wincompatible-pointer-types]
  413 | This()       ((Z_TYPE_P(ZEND_THIS) == IS_OBJECT) ? ZEND_THIS : NULL)
      |              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
      |                                                              |
      |                                                              zval * {aka struct _zval_struct *}

/home/maestro/phpsci-carray/phpsci.c:288:52: note: in expansion of macro ‘getThis’
  288 |         zend_update_property_long(carray_sc_entry, getThis(), "ndim", sizeof("ndim") - 1, zval_get_long(value));
      |                                                    ^~~~~~~
/usr/include/php/20200930/Zend/zend_API.h:387:79: note: expected ‘zend_object *’ {aka ‘struct _zend_object *’} but argument is of type ‘zval *’ {aka ‘struct _zval_struct *’}
  387 | d_update_property_long(zend_class_entry *scope, zend_object *object, const char *name, size_t name_length, zend_long value);
      |                                                 ~~~~~~~~~~~~~^~~~~~

/home/maestro/phpsci-carray/phpsci.c: At top level:
/home/maestro/phpsci-carray/phpsci.c:3038:49: error: expected ‘;’, ‘,’ or ‘)’ before ‘TSRMLS_DC’
 3038 | int carray_compare(zval *object1, zval *object2 TSRMLS_DC) /* {{{ */
      |                                                 ^~~~~~~~~
/home/maestro/phpsci-carray/phpsci.c:3055:40: error: expected ‘;’, ‘,’ or ‘)’ before ‘TSRMLS_DC’
 3055 | carray_count(zval *object, long *count TSRMLS_DC) {
      |                                        ^~~~~~~~~
/home/maestro/phpsci-carray/phpsci.c: In function ‘zm_startup_carray’:
/home/maestro/phpsci-carray/phpsci.c:3113:27: error: ‘zend_object_handlers’ {aka ‘struct _zend_object_handlers’} has no member named ‘compare_objects’
 3113 |     carray_object_handlers.compare_objects = carray_compare;
      |                           ^
/home/maestro/phpsci-carray/phpsci.c:3113:46: error: ‘carray_compare’ undeclared (first use in this function); did you mean ‘carray_cast’?
 3113 |     carray_object_handlers.compare_objects = carray_compare;
      |                                              ^~~~~~~~~~~~~~
      |                                              carray_cast
/home/maestro/phpsci-carray/phpsci.c:3113:46: note: each undeclared identifier is reported only once for each function it appears in
/home/maestro/phpsci-carray/phpsci.c:3114:45: error: ‘carray_count’ undeclared (first use in this function); did you mean ‘carray_cast’?
 3114 |     carray_object_handlers.count_elements = carray_count;
      |                                             ^~~~~~~~~~~~
      |                                             carray_cast
make: *** [Makefile:194: phpsci.lo] Ошибка 1

I have installed the following php extensions:

sudo apt-get install libblas-dev libatlas-base-dev liblapacke-dev php7.2-dev

What am I doing wrong? Thanks in advance.

recipe for target 'kernel/common/cblas_funcs.lo' failed

Compiling on Ubuntu Xenial with Vagrant, I get the following error at the make test step:

/root/phpsci-carray-master/kernel/common/cblas_funcs.c:28:19: error: unknown type name ‘CBLAS_ORDER’
 gemm(int typenum, CBLAS_ORDER order,
                   ^
/root/phpsci-carray-master/kernel/common/cblas_funcs.c:29:6: error: unknown type name ‘CBLAS_TRANSPOSE’
      CBLAS_TRANSPOSE transA, CBLAS_TRANSPOSE transB,
      ^
/root/phpsci-carray-master/kernel/common/cblas_funcs.c:29:30: error: unknown type name ‘CBLAS_TRANSPOSE’
      CBLAS_TRANSPOSE transA, CBLAS_TRANSPOSE transB,
                              ^
/root/phpsci-carray-master/kernel/common/cblas_funcs.c:56:19: error: unknown type name ‘CBLAS_ORDER’
 syrk(int typenum, CBLAS_ORDER order, CBLAS_TRANSPOSE trans,
                   ^
/root/phpsci-carray-master/kernel/common/cblas_funcs.c:56:38: error: unknown type name ‘CBLAS_TRANSPOSE’
 syrk(int typenum, CBLAS_ORDER order, CBLAS_TRANSPOSE trans,
                                      ^
/root/phpsci-carray-master/kernel/common/cblas_funcs.c:144:19: error: unknown type name ‘CBLAS_ORDER’
 gemv(int typenum, CBLAS_ORDER order, CBLAS_TRANSPOSE trans,
                   ^
/root/phpsci-carray-master/kernel/common/cblas_funcs.c:144:38: error: unknown type name ‘CBLAS_TRANSPOSE’
 gemv(int typenum, CBLAS_ORDER order, CBLAS_TRANSPOSE trans,
                                      ^
/root/phpsci-carray-master/kernel/common/cblas_funcs.c: In function ‘cblas_matrixproduct’:
/root/phpsci-carray-master/kernel/common/cblas_funcs.c:420:9: error: unknown type name ‘CBLAS_ORDER’
         CBLAS_ORDER Order;
         ^
/root/phpsci-carray-master/kernel/common/cblas_funcs.c:443:9: warning: implicit declaration of function ‘gemv’ [-Wimplicit-function-declaration]
         gemv(typenum, Order, CblasNoTrans, ap1, lda, ap2, ap2s, out_buf);
         ^
/root/phpsci-carray-master/kernel/common/cblas_funcs.c:447:9: error: unknown type name ‘CBLAS_ORDER’
         CBLAS_ORDER Order;
         ^
/root/phpsci-carray-master/kernel/common/cblas_funcs.c:483:9: error: unknown type name ‘CBLAS_ORDER’
         CBLAS_ORDER Order;
         ^
/root/phpsci-carray-master/kernel/common/cblas_funcs.c:484:9: error: unknown type name ‘CBLAS_TRANSPOSE’
         CBLAS_TRANSPOSE Trans1, Trans2;
         ^
/root/phpsci-carray-master/kernel/common/cblas_funcs.c:547:17: warning: implicit declaration of function ‘syrk’ [-Wimplicit-function-declaration]
                 syrk(typenum, Order, Trans1, N, M, ap1, lda, out_buf);
                 ^
/root/phpsci-carray-master/kernel/common/cblas_funcs.c:554:13: warning: implicit declaration of function ‘gemm’ [-Wimplicit-function-declaration]
             gemm(typenum, Order, Trans1, Trans2, L, N, M, ap1, lda, ap2, ldb,
             ^
make: *** [kernel/common/cblas_funcs.lo] Error 1

I have installed the following php extensions:

sudo apt-get -y install apache2 php7.2 php7.2-mysql php7.2-mbstring php7.2-dom php7.2-sqlite php7.2-zip php7.2-curl php7.2-intl

sudo apt-get -y install curl composer zip unzip

root@ubuntu-xenial:~/phpsci-carray-master# lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 16.04.7 LTS
Release:	16.04
Codename:	xenial

What am I doing wrong? Thanks in advance.

Implement object serialization

A common use case for objects in PHP is serialization and deserialization so their properties can be stored and then reloaded into memory with their class definition. This ticket is to implement serialization in the C Array extension such that when passed as an argument to serialize() or embedded deeper in the object-property tree stemming from the root object that is passed to serialize() the C Array buffer will be saved along with the other properties.

Example

$data = serialize($carray);

$carray = unserialize($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.