Code Monkey home page Code Monkey logo

done's Introduction

done

A fish shell package to automatically receive notifications when long processes finish.

Stability: Stable Release version fish >=2.3.0 License: MIT


Just go on with your normal life. You will get a notification when a process takes more than 5 seconds finish, and the terminal window not in the foreground.

After installing you could type, for instance sleep 6, and start using other app. After 6 seconds you should get a notification.

Installation

Using Fisher

fisher install franciscolourenco/done

Manually

curl -Lo ~/.config/fish/conf.d/done.fish --create-dirs https://raw.githubusercontent.com/franciscolourenco/done/master/conf.d/done.fish

Arch Linux

Install the fish-done package from AUR.

yay -S fish-done

Dependencies

  • If you want notifications with icons on macOS, please install terminal-notifier with
brew install terminal-notifier
  • If you are using https://swaywm.org please install jq.

  • If you are using Windows Subsystem for Linux (WSL) you may need to install wslu, but usually it is pre-installed.

Updating

fisher update franciscolourenco/done

Settings

Only display notifications if a command takes more than a certain amount of time

set -U __done_min_cmd_duration 5000  # default: 5000 ms

Prevent specific commands from triggering notifications.

It accepts a list of regex patterns. This is useful to exclude commands like for instance git commit, since it could trigger unwanted notifications if it is configured to use an external editor. This is also useful with set -U __done_allow_nongraphical 1 to prevent notifications for commands normally run interactively that you do not want to get done notifications for.

set -U __done_exclude '^git (?!push|pull|fetch)'  # default: all git commands, except push and pull. accepts a regex.

You can add more exclude patterns to the existing ones by using the --append option:

set -U --append __done_exclude '^emacsclient'

Execute a custom command instead of showing the default notifications. The done notification title and message can also be passed.

set -U __done_notification_command "your-command \$title \$message"

Play sound when showing notifications.

set -U __done_notify_sound 1

When using sway, do not show notifications for visible windows.

set -U __done_sway_ignore_visible 1

For Linux, set the urgency level for notifications sent via notify-send (low, normal, critical). The default is "normal" for regular commands, and "critical" for failed commands.

set -U __done_notification_urgency_level low
set -U __done_notification_urgency_level_failure normal

Allow notifications to be sent on systems without graphical capabilities. Note this requires you to also set __done_notification_command.

set -U __done_allow_nongraphical 1

Notifications are unavailable under Wayland. However, if you are using Kitty, you can enable it by using Kitty's remote control.

You need to install jq.

In kitty.conf (change "kitty-rc-password" to your liking):

remote_control_password "kitty-rc-password" ls
allow_remote_control password

In fish

set -U __done_kitty_remote_control 1
set -U __done_kitty_remote_control_password "kitty-rc-password"

