Giter Club home page Giter Club logo

zig2nix's Introduction

zig2nix flake

Flake for packaging, building and running Zig projects.

https://ziglang.org/

  • Cachix: cachix use zig2nix

License: MIT

  • Zig git: git+5bf9dc3+2024-08-22 @ 2024-08-22
  • Zig master: 0.14.0-dev.1224+16d74809d @ 2024-08-21
  • Zig default: 0.13.0 @ 2024-06-07

Examples

Zig project template

nix flake init -t github:Cloudef/zig2nix
nix run .
# for more options check the flake.nix file

With master version of Zig

nix flake init -t github:Cloudef/zig2nix#master
nix run .
# for more options check the flake.nix file

Build zig from source

nix build github:Cloudef/zig2nix#zig.master.src

Running zig compiler directly

nix run github:Cloudef/zig2nix#env.master.bin.bare.zig -- version
nix run github:Cloudef/zig2nix#env.default.bin.bare.zig -- version
# Or simply these aliases
nix run github:Cloudef/zig2nix#master -- version
nix run github:Cloudef/zig2nix -- version

Convenience zig for multimedia programs

This sets (DY)LD_LIBRARY_PATH and PKG_CONFIG_PATH so that common libs are available

nix run github:Cloudef/zig2nix#env.master.bin.multimedia.zig -- version
nix run github:Cloudef/zig2nix#env.default.bin.multimedia.zig -- version

Shell for building and running a Zig project

nix develop github:Cloudef/zig2nix#env.master.bin.bare
nix develop github:Cloudef/zig2nix#env.default.bin.bare
# Or simply these aliases
nix develop github:Cloudef/zig2nix#master
nix develop github:Cloudef/zig2nix

Convenience shell for multimedia programs

This sets (DY)LD_LIBRARY_PATH and PKG_CONFIG_PATH so that common libs are available

nix develop github:Cloudef/zig2nix#env.master.bin.multimedia
nix develop github:Cloudef/zig2nix#env.default.bin.multimedia

Convert zon file to json

nix run github:Cloudef/zig2nix#zon2json -- build.zig.zon

Convert build.zig.zon to a build.zig.zon2json-lock

nix run github:Cloudef/zig2nix#zon2json-lock -- build.zig.zon
# alternatively output to stdout
nix run github:Cloudef/zig2nix#zon2json-lock -- build.zig.zon -

Convert build.zig.zon/2json-lock to a nix derivation

# calls zon2json-lock if build.zig.zon2json-lock does not exist (requires network access)
nix run github:Cloudef/zig2nix#zon2nix -- build.zig.zon
# alternatively run against the lock file (no network access required)
nix run github:Cloudef/zig2nix#zon2nix -- build.zig.zon2json-lock

Cross-compile nixpkgs using zig

This is very experimental, and many things may not compile.

nix build github:Cloudef/zig2nix#env.master.bin.cross.x86_64-windows-gnu.zlib
nix build github:Cloudef/zig2nix#env.default.bin.cross.x86_64-windows-gnu.zlib
# Or simply this alias that uses env.master.bin
nix build github:Cloudef/zig2nix#zigCross.x86_64-windows-gnu.zlib

Crude documentation

Below is auto-generated dump of important outputs in this flake.

#! Structures.

#:! Helper function for building and running Zig projects.
zig-env = {
 # Overrideable nixpkgs.
 nixpkgs ? self.inputs.nixpkgs,
 # Zig version to use.
 zig ? zigv.default.bin,
 # Additional runtime deps to inject into the helpers.
 customRuntimeDeps ? [],
 # Additional runtime libs to inject to the helpers.
 # Gets included in LD_LIBRARY_PATH and DYLD_LIBRARY_PATH.
 customRuntimeLibs ? [],
 # Custom prelude in the flake app helper.
 customAppHook ? "",
 # Custom prelude in the flake shell helper.
 customDevShellHook ? "",
 # Enable Vulkan support.
 enableVulkan ? false,
 # Enable OpenGL support.
 enableOpenGL ? false,
 # Enable Wayland support.
 enableWayland ? false,
 # Enable X11 support.
 enableX11 ? false,
 # Enable Alsa support.
 enableAlsa ? false,
}: { ... };

