Giter Site home page Giter Site logo

dune-melange's Introduction

dune-bs

This is a development setup to explore and experiment around the integration of Dune with Melange bsc compilation tool.

For more context, see: ocaml/dune#140.

Setup

You need Esy, you can install the beta using npm:

npm install -g esy

NOTE: Make sure esy --version returns at least 0.6.8 for this project to build.

Then run the esy command from this project root to install and build dependencies.

esy

Getting started

To keep an incremental approach, the first thing that we're attempting to do is to build an .ml file written for BuckleScript with Dune.

After running esy to download dependencies and build them, run

esy step1

Which will build bin/Hello.ml with dune and bsc (still wip).

We will add more steps with more complex cases over time (with Reason syntax, with ppx, with libraries...).

Local development flow

To develop locally, clone dune repository:

git clone https://github.com/jchavarri/dune
git checkout dune-bs

and add a resolution to this project package.json like:

  "resolutions": {
-   "@opam/dune": "jchavarri/dune:dune.opam#d29d5f4"
+   "@opam/dune": "link:../path/to/dune/dune.opam"
  }

dune-melange's People

Contributors

jchavarri avatar

Stargazers

 avatar Alain Armand avatar Andrey Kirichenko avatar Bartosz Gościński avatar  avatar

Watchers

Andrey Popp avatar  avatar  avatar

dune-melange's Issues

illegal option -- t

Greeting, sir.

I just tried running this and go the following error message.

Command [10] exited with code 64:
$ (cd _build/default && /bin/cp -t bin/main.cma bin/.main.objs/byte/main.cmj bin/.main.objs/byte/main__Multiply.cmj bin/.main.objs/byte/main__Add.cmj bin/.main.objs/byte/main__Hello.cmj)
/bin/cp: illegal option -- t
usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvXc] source_file target_file
       cp [-R [-H | -L | -P]] [-fi | -n] [-apvXc] source_file ... target_directory
