Giter VIP home page Giter VIP logo

mpdcron's People

Contributors

alip avatar hfs avatar sdelafond 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

mpdcron's Issues

how do I use it?

I run the mpdcron, I can see it running, but I cannot find "eugene" "walrus" or any other process to make a query

my use case is pretty specific though, while playback, with every song change I want to query the MPD_STATUS_AUDIO_FORMAT_BITS. If 16, then execute a command, if 24 execute other command.

Will appreciate the help

When set to act on the 'playlist' event, hangs (using 100% CPU) on large playlists

This is Debian bug #573805 (http://bugs.debian.org/573805).

More info available at the URL above, but basically:

On Sun, Mar 14, 2010 at 06:59:14PM +0100, Sebastien Delafond wrote:

[stats] Resolved `localhost' to 127.0.0.1
[stats] Successful bind to 127.0.0.1:6601
[1]
Sending list_queue_meta command to Mpd server
[2]
=== it goes into an infinite loop here ===
^C[stats] Exiting

Sorry for having overlooked this detail. [1] is the point where I issue
mpc del 0. As it seems hard to reproduce I ran it again with strace, to
give you some pointers of what happens.

[pid 26309] poll([{fd=4, events=POLLIN}, {fd=6, events=POLLIN}, {fd=7, events=POLLIN}], 3, -1) = 1 ([{fd=4, revents=POLLIN}])
[pid 26309] select(5, [4], [], [4], {30, 0}) = 1 (in [4], left {29, 999993})
[pid 26309] recvfrom(4, "changed: playlist\nchanged: playe"..., 4096, MSG_DONTWAIT, NULL, NULL) = 37
[pid 26309] write(2, "Sending list_queue_meta command "..., 45Sending list_queue_meta command to Mpd server) = 45
[pid 26309] write(2, "\n", 1
) = 1
[pid 26309] sendto(4, "playlistinfo\n", 13, MSG_DONTWAIT, NULL, 0) = 13
[pid 26309] select(5, [4], [], [4], {30, 0}) = 1 (in [4], left {29, 991003})
[pid 26309] recvfrom(4, "file: "..., 4096, MSG_DONTWAIT, NULL, NULL) = 4096
[pid 26309] open("/etc/localtime", O_RDONLY) = 8
[pid 26309] fstat(8, {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] fstat(8, {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7feb77595000
[pid 26309] read(8, "TZif\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\0\0\0\10\0\0\0\0"..., 4096) = 837
[pid 26309] close(8) = 0
[pid 26309] munmap(0x7feb77595000, 4096) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] select(5, [4], [], [4], {30, 0}) = 1 (in [4], left {29, 999994})
[pid 26309] recvfrom(4, ""..., 4074, MSG_DONTWAIT, NULL, NULL) = 4074
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0
[pid 26309] stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=837, ...}) = 0

From this up a repeating pattern starting with the last select can be
seen.

Occasionally some lines like:
[pid 26832] mremap(0x7f201096e000, 458752, 462848, MREMAP_MAYMOVE) = 0x7f201096e000
or
[pid 26832] brk(0x2bd7000) = 0x2bd7000
come along. They show that mpdcron grows in memory size.

Since mpdcron continues to read data from mpd (very slowly), it is
probably not an infinite loop, but a slow algorithm. The loop seems to
be getting slower over time which suggests an O(n^2) algorithm. I should
probably mention that my playlist currently has around 10000 entries.
You can easily create such a playlist by concatenating a playlist to
itself often enough. After eleven minutes of watching mpdcron read a
playlist I gave up and killed it, because two songs already passed by.

Furthermore I verified that disabling the stats module does not solve
the problem.

A quick check of the source shows that it probably blows up in
env_list_all_meta, because it uses strftime (and thus doing all those
stat calls) and using g_setenv in a loop and thus being an O(n^2)
algorithm.

The bad thing about this is that there is no easy way to solve this
problem, because the real problem didn't even show up: Let us assume
10500 playlist entries with each of them having a filename of 60
characters. For each entry two variables are added, which should take
another 40 characters only counting the lengths of their names. So a
lower bound for the size of the environment would be 1MB. This size may
not be supported by the operating system, so the whole approach of
feeding the playlist via the environment is flawed. Using g_setenv in a
loop only makes things break at an earlier point.

Given that it requires a large playlist I downgraded the severity to
normal. I hope this helps for solving the issue.

Cheers,

--Seb

[fix] Homescrape

Homescrape does not work unless I include "require 'date'" (I use archlinux) . Please make the change in git.

scrobbler breaks when you upgrade curl 7.21.3 -> 7.21.4

On Arch Linux, I performed the following curl upgrade:

upgraded curl (7.21.3-1 -> 7.21.4-2)

As you can see, on song changes, nothing gets really submitted:

Trying to load module: scrobbler
Added module suffix scrobbler -> scrobbler.so
Trying user configured path `/home/dieter/.mpdcron/modules/scrobbler.so'
Trying system path `/usr/lib/mpdcron-0.3/modules/scrobbler.so'
Found scrobbler -> `/usr/lib/mpdcron-0.3/modules/scrobbler.so'
[scrobbler] Starting mpdcron/scrobbler (mcn 0.3)
Loaded module `/usr/lib/mpdcron-0.3/modules/scrobbler.so'
Connecting to `localhost' on port 6600 with timeout 0
Connected to Mpd server, running version 0.16.0
Sending idle command with mask 0xff
Sending status & currentsong commands to Mpd server
[scrobbler] New song detected (Hallucinogen - Jiggle of the Sphinx), id: 115, pos: 115
Setting environment variable MC_CALLS_PLAYER=1
Running hook: hooks/player home directory: /home/dieter/.mpdcron
Failed to execute hook player: Failed to execute child process "hooks/player" (No such file or directory)
Sending idle command with mask 0xff
Sending status & currentsong commands to Mpd server
[scrobbler] Submitting old song (Hallucinogen - Jiggle of the Sphinx), id: 115, pos: 115
[scrobbler] 1301211789, songchange: Hallucinogen - Jiggle of the Sphinx (399)
[scrobbler] New song detected (Fluro Conspiracy - Ancient Suns), id: 116, pos: 116
Setting environment variable MC_CALLS_PLAYER=2
Running hook: hooks/player home directory: /home/dieter/.mpdcron
Failed to execute hook player: Failed to execute child process "hooks/player" (No such file or directory)
Sending idle command with mask 0xff

