Coder Social home page Coder Social logo

ziputility-unreal's Introduction

ZipUtility Plugin

GitHub release Github All Releases

Event driven, blueprint accessible flexible 7zip compression, archiver, and file manipulation plugin for the Unreal Engine. Built on 7zip-cpp modernization of the SevenZip++ C++ wrapper for accessing the 7-zip COM-like API in 7z.dll and 7za.dll.

Supports the following compression algorithms: 7Zip, GZip, BZip2, RAR, TAR, ISO, CAB, LZMA, LZMA86.

Plugin works in Windows only.

Main Forum Thread

Quick Install & Setup

  1. Download
  2. Create new or choose project.
  3. Browse to your project folder (typically found at Documents/Unreal Project/{Your Project Root})
  4. Copy Plugins folder into your Project root.
  5. Restart the Editor and open your project again. Plugin is now ready to use.

Note on compiling

If you're recompiling for e.g. another engine build or packaging you will need to ensure you have ATL installed.

  1. Open Visual Studio Installer -> Modify.
  2. Click on the Individual components and scroll down to Visual C++ ATL for x86 and x64.
  3. (Optional) It's probably a good idea to ensure you have Visual C++ MFC for x86 and x64 included as well.
  4. After installation has completed, the plugin should auto-detect your ATL include location and compile correctly.

Blueprint Access

Right click anywhere in a desired blueprint to access the plugin Blueprint Function Library methods. The plugin is completely multi-threaded and will not block your game thread, fire and forget.

Right Click

Optional but highly recommended: Add ZipUtilityInterface to your blueprint if you wish to be notified of the progress, e.g. when your archive has finished unzipping or if you wish to display a progress bar.

Add Interface

After you've added the interface and hit Compile on your blueprint you'll have access to the Progress and List events

Events

They're explained in further detail below.

Zipping and Compressing Files

To Zip up a folder or file, right click your event graph and add the Zip function.

Specify a path to a folder or file as a target.

Leave the Compression format to the default SevenZip or specify a format of choice, the plugin automatically appends the default extension based on the compression format. Note that not all compression formats work for compression (e.g. RAR is extract only).

Zip Function Call

Unzipping and Extracting Files

To Unzip up a file, right click your event graph and add the Unzip function.

Specify the full path to a suitable archive file.

The plugin automatically detects the compression format used in the archive, but you can alternatively specify a specific format using the UnzipWithFormat method.

Unzip Function Call

Listing Contents in an Archive

To list files in your archive, right click your event graph and add the ListFilesInArchive function.

Specify the full path to a suitable archive file. This function requires the use of the ZipUtilityInterface callback OnFileFound, so ensure you have ZipUtilityInterface added to your blueprint.

List Files Function Call

The OnFileFound event gets called for every file in the archive with its path and size given in bytes. This function does not extract the contents, but instead allows you to inspect files before committing to extracting their contents.

Events & Progress Updates

By right-clicking in your blueprint and adding various ZipUtility events, you can get the status of zip/unzip operations as they occur. All callbacks are received on the game thread. To receive callbacks you must satisfy two requirements:

  1. Implement the ZipUtilityInterface interface in your blueprint from the Class Settings menu
  2. Pass a reference to self (or a reference to the class that implements ZipUtilityInterface) to all zip/unzip functions

All events pass along the name of the archive being operated on. Since multiple events can be running in parallel, the archive name is useful to uniquely match events with operations.

Event Table

Event Details
OnStartProcess Called when the zip/unzip operation begins
OnProgress Called periodically while a zip/unzip operation is running to provide the overall status of the operation
OnFileDone Called for every file that is done being zipped/unzipped
OnDone Called when the entire zip/unzip operation has completed
OnFileFound Called for every file that is found as the result of a ListFilesInArchive call

Progress Updates

Stopping Operations

Most of the Zip and Unzip methods return a pointer to a ZipOperation. This pointer can be used to terminate an operation that is still running by calling the StopOperation function.

The returned pointer to ZipOperation will be Garbage Collected if it is not stored as an Object Reference or in C++ in a UPROPERTY declared pointer. So don't store ZipOperation as a soft reference/pointer. It is safe to completely ignore the returned ZipOperation if you do not care about manually terminating the operation.

Unzip Function Call

Convenience File Functions

Move/Rename a File

Specify full path for the file you wish to move and it's destination

Move File

To rename it, simply change the destination name

Rename Folder

Create/Make Directory

Make Directory

List Contents of Folder

Expects self to be a FileListInterface

List Contents

C++

Setup

To use the C++ code from the plugin add it as a dependency module in your project build.cs e.g.

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "ZipUtility"});

