Giter VIP home page Giter VIP logo

zeabur / zbpack Goto Github PK

View Code? Open in Web Editor NEW
259.0 7.0 42.0 2.43 MB

Build your project into static assets, serverless function or container image with magic, no Dockerfile needed!

License: Mozilla Public License 2.0

Go 81.38% Python 1.63% JavaScript 0.61% Dockerfile 0.86% Rust 0.03% TypeScript 2.93% CSS 3.12% C# 0.24% Elixir 7.79% HTML 0.88% Shell 0.04% Nix 0.50%
build-tool buildpack docker go golang zeabur

zbpack's Introduction

zbpack

zbpack (pronounced “Zeabur Pack”) aims to automatically analyze the language, version, and framework used based on the source code and package the service into the most suitable deployment form, such as static resources, cloud functions, containers, or multiple types by one click. It is mainly used in the Zeabur platform as the build tool to determine the code type and build the container image automatically (without writing the Dockerfile manually.)

Components

zbpack is consist of the following components:

  • Planners: The planners are responsible for analyzing the source code and determining the type of the code. The planners are located in the internal directory.
  • zeaburpack library: The zeaburpack library is the library of zbpack that can be used in your platform directly. It is located in the pkg/zeaburpack directory.
  • CLI: The CLI is the command-line interface of zbpack for testing purpose. It is located in the cmd/zbpack directory.

Usage

Common Part

  1. Fork the repository and clone it to your local machine.
  2. Make sure you have Go installed on your machine. You can download it from the official website: https://golang.org/dl/
  3. Navigate to the root of the project and run go mod download to download the necessary dependencies.
  4. Make sure buildctl is installed and buildkitd is running.

zbpack

zbpack analyzes your projects, constructs the image recipes, and builds the container image automatically.

  1. Build the binary by running go build -o zbpack ./cmd/zbpack/main.go.
  2. Run the binary with ./zbpack [the directory to analyze and build].

You should see the build plan block and the subsequent build log block. The build plan block shows the metadata and the information (“recipes”) to build an image of this project. The build log block shows the build log of the container image, which is outputted by docker build.

Use -i or --info to show the build plan only.

$ ./zbpack --info ./tests/node-corepack

╔══════════════════════════ Build Plan ═════════════════════════╗
║ provider         │ nodejs                                     ║
║───────────────────────────────────────────────────────────────║
║ startCmd         │ node index.js                              ║
║───────────────────────────────────────────────────────────────║
║ packageManager   │ pnpm                                       ║
║───────────────────────────────────────────────────────────────║
║ framework        │ none                                       ║
║───────────────────────────────────────────────────────────────║
║ nodeVersion      │ 16                                         ║
║───────────────────────────────────────────────────────────────║
║ installCmd       │ pnpm install                               ║
╚═══════════════════════════════════════════════════════════════╝

Get some more usage information by using -h or --help.

Contributing

See CONTRIBUTING.md for more information.

License

zbpack is licensed under the Mozilla Public License 2.0. According to MPL 2.0 (and the summarization of Bing AI), if you want to use, modify or distribute MPL 2.0 software, you have the following rights and obligations:

  • You have the right to use, modify and distribute MPL 2.0 software for any purpose, without paying any fees.
  • You have the obligation to preserve the license notice, copyright notice and disclaimer in MPL 2.0 source code files.
  • You have the obligation to disclose any modifications you make to MPL 2.0 source code files, and to provide them to others under MPL 2.0 or a more permissive license.
  • You have the right to combine MPL 2.0 source code files with source code files under other licenses in a software, but you cannot change the license of MPL 2.0 source code files.
  • You have the right to choose to provide MPL 2.0 source code files to others under another compatible Copyleft license, such as GNU GPL, LGPL or AGPL.

Contributors

zbpack's People

Contributors

