Git Product home page Git Product logo

tcell's Introduction

Tcell

Tcell is a Go package that provides a cell based view for text terminals, like XTerm. It was inspired by termbox, but includes many additional improvements.

Stand With Ukraine Linux Windows Apache License Docs Discord Coverage Go Report Card

Please see here for an important message for the people of Russia.

NOTE: This is version 2 of Tcell. There are breaking changes relative to version 1. Version 1.x remains available using the import github.com/gdamore/tcell.

Tutorial

A brief, and still somewhat rough, tutorial is available.

Examples

  • proxima5 - space shooter (video)
  • govisor - service management UI (screenshot)
  • mouse demo - included mouse test (screenshot)
  • gomatrix - converted from Termbox
  • micro - lightweight text editor with syntax-highlighting and themes
  • godu - utility to discover large files/folders
  • tview - rich interactive widgets
  • cview - user interface toolkit (fork of tview)
  • awsome gocui - Go Console User Interface
  • gomandelbrot - Mandelbrot!
  • WTF - personal information dashboard
  • browsh - modern web browser (video)
  • go-life - Conway's Game of Life
  • gowid - compositional widgets for terminal UIs, inspired by urwid
  • termshark - interface for tshark, inspired by Wireshark, built on gowid
  • go-tetris - Go Tetris with AI option
  • fzf - command-line fuzzy finder
  • ascii-fluid - fluid simulation controlled by webcam
  • cbind - key event encoding, decoding and handling
  • tpong - old-school Pong
  • aerc - email client
  • tblogs - development blogs reader
  • spinc - irssi inspired chat application for Cisco Spark/WebEx
  • gorss - RSS/Atom feed reader
  • memoryalike - memorization game
  • lf - file manager
  • goful - CUI file manager
  • gokeybr - deliberately practice your typing
  • gonano - editor, mimics nano
  • uchess - UCI chess client
  • min - Gemini browser
  • ov - file pager
  • tmux-wormhole - tmux plugin to transfer files
  • gruid-tcell - driver for the grid based UI and game framework
  • aretext - minimalist text editor with vim key bindings
  • sync - GitHub repo synchronization tool
  • statusbar - statusbar motivation tool for tracking periodic tasks/goals
  • todo - simple todo app
  • gosnakego - a snake game
  • gbb - A classical bulletin board app for tildes or public unix servers
  • lil - A simple and flexible interface for any service by implementing only list and get operations
  • hero.go - 2d monster shooter (video)
  • go-tetris - simple tetris game for native terminal and WASM using github actions+pages

Pure Go Terminfo Database

Tcell includes a full parser and expander for terminfo capability strings, so that it can avoid hard coding escape strings for formatting. It also favors portability, and includes support for all POSIX systems.

The database is also flexible & extensible, and can be modified by either running a program to build the entire database, or an entry for just a single terminal.

More Portable

Tcell is portable to a wide variety of systems, and is pure Go, without any need for CGO. Tcell is believed to work with mainstream systems officially supported by golang.

No Async IO

Tcell is able to operate without requiring SIGIO signals (unlike termbox), or asynchronous I/O, and can instead use standard Go file objects and Go routines. This means it should be safe, especially for use with programs that use exec, or otherwise need to manipulate the tty streams. This model is also much closer to idiomatic Go, leading to fewer surprises.

Rich Unicode & non-Unicode support

Tcell includes enhanced support for Unicode, including wide characters and combining characters, provided your terminal can support them. Note that Windows terminals generally don't support the full Unicode repertoire.

It will also convert to and from Unicode locales, so that the program can work with UTF-8 internally, and get reasonable output in other locales. Tcell tries hard to convert to native characters on both input and output. On output Tcell even makes use of the alternate character set to facilitate drawing certain characters.

More Function Keys

Tcell also has richer support for a larger number of special keys that some terminals can send.

Better Color Handling

Tcell will respect your terminal's color space as specified within your terminfo entries. For example attempts to emit color sequences on VT100 terminals won't result in unintended consequences.

In legacy Windows mode, Tcell supports 16 colors, bold, dim, and reverse, instead of just termbox's 8 colors with reverse. (Note that there is some conflation with bold/dim and colors.) Modern Windows 10 can benefit from much richer colors however.

Tcell maps 16 colors down to 8, for terminals that need it. (The upper 8 colors are just brighter versions of the lower 8.)

Better Mouse Support

Tcell supports enhanced mouse tracking mode, so your application can receive regular mouse motion events, and wheel events, if your terminal supports it.

(Note: The Windows 10 Terminal application suffers from a flaw in this regard, and does not support mouse interaction. The stock Windows 10 console host fired up with cmd.exe or PowerShell works fine however.)