then #include "ZipFileFunctionLibrary.h" in the places where you'd like to use the plugin functionality.

call the static function with done and progress callback lambdas e.g. if you're interested in both

UZipFileFunctionLibrary::UnzipWithLambda(FString("C:/path/to/your/zip.7z"),
    []()
    {
         //Called when done
    },
    [](float Percent)
    {
         //called when progress updates with % done
    });

replace either with nullptr if you're not interested in that callback

call the static function with done and progress callback lambdas e.g. if you're interested in both

UZipFileFunctionLibrary::ZipWithLambda(FString("C:/path/to/your/zip.7z"),
    []()
    {
         //Called when done
    },
    [](float Percent)
    {
         //called when progress updates with % done
    });

replace either with nullptr if you're not interested in that callback

Your own class with IZipUtilityInterface

Let's say you have a class called UMyClass. You then add the IZipUtilityInterface to it via multiple inheritance e.g.

class UMyClass : public UObject, public IZipUtilityInterface
{
   GENERATED_BODY()
   ...
};

Because the events are of the type BlueprintNativeEvent you add the C++ implementation of the events like so

class UMyClass : public UObject, public IZipUtilityInterface
{
    GENERATED_BODY()
    ...

    //event overrides
    virtual void OnProgress_Implementation(const FString& archive, float percentage, int32 bytes) override;
    virtual void OnDone_Implementation(const FString& archive, EZipUtilityCompletionState CompletionState) override;
    virtual void OnStartProcess_Implementation(const FString& archive, int32 bytes) override;
    virtual void OnFileDone_Implementation(const FString& archive, const FString& file) override;
    virtual void OnFileFound_Implementation(const FString& archive, const FString& file, int32 size) override;
};

ensure you have at least an empty implementation for each function

void UMyClass::OnProgress_Implementation(const FString& archive, float percentage, int32 bytes)
{
    //your code here
}

To call a ZipUtility function you first get a valid pointer to your class (I leave that up to you) e.g.

UMyClass* MyZipClass = NewObject<UMyClass>(); //or you may already have a valid pointer from allocating elsewhere

then to e.g. unzip you pass the pointer to your class with the IZipUtilityInterface as your second parameter (and if you use them, any other optional parameters such as compression format). If you are calling the zip functions from within the class that implements IZipUtilityInterface then you can simply pass this:

UZipFileFunctionLibrary::Unzip(FString("C:/path/to/your/zip.7z"), MyZipClass);

See ZipFileFunctionLibrary.h for all the function signatures.

See ZULambdaDelegate.h for an example class using the above setup to convert IZipUtilityInterface interface calls into lambda functions.

Windows Utility

For windows utility functions, the callback setup is similar, kindly refer to WindowsFileUtilityFunctionLibrary.h which may use IWFUFileListInterface or IWFUFolderWatchInterface depending on functions used.

License

MIT for ZipUtility and 7z-cpp

LGPL for 7za.dll, LGPL + Unrar for 7z.dll

See license file for details.

Help

Add any issues you run across to https://github.com/getnamo/ZipUtility-Unreal/issues

or post to the unreal forum thread.

ziputility-unreal's People

Contributors

deams51 avatar error454 avatar getnamo avatar xorboo avatar xpopsx avatar zfyu222 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

ziputility-unreal's Issues

Unable to package project

Hi, i'm trying to package my project but i got an error:
D:\UE4\Project\Launcher\Plugins\ZipUtility\ThirdParty\7zpp\Include\7zpp.h(29): fatal error C1083: Impossible d'ouvrir le fichier include�: 'atlbase.h'�: No such file or directory

I mean it can be this or another plugin but i've also this:
UATHelper: Packaging (Windows (64-bit)): ZipUtility Error: Couldn't find an ATLPath, fix it in ZipUtility.Build.cs UATHelper: Packaging (Windows (64-bit)): D:\UE4\Project\Launcher\Plugins\ZipUtility\Source\ZipUtility\ZipUtility.Build.cs: warning: Referenced directory 'D:\UE4\Project\Launcher\Plugins\ZipUtility\Source\include' does not exist. PackagingResults: Error: can't find VS path: System.IO.DirectoryNotFoundException: Impossible de trouver une partie du chemin d'accès 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC'. PackagingResults: Error: Couldn't find an ATLPath, fix it in ZipUtility.Build.cs PackagingResults: Warning: Referenced directory 'D:\UE4\Project\Launcher\Plugins\ZipUtility\Source\include' does not exist

So if u can help me

Straight up crashes my project