Full Output ```sh mando@mandalarian ~/G/dune-melange (master)> esy info esy 0.6.10 (using package.json) info fetching: done info installing: done info building @opam/dune@github:jchavarri/dune:dune.opam#bcd08cd@d41d8cd9 info building @opam/dune@github:jchavarri/dune:dune.opam#bcd08cd@d41d8cd9: done info building @opam/result@opam:1.5@6b753c82 info building @opam/dune-build-info@opam:2.8.5@1dae72be info building @opam/pp@opam:1.1.2@5f58dd25 info building @opam/menhirLib@opam:20210419@0b3db8d0 info building @opam/easy-format@opam:1.3.2@0484b3c4 info building @opam/csexp@opam:1.5.1@f2f16ef6 info building @opam/cppo@opam:1.6.7@c28ac3ae info building @opam/menhirSdk@opam:20210419@9c7661a4 info building @opam/pp@opam:1.1.2@5f58dd25: done info building @opam/dune-private-libs@opam:2.8.5@9742c61c info building @opam/result@opam:1.5@6b753c82: done info building @opam/ppx_derivers@opam:1.2.1@ecf0aa45 info building @opam/csexp@opam:1.5.1@f2f16ef6: done info building @opam/fix@opam:20201120@0b212fb9 info building @opam/easy-format@opam:1.3.2@0484b3c4: done info building @opam/biniou@opam:1.2.1@d7570399 info building @opam/menhirSdk@opam:20210419@9c7661a4: done info building @opam/ppx_derivers@opam:1.2.1@ecf0aa45: done info building @opam/menhirLib@opam:20210419@0b3db8d0: done info building @opam/menhir@opam:20210419@11c42419 info building @opam/cppo@opam:1.6.7@c28ac3ae: done info building @opam/merlin-extend@opam:0.6@88755c91 info building @opam/dune-build-info@opam:2.8.5@1dae72be: done info building @opam/biniou@opam:1.2.1@d7570399: done info building @opam/yojson@opam:1.7.0@7056d985 info building @opam/fix@opam:20201120@0b212fb9: done info building @opam/merlin-extend@opam:0.6@88755c91: done info building @opam/yojson@opam:1.7.0@7056d985: done info building @opam/dot-merlin-reader@opam:4.1@120afa42 info building @opam/ppx_yojson_conv_lib@opam:v0.14.0@116b53d6 info building @opam/ppx_yojson_conv_lib@opam:v0.14.0@116b53d6: done info building @opam/dot-merlin-reader@opam:4.1@120afa42: done info building @opam/ocaml-lsp-server@opam:1.6.1@7a845a2b info building @opam/dune-private-libs@opam:2.8.5@9742c61c: done info building @opam/dune-glob@opam:2.8.5@305f0bf1 info building @opam/dune-glob@opam:2.8.5@305f0bf1: done info building @opam/dune-action-plugin@opam:2.8.5@7512542d info building @opam/dune-action-plugin@opam:2.8.5@7512542d: done info building @opam/menhir@opam:20210419@11c42419: done info building @opam/reason@opam:3.7.0@494dd52d info building @opam/melange-compiler-libs@github:melange-re/melange-compiler-libs:melange-compiler-libs.opam#c787d2f98a@d41d8cd9 info building @opam/ocaml-lsp-server@opam:1.6.1@7a845a2b: done info building @opam/melange-compiler-libs@github:melange-re/melange-compiler-libs:melange-compiler-libs.opam#c787d2f98a@d41d8cd9: done info building @opam/reason@opam:3.7.0@494dd52d: done info building melange@github:melange-re/melange#415ff6390044b12c920be8bb049053ea6b2c257a@d41d8cd9 info building melange@github:melange-re/melange#415ff6390044b12c920be8bb049053ea6b2c257a@d41d8cd9: done mando@mandalarian ~/G/dune-melange (master)> esy step1 Workspace root: /Users/mando/Github/dune-melange Auto-detected concurrency: 8 Running[0]: /Users/mando/.esy/3__________________________________________________________________/i/ocaml-4.12.0-44d44425/bin/ocamlc.opt -config > /var/folders/jk/x59dhv6s7151k4mfmshf6v480000gn/T/dune_40f28d_output Dune context: { name = "default" ; kind = "default" ; profile = Release ; merlin = true ; for_host = None ; fdo_target_exe = None ; build_dir = "default" ; toplevel_path = Some External "/Users/mando/.esy/3__________________________________________________________________/i/ocaml-4.12.0-44d44425/lib/ocaml" ; ocaml_bin = External "/Users/mando/.esy/3__________________________________________________________________/i/ocaml-4.12.0-44d44425/bin" ; ocaml = Ok External "/Users/mando/.esy/3__________________________________________________________________/i/ocaml-4.12.0-44d44425/bin/ocaml" ; ocamlc = External "/Users/mando/.esy/3__________________________________________________________________/i/ocaml-4.12.0-44d44425/bin/ocamlc.opt" ; bsc = Some External "/Users/mando/.esy/3__________________________________________________________________/i/melange-9a32db89/bin/bsc" ; ocamlopt = Ok External "/Users/mando/.esy/3__________________________________________________________________/i/ocaml-4.12.0-44d44425/bin/ocamlopt.opt" ; ocamldep = Ok External "/Users/mando/.esy/3__________________________________________________________________/i/ocaml-4.12.0-44d44425/bin/ocamldep.opt" ; ocamlmklib = Ok External "/Users/mando/.esy/3__________________________________________________________________/i/ocaml-4.12.0-44d44425/bin/ocamlmklib.opt" ; env = map { "DUNE_OCAML_HARDCODED" : "/Users/mando/.opam/4.12.0/lib" ; "DUNE_OCAML_STDLIB" : "/Users/mando/.esy/3__________________________________________________________________/i/ocaml-4.12.0-44d44425/lib/ocaml" ; "DUNE_SOURCEROOT" : "/Users/mando/Github/dune-melange" ; "INSIDE_DUNE" : "/Users/mando/Github/dune-melange/_build/default" ; "MANPATH" : "/Users/mando/Github/dune-melange/_build/install/default/bin" ; "OCAMLFIND_IGNORE_DUPS_IN" : "/Users/mando/Github/dune-melange/_build/install/default/lib" ; "OCAMLTOP_INCLUDE_PATH" : "/Users/mando/Github/dune-melange/_build/install/default/lib/toplevel" ; "OCAML_COLOR" : "always" ; "OPAMCOLOR" : "always" } ; findlib_path = [ External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__ocaml_lsp_server-opam__c__1.6.1-901ca2e5/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/melange-9a32db89/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/ocaml-4.12.0-44d44425/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/esy_ocaml__s__substs-0.0.1-dcea4195/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__csexp-opam__c__1.5.1-33654d76/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__dot_merlin_reader-opam__c__4.1-b66a05ee/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__dune-c49d648a/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__dune_build_info-opam__c__2.8.5-a07209bb/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__pp-opam__c__1.1.2-5a5a35bc/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__ppx__yojson__conv__lib-opam__c__v0.14.0-6405e35b/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__result-opam__c__1.5-c98a3a3a/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__yojson-opam__c__1.7.0-676498fc/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__cmdliner-opam__c__1.0.4-d6ac50f9/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__dune_action_plugin-opam__c__2.8.5-d085d43c/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__melange_compiler_libs-e6b4b29b/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__reason-opam__c__3.7.0-3df1aceb/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__ocamlfind-opam__c__1.9.1-45972748/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__base_threads-opam__c__base-beddf47d/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__base_unix-opam__c__base-b5812a5c/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__biniou-opam__c__1.2.1-0e1cb61b/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__cppo-opam__c__1.6.7-839707e6/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__easy_format-opam__c__1.3.2-0ec00b96/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__dune_glob-opam__c__2.8.5-332c666a/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__dune_private_libs-opam__c__2.8.5-c6fdf427/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__menhir-opam__c__20210419-7beb50a2/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__fix-opam__c__20201120-11318d74/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__merlin_extend-opam__c__0.6-ba5c7268/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__ppx__derivers-opam__c__1.2.1-70e6cc5f/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__menhirlib-opam__c__20210419-063e2919/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__menhirsdk-opam__c__20210419-4b3780f9/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__ocaml_lsp_server-opam__c__1.6.1-901ca2e5/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/melange-9a32db89/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/ocaml-4.12.0-44d44425/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/esy_ocaml__s__substs-0.0.1-dcea4195/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__csexp-opam__c__1.5.1-33654d76/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__dot_merlin_reader-opam__c__4.1-b66a05ee/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__dune-c49d648a/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__dune_build_info-opam__c__2.8.5-a07209bb/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__pp-opam__c__1.1.2-5a5a35bc/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__ppx__yojson__conv__lib-opam__c__v0.14.0-6405e35b/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__result-opam__c__1.5-c98a3a3a/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__yojson-opam__c__1.7.0-676498fc/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__cmdliner-opam__c__1.0.4-d6ac50f9/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__dune_action_plugin-opam__c__2.8.5-d085d43c/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__melange_compiler_libs-e6b4b29b/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__reason-opam__c__3.7.0-3df1aceb/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__ocamlfind-opam__c__1.9.1-45972748/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__base_threads-opam__c__base-beddf47d/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__base_unix-opam__c__base-b5812a5c/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__biniou-opam__c__1.2.1-0e1cb61b/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__cppo-opam__c__1.6.7-839707e6/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__easy_format-opam__c__1.3.2-0ec00b96/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__dune_glob-opam__c__2.8.5-332c666a/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__dune_private_libs-opam__c__2.8.5-c6fdf427/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__menhir-opam__c__20210419-7beb50a2/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__fix-opam__c__20201120-11318d74/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__merlin_extend-opam__c__0.6-ba5c7268/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__ppx__derivers-opam__c__1.2.1-70e6cc5f/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__menhirlib-opam__c__20210419-063e2919/lib" ; External "/Users/mando/.esy/3__________________________________________________________________/i/opam__s__menhirsdk-opam__c__20210419-4b3780f9/lib" ; External "/Users/mando/.fnm/node-versions/v14.16.0/installation/lib/node_modules/esy/3/i/esy-8d15006d/lib" ; External "/Users/mando/.opam/4.12.0/lib" ] ; arch_sixtyfour = true ; natdynlink_supported = true ; supports_shared_libraries = true ; ocaml_config = { version = "4.12.0" ; standard_library_default = "/Users/mando/.esy/3__________________________________________________________________/i/ocaml-4.12.0-44d44425/lib/ocaml" ; standard_library = "/Users/mando/.esy/3__________________________________________________________________/i/ocaml-4.12.0-44d44425/lib/ocaml" ; standard_runtime = "the_standard_runtime_variable_was_deleted" ; ccomp_type = "cc" ; c_compiler = "gcc" ; ocamlc_cflags = [ "-O2"; "-fno-strict-aliasing"; "-fwrapv" ] ; ocamlc_cppflags = [ "-D_FILE_OFFSET_BITS=64"; "-D_REENTRANT" ] ; ocamlopt_cflags = [ "-O2"; "-fno-strict-aliasing"; "-fwrapv" ] ; ocamlopt_cppflags = [ "-D_FILE_OFFSET_BITS=64"; "-D_REENTRANT" ] ; bytecomp_c_compiler = [ "gcc" ; "-O2" ; "-fno-strict-aliasing" ; "-fwrapv" ; "-D_FILE_OFFSET_BITS=64" ; "-D_REENTRANT" ] ; bytecomp_c_libraries = [ "-lm"; "-lpthread" ] ; native_c_compiler = [ "gcc" ; "-O2" ; "-fno-strict-aliasing" ; "-fwrapv" ; "-D_FILE_OFFSET_BITS=64" ; "-D_REENTRANT" ] ; native_c_libraries = [ "-lm" ] ; cc_profile = [] ; architecture = "amd64" ; model = "default" ; int_size = 63 ; word_size = 64 ; system = "macosx" ; asm = [ "clang"; "-arch"; "x86_64"; "-Wno-trigraphs"; "-c" ] ; asm_cfi_supported = false ; with_frame_pointers = false ; ext_exe = "" ; ext_obj = ".o" ; ext_asm = ".s" ; ext_lib = ".a" ; ext_dll = ".so" ; os_type = "Unix" ; default_executable_name = "a.out" ; systhread_supported = true ; host = "x86_64-apple-darwin20.4.0" ; target = "x86_64-apple-darwin20.4.0" ; profiling = false ; flambda = false ; spacetime = false ; safe_string = true ; exec_magic_number = "Caml1999X029" ; cmi_magic_number = "Caml1999I029" ; cmo_magic_number = "Caml1999O029" ; cma_magic_number = "Caml1999A029" ; cmx_magic_number = "Caml1999Y029" ; cmxa_magic_number = "Caml1999Z029" ; ast_impl_magic_number = "Caml1999M029" ; ast_intf_magic_number = "Caml1999N029" ; cmxs_magic_number = "Caml1999D029" ; cmt_magic_number = "Caml1999T029" ; natdynlink_supported = true ; supports_shared_libraries = true ; windows_unicode = false } } Actual targets: - recursive alias @install Running[1]: (cd _build/default && /Users/mando/.esy/3__________________________________________________________________/i/melange-9a32db89/bin/bsc -bin-annot -I bin/.main.objs/byte -no-alias-deps -bs-package-name bs-dummy-pkg-name -bs-package-output es6:bin:.bs.js -o bin/.main.objs/byte/main.cmj -c bin/main.ml-gen.ml) Running[2]: (cd _build/default && /Users/mando/.esy/3__________________________________________________________________/i/opam__s__reason-opam__c__3.7.0-3df1aceb/bin/refmt --print binary bin/Add.re) > _build/default/bin/Add.re.ml Running[3]: (cd _build/default && /Users/mando/.esy/3__________________________________________________________________/i/ocaml-4.12.0-44d44425/bin/ocamldep.opt -modules -impl bin/Hello.ml) > _build/default/bin/.main.objs/Hello.ml.d Running[4]: (cd _build/default && /Users/mando/.esy/3__________________________________________________________________/i/ocaml-4.12.0-44d44425/bin/ocamldep.opt -modules -impl bin/Multiply.ml) > _build/default/bin/.main.objs/Multiply.ml.d Running[5]: (cd _build/default && /Users/mando/.esy/3__________________________________________________________________/i/ocaml-4.12.0-44d44425/bin/ocamldep.opt -modules -impl bin/Add.re.ml) > _build/default/bin/.main.objs/Add.re.ml.d Output[1]: File "bin/main.ml-gen.ml", line 2, characters 13-22: 2 | module Add = Main__Add ^^^^^^^^^ Warning 49 [no-cmi-file]: no cmi file was found in path for module Main__Add File "bin/main.ml-gen.ml", line 6, characters 15-26: 6 | module Hello = Main__Hello ^^^^^^^^^^^ Warning 49 [no-cmi-file]: no cmi file was found in path for module Main__Hello File "bin/main.ml-gen.ml", line 10, characters 18-32: 10 | module Multiply = Main__Multiply ^^^^^^^^^^^^^^ Warning 49 [no-cmi-file]: no cmi file was found in path for module Main__Multiply Running[6]: (cd _build/default && /Users/mando/.esy/3__________________________________________________________________/i/melange-9a32db89/bin/bsc -bin-annot -I bin/.main.objs/byte -no-alias-deps -bs-package-name bs-dummy-pkg-name -bs-package-output es6:bin:.bs.js -open Main -o bin/.main.objs/byte/main__Multiply.cmj -c bin/Multiply.ml) Running[7]: (cd _build/default && /Users/mando/.esy/3__________________________________________________________________/i/melange-9a32db89/bin/bsc -bin-annot -I bin/.main.objs/byte -no-alias-deps -bs-package-name bs-dummy-pkg-name -bs-package-output es6:bin:.bs.js -open Main -o bin/.main.objs/byte/main__Add.cmj -c bin/Add.re.ml) Running[8]: (cd _build/default && /Users/mando/.esy/3__________________________________________________________________/i/melange-9a32db89/bin/bsc -bin-annot -I bin/.main.objs/byte -no-alias-deps -bs-package-name bs-dummy-pkg-name -bs-package-output es6:bin:.bs.js -open Main -o bin/.main.objs/byte/main__Hello.cmj -c bin/Hello.ml) Running[9]: (cd _build/default && /bin/mkdir bin/main.cma) Running[10]: (cd _build/default && /bin/cp -t bin/main.cma bin/.main.objs/byte/main.cmj bin/.main.objs/byte/main__Multiply.cmj bin/.main.objs/byte/main__Add.cmj bin/.main.objs/byte/main__Hello.cmj) File "bin/dune", line 1, characters 0-62: 1 | (library 2 | (name main) 3 | (modes byte) 4 | (public_name dune-bs)) Command [10] exited with code 64: $ (cd _build/default && /bin/cp -t bin/main.cma bin/.main.objs/byte/main.cmj bin/.main.objs/byte/main__Multiply.cmj bin/.main.objs/byte/main__Add.cmj bin/.main.objs/byte/main__Hello.cmj) /bin/cp: illegal option -- t usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvXc] source_file target_file cp [-R [-H | -L | -P]] [-fi | -n] [-apvXc] source_file ... target_directory mando@mandalarian ~/G/dune-melange (master) [1]> ```

Any ideas? Thank you.

Use trunk bs-platform and build bsc with esy

Right now the project uses a slightly modified version of bs-platform package without esy files, which allows to use the prebuilt binaries (in particular, bsc) from Dune.

@ulrikstrid mentioned in Discord it should be possible to use something like:

esy @bsc build

and still keep different versions of OCaml (4.06 for BS, 4.08 for Dune). Would be awesome if we could build bs-platform from source so that the dependency can point to the original bs-platform package and not the forked one.

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.