94mashiro avatar absundr avatar aetina-derrick-liu avatar aflybird0 avatar anshika-jain02 avatar charlie-117 avatar correctroadh avatar dependabot[bot] avatar hackerchai avatar harmeetsingh11 avatar imaegoo avatar itsalicelee avatar linuxsuren avatar liruifengv avatar michaelyuhe avatar pan93412 avatar s-ishita avatar waymedev avatar yuaanlin avatar zengzzzzz 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

zbpack's Issues

[bug] Runtime error encountered in `GetInstallCmd` (bun) function

Describe the bug

While running ./zbpack ./tests/bun-elysia, I encountered a runtime error. The error occurred in the GetInstallCmd function, with the specific stack trace as follows:

截圖 2023-11-17 中午12 20 09

Expected behaviour

When executing the GetInstallCmd function, the expectation is for it to accurately retrieve the installation command for the Bun project.

Additional context

No response

Code of Conduct

  • I agree to follow this project's Code of Conduct

[feature] Enhancement of README file of Repository

Is your feature request related to a problem? Please describe.

It's not directly related to any problem but It's not appealing for the README to be all left-aligned and also only text is there and so emojis or stickers.

Describe the solution you'd like

I would like to enhance the README by making its text centre aligned and adding some emojis/stickers with the headings to make the README more appealing and easy to understand.

Describe alternatives you've considered

No response

Additional context

No response

Code of Conduct

  • I agree to follow this project's Code of Conduct

Detecting the running status of the Docker daemon at program startup

Descriptive

If the Docker daemon is not running, zbpack will report the following error:

// MacOS and Apple M1 chip

ERROR: Cannot connect to the Docker daemon at unix:///Users/xxx/run/docker.sock. Is the docker daemon running?
failed to run docker build: exit status 1
Failed to build image: exit status 1
Build failed: exit status 1
panic: exit status 1

Reference

Go client for the Docker API

I would like to add this feature. Please assign this issue to me. If necessary, fell free to discuss it with me.

Merge zbpack and zbplan, make a one entry point

Descriptive

Merge zbpack and zbplan. zbplan just print information about user's project, it's important to note that zbplan is, in fact, part of zbpack.

After Merging, we can use the --info option to output information only.

Doing this job has the following benefits:

  1. This program has only one entry point, making it not confusing for users.
  2. Just release zbpack regularly.
  3. After each release, we can submit the program to a CLI program package manager, such as Homebrew.

Points to note:

  1. zbpack support analyze online Github repo, so when use --info option will support it.
  2. Since only show information, check Docker Daemon running status can skip.
  3. Update the corresponding documentations.

I'm willing to do some job to refactor it~

New Dockerfile template

Link: https://linear.app/zeabur/issue/ZEA-655

We used to construct Dockerfile by string concatenation; however, it messes up the codebase and adds complexity to reviewing the Dockerfile artifact.

We have refactored the construction of Dockerfile in nodejs and rust with text/template. However, the other planners are currently not refactored yet, and we are finding someone to refactor them (not limited to text/template, you can also try something like buildah!)

Addition of Pull Request Template

Pull Request Template means when someone opens a Pull Request, they will have a template that they can edit making it easier for maintainers of the project to review PR and make sure that no PR is submitted without proper description.

@zeabur Please assign this issue to me under Gssoc'23

Add depandabot

Is your feature request related to a problem? Please describe.

Proposal: DependaBot Integration for GitHub

Description: The DependaBot Integration for GitHub is a powerful tool that automates dependency management within GitHub repositories. It keeps project dependencies up to date by continuously monitoring for new releases and automatically creating pull requests to update outdated dependencies. This ensures repositories stay secure, stable, and aligned with the latest improvements in the open-source ecosystem.

Features:

  1. Automated Dependency Updates: DependaBot scans the project's dependencies, identifies outdated versions, and automatically creates pull requests with updated dependency versions.
  2. Continuous Monitoring: DependaBot continuously monitors dependency repositories, promptly detecting new releases and notifying repository maintainers.
  3. Customizable Update Policies: Repository maintainers can define their own update policies, specifying how frequently and to what extent dependencies should be updated.
  4. Version Constraint Management: DependaBot respects version constraints defined in project configuration files (e.g., package.json or requirements.txt), ensuring compatibility while upgrading dependencies.
  5. Detailed Reports and Insights: DependaBot provides comprehensive reports and insights on dependency updates, including release notes, changelogs, and compatibility information.