So I downgraded curl again, and then it works fine:

Trying to load module: scrobbler
Added module suffix scrobbler -> scrobbler.so
Trying user configured path `/home/dieter/.mpdcron/modules/scrobbler.so'
Trying system path `/usr/lib/mpdcron-0.3/modules/scrobbler.so'
Found scrobbler -> `/usr/lib/mpdcron-0.3/modules/scrobbler.so'
[scrobbler] Starting mpdcron/scrobbler (mcn 0.3)
Loaded module `/usr/lib/mpdcron-0.3/modules/scrobbler.so'
Connecting to `localhost' on port 6600 with timeout 0
Connected to Mpd server, running version 0.16.0
Sending idle command with mask 0xff
[scrobbler] [last.fm] handshake successful
[scrobbler] [last.fm] session: <id>
[scrobbler] [last.fm] now playing url: http://post.audioscrobbler.com:80/np_1.2
[scrobbler] [last.fm] submit url: http://post2.audioscrobbler.com:80/protocol_1.2
Sending status & currentsong commands to Mpd server
[scrobbler] New song detected (Hara Gobi - 303 Gold), id: 117, pos: 117
Setting environment variable MC_CALLS_PLAYER=1
Running hook: hooks/player home directory: /home/dieter/.mpdcron
Failed to execute hook player: Failed to execute child process "hooks/player" (No such file or directory)
Sending idle command with mask 0xff
[scrobbler] [last.fm] sending 'now playing' notification
[scrobbler] [last.fm] post data: &s=<some data here>
[scrobbler] [last.fm] url: http://post.audioscrobbler.com:80/np_1.2
[scrobbler] [last.fm] OK

Reimplementation of option and playlist hooks

The option and playlist hooks would be very very helpful for me.

I read the bug report about it. I don't know if there is always the need for transfering so much data. For me is only the hook call of option/playlist needed.

modules are missing

$ mpdcron -n
Trying to load module: scrobbler
Added module suffix scrobbler -> scrobbler.so
Trying user configured path `/home/chris/.mpdcron/modules/scrobbler.so'

