Code Monkey home page Code Monkey logo

py2cytoscape's Introduction

py2cytoscape Build Status PyPI version ReadtheDocs DOI

DEPRECATION

Please note that this project has been superceded by the py4cytoscape project. py2cytoscape is not currently maintained.

Installation

py2cytoscape can be installed using conda, pip.

conda

conda installs igraph with py2cytoscape. You do not need to install igraph by yourself.

conda install -c conda-forge py2cytoscape

Latest stable release (pip)

pip3 install py2cytoscape

Development version (pip)

pip3 install git+https://github.com/cytoscape/py2cytoscape.git

Dependencies (extra): igraph

git clone https://github.com/igraph/python-igraph/
cd python-igraph

git clone https://github.com/igraph/igraph igraphcore
cd igraphcore
./bootstrap.sh
mkdir _build && cd _build
../configure --prefix=$PWD/../_install
make
make install
cd ../../

CPPFLAGS="-I$PWD/igraphcore/_install/include/igraph ${CPPFLAGS}"
export CPPFLAGS
LDFLAGS="-L$PWD/igraphcore/_install/lib ${LDFLAGS}"
export LDFLAGS
PKG_CONFIG_PATH=igraphcore/_install/lib/pkgconfig/
export PKG_CONFIG_PATH

python3 setup.py install --user

Documentation

Package documentation can be found on https://py2cytoscape.readthedocs.io.

For contributing please check the wiki.

Full workflows can be found on the cytoscape/cytoscape-automation repo. The following workflows include cyrest usage:

Contributing

Please do all your development in our development docker image:

docker pull mpgagebioinformatics/py2cytoscape:latest
  • Create a folder to map to the container's user home folder
mkdir -p ~/py2cy-container

  • Start the container from the latest version of the image
sudo docker run -d -p 8787:8787 -p 8888:8888 \
-v ~/py2cy-container:/home/mpiage --name py2cy-container \
-it mpgagebioinformatics/py2cytoscape:latest

  • Alternatively you can start the container from a specific tag/version of the image
sudo docker run -d -p 8787:8787 -p 8888:8888 \
-v ~/py2cy-container:/home/mpiage --name py2cy-container \
-it mpgagebioinformatics/py2cytoscape:<tag>

  • Connect to the running container
sudo docker exec -i -t py2cy-container /bin/bash

  • Stop the container
sudo docker stop py2cy-container

  • Jupyter

Once you have connected to the running container you can start jupyter with

module load jupyterhub
jupyter notebook --ip=0.0.0.0

A URL will be presented to you, and it should be pasted into your host's browser (Chrome recommended).


  • RStudio-server Once you have connected to the running container you can start Rstudio server with
module load rlang
sudo rstudio-server start

You can then get access by connecting on your host's browser to http://localhost:8787.

For stopping the server use:

sudo rstudio-server stop

  • X forward to enable Cytoscape

On a Mac install socat and xquartz:

brew install socat
brew install xquartz

Open Xquartz:

open -a Xquartz

Then navigate to XQuartz > Preferences > Security and tick the box 'Allow connections from network clients'.

Check your ip address:

IP=$(ifconfig en0 | grep inet | awk '{ print $2 }')

Start socat:

socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"

an then start the container by adding the -e DISPLAY=${IP}:0 argument.

Complete example call:

IP=$(ifconfig en0 | grep inet | awk '{ print $2 }') && \
socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\" & \
docker run -d -e DISPLAY=${IP}:0 -p 8787:8787 -p 8888:8888 \
-v ~/py2cy-container:/home/mpiage --name py2cy-container \
-it mpgagebioinformatics/py2cytoscape:latest

  • User account

User: mpiage

Pass: bioinf

Citing

Ono, K. et al. (2015) CyREST: Turbocharging Cytoscape Access for External Tools via a RESTful API. F1000Res, 4, 478

Note to repository maintainers: Please *DO NOT* move this page ... the Cytoscape Automation paper refers directly to it.

py2cytoscape's People

Contributors

andorsk avatar bdemchak avatar gmariotti avatar jamespino avatar jorgeboucas avatar keiono avatar kozo2 avatar moritzschaefer avatar nicolaselie avatar pkrezel avatar rgbkrk avatar romainstuder avatar scholer avatar zachary822 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

py2cytoscape's Issues

How to obtain a CyNetwork object from a remote server

cy = CyRestClient(ip="remote.host.org", port="1234", version="v1")
X=cy.network.get_all()
for x in X:
print cy.network.get(x) # okay, we can get the network in json format