its likely its something on my side, but whenever i run the node my project freezes and then crashes.
here is the file path im giving it: F:/Games/Steam/steamapps/common/Paradiddle/Paradiddle/Saved/songs/R U Mine

Iv also stuck the link into double quotes like this ("'F:/Games/Steam/steamapps/common/Paradiddle/Paradiddle/Saved/songs/R U Mine'") but no luck there.
here is my full setup
Note: This Song Location = F:\Games\Steam\steamapps\common\Paradiddle\Paradiddle\Saved\songs\R U Mine
image

And here is the error:
Fatal error!

Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0x0000000000000010

0x00007ff825e4cc0c UE4Editor-ZipUtility.dll!UnknownFunction []
0x00007ff825e50c25 UE4Editor-ZipUtility.dll!UnknownFunction []
0x00007ff8614cae84 UE4Editor-CoreUObject.dll!UnknownFunction []
0x00007ff8614cd4ef UE4Editor-CoreUObject.dll!UnknownFunction []
0x00007ff8614a22fd UE4Editor-CoreUObject.dll!UnknownFunction []
0x00007ff861476b6a UE4Editor-CoreUObject.dll!UnknownFunction []
0x00007ff8614a1ef1 UE4Editor-CoreUObject.dll!UnknownFunction []
0x00007ff8614a22fd UE4Editor-CoreUObject.dll!UnknownFunction []
0x00007ff8614a1704 UE4Editor-CoreUObject.dll!UnknownFunction []
0x00007ff861212604 UE4Editor-CoreUObject.dll!UnknownFunction []
0x00007ff8614a0e63 UE4Editor-CoreUObject.dll!UnknownFunction []
0x00007ff8584c208b UE4Editor-UMG.dll!UnknownFunction []
0x00007ff85855e31e UE4Editor-UMG.dll!UnknownFunction []
0x00007ff860d40663 UE4Editor-Slate.dll!UnknownFunction []
0x00007ff860b846be UE4Editor-Slate.dll!UnknownFunction []
0x00007ff860c07f14 UE4Editor-Slate.dll!UnknownFunction []
0x00007ff860bf0337 UE4Editor-Slate.dll!UnknownFunction []
0x00007ff860be3632 UE4Editor-Slate.dll!UnknownFunction []
0x00007ff89c77bcb5 UE4Editor-ApplicationCore.dll!UnknownFunction []
0x00007ff89c769197 UE4Editor-ApplicationCore.dll!UnknownFunction []
0x00007ff89c77e389 UE4Editor-ApplicationCore.dll!UnknownFunction []
0x00007ff89c764310 UE4Editor-ApplicationCore.dll!UnknownFunction []
0x00007ff8bf3ae858 USER32.dll!UnknownFunction []
0x00007ff8bf3ae299 USER32.dll!UnknownFunction []
0x00007ff89c77f914 UE4Editor-ApplicationCore.dll!UnknownFunction []
0x00007ff6b19e8848 UE4Editor.exe!UnknownFunction []
0x00007ff6b1a0117c UE4Editor.exe!UnknownFunction []
0x00007ff6b1a0125a UE4Editor.exe!UnknownFunction []
0x00007ff6b1a152bd UE4Editor.exe!UnknownFunction []
0x00007ff6b1a17fea UE4Editor.exe!UnknownFunction []
0x00007ff8c10d7034 KERNEL32.dll!UnknownFunction []
0x00007ff8c12e2651 ntdll.dll!UnknownFunction []

Crash in packaged game.

Just log..

Error: === Critical error: ===
Fatal error!

And in editor mode it wroks well.
WIndows 10
UE4.12.5

Possible file lock after zip?

Hi author,
I'm having a really weird issue atm. Zipping is fine, file is created, I can view the file from browser. However if I attempt to read the file to array using
FFileHelper::LoadFileToArray,
it fails sometimes, very inconsistent. Any idea what's the cause?
Thanks a lot

My editor crashes

so i have it to unzip a file right at the start of the game but, the whole editor crashes and it says:

Assertion failed: O->GetClass()->ImplementsInterface(UZipUtilityInterface::StaticClass()) [File:C:/Users/Admin/Documents/GitHub/ZipUtilityWork/Plugins/ZipUtility-ue4/Intermediate/Build/Win64/UE4Editor/Inc/ZipUtility/ZipUtilityInterface.gen.cpp] [Line: 531]

UE4Editor_Core
UE4Editor_Core
UE4Editor_ZipUtility
UE4Editor_ZipUtility
UE4Editor_Core
UE4Editor_Core
UE4Editor_Core
UE4Editor_Engine
UE4Editor
UE4Editor
UE4Editor
UE4Editor
UE4Editor
kernel32
ntdll

