Coder Social home page Coder Social logo

monolith-to-microservices's Introduction

Monolith to Microservices

NOTE: This is not an officially supported Google product

Introduction

This project is used by the Google Cloud Platform team to demonstrate different services within Google Cloud. This project contains two versions of the same application, one architected as a monolith and the other as a set of microservices

Setup

NOTE: Make sure you have a newer version of NodeJS (16.13.0) or newer (in Cloud Shell you can run nvm install --lts)

git clone https://github.com/googlecodelabs/monolith-to-microservices
cd monolith-to-microservices
./setup.sh

Monolith

To run the monolith project use the following commands from the top level directory

cd monolith
npm start

You should see output similar to the following

Monolith listening on port 8080!

That's it! You now have a perfectly functioning monolith running on your machine

Docker - Monolith

To create a Docker image for the monolith, execute the following commands

cd monolith
docker build -t monolith:1.0.0 .

To run the Docker image, execute the following commands

docker run --rm -p 8080:8080 monolith:1.0.0

Microservices

To run the microservices project use the following commands from the top level directory

cd microservices
npm start

You should see output similar to the following

[0] Frontend microservice listening on port 8080!
[2] Orders microservice listening on port 8081!
[1] Products microservice listening on port 8082!

That's it! You now have a perfectly functioning set of microservices running on your machine

Docker - Microservices

To create a Docker image for the microservices, you will have to create a Docker image for each service. Execute the following commands for each folder under the microservices folder

cd microservices/src/frontend
docker build -t frontend:1.0.0 .

cd ../products
docker build -t products:1.0.0 .

cd ../orders
docker build -t orders:1.0.0 .

To run the Docker image, execute the following commands

docker run -d --rm -p 8080:8080 monolith:1.0.0
docker run -d --rm -p 8081:8081 orders:1.0.0
docker run -d --rm -p 8082:8082 products:1.0.0

To stop the containers, you will need to find the CONTAINER ID for each and stop them individually. See the steps below

docker ps -a

CONTAINER ID        IMAGE                        COMMAND                CREATED
4c01db0b339c        frontend:1.0.0               bash                   17 seconds ago
d7886598dbe2        orders:1.0.0                 bash                   17 seconds ago
d85756f57265        products:1.0.0               bash                   17 seconds ago

docker stop 4c01db0b339c
docker stop d7886598dbe2
docker stop d85756f57265

React App

The react-app folder contains a React application created from create-react-app. You can modify this fronted, but afterwards, you will need to build and move the static files to the monolith and microservices project. You can do this by running the standard create-react-app build command below

npm run build

This will run the build script to create the static files two times. The first will build with relative URLs and copy the static files to the monolith/public folder. The second run will build with the standard microservices URLs and copy the static files to the microservices/src/frontend/public folder

monolith-to-microservices's People

Contributors

bucketdeveloper avatar dependabot[bot] avatar ssingh-ssk avatar verbanicm 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

monolith-to-microservices's Issues

Connection refused frontend

Hello all,

I have one issue when try to configure the network into GCP. I don't know what's the problem when the frontend try to "listening" the port configurated. Maybe is a firewall problem?

Here my issue, hope you can understand.

Every 2.0s: curl http://35.231.62.121:8080 cs-6000-devshell-vm-004529bb-90b0-468b-b36e-40f5e720493b: Wed Jul 29 18:10:29 2020

% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0curl: (7) Failed to connect to 35.231.62.121 port 8080: Connection refused

Thanks

https://github.com/googlecodelabs/tools/issues/419#issue-642633556

#`` ```
❯ npm install
npm WARN deprecated [email protected]: 🙌 Thanks for using Babel: we recommend using babel-preset-env now: please read https://babeljs.io/env to update!
npm WARN deprecated [email protected]: We don't recommend using Bower for new projects. Please consider Yarn and Webpack or Parcel. You can read how to migrate legacy project here: https://bower.io/blog/2017/how-to-migrate-away-from-bower/
npm WARN deprecated [email protected]: gulp-util is deprecated - replace it, following the guidelines at https://medium.com/gulpjs/gulp-util-ca3b1f9f9ac5
npm WARN deprecated [email protected]: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.
npm WARN deprecated [email protected]: No longer maintained. We recomment migrating to ESLint with eslint-config-wikimedia.
npm WARN deprecated [email protected]: gulp-util is deprecated - replace it, following the guidelines at https://medium.com/gulpjs/gulp-util-ca3b1f9f9ac5
npm WARN deprecated [email protected]: core-js@<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.
npm WARN deprecated [email protected]: request has been deprecated, see request/request#3142
npm WARN deprecated [email protected]: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.
npm WARN deprecated [email protected]: Package no longer supported. Contact [email protected] for more info.
npm WARN deprecated [email protected]: https://github.com/lydell/resolve-url#deprecated
npm WARN deprecated [email protected]: Please see https://github.com/lydell/urix#deprecated