Trying system path `/usr/lib/mpdcron-0.3/modules/scrobbler.so'
Error loading module scrobbler: file not found

Cache of mirrored tracks recently played by mpd

I'd love to be able to listen to my I large-ish music collection (kept on a headless mpd server) even when I lose network connectivity, and without having to tend to a local mirror as my collection evolves.

What I envision is essentially a local music cache: Earmarking a storage area (e.g. 3GB) on my mobile device or laptop, and then having that space automatically fill with the most recent songs played by mpd (which will approximate those I'm most likely to want to hear again soon). Once the area's full, the song least-recently played by mpd would be overwritten.

Has this or something like it been done? Could an mpdcron configuration help to achieve it? Would that require a new mpdcron module? Is there a forum better-suited to this post, to keep this issue tracker free of overly ambitious feature requests?

I'd welcome responses to any of these questions!

Error in homescrape

When i run homescrape, i get this error after a few entries:

........
Modified 1 entries

  • eugene count 1 "artist='Gran Ronde' and title='Wisdom'"
    Modified 1 entries
  • eugene count --artist 1 "name='Gran Ronde'"
    Modified 1 entries
    /usr/bin/homescrape:125:in sprintf': malformed format string - %' (ArgumentError) from /usr/bin/homescrape:125:inblock in '
    from /usr/bin/homescrape:77:in call' from /usr/bin/homescrape:77:inblock in fetch'
    from /usr/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xml/node_set.rb:213:in block in each' from /usr/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xml/node_set.rb:212:inupto'
    from /usr/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xml/node_set.rb:212:in each' from /usr/bin/homescrape:67:infetch'
    from /usr/bin/homescrape:81:in fetch' from /usr/bin/homescrape:81:infetch'
    from /usr/bin/homescrape:81:in fetch' from /usr/bin/homescrape:81:infetch'
    from /usr/bin/homescrape:81:in fetch' from /usr/bin/homescrape:81:infetch'
    from /usr/bin/homescrape:81:in fetch' from /usr/bin/homescrape:81:infetch'
    from /usr/bin/homescrape:123:in `'

Please add --log and --verbose options

Sometimes mpdcron does not work (I'll elaborate in a while). Without --verbose and --log options, it's next to imposible to track what's happening or what certainly is wrong. Please add them, it would be very helpful.
Or, if these are already present, please add note in -h and/or man page and/or mpdcron.conf file.

OK, speaking of my strange behavior, there is a log from console:

minio@pingwin ~ ]:-> mpdcron -k

** (mpdcron:10542): WARNING **: Failed to kill daemon: Operation not permitted
minio@pingwin ~ ]:-> mpdcron 
Daemon already running on PID 2295
minio@pingwin ~ ]:-> ps aux |grep -i 2295
minio    10640  0.0  0.0   7560   880 pts/1    S+   23:07   0:00 grep --colour=auto -i 2295
minio@pingwin ~ ]:-> su -
root@pingwin:~# mpdcron -k
** (mpdcron:10749): DEBUG: Configuration file `/root/.mpdcron/mpdcron.conf' not found, skipping

** (mpdcron:10749): WARNING \*\*: Failed to kill daemon: No such file or directory
root@pingwin:~# exit
logout
minio@pingwin ~ ]:-> mpdcron 
Daemon already running on PID 2295
minio@pingwin ~ ]:-> su -
root@pingwin:~# kill -9 2295
root@pingwin:~# mpdcron 
** (mpdcron:10861): DEBUG: Configuration file `/root/.mpdcron/mpdcron.conf' not found, skipping
Daemon returned 2 as return value
root@pingwin:~# exit
logout
minio@pingwin ~ ]:-> mpdcron 
Process 2295 died: No such process; trying to remove PID file. (/home/minio/.mpdcron/mpdcron.pid)
Daemon returned 0 as return value