Termbox Compatibility

A compatibility layer for termbox is provided in the compat directory. To use it, try importing github.com/gdamore/tcell/termbox instead. Most termbox-go programs will probably work without further modification.

Working With Unicode

Internally Tcell uses UTF-8, just like Go. However, Tcell understands how to convert to and from other character sets, using the capabilities of the golang.org/x/text/encoding packages. Your application must supply them, as the full set of the most common ones bloats the program by about 2 MB. If you're lazy, and want them all anyway, see the encoding sub-directory.

Wide & Combining Characters

The SetContent() API takes a primary rune, and an optional list of combining runes. If any of the runes is a wide (East Asian) rune occupying two cells, then the library will skip output from the following cell. Care must be taken in the application to avoid explicitly attempting to set content in the next cell, otherwise the results are undefined. (Normally the wide character is displayed, and the other character is not; do not depend on that behavior.)

Older terminal applications (especially on systems like Windows 8) lack support for advanced Unicode, and thus may not fare well.

Colors

Tcell assumes the ANSI/XTerm color model, including the 256 color map that XTerm uses when it supports 256 colors. The terminfo guidance will be honored, with respect to the number of colors supported. Also, only terminals which expose ANSI style setaf and setab will support color; if you have a color terminal that only has setf and setb, please submit a ticket.

24-bit Color

Tcell supports 24-bit color! (That is, if your terminal can support it.)

NOTE: Technically the approach of using 24-bit RGB values for color is more accurately described as "direct color", but most people use the term "true color". We follow the (inaccurate) common convention.

There are a few ways you can enable (or disable) true color.

  • For many terminals, we can detect it automatically if your terminal includes the RGB or Tc capabilities (or rather it did when the database was updated.)

  • You can force this one by setting the COLORTERM environment variable to 24-bit, truecolor or 24bit. This is the same method used by most other terminal applications that support 24-bit color.

  • If you set your TERM environment variable to a value with the suffix -truecolor then 24-bit color compatible with XTerm and ECMA-48 will be assumed. (This feature is deprecated. It is recommended to use one of other methods listed above.)

  • You can disable 24-bit color by setting TCELL_TRUECOLOR=disable in your environment.

When using TrueColor, programs will display the colors that the programmer intended, overriding any "themes" you may have set in your terminal emulator. (For some cases, accurate color fidelity is more important than respecting themes. For other cases, such as typical text apps that only use a few colors, its more desirable to respect the themes that the user has established.)

Performance

Reasonable attempts have been made to minimize sending data to terminals, avoiding repeated sequences or drawing the same cell on refresh updates.

Terminfo

(Not relevant for Windows users.)

The Terminfo implementation operates with a built-in database. This should satisfy most users. However, it can also (on systems with ncurses installed), dynamically parse the output from infocmp for terminals it does not already know about.

See the terminfo/ directory for more information about generating new entries for the built-in database.

Tcell requires that the terminal support the cup mode of cursor addressing. Ancient terminals without the ability to position the cursor directly are not supported. This is unlikely to be a problem; such terminals have not been mass-produced since the early 1970s.

Mouse Support

Mouse support is detected via the kmous terminfo variable, however, enablement/disablement and decoding mouse events is done using hard coded sequences based on the XTerm X11 model. All popular terminals with mouse tracking support this model. (Full terminfo support is not possible as terminfo sequences are not defined.)

On Windows, the mouse works normally.

Mouse wheel buttons on various terminals are known to work, but the support in terminal emulators, as well as support for various buttons and live mouse tracking, varies widely. Modern xterm, macOS Terminal, and iTerm all work well.

Bracketed Paste

Terminals that appear to support the XTerm mouse model also can support bracketed paste, for applications that opt-in. See EnablePaste() for details.

Testability

There is a SimulationScreen, that can be used to simulate a real screen for automated testing. The supplied tests do this. The simulation contains event delivery, screen resizing support, and capabilities to inject events and examine "physical" screen contents.

Platforms

POSIX (Linux, FreeBSD, macOS, Solaris, etc.)

Everything works using pure Go on mainstream platforms. Some more esoteric platforms (e.g., AIX) may need to be added. Pull requests are welcome!

Windows

Windows console mode applications are supported.

Modern console applications like ConEmu and the Windows 10 terminal, support all the good features (resize, mouse tracking, etc.)

WASM

WASM is supported, but needs additional setup detailed in README-wasm.

Plan9 and others

These platforms won't work, but compilation stubs are supplied for folks that want to include parts of this in software for those platforms. The Simulation screen works, but as Tcell doesn't know how to allocate a real screen object on those platforms, NewScreen() will fail.