#! --- Outputs of zig-env {} function.
#!     access: (zig-env {}).thing

#! Returns true if target is nix flake compatible.
#! <https://github.com/NixOS/nixpkgs/blob/master/lib/systems/flake-systems.nix>
isFlakeTarget = with zig2nix-lib; args': let
 target-system = if isString args' then mkZigSystemFromString args' else args';
in any (s: (systems.elaborate s).config == (nixTripleFromSystem target-system)) systems.flakeExposed;


#! Returns crossPkgs from nixpkgs for target string or system.
#! This will always cross-compile the package.
crossPkgsForTarget = with zig2nix-lib; args': let
 target-system = if isString args' then mkZigSystemFromString args' else args';
 crossPkgs = import nixpkgs { localSystem = system; crossSystem = { config = nixTripleFromSystem target-system; }; };
 this-system = (systems.elaborate system).config == nixTripleFromSystem target-system;
in if this-system then pkgs else crossPkgs;

#! Returns pkgs from nixpkgs for target string or system.
#! This does not cross-compile and you'll get a error if package does not exist in binary cache.
binaryPkgsForTarget = with zig2nix-lib; args': let
 target-system = if isString args' then mkZigSystemFromString args' else args';
 binaryPkgs = import nixpkgs { localSystem = { config = nixTripleFromSystem target-system; }; };
 this-system = (systems.elaborate system).config == nixTripleFromSystem target-system;
in if this-system then pkgs else binaryPkgs;

#! Returns either binaryPkgs or crossPkgs depending if the target is flake target or not.
pkgsForTarget = args':
if isFlakeTarget args' then binaryPkgsForTarget args'
else crossPkgsForTarget args';

#! Cross-compile nixpkgs using zig :)
#! NOTE: This is an experimental feature, expect it not faring well
zigCrossPkgsForTarget = with zig2nix-lib; args': let
 target-system = if isString args' then mkZigSystemFromString args' else args';
 crossPkgs = pkgs.callPackage ./src/cross {
  inherit zig zigPackage allTargetSystems;
  inherit nixTripleFromSystem zigTripleFromSystem;
  inherit mkZigSystemFromPlatform mkZigSystemFromString;
  nixCrossPkgs = pkgsForTarget target-system;
  localSystem = system;
  crossSystem = { config = nixTripleFromSystem target-system; };
 };
in warn "zigCross: ${zigTripleFromSystem target-system}" crossPkgs;

#! Tools for bridging zig and nix
lib = zig2nix-lib;

#! Flake app helper (Without zig-env and root dir restriction).
app-bare-no-root = deps: script: {
 type = "app";
 program = toString (pkgs.writeShellApplication {
  name = "app";
  runtimeInputs = [] ++ deps;
  text = ''
   # shellcheck disable=SC2059
   error() { printf -- "error: $1\n" "''${@:2}" 1>&2; exit 1; }
   ${script}
  '';
 }) + "/bin/app";
};

#! Flake app helper (Without zig-env).
app-bare = deps: script: app-bare-no-root deps ''
 [[ -f ./flake.nix ]] || error 'Run this from the project root'
 ${script}
'';

#! Flake app helper (without root dir restriction).
app-no-root = deps: script: app-bare-no-root (deps ++ _deps) ''
 ${runtime.app}
 ${script}
'';

#! Flake app helper.
app = deps: script: app-bare (deps ++ _deps) ''
 ${runtime.app}
 ${script}
'';

#! Creates dev shell.
mkShell = pkgs.callPackage ({
 nativeBuildInputs ? [],
 ...
 } @attrs: pkgs.mkShellNoCC (attrs // {
 nativeBuildInputs = optionals (attrs ? nativeBuildInputs) attrs.nativeBuildInputs ++ _deps;
 shellHook = ''
  ${runtime.shell}
  ${attrs.shellHook or ""}
 '';
}));