Ability to cancel lambdas

I have started to look into the minimum viable changes to be able to cancel in-flight unzip operations. I'm generally a little confused so wanted to ask for some advice.

In WFULambdaRunnable, I see FThreadSafeBool Finished. This is set to true/false in a few places to track the state of the runnable but is never actually polled anywhere that I can find. I was reading the comments in #11, which makes it sound like the ability to cancel early was on the TODO list.

My other point of confusion is that the 7zip library extraction routines are a single call, they're not called in some looped Runnable where bailing out early via flag is an option. So it seems to me that the only way to actually cancel a started zip operation is to pull the rug out from under it and kill the thread entirely.

Digging a little into the 7z library, I found this question which seems to indicate the use of CheckBreak(). I need to spend more time in the 7z library code to understand how this works. I feel this is probably the best path to shake out first. I wanted to see if you had any ideas for cleanly killing an in-flight zip operation that might guide me down a better path... if I have to dip into the 7z plugin side I may also investigate adding password support and in-memory extraction while I'm there.

Possible race condition in WFULambdaRunnable

In file WFULambdaRunnable.cpp from commit 5208dd878aaf51ba2520b26c1f2124bf6402f699 in line 16 takes place creation of thread.

Thread = FRunnableThread::Create(this, *threadStatGroup, 0, TPri_BelowNormal); //windows default = 8mb for thread, could specify more

Freshly created thread could end before execution of this line is done.
In such a case:

  1. Finished thread call virtual method Stop Exit from line 56.
  2. Stop Exit destroys heap allocated this object.
  3. Then comes execution of line 17 16, which is accessing member Thread of just destroyed this object, that could lead to memory corruption.

Possible solution is to use FCriticalSection to ensure atomic execution of WFULambdaRunnable constructor as well as Stop Exit method.

VS2017 C4577 when Packaging

I'm on latest/greatest ZipUtility and have been having some issues since switching over to VS2017. The problem is occurring both on 4.19 and 4.21 engine builds for me.

Everything works great in the editor and I can zip and unzip all day long. When I go to package, I get C4577:

    [14/16] Module.ZipUtility.cpp
    C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\INCLUDE\vcruntime_new.h(71): error C4577: 'noexcept' used with no exception handling mode specified; termination on exception is not guaranteed. Specify /EHsc

If I add bEnableExceptions = true; to ZipUtility.Build.cs then I'm able to finish packaging, however now all zip operations fail immediately (Extractor.ExtractFilesFromArchive always returns false). I'm making a custom build of the 7zip-cpp so I can debug further. I'm just wondering why nobody else has encountered C4577, it makes me think something is wrong in my environment.

There's this popular discussion on C4577 in UE4, which is where I got the idea to enable exceptions outright in the module.

Compression ratio

Doesn't appear to actually compress the data significantly on e.g. a folder. Will need more investigation into why.

Unable To Generate Project Files After Adding Plugin

UBT will no longer generate project files after adding this plugin.

@progress 'Binding IntelliSense data...' 0%

ERROR: Unable to determine module type for ...\Engine\Plugins\Community\ZipUtility\Source\WindowsUtility\WindowsFileUtility.Build.cs

ZipUtility-v1.1.1-UE5.1 deploy android error

Running d:\Program Files\Epic Games\UE_5.1\Engine\Build\BatchFiles\Build.bat -Target="RedStoryEditor Win64 Development -Project=""d:/Unreal Projects/RedStory/RedStory.uproject""" -LiveCoding -LiveCodingModules="d:/Program Files/Epic Games/UE_5.1/Engine/Intermediate/LiveCodingModules.txt" -LiveCodingManifest="d:/Program Files/Epic Games/UE_5.1/Engine/Intermediate/LiveCoding.json" -WaitMutex -LiveCodingLimit=100
Running UnrealBuildTool: dotnet "....\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll" -Target="RedStoryEditor Win64 Development -Project=""d:/Unreal Projects/RedStory/RedStory.uproject""" -LiveCoding -LiveCodingModules="d:/Program Files/Epic Games/UE_5.1/Engine/Intermediate/LiveCodingModules.txt" -LiveCodingManifest="d:/Program Files/Epic Games/UE_5.1/Engine/Intermediate/LiveCoding.json" -WaitMutex -LiveCodingLimit=100
Log file: C:\Users\Administrator\AppData\Local\UnrealBuildTool\Log.txt
Using 'git status' to determine working set for adaptive non-unity build (D:\Unreal Projects\RedStory).
Invalidating makefile for RedStoryEditor (source file removed)
ZipUtility Info: Using default VS path: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community
ZipUtility Error: can't find VS path: System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC'.
at System.IO.Enumeration.FileSystemEnumerator1.CreateDirectoryHandle(String path, Boolean ignoreNotFound) at System.IO.Enumeration.FileSystemEnumerator1.Init()
at System.IO.Enumeration.FileSystemEnumerator1..ctor(String directory, Boolean isNormalized, EnumerationOptions options) at System.IO.Enumeration.FileSystemEnumerable1..ctor(String directory, FindTransform transform, EnumerationOptions options, Boolean isNormalized)
at System.IO.Enumeration.FileSystemEnumerableFactory.UserDirectories(String directory, String expression, EnumerationOptions options)
at System.IO.Directory.InternalEnumeratePaths(String path, String searchPattern, SearchTarget searchTarget, EnumerationOptions options)
at System.IO.Directory.GetDirectories(String path, String searchPattern, EnumerationOptions enumerationOptions)
at System.IO.Directory.GetDirectories(String path)
at ZipUtility.get_ATLPath() in D:\Unreal Projects\RedStory\Plugins\ZipUtility-Unreal\Source\ZipUtility\ZipUtility.Build.cs:line 44
ZipUtility Error: Couldn't find an ATLPath, fix it in ZipUtility.Build.cs
ZipUtility Info: Using ATL path