If anyone has wisdom about how to improve support for these, please let me know. PRs are especially welcome.

Commercial Support

Tcell is absolutely free, but if you want to obtain commercial, professional support, there are options.

  • TideLift subscriptions include support for Tcell, as well as many other open source packages.
  • Staysail Systems Inc. offers direct support, and custom development around Tcell on an hourly basis.

tcell's People

Contributors

ahoys123 avatar barisbll avatar bios-marcel avatar boz avatar chrbrd avatar dependabot[bot] avatar digitallyserviced avatar frankbraun avatar gcla avatar gdamore avatar gokcehan avatar hhirtz avatar itchyny avatar jcorbin avatar junegunn avatar kimtore avatar marenu avatar mattroseman avatar mna avatar noborus avatar rockorager avatar spenserblack avatar tslocum avatar tyler-sommer avatar viktomas avatar voroskoi avatar vvidovic-croz avatar wedaly avatar zeromus avatar zyedidia 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tcell's Issues

Add examples links

We could show case some example programs. My modified version of go-matrix, and of course proxima5!

Add ACS drawing support

Curses & ncurses have support for box drawing characters and such via the "ACS" terminfo entries. It would be nice to use these.

Fix README

Readme has some inconsistent uses of I & we, misstates Termbox where it means Tcell, and can generally improve from some minor language cleanups.

Add a Beep() API.

For terminfo, we should use the bell, or flash, perhaps depending on user configuration (and of course presence of the flash attribute)

Perhaps for library support we ought to just expose a separate Flash() API.

Note that Windows has special APIs for these, and in particular we should play the Alert message sound rather than using the legacy Beep API.

Fix GOPATH handling

So $GOPATH handing is wrong on several levels.

First, $GOPATH can consist of multiple directories. So our attempt to look up a file using it as a single directory is broken.

Second, not everyone installs from source.

So probably the best place for this is in $HOME. Or maybe we can figure out a way to locate "library" or support files for Go? I'm not sure if such a thing exists.

Improve docs & fix golint

