Giter Club home page Giter Club logo

aroworkshop's Introduction

Build and deploy

aroworkshop.io

This is the repository for the Azure Red Hat OpenShift Workshop website.

Technology

  • The website is statically built using Jekyll and you’ll find the different pages inside the _entries folder
  • The build pipeline builds uses GitHub Actions to publish to the gh-pages branch which gets published to microsoft.github.io/aroworkshop/

Contributing

This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.microsoft.com.

Please fork and branch off staging, then submit a Pull Request against staging. If you want your name to show up in the contributors, please add your GitHub username to _entries/99 Contributors.md in alphabetical order.

When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA.

This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact [email protected] with any additional questions or comments.

aroworkshop's People

Contributors

0kashi avatar andykrohg avatar brianstinehart avatar fasalzaman avatar jamesread avatar jkatsos avatar lgmorand avatar microsoft-github-policy-service[bot] avatar microsoftopensource avatar msftgits avatar nichochen avatar sabbour avatar sajitsasi avatar vincepower avatar wgordon17 avatar yokimjd 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aroworkshop's Issues

Issue with MongoDB template in ARO Workshop

We are not able to deploy the MongoDB persistent template provided in the lab guide properly.
image
We are getting the below issue :
image

We have some workshops going on for this, Can you someone please help as soon as possible?

2.5 & 2.6 -- Sample App code no longer matches instructions

ratings-api

  • exposed port after following the instructions is 8080, not 3000

ratings-web

  • vue version specified in package.json causes compile to fail
  • parameters hardcoded in package.json start script override env settings and prevent app from connectiong to API
    i also filed these issues in the sample app repo.

create cluster CLI snippet to be corrected

Lab 1 /§2.2

az openshift create ...

with ARO 4.3 should be :

az aro create
--name $cluster_name
--vnet $vnet_name
--master-subnet $master_subnet_id
--worker-subnet $worker_subnet_id
--apiserver-visibility $apiserver_visibility
--ingress-visibility $ingress_visibility
--location $location
--pod-cidr $pod_cidr
--service-cidr $svc_cidr
--pull-secret @pull-secret.txt
--worker-count 3
--resource-group $rg_name

CI/CD pipeline stage "Build Image" fails (ARO 3.11)

The initial run of the "tasks-pipeline" pipeline fails on the "Build Image" step.

Error from Jenkins for Stage "Build Image":