Split 7zip files won't unzip

Hi

I have a 7zip package that I have split into 62 separate pieces that is 6.0gb+ that I need to unzip. When using UnzipTo the interfaces are not called and nothing happens. It is working correctly with normal 7zip packages but not split ones. Have I missed something or is this not available?

'ModuleManager.h': No such file or directory

I have been trying to install this plugin in 4.25.4, when i open my project works as normal, in bluprints i can ad the ZipUtility nodes, but when I Run the project it crash when it access to the ZipUtility.
I open the .sln project and shows an error while trying access "ZipFileFunctionLibrary.cpp", and when i compile the project, 'ModuleManager.h': No such file or directory, this error shows up, i already try by adding the directions on the codes by this metod: #include "Modules/ModuleManager.h"
more errors of that type appear and i do the same till the stop to show up, I compile and run in the editor, and again the project crash while accessing the ZipUtility on play

UE5.2 doesnt compile it

Hello, can you help me plese with transfering your plugin to 5.2 version?

I have this error

Severity Code Description Project File Line Suppression State
Error C1083 Cannot open include file: 'HideWindowsPlatformTypes.h': No such file or directory GridExporterDemo D:\UnrealProjects\GridExporterDemo\Plugins\ZipUtility-Unreal\ThirdParty\7zpp\Include\SevenZipException.h 30

UE5.3 doesnt compile it

Hello, can you help me plese with transfering your plugin to 5.3 version?

I have error
SevenZipException.h(30): [C1083] Cannot open include file: 'HideWindowsPlatformTypes.h': No such file or directory

Add in-memory operations

Feature Idea:

  • Allow compression and decompression of data (byte arrays and strings) instead of files.
  • In-memory optimization: unzip files into memory instead of into files

I want to unzip a zip/7z file follow you. but it doesn't work

image
my blueprint above just as the same as yours. And I have set the Zip Utility Interface . I also tried to set the format.but I just can not find the unzipped file. Otherwise, I tried the "unzip to" funtion too, but nothing. Any suggestion will be appreciated greatly! Thank you very mush! @getnamo

Visual Studio 2019 doesn't compile

By default, it searches for vs17 registry edit in build.cs file, and uses "C:\Program Files (x86)\Microsoft Visual Studio\2017" if not found. If there is no 2017 version, the compile fails. fixable by adding another check for VS2019

Linking errors with C++ code

When I try to add the plugin and files to my C++ project, I get the following linking errors when compiling:

CompilerResultsLog: [1/1] Link UE4Editor-TestProject-7049.dll
CompilerResultsLog: Error: LINK : fatal error LNK1181: cannot open input file 'C:\Users\prisonerjohn\Desktop\TestProject\Plugins\ZipUtility-ue4\Intermediate\Build\Win64\UE4Editor\Development\UE4Editor-ZipUtility.lib'
CompilerResultsLog: ERROR: UBT ERROR: Failed to produce item: C:\Users\prisonerjohn\Desktop\TestProject\Binaries\Win64\UE4Editor-TestProject-7049.dll

I followed the instructions in the README to add the plugin, and tried restarting both Unreal Engine and Visual Studio.

Apologies if this isn't the best place to ask this, I'm still new to Unreal and not sure if this is due to a missing step in the installation instructions, or just an unrelated issue with how my project is set up.

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.