#! Print external dependencies of zig project
showExternalDeps = app-no-root [] ''
 zig build --build-runner ${./src/build_runner.zig} "$@"
'';

#! Package for specific target supported by nix.
#! You can still compile to other platforms by using package and specifying zigTarget.
#! When compiling to non-nix supported targets, you can't rely on pkgsForTarget, but rather have to provide all the pkgs yourself.
#! NOTE: Even though target is supported by nix, cross-compiling to it might not be, in that case you should get an error.
packageForTarget = zigPackage;

#! Packages zig project.
#! NOTE: If your project has build.zig.zon you must first generate build.zig.zon2json-lock using zon2json-lock.
#!       It is recommended to commit the build.zig.zon2json-lock to your repo.
#!
#! Additional attributes:
#!    zigTarget: Specify target for zig compiler, defaults to stdenv.targetPlatform of given target.
#!    zigInheritStdenv:
#!       By default if zigTarget is specified, nixpkgs stdenv compatible environment is not used.
#!       Set this to true, if you want to specify zigTarget, but still use the derived stdenv compatible environment.
#!    zigPreferMusl: Prefer musl libc without specifying the target.
#!    zigDisableWrap: makeWrapper will not be used. Might be useful if distributing outside nix.
#!    zigWrapperArgs: Additional arguments to makeWrapper.
#!    zigBuildZon: Path to build.zig.zon file, defaults to build.zig.zon.
#!    zigBuildZonLock: Path to build.zig.zon2json-lock file, defaults to build.zig.zon2json-lock.
#!
#! <https://github.com/NixOS/nixpkgs/blob/master/doc/hooks/zig.section.md>
package = packageForTarget system;

#! Bundle a package into a zip
bundle.zip = pkgs.callPackage ./src/bundle/zip.nix { inherit packageForTarget; };


#! Bundle a package for running in AWS lambda
bundle.aws.lambda = pkgs.callPackage ./src/bundle/lambda.nix { bundleZip = bundle.zip; };

#! --- Architecture dependent flake outputs.
#!     access: `zig2nix.outputs.thing.${system}`

#! Helper functions for building and running Zig projects.
inherit zig-env zig2nix-lib zig-hook;

#! Prints available zig versions
apps.versions = with pkgs; test-app [ coreutils jq ] ''
 printf 'git\nmaster\ndefault\n'
 jq -r 'delpaths([["master"],["default"],["git"]]) | keys_unsorted | sort_by(split(".") | map(tonumber)) | reverse | .[]' ${./versions.json}
'';


#! Versioned Zig packages.
#! nix build .#zigv.master.bin
#! nix build .#zigv.master.src
#! nix run .#zigv.master.bin
#! nix run .#zigv.master.src
packages.zig = zigv;

#! Default zig package.
#! Latest released binary zig.
packages.default = zigv.default.bin;

#! zon2json: Converts zon files to json
packages.zon2json = zon2json;

#! zon2json-lock: Converts build.zig.zon to a build.zig.zon2json lock file
packages.zon2json-lock = zon2json-lock;

#! zon2nix: Converts build.zig.zon and build.zig.zon2json-lock to nix deriviation
packages.zon2nix = zon2nix;

#! Nixpkgs cross-compiled with zig
cross = env.pkgs.lib.genAttrs env.lib.allTargetTriples (t: env.zigCrossPkgsForTarget t);

#! Cross-compile nixpkgs with master zig
packages.zigCross = packages.env.master.bin.cross;

#! Run a version of a Zig compiler
#! nix run .#env."zig-version"."build"."type".zig
#! example: nix run .#env.master.src.bare.zig
#! example: nix run .#env.default.bin.multimedia.zig
zig = env.app-no-root [] ''zig "$@"'';

#! Print external dependencies of zig project
#! nix run .#env."zig-version"."build"."type".showExternalDeps
#! example: nix run .#env.master.src.bare.showExternalDeps
#! example: nix run .#env.default.bin.multimedia.showExternalDeps
inherit (env) showExternalDeps;