ERROR: Error running start-build on at least one item: [buildconfig/tasks];
{reference={}, err=Uploading file "target/ROOT.war" as binary input for the build ...
Error from server (InternalError): Internal error occurred: pods "tasks-1-build" is forbidden: cannot exec into or attach to a privileged container, verb=start-build, cmd=oc --server=https://172.30.0.1:443 --certificate-authority=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt --namespace=dev-aro --token=XXXXX start-build buildconfig/tasks --from-file=target/ROOT.war --wait=true -o=name , out=, status=1}

Jenkins log with additional context:

...snip...
[Pipeline] stage
[Pipeline] { (Build Image)
[Pipeline] sh
+ cp target/openshift-tasks.war target/ROOT.war
[Pipeline] script
[Pipeline] {
[Pipeline] echo

[Pipeline] _OcContextInit
[Pipeline] _OcContextInit
[Pipeline] readFile
[Pipeline] _OcAction
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Deploy DEV)
Stage "Deploy DEV" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Promote to STAGE?)
Stage "Promote to STAGE?" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Deploy STAGE)
Stage "Deploy STAGE" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: Error running start-build on at least one item: [buildconfig/tasks];
{reference={}, err=Uploading file "target/ROOT.war" as binary input for the build ...
Error from server (InternalError): Internal error occurred: pods "tasks-1-build" is forbidden: cannot exec into or attach to a privileged container
, verb=start-build, cmd=oc --server=https://172.30.0.1:443 --certificate-authority=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt --namespace=dev-aro --token=XXXXX start-build buildconfig/tasks --from-file=target/ROOT.war --wait=true -o=name , out=, status=1}

Finished: FAILURE

/usr/libexec/s2i/run: line 485: exec: java: not found when deploying the CICD demo

At the start of the CICO lab, I'm seeing the following after running:

./cicd/scripts/provision.sh deploy --enable-che --ephemeral --project-suffix aro
# oc get po -w 
NAME                        READY     STATUS              RESTARTS   AGE
che-5694c4c564-sg5kw        0/1       ContainerCreating   0          3m
cicd-demo-installer-44g4k   0/1       Error               0          5m
cicd-demo-installer-g6cnv   0/1       Error               0          4m
cicd-demo-installer-vhqj9   0/1       ContainerCreating   0          4s
gogs-1-cd2jx                1/1       Running             0          3m
gogs-postgresql-1-8gsbh     1/1       Running             0          3m
jenkins-2-692gx             0/1       Running             3          4m
jenkins-2-deploy            1/1       Running             0          4m
nexus-1-8lv27               1/1       Running             0          2m
sonardb-1-hfbnx             1/1       Running             0          2m
sonarqube-1-nqw8j           1/1       Running             0          2m

jenkins-2-692gx   0/1       Error     3         4m
cicd-demo-installer-vhqj9   1/1       Running   0         6s
jenkins-2-692gx   0/1       CrashLoopBackOff   3         4m
jenkins-2-692gx   0/1       Running   4         5m
jenkins-2-692gx   0/1       Error     4         5m
cicd-demo-installer-vhqj9   0/1       Error     0         55s
jenkins-2-692gx   0/1       CrashLoopBackOff   4         5m
odl_user@Azure:~$ oc logs jenkins-2-692gx
OpenShift client and server versions are oc v3.11.146
kubernetes v1.11.0+d4cacc0
features: Basic-Auth GSSAPI Kerberos SPNEGO

Server https://172.30.0.1:443
openshift v3.11.129
kubernetes v1.11.0+d4cacc0
alternatives version 1.7.4 - Copyright (C) 2001 Red Hat, Inc.
This may be freely redistributed under the terms of the GNU Public License.

usage: alternatives --install <link> <name> <path> <priority>
                    [--initscript <service>]
                    [--family <family>]
                    [--slave <link> <name> <path>]*
       alternatives --remove <name> <path>
       alternatives --auto <name>
       alternatives --config <name>
       alternatives --display <name>
       alternatives --set <name> <path>
       alternatives --list

common options: --verbose --test --help --usage --version --keep-missing
                --altdir <directory> --admindir <directory>
OPENSHIFT_JENKINS_JVM_ARCH='', CONTAINER_MEMORY_IN_MB='2048', using /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-1.el7_7.x86_64/jre/bin/java and /usr/lib/jvm/java-11-openjdk-11.0.4.11-1.el7_7.x86_64/bin/javac
/usr/local/bin/jenkins-common.sh: line 33: java: command not found
mkdir: cannot create directory ‘/var/lib/jenkins/logs’: File exists
Administrative monitors that contact the update center will remain active
Detected password environment variable change, updating Jenkins configuration ...
config.xml
Migrating slave image configuration to current version tag ...
+ exec java -XX:+UseParallelGC -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Xmx1024m -Dfile.encoding=UTF8 -Djavamelody.displayed-counters=log,error -Duser.home=/var/lib/jenkins -Djavamelody.application-name=JENKINS -jar /usr/lib/jenkins/jenkins.war
/usr/libexec/s2i/run: line 485: exec: java: not found

Build fails

What happened:
Build failed with permission error when running "make build-run". Added --trace to the build option in the Dockerfile to display the error. Full transcript:

[bryon@Bryons-MacBook-Pro aroworkshop]$ make build-run
docker build -t azch/aro-site:latest -f Dockerfile .
Sending build context to Docker daemon  45.82MB
Step 1/8 : FROM jekyll/builder AS build
 ---> d92f7574c8c5
Step 2/8 : WORKDIR /src/app
 ---> Using cache
 ---> 4aaca41da8f0
Step 3/8 : COPY . .
 ---> 39235f15f555
Step 4/8 : RUN mkdir _site &&     jekyll build --future --trace
 ---> Running in ecdaa9570df0
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux-musl]
Configuration file: /src/app/_config.yml
/usr/local/lib/ruby/2.6.0/fileutils.rb:239:in `mkdir': Permission denied @ dir_s_mkdir - /src/app/.jekyll-cache (Errno::EACCES)
	from /usr/local/lib/ruby/2.6.0/fileutils.rb:239:in `fu_mkdir'
	from /usr/local/lib/ruby/2.6.0/fileutils.rb:217:in `block (2 levels) in mkdir_p'
	from /usr/local/lib/ruby/2.6.0/fileutils.rb:215:in `reverse_each'
	from /usr/local/lib/ruby/2.6.0/fileutils.rb:215:in `block in mkdir_p'
	from /usr/local/lib/ruby/2.6.0/fileutils.rb:200:in `each'
	from /usr/local/lib/ruby/2.6.0/fileutils.rb:200:in `mkdir_p'
	from /usr/gem/gems/jekyll-4.0.0/lib/jekyll/cache.rb:184:in `dump'
	from /usr/gem/gems/jekyll-4.0.0/lib/jekyll/cache.rb:101:in `[]='
	from /usr/gem/gems/jekyll-4.0.0/lib/jekyll/cache.rb:45:in `clear_if_config_changed'
	from /usr/gem/gems/jekyll-4.0.0/lib/jekyll/site.rb:113:in `reset'
	from /usr/gem/gems/jekyll-4.0.0/lib/jekyll/site.rb:33:in `initialize'
	from /usr/gem/gems/jekyll-4.0.0/lib/jekyll/commands/build.rb:30:in `new'
	from /usr/gem/gems/jekyll-4.0.0/lib/jekyll/commands/build.rb:30:in `process'
	from /usr/gem/gems/jekyll-4.0.0/lib/jekyll/command.rb:89:in `block in process_with_graceful_fail'
	from /usr/gem/gems/jekyll-4.0.0/lib/jekyll/command.rb:89:in `each'
	from /usr/gem/gems/jekyll-4.0.0/lib/jekyll/command.rb:89:in `process_with_graceful_fail'
	from /usr/gem/gems/jekyll-4.0.0/lib/jekyll/commands/build.rb:18:in `block (2 levels) in init_with_program'
	from /usr/gem/gems/mercenary-0.3.6/lib/mercenary/command.rb:220:in `block in execute'
	from /usr/gem/gems/mercenary-0.3.6/lib/mercenary/command.rb:220:in `each'
	from /usr/gem/gems/mercenary-0.3.6/lib/mercenary/command.rb:220:in `execute'
	from /usr/gem/gems/mercenary-0.3.6/lib/mercenary/program.rb:42:in `go'
	from /usr/gem/gems/mercenary-0.3.6/lib/mercenary.rb:19:in `program'
	from /usr/gem/gems/jekyll-4.0.0/exe/jekyll:15:in `<top (required)>'
	from /usr/gem/bin/jekyll:23:in `load'
	from /usr/gem/bin/jekyll:23:in `<main>'
