Coder Social home page Coder Social logo

progressbar's Introduction

progressbar

Maven Central

A console progress bar for JVM with minimal runtime overhead.

Menlo, Fira Mono, Source Code Pro, Iosevka, JetBrains Mono or SF Mono are recommended for optimal visual effects.

For Consolas or Andale Mono fonts, use ProgressBarStyle.ASCII because the box-drawing glyphs are not aligned properly in these fonts.

Documentation

Installation

Maven:

  <dependency>
      <groupId>me.tongfei</groupId>
      <artifactId>progressbar</artifactId>
      <version>0.10.0</version>
  </dependency>

Usage

Declarative usage (since 0.6.0):

// Looping over a collection:
for (T x : ProgressBar.wrap(collection, "TaskName")) {
    ...
    // Progress will be automatically monitored by a progress bar
}

Imperative usage (since 0.7.0 switched to Java's try-with-resource pattern):

// try-with-resource block
try (ProgressBar pb = new ProgressBar("Test", 100)) { // name, initial max
 // Use ProgressBar("Test", 100, ProgressBarStyle.ASCII) if you want ASCII output style
  for ( /* TASK TO TRACK */ ) {
    pb.step(); // step by 1
    pb.stepBy(n); // step by n
    ...
    pb.stepTo(n); // step directly to n
    ...
    pb.maxHint(n);
    // reset the max of this progress bar as n. This may be useful when the program
    // gets new information about the current progress.
    // Can set n to be less than zero: this means that this progress bar would become
    // indefinite: the max would be unknown.
    ...
    pb.setExtraMessage("Reading..."); // Set extra message to display at the end of the bar
  }
} // progress bar stops automatically after completion of try-with-resource block

NEW in 0.9.0: You can now use multiple progress bars for parallel jobs:

try (ProgressBar pb1 = new ProgressBar("Job1", max1); 
     ProgressBar pb2 = new ProgressBar("Job2", max2)) { ... }
Kotlin extensions

Kotlin DSL-like builders are available at reimersoftware/progressbar-ktx.

Changelog

CHANGELOG

progressbar's People

Contributors

abhinavvishak avatar aluisioasg avatar andreinekrason avatar brett-smith avatar ctongfei avatar deejgregor avatar heinrichreimer avatar heroesleo65 avatar hlxid avatar khmarbaise avatar kmtong avatar kristofarkas avatar meawoppl avatar michaelsiepmann avatar mordechaim avatar neopaf avatar nikr-iv avatar pakhomovalexander avatar snuyanzin avatar vehovsky avatar wfxr avatar zbateson 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  avatar  avatar  avatar  avatar

progressbar's Issues

Cannot run program "infocmp": CreateProcess error=2, The system cannot find the file specified

When I want to start my programm, I get this long error
java.io.IOException: Cannot run program "infocmp": CreateProcess error=2, The system cannot find the file specified at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128) at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071) at org.jline.utils.InfoCmp.getInfoCmp(InfoCmp.java:547) at org.jline.terminal.impl.AbstractTerminal.parseInfoCmp(AbstractTerminal.java:187) at org.jline.terminal.impl.DumbTerminal.<init>(DumbTerminal.java:88) at org.jline.terminal.TerminalBuilder.doBuild(TerminalBuilder.java:401) at org.jline.terminal.TerminalBuilder.build(TerminalBuilder.java:259) at me.tongfei.progressbar.ProgressThread.<init>(ProgressThread.java:56) at me.tongfei.progressbar.ProgressBar.<init>(ProgressBar.java:91) at me.tongfei.progressbar.ProgressBar.<init>(ProgressBar.java:39) at de.badespeak.teamspeakbot2.main.Load.main(Load.java:69) Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified at java.base/java.lang.ProcessImpl.create(Native Method) at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:420) at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:151) at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1107) ... 10 more

My Code:
https://hastebin.com/uconocixub

[feature request] for updating the task with fixed values

Hello,

thank you for creating this wonderful library. I need for an upload app the feature that I can use as alternative to "pb.stepBy(n); " an alternative method to give a fixed value. As example when I call the method with 100 then should the showed value be "100/maxvalue" and not 100 + previous step.

I hope you can implement this.

Greetings
Sven

