rocker-org / binder Goto Github PK
View Code? Open in Web Editor NEWTemplate for RStudio on Binder / JupyterHub
License: GNU General Public License v2.0
Template for RStudio on Binder / JupyterHub
License: GNU General Public License v2.0
@yuvipanda @brooksambrose @choldgraf
How would you feel about bumping the base image FROM rocker/tidyverse
to instead start with FROM rocker/geospatial
? Obviously we cannot overcome everyone's system dependencies by pre-installing everything, but from our experience so far, an image like verse
or geospatial
(which builds on verse
) and has a pretty common set of core system libraries to the point where most commonly used R packages at least in the data science space should install out of the box, while still maintaining a relatively small image.
As we discover / are discovered by more communities this may grow/bifurcate, obviously it isn't an easy problem to provide preconfigured environment and ultimately there's no substitute for users/communities being able to just install what they need when they need it. But from our experience in Rocker Project so far, I think our community-shaped stacks like verse
or geospatial
would make a good starting point
Thank you for providing this (and all the other rocker
) image(s)!
I wondered why the binder
image is build on top of geospatial
and not on tidyverse
or verse
as, from my perspective, adding the possibility to use Binder
is a more fundamental feature that might be important to everybody interested in reproducibility, but not necessarily in geospatial analysis tools. Furthermore, the geospatial tools add quite a bit of image size.
One can obviously just copy the code from the binder
Dockerfile and add it to a project's Dockerfile. It just adds a lot of code that might distract from the adjustments that are specific to the project at hand.
R 3.3.x versions are based on debian:jessie
, these builds seem to be failing on hub. cc @yuvipanda .
I used the template to create a binder repository
https://github.com/lsaravia/binder-rethinking
in the Install.R file
install.packages(c("StanHeaders","rstan"),type="source")
or
install.packages("rstan", repos = c("https://mc-stan.org/r-packages/", getOption("repos")))
in both cases the package seems to be well installed but when I test the installation using:
example(stan_model, package = "rstan", run.dontrun = TRUE)
Loading required package: StanHeaders
rstan version 2.26.13 (Stan version 2.26.1)
For execution on a local, multicore CPU with excess RAM we recommend calling
options(mc.cores = parallel::detectCores()).
To avoid recompilation of unchanged Stan programs, we recommend calling
rstan_options(auto_write = TRUE)
For within-chain threading using `reduce_sum()` or `map_rect()` Stan functions,
change `threads_per_chain` option:
rstan_options(threads_per_chain = 1)
make cmd is
make -f '/usr/local/lib/R/etc/Makeconf' -f '/usr/local/lib/R/share/make/shlib.mk' CXX='$(CXX14) $(CXX14STD)' CXXFLAGS='$(CXX14FLAGS)' CXXPICFLAGS='$(CXX14PICFLAGS)' SHLIB_LDFLAGS='$(SHLIB_CXX14LDFLAGS)' SHLIB_LD='$(SHLIB_CXX14LD)' SHLIB='file273f221760.so' OBJECTS='file273f221760.o'
.
.
.
make would use
g++ -std=gnu++14 -I"/usr/local/lib/R/include" -DNDEBUG -I"/usr/local/lib/R/site-library/Rcpp/include/" -I"/usr/local/lib/R/site-library/RcppEigen/include/" -I"/usr/local/lib/R/site-library/RcppEigen/include/unsupported" -I"/usr/local/lib/R/site-library/BH/include" -I"/usr/local/lib/R/site-library/StanHeaders/include/src/" -I"/usr/local/lib/R/site-library/StanHeaders/include/" -I"/usr/local/lib/R/site-library/RcppParallel/include/" -I"/usr/local/lib/R/site-library/rstan/include" -DEIGEN_NO_DEBUG -DBOOST_DISABLE_ASSERTS -DBOOST_PENDING_INTEGER_LOG2_HPP -DSTAN_THREADS -DUSE_STANC3 -DSTRICT_R_HEADERS -DBOOST_PHOENIX_NO_VARIADIC_EXPRESSION -DBOOST_NO_AUTO_PTR -include '/usr/local/lib/R/site-library/StanHeaders/include/stan/math/prim/fun/Eigen.hpp' -D_REENTRANT -DRCPP_PARALLEL_USE_TBB=1 -I/usr/local/include -fpic -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c file273f221760.cpp -o file273f221760.o
if test "zfile273f221760.o" != "z"; then \
echo g++ -std=gnu++14 -shared -L"/usr/local/lib/R/lib" -L/usr/local/lib -o file273f221760.so file273f221760.o '/usr/local/lib/R/site-library/rstan/lib//libStanServices.a' -L'/usr/local/lib/R/site-library/StanHeaders/lib/' -lStanHeaders -L'/usr/local/lib/R/site-library/RcppParallel/lib/' -ltbb -L"/usr/local/lib/R/lib" -lR; \
g++ -std=gnu++14 -shared -L"/usr/local/lib/R/lib" -L/usr/local/lib -o file273f221760.so file273f221760.o '/usr/local/lib/R/site-library/rstan/lib//libStanServices.a' -L'/usr/local/lib/R/site-library/StanHeaders/lib/' -lStanHeaders -L'/usr/local/lib/R/site-library/RcppParallel/lib/' -ltbb -L"/usr/local/lib/R/lib" -lR; \
fi
Here binder virtual machine hangs
A similar thing happens when I also install cmdstanr
I think that could be the same problem.
@yuvipanda Following up re your suggestion in #10 : the rocker container actually already has a script to add shiny, it just isn't run by default.
adding the following RUN command:
RUN export ADD=shiny && bash /etc/cont-init.d/add
to this Dockerfile will trigger this script. Seems reasonable to add this in.
Using the Dockerfile in the binder-examples/dockerfile-rstudio repo and changing the R version from 3.4.2 to 3.4.3 does not work.
Hello!
I am creating an environment for R with a Dockerfile like this one:
FROM rocker/binder:3.5.2
ARG NB_USER
ARG NB_UID
USER root
COPY . ${HOME}
RUN chown -R ${NB_USER} ${HOME}
USER ${NB_USER}
RUN if [ -f install.R ]; then R --quiet -f install.R; fi
Also, I have installed this packages with an install.R file:
install.packages("tidyverse")
install.packages("rsample")
install.packages("yardstick")
install.packages("randomForest")
install.packages("caret")
install.packages("rjson")
install.packages("gbm")
install.packages("xgboost")
install.packages("e1071")
runtime.txt
r-2019-08-10
The packages seem to work fine, with the exception of rsamples
and caret
package. Both packages are not found when I run the code.
I tried several things to solve this but all without success. I suspect it is a problem with dependencies or package versions.
Have you any idea on why this happens and how to solve it?
Not sure where this bug report (jupyterhub/jupyter-rsession-proxy#92) should be posted at best, so cross-posting here as it seems to be rocker-binder's home.
Sorry if this is bad practice (feel free to close/delete the least appropriate issues in this case) and thank you in advance for your help!
Currently in RStudio on Binder the command servr::httd()
, which should serve a webpage in the RStudio Server viewer pane, is giving:
/p/4321/?viewer_pane=1 not found
I think this it may have been possible to open an arbitrary port before #13 when nbserverproxy
was removed.
https://mybinder.org/v2/gh/rocker-org/binder/master?urlpath=lab
This was working as recently as two days ago. Today I get a 404 error when trying to launch jupyter lab
(i.e. with query urlpath=lab
, see link above). No error in the build logs preceding being redirected to the jupyter lab landing page.
The notebook interface is working fine.
I had problems running Docker containers that use FROM: rocker/binder:3.5.0
on mybinder.org. The interactive RStudio session wouldn't open and report "500 : Internal Server Error". Interestingly, the same images used to run at the end of last week.
With the help of @betatim (see jupyterhub/binderhub#753), I figured out that if I use another rocker image and add the code from the rocker/binder Dockerfile to my own Dockerfile, the container runs successfully on mybinder.org again. Apparently, when using FROM: rocker/binder
, an older version of nbrsessionproxy
is installed that still has a bug that leads to the aforementioned error.
As there has been one commit to the rocker/binder repo that falls in between the image working and not working, I assume that this commit is at the core of the issue.
I made two repos for you to check for yourself:
https://github.com/januz/binder-fails
https://github.com/januz/binder-works
Just tried this and didn't seem to work: https://mybinder.org/v2/gh/rocker-org/binder/master?urlpath=rstudio
I see that rocker/geospatial
has an :unstable
tag. Based on the discussion over here I was hoping that we might be able to get a rocker/binder:unstable
build based on rocker/geospatial:unstable
in order to get the newer GDAL to test out
Thoughts?
With the latest build, after launching at:
localhost:8888 and clicking new Rstudio, this error appears, dated Nov. 28, 2020; with a pull directly from
docker pull rocker/binder:latest
500 : Internal Server Error
The error was:
could not start rstudio in time
Full error tracelog below:
docker inspect rocker/binder:latest
[
{
"Id": "sha256:b3091f942607e821796b38230cc6fead9afc33e1ffc3df0d75e005e584a383df",
"RepoTags": [
"rocker/binder:latest"
],
"RepoDigests": [
"rocker/binder@sha256:c2fcea20617a062c2a1db0de434d2f37190173f6378762533934fc3d3ff8b858"
],
"Parent": "",
"Comment": "",
"Created": "2020-11-13T06:29:02.44101713Z",
"Container": "da1be7643d29021b1c00ed276667f3976ab5f163e79944a77eb734590989d062",
"ContainerConfig": {
"Hostname": "da1be7643d29",
"Domainname": "",
"User": "rstudio",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"8787/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/texlive/bin/x86_64-linux:/usr/lib/rstudio-server/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"R_VERSION=4.0.3",
"TERM=xterm",
"LC_ALL=en_US.UTF-8",
"LANG=en_US.UTF-8",
"R_HOME=/usr/local/lib/R",
"CRAN=https://packagemanager.rstudio.com/all/__linux__/focal/latest",
"TZ=Etc/UTC",
"S6_VERSION=v2.1.0.2",
"RSTUDIO_VERSION=latest",
"CTAN_REPO=http://mirror.ctan.org/systems/texlive/tlnet",
"NB_USER=rstudio"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) WORKDIR /home/rstudio"
],
"Image": "sha256:8fcaaa2a0f201e962f7958141edffdaa923849143ac8518d95fb274b7d25bbac",
"Volumes": null,
"WorkingDir": "/home/rstudio",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"maintainer": "Carl Boettiger <[email protected]>",
"org.label-schema.license": "GPL-2.0",
"org.label-schema.vcs-url": "https://github.com/rocker-org/rocker-versioned",
"org.label-schema.vendor": "Rocker Project"
}
},
"DockerVersion": "19.03.1",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "rstudio",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"8787/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/texlive/bin/x86_64-linux:/usr/lib/rstudio-server/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"R_VERSION=4.0.3",
"TERM=xterm",
"LC_ALL=en_US.UTF-8",
"LANG=en_US.UTF-8",
"R_HOME=/usr/local/lib/R",
"CRAN=https://packagemanager.rstudio.com/all/__linux__/focal/latest",
"TZ=Etc/UTC",
"S6_VERSION=v2.1.0.2",
"RSTUDIO_VERSION=latest",
"CTAN_REPO=http://mirror.ctan.org/systems/texlive/tlnet",
"NB_USER=rstudio"
],
"Cmd": [
"/bin/sh",
"-c",
"jupyter notebook --ip 0.0.0.0"
],
"Image": "sha256:8fcaaa2a0f201e962f7958141edffdaa923849143ac8518d95fb274b7d25bbac",
"Volumes": null,
"WorkingDir": "/home/rstudio",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"maintainer": "Carl Boettiger <[email protected]>",
"org.label-schema.license": "GPL-2.0",
"org.label-schema.vcs-url": "https://github.com/rocker-org/rocker-versioned",
"org.label-schema.vendor": "Rocker Project"
}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 5715688324,
"VirtualSize": 5715688324,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/29d7c1781e7b6c9a960d4f82f3fcc85bada2d4f23f2cfd90c44cb0c89ef55699/diff:/var/lib/docker/overlay2/c5a6c14922b0d5aec4ff7b6d1f175a0f7c1e579cc9ac41cfab9e8095771b7136/diff:/var/lib/docker/overlay2/78617e6c4b83e5b22526eadaa74faee59ce66ea6fff4d0a1bb66c32cfc732918/diff:/var/lib/docker/overlay2/71afb1dbedcc59c4d0828e9ad56d5402145be448c0c021b912901a2e24ba51d9/diff:/var/lib/docker/overlay2/476c24571e5665e56163b82ff65a6d7565c727d5eedd9ba72446f8f8827b0007/diff:/var/lib/docker/overlay2/9da9b7fe3464448388d4b060b0974dd47ff5ab938306204c0319a850ed46f779/diff:/var/lib/docker/overlay2/6bc1498c02413ab12ec235cbd5336f9b8b7427f7294410d5c6fab370663a1f41/diff:/var/lib/docker/overlay2/c428715708d2f9f27ac5a798cd6ca385ca6ed87ad3155774b9868fbd46235ff6/diff:/var/lib/docker/overlay2/6c088db8e08632cc9b03087ec12b40b1d7f83c8372a528e3509a876134c94e5a/diff:/var/lib/docker/overlay2/8e9466e9d8a95751e8d710ade0b9e8ee34adad122b789a7e3c40df4322884b72/diff:/var/lib/docker/overlay2/689021e994a162cfe869516cafed69585ad333c5ccff5e4de36203f6ae5d27b8/diff:/var/lib/docker/overlay2/e31702f87d55196329a3617e8480172ba43a396e472c50946da577224ad58552/diff",
"MergedDir": "/var/lib/docker/overlay2/8ad7b483bc37f523e0d612d0ae47289f720442a4bacf5e1bde63709102f398b7/merged",
"UpperDir": "/var/lib/docker/overlay2/8ad7b483bc37f523e0d612d0ae47289f720442a4bacf5e1bde63709102f398b7/diff",
"WorkDir": "/var/lib/docker/overlay2/8ad7b483bc37f523e0d612d0ae47289f720442a4bacf5e1bde63709102f398b7/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:e1c75a5e0bfa094c407e411eb6cc8a159ee8b060cbd0398f1693978b4af9af10",
"sha256:9e97312b63ff63ad98bb1f3f688fdff0721ce5111e7475b02ab652f10a4ff97d",
"sha256:ec1817c93e7c08d27bfee063f0f1349185a558b87b2d806768af0a8fbbf5bc11",
"sha256:05f3b67ed530c5b55f6140dfcdfb9746cdae7b76600de13275197d009086bb3d",
"sha256:eae5f69ee969bff0d5efe88f1ad959c70950e753047446bc7504b70610e95d95",
"sha256:24eab26fd630a3793b8c355e49012640db0649ea6631d8275e7535476d5dea73",
"sha256:c2d92965ff0cebee849714853668b78f0b39216841682edcc75216121719b727",
"sha256:cf81c78d35f99d7be655682b3d045211400c093dd812a8f085c08f645e892078",
"sha256:949275ddbb9ecbd1811ac3f5347df0efa3b44c257fda0c23762e2a8d641f215a",
"sha256:7e6741743dfc977dfaf36b42c6c30c7d8701297bd94a5b918f9a97e6e7439c1b",
"sha256:88e3d41cf349c67d4bb221df39c73ed6846877cb301c817eae6e7408c667fa2f",
"sha256:7a983626f10842a95a2c03de35c940e3dc468d3616beb1d4f588efe8d253c4b5",
"sha256:55350c47f9af28ce11ab06e514111622a1835bc3b8724fd39cad2bb94810014f"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
On my own binderhub using an image based on rocker/binder:3.4.2, RStudio Server will not open a shell session in the new tabbed terminal window. system()
still works. Terminal is working on my binder.org with the same repo though. When I check the pod log the last thing is a 403:
[W 00:22:06.159 NotebookApp] 403 POST /user/w201rdada-portfolio-4jbqvvxy/rstudio/rpc/start_terminal (10.32.0.25)
@yuvipanda any clue where to look to debug?
I'm pretty new to Binder, so I hope this isn't a false positive issue report (apologies in advance if so).
Per the documentation in the README, I'm trying to play round with this on my local machine Docker, but on rocker/binder:latest
and rocker/binder:4.1.0
I get:
# docker run -p 8888:8888 rocker/binder:4.1.0
Traceback (most recent call last):
File "/usr/local/bin/jupyter", line 8, in <module>
sys.exit(main())
File "/usr/local/lib/python3.8/dist-packages/jupyter_core/command.py", line 285, in main
command = _jupyter_abspath(subcommand)
File "/usr/local/lib/python3.8/dist-packages/jupyter_core/command.py", line 124, in _jupyter_abspath
raise Exception(
Exception: Jupyter command `jupyter-notebook` not found.
However, if I go back far enough, it works just fine:
# docker run -p 8888:8888 rocker/binder:3.6.2
[I 10:57:42.022 NotebookApp] Writing notebook server cookie secret to /home/rstudio/.local/share/jupyter/runtime/notebook_cookie_secret
[I 10:57:42.535 NotebookApp] Serving notebooks from local directory: /home/rstudio
[I 10:57:42.535 NotebookApp] The Jupyter Notebook is running at:
[I 10:57:42.535 NotebookApp] http://b439f1838a83:8888/?token=fc2430c9b88a67d70183a44e61fd0c6d382c5d93abe46dab
[I 10:57:42.535 NotebookApp] or http://127.0.0.1:8888/?token=fc2430c9b88a67d70183a44e61fd0c6d382c5d93abe46dab
[I 10:57:42.535 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[W 10:57:42.539 NotebookApp] No web browser found: could not locate runnable browser.
[C 10:57:42.539 NotebookApp]
To access the notebook, open this file in a browser:
file:///home/rstudio/.local/share/jupyter/runtime/nbserver-8-open.html
Or copy and paste one of these URLs:
http://b439f1838a83:8888/?token=fc2430c9b88a67d70183a44e61fd0c6d382c5d93abe46dab
or http://127.0.0.1:8888/?token=fc2430c9b88a67d70183a44e61fd0c6d382c5d93abe46dab
I don't know if this is related to #44 or not, hence opening as a new issue, but these maybe need to be merged if they are different symptoms of the same issue.
Thanks,
Louis
Is there a way I could inspect the config.yaml
that is presumably generated for use with helm
and k8s to provision a particular binder pod? I assuming the process behind binder is similar to what's documented at z2jh. I'd like to get the rocker binder image working with my own cluster but am having trouble launching the container.
@cboettig Thanks for your response at #15 and don't want to get that convo off track.
I wonder if there is a more elegant solution to using a Dockerfile
with binder just to copy a user's repo to the image. Better would be to copy to the container or volume map, but sticking in the vein of the current "data in the image" solution:
Clone the repo as NB_USER
in a RUN
command during build using a --build-arg
to pass in the repo url from the jupyter-repo2docker
environment. @yuvipanda would this be more parsimonious than the current solution to get the repo into the container? Unfortunately the Dockerfile would come with, but that would lend some transparency to what the image is, which is currently lacking from the whole process anyway.
So, if:
ARG REPO
RUN git clone ${REPO} ${NB_USER}
Were added say to a rocker/binder
base image, and jupyter-repo2docker
were updated to take a --build-arg
(which would I hope trigger a rebuild if the argument changes) then users could add the simplest Dockerfile without having to hand code copying the repo and changing permissions:
FROM rocker/binder:3.4.2
It would be great if something like that were enough to use a binder as the repo + curated images concept. This isn't hard, but it's also fairly complicated given the ease of use of the other jupyter-repo2docker
conventions:
# Make sure the contents of our repo are in ${HOME}
COPY . ${HOME}
USER root
RUN chown -R ${NB_UID} ${HOME}
USER ${NB_USER}
I'm not onboard with Consider phasing out Dockerfile support, because Docker seems too important for general consumption to sweep under the rug.
I started a new binderhub deployment following updates from jupyterhub/binderhub#430
Trying to launch example:
http://hub.w201rdada.org/v2/gh/binder-examples/dockerfile-rstudio/master?urlpath=rstudio
At the end of the build log getting:
[Warning] One or more build-args [NB_UID NB_USER] were not consumed
Successfully built 171533de9bce
Built image, launching...
Launching server...
Internal Server Error
@yuvipanda Following up on your other question from #10 here.
Clearly this depends on what we mean by 'feature'.
On the port / networking side, it would be good to make sure that RStudio can open up other browser windows, e.g. when previewing an HTML document output by rmarkdown, or a website built by blogdown/bookdown, but I think that should work out of the box unless the proxy is doing something non-standard.
More complex are examples that require listening on an additional port: e.g. Doing the OAuth dance using the httr
package, R listens for a callback on port 1410, see ?httr::oauth_listener
for details. Usually this means just making sure that port is exposed.
Most other features can "probably" be addressed by user installation, though this isn't always trivial; particularly when requiring certain sometimes non-obvious dependencies. The current Dockerfile builds on tidyverse
, we have two more images in the r-ver
stack, verse
which primarily adds common R LaTeX libraries (in an approach that is at least a little more subtle than the 4GB worth of texlive-full
) and a geospatial
stack which is particularly relevant on the debian:jessie
based tags, since the relevant geospatial dependencies (GDAL, GEOS) need to be compiled from source with particular configuration to make sure sure you get a fully featured rather than minimal geospatial capability. (even on debian:stretch
where sufficiently recent versions are available from apt
these installations can be a stumbling point for users). TeX libraries and geospatial libraries are obviously just two common 'features' we see requested; clearly we could include these in a somewhat kitchen-sink binder just by bumping our FROM
image to rocker:geospatial
, but clearly other domain-specific configurations can create similar issues. Geospatial an TeX are pretty common dependencies in data-science stuff in general though; I don't know the python stack but I presume there's something on that side supporting bindings to the GDAL,GEOS, proj4, lwgeom libraries as well; so perhaps there's some synergy there. Anyway, lemme know what you think
Binder looks really interesting! Thanks for making this publicly available.
Question: Have you seen any docker files that use binder with Jupyter Lab?
Question: Have you seen any docker files that use binder with Jupyter Lab + SSL?
The README.md at https://github.com/binder-examples/jupyterlab make it sound simple enough but ...
It seems that RStudio starts by default in the RStudio directory but the user is joyan. I imagine this is just following Binder and RStudio Server conventions, but does it make sense and is it well documented?
A question that arose during my migration to rocker/binder:4.0.2 that finally seems to be working, with faster build times than before ๐
Check it out here: https://mybinder.org/v2/gh/robinlovelace/geocompr/master?urlpath=rstudio
I've simplified the Dockerfile compared with what it was previously but suspect it could be simpler still, do I really need to download the repo with wget? I don't fully understand how COPY works but imagine there's a neater way... Any feedback on this very gratefully received: https://github.com/Robinlovelace/geocompr/blob/master/.binder/Dockerfile
First thanks for this meeting of the minds between jupyter and rocker!
I'm using a Dockerfile with this repo: https://github.com/w201rdada/portfolio
The image builds and launches great, and the RStudio Server session launches as well. However, when attempting to create a new Rstudio project (I want to use RStudio git integration) in the existing directory, the RStudio Server window reloads and displays a [Errno 111] Connection refused
and any subsequent attempts to launch an RStudio Server session give the same error page.
nbrsessionproxy calls the rsession
binary directly, but that doesn't seem to run without the LD_LIBRARY_PATH being explicitly set. Figure out why this is?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.