The command '/bin/sh -c mkdir _site &&     jekyll build --future --trace' returned a non-zero code: 1

What you expected to happen:
Build should have completed without error

How to reproduce it (as minimally and precisely as possible):
Clone the aroworkshop repo
run make build-run

Anything else we need to know?:

Environment:

  • OS: macOS

Error in Cli Version

In Lab1 Task 2.3 while creating project facing an issue with the cli version.
As we are using cli version 2.5.1 in cloud shell.

Error message is :
Operation failed with status: 'Not Found'. Details: "{\"error\":{\"code\":\"InvalidResourceType\",\"message\":\"The resource type 'openShiftManagedClusters' could not be found in the namespace 'Microsoft.ContainerService' for api version '2019-10-27-preview'. The supported api-versions are '2019-04-30,2019-09-30-preview'.\"}}

Ratings API container exposes port 3000 not 8080

Ratings API container exposes port 3000 not 8080 Since those PR :

The ARO workshop guidance should state this and provide a CLI snippet 'oc new-app ....' to get the Service configured with

  ports:
    - name: 80-3000-tcp
      protocol: TCP
      port: 8080
      targetPort: 3000

I have read the OC CLI docs but not found anything, how to do so ?

@sabbour @jamesread

CI/CD Lab 3 - che instructions not accurate

I believe Lab 3 needs an update as the provision.sh script from the Github repo no longer installs CHE, which I believe is needed to be done in the OperatorHub instead.

Also the Monitor the pipeline section has a screenshot from ARO3 (the old version of the ARO service). Should update with a screenshot from ARO4.

Clarification Required: Configuration

I am not sure of the point of this whole section. What you click on and what you see don't match, and there is no outcome in terms of the lab.

Configuration using ConfigMaps

The UI does not display the entire configMap as the steps suggest. All you get is the data
Screen Shot 2019-09-02 at 4 25 57 pm

Secrets
The UI does not display the secret as per the steps elude.
Screen Shot 2019-09-02 at 4 27 20 pm

Configuration using Environment Variables
The UI does not match the contents - and some of the environment variables are not even there. E.g. ENV_TOY_CONFIGMAP
Screen Shot 2019-09-02 at 4 31 58 pm

WCAG 2.1.1: Elements that have scrollable content must be accessible by keyboard (pre)

Issue

Elements that have scrollable content must be accessible by keyboard (scrollable-region-focusable)