I would like to track a reason of this, but mpdcron does not give me any tools :( .

Update documentation

@alip with the wikia documentation no longer existing and also the gh pages no longer existing, could you add them to the repo as markdown?

[stats] Periodically saving old song fails

Issuing...

$ eugene listinfo 1 | grep Play_Count:1

... reveals that play counts are periodically not being updated, which I've narrowed down to this:

[stats] Saving old song failed: sqlite3_step: not authorized

My mpdcron.conf and mpdcron --no-daemon output follows:

[main]
killwait = 3
modules = stats

[mpd]
events = database;stored_playlist;playlist;player;mixer;output;options;update
reconnect = 5
timeout = 0

[stats]
bind_to_addresses = localhost
port = 6601

$ mpdcron --no-daemon
Trying to load module: stats
Added module suffix stats -> stats.so
Trying user configured path `/home/tom/.mpdcron/modules/stats.so'
Trying system path `/usr/lib/mpdcron-0.3/modules/stats.so'
Found stats -> `/usr/lib/mpdcron-0.3/modules/stats.so'
[stats] Initializing
Loaded module `/usr/lib/mpdcron-0.3/modules/stats.so'
Connecting to `localhost' on port 6600 with timeout 0
Connected to Mpd server, running version 0.15.0
Sending idle command with mask 0xff
[stats] Resolved `localhost' to 127.0.0.1
[stats] Successful bind to 127.0.0.1:6601
Sending status & currentsong commands to Mpd server
[stats] New song detected (Nirvana - Dumb), id: 15, pos: 15
Setting environment variable MC_CALLS_PLAYER=1
Running hook: hooks/player home directory: /home/tom/.mpdcron
Failed to execute hook player: Failed to execute child process "hooks/player" (No such file or directory)
Sending idle command with mask 0xff
Sending status & currentsong commands to Mpd server
[stats] Saving old song (Nirvana - Dumb), id: 15, pos: 15
[stats] Saving old song failed: sqlite3_reset: not authorized

Error while using 'stats' module

$ mpdcron -n
When a song starts:

Sending status & currentsong commands to Mpd server
[stats] New song detected (Kings of Convenience - The Build Up), id: 207, pos: 11
Setting environment variable MC_CALLS_PLAYER=1
Running hook: hooks/player home directory: /home/rafi/.mpdcron
Failed to execute hook player: Failed to execute child process "hooks/player" (No such file or directory)
Sending idle command with mask 0x18

This is my mpdcron configuration file:

[main]
modules = stats
pidfile = /home/rafi/.mpdcron/mpdcron.pid
killwait = 3
loglevel = 2
[mpd]
events = player;mixer
reconnect = 5
timeout = 0

[stats]
dbpath = /home/rafi/.mpdcron/stats.db
bind_to_addresses = localhost
port = 6601
default_permissions = select;update
passwords = needvodka@update;needbeer@select

Is the modules = variable supposed to be under [main] or [player] ?

Excessive Logging

First of all thanks for a great utility

I only have one gripe and that's the amount of logging I am getting for such things as scrobbling activity, my main logs are being flooded with this activity.

I can't seem to find a way of addressing this, there is nothing available in the conf file to set logging levels and no documentation on what is available. If there isn't an option can one be added please, if there is then please tell me what it is and how it works.

Thanks again for this very useful app which I am using to generate coverart and lyrics files on song changes, previously I had to poll mpd continuously to find out what is happening.

Daemon returned 2 as return value

When I try to run mpdcron it just says "daemon returned 2 as return value". Using arch linux, issue occurs both in the AUR package as well as when I compile it myself. No error is given when mpdcron -n is run

Quickly skipping through songs doesn't update notify-osd

Using the notification module, when I listen to a song it is displayed in a notification bubble. However, there is a set time before which the bubble won't disappear. If, before that time passes, I play another song, the notification for playing that song isn't shown until the one for the previous song has disappeared, whereas it should in fact update the notification bubble for the previous song.

(Note: this bug is the same as was present in the Panflute GNOME panel applet: https://bugs.launchpad.net/panflute/+bug/471499, so the error is not in notify-osd but in mpdcron.)

Scrobbler broken

[scrobbler] [last.fm] handshake failed, username or password incorrect (BADAUTH)

[scrobbler]
[last.fm]
url = http://post.audioscrobbler.com
username = hawk198
password = ******

Any workaround about this issue?

systemd support

It would be nice to have some systemd support. I have a service file for my own use that could work:

[Unit]
Description=mpdcron

[Service]
Environment="MPDCRON_DIR=/var/lib/mpd/mpdcron"
ExecStart=/usr/bin/mpdcron --no-daemon

[Install]
WantedBy=multi-user.target

wrong hook

on update event called options hook

--- src/cron-event.c 2010-12-22 22:29:33.000000000 +0500
+++ /home/noname/cron-event.c 2010-12-22 22:27:32.000000000 +0500
@@ -225,7 +225,7 @@
/* A database update has started or finished.
* Send status command and add the variables to the environment.
*/

  • name = mpd_idle_name(MPD_IDLE_OPTIONS);
  • name = mpd_idle_name(MPD_IDLE_UPDATE);

g_debug("Sending status command to Mpd server");
if ((status = mpd_run_status(conn)) == NULL)

stats module queries

The stats module is the most interesting part of mpdcron for me, however, I'm having trouble configuring it.

I have the following dependencies installed:

sqlite3 v3.6.23.1
ruby 1.9.1p378
nokogiri 1.4.1

I'm running ArchLinux and can't find a package for gio. Perhaps gvfs?

My config file is just as standard.

mpdcron launches fine, similarly for walrus to update. I'm not so sure about eugene however. I get errors if I run something like:

$ eugene list radiohead
Failed to list song: EOF while trying to read a line

$ eugene listtags
Failed to list tags of current playing song: you don't have permission for "listtags"

Also, with homescrape I get:

$ homescrape 
/usr/bin/homescrape:106:in `<main>': undefined method `parse' for Date:Class (NoMethodError)

Sorry for the naïvety of this post.

hooks/player executed TWICE when song changes

When a new song begins, the hooks/player is executed twice, instead of only once.
When I change a song manually, it's executed once as expected.

Is it something you can look into?
(mpdcron 0.3)

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.