#! Master zig
apps.master = apps.env.master.bin.bare.zig;

#! Default zig
apps.default = apps.env.default.bin.bare.zig;

#! Master dev shell
devShells.master = devShells.env.master.bin.bare;

#! Default dev shell
devShells.default = devShells.env.default.bin.bare;

#! --- Generic flake outputs.
#!     access: `zig2nix.outputs.thing`

#! Overlay for overriding Zig with specific version (source).
overlays.zig.src = mapAttrs (k: v: (final: prev: {
 zig = v.src;
 inherit (outputs.packages) zon2json zon2json-lock zon2nix;
})) outputs.packages.${prev.system}.zig;

#! Overlay for overriding Zig with specific version (binary).
overlays.zig.bin = mapAttrs (k: v: (final: prev: {
 zig = v.bin;
 inherit (outputs.packages) zon2json zon2json-lock zon2nix;
})) outputs.packages.${prev.system}.zig;

#! mitchellh/zig-overlay compatible overlay.
overlays.zig-overlay = final: prev: {
 zigpkgs = mapAttrs (k: v: v.bin) outputs.packages.${prev.system}.zig;
 inherit (outputs.packages) zon2json zon2json-lock zon2nix;
};

#! Default overlay
overlays.default = overlays.zig.bin.default;

#! Default project template
#! nix flake init -t templates
templates.default = rec {
 path = ./templates/default;
 description = "Default Zig project template";
 welcomeText = welcome-template description;
};

#! Master project template
#! nix flake init -t templates#master
templates.master = rec {
 path = ./templates/master;
 description = "Master Zig project template";
 welcomeText = welcome-template description;
};

zig2nix's People

Contributors

573 avatar cloudef avatar github-actions[bot] 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

Watchers

 avatar  avatar  avatar

Forkers

573

zig2nix's Issues

question: sandboxed builds

Hello, I've been trying to package a super-html and noticed zig2nix doesn't produce sandboxed builds.

Would it be possible to achieve? Eg by replacing the zig pulling code with fetch*?

I'm not sure how feasible it would be, nor if it's worth it.

Or am I perhaps doing something wrong in packaging that application?

request: Include zls in devShell

Thanks for making this flake!

I was thinking that it'd be nice if zls was included in the devShell, or at least optionally. Especially since at the moment in nixpkgs zig is 0.13 but zls is stuck at 0.12.

Merge Cloudef/nix-appimage into this project

Allows bundling AppImages with statically linked musl appimage runtime and loader which setups user namespace mount with /nix and also some optional runtime code that can try to construct compatible runtime on non-FHS distros. The loader/runtime part is already here https://github.com/Cloudef/zig2nix/tree/master/src/bundle/loader

Since https://github.com/Cloudef/zig2nix/blob/master/src/bundle/zip.nix already creates the structure of what would be inside the appimage, I think this can be reused.

Doesn't correctly fetch with `zon2json-lock`

When running it on zfe:

nix run github:Cloudef/zig2nix#zon2json-lock
fetching (nix hash): git+https://github.com/rockorager/libvaxis#75ac36ca61999c2f29467e02016322551e98bbd7
fetching (nix hash): git+https://github.com/zigimg/zigimg#3a667bdb3d7f0955a5a51c8468eac83210c1439e
fetching (nix hash): git+https://github.com/ryleelyman/GapBuffer.zig#main
Initialized empty Git repository in /tmp/git-checkout-tmp-LeiVxBil/GapBuffer.zig-main/.git/
fatal: couldn't find remote ref refs/tags/main
From https://github.com/ryleelyman/GapBuffer.zig
 * branch            HEAD       -> FETCH_HEAD
fatal: Not a valid object name
Unrecognized git object type:
Unable to checkout refs/tags/main from https://github.com/ryleelyman/GapBuffer.zig

When running it on flow:

nix run github:Cloudef/zig2nix#zon2json-lock
fetching (nix hash): https://github.com/Hejsil/zig-clap/archive/c0193e9247335a6c1688b946325060289405de2a.tar.gz
fetching (nix hash): https://github.com/neurocyte/zig-tracy/archive/58999b786089e5319dd0707f6afbfca04c6340e7.tar.gz
fetching (nix hash): https://github.com/wolfpld/tracy/archive/refs/tags/v0.10.tar.gz
fetching (nix hash): https://github.com/neurocyte/dizzy/archive/455d18369cbb2a0458ba70be919cd378338d695e.tar.gz
fetching (zig fetch): https://github.com/neurocyte/thespian/archive/b82d73557966428ac7db1507bb5a4b800ac6207c.tar.gz
fetching (nix hash): https://github.com/neurocyte/thespian/archive/b82d73557966428ac7db1507bb5a4b800ac6207c.tar.gz
fetching (nix hash): https://github.com/neurocyte/asio/archive/b9c9c23ef2e6f11b6123535ec33e5a23ed0c59da.tar.gz
fetching (nix hash): https://github.com/neurocyte/flow-themes/releases/download/master-15e8cad1619429bf2547a6819b5b999510d5c1e5/flow-themes.tar.gz
fetching (zig fetch): https://github.com/neurocyte/flow-syntax/archive/d476a9a178369822b1d7f3df07e8115980fbbaa7.tar.gz
fetching (nix hash): https://github.com/neurocyte/flow-syntax/archive/d476a9a178369822b1d7f3df07e8115980fbbaa7.tar.gz
fetching (zig fetch): https://github.com/neurocyte/tree-sitter/releases/download/master-93fd2b9c4f082e0cf88eec21846977ba832957af/source.tar.gz
fetching (nix hash): https://github.com/neurocyte/tree-sitter/releases/download/master-93fd2b9c4f082e0cf88eec21846977ba832957af/source.tar.gz
fetching (nix hash): https://github.com/fjebaker/fuzzig/archive/0fd156d5097365151e85a85eef9d8cf0eebe7b00.tar.gz
fetching (zig fetch): https://github.com/rockorager/libvaxis/archive/40e51ad0542ea964190db411292660c274e2a984.tar.gz
fetching (nix hash): https://github.com/rockorager/libvaxis/archive/40e51ad0542ea964190db411292660c274e2a984.tar.gz
fetching (nix hash): git+https://github.com/zigimg/zigimg#3a667bdb3d7f0955a5a51c8468eac83210c1439e
fetching (nix hash): git+https://github.com/ryleelyman/GapBuffer.zig#main
Initialized empty Git repository in /tmp/git-checkout-tmp-CUtvrSeL/GapBuffer.zig-main/.git/
fatal: couldn't find remote ref refs/tags/main
From https://github.com/ryleelyman/GapBuffer.zig
 * branch            HEAD       -> FETCH_HEAD
fatal: Not a valid object name
Unrecognized git object type:
Unable to checkout refs/tags/main from https://github.com/ryleelyman/GapBuffer.zig.

How to build for AWS lambda?

Hello, I have an AWS lambda function written in Zig and I want to use the lambda bundler provided by zig2nix. This is the relevant code of my flake.nix:

    packages = forAllSystems (pkgs: let
      env = zig2nix.outputs.zig-env.${pkgs.system} {};
      target = "aarch64-linux";
      skia = ((env.pkgsForTarget target).callPackage ./nix/minimal-skia.nix {});
    in rec {
      exporter-lambda = env.packageForTarget target {
        src = ./.;
        zigPreferMusl = false;
        zigDisableWrap = false;
        buildInputs = [ skia ];
        zigBuildFlags = [
          "-Dskia-include=${skia.dev}/include"
          "-Dskia-lib=${skia.out}/lib"
        ];
      };
      aws = env.bundle.aws.lambda {
        package = exporter-lambda;
        arch = "aarch64";
      };
    });

(minimal-skia.nix is essentially a modified version of this package with useless dependencies removed)

in my build.zig I'm doing something like:

const skia_include = b.option([]const u8, "skia-include", "path to skia include dir");
const skia_lib = b.option([]const u8, "skia-lib", "path to skia lib dir");
// ...
if (skia_include) |include| {
  exe.addIncludePath(.{ .cwd_relative = include });
}
if (skia_lib) |lib| {
  exe.addLibraryPath(.{ .cwd_relative = lib });
}