Describe the solution you'd like

By integrating DependaBot into GitHub repositories, development teams can significantly streamline their dependency management process, reduce security risks, and maintain a well-maintained and up-to-date project.

Describe alternatives you've considered

No response

Additional context

image

Code of Conduct

  • I agree to follow this project's Code of Conduct

[bug] Can't identify ruby version if use single-quoted style in Gemfile

Describe the bug

When I use rubocop to format my project, build status return fail.

After several tests, I suspect the follow code can't identify single-quoted setting.

reg := regexp.MustCompile(`ruby "(\d+\.\d+\.\d+)"`)

example:

In Gemfile

ruby "3.2.2" -> build succeed

ruby '3.2.2' -> build failed

Expected behaviour

single-quoted style should be identified as well.

Additional context

build succeed
noracami/demo-cd@9d4f7f5

build failed
noracami/demo-cd@8301e90

Code of Conduct

  • I agree to follow this project's Code of Conduct

next: use standalone server to minimize the docker image size

Link: https://linear.app/zeabur/issue/ZEA-779

  • Bundle the Next.js app with the standalone server to lightweight the image size and the resource footprint.
  • We don't help user enable the standalone server – but we pick standalone server when user enables it.
  • Determine if this project enables standalone server by checking the .next directory (next.config.js may be scattered in monorepos)
  • Write this logic in Dockerfile or on planning (better but harder).

Allow zbpack to generate a Dockerfile without executing it

Link: https://linear.app/zeabur/issue/ZEA-656

The Command-Line Interface of zbpack always builds the image without printing the Dockerfile artifact. I propose to add a new flag, --dry-run or --print to print out the artifacts to a directory.

$ zbpack --output-only (somewhere) /somewhere
$ ls somewhere
Dockerfile zeabur.json
$ cat zeabur.json
{"type": "docker", "path": ["Dockerfile"]}
$ cat Dockerfile
FROM alpine
CMD echo "This is awful, I won't touch it"

Note that, Zbpack not only has the function of generating Dockerfile, but also needs to consider other types of output, such as:

  • Which resources can be turned into static resources: handling requests with what kind of paths (regex).
  • Which requests should be dynamic.
  • What is the format of the function? (AWS Lambda, CloudFlare Worker)

For example, the output of a pure static framework only consists of static files, which can be served using our OSS. For a "static + function" scenario, it may look like this:

$ tree somewhere
`---vercel 
       `---- output
