Giter Club home page Giter Club logo

pg_activity's Introduction

pg_activity

Command line tool for PostgreSQL server activity monitoring.

Latest PyPI version Lint Tests

pg_activity screenshot

Installation

From distribution packages

The simplest way to install pg_activity is through the package manager of your Linux distribution, if it ships with a package. E.g., on Debian-based distributions (e.g. Debian, Ubuntu, Mint...):

$ sudo apt install pg-activity

(on Debian bullseye, the current stable version, a backport is available: apt install pg-activity/bullseye-backports).

The PostgreSQL Global Development Group (PGDG) also provides packages for RPM-based (https://yum.postgresql.org/) and Debian-based distributions (https://wiki.postgresql.org/wiki/Apt).

Note: distribution packages may not be up to date with the latest pg_activity releases. Before submitting a bug report here:

  • check the package version, compare that to our latest release and then review the change log to see if the bug has been fixed;
  • if the issue is about packaging, e.g. missing dependencies, reach out the package maintainer (or PGDG) first.

From PyPI

pg_activity can be installed using pip on Python 3.8 or later along with psycopg:

$ python3 -m pip install "pg_activity[psycopg]"

Alternatively, pipx can be used to install and run pg_activity in an isolated environment:

$ pipx install "pg_activity[psycopg]"

In case your $PATH does not already contain it, the full path is:

$ ~/.local/bin/pg_activity

From source, using git

This is only necessary to test development versions. First, clone the repository:

$ git clone https://github.com/dalibo/pg_activity.git

Change the branch if necessary. Then create a dedicated environment, and install pg_activity with the psycopg database driver:

$ cd pg_activity
$ python3 -m venv .venv
$ . .venv/bin/activate
(.venv) $ pip install ".[psycopg]"
(.venv) $ pg_activity

To quit this env and destroy it:

$ deactivate
$ rm -r .venv

Usage

pg_activity works locally or remotely. In local execution context, to obtain sufficient rights to display system information, the system user running pg_activity must be the same user running postgresql server (postgres by default), or have more rights like root. The PostgreSQL user used to connect to the database must be super-user in order to get as much data as possible. Otherwise, pg_activity can fall back to a degraded mode where some data like system information or temporary file data are not displayed.

ex:

sudo -u postgres pg_activity -U postgres

Options

pg_activity [options] [connection string]

Configuration:
  --profile PROFILE     Configuration profile matching a PROFILE.conf file in
                        ${XDG_CONFIG_HOME:~/.config}/pg_activity/ or
                        /etc/pg_activity/.

Options:
  --blocksize BLOCKSIZE
                        Filesystem blocksize (default: 4096).
  --rds                 Enable support for AWS RDS (implies --no-tempfiles and filters out the rdsadmin database from space calculation).
  --output FILEPATH     Store running queries as CSV.
  --no-db-size          Skip total size of DB.
  --no-tempfiles        Skip tempfile count and size.
  --no-walreceiver      Skip walreceiver checks.
  -w, --wrap-query      Wrap query column instead of truncating.
  --duration-mode DURATION_MODE
                        Duration mode. Values: 1-QUERY(default), 2-TRANSACTION, 3-BACKEND.
  --min-duration SECONDS
                        Don't display queries with smaller than specified duration (in seconds).
  --filter FIELD:REGEX  Filter activities with a (case insensitive) regular expression applied on selected fields. Known fields are: dbname.
  --debug-file DEBUG_FILE
                        Enable debug and write it to DEBUG_FILE.
  --version             show program's version number and exit.
  --help                Show this help message and exit.

Connection Options:
  connection string     A valid connection string to the database, e.g.: 'host=HOSTNAME port=PORT user=USER dbname=DBNAME'.
  -h HOSTNAME, --host HOSTNAME
                        Database server host or socket directory.
  -p PORT, --port PORT  Database server port.
  -U USERNAME, --username USERNAME
                        Database user name.
  -d DBNAME, --dbname DBNAME
                        Database name to connect to.

Process table display options:
  These options may be used hide some columns from the processes table.

  --no-pid              Disable PID.
  --no-database         Disable DATABASE.
  --no-user             Disable USER.
  --no-client           Disable CLIENT.
  --no-cpu              Disable CPU%.
  --no-mem              Disable MEM%.
  --no-read             Disable READ/s.
  --no-write            Disable WRITE/s.
  --no-time             Disable TIME+.
  --no-wait             Disable W.
  --no-app-name         Disable App.

Header display options:
  --no-inst-info        Display instance information.
  --no-sys-info         Display system information.
  --no-proc-info        Display workers process information.

Other display options:
  --hide-queries-in-logs
                        Disable log_min_duration_statements and log_min_duration_sample for pg_activity.
  --refresh REFRESH     Refresh rate. Values: 0.5, 1, 2, 3, 4, 5 (default: 2).

Configuration

pg_activity may be configured through a configuration file, in INI format, read from ${XDG_CONFIG_HOME:~/.config}/pg_activity.conf or /etc/pg_activity.conf in that order. Command-line options may override configuration file settings. This is used to control how columns in the processes table are rendered or which items of the header should be displayed, e.g.:

[header]
show_instance = yes
show_system = yes
show_workers = no

[client]
hidden = yes

[database]
width = 9

Alternatively, the user might define configuration profiles in the form of files located at ${XDG_CONFIG_HOME:~/.config}/pg_activity/<my-profile>.conf or /etc/pg_activity/<my-profile>.conf; these can then be used through the --profile <my-profile> command-line option. The format of these files is the same as the main configuration file.

pg_activity ships with a few built-in profiles:

  • narrow, providing a narrow user interface with most non-essential columns in the process table hidden,
  • wide, providing a wide user interface (the inverse of narrow), and,
  • minimal, providing an even more minimal user interface with header information hidden

Notes

Length of SQL query text that pg_activity reports relies on PostgreSQL parameter track_activity_query_size. Default value is 1024 (expressed in bytes). If your SQL query text look truncated, you should increase track_activity_query_size.

Interactives commands

Key Action
r Sort by READ/s, descending
w Sort by WRITE/s, descending
c Sort by CPU%, descending
m Sort by MEM%, descending
t Sort by TIME+, descending
T Change duration mode: query, transaction, backend
Space Pause on/off
v Change queries display mode: full, indented, truncated
UP/DOWN Scroll processes list
k/j Scroll processes list
q Quit
+ Increase refresh time. Maximum value : 5s
- Decrease refresh time. Minimum Value : 0.5s
F1/1 Running queries list
F2/2 Waiting queries list
F3/3 Blocking queries list
h Help page
R Refresh
D Refresh Database Size (including when --no-dbzise option applied)
s Display system information in header
i Display general instance information in header
o Display worker information in header

Navigation mode

Key Action
UP/k Move up the cursor
DOWN/j Move down the cursor
K Terminate the current backend/tagged backends
C Cancel the current backend/tagged backends
Space Tag or untag the process
q Quit
Other Back to activity

FAQ

I can't see my queries only TPS is shown

pg_activity scans the view pg_stat_activity with a user defined refresh time comprised between 0.5 and 5 seconds. It can be modified in the interface with the + and - keys. Any query executed between two scans won't be displayed.

What is more, pg_activity uses different queries to get :

  • settings from pg_settings
  • version info using version()
  • queries and number of connections from pg_stat_activity
  • locks from pg_locks
  • tps from pg_database using pg_stat_get_db_xact_commit() and pg_stat_get_db_xact_rollback()
  • and more ( eg : pg_cancel_backend() and pg_terminate_backend() )

Those queries cannot be seen in the query tab because all queries issued from the pg_activity backend are considered as noise and are not displayed . On the other hand, the transactions used to get the info for pg_activity's reporting are still accounted for by postgres in pg_stat_get_db_xact_commit() and pg_stat_get_db_xact_commit(). Therefore pg_activity will display a non zero TPS even with no activity on the database, and/or no activity displayed on screen.

How can I specify a password for authentication ?

pg_activity uses libpq to access to PostgreSQL therefore all the traditional methods are available.

You can pass the password for the database connection in a password file. Information can also be given via PostgreSQL's environment variables (PGPASSFILE or PGPASSWORD) or via the connection string parameters.

The password file is preferred since it's more secure (security is deferred to the OS). Please avoid password in connection strings at all cost.

Hacking

In order to work on pg_activity source code, in particular to run the tests suite, a temporary PostgreSQL database cluster will be created; accordingly, PostgreSQL server binaries (e.g. initdb, pg_ctl) need to be available. For instance, on a Debian system, this means simply having the postgresql package installed.

To set up a development environment, get the source repository:

$ git clone https://github.com/dalibo/pg_activity
$ cd pg_activity

and then create a virtual environment, activate it and install the project along with development dependencies:

$ python3 -m venv .venv
$ .venv/bin/activate
(.venv) $ pip install -e ".[dev]"

The source code is formatted with black and isort and typed checked with mypy (all those are included in the development environment). Make sure to respect this, e.g. by configuring your editor, before committing changes. Alternatively, you can install pre-commit hooks so that this will be checked automatically:

(.venv) $ pre-commit install

To run the tests suite, simply invoke:

(.venv) $ pytest
================================ test session starts =================================
platform linux -- Python 3.11.2, pytest-7.3.1, pluggy-1.0.0
psycopg: 3.1.8
configfile: pytest.ini
plugins: cov-4.0.0, accept-0.1.9, postgresql-4.1.1
collected 70 items

pgactivity/activities.py ..                                                    [  2%]
pgactivity/config.py ..                                                        [  5%]
pgactivity/data.py ..                                                          [  8%]
pgactivity/handlers.py .....                                                   [ 15%]
pgactivity/keys.py .                                                           [ 17%]
pgactivity/types.py ..............                                             [ 37%]
pgactivity/utils.py .........                                                  [ 50%]
pgactivity/views.py .....                                                      [ 57%]
tests/test_activities.py ...                                                   [ 61%]
tests/test_config.py ..                                                        [ 64%]
tests/test_data.py ................                                            [ 87%]
tests/test_scroll.txt .                                                        [ 88%]
tests/test_types.py .                                                          [ 90%]
tests/test_ui.txt .                                                            [ 91%]
tests/test_views.py ....                                                       [ 97%]
tests/test_views.txt .                                                         [ 98%]
tests/test_widgets.txt .                                                       [100%]

================================ 70 passed in 11.89s =================================

Change log

See CHANGELOG.md.

pg_activity's People

Contributors

bersace avatar blogh avatar crisnamurti avatar daamien avatar demikl avatar dlax avatar fabriziomello avatar gozdal avatar gurneyalex avatar jrabinow avatar julmon avatar k0lter avatar kianmeng avatar kmoppel avatar kmoppel-cognite avatar krysztophe avatar lvfrazao avatar matheusoliveira avatar mdelca avatar michelmilezzi avatar mikelolasagasti avatar miohtama avatar nicklamuro avatar nilshamerlinck avatar nseinlet avatar olasd avatar plockaby avatar rjuju avatar sahapasci avatar vmauge 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

pg_activity's Issues

Auto reconnect?

Is it possible to implement auto reconnect if database has reset?

Connection count in summary section

I'd love to see a connection count that reflect the active connections in pg_activity. I can see the active running queries and the memory being used that tells me that currently the connection are high/low, but I want to see the exact connection count.

Incompatible with 9.6RC1

Postgresql 9.6 RC1 has been released, and there are some changes in the schematic.

When you run pg_activity you get the error:

$ pg_activity
FATAL: column pg_stat_activity.waiting does not exist
LINE 11:         pg_stat_activity.waiting AS wait,
                 ^

From the RC release notes ( https://www.postgresql.org/docs/9.6/static/release-9-6.html ):

Improve the pg_stat_activity view's information about what a process is waiting for (Amit Kapila, Ildus Kurbangaliev)

Historically a process has only been shown as waiting if it was waiting for a heavyweight lock. Now waits for lightweight locks and buffer pins are also shown in pg_stat_activity. Also, the type of lock being waited for is now visible. These changes replace the waiting column with wait_event_type and wait_event.

New pg_stat_activity information:
https://www.postgresql.org/docs/9.6/static/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW

Warning on -h with no argument

if someone types -h by reflex instead of --help it would be nice to say "-h is used for -h host (like the psql command)" if you want help type --help... or even display the help.

Ability to visualize prepared statement parameters?

Hi!

Currently the prepared statements display parameter placeholders, as in $1, instead of the actual value being used from the statement parameters. Is it possible to add this functionality? I'm open to help implementing it with the adequate pointers.

Hide itself?

Just started playing around with this. Very nice! Think there's anyway you could hide its own running query from the activity view?

Can do without begin/commit

Hello,

I think you can get rid of the begin/commit pairs as in:

cur.execute("BEGIN")
res = cur.execute(query)
ret = cur.fetchall()
cur.execute("COMMIT")

if the connection is in autocommit mode, each statement is executed immediately (as if it was typed into psql). If you are passing a single statement you don't need an extra connection wrap.

Also note that generally you don't need to pass the cursors around: it's enough to pass the connection to the functions and create new cursors locally, as their creation is very cheap. You can create the connection with the extra parameter psycopg2.connect(..., connection_factory=psycopg2.extras.DictConnection) and have DictCursors created just with conn.cursor().

Bye!

Chooses wrong password when connecting

When trying to connect to a localhost connection, the wrong password is supplied, this is my .pgpass:

localhost:*:*:fsteenbergen:password1
*:*:*:postgres:postgres
*:*:*:fsteenbergen:password2

It takes the password password2

As psycopg2 will take care of correct PGPASSFILE handling itself, why not just drop the magic?

FATAL: column pg_stat_activity.state does not exist

Pressing F2 or F3 to bring up waiting queries or blocking queries causes pg_activity to crash with this message:

FATAL: column pg_stat_activity.state does not exist
LINE 15: pg_stat_activity.state as state,
         ^

As of 1.4.0, many parts of the code assume the presence of pg_stat_activity.state, which is only present in postgres 9.2 and newer. This state field was added even in code explicitly if'ed for < 9.2.

Filter IDLE queries

I have a bunch of queries " in transaction" that make pg_activity less useful, they get to stay on top (since they are running longer than other queries). It would be nice to have a command line and/or interface switch to filter them out.

Display issue with python 2.7 (archlinux)

I'm facing strange issue with python 2.7 (2.7.15) on archlinux:
pg_activity_2 7 15
I can reproduce this with python 2.7.11, 2.7.12, 2.7.13 and 2.7.14, still on arch.
While everything is fine with python 3:
pg_activity_3 6

Just tried on centos7 + python 2.7.5, it's fine too.

It seems window.addstr() does not display things correctly with colors, when I try with attr=0, ie: no color, spaces between columns are back to a correct size.

Should have option to store RUNNING QUERIES states

To store running queries value into log file using command line option should be there.
If pg_activity cannot extend the feature then, can you tell me which function is responsible for building data for a terminal.
So I can compare my log to analyse performance.

Add application_name in display option

Hello,

pg_activity is incredibly useful but it miss a critical feature: the "application_name" cannot be displayed.

Could you please add a display option for this field?

pg_activity exits with FATAL: must be string, not int on launch

Hi-

I installed pg_activity and also installed a postgres server on my local machine to test this before using it on a remote database. I have a system user named postgres that has full access to the database server. However, when using the provided command: sudo -u postgres pg_activity -U postgres the program terminates with FATAL: must be string, not int

Authentication via .pgpass file not working

I try pg_activity -h mydbhost -U gthb and get:

FATAL: password authentication failed for user "gthb" password authentication failed for user "gthb"

whereas psql -h mydbhost -U gthb connects just fine.

My .pgpass is in the normal place, ~/.pgpass, and setting its location explicitly with PGPASSFILE environment variable makes no difference.

won't install in virtualenv

When pip-installing or "setup.py install"-ing pg_activity, it will still try to install manpages (and possibly other stuff) in /usr/

setup.py install --root=/somewhere/else does seem to work.

IO Disks Max : 10883424458 IOPs

Hi,

While the hardware I'm playing with clearly involves a pretty powerful IO subsystem, it smells like counter wraparound to me, right? The current pg_activity session is still showing that number so I guess I can run some tests if you need me to.

The version I have is straight from the PGDG yum repository, and saith pg_activity 0.2.0.

Connecting via unix-domain socket is showing "None" on client column

Perhaps we could do something like the following to workaround this issue:

       CASE
           WHEN client_port=-1 THEN 'local pipe'
           WHEN length(client_hostname)>0 THEN client_hostname||':'||client_port
           ELSE textin(inet_out(client_addr))||':'||client_port
       END AS client

This is how client column is treated on PgAdmin.

A quote from the docs:

IP address of the client connected to this backend. If this field is null, it indicates either that the client is connected via a Unix socket on the server machine or that this is an internal process such as autovacuum.

no information reported

I'm trying to test pg_activity out on a fairly busy database cluster, running 9.2.2, but its not giving me any information. All I see is the header, with nothing below:

$ ./pg_activity -U lfriedman -h cuda-db4
PostgreSQL 9.2.2 - cuda-fs2b - lfriedman@cuda-db4:5432
Mem.: 1.5% 941M/64429M | IO Disks Max : 1 IOPs
Swap: 0.0% 0M/1498M | Read : 0.00B/s - 0 IOPs
Load: 0.00 0.01 0.05 | Write: 0.00B/s - 0 IOPs

PID DATABASE CLIENT CPU% MEM% READ/s WRITE/s TIME+ W Query

It seems like even though pg_activity is connecting to the remote database server, the information that its reporting is for the local system where pg_activity is being invoked. Note that the Mem, Swap & Load data is definitely not the numbers for the server (cuda-db4), but rather cuda-fs2b (which isn't a database server at all).

Hopefully I'm missing something obvious?

Missing columns

While trying out pg_activity (installed system-wide with pip, version 1.0.2), I noticed I'm missing the CPU/MEM/READS/WRITES columns in the GUI.

Are these columns only available for locally running Postgres instances? I'm using it over the network.

1.1.1 needs version update

Hi,

1.1.1 still have references to 1.1.0:

$ grep "1.1.0" * -R
bin/pg_activity:version: 1.1.0
docs/man/build-man.sh:pod2man -r "pg_activity 1.1.0" -d date +%Y-%m-%d -c "PostgreSQL server activity monitoring tool" pg_activity.pod > pg_activity.1;
docs/man/pg_activity.1:.TH PG_ACTIVITY 1 "2013-11-30" "pg_activity 1.1.0" "PostgreSQL server activity monitoring tool"
pgactivity/UI.py:version: 1.1.0
pgactivity/Data.py:version: 1.1.0
setup.py: version = '1.1.0',

which breaks packaging.

Regards, Devrim

FATAL: float() argument must be a string or a number

I'm seeing this when running pg_activity on ubuntu 12.04

There is no stack trace or any additional details provided when it crashes, this occurs on many postgres installs when running pg_activity locally and connecting to a 9.1 installation.

I have not tried against other postgres versions.

This is version 1.0.2 installed via pip

Can't run under ubuntu 12.10

Hi,

I have ubuntu 12.10 and I can't run this program, because I get error messages:

./pg_activity -h 10.100.20.33 -p 5433 -U postgres -d postgres
FATAL: 'NoneType' object is not iterable

Wrong docstrings location in the source code.

Hi

Good work on pg_activity. Great tool.

But I looked over the source code and i view that you puts a docstrings outside the function.
This is a wrong way to put comments.

If these docstrings are really code comentaries, yo would use # instead of """, but if are docstrings, put it inside the function.

Example:

# Code comentary 
def something():
    """
    Docstring
    """
    pass

psutil warning message across top of pg_activity screen

When I run pg_activity, I continually get this message across the top of the screen:

/usr2/python/lib/python2.7/site-packages/psutil/_pslinux.py:481: RuntimeWarning:
 shared memory stats couldn't be deter|

...and then it's cut off by the drawing of the header. Another Python project that had this same warning has already pushed a fix to suppress it, so maybe we can use that same fix: dask/dask#1588

setuptools version

Hi,

RHEL 6 has setuptools version 0.6.10, which is lower than suggested on the website. However, I can build the RPMs with 0.6.10. Any harm of using it in prod?

Thanks!

Regards, Devrim

Support to version 10

Support to new version numbering strategy (X.Y - Major.Patch) starting for upcoming 10 version.

PostgreSQL 10 parallel query duplicates

When PG10 spawns multiple workers for a single query, pg_activity shows a query per worker in what at first appear to be multiple instances of the same query.

It would be a significant UI change, but perhaps as a future feature workers could be nested under the parent thread.

support for postgresql-9.3 missing?

I'm testing out PostgreSQL-9.3(beta) right now, in preparation for an upgrade once the final version is released. I tried to use the latest pg_activity against the 9.3 instance, but it fails to run immediately with the error:
FATAL: 'NoneType' object is not iterable

Should default user to $USER like psql

For consistency with psql, pg_activity should default to connecting as the current user. Currently it tries to connect as postgres by default, which does not match psql behavior.

Display role query

It would be nice to show the role that is running the queries. Ie add the field pg_stat_activity.usename

Add new column in view

Hi, I daily use pgactivity and it is a great tool, but for me it miss an important information, the state of the request (active, idle or idle in transaction)

Could you please add column id display view (or add an option to add it if wanted) ?

backend using > 100% CPU

what does it mean if pg_activity shows a process using more than 100% CPU, even more than 1000% if you look at the numbers patiently.

This is postgres 9.4, so there is no chance that more than 1 core is involved.
I'm attaching an image showing htop side by side with pg_activity look at the CPU column in both for process 31476
htop_vs_pg_activity

FATAL: 'str' object is not callable

After installing all dependencies and installing pg_activity I get this message FATAL: 'str' object is not callable when trying to run sudo -u postgres pg_activity -U postgres. I'm running this on Ubuntu 12.04.

postgres user exists and has all necessary permissions for connecting to database.
Program installed on another server with the same configuration works without any problems and is connected to the same database.

I know that description is not really detailed but maybe I'm not the only one with this issue.

Other it's really good software.

pg_activity ignores .pgpass

Hello

I've spend a good hour or so trying to debug pg_activity, to find out that it does not read .pgpass for credentials. This is the standard way of keeping password and it would be nice for pg_activity to support it. Too bad I can't contribute in python :(

Best Regards
Ivan Dimitrov

pg_activity total memory usage.

Hi,

Could anyone explains to me what is the MEM% displayed in pg_activity?

In my case, MEM shows 4G of postgres memory usage. However, when i stop postgres, i don t get this total of memory freed when i run free command. Besides that, the RSS in top command shows different number than pg_activity.

Thanks,

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.