If you have any questions, send an email to [email protected] or send a message through the course Discord group.
Run npm start
to start the development mode. The search is disabled during local development.
DevOps with Docker course by the University of Helsinki, Course material
Home Page: https://devopswithdocker.com/
If you have any questions, send an email to [email protected] or send a message through the course Discord group.
Run npm start
to start the development mode. The search is disabled during local development.
It was probably mentioned SOMEWHERE, but for me this was a great waste of time:
If the sh script is created in Windows, it is by default created with wrong EOL and this needs to be fixed for example in Notepad++ (go to Edit -> EOL Conversion -> Select Linux (LF).
This is not exactly obvious for one who doesn't use Linux very actively and especially because transferring files between operating systems is not an everyday thing.
And because the error message is not very clear (Linux just says that "Not found" when trying to run the script).
Trying quay.io/nordstrom/hello-world without explicit tag gives mainfest errors
docker pull quay.io/nordstrom/hello-world
Using default tag: latest
Error response from daemon: manifest for quay.io/nordstrom/hello-world:latest not found: manifest unknown: manifest unknown
Resolution: add appropriate tag to the image, for example this works:
docker pull quay.io/nordstrom/hello-world:2.0
Create new image that explains more about ports and where requests are coming from. Previous image is hard to understand.
When copying command code from the tutorial page, the copied text includes the dollar sign ($
). This causes issues when pasting the command into a terminal, as the dollar sign is not part of the command but a prompt indicator.
$ some-command --with-parameters
The copied text should exclude the dollar sign, so when pasted into the terminal, it should look like this:
some-command --with-parameters
https://devopswithdocker.com/part-2/section-4/
In the second paragraph's first sentence, the second hyperlink https://ethesis.helsinki.fi/repository/handle/123456789/30995 seems to be locked. Is there a public version of this?
I faced a problem in exercise 1.9 when using WSL2.
When using -v to bind mount a file, and the file does not exist on host machine, a directory is created by default. The file has to be created before executing the command
docker -run -v "$(pwd)/text.log:/usr/src/app/text.log" devopsdockeruh/simple-web-service
So, the problem is that even if you remove the directory text.log from host machine after first time, and then create the file text.log on host machine, and then rerun the same command it outputs an error message: docker: Error response from daemon: not a directory.
I overcame the problem with bind mounting the file with a different name.
Steps to reproduce:
docker run -v "$(pwd)/text.log:/usr/src/app/text.log" devopsdockeruh/simple-web-service
rm -r text.log
touch text.log
docker: Error response from daemon: not a directory
See: docker/for-win#9823
There's no mention about referencing a git repository for building.
E.g.
version: '3.5'
services:
ml-front:
build: https://github.com/docker-hy/ml-kurkkumopo-frontend.git
this way you don't need to clone repositories locally.
Part 1 should have more explanation on what containers are and what is inside of them.
Consider adding a new exercise to get more familiar with a container and its contents (or lack of).
So far all the exercises worked well but I got stuck on 2.4 using WSL. I managed to make it work on my linux computer though.
The "responses" are never started even when scaling multiple compute containers
The text of part 3 states:
Every Dockerfile we’ve used until now has been FROM ubuntu
However, in exercises 1.13 and 1.14 we were told to create Dockerfiles from openjdk and Ruby images instead of ubuntu. The exercises in parts 1 and 2 using the node.js based frontend/backend don't specifically state that Dockerfiles should start from ubuntu images, so I used FROM node which makes exercise 3.1 difficult.
https://hub.docker.com//_/postgres/ gives 404
Question: "Should we start at exercises.md or part0.md" -Student
Suggested solution: Add information where to start on homepage.
It would be good to have schedule/timeline for the beta testing. This would give the beta testers idea of the time span and therefore make it possible to schedule their testing so that it would be useful to the course makers.
Seems like there are some legal problems (https://github.com/github/dmca/blob/master/2020/10/2020-10-23-RIAA.md). You can still download it from http://yt-dl.org/ so it is not affecting part1 examples yet.
No return instructions in exercise 1.3, so it is a bit unclear what to return.
One could maybe return the commands used for completing the exercise.
Title plz help.
Part 1 section 1 example scenario 2 (Isolated environments) is not very good due venv. Some other programming language with less obvious or more difficult native isolation mechanism might be better choice as an example here.
In this exercise create a Dockerfile and use FROM and CMD to create a brand new image that automatically runs the server. Tag the new image as “web-server”
so it's CMD ["server"]
but as a beginner I can not know that it's not CMD "server"
as previously
Notice how the command line appears to freeze after pulling and starting the container.
is not true anymore
I embarrassingly spent too many hours to count troubleshooting why my backend didn't respond to /api/ping
through the frontend. Depending on course philosophy, it may be advisable to clarify the information block about the backend in exercise 2.8, specifically:
"It might be nginx configuration problem: Add trailing / to the backend url in the nginx.conf."
I misread this as meaning the location block's prefix pattern /api/
's trailing slash. Indeed, without much knowledge about how NGINX conf flow works, I didn't make the (obvious in retrospect) connection with _backend_connection_url_
. While the learning experience of tinkering with nginx.conf
and solidifying my understanding of docker-compose networks was very useful (paralleling what real-world problem-solving is like), this may slow down desired progression rate for the student.
Suggestion: Make the ex2.8 information block more explicit, eg:
Option 1: "Ensure there is a trailing /
on the backend url as specified under the location /api/
context in the nginx.conf."
Option 2: "Ensure there is a trailing /
on _backend_connection_url_
in the nginx.conf."
Thanks!
~k
The exercise 1.4 explicitly tells you to run docker run curler
command.
However at least in my solution I had to use additional switches to be able to input anything to the running program.
I am unsure if the exercise can be done without switches with the material so far.
The material has not yet at that point covered the ENTRYPOINT and CMD differences, so using helsinki.fi as the input directly to the docker run command should probably not be expected from the student.
I would suggest adding the required switches to the instructions or a hint about them since the exercise is probably more about Dockerfile. No need to add anything if you feel like people will find out by themselves :)
Title
I have the frontend running in production mode on 5000 and the backend is running on 8000. I press the button and get a cross-orgin request blocked notification in my web console. I see that in the README for the backend it suggest the following fix for this problem "FRONT_URL= npm start". So I have tried following that fix but I think I am interpreting it wrong. I have run the following.
CMD ["FRONT_URL=", "npm", "start"]
CMD ["FRONT_URL=127.0.0.1", "npm", "start"]
ENV FRONT_URL=
CMD [ "npm", "start" ]
ENV FRONT_URL=<127.0.0.1>
CMD [ "npm", "start" ]
specifically, links 'pull request' and 'contribute' at the start of page both link to address https://devopswithdocker.com/contributing which doesn't exist (and gives error message in finnish for english material)
Ask to submit used command for clarity
When I was doing Part 2 Section 1 (Migrating to Docker Compose) I ran into an issue after running docker compose build
with the given docker-compose.yml
:
version: '3.8'
services:
yt-dlp-ubuntu:
image: <username>/<repositoryname>
build: .
The first line of the ouput is WARN[0000] <pwd>/docker-compose.yml: `version` is obsolete
. I looked it up on google and found a closed issue docker/compose#11628. The resolution is that the attribute version
is not needed anymore and also, here's the docs section to back it up.
Plz help
Part-1, 3-in-depth-dive-to-images, building images instructs building with docker build
. That lacks the argument with the path to the directory that the Dockerfile resides in, eg: docker build .
.
The "Deployment pipelines" page's exercise 3.3 does not mention any shell files or maybe commands to submit.
When using the examples given in the text to create a Dockerfile for running the Rails app, the db:migrate
command fails due to a missing dependency. If all app files (not just Gemfile and Gemfile.lock) are instead copied into the container prior to running bundle install
, the migrate command executes without error, and the container builds and runs.
Create a Dockerfile from the examples in the text for the Rails app from the examples here, as below:
# We need ruby 3.1.0. I found this from Docker Hub
FROM ruby:3.1.0
EXPOSE 3000
WORKDIR /usr/src/app
# Install the correct bundler version
RUN gem install bundler:2.3.3
# Copy the files required for dependencies to be installed
COPY Gemfile* ./
# Install all dependencies
RUN bundle install
# Copy all of the source code
COPY . .
# We pick the production guide mode since we have no intention of developing the software inside the container.
# Run database migrations by following instructions from README
RUN rails db:migrate RAILS_ENV=production
# Precompile assets by following instructions from README
RUN rake assets:precompile
# And finally the command to run the application
CMD ["rails", "s", "-e", "production"]
docker build . -t rails-project && docker run -p 127.0.0.1:3000:3000 rails-project
docker build . -t rails-project && docker run -p 127.0.0.1:3000:3000 rails-project
[+] Building 11.0s (11/12)
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 746B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 34B 0.0s
=> [internal] load metadata for docker.io/library/ruby:3.1.0 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 5.81kB 0.0s
=> [1/8] FROM docker.io/library/ruby:3.1.0 0.0s
=> CACHED [2/8] WORKDIR /usr/src/app 0.0s
=> [3/8] COPY Gemfile* ./ 0.0s
=> [4/8] RUN gem install bundler:2.3.3 1.0s
=> [5/8] RUN bundle install 8.9s
=> [6/8] COPY . . 0.0s
=> ERROR [7/8] RUN rails db:migrate RAILS_ENV=production 1.0s
------
> [7/8] RUN rails db:migrate RAILS_ENV=production:
#11 0.966 rails aborted!
#11 0.968 LoadError: cannot load such file -- nokogiri
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:15:in `require'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:15:in `require'
#11 0.968 /usr/local/bundle/gems/loofah-2.13.0/lib/loofah.rb:4:in `<main>'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.968 /usr/local/bundle/gems/rails-html-sanitizer-1.4.2/lib/rails-html-sanitizer.rb:2:in `<main>'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.968 /usr/local/bundle/gems/actionview-7.0.1/lib/action_view/helpers/sanitize_helper.rb:3:in `<main>'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.968 /usr/local/bundle/gems/actionview-7.0.1/lib/action_view/helpers.rb:8:in `<main>'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.968 /usr/local/bundle/gems/sprockets-rails-3.4.2/lib/sprockets/rails/context.rb:1:in `<main>'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.968 /usr/local/bundle/gems/sprockets-rails-3.4.2/lib/sprockets/railtie.rb:10:in `<main>'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.968 /usr/local/bundle/gems/sprockets-rails-3.4.2/lib/sprockets/rails.rb:3:in `<main>'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.968 /usr/local/bundle/gems/bundler-2.3.3/lib/bundler/runtime.rb:73:in `rescue in block in require'
#11 0.968 /usr/local/bundle/gems/bundler-2.3.3/lib/bundler/runtime.rb:51:in `block in require'
#11 0.968 /usr/local/bundle/gems/bundler-2.3.3/lib/bundler/runtime.rb:44:in `each'
#11 0.968 /usr/local/bundle/gems/bundler-2.3.3/lib/bundler/runtime.rb:44:in `require'
#11 0.968 /usr/local/bundle/gems/bundler-2.3.3/lib/bundler.rb:176:in `require'
#11 0.968 /usr/src/app/config/application.rb:7:in `<main>'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:42:in `require_relative'
#11 0.968 /usr/src/app/Rakefile:4:in `<main>'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:48:in `load'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:48:in `load'
#11 0.968 /usr/local/bundle/gems/railties-7.0.1/lib/rails/commands/rake/rake_command.rb:20:in `block in perform'
#11 0.968 /usr/local/bundle/gems/railties-7.0.1/lib/rails/commands/rake/rake_command.rb:18:in `perform'
#11 0.968 /usr/local/bundle/gems/railties-7.0.1/lib/rails/command.rb:51:in `invoke'
#11 0.968 /usr/local/bundle/gems/railties-7.0.1/lib/rails/commands.rb:18:in `<main>'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.968 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.968 bin/rails:4:in `<main>'
#11 0.968
#11 0.968 Caused by:
#11 0.978 LoadError: cannot load such file -- sprockets-rails
#11 0.978 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:15:in `require'
#11 0.978 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:15:in `require'
#11 0.978 /usr/local/bundle/gems/bundler-2.3.3/lib/bundler/runtime.rb:60:in `block (2 levels) in require'
#11 0.978 /usr/local/bundle/gems/bundler-2.3.3/lib/bundler/runtime.rb:55:in `each'
#11 0.978 /usr/local/bundle/gems/bundler-2.3.3/lib/bundler/runtime.rb:55:in `block in require'
#11 0.978 /usr/local/bundle/gems/bundler-2.3.3/lib/bundler/runtime.rb:44:in `each'
#11 0.978 /usr/local/bundle/gems/bundler-2.3.3/lib/bundler/runtime.rb:44:in `require'
#11 0.978 /usr/local/bundle/gems/bundler-2.3.3/lib/bundler.rb:176:in `require'
#11 0.978 /usr/src/app/config/application.rb:7:in `<main>'
#11 0.978 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.978 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.978 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:42:in `require_relative'
#11 0.978 /usr/src/app/Rakefile:4:in `<main>'
#11 0.978 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:48:in `load'
#11 0.978 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:48:in `load'
#11 0.978 /usr/local/bundle/gems/railties-7.0.1/lib/rails/commands/rake/rake_command.rb:20:in `block in perform'
#11 0.978 /usr/local/bundle/gems/railties-7.0.1/lib/rails/commands/rake/rake_command.rb:18:in `perform'
#11 0.978 /usr/local/bundle/gems/railties-7.0.1/lib/rails/command.rb:51:in `invoke'
#11 0.978 /usr/local/bundle/gems/railties-7.0.1/lib/rails/commands.rb:18:in `<main>'
#11 0.978 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.978 /usr/local/bundle/gems/bootsnap-1.10.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
#11 0.978 bin/rails:4:in `<main>'
#11 0.978 (See full trace by running task with --trace)
------
executor failed running [/bin/sh -c rails db:migrate RAILS_ENV=production]: exit code: 1
The Dockerfile below first copies all app files into the container (including Gemfile and Gemfile.lock), before installing dependencies, this builds and runs OK.
# We need ruby 3.1.0. I found this from Docker Hub
FROM ruby:3.1.0
EXPOSE 3000
WORKDIR /usr/src/app
# Install the correct bundler version
RUN gem install bundler:2.3.3
# Copy all of the source code
COPY . .
# Copy the files required for dependencies to be installed
# COPY Gemfile* ./
# Install all dependencies
RUN bundle install
# We pick the production guide mode since we have no intention of developing the software inside the container.
# Run database migrations by following instructions from README
RUN rails db:migrate RAILS_ENV=production
# Precompile assets by following instructions from README
RUN rake assets:precompile
# And finally the command to run the application
CMD ["rails", "s", "-e", "production"]
The link below leads to apt-get install ... openssh-client
which does not match the description of the link.
The Dockerfile has this line where it declares that a volume should be created.
The third result, tutum/hello-world, is marked as “automated”. This means that the image is automatically built from the source repository. Its Docker Hub page shows its previous “Builds” and a link to the image’s “Source Repository” (in this case, to GitHub) from which Docker Hub builds the image.
tutum has been removed from the internets
youtube-dl has some outdated links in documentation and has not made releases in a long time. Many distributions seem to have switched to its fork yt-dlp, maybe course material could switch to that too.
Alternatively, nightly version of youtube-dl (ytdl-nightly) has more regular releases.
There is a short section after Exercise 2.3 discussing scaling.
In one of the code-blocks there is an example of cURLing some ports. However, the IP-address of these cURLs is 0.0.0.0:<some-port>
, while I believe they should be the loopback address referring to the host (127.0.0.1:<some-port>
)?
While I do think that the 0.0.0.0 should work, it does not on my Windows 10 device (big surprise). Could this IP-address be changed in the material or is there a reason why the 0.0.0.0
-address is superior?
Ardan Labs has a great blog post series about reducing Docker image sizes (https://www.ardanlabs.com/blog/2020/02/docker-images-part1-reducing-image-size.html). This is just a proposal to be considered if worth including in the material (Part 3 - Optimizing the Dockerfile).
On page https://devopswithdocker.com/part1/ @ Exercise: 1.7: Two line Dockerfile
Maybe add this text;
Windows users can find the dockers images from hidden network share named \wsl$
docker run -it --name looper ubuntu sh -c "while true; do echo 'Input website:'; read website; echo 'Searching..'; sleep 1; echo $website; curl http://
$website; done"
sh- komento ei saa muuttujaa asetettua PowerShellissä. Pitää lisätä esceippaus eli takahipsu muuttujalle. Esimerkki yllä. Esimerkissä takahipsu näkyy editointimoodissa muttei lopullisessa esimerkissä.
Esimerkki teetti hiukan työtä :)
Exercise 1.4
This link restart: unless-stopped needs to be updated due to the change in Docker Documentation.
IsAutomated field on docker search was deprecated earlier this year in version v25.0, source: https://docs.docker.com/engine/deprecated/#isautomated-field-and-is-automated-filter-on-docker-search and the section 3 of part 1 references that feature (https://devopswithdocker.com/part-1/section-3#where-do-the-images-come-from)
When command examples include also command output, sometimes output is indented by two spaces, sometimes it is not.
It would be nice if this was consistent. As non-indented version is what actually happens (at least on linux?), it might be better for PRs that also touch command examples.
Pretty sure this has something to do with these two: https://stackoverflow.com/questions/57926553/bundle-install-gives-bundlerdsldslerror
https://medium.com/@tahteche/how-git-treats-changes-in-file-permissions-f71874ca239d
chmod 644 Gemfile
and chmod 644 Gemfile.lock
fixed the issue.
Not sure whether the issue should be tackled within Dockerfile or just make a note into the building instructions, hence why I'm just creating this issue.
Maybe add a hint reminding of the importance of the trailing slash in in nginx.conf. Otherwise there might be some occurrences of disbelief & frustration amongst the students unfamiliar with nginx (like I) :).
Compilation always fails at the last step at [10/10] RUN rake assets:precompile
I tried several solutions to go about this issue:
Command "webpack" could not be found
RUN yarn install
to generate node_modules
as per https://stackoverflow.com/a/60700426/13756013Dockerfile
is created right before 1.11docker build . -t ruby-project
Any help would be appreciated!
The first time docker-compose up
is mentioned is without any explanation, and it doesn't seem to be explained later either.
I suggest that the command up
should be explained before its first usage. How does up
relate to other introduced commands build
, run
and push
?
As more of a side note, Docker Compose seems to be integrated within Docker CLI, so at least this specific usage of docker-compose
produces an info output, so it might be soon deprecated?
Example:
% docker-compose up -d
Docker Compose is now in the Docker CLI, try `docker compose up`
Run 'bundle install' gets the error: "Your bundle is locked to mimemagic (0.3.5), but that version could not be found..."
This can be fixed with run 'bundle update mimemagic' before 'bundle install'.
"Do exercise 1.2.1" (just before "Creating your own dockerized project" in part 1 in the material)
Exercises for part 1 go from 1.1 to 1.8.
There's also other similar references to exercises in the start of part 1:
"Do exercises 1.1.1 and 1.1.2"
There is a text missing when the inspection is done if a volume was created with docker container inspect db_redmine | grep -A 5 Mounts
. In this case, below the Mounts
snippet, the sentence is unfinished: "An indeed there is one! So despite we did not configure anything the ..." (sudden end). Can this be corrected?
Currently the Finnish social security number is formatted as xxxxxx-xxxx
in completion.md.
However that doesn't include people born in the 2000's who have a 'A' instead of '-'.
Maybe replace that as a more informative format like ddmmyy[-/A]XXXY
.
More info if deemed useful: dd
is day (01-31), mm
month (01-12), yy
year, -/A
is -
for persons born in 1900's and A
for 2000's. XXX
is individual number (integers) and Z
a checksum of range [0-9A-FHJ-NPR-Y]
.
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.