[email protected] install /Users/msingh/go/src/work/tools/site/node_modules/fsevents
node install.js

SOLINK_MODULE(target) Release/.node
CXX(target) Release/obj.target/fse/fsevents.o
SOLINK_MODULE(target) Release/fse.node

[email protected] install /Users/msingh/go/src/work/tools/site/node_modules/node-sass
node scripts/install.js

Downloading binary from https://github.com/sass/node-sass/releases/download/v4.14.1/darwin-x64-83_binding.node
Download complete ⸩ ⠋ :

[email protected] postinstall /Users/msingh/go/src/work/tools/site/node_modules/core-js
node -e "try{require('./postinstall')}catch(e){}"

Thank you for using core-js ( https://github.com/zloirock/core-js ) for polyfilling JavaScript standard library!

The project needs your help! Please consider supporting of core-js on Open Collective or Patreon:

https://opencollective.com/core-js
https://www.patreon.com/zloirock

Also, the author of core-js ( https://github.com/zloirock ) is looking for a good job -)

[email protected] postinstall /Users/msingh/go/src/work/tools/site/node_modules/node-sass
node scripts/build.js

Binary found at /Users/msingh/go/src/work/tools/site/node_modules/node-sass/vendor/darwin-x64-83/binding.node
Testing binary
Binary is fine
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: google-closure-compiler-linux@^20181008.0.0 (node_modules/google-closure-compiler/node_modules/google-closure-compiler-linux):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"linux","arch":"x64,x86"} (current: {"os":"darwin","arch":"x64"})

added 1253 packages from 641 contributors and audited 1257 packages in 65.807s

62 packages are looking for funding
run npm fund for details

found 19 vulnerabilities (8 low, 1 moderate, 9 high, 1 critical)
run npm audit fix to fix them, or npm audit for details


_Originally posted by @mithuns in https://github.com/googlecodelabs/tools/issues/419#issuecomment-647176638_
            

Tutorial links to malware installation site

The Host a Static Website in Google Cloud with Cloud Storage tutorial includes links to cookingincloudhipster.com. When I clicked on one of these links I was redirected to a site that attempted to socially engineer me into installing a malicious search hijacking extension.

After making another navigation attempt from the same profile and source IP, the site started serving me more innocuous domain selling pages. However, testing from different profiles and source IPs resulted in further attempts to socially engineer me into installing various types of malware.

I assume the original author of the tutorial no longers own the domain, and it was grabbed by malware distributors. Regardless, it needs to be scrubbed from the tutorial as it presents a serious threat.

Failed to load plugin 'flowtype'

In GSP662, it failed to execute npm install && npm run-script build.

student_01_349ef68b7c03@cloudshell:~ (qwiklabs-gcp-01-1dff1c6c283a)$ cd ~/monolith-to-microservices/react-app/
student_01_349ef68b7c03@cloudshell:~/monolith-to-microservices/react-app (qwiklabs-gcp-01-1dff1c6c283a)$ npm install && npm run-script build
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '@eslint/[email protected]',
npm WARN EBADENGINE   required: { node: '^12.22.0 || ^14.17.0 || >=16.0.0' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '@typescript-eslint/[email protected]',
npm WARN EBADENGINE   required: { node: '^12.22.0 || ^14.17.0 || >=16.0.0' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '@typescript-eslint/[email protected]',
npm WARN EBADENGINE   required: { node: '^12.22.0 || ^14.17.0 || >=16.0.0' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '@typescript-eslint/[email protected]',
npm WARN EBADENGINE   required: { node: '^12.22.0 || ^14.17.0 || >=16.0.0' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '@typescript-eslint/[email protected]',
npm WARN EBADENGINE   required: { node: '^12.22.0 || ^14.17.0 || >=16.0.0' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '@typescript-eslint/[email protected]',
npm WARN EBADENGINE   required: { node: '^12.22.0 || ^14.17.0 || >=16.0.0' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '@typescript-eslint/[email protected]',
npm WARN EBADENGINE   required: { node: '^12.22.0 || ^14.17.0 || >=16.0.0' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '@typescript-eslint/[email protected]',
npm WARN EBADENGINE   required: { node: '^12.22.0 || ^14.17.0 || >=16.0.0' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '@typescript-eslint/[email protected]',
npm WARN EBADENGINE   required: { node: '^12.22.0 || ^14.17.0 || >=16.0.0' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '@typescript-eslint/[email protected]',
npm WARN EBADENGINE   required: { node: '^12.22.0 || ^14.17.0 || >=16.0.0' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '[email protected]',
npm WARN EBADENGINE   required: { node: '^12.22.0 || ^14.17.0 || >=16.0.0' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '[email protected]',
npm WARN EBADENGINE   required: { node: '>=14.0.0' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '[email protected]',
npm WARN EBADENGINE   required: { node: '^12.22.0 || ^14.17.0 || >=16.0.0', npm: '>=6' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '[email protected]',
npm WARN EBADENGINE   required: { node: '^12.22.0 || ^14.17.0 || >=16.0.0' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '[email protected]',
npm WARN EBADENGINE   required: { node: '^12.22.0 || ^14.17.0 || >=16.0.0' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '[email protected]',
npm WARN EBADENGINE   required: { node: '^12.22.0 || ^14.17.0 || >=16.0.0' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '[email protected]',
npm WARN EBADENGINE   required: { node: '^12.22.0 || ^14.17.0 || >=16.0.0' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '[email protected]',
npm WARN EBADENGINE   required: { node: '>=12.20' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '[email protected]',
npm WARN EBADENGINE   required: { node: '>=12.20' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '[email protected]',
npm WARN EBADENGINE   required: { node: '>=14' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '[email protected]',
npm WARN EBADENGINE   required: { node: '>=14' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '[email protected]',
npm WARN EBADENGINE   required: { node: '>=14.0.0' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '[email protected]',
npm WARN EBADENGINE   required: { node: '>=12.22.0' },
npm WARN EBADENGINE   current: { node: 'v12.14.1', npm: '8.4.0' }
npm WARN EBADENGINE }
npm WARN deprecated [email protected]: See https://github.com/lydell/source-map-url#deprecated
npm WARN deprecated [email protected]: This SVGO version is no longer supported. Upgrade to v2.x.x.

added 1413 packages, and audited 1414 packages in 25s

177 packages are looking for funding
  run `npm fund` for details

8 moderate severity vulnerabilities

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

> [email protected] prebuild
> npm run build:monolith


> [email protected] build:monolith
> env-cmd -f .env.monolith react-scripts build

Creating an optimized production build...
(node:2602) Warning: require() of ES modules is not supported.
require() of /home/student_01_349ef68b7c03/monolith-to-microservices/react-app/node_modules/@eslint/eslintrc/universal.js from /home/student_01_349ef68b7c03/monolith-to-microservices/react-app/node_modules/eslint/lib/linter/linter.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.
Instead rename universal.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from /home/student_01_349ef68b7c03/monolith-to-microservices/react-app/node_modules/@eslint/eslintrc/package.json.
Failed to compile.

Failed to load plugin 'flowtype' declared in 'package.json » eslint-config-react-app': Cannot find module 'eslint/use-at-your-own-risk'
Require stack:
- /home/student_01_349ef68b7c03/monolith-to-microservices/react-app/node_modules/eslint-plugin-flowtype/dist/utilities/getBuiltinRule.js
- /home/student_01_349ef68b7c03/monolith-to-microservices/react-app/node_modules/eslint-plugin-flowtype/dist/rules/noUnusedExpressions.js
- /home/student_01_349ef68b7c03/monolith-to-microservices/react-app/node_modules/eslint-plugin-flowtype/dist/index.js
- /home/student_01_349ef68b7c03/monolith-to-microservices/react-app/node_modules/@eslint/eslintrc/dist/eslintrc.cjs

[cloud-deploy-website-on-gke]:

https://codelabs.developers.google.com/codelabs/cloud-deploy-website-on-gke#8
9. Make changes to the website
cd ~/monolith-to-microservices/react-app/src/pages/Home
mv index.js.new index.js
cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js
cd ~/monolith-to-microservices/react-app
npm run build:monolith

Issue:

user@cloudshell:~/monolith-to-microservices/react-app (user-lab$ npm run build:monolith

[email protected] build:monolith
env-cmd -f .env.monolith react-scripts build

Creating an optimized production build...
(node:1842) Warning: require() of ES modules is not supported.
require() of /home/user/monolith-to-microservices/react-app/node_modules/@eslint/eslintrc/universal.js from /home/user/monolith-to-microservices/react-app/node_modules/eslint/lib/linter/linter.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.
Instead rename universal.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from /home/user/monolith-to-microservices/react-app/node_modules/@eslint/eslintrc/package.json.
Failed to compile.

Failed to load plugin 'flowtype' declared in 'package.json » eslint-config-react-app': Cannot find module 'eslint/use-at-your-own-risk'
Require stack:

  • /home/user/monolith-to-microservices/react-app/node_modules/eslint-plugin-flowtype/dist/utilities/getBuiltinRule.js
  • /home/user/monolith-to-microservices/react-app/node_modules/eslint-plugin-flowtype/dist/rules/noUnusedExpressions.js
  • /home/user/monolith-to-microservices/react-app/node_modules/eslint-plugin-flowtype/dist/index.js
  • /home/user/monolith-to-microservices/react-app/node_modules/@eslint/eslintrc/dist/eslintrc.cjs

On Step "4" have user run: nvm install --lts prior to downloading the git package.

In step 8 wrong instance-zone is specified

Hi,

in step 8. Update website this part:
gcloud compute instance-templates create fancy-fe-new
--source-instance=frontend
--source-instance-zone=us-central1-a

Should have us-central1-f instead of us-central1-a

GCR permissions issue on GKE codelab

On page 6 Deploy container to GKE

My pod is not reaching the 'READY' state:

$ kubectl get pod
NAME                      READY   STATUS             RESTARTS   AGE
monolith-d986d5f5-s7rqg   0/1     ImagePullBackOff   0          23m

When diving deeper I see that the GKE instance I created doesn't seem to have permissions to pull the image I created in the previous steps:

$ kubectl describe pod/monolith-d986d5f5-s7rqg
...
Events:
  Type     Reason     Age                  From               Message
  ----     ------     ----                 ----               -------
  Normal   Scheduled  25m                  default-scheduler  Successfully assigned default/monolith-d986d5f5-s7rqg to gke-fancy-cluster-default-pool-69633fd6-dnh1
  Normal   Pulling    24m (x4 over 25m)    kubelet            Pulling image "gcr.io/maloney-scratch/monolith:1.0.0"
  Warning  Failed     24m (x4 over 25m)    kubelet            Failed to pull image "gcr.io/maloney-scratch/monolith:1.0.0": rpc error: code = Unknown desc = failed to pull and unpack image "gcr.io/maloney-scratch/monolith:1.0.0": failed to resolve reference "gcr.io/maloney-scratch/monolith:1.0.0": pulling from host gcr.io failed with status code [manifests 1.0.0]: 403 Forbidden
  Warning  Failed     24m (x4 over 25m)    kubelet            Error: ErrImagePull
  Warning  Failed     23m (x6 over 25m)    kubelet            Error: ImagePullBackOff
  Normal   BackOff    21s (x111 over 25m)  kubelet            Back-off pulling image "gcr.io/maloney-scratch/monolith:1.0.0"
```

I had to give "Storage Object Viewer" permissions to the "Compute Engine default service account" on the 'artifacts.$PROJECT_ID.appspot.com' bucket before it would work.

Missing example source repository

Hello, t
his lab doesn't contain a step with the command to check out the repository with example source code.
There is a screenshot with a git clone command but it is a non-existent link.

Thank you in advance.
Fausto

Step 9 - cleanup - awk commands refer to wrong field ($)

Hello and thanks for the the tutorial on "Deploy a website with Cloud Run".
I believe that step 9 for cleaning up has an issue in the section for "Delete Cloud Build artifacts from Cloud Storage":
The command for printing all available soures is:
gcloud builds list | awk 'NR > 1 {print $4}'
This returns blank lines.
image

If I run "gcloud builds list", the results with the available source archives only have data in two fields, one with the description of the fields ($1) and one with the information ($2).
image
When running for field 1, I get the following:
image
When running for field 2, I get the following:
image

I believe that the $4 in the example is wrong as there is no 4th field to populate data from as the fields seem to be read in columns.
That explains why when running with $4, I get blank lines, since there is no 4 field when the data are read columnwise.

I assume the intention was to read rows of IDs, and except for the first one (which is the last one created), pull the 4th field (SOURCE) for other entries and remove them.

However for that to happen, I assume some additional command is required to read the fields in rows for each entry?

gcloud run attribute modification without redeploying

Guide text specifies "Now, restore the original concurrency without redeploying." when setting back concurrency to 80 from 1 but subsequent command is a gcloud run deploy that creates a new revision (with deploy and traffic switch).

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.