Target application

Azure Red Hat OpenShift Workshop

Element path

#mongodb > .collapsible-content-container:nth-child(3) > .collapsible-content > .language-sh.highlighter-rouge:nth-child(3) > .highlight > pre

Snippet

<pre class="highlight"><code>oc create <span class="nt">-n</span> openshift <span class="nt">-f</span> https://raw.githubusercontent.com/openshift/origin/4ea9e6c5961eb815c200df933eee30c48a5c9166/examples/db-templates/mongodb-persistent-template.json </c...

How to fix

Fix any of the following:
  Element should have focusable content
  Element should be focusable

Environment

Microsoft Edge version 100.0.1185.50
This accessibility issue was found using Accessibility Insights for Web 2.31.1 (axe-core 4.3.2), a tool that helps find and fix accessibility issues. Get more information & download this tool at http://aka.ms/AccessibilityInsights.

Service port for ratings-api defaults to 8080 instead of 3000

The ratings-api, which is deployed in step 2.4 exposes port 3000. The service, that gets created by the following command exposes port 8080.

oc new-app https://github.com/<your GitHub username>/rating-api --strategy=source

This leads to misconfiguration and the web frontend can't find the api. The port exposed by the ratings-api service has to be changed from 8080 to 3000 manually.

Untitled

Che pod is not deploying in "Deploy the CI\CD Demo" exercise