For Linux (except Ubuntu's Notify OSD), set the timeout in milliseconds at which to expire the notification. The default is "3000" (3 seconds). Set to "0" if you want it to never expire.

set -U __done_notification_duration 5000 # 5 seconds

Support

  • fish 2.3.0+
  • macOS 10.8+ via Notification Center.
  • Linux via notify-send. Otherwise bell sound is played.
  • Windows 10 via Windows Subsystem for Linux (WSL) and PowerShell.

Credits

Contributors

Code Contributors

This project exists thanks to all the people who contribute. [Contribute].

Financial Contributors

Become a financial contributor and help us sustain our community. [Contribute]

Individuals

Organizations

Support this project with your organization. Your logo will show up here with a link to your website. [Contribute]

License

Done is MIT licensed. See LICENSE for details.

done's People

Contributors

9999years avatar aaronlasseigne avatar ammgws avatar asymmetric avatar azenet avatar barbzyhool avatar charliemaiors avatar drymarchonshaun avatar eugene-babichenko avatar evanrelf avatar franciscolourenco avatar frazar avatar gpanders avatar grimpy avatar huafu avatar ilancosman avatar jacobhayes avatar jinliu avatar jjanyan avatar joehillen avatar jorgebucaran avatar jriddy avatar kidonng avatar liblit avatar monkeywithacupcake avatar nzig avatar postsolar avatar samuelsarle avatar wesalvaro avatar yajo 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

done's Issues

Make the list of excluded commands configurable

It would be nice if I could exclude certain commands from the list; particularly those who are interactive, such as vim, git commit or git add -i. Since I'm interacting with those commands myself, I get no value from being notified about those commands finishing; and since the whole command is driven by human actions, they often take more than ten seconds.

I see in the source code that there's already a list of commands to ignore; it would be nice if it were customizable. If you have any ideas about how this should be implemented, I may be able to implement this myself.

Another approach would be to detect if a command is interactive, I guess? I have no idea if that's remotely feasible or not.

No notifications on debian 10

I followed the manual instrunctions from the readme:

> curl -Lo ~/.config/fish/conf.d/done.fish --create-dirs https://raw.githubusercontent.com/franciscolourenco/done/master/conf.d/done.fish

Even after logging in again sleep 6 doesn't lead to a notification. I have no clue what I have done wrong, or what part isn't working. I would be happy if you can help. Thanks for your time.

System information:

  • Debian 10
  • With Gnome
  • tried fish version 3.0.2 and 3.1.2 from backports
  • > echo $__done_version
    1.15.0

Edit:

notify-send test leads to a notification

Error connecting to tmux

I don't use tmux and done 1.7 started giving me error messages about being unable to connect to tmux on stderr.

> sleep 6
error connecting to /tmp/tmux-1000/default (No such file or directory)

Failed notifications won't disappear

When I have some command that returns a non-zero status, the notification stays on the screen forever, until I manually close it. I'm using done with KDE Plasma, under Arch Linux, and this only happens for notifications of this package.

test: Missing argument at index 2

Hi, since this morning I started to have errors at the end of every command output:

$  sleep 6; echo yay
yay
test: Missing argument at index 2

~/.config/fish/conf.d/done.fish (line 180):
                if test -q __done_notification_urgency_level
                   ^
in function '__done_ended'
in event handler: handler for generic event “fish_prompt”

(Type 'help test' for related documentation)

not sure what caused the issue. Alerts are working fine as usual (both normal and errors).

I'm using tmux 3.1b, fish 3.1.2, done 1.14.7.

Customize command used to send notifications?

Would it be possible to customize the command that's used? I use ntfy for the same purpose, but I always have to run everything prefixed by the command. This plugin is great in that it's automatic, but it's currently not working for me, and I don't really want to install Ruby just to install the terminal notifier...

Option to time limit notifications (`notify-send --expire-time …`)

I generally love using your package (I get alerted when long compilation or test run on another desktop is over), but I repeatably end up with 3-6 notifications hanging on the screen as closing them is unpleasant.

It would be nice if they could disappear by themselves.

I changed line 222 of done.fish to:

notify-send --urgency=$urgency --icon=utilities-terminal --app-name=fish --expire-time=60000  "$title" "$message"

and my notifications nicely disappear after 60 seconds under KDE Plasma.

I noticed that notify-send manpage claims that Gnome Shell ignores this param, and I do not know how well it is supported by non-Linux tools, but … well, there is at least one popular desktop which handles that limit properly.

Of course hardcoding 60s is bad idea, whether such time limit is used and which should be configurable via some variable (and in case it is enabled by default, sth like 5 mins seems more reasonable).

Feature request: Custom notification command

Thanks for making an interesting plugin!
I'll definitely use it if we can configure the command to notify.

Here's why:

  • I'm a both Windows and Linux user. And I usually run Linux on Virtualbox without a desktop environment, which makes it hard to notify graphically. So I invented an original command to notify on Windows (by combining a tiny server and NAT).
  • My favorite notification method is popping up a banner on a separate terminal window.
  • (Update) bell is not sufficient. Because I usually mute my laptop in the office.

Thanks in advance.

Bad quotes in __done_humanize_duration?

When a long-running process finishes, these messages show up in the terminal:

(standard_in) 1: syntax error
(standard_in) 1: syntax error
test: Missing argument at index 2
test: Missing argument at index 2

Also, the title of the notification is just "Done in", not e.g. "Done in 20s".

I think the problem is on lines 159 and 160 of done.fish, which read:

set -l seconds (math --scale=0 "$milliseconds/1000" % 60)
set -l minutes (math --scale=0 "$milliseconds/60000" % 60)

Running one of those lines in a terminal fails. I think Fish doesn't like the %. If I move the quotes to this...

set -l seconds (math --scale=0 "$milliseconds/1000 % 60")
set -l minutes (math --scale=0 "$milliseconds/60000 % 60")

...then the error messages go away, and the notification shows the runtime.

tmux support

AFAICT, this doesn't work with tmux.

OS: MacOS 10.14.5
Terminal: iTerm2 3.3.0beta5
tmux: 2.9a
fish: 3.0.2

without tmux, this works as expected. With tmux, I get no notifications.

test: Missing argument at index 2

balupton@balbook ~> fisher done
Installing 1 plugin/s
OK Fetch done github.com/fisherman/done
Installing 1 dependency
OK Fetch humanize_duration github.com/fisherman/humanize_duration
Done in 5s 980ms
balupton@balbook ~> ping -t 5 google.com
PING google.com (216.58.200.110): 56 data bytes
64 bytes from 216.58.200.110: icmp_seq=0 ttl=55 time=55.864 ms
64 bytes from 216.58.200.110: icmp_seq=1 ttl=55 time=58.456 ms
64 bytes from 216.58.200.110: icmp_seq=2 ttl=55 time=57.946 ms
64 bytes from 216.58.200.110: icmp_seq=3 ttl=55 time=58.496 ms
64 bytes from 216.58.200.110: icmp_seq=4 ttl=55 time=56.049 ms

--- google.com ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 55.864/57.362/58.496/1.165 ms
balupton@balbook ~> ping -t 15 google.com
PING google.com (216.58.200.110): 56 data bytes
64 bytes from 216.58.200.110: icmp_seq=0 ttl=55 time=55.806 ms
64 bytes from 216.58.200.110: icmp_seq=1 ttl=55 time=58.316 ms
64 bytes from 216.58.200.110: icmp_seq=2 ttl=55 time=55.934 ms
64 bytes from 216.58.200.110: icmp_seq=3 ttl=55 time=55.723 ms
64 bytes from 216.58.200.110: icmp_seq=4 ttl=55 time=58.599 ms
64 bytes from 216.58.200.110: icmp_seq=5 ttl=55 time=58.707 ms
64 bytes from 216.58.200.110: icmp_seq=6 ttl=55 time=55.607 ms
64 bytes from 216.58.200.110: icmp_seq=7 ttl=55 time=58.368 ms
64 bytes from 216.58.200.110: icmp_seq=8 ttl=55 time=58.910 ms
64 bytes from 216.58.200.110: icmp_seq=9 ttl=55 time=58.689 ms
64 bytes from 216.58.200.110: icmp_seq=10 ttl=55 time=58.462 ms
64 bytes from 216.58.200.110: icmp_seq=11 ttl=55 time=58.585 ms
64 bytes from 216.58.200.110: icmp_seq=12 ttl=55 time=55.883 ms
64 bytes from 216.58.200.110: icmp_seq=13 ttl=55 time=58.740 ms
64 bytes from 216.58.200.110: icmp_seq=14 ttl=55 time=59.470 ms

--- google.com ping statistics ---
15 packets transmitted, 15 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 55.607/57.720/59.470/1.389 ms
test: Missing argument at index 2

It's doing nothing with SSH + Byobu + Fish

I don't know what the plugin is supposed to do but I type "sleep 6" and nothing happens.

I made my tests by connecting on a debian 9 server, logging in SSH, in Byobu, installing fisherman and "done" aand typing "sleep 6" and switching window or not.

Add config for bell sound

Something like:

set -l NOTIF_BEEP 1 # Allow beep or not

# Beep				
if test "$NOTIF_BEEP" -eq 1
	echo -n \a
end

(btw the bell sound doesn't work on my computer but that's not fish related)

Unknown command '__done_get_window_id'

done 1.7 tries to call __done_get_window_id but that function does not seem to be defined. Is it supposed to be __done_get_focused_window_id?

> true
fish: Unknown command '__done_get_window_id'
~/.config/fish/conf.d/done.fish (line 1): 
__done_get_window_id
^
in command substitution
	called on line 62 of file ~/.config/fish/conf.d/done.fish

in function “__done_started”
	called on standard input
	with parameter list “true”

in event handler: handler for generic event “fish_preexec”

Any way to prevent notifications when iTerm2 stops to wait for GUI app?

I have an editw function that opens a file in TextMate and waits (mate -w) for the file to be closed before allowing the terminal to continue. This is the only way to use a GUI editor for things like git commit messages or interactive rebase. The editw function falls back to using Vim for non-login shells and SSH connections.

I get no notification when this function ends up launching Vim since it lives in the terminal, but when TextMate is invoked from the terminal, I always get a notification from done when it closes and the terminal continues.

screen shot 2017-05-20 at 1 27 00 pm

Is there a way to change this behavior?

It seems like a list of commands to exclude (like this example) might be the simplest way to accomplish this. The list would need to be user-configurable. I can submit a PR to introduce excluded commands unless someone knows of a better approach.

Support for tab detection

Actually, it displays the notification when the window is not focused, which is great, but if you open a new tab and switch to it, then the notification won't display because it considers you're in the same windows (which is true lol)

Need to add a tab option

I'm on linux so it's probably this line to edit, but no idea how:

	xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2

Maybe getting the tab title can work too?

PS: why is the main file in /conf.d/ ??

Add support for done notifications from remote servers via custom command

In #36 it was pointed out that Done does not send message when working on a remote server.

This feature request is to allow the user to use a custom command to allow sending the done message to them. Getting notification message to popup on remote machines is problematic at best.

However there are a number of push and chat services such as PushBullet and Telegram that have APIs that allow one to quickly put together a Fish function or shell script that sends out a message. I have created some of these that I can add to the end of a long running command, however I sometimes forget to add the notification function command after my long running command, ie. sleep 300; telegram-me and then of course do not get notified.

Looking at the done code there are numerous checks to make sure that the terminal window is not in the foreground and that this is not a SSH session.

Done also appears to have the option to run a custom command to notify, but it seems no way to pass the done message to that custom command.

To do list get notifications while ssh into a remote server.

1. Add a way to disable foreground checking
2. Add a to disable SSH checking
3. Add a way to pass the done message to the custom command
4. Document usage.

In my original comment on #36, I suggested that variables could be set for some of these but I think that a configuration file for done might be a better idea for setting the above three items.

If the done project also wants to include sample Fish functions for some of the push and chat services, I could help out by creating on for Telegram.

After the above is finished the user could install done on the remote server then configure it to disable foreground checking, disable SSH checking, and set the custom command that done will call and pass the message to so that it can be delivered.

wslvar windir error

Hi,

I'm getting the following error after a fisher add:

❯ sleep 7

wslvar: command not found
~/.config/fish/conf.d/done.fish (line 1): 
wslvar windir
^
in command substitution
        called on line 1 of file ~/.config/fish/conf.d/done.fish
in command substitution
        called on line 164 of file ~/.config/fish/conf.d/done.fish
in function '__done_ended'
in event handler: handler for generic event “fish_prompt”
~/.config/fish/conf.d/done.fish: Unknown error while evaluating command substitution
in command substitution
        called on line 164 of file ~/.config/fish/conf.d/done.fish
in function '__done_ended'
in event handler: handler for generic event “fish_prompt”
~/.config/fish/conf.d/done.fish: Unknown error while evaluating command substitution
in function '__done_ended'
in event handler: handler for generic event “fish_prompt”

No protocol specified when using executing the xprop line in done.fish

https://github.com/fisherman/done/blob/d07eca1cde37303cf63ca8ab4fbb951d883a3f81/conf.d/done.fish#L30

I sourced done.fish in my config.fish, and after every fish prompt, there will be a line of error message:

No protocol specified

and found the issue is caused by the xprop line:

xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2

but I'm not familiar with the xprop, after googling a while but didn't get the solution.

FYI:
openSUSE Tumbleweed
fish-shell v2.7.1

Not doing anything on WSL 2 with burnt toast installed

When I run sleep 6 like in the readme.md, no burnt toast output is displayed. Burnt toast does work when the New-BurntToastNotification command is run in both PowerShell 5 (default windows) and PowerShell 7 (the new open source one), which means it isn't a executionpolicy issue.

Needed to log out

Hey, thank you for this project. It's a really handy feature to get notifications for long-running commands, it's something I've long wanted to have ❤️

I had to log out from my sway session to get this to apply. You could maybe add some notice in the readme about that. Something like:

## Installation
...
You may also need to log out of your current session.

Have a nice day 👍

"Unknown option --app-name=terminal"

It doesn't work for my old platform which is CentOS 6.5 32-bit

notify-send -v: 0.5.0

Error message:

Unknown option --app-name=terminal

Don't know if it is caused by the old version of notify-send, but I cannot get new version right now.

So, after modifying the line in done.fish

notify-send --icon=terminal --app-name=terminal "$title" "$message"

to

notify-send --icon=terminal "$title" "$message"

it will work.

BTW: you didn't mention in the README.md file that the done plugin depends on humanize_duration plugin.

Incrementally editing __done_exclude (as list?)

After using done for some time, I find maintaining __done_exclude unpleasant. It simply grows long. Mostly it's because I happen to spawn GUI apps from the terminal, and - for example - when my emacsclient -cn ends it's job after an hour or two, fish gladly notifies me.

So it would be nice if I could „add next exception without touching those already existing”. For example by sth like

set -Ua __done_exclude  emacsclient
set -Ua __done_exclude '(scite|gedit)'

(result: all exceptions which were present, are still there, and I just added two more)

Default excluded commands

I suggest to add these commands to the default ignored commands:

nano vim edit sudoedit ssh top man htop iotop less more

If I find more I'll note them down.

Feel free to discuss them

done.fish invokes the ImageMagick import utility and break everything

Hi there, thank you for your work!

Since the latest version 1.14.1, it seems like done.fish is invoking import somewhere and import is also known as an ImageMagick tool, blocking the shell, waiting for a GUI input.

I'm not sure if it's related to PowerShell addition because of Import-Module or something like this.

Can I give you some help to find this?

Thanks!

Unknown command: humanize_duration

Whenever I run a command I get this error message

fish: Unknown command: humanize_duration ~/.config/fish/functions/fish_right_prompt.fish (line 1): echo $CMD_DURATION | humanize_duration ^ in command substitution called on line 28 of file ~/.config/fish/functions/fish_right_prompt.fish in function 'fish_right_prompt' in command substitution ~/.config/fish/functions/fish_right_prompt.fish: Unknown error while evaluating command substitution in function 'fish_right_prompt' in command substitution

Question about test file

The file at test/done.fish doesn't appear to contain valid fish syntax where the test function is used, is this on purpose?

function setup
  source conf.d/done.fish
end

test "command are executed without errors"
  0 -eq (echo 1 > /dev/null; echo $status)
end

Output:

/t/d/test >>> fish done.fish
done.fish (line 7): 'end' outside of a block
end
^
fish: Error while reading file done.fish

eval: command not found

I have this error after the last FISH update (to 3.1).
done version 1.14.3

~/.config/fish/conf.d/done.fish (line 126): 
                eval $__done_notification_command
                ^
in function “__done_ended”
	called on standard input

in event handler: handler for generic event “fish_prompt”

Threshold duration before notification

I've been thinking about reducing the default minimum period a command needs to run in order to trigger a notification from 10s to 3s or 5s. Any scenarios where you think this would be undesirable?

Executing function on start

Current version defines multiple functions which need to be loaded in order for the plugin to work. Fish however, only loads automatically the function which name matches the file's name (_done in this case).

One option would be to define all the functions inside a main function, but then, the main function needs to also be executed when the shell is started, not only loaded.

@jbucaran Any idea on how to work around this?

Example:

function _done

	set _initial_window_id ''

	function _get_window_id
		if _is_available lsappinfo
			lsappinfo info -only bundleID (lsappinfo front) | cut -d '"' -f4
		else if _is_available xprop
			xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2
		end

	end

	function _is_terminal_focused
		test $_initial_window_id = (_get_window_id)
	end

	function _is_available
		type -q $argv
	end

	function _started --on-event fish_preexec
		echo "_ended"
		set _initial_window_id (_get_window_id)
	end

	function _ended --on-event fish_prompt
		echo "_ended"
		if test $CMD_DURATION
			# Store duration of last command
			set duration (echo "$CMD_DURATION 1000" | awk '{printf "%.3fs", $1 / $2}')
			set notify_duration 10000

			if begin
					test $CMD_DURATION -gt $notify_duration  # longer than notify_duration
					and not _is_terminal_focused  # terminal or window not in foreground
				end

				set -l title "Finished in $duration"
				set -l message "$history[1]"

				if _is_available terminal-notifier  # https://github.com/julienXX/terminal-notifier
					terminal-notifier -message "$message" -title "$title" -sender "$_initial_window_id"

				else if _is_available osascript  # AppleScript
					osascript -e "display notification \"$message\" with title \"$title\""

				else if _is_available notify-send # Linux notify-send
					notify-send --icon=terminal --app-name=terminal "$title" "$message"

				else  # anything else
					echo -e "\a" # bell sound
				end

			end
		end
	end
end

done doesn't work on KDE Neon/Ubuntu 18.04

Running __done_get_focused_window_id currently returns this:

$ __done_get_focused_window_id
usage:  xprop [-options ...] [[format [dformat]] atom] ...

where options include:
    -grammar                       print out full grammar for command line
    -display host:dpy              the X server to contact
    -id id                         resource id of window to examine
    -name name                     name of window to examine
    -font name                     name of font to examine
    -remove propname               remove a property
    -set propname value            set a property to a given value
    -root                          examine the root window
    -len n                         display at most n bytes of any property
    -notype                        do not display the type field
    -fs filename                   where to look for formats for properties
    -frame                         don't ignore window manager frames
    -f propname format [dformat]   formats to use for property of given name
    -spy                           examine window properties forever

It is the results of running xprop -version 2>&1 >/dev/null at done.fish#L33. There is no option -version in KDE Neon's (which is Ubuntu 18.04-based) xprop. Commenting out that line makes it work well.

Notification even when window is active

Hey,

somehow there is a notification coming even tho the terminal is my active window but I had multiple terminals open. (the open with task was the active one)

Best 💪

Source fish file option?

__done_notification_command is good enough for simple things but the escaping needed can get really bad for complex commands.

What do you think about testing if __fish_config_dir/conf.d/done_command.fish exists and sourcing it in case it does?

I'm up to making a PR. I actually have my done.fish edited in this way already.

Prompt stuck in Linux VT console

Prompt hangs if fish is being run from Linux VT console.
This happens because test -n __done_get_focused_window_id always evaluates to true, regardless of DISPLAY variable being set.

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.