-- [EDIT] --
As a workaround I have delete the + sign in the "pb.stepBy(n)" method.

Extra message wraps to next line, causes artefacts

Thank you for this great, simple library. There's just one tiny bug that I can see. When the extra message doesn't fit in the remaining columns after the progress bar, it wraps to the next line.

This means that when the progress bar is next rendered, it leaves an artefact of the previous render on the line above.

This could be fixed by trimming the extra message so that it fits. Adjusting progress bar width on initialisation isn't an option because we're dealing with unpredictable lengths here (path names, in this case).

Custom width

I would like to set a custom width for the progressbar

When running the progressbar, I see following:

grafik

In ConEmu (cmd.exe)

grafik

I would like to manually set the width using the Builder. However, I did not see an option setWidth().

Maybe refs #23 and #32.

Build produces WARNINGs about encoding

Currently the build produces warnings about encoding:

[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ progressbar ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/kama/ws-git/progressbar/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.6.1:compile (default-compile) @ progressbar ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 5 source files to /Users/kama/ws-git/progressbar/target/classes
[INFO]

Problem in IntelliJ

When running in the IntelliJ IDE integrated console no correct progress bar is drawn. The same code works fine on the default Windows command line.

image

Fix java compiler version in maven build

According to the documentation of maven, for the maven compiler plugin the default source and target settings are 1.5, independently of the JDK that maven runs with.

However, the progressbar project use some java 8 specifics, like the LocalDateTime class (see code) which appeared since 1.8.

This means that when invoking maven, it will produce the appropriate byte code, but when using, it throws errors when running on any JVM prior to 8.

I guess it would be nice to have the classes generated with the correct target version of the JVM.

ProgressBar breaks stdin.

public class mainFunction {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine(); // I enter y<backspace>n NOTE : ECHO HERE 
        System.out.println(input); // "n"
        System.out.println(input.length()); // 1
        ProgressBar bar = new ProgressBar("name", 10);
        bar.start();
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            bar.step();
        }
        bar.stop();
        input = scanner.nextLine(); // I enter y<backspace>n, NOTE : NO ECHO HERE .
        System.out.println(input); "y\bn"
        System.out.println(input.length()) // 3;
    }
}

the output is :

n // user input echo
n // sout statement
1 // length
name 100% | .... 
n // no echo !! , this is the sout statement
3 length is 3 even though it prints just n because input == "y\bn"

Window 10 cmd.exe progressbar default width is too small.

This might be a custom setting as indicated in issue #71. However, the default with in the cmd.exe context regardless of mode lines and cols setting are unaffected. This might be due to the underlining jline terminal but I couldn't find a definitive way to change it. I'm sure others may (or will) have this problem.

off by one?

(love this new unicode progress bar, thanks!)

I feel there might be off-by one error here:
Retrying those that failed 100% │███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ │ 8974535/8974535 (0:06:33 / 0:00:00)

Off by one when wrapping InputStream

image

I use ProgressBar.wrap(InputStream, ProgressBarBuilder) where the stream is created by URL.openStream(). I set the initial max to the actual file size. Reducing the max by one (or even 10) has zero effect and will still show the actual file size (as if I set it to the correct size).

Ctor with initialMax, updateIntervalMillis and stye.

You can initialise the progressbar in different way but unfortunately there is one option missing from point of view:

ProgressBar(String task, long initialMax, int updateIntervalMillis, ProgressBarStyle style)

Simple API for range

Unless I'm missing something, if I just want a progress bar for something that goes over a range of input, I have to use the imperative syntax which implies two additional levels of nesting. It would be great if there were a simple declarative API that accepts two integers and lets me iterate over the range between them.

I tried using an IntStream with the existing declarative API which almost works, but doesn't maintain the total size.

Control-C not working in Windows

Aborting the code with Control-C is not working in windows. This seem to be an issue with getting the terminal column width in jline2.12. This code sets a system hook that consumes the Control-C.

Updating to pom to jline 2.14.3 (or greater) resolves this issue.

incorrect README for imperative style

The imperative usage example given seems to combine both the imperative and declarative styles and produces 2 progress bars.

The inner for loop should iterate over the task to be run and NOT do a wrap call which creates a declarative style ProgressBar.

// try-with-resource block