In Exercise “Deploy the CI\CD Demo” (https://github.com/microsoft/aroworkshop/blob/master/_entries/04-02%20deploy_cicd_demo.md#deploy-the-demo ), che pod is not getting deployed.
When I ran “oc get pod”, Che pod was missing. As a result I was not able to run Cloud Native IDE exercise. (https://github.com/microsoft/aroworkshop/blob/master/_entries/04-04%20cloud_native_ide.md) .

Please find the output log below :

odl_user@Azure:~$ ./cicd/scripts/provision.sh deploy --enable-che --ephemeral --project-suffix aro

###############################################################################
MAKE SURE YOU ARE LOGGED IN:
$ oc login http://console.your.openshift.com
###############################################################################
WARN: Unknown option (ignored): --enable-che

########################################################################
OpenShift CI/CD Demo (Thu Aug 20 19:59:48 UTC 2020)
########################################################################
Deploying demo...
Now using project "dev-aro" on server "https://api.ks0z7mzg.centralus.aroapp.io:6443".

You can add applications to this project with the 'new-app' command. For example, try:

oc new-app ruby~https://github.com/sclorg/ruby-ex.git

to build a new example application in Ruby. Or use kubectl to deploy a simple Kubernetes application:

kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node

Now using project "stage-aro" on server "https://api.ks0z7mzg.centralus.aroapp.io:6443".

You can add applications to this project with the 'new-app' command. For example, try:

oc new-app ruby~https://github.com/sclorg/ruby-ex.git

to build a new example application in Ruby. Or use kubectl to deploy a simple Kubernetes application:

kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node

Now using project "cicd-aro" on server "https://api.ks0z7mzg.centralus.aroapp.io:6443".

You can add applications to this project with the 'new-app' command. For example, try:

oc new-app ruby~https://github.com/sclorg/ruby-ex.git

to build a new example application in Ruby. Or use kubectl to deploy a simple Kubernetes application:

kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node
Warning: Group 'system:serviceaccounts:cicd-aro' not found
clusterrole.rbac.authorization.k8s.io/edit added: "system:serviceaccounts:cicd-aro"
Warning: Group 'system:serviceaccounts:cicd-aro' not found
clusterrole.rbac.authorization.k8s.io/edit added: "system:serviceaccounts:cicd-aro"
--> Deploying template "openshift/jenkins-ephemeral" to project cicd-aro

Jenkins (Ephemeral)
---------
Jenkins service, without persistent storage.

 WARNING: Any data stored will be lost upon pod destruction. Only use this template for testing.

 A Jenkins service has been created in your project.  Log into Jenkins with your OpenShift account.  The tutorial at https://github.com/openshift/origin/blob/master/examples/jenkins/README.md contains more information about using this template.

With parameters:
* Jenkins Service Name=jenkins
* Jenkins JNLP Service Name=jenkins-jnlp
* Enable OAuth in Jenkins=true
* Memory Limit=1Gi
* Jenkins ImageStream Namespace=openshift
* Disable memory intensive administrative monitors=false
* Jenkins ImageStreamTag=jenkins:2
* Allows use of Jenkins Update Center repository with invalid SSL certificate=false

--> Creating resources ...
route.route.openshift.io "jenkins" created
deploymentconfig.apps.openshift.io "jenkins" created
serviceaccount "jenkins" created
rolebinding.authorization.openshift.io "jenkins_edit" created
service "jenkins-jnlp" created
service "jenkins" created
--> Success
Access your application via route 'jenkins-cicd-aro.apps.ks0z7mzg.centralus.aroapp.io'
Run 'oc status' to view your app.
Using template https://raw.githubusercontent.com/siamaksade/openshift-cd-demo/ocp-4.3/cicd-template.yaml
--> Deploying template "cicd-aro/cicd" for "https://raw.githubusercontent.com/siamaksade/openshift-cd-demo/ocp-4.3/cicd-template.yaml" to project cicd-aro

cicd
---------
Use the following credentials for login:
Jenkins: use your OpenShift credentials
Nexus: admin/admin123
SonarQube: admin/admin
Gogs Git Server: gogs/gogs
With parameters:
* DEV project name=dev-aro
* STAGE project name=stage-aro
* Ephemeral=false
* WEBHOOK_SECRET=EgfCYckk # generated
* Integrate Quay.io=false
* Quay.io Username=
* Quay.io Password=
* Quay.io Image Repository=tasks-app

--> Creating resources ...
rolebinding.authorization.openshift.io "default_admin" created
buildconfig.build.openshift.io "tasks-pipeline" created
configmap "jenkins-slaves" created
job.batch "cicd-demo-installer" created
--> Success
JenkinsPipeline build strategy is deprecated. Use Jenkinsfiles directly on Jenkins or OpenShift Pipelines instead
Use 'oc start-build tasks-pipeline' to start a build.
Run 'oc status' to view your app.

Provisioning completed successfully!
(Completed in 0 min 24 sec)

odl_user@Azure:~$ oc get pod -n cicd-aro

NAME READY STATUS RESTARTS AGE
cicd-demo-installer-96t5s 0/1 Completed 0 7m8s
gogs-1-deploy 0/1 Completed 0 6m45s
gogs-1-qbfwb 1/1 Running 0 6m42s
gogs-postgresql-1-deploy 0/1 Completed 0 6m45s
gogs-postgresql-1-n5jsb 1/1 Running 0 6m42s
jenkins-2-deploy 0/1 Completed 0 6m34s
jenkins-2-nm2v4 1/1 Running 0 6m30s
nexus-1-b79kg 1/1 Running 0 6m35s
nexus-1-deploy 0/1 Completed 0 6m38s
nexus-1-hook-post 0/1 Completed 0 2m47s
sonardb-2-deploy 0/1 Completed 0 6m38s
sonardb-2-plqf4 1/1 Running 0 6m35s
sonarqube-1-deploy 0/1 Completed 0 6m39s
sonarqube-1-ghx8f 1/1 Running 0 6m36s

Section 3.5 Persistent storage refers to incorrect directory named "/var/demo-files"

Is section 3.5 Persistent Storage, there are two incorrect references to the directory that is on the PVC:

It says:
"If you remember we mounted the directory /var/demo-files to our PVC."
but should be:
"If you remember we mounted the directory /var/demo_files to our PVC."

It says:
then cd /var/demo-files
but should be:
then cd /var/demo_files

MongoDB cannot create Pod

I followed exact steps in tutorial, but no Pod created for MongoDB, only service and deployment config created.
Can you help?

C:\Users\sid>oc get all
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mongodb ClusterIP 172.30.244.245 27017/TCP 66s

NAME REVISION DESIRED CURRENT TRIGGERED BY
deploymentconfig.apps.openshift.io/mongodb 0 1 0 config,image(mongodb:3.6)

Restore Data Step has incorrect path

Path needs to be absolute for loading tata:
Run the mongoimport command to import the JSON data files into the database. Make sure the username, password and database name match what you specified when you deployed the template.
mongoimport --host 127.0.0.1 --username ratingsuser --password ratingspassword --db ratingsdb --collection items --type json --file data/items.json --jsonArray
mongoimport --host 127.0.0.1 --username ratingsuser --password ratingspassword --db ratingsdb --collection sites --type json --file data/sites.json --jsonArray
mongoimport --host 127.0.0.1 --username ratingsuser --password ratingspassword --db ratingsdb --collection ratings --type json --file data/ratings.json --jsonArray

Clarification required: Scaling

Need to have them record the cluster name and resource group name from when they created the project.
I had to look at the entire commend history to go back and find them.

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.