The question is how can be obtain the network as a CyNetwork() object instead.
How do I set the ip to "remote.host.org" for the CyNetwork() class? It connects to localhost by default.
Thanks!

igraph issue

I downloaded the master branch, ran "python setup.py install" using Anaconda3 shell, and saw no errors. Started jupyter notebook from Anaconda3, and attempted to run some examples. 5 of 6 (the 6th could not do a different import) examples all produced they following error traceback:


DeprecationWarning Traceback (most recent call last)
in ()
1 # Boilerplate: Import required packages
----> 2 from py2cytoscape.data.cyrest_client import CyRestClient
3 from py2cytoscape.data.util_network import NetworkUtil as util
4 from py2cytoscape.data.style import StyleUtil as s_util
5 import py2cytoscape.cytoscapejs as renderer

C:\Users\Jeff\Anaconda3\lib\site-packages\py2cytoscape-0.6.1-py3.6.egg\py2cytoscape\data\cyrest_client.py in ()
2
3 import requests
----> 4 from .network_client import NetworkClient
5 from .style_client import StyleClient
6 from .algorithm_client import LayoutClient

C:\Users\Jeff\Anaconda3\lib\site-packages\py2cytoscape-0.6.1-py3.6.egg\py2cytoscape\data\network_client.py in ()
6
7 from . import HEADERS, SUID_LIST
----> 8 from ..util import cytoscapejs as util
9
10 from ..util import util_networkx as nx_util

C:\Users\Jeff\Anaconda3\lib\site-packages\py2cytoscape-0.6.1-py3.6.egg\py2cytoscape\util_init_.py in ()
8 from py2cytoscape.util.util_networkx import from_networkx, to_networkx
9 from py2cytoscape.util.util_graphlab import from_sgraph
---> 10 from py2cytoscape.util.util_igraph import from_igraph
11
12 all = ['from_networkx', 'to_networkx', 'from_igraph']