try (ProgressBar pb = new ProgressBar("Test", 100)) { 
  for ( /* TASK TO ITERATE */ ) {
    pb.stepTo(33);
  }
} 
----------------------------------
Test 33% │██████                         │ 33/100 (0:00:00 / 0:00:00) 

Your example creates something like follows

List<Integer> list = new ArrayList<>(300);
        for (int i = 0; i < 234; i++) {
            list.add(i);
        }
        try (ProgressBar pb = new ProgressBar("OuterBar", 123)) {
            for (Integer x : ProgressBar.wrap(list, "InnerBar")) {
            }
            pb.stepTo(77);
        }
----------------------------------
InnerBar 100% │████████████████████████│ 234/234 (0:00:00 / 0:00:00) 
OuterBar  62% │███████████████         │  77/123 (0:00:01 / 0:00:00) 

last refresh

hmm, regretfully, something is not right with last refresh.

I see it finishes on random number again:
Retrying those that failed 0% │ │ 4876/8974535 (0:00:01 / 0:31:36)
Retrying those that failed 0% │ │ 4342/8974535 (0:00:01 / 0:35:34)

(while I set 10000 items to work upon).

Remember I've suggested one more refresh after 'while(running)' in ProgressThread.run in my pull req?

feature request: api to update the task details

Hi,

Thanks for creating this library. We are trying to use this in this project.

Would be nice if there was a way to set some text in the progress bar that indicates what the current task is doing. Something like:

pb.setTaskDescription("absolute-position")

which would render the progress bar as, for example:

Test 62% [================         ] 621/1000 (0:00:12 / 0:00:07) "absolute-position"

Enable null ProgressBar

When "code and fix"ing and application, I tend to use "Logger.debug", which doesn't appear at the console. - I would like to keep the ProgressBar-code, but just "disable" it. Think, the easiest way is to provide a "NullProgressBar", which hast the same interface as the normal ProgressBar, but outputs to "/dev/null" (i.e., does nothing).

Unable to create a system terminal

I get the following error in the VSCode terminal and also in the Eclipse console using version 0.7.0.

Jul 13, 2018 1:45:04 AM org.jline.utils.Log logr
WARNUNG: Unable to create a system terminal, creating a dumb terminal (enable debug logging for more information)

Read file lines 15% [=========> ] 2044/10000 (0:00:00 / 0:00:00)
Read file lines 100% [======================] 10000/10000 (0:00:01 / 0:00:00)

This is my code.:

  List<String> lineList = new ArrayList<>();
  long numberOfLines = 0;
  try {
	  numberOfLines = Files.lines(file.toPath()).count();
  } catch (IOException e) {
    e.printStackTrace();
  }
  try (
    Stream<String> lines = Files.lines(file.toPath());
  ) {
    ProgressBar pb = new ProgressBar("Read file lines", numberOfLines);
    lines.forEach((line) -> {
      lineList.add(line);
      pb.step();
    });
    pb.close();
    lines.close();
  } catch (IOException e1) {
    e1.printStackTrace();
  }

support for org.slf4j.Logger

It's pretty hard to adapt an java.in.OutputStream to the Logger. It would be nice to provide an interface to print lines.

stucks if the initialMax is a small number

Hi,
This is my code:

 ProgressBar pb = new ProgressBar("Collecting  rows", rowsCount);
        try {
            ResultSet rs = stm.executeQuery(query);
            ResultSetMetaData rsmd = rs.getMetaData();
            int columnsNumber = rsmd.getColumnCount();

           pb.start();
            while (rs.next()) {
                StringJoiner result = new StringJoiner(";");
                for (int i = 1; i <= columnsNumber; i++) {
                result.add(value);
                }
                pb.step();
            }
            pb.stop();
}catch(){
}

If rowCount is a small number, like 5, then my application stuck on the progress bar execution.
Could you please look at it?

feature request: smoother progress bar

By using some ascii art, it would be possible to make a smoother progress bar.

Here's a scala script, and screencast:

#!/usr/bin/env scala

println("Progress demo")

val l = "▏▎▍▌▋▊▉█"
val n = l.size
// val min = '░'
val min = '.'
val max = l(n - 1)

val width = 50