`---meta.json
$ cat meta.json
{"type": "static", "path": [".vercel/output"]}

At present, the builder only has the function of running containers, but we hope that in the future it can achieve functions such as "putting static files into OSS".

[feature] Support Dockerfile Output

Is your feature request related to a problem? Please describe.

First and foremost, I would like to extend my sincere thanks to the zbpack project.In my daily work, I need to engage in development using various programming languages. I use zbpack to build usable images in my local development/testing environment, which provides great convenience. However, as my company operates in the financial industry and is subject to some strict regulations, I cannot directly use the image in the pre-production/production environment. Therefore, I would like to be able to generate the Dockerfile needed to build the image. This would bring a lot of convenience to my work. 😃 😃

Describe the solution you'd like

Be able to output the Dockerfile needed for building the image during the image construction process using command line parameters (eg: -- dockerfile). Alternatively, do you think there are any aspects of outputting a Dockerfile that might be considered unreasonable?If you don't have any related development plans, I will implement it myself. The reason for raising this issue is to avoid redundant development work. 😃 😃

Describe alternatives you've considered

None

Additional context

None

Code of Conduct

  • I agree to follow this project's Code of Conduct

[feature] Better pnpm workspace support

Is your feature request related to a problem? Please describe.

In my full-stack pnpm monorepo project, I use the following structure to manage my project.

root
├── packages/
│  ├─ shared1/
│  ├─ shared2/
│  └─ ... # packages shared in this repo
└── apps/
   ├─ frontend/ # A frontend project, may use the shared lib
   └─ backend/  # A backend project, may use the shared lib

Now, zeabur can not properly handle the pnpm monorepo correctly.

For installation, the generated dockerfile only copy and install the deps in the root package.json.

For building, I use some monorepo manager to build all the shared library and frontend app (or backend app).

Describe the solution you'd like

Detect the pnpm workspaces, see details in the pnpm docs.

And then generate dockerfile like:

# ...
Copy package.json pnpm-lock.yaml .
Copy packages/shared1/packages.json ./packages/shared1/
Copy packages/shared2/packages.json ./packages/shared2/
RUN pnpm install
# ...

In my previous experience, docker does not support something like glob pattern?

Describe alternatives you've considered

No response

Additional context

No response

Code of Conduct

  • I agree to follow this project's Code of Conduct

add code of conduct

Hi there!
I recommend adding a CODE_OF_CONDUCT.md file to your repository. This file would serve as a guide for potential contributors, providing them with a clear set of expectations, guidelines, and behavior standards for participating in your project. It plays an essential role in creating a welcoming and inclusive environment for everyone involved.

I would like to work on this issue. Please assign it to me under GSSoC'23.

Thank you!

Use typed plan meta on Zeabur

Link: https://linear.app/zeabur/issue/ZEA-788

We currently exchange the context with map[string]any - which is not type safe. I propose to leverage the Go Generic, to exchange the context in a type-safe and reliable way.

// plan.go
package plan

type Plan interface {
  Get[T any](key string) (T, bool)
  Set[T any](key string, value T)

  Entries() map[string]any
}
// nodejs.go
package nodejs


type NodeJsPlan struct {
  PackageManager string
  NodeVersion string
  // ...
}

var _ plan.Plan = NodeJsPlan{}

func determinePlan() (NodeJsPlan, error) {}
func constructDockerfile(plan NodeJsPlan) (string, error) {}

func (p NodeJsPlan) Get[T any](key string) (T, bool) {...}
//...
// utils.go
func printPlans[T Plan](p T) {
  for key, val := range p.Entries() { ... }
}

improve the priority of nuxt

Is your feature request related to a problem? Please describe.

If we have installed nuxt and vite in the package.json at the same time, it will infer to vite but not nuxt.

if _, isVitepress := packageJSON.DevDependencies["vitepress"]; isVitepress {
*fw = optional.Some(types.NodeProjectFrameworkVitepress)
return fw.Unwrap()
}
if _, isWaku := packageJSON.Dependencies["waku"]; isWaku {
*fw = optional.Some(types.NodeProjectFrameworkWaku)
return fw.Unwrap()
}
if _, isVite := packageJSON.DevDependencies["vite"]; isVite {
*fw = optional.Some(types.NodeProjectFrameworkVite)
return fw.Unwrap()
}

if _, isNuxtJs := packageJSON.Dependencies["nuxt"]; isNuxtJs {
*fw = optional.Some(types.NodeProjectFrameworkNuxtJs)
return fw.Unwrap()
}
if _, isNuxtJs := packageJSON.DevDependencies["nuxt"]; isNuxtJs {
*fw = optional.Some(types.NodeProjectFrameworkNuxtJs)
return fw.Unwrap()
}

I think meta frameworks built with vite should have higher priority than vite itself, and the docs generator (like vitepress) should have the least priority between meta frameworks.

Describe the solution you'd like

Reorder like

  • ...
  • astro
  • nuxt
  • waku
  • vitepress
  • vite
  • ...

Describe alternatives you've considered

No response

Additional context

No response

Code of Conduct

  • I agree to follow this project's Code of Conduct

Printing the docker run command for dotnet apps

Context

zbpack will print the generic docker run -p 8080:8080 -it <docker-image> after docker image is built but this command does not work for dotnet apps.

Proposal

For dotnet apps, the port is configured under Properties/launchSettings.json, it needs to get the port from this file and then generate a docker run command.

close old issue

Is your feature request related to a problem? Please describe.

Proposal: Close Old Issue Bot
Description: The Close Old Issue Bot is an automated tool designed to identify and close inactive or resolved issues in a timely manner. It improves issue management efficiency by reducing clutter and ensuring active focus on relevant tasks.
Features:

  1. Issue Tracking: Monitors issue activity and identifies those that have remained inactive for a specified period.
  2. Automatic Closure: Closes old or resolved issues based on predetermined criteria, promoting a clean and organized issue tracker.
  3. Customizable Settings: Allows users to define their own criteria for determining issue activity and closure, adapting to the specific needs of their project.

Describe the solution you'd like

N/A

Describe alternatives you've considered

No response

Additional context

No response

Code of Conduct

  • I agree to follow this project's Code of Conduct

Add greeting bot

Is your feature request related to a problem? Please describe.

Proposal: Greeting Bot for GitHub with Automated Acknowledgment

Description: The Greeting Bot for GitHub is an intelligent chatbot designed to provide warm greetings and valuable information to new contributors and users on GitHub repositories. It enhances the onboarding experience by creating a welcoming atmosphere and offers automated acknowledgment in case no one is available to reply. It ensures that newcomers receive guidance and assistance even in the absence of immediate human interaction.

Features:

  1. Personalized Greetings: Delivers tailored greetings based on user information, fostering a friendly and engaging environment.
  2. Automated Acknowledgment: If no one is available to reply or acknowledge the greeting, the bot provides predefined responses, ensuring users feel acknowledged and supported.
  3. Welcome Message and Resources: Provides a comprehensive welcome message, including links to relevant resources, guidelines, and documentation to help users get started.
  4. Multi-platform Integration: Seamlessly integrates with GitHub repositories, extending greetings and support across various platforms, such as websites, mobile apps, and social media.
  5. Customizable Settings: Offers flexibility in customizing the bot's behavior, allowing repository owners to define fallback responses, timing intervals, and other parameters as per their specific needs.

Describe the solution you'd like

By implementing the Greeting Bot for GitHub with automated acknowledgment, repositories can ensure that new users receive a warm welcome and valuable information, fostering a positive onboarding experience, even when immediate human interaction may not be possible.

Describe alternatives you've considered

No response

Additional context

image

Code of Conduct

  • I agree to follow this project's Code of Conduct

elixir support

We are looking for a new contributor to help us add elixir support in zbpack.

Zeabur doesn's support elixir services now, but as a great programming language, some users may want to deploy elixir services on Zeabur.

If you have any questions or need help getting started, feel free to reach out to us in our Discord server. We are happy to provide guidance and support.

Run a regression test (snapshot test) for zbpack

Link: https://linear.app/zeabur/issue/ZEA-657

Regression testing (rarely, non-regression testing) is re-running functional and non-functional tests to ensure that previously developed and tested software still performs as expected after a change. If not, that would be called a regression. (Wikipedia, 2023)

The folder structure of the regression test can be like this:

-- zbpack (root)
 `- tests
  `- zea123-python-bug
   `- main.py
   `- requirements.txt
   `- expected.Dockerfile  <-- the working dockerfile