C:\Users\Jeff\Anaconda3\lib\site-packages\py2cytoscape-0.6.1-py3.6.egg\py2cytoscape\util\util_igraph.py in ()
6 """
7
----> 8 import igraph as ig
9
10 DEF_SCALING = 100.0

C:\Users\Jeff\Anaconda3\lib\site-packages\igraph_init_.py in ()
6 license = "MIT"
7
----> 8 raise DeprecationWarning("To avoid name collision with the igraph project, "
9 "this visualization library has been renamed to "
10 "'jgraph'. Please upgrade when convenient.")

DeprecationWarning: To avoid name collision with the igraph project, this visualization library has been renamed to 'jgraph'. Please upgrade when convenient.


Tried uninstalling igraph, and the notebook could not find the module. Reinstalled igraph, and the deprecation warning returned.

CyRestClient.style ignores custom ip/port settings

I'm trying to set styles using py2cytoscape on a Cytoscape instance running on another url than http://localhost:1234. The CyRestClient provides a way to enter a custom ip/port, but the styles seem to always use the default "localhost".

Small snippet to reproduce (Cytoscape itself should be listening on 172.17.0.1):

from py2cytoscape.data.cyrest_client import CyRestClient
cy = CyRestClient(ip='172.17.0.1', port=1234)

style = cy.style.create('basic')
defaults = { 'NODE_SIZE': 12 }
style.update_defaults(defaults)

This gives me an error indicating that it is trying to connect to localhost instead of 172.17.0.1:

ConnectionError: HTTPConnectionPool(host='localhost', port=1234): Max retries exceeded with url: /v1/styles/basic/defaults (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x7f3eeb6c1860>: Failed to establish a new connection: [Errno 111] Connection refused',))

A workaround is to manually set the BASE_URL:

from py2cytoscape.data.cyrest_client import CyRestClient
cy = CyRestClient(ip='172.17.0.1', port=1234)

style = cy.style.create('basic')
style._Style__url = 'http://172.17.0.1:1234/v1/styles/basic/'
defaults = { 'NODE_SIZE': 12 }
style.update_defaults(defaults)

Then it works without error.

Using extras_require for easy installation

I think that

  • python-igraph
  • scipy

should be moved from install_requires to extras_require.

In trial use, the users would not need these packages. (and these packages are hard to install).

graph-tool interface

It would be great to have an interface to graph-tool. I would be happy to help.

NetworkClient.get() does not work

line 138 of network_client.py: return requests.get(self.__url + '/' + str(id) + '.json').json()
Does not seem to work. networks/52.json does not seem to be supported by CyREST API.
Maybe change it into:
return requests.get(self.__url + '/' + str(id)).json()

shortcut to set values to the chart column

I'll add a function for this type of snippet.

chart_entry = 'barchart: attributelist="ld20t14,ld20t16,ld20t20,ld20t24,ld20t28,ld20t32,ld20t36,ld20t40,ld20t44,ld20t48,ld20t52,ld20t56,ld20t60,ld20t64,ld20t68,ld20t72" colorlist="up:red,zero:red,down:red" showlabels="false"'

target_row_url = BASE_URL + "networks/" + str(pathway_suid) + "/tables/defaultnode/columns/KEGG"
res2 = requests.get(target_row_url)
matched = json.loads(res2.content)["values"]

df2 = pd.DataFrame(columns=["id", "chart"]);
df2["id"] = matched
df2["chart"] = chart_entry

data = json.loads(df2.to_json(orient="records"))

chart_data = {
    "key": "KEGG",
    "dataKey": "id",
    "data": data
}

requests.put(update_table_url, data=json.dumps(chart_data), headers=HEADERS)

Not creating view for large networks

For large networks, cytoscape is not creating network views and, therefore, no image is possible to be downloaded.

If clicking in the "create view" button in cytoscape, it works as expected.

merges

  • merge pull requests if added value

How does this library work?

How does this library work?
It could be an amazing library if there was a proper documentation.

What is 'cyjs'? Does that need to imported separately?

Clarification on documentation / API for cyrest client

Hi there, I tried to list commands from py2cytoscape as shown in docs:

>>> from py2cytoscape import cyrest
>>> cytoscape=cyrest.cyclient()
>>> cytoscape.commands.list()

but I am getting ImportError: cannot import name 'cyrest' as py2cytoscape is essentially empty. I tried with both: the latest version installed using pip3 and using latest version from develop branch. I can run:

from py2cytoscape.data.cyrest_client import CyRestClient
cy = CyRestClient()

as shown in Readme. Could you help me understand why are there two different ways to initialize the REST API client? And why the REST client (in the second example) resides in the data submodule?

Igraph issue

Hello,

I recently discovered that if a user installs igraph, you will get a warning telling that igraph is now changed to jgraph. So py2cytoscape doesn't work then since it uses igraph.
When the import in util/util_igraph.py is changed to jgraph instead of igraph it works.

Kind regards,
Sven

importing sif like pandas dataframe

I would like to offer a feature like this issue title.
"sif like pandas dataframe" is 3 column dataframe.

  • 1st column is source node
  • 2nd column interaction type
  • 3rd column is target node

CyRest in developmental version is not working: <title>Error 405 Method Not Allowed</title>

sys.path.insert(0,"/home/user/.local/lib/python2.7/site-packages/py2cytoscape-0.6.2-py2.7.egg/py2cytoscape")
import cyrest as cyrest

Step 1: Create py2cytoscape client

cy=cyrest.cyclient()
cy.status()
cy.version()
print cy.commands.list()
cy.commands.namespace("session")
cy.commands.command("session", "new")
cy.session.new()

Output:
CyREST online!
cytoscapeVersion 3.5.1
apiVersion v1
Available namespaces:
command
edge
group
layout
network
node
session
table
view
vizmap

<Response [405]> 405

<title>Error 405 Method Not Allowed</title>

HTTP ERROR 405

Problem accessing /v1/commands/session/new. Reason:

    Method Not Allowed


Powered by Jetty://

Get HTML from py2cytoscape.cytoscapejs.viewer.render

I would like to render cytoscapejs HTML outside of IPython notebook (i.e. in my own webapp). Unfortunately, the function py2cytoscape.cytoscapejs.viewer.render does not return HTML, it calls display(HTML(html_string)), then returns None. This means (AFAIK), I cannot directly access the HTML that is generated from this function.

I suggest that there be two functions in py2cytoscape.cytoscapejs.viewer, one to render HTML from a graph, and another to both render and display the result in IPython notebook. Or even more simply, the function could remain as is, but just return the html string from the rendered template (but I am not sure if this would interfere with usage in ipynb).

Another possible approach would be to allow the caller to select the IPython frontend that is called by display and return the DisplayHandle object used by IPython, which might let the user control how and where the HTML is rendered. But I think the first approach is simpler and more flexible.

api(...) method should use raise an exception

I'm looking over the code in base.py and there's a few things I noticed about error handling, particularly linked to the code here:

def api(namespace=None,command="",PARAMS={},host=HOST,port=str(PORT),version=VERSION,method="POST",verbose=VERBOSE, url=None):

There doesn't appear to be an exception thrown when an error condition is encountered. From what I can see, the response for the method is set to the error code.

What I think of when reporting an error is to raise an exception. If a CI Error can be found, it should be parsed and included in the exception:

raise CIError(parsedErrorMessage)

I could also be missing some critical information about how this is executed; if this is the case, please let me know where to look.

shorten readme

  • not forgetting to mention the CyREST F1000 paper
  • add links to cytoscape automation on the readthedocs

readthedocs

  • basic structure for documentation of new function as one goes along
  • full docs will be added once decision is made on which functions to deprecate

cybrowser.hide

window gets hidden but it does not get sent to the results panel as described in the swagger

python 3.x support for utils, from_networkx

Hi,

(If I got it right) it seems after using a map function there is an access by index which throws an error in python 3.x as map no longer returns a list.

`
if layout is not None:
pos = map(lambda position:
{'x': position[0]*scale, 'y': position[1]*scale},
layout.values())

nodes = g.nodes()
if isinstance(g, nx.MultiDiGraph) or isinstance(g, nx.MultiGraph):
    edges = g.edges(data=True, keys=True)
    edge_builder = __build_multi_edge
else:
    edges = g.edges(data=True)
    edge_builder = __build_edge

# Map network table data
cygraph[DATA] = __map_table_data(g.graph.keys(), g.graph)

for i, node_id in enumerate(nodes):
    new_node = __create_node(g.node[node_id], node_id)
    if layout is not None:
        new_node['position'] = pos[i]

`

Cytoscape default style settings

I'm trying to use py2cytoscape to create network on Cytoscape. However, "lock width and height" is always applied on Cytoscape network Node-Style after I run the program, I tried to add some statements like " 'NODE_LOCK_NODE_WIDTH_AND_HEIGHT': False " or "'NODE_VISUAL_PROPERTY_DEPENDENCY': False" to basic_settings dict to avoid locking, but all of them don't work. Could someone tell me how to update default setting to make height and width unlocked?

In addition, it seems that py2cytoscape is still python2 incompatible when I install it by command "pip install py2cytoscape"(Issue #63 has talked about this). I was wondering when will it be updated in master branch.

Cytoscape:

CyRest:

Java:

Code:

 network_style = cy.style.create('Mapping Style') 
 basic_settings = {
    'NODE_WIDTH': 80,
    'NODE_HEIGHT': 35,
    'NODE_BORDER_WIDTH': 0,
    'NODE_VISUAL_DEPENDENCY': False,

    'EDGE_WIDTH': 1,
    'EDGE_TRANSPARENCY': 255,
    'EDGE_STROKE_UNSELECTED_PAINT': '#848484',
    'NETWORK_BACKGROUND_PAINT': '#FFFFFF'}

network_style.update_defaults(basic_settings)

error:

cy.network.create_from() fails when executed from Bash on Ubuntu on Windows

I tried to control (cyREST + Cytoscape 3.5.1 [Java SE 8u131]) from Bash on Ubuntu on Windows.

The error, and how to reproduce it

In [1]: from py2cytoscape.data.cyrest_client import CyRestClient

In [2]: cy = CyRestClient()

In [3]: cy.session.delete()

In [4]: yeast_net = cy.network.create_from('./galFiltered.sif')
---------------------------------------------------------------------------
HTTPError                                 Traceback (most recent call last)
<ipython-input-4-629751329a66> in <module>()
----> 1 yeast_net = cy.network.create_from('./galFiltered.sif')

/usr/local/lib/python2.7/dist-packages/py2cytoscape/data/network_client.pyc in create_from(self, locations, collection)
     55         res = self.session.post(self.__url, data=json.dumps(location_list),
     56                                 params=parameters, headers=HEADERS)
---> 57         check_response(res)
     58         res = res.json()
     59

/usr/local/lib/python2.7/dist-packages/py2cytoscape/data/cynetwork.pyc in check_response(res)
    372                                        % list(err_info.keys()))
    373         exc.args += (err_msg,)
--> 374         raise exc

HTTPError: (u'500 Server Error: Internal Server Error for url: http://localhost:1234/v1/networks?source=url&collection=Created+from+resources', u'Could not load networks from given locations.')

The environment

knishida@DESKTOP-ETL8RDS ~> python2 --version
Python 2.7.12
knishida@DESKTOP-ETL8RDS ~> pip2 list |grep py2
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
py2cytoscape (0.6.2)
knishida@DESKTOP-ETL8RDS ~> lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.2 LTS
Release:        16.04
Codename:       xenial
knishida@DESKTOP-ETL8RDS ~>

JSONDecodeError with Python36 json decoder

In [1]: from py2cytoscape.data.cyrest_client import CyRestClient
In [2]: cy = CyRestClient()
---------------------------------------------------------------------------
JSONDecodeError                           Traceback (most recent call last)
<ipython-input-5-226b69f7d760> in <module>()
----> 1 cy = CyRestClient()

/Users/kozo2/miniconda3/lib/python3.6/site-packages/py2cytoscape/data/cyrest_client.py in __init__(self, ip, port, version)
     17 
     18         self.network = NetworkClient(self.__url)
---> 19         self.style = StyleClient(self.__url)
     20         self.layout = LayoutClient(self.__url)
     21         self.edgebundling = EdgeBundlingClient(self.__url)

/Users/kozo2/miniconda3/lib/python3.6/site-packages/py2cytoscape/data/style_client.py in __init__(self, url)
     14         self.__url_apply = url + 'apply/styles/'
     15 
---> 16         self.vps = VisualProperties(url)
     17 
     18     def create(self, name=None, original_style=None):

/Users/kozo2/miniconda3/lib/python3.6/site-packages/py2cytoscape/data/style_client.py in __init__(self, url)
     71     def __init__(self, url):
     72         self.__url = url + 'styles/visualproperties'
---> 73         self.__convert_to_dict()
     74 
     75     def __convert_to_dict(self):

/Users/kozo2/miniconda3/lib/python3.6/site-packages/py2cytoscape/data/style_client.py in __convert_to_dict(self)
     74 
     75     def __convert_to_dict(self):
---> 76         vps = requests.get(self.__url).json()
     77         vp_dict = {}
     78         node_vps = []

/Users/kozo2/miniconda3/lib/python3.6/site-packages/requests/models.py in json(self, **kwargs)
    848                     # used.
    849                     pass
--> 850         return complexjson.loads(self.text, **kwargs)
    851 
    852     @property

/Users/kozo2/miniconda3/lib/python3.6/json/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    352             parse_int is None and parse_float is None and
    353             parse_constant is None and object_pairs_hook is None and not kw):
--> 354         return _default_decoder.decode(s)
    355     if cls is None:
    356         cls = JSONDecoder

/Users/kozo2/miniconda3/lib/python3.6/json/decoder.py in decode(self, s, _w)
    337 
    338         """