for (i <- 1 to 200) {
  print('\r')
  val w = (width * (i / 200d))
  val wInt = w.toInt
  (0 to wInt) foreach {_ => print (max) }
  print(l(((w - wInt)*n).toInt))
  (wInt+1 to width) foreach {_ => print (min) }
  print("           ")
  Thread.sleep(50)
}

println("\nDone")

Screen cast: https://youtu.be/B5TTxjxZazE

Ability to pause and resume the progressbar

In our test harness, we allow execution of the tests to be paused and then, continued at a later time.

It would be great if the progress bar can be paused and resumed (I think it used to work fine before the multi-threaded version).

No progress reported when used inside a gradle build script

Progressbar works perfectly well when used in a standalone groovy script. However, when that same script is used as part of a gradle build.gradle task then I see no output at all in the console (I tried running my script with and without the "-q" option, and got the same result). My task does what it is supposed to, but surely would be nice to see the ProgressBar showing where it is at. It is a long-running custom task, so having some sort of progress reporting would be great.

I am guessing that this has to do with how Gradle deals with the PrintStream output that ProgressBar is generating.

Thanks.

JVM core dump on version 0.7.4 and 0.8.0

I'm trying to run the sample script below:

@Grapes(
  @Grab(group='me.tongfei', module='progressbar', version='0.7.3')
)

import me.tongfei.progressbar.ProgressBar

def things = []

100.times {
  things << "rawr"
} 

def declarative = true

if (declarative) {
  for (x : ProgressBar.wrap(things, "TaskName")) {
    Thread.sleep(100)
  }

} else {
  try (ProgressBar pb = new ProgressBar("Test", 100)) {
    pb.step()
    pb.setExtraMessage("Reading...")
    Thread.sleep(100)
  }

...with versions > 0.7.3 results in:

➜  ~ groovy asdf.groovy
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x000000010ed053b6, pid=47325, tid=7427
#
# JRE version: OpenJDK Runtime Environment (11.0.3+7) (build 11.0.3+7)
# Java VM: OpenJDK 64-Bit Server VM (11.0.3+7, mixed mode, tiered, compressed oops, g1 gc, bsd-amd64)
# Problematic frame:
# V  [libjvm.dylib+0x5053b6]  LinkResolver::resolve_invokevirtual(CallInfo&, Handle, constantPoolHandle const&, int, Thread*)+0x4e
#
# No core dump will be written. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /Users/jdurbin/hs_err_pid47325.log
#
# If you would like to submit a bug report, please visit:
#   https://github.com/AdoptOpenJDK/openjdk-build/issues
#
[1]    47325 abort      groovy asdf.groovy

I'm curious if you've seen/heard anyone landing on this issue.

Versions:

➜  ~ groovy -version
Groovy Version: 3.0.0-rc-1 JVM: 11.0.3 Vendor: AdoptOpenJDK OS: Mac OS X
➜  ~ java -version
openjdk version "11.0.3" 2019-04-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.3+7)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.3+7, mixed mode)

long vars to track current/max in ProgressState class

Hi,
I've found your class really useful! I'm just disappointed in the use of int instead of long.
We use progress bar when we have several items to process, so an integer value cannot represent such hunge range of values.
I'm processing an huge dataset with billions of items, I cannot use your implementation with int :(

Can you please consider to replace integer with long in ProgressState's class attributes current and max?

class ProgressState {
    String task;
    int current = 0;
    int max = 0;
    LocalDateTime startTime = null;
    String extraMessage = "";
...
}

java.lang.IllegalStateException: Unable to create a system terminal

When running the following Kotlin program

object Foo {
    @JvmStatic
    fun main(args: Array<String>) {
        LogManager.getLogManager().getLogger("").level = Level.FINEST

        ProgressBar.wrap(((1..10000).toList()), "Preparing Images").forEach { sleep(10) }
    }
}

in Jetbrains Intellj IDEA (v2018.1), I get the following error:

java.lang.IllegalStateException: Unable to create a system terminal
	at org.jline.terminal.TerminalBuilder.doBuild(TerminalBuilder.java:276)
	at org.jline.terminal.TerminalBuilder.build(TerminalBuilder.java:222)
	at org.jline.terminal.TerminalBuilder.terminal(TerminalBuilder.java:62)
	at me.tongfei.progressbar.ProgressThread.<init>(ProgressThread.java:37)
	at me.tongfei.progressbar.ProgressBar.<init>(ProgressBar.java:51)
	at me.tongfei.progressbar.ProgressBar.<init>(ProgressBar.java:29)
	at me.tongfei.progressbar.wrapped.ProgressBarWrappedIterator.<init>(ProgressBarWrappedIterator.java:18)
	at me.tongfei.progressbar.wrapped.ProgressBarWrappedIterable.iterator(ProgressBarWrappedIterable.java:24)
	at Foo.main(ConvNet.kt:149)
	Suppressed: java.lang.NoClassDefFoundError: com/sun/jna/Platform
		at org.jline.terminal.impl.jna.JnaNativePty.current(JnaNativePty.java:40)
		at org.jline.terminal.impl.jna.JnaSupportImpl.current(JnaSupportImpl.java:16)
		at org.jline.terminal.TerminalBuilder.doBuild(TerminalBuilder.java:320)
		... 8 more
	Caused by: java.lang.ClassNotFoundException: com.sun.jna.Platform
		at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
		at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
		at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
		at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
		... 11 more
	Suppressed: java.lang.UnsupportedOperationException
		at org.jline.terminal.impl.jansi.JansiSupportImpl.current(JansiSupportImpl.java:71)
		at org.jline.terminal.TerminalBuilder.doBuild(TerminalBuilder.java:330)
		... 8 more
	Suppressed: java.io.IOException: Not a tty
		at org.jline.terminal.impl.ExecPty.current(ExecPty.java:44)
		at org.jline.terminal.TerminalBuilder.doBuild(TerminalBuilder.java:339)
		... 8 more
	Caused by: java.io.IOException: Error executing 'tty': not a tty
		at org.jline.utils.ExecHelper.exec(ExecHelper.java:42)
		at org.jline.terminal.impl.ExecPty.current(ExecPty.java:41)
		... 9 more

Preparing Images  10% │██▎                  │  1093/10000 (0:00:12 / 0:01:38) 

The same does not report a stacktrace when being run as a java program in IDEA.

Cannot run program "infocmp": CreateProcess error=2, The system cannot find the file specified

Version: 0.7.4
Windows 10
IntelliJ
vm: DCEVM11.0.1+8 and OpenJDK 11.0.4+11
When run, I see the following stacktrace:

WARNING: Unable to retrieve infocmp for type dumb-color
java.io.IOException: Cannot run program "infocmp": CreateProcess error=2, The system cannot find the file specified
	at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128)
	at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071)
	at org.jline.utils.InfoCmp.getInfoCmp(InfoCmp.java:547)
	at org.jline.terminal.impl.AbstractTerminal.parseInfoCmp(AbstractTerminal.java:187)
	at org.jline.terminal.impl.DumbTerminal.<init>(DumbTerminal.java:88)
	at org.jline.terminal.TerminalBuilder.doBuild(TerminalBuilder.java:401)
	at org.jline.terminal.TerminalBuilder.build(TerminalBuilder.java:259)
	at me.tongfei.progressbar.ProgressThread.<init>(ProgressThread.java:56)
	at me.tongfei.progressbar.ProgressBar.<init>(ProgressBar.java:91)
	at me.tongfei.progressbar.ProgressBar.<init>(ProgressBar.java:39)
	at com.schneider.gss.predictive.App.aggregateSimilarKeywords(App.java:129)
	at com.schneider.gss.predictive.App.call(App.java:122)
	at com.schneider.gss.predictive.App.call(App.java:34)
	at picocli.CommandLine.executeUserObject(CommandLine.java:1743)
	at picocli.CommandLine.access$900(CommandLine.java:145)
	at picocli.CommandLine$RunLast.handle(CommandLine.java:2101)
	at picocli.CommandLine$RunLast.handle(CommandLine.java:2068)
	at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:1935)
	at picocli.CommandLine.execute(CommandLine.java:1864)
	at com.schneider.gss.predictive.App.main(App.java:110)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
	at java.base/java.lang.ProcessImpl.create(Native Method)
	at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:420)
	at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:151)
	at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1107)
	... 19 more

It doesn't break the application

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.