Go lint reported a number of issues. Not all of them can/should be addressed (for example, adding "documentation" for a constant called KeyCtrlA doesn't seem to be very useful -- the name is self explanatory), but many of the issues were valid.

The CellBuffer implementation in particular needs improved documentation.

Add fallback rune support

For display, we could allow programs to register "fallback" runes, e.g. in a game, we could use a fancy glyph from another language or the emoticons list, but fall back to a simpler ASCII if the terminal can't display it. Proposed API is:

screen.AddFallbackRune(rune orig, rune fallback)

I'm not proposing to support this at all for combining characters.

Various API enhancements

We'd like a global SetStyle() to set the default style on a terminal.

We'd like to be able to work with Cells, including getting and setting cells, so that we could for example make a program that just changes the an attribute while leaving other attributes unchanged, as well as contents. etc.

Add drain API

When using tcell for gaming (!!) it is convenient to know when the entire has been pushed to the terminal ... for example the normal Show() API spits out a bunch of bytes which can be buffered in the file, and Show() can return back before the bytes have drained fully.

In some cases, it may be possible to overfill the stream, causing excessively long backlogs. For systems that refresh frames often (e.g. with just a few msec delay between Show() invocations), it may be better to wait for the output file to completely drain before starting another invocation of Show().

Emit "EnableACS" on legacy terminals

When using legacy terminals (such as genuine vt100) we need to first emit the code to setup / enable the alternate character set, and only afterwards emit codes to enter/exit the mode.

Change mouse terminfo entries

The mouse terminfo entries we made up (smous, rmouse) may be unnecessary. In particular, I've discovered that ncurses has created a new pair of entries called "XM" and "xm". They are somewhat different.

XM appears to be the format used for enabling & disabling mice. It uses parameterized string with the sole parameter being 0 or 1 -- 1 indicates that mouse reports should be enabled, whereas 0 indicates the reverse.

xm is the the format used for mouse reports, and is also a parameterized string. The parameters are as follows: x, y, buttons, state -- where state is either 0 for a release, or 1 for a press. The x, y coordinates are presented normally, and button codes are encoded as per x11term but without the 32 added.

The xm string is a forward processor, and doesn't really help with going in the reverse direction, which is what we need. That is, it specifies how to create a mouse event, not how to parse one. Unfortunately, this means we need to retain our custom mouse event parsing code for the time being. Its unclear how xm= could be used by any program, although it does serve as a form of documentation for developers.

Good news is that the only mouse protocols that seem to be supported are via xterm's x10mouse (9, we never use), x11mouse (1000), DEC locator mode (which appears to be nearly completely undocumented and unused anywhere), and the extended 1001 (highlight tracking, we never use), 1003, 1002, 1005 and 1006 modes. All of these strings are supplied in the latest terminfo.src exclusively for xterm.

The upshot of this is that I think we can get away doing what we have been doing -- submitting just the escape sequences for 1000, 1003, and 1006 (in that order), and then parsing mouse events as we have been, preferring the SGR form, but supporting x11 events.

In the future, maybe we can create a data driven form of xm= that goes in the reverse direction... we could also use some kind of booleans to indicate fixed protocol parsing.

That said, its probably pretty unlikely that any new mouse reporting protocols are going to be created. The SGR mode supports pretty much anything you'd want to have in a terminal, especially when combined with SGR (1003) mode.

Enable building (but not running) nacl, plan9

By providing a stub for the termios implementation, we can support compilation and inclusion in projects that need to build for plan9 or nacl. This will help folks using this code in larger projects that include both ui and server components. The UI component won't work if they need topsl, but also the programs can include some kind of fallback.

The benefit here is to help consumers having to known where it works, and where it doesn't.

hz1500 hack needed

The hazeltine 1500 cannot display '~'. Presumably we have to replace it with something else on output. I have no idea what.

That said, I've never seen this terminal. Do they exist anywhere anymore? This is extremely low priority.

Add support for handling $<delay> delays

Older terminals (VT100, etc.) had requirements to insert padding characters (usually zero bytes), based on a terminfo specified delay, which was given in msec. (or fractional msec). We need to insert the delay, figuring baud rate into the mix, by injecting the appropriate number of padding characters.

Minimize use of CGO

For some platforms (especially Linux, FreeBSD, Darwin) we could use the sycall package to get termio stuff. (Not sure about baud rates though --- those are constants but I don't know if the constants are available in the syscall package.)

Having these available via syscall would mean cross compilation for those platforms would be easier.

Emulation problem with control keys

So some keys (control keys) are delivered with ch != 0, which breaks the termbox applications that always want Ch == 0 if the key code is not an actual rune.

We should pass a zero value for Ch when key code != KeyRune.

Combining characters not rendered on GB18030

I made some bad assumptions that only UTF-8 would use richer character sets -- including combining character support.

Turns out I was wrong about that. GB18030 can do everything UTF-8 can do. We need to fix that.

Eliminate separate buffered implementation

It turns out that buffering is something we should just do by default. The separate buffering implementation leads to suboptimal implementation, which is covered by #3

We should just use a buffered implementation everywhere.

Support UTF-8 to 8-bit codes

Some terminals (many) have only support for one or more 8-bit languages. For example, Latin1 (8859-1) is very common.

We could look at $LANG (or LC_CTYPE or somesuch) and make a decision to convert our output to whatever form is appropriate for the given locale.

Bonus points: If we have #15 done, we could also check for support for certain special characters like pi, the UK pound sterling, etc. and translate those using ACS characters. Its unclear at this time if that's actually worthwhile.

Mouse demo improvements

The mouse demo needs to have fixes to work with non-color terminals -- it panics, and even if the panic is fixed, the colors are ugly.

Also, we should support creating selection boxes, etc. Make this much much nicer.

Expose CanDisplay(rune)

We'd like to express a better way for an application to check if it can display a particular rune.

This is pulled from #44 , and done in combination with #45

Full width characters not displayed in GB18030

Some character sets can cope with full width characters, not just Unicode.

We should assume that the width on translation is valid, if the translation was not "?", and preserve the width.

Add additional key codes

We can add a few more key codes:

F13 through F64
KeyClear
KeyCancel
KeyExit
KeyPrint

Also some things were missing for KeyInsert and KeyDelete

Writes can occur after Fini

While testing gomatrix, which runs lots of threads in parallel, I found out that on shut down the threads would continue to update the screen, resulting in garbage on shut down.

Stable output from mkinfo.go

The JSON output from mkinfo is not stable, because the Go runtime randomizes the enumeration order of maps. We should sort the aliases array, so that the database format doesn't change each time. This will drastically reduce the size of diffs in git output.

Windows performance improvements

On Windows, we the naive use of SetCell winds up having us operate suboptimally. We could be smarter here by grouping updates together.

To make this efficient, we really need to have a higher level API available for use by the BufferedScreen writer that can request the bottom layer to defer updates and then flush the entire screen.

The current Screen API is inadequate for this. Perhaps what is desired is a NewBufferedScreen() optional method on Screens; this could then allow the Windows API to create a dedicated buffered writer that does this.

Another option would be to offer an optional switch to turn off immediate writes. Not sure what is more natural.

Clean up logic for encodings, enhance fallback options

We can simplify the encoding logic so we aren't special casing UTF-8 and ASCII anymore.

Lets provide a cleaner version of the common encoding support.

While here, let's provide transformers for ASCII, ISO-Latin1, and ISO-Latin5. This should greatly expand the reach of the app, and give more correct results for people actually living in ISO 8859-1 locales (rather than the 8859-15 hack we had.)

Input of unusual characters not right in non-Unicode locales

While testing, I noticed that I somehow broke entry of non-ASCII runes when not running in a UTF-8 locale. This is trivially noticeable in the mouse.go demo.

To test it, try setting the locale in MacOS Terminal to something else, and make sure your shell and terminal are in agreement. Then you can use Unicode Hex Input to enter Unicode data points, and they will be translated as appropriate to the locale by Terminal, before delivery to the application input.

Or, you can do like I do and cut-and-paste from unicode.go, or even set the keyboard to another language (such as Russian) and try typing Russian.

Fifo overfull hang

While trying to write to the event channel we are holding a lock. If the channel overfills, we can wind up deadlocking, as the consumer may need that lock.

Let's do two things.

First deepen the channel, which reduces the likelihood of hitting this.
Second, if we can't push an event on the queue, just drop it. These are window, mouse, and keyboard events. Its not nice to drop them, but if e.g. a keyboard buffer overfills, those events are dropped too.

So that's about the best we can do.

Resize needs to invalidate cells

Noticed that when I resized a window with a different background (with gomatrix), that the new areas of the window were unpainted (because they were dirty).

Add a test framework & test code

We'd like to have some self tests, and a harness to support testing more functionality.

In fact, a "Simulation" that is just backed by a memory would be incredibly helpful to facilitate a wide variety of tests, and would be useful for folks who want to test higher level code / frameworks that are built on tcell (like topsl.)

Add SetTitle support

Both XTerm and Windows have the ability to change the title on the window. We should expose that.

Inadequate buffering dirty/detection algorithm

I've noticed that when running this with a program like sokoban, which continuously refreshes the display -- writing first an underlying value, then a a different upper layer, that we wind up thinking that these are invalidating the backing buffer; even though the end state is the same.

This causes a lot of cursor activity on, which it turns out is only visible when running a terminal that cannot hide the cursor (ANSI is a good one).

The other thing that running sokoban helped me to identify, is that things suck badly when the application wants to hide the cursor. The onscreen cursor is left in some strange place on the screen, and confuses the heck out of the user. (In the sokoban game, it can lead to confusion between the boxes on screen.)

So, when we finish drawing, if the application has requested that the cursor be hidden, lets actually just move it to the lower right corner of the screen. Its far from ideal, but its far better than leaving it floating around elsewhere on the screen.

So the fix for this involves a new common CellBuffer, that handles most of these things. The beauty of this is that cell structures are hidden from the application, and we can get a nicer API, and more code commonality between the three different screen implementations (terminfo, windows, and simulation.)

Expose some capability info

We'd like to expose some functions, e.g. for games programming, that gave hints as to the underlying API. For example:

HasMouse()
CanDisplay(rune)
HasKey(key)

This would also be useful for programs that want to e.g. decorate windows -- for example, no point in display "F1 for help" if the terminal has no F1 definition... better to say "ESC-1 for help" in that case.

Sadly the info we get won't necessarily be totally accurate -- for example, just because a mouse is supported by XTerm doesn't mean one is present, and who knows how many buttons are present. Likewise, key definitions may exist but not be present on an actual implementation.

Still, we should offer up what info we do have.

Add better mouse tracking

A few ideas here.

First, we should try to use SGR mode (1006h) if possible, after enabling the mouse.
Second, we should try to use button move events (1002h), to record relative mouse motion.
Finally, we can optionally add support for recording mouse motion events, although its unclear to me whether that is actually useful. My feeling is that button motion events (e.g. for drawing rectangles) is likely to be far far more useful.

Not all terminals support the extended modes; however it should be possible to distinguish the different report types, and further it should be possible to send all these escapes and hope that terminals that don't understand them will just ignore them.

(It appears that this is largely true; although my sample set is rather small. Certainly MacOS Terminal understands none of these, while iTerm 2 understands them all, as does modern XTerm.)

Windows reverse video broken

Reverse video does not work as doc'd. Apparently it only works for DBCS, not Unicode. We can reverse it ourselves instead. (Underline has the issue as well, but we cannot do anything about it.)

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.