When the Dockerfile changes unexpectedly, it must be found in CI:

expected: ...
actual:   ...
diff:
  + ...
  - ...

Addition of dependabot.yml file

We need to add dependabot.yml file as it helps us to keep our dependencies up to date. Every day, it checks your dependency files for outdated requirements and opens individual PRs for any it finds.

@zeabur please assign me this issue under gssoc'23.

[feature]: add codeql workflow

Is your feature request related to a problem ? Please describe. ✍️

The repository contains code in go language, it does not have workflow for code scanning.

Code of Conduct

By submitting this issue, you agree to follow our Code of Conduct.

  • I follow the Contributing Guidelines of this project.
  • I have checked the current issues for duplicate problems.
  • I am a GSSoC23 Contributor.
  • I would like to be assigned this task.

Describe the solution you'd like

I will add the codeql.yml workflow to automate security checks. CodeQL is the code analysis engine developed by GitHub to identify vulnerabilities in code. It will analyze your code and display the results as code scanning alerts. It will be enabled on every push, commit and pull request using GitHub actions.

Describe alternatives you've considered

No response

Additional context

No response

Code of Conduct

  • I agree to follow this project's Code of Conduct

Running the command zbpack without any arguments should show usage information

Issue description

Currently, when you build and run the zbpack module without providing any arguments it executes the command which might not be the desired outcome