But when trying to nix build .#aws I'm getting this error:

error:
       … while calling the 'derivationStrict' builtin

         at /builtin/derivation.nix:9:12: (source not available)

       … while evaluating the derivation attribute 'name'

         at /nix/store/0jr2kk95c34c0b6yxi75q4fqgb43kqkm-source/pkgs/stdenv/generic/make-derivation.nix:334:7:

          333|     // (optionalAttrs (attrs ? name || (attrs ? pname && attrs ? version)) {
          334|       name =
             |       ^
          335|         let

       (stack trace truncated; use '--show-trace' to show the full trace)

       error: architecture  is not supported

What could I be doing wrong? Thanks

Provide way to bundle old glibc with app

Unfortunate issue with linux is that, if you want to do graphics you need to dlopen or dynamic link, this requires libc bundled or compiling the app with dynamic symbols exported. Glibc isn't backwards compatible, only forwards. Zig already handles compiling against older glibc, but it does not actually provide the library itself, so provide a glibc you can bundle with your program would be nice.

Binding Wayland

Hello,

I am trying to use the wayland-client headers and libraries in my zig project. I tried to include wayland vai the enableWayland = true; flag but the zig builder still fails to find it when running nix build. I also tried setting LD_LIBRARY_PATH, LIBRARY_PATH, NIX_LDFLAGS, and NIX_CFLAGS_COMPILE manually in the packages.target but the zig builder still cannot find it as I assumed it would from NativePaths.detect.

My build.zig is really simple for this and only has:

exe.linkLibC();
exe.linkSystemLibrary("wayland-client");

Thanks and let me know what other information to provide!

Consider using zig compiler itself to do the build.zig.zon conversion.

While zon2json works right now for any build.zig.zon files I've thrown at it. The ast walker itself isn't really complete. Zon files itself are literally zig structs, so they may contain actual zig expressions I don't intend to maintain a zig interpreter so consider instead making zon2json a program that depends on zig compiler that generates a program that does something like:

const zon = <insert .zon contents here>;
std.io.getStdout().writer().print("{s}", std.json.fmt(zon, .{}));

This would make sure zon files are always handled properly. cons might be speed, but zig should cache the outputs.

At some point it might become possible to import zon files as well: ziglang/zig#14531

ref: ziglang/zig#15552

Automated nightlies blocked temporarily

There is breaking package manager bug upstream that breaks git+https urls.
This causes zig2nix's zon2json-lock CI tests to fail currently.
Instead of disabling the git url test, I'll decide to wait until the bug is fixed upstream instead (looks like fix will be in next nightly?)

ziglang/zig#18967

Function to build a zig project repo externally

Would it be possible / reasonable to have a function that just takes the source and returns the exe?

For example, I would like to add hevi and flow to my nixos config without forking and adding a flake. Is there a way to do that with this flake? Either as a snippet or a feature?

{
  inputs = {
    # ...

    zig2nix.url = "github:Cloudef/zig2nix";
    hevi = {
      url = "github:Arnau478/hevi";
      flake = false;
    };
    flow = {
      url = "github:neurocyte/flow";
      flake = false;
    };
  };

  outputs = { self, nixpkgs, hevi, flow, ... }@inputs:
    let
      inherit (self) outputs;

      hevi-bin = zig2nix.lib.build hevi;
      flow-bin = zig2nix.lib.build flow;

      forAllSystems = nixpkgs.lib.genAttrs [
        "x86_64-linux"
        "aarch64-linux"
        "i686-linux"
        "x86_64-linux"
        "aarch64-darwin"
        "x86_64-darwin"
      ];
    in { ... };
}

Rewrite nix <-> zig target handling

Use the output of zig targets and auto generate as much as possible. On zig it's also possible to target specific macos versions that currently are impossible to sanely describe in zig2nix.

Writing tool using zig itself to handle this mapping is way to go I think.

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.