--> 339         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    340         end = _w(s, end).end()
    341         if end != len(s):

/Users/kozo2/miniconda3/lib/python3.6/json/decoder.py in raw_decode(self, s, idx)
    355             obj, end = self.scan_once(s, idx)
    356         except StopIteration as err:
--> 357             raise JSONDecodeError("Expecting value", s, err.value) from None
    358         return obj, end

JSONDecodeError: Expecting value: line 1 column 1 (char 0)

You can reproduce this error with

  • Cytoscape 3.5.1
  • py2cytoscape 121224f
  • macOS Sierra
  • Miniconda3

Running Jupyter Notebook - basic1.ipynb fails to execute

Trying to run the basic notebook - basic1.ipynb and get the following error. I read thru your issues and saw there was a related error with styles and used that code in an initial cell of notebook to get it to run, but unable.
thx for any help you might offer. Looks like an amazing library. We are trying to create a network graph in a notebook happy to show you when done.

ConnectionError: HTTPConnectionPool(host='127.0.0.1', port=1234): Max retries exceeded with url: /v1/styles/visualproperties (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x11896a080>: Failed to establish a new connection: [Errno 61] Connection refused',))

Could we implement session save?

I tried to implement session save method (currently marked as "pass" in the package" without success. I posted the question here 20 days ago and have not got a reply. Could anyone help? Based on the Cy-REST documentation, this seems to be straightforward, if we have it implemented in the next release, it will be greatly appreciated. Thanks!
idekerlab/cyREST#34

make igraph optional

Hi. I was wondering if it made sense to make igraph an optional dependency? It can be a pain in the neck to install on some systems and as far as I can tell, it's only relevant for from_igraph() in util_igraph.py. People might be perfectly happy with using only pure-Python NetworkX. You could wrap the import in a try statement like this:

try:
   import igraph as ig
except Exception as error:   
   print(str(error))
   print("py2cytoscape: Error importing igraph. You won't be able to import from igraph.")
   ig = None
def from_igraph(igraph_network, layout=None, scale=DEF_SCALING):
   if ig == None:
      raise ImportError('igraph not found')
   ....

PS: Love this library. Keep up the good work!

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.