Suggested solution

When the zbpack module is executed without any arguments then it should show usage information


Please feel free to add more details, like what you would like to show on the console and what are the available options. If you think this makes sense, you could assign the task to me and I'll get started.

Missing Issue Template

Description:

I noticed that the repository does not have an issue template. Having an issue template can greatly improve the clarity and consistency of issue reports, making it easier for contributors and maintainers to understand and address the problems or feature requests effectively

Here are three templates that I want to include:

Issue Template: This template enables users to create well-structured issue reports by providing sections for a concise title, detailed description, steps to reproduce (if applicable), expected behavior, actual behavior, additional information, and environment details.

Feature Request Template: The feature request template allows users to outline their desired features with clarity, including sections for a clear feature description, expected benefits, and any additional context or information.

Documentation Template: This template facilitates the creation of comprehensive documentation by providing a structured format, including sections for an introduction, usage instructions, examples, and other relevant details.

Please assign this issue to me under Gssoc'23 @yuaanlin

Improving the readme file

I would like to work on improving the readme file of this project making it engaging for the users and make it more expressive.

Add Auto Comment Feature to Improve Collaboration

Issue Description:
As an active contributor to your open-source project, I believe that implementing an auto-comment feature would greatly enhance collaboration and communication within the project. This feature would automatically generate comments in response to specific events, such as when an issue is opened, a pull request is created, an issue is assigned, or an issue is unassigned.

Feature Details:

  • When an issue is opened, the auto-comment should greet the author and provide a brief acknowledgement and request for additional context.
  • When a pull request is opened, the auto-comment should greet the author, express gratitude, and remind them to follow the project's contributing guidelines.
  • When an issue is closed, the auto-comment should thank the author for their contribution and encourage further engagement.
  • When an issue is assigned to someone, the auto-comment should notify the assignee and encourage them to start working on it.
  • When an issue is unassigned from someone, the auto-comment should notify the assignee about the change and suggest reassignment if they are offline.

Benefits:

  • Improved communication and engagement with contributors.
  • Provides clear instructions and acknowledgements for various events.
  • Enhances collaboration by setting expectations and providing reminders.
  • Reduces manual effort by automating comment generation.

Acceptance Criteria:

  • The auto-comment feature should be implemented using the "wow-actions/auto-comment" GitHub Action.
  • Comments should be appropriately customized for each event, mentioning relevant parties and providing the necessary information.
  • The auto-comment workflow should trigger on the following events: issues opened, pull requests opened, issues closed, issues assigned, and issues unassigned.
  • The feature should be added to the project's existing GitHub Actions workflow file.

Additional Context:
Feel free to ask any questions or seek clarification regarding the auto-comment feature. I'm excited about contributing to your project and believe this enhancement will greatly benefit its community.

Update documentation

Hi @yuaanlin
I would like to improvize the documentation of readme.md file.

To complete the readme.md file, here are a few features I'd want to add:

  1. Adding a detailed description of the programs the project has been a part of. eg: GSSoC'23
  2. Adding "back to top" feature in readme.md file
  3. Adding the owner id

@yuaanlin Please assign me this issue under GSSoC'23 so that I can improvise and update Readme.md file.

.NET support

We are looking for a new contributor to help us add .NET support in zbpack.

Zeabur doesn's support .NET services now, but as a great programming language, some users may want to deploy .NET services on Zeabur.

If you have any questions or need help getting started, feel free to reach out to us in our Discord server. We are happy to provide guidance and support.

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.