Giter Club home page Giter Club logo

openapipy's Introduction

OpenApiPy

PyPI version versions GitHub license

A Python package for interacting with cTrader Open API.

This package uses Twisted and it works asynchronously.

Features

  • Works asynchronously by using Twisted

  • Methods return Twisted deferreds

  • It contains the Open API messages files so you don't have to do the compilation

  • Makes handling request responses easy by using Twisted deferreds

Insallation

pip install ctrader-open-api

Usage

from ctrader_open_api import Client, Protobuf, TcpProtocol, Auth, EndPoints
from ctrader_open_api.messages.OpenApiCommonMessages_pb2 import *
from ctrader_open_api.messages.OpenApiCommonMessages_pb2 import *
from ctrader_open_api.messages.OpenApiMessages_pb2 import *
from ctrader_open_api.messages.OpenApiModelMessages_pb2 import *
from twisted.internet import reactor

hostType = input("Host (Live/Demo): ")
host = EndPoints.PROTOBUF_LIVE_HOST if hostType.lower() == "live" else EndPoints.PROTOBUF_DEMO_HOST
client = Client(host, EndPoints.PROTOBUF_PORT, TcpProtocol)

def onError(failure): # Call back for errors
    print("Message Error: ", failure)

def connected(client): # Callback for client connection
    print("\nConnected")
    # Now we send a ProtoOAApplicationAuthReq
    request = ProtoOAApplicationAuthReq()
    request.clientId = "Your application Client ID"
    request.clientSecret = "Your application Client secret"
    # Client send method returns a Twisted deferred
    deferred = client.send(request)
    # You can use the returned Twisted deferred to attach callbacks
    # for getting message response or error backs for getting error if something went wrong
    # deferred.addCallbacks(onProtoOAApplicationAuthRes, onError)
    deferred.addErrback(onError)

def disconnected(client, reason): # Callback for client disconnection
    print("\nDisconnected: ", reason)

def onMessageReceived(client, message): # Callback for receiving all messages
    print("Message received: \n", Protobuf.extract(message))

# Setting optional client callbacks
client.setConnectedCallback(connected)
client.setDisconnectedCallback(disconnected)
client.setMessageReceivedCallback(onMessageReceived)
# Starting the client service
client.startService()
# Run Twisted reactor
reactor.run()

Please check documentation or samples for a complete example.

Dependencies

openapipy's People

Contributors

amusleh-spotware-com avatar andriidem308 avatar baotang2118 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

openapipy's Issues

Connection to the other side was lost in a non-clean fashion: Connection los

Hi,
I am getting the error below when I try to open a connection using the example found at the readme file of this repo.

Python 3.11.5
Mac OS

`Traceback (most recent call last):
File "/usr/local/lib/python3.11/site-packages/twisted/python/log.py", line 96, in callWithLogger
return callWithContext({"system": lp}, func, *args, **kw)
File "/usr/local/lib/python3.11/site-packages/twisted/python/log.py", line 80, in callWithContext
return context.call({ILogContext: newCtx}, func, *args, **kw)
File "/usr/local/lib/python3.11/site-packages/twisted/python/context.py", line 117, in callWithContext
return self.currentContext().callWithContext(ctx, func, *args, **kw)
File "/usr/local/lib/python3.11/site-packages/twisted/python/context.py", line 82, in callWithContext
return func(*args, **kw)
--- ---
File "/usr/local/lib/python3.11/site-packages/twisted/internet/selectreactor.py", line 148, in _doReadOrWrite
why = getattr(selectable, method)()
File "/usr/local/lib/python3.11/site-packages/twisted/internet/tcp.py", line 615, in doConnect
self._connectDone()
File "/usr/local/lib/python3.11/site-packages/twisted/internet/tcp.py", line 643, in _connectDone
self.protocol.makeConnection(self)
File "/usr/local/lib/python3.11/site-packages/twisted/protocols/tls.py", line 226, in makeConnection
ProtocolWrapper.makeConnection(self, transport)
File "/usr/local/lib/python3.11/site-packages/twisted/protocols/policies.py", line 75, in makeConnection
self.wrappedProtocol.makeConnection(self)
File "/usr/local/lib/python3.11/site-packages/twisted/internet/protocol.py", line 509, in makeConnection
self.connectionMade()
File "/usr/local/lib/python3.11/site-packages/twisted/internet/endpoints.py", line 144, in connectionMade
self._wrappedProtocol.makeConnection(self.transport)
File "/usr/local/lib/python3.11/site-packages/twisted/internet/protocol.py", line 509, in makeConnection
self.connectionMade()
File "/Users/idekel/test_projects/OpenApiPy/ctrader_open_api/tcpProtocol.py", line 21, in connectionMade
self.factory.connected(self)
File "/Users/idekel/test_projects/OpenApiPy/ctrader_open_api/factory.py", line 11, in connected
self.client._connected(protocol)
File "/Users/idekel/test_projects/OpenApiPy/ctrader_open_api/client.py", line 32, in _connected
self._connectedCallback(self)
File "/Users/idekel/test_projects/OpenApiPy/main.py", line 26, in connected
deferred.addErrback(onError)
builtins.NameError: name 'deferred' is not defined

Disconnected: [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionLost'>: Connection to the other side was lost in a non-clean fashion: Connection lost.
]
Unhandled Error
Traceback (most recent call last):
File "/Users/idekel/test_projects/OpenApiPy/main.py", line 41, in
reactor.run()
File "/usr/local/lib/python3.11/site-packages/twisted/internet/base.py", line 695, in run
self.mainLoop()
File "/usr/local/lib/python3.11/site-packages/twisted/internet/base.py", line 708, in mainLoop
self.doIteration(t)
File "/usr/local/lib/python3.11/site-packages/twisted/internet/selectreactor.py", line 142, in doSelect
_logrun(selectable, _drdw, selectable, method)
--- ---
File "/usr/local/lib/python3.11/site-packages/twisted/python/log.py", line 96, in callWithLogger
return callWithContext({"system": lp}, func, *args, **kw)
File "/usr/local/lib/python3.11/site-packages/twisted/python/log.py", line 80, in callWithContext
return context.call({ILogContext: newCtx}, func, *args, **kw)
File "/usr/local/lib/python3.11/site-packages/twisted/python/context.py", line 117, in callWithContext
return self.currentContext().callWithContext(ctx, func, *args, **kw)
File "/usr/local/lib/python3.11/site-packages/twisted/python/context.py", line 82, in callWithContext
return func(*args, **kw)
File "/usr/local/lib/python3.11/site-packages/twisted/internet/selectreactor.py", line 153, in _doReadOrWrite
self._disconnectSelectable(selectable, why, method == "doRead")
File "/usr/local/lib/python3.11/site-packages/twisted/internet/posixbase.py", line 113, in _disconnectSelectable
selectable.connectionLost(failure.Failure(why))
File "/usr/local/lib/python3.11/site-packages/twisted/internet/tcp.py", line 508, in connectionLost
self._commonConnection.connectionLost(self, reason)
File "/usr/local/lib/python3.11/site-packages/twisted/internet/tcp.py", line 326, in connectionLost
protocol.connectionLost(reason)
File "/usr/local/lib/python3.11/site-packages/twisted/protocols/tls.py", line 409, in connectionLost
ProtocolWrapper.connectionLost(self, reason)
File "/usr/local/lib/python3.11/site-packages/twisted/protocols/policies.py", line 114, in connectionLost
self.wrappedProtocol.connectionLost(reason)
File "/usr/local/lib/python3.11/site-packages/twisted/internet/endpoints.py", line 163, in connectionLost
return self._wrappedProtocol.connectionLost(reason)
File "/usr/local/lib/python3.11/site-packages/twisted/application/internet.py", line 465, in connectionLost
self._lostNotification(reason)
File "/usr/local/lib/python3.11/site-packages/twisted/application/internet.py", line 658, in
self._factory, lambda _: self._clientDisconnected()
File "/usr/local/lib/python3.11/site-packages/automat/_methodical.py", line 235, in _clientDisconnected
(outputs, outTracer) = transitioner.transition(self)
File "/usr/local/lib/python3.11/site-packages/automat/_core.py", line 157, in transition
outState, outputSymbols = self._automaton.outputForInput(self._state,
File "/usr/local/lib/python3.11/site-packages/automat/_core.py", line 137, in outputForInput
raise NoTransition(state=inState, symbol=inputSymbol)
automat._core.NoTransition: no transition for MethodicalInput(method=<function _ClientMachine._clientDisconnected at 0x10efe6ca0>) in MethodicalState(method=<function _ClientMachine._connecting at 0x10efe5ee0>)`

Can't run the jupyter sample

When i try to execute reactor.run() in the jupyter sample, i get the following error:

Unhandled Error
Traceback (most recent call last):
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/python/log.py", line 101, in callWithLogger
    return callWithContext({"system": lp}, func, *args, **kw)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/python/log.py", line 85, in callWithContext
    return context.call({ILogContext: newCtx}, func, *args, **kw)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/python/context.py", line 118, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/python/context.py", line 83, in callWithContext
    return func(*args, **kw)
--- <exception caught here> ---
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/internet/posixbase.py", line 691, in _doReadOrWrite
    why = selectable.doWrite()
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/internet/tcp.py", line 614, in doConnect
    self._connectDone()
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/internet/tcp.py", line 642, in _connectDone
    self.protocol.makeConnection(self)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/protocols/tls.py", line 211, in makeConnection
    ProtocolWrapper.makeConnection(self, transport)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/protocols/policies.py", line 74, in makeConnection
    self.wrappedProtocol.makeConnection(self)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/internet/protocol.py", line 508, in makeConnection
    self.connectionMade()
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/internet/endpoints.py", line 142, in connectionMade
    self._wrappedProtocol.makeConnection(self.transport)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/internet/protocol.py", line 508, in makeConnection
    self.connectionMade()
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/ctrader_open_api/tcpProtocol.py", line 21, in connectionMade
    self.factory.connected(self)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/ctrader_open_api/factory.py", line 11, in connected
    self.client._connected(protocol)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/ctrader_open_api/client.py", line 33, in _connected
    asyncio.run(self._connectedCallback(self))
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/asyncio/runners.py", line 33, in run
    raise RuntimeError(
builtins.RuntimeError: asyncio.run() cannot be called from a running event loop

Unhandled Error
Traceback (most recent call last):
  File "/tmp/ipykernel_6723/2480525364.py", line 4, in <module>
    reactor.run()
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/internet/base.py", line 1318, in run
    self.mainLoop()
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/internet/base.py", line 1331, in mainLoop
    reactorBaseSelf.doIteration(t)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/internet/epollreactor.py", line 244, in doPoll
    log.callWithLogger(selectable, _drdw, selectable, fd, event)
--- <exception caught here> ---
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/python/log.py", line 101, in callWithLogger
    return callWithContext({"system": lp}, func, *args, **kw)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/python/log.py", line 85, in callWithContext
    return context.call({ILogContext: newCtx}, func, *args, **kw)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/python/context.py", line 118, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/python/context.py", line 83, in callWithContext
    return func(*args, **kw)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/internet/posixbase.py", line 699, in _doReadOrWrite
    self._disconnectSelectable(selectable, why, inRead)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/internet/posixbase.py", line 306, in _disconnectSelectable
    selectable.connectionLost(failure.Failure(why))
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/internet/tcp.py", line 507, in connectionLost
    self._commonConnection.connectionLost(self, reason)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/internet/tcp.py", line 325, in connectionLost
    protocol.connectionLost(reason)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/protocols/tls.py", line 394, in connectionLost
    ProtocolWrapper.connectionLost(self, reason)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/protocols/policies.py", line 113, in connectionLost
    self.wrappedProtocol.connectionLost(reason)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/internet/endpoints.py", line 161, in connectionLost
    return self._wrappedProtocol.connectionLost(reason)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/application/internet.py", line 467, in connectionLost
    self._lostNotification(reason)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/twisted/application/internet.py", line 660, in <lambda>
    self._factory, lambda _: self._clientDisconnected()
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/automat/_methodical.py", line 235, in _clientDisconnected
    (outputs, outTracer) = transitioner.transition(self)
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/automat/_core.py", line 157, in transition
    outState, outputSymbols = self._automaton.outputForInput(self._state,
  File "/home/sina/miniconda3/envs/strader/lib/python3.10/site-packages/automat/_core.py", line 137, in outputForInput
    raise NoTransition(state=inState, symbol=inputSymbol)
automat._core.NoTransition: no transition for MethodicalInput(method=<function _ClientMachine._clientDisconnected at 0x7f4d1e94f520>) in MethodicalState(method=<function _ClientMachine._connecting at 0x7f4d1e94e8c0>)


Connected

Disconnected:  [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionLost'>: Connection to the other side was lost in a non-clean fashion: Connection lost.
]

Please note that at the time of writing this issue, the market is closed. so maybe the NoTransition error is referring to that. but in any case i shouldn't get an unhandled error when I'm just trying to authenticate.
Maybe i would need to check my account balance or my open positions or submit a pending order in the market closed time and the fact that the market is closed shouldn't stop my application from sending such requests.

Missing some class instances

Hey, I am struggling with issue, that there is no instances like ProtoOAApplicationAuthReq or any Proto - instances. I think maybe we are missing here stubs and services which are provided by gRPCio ? Look like we need it and we have in messages directory only pb2 files which are raw data from raw protoc instead of grpc protoc which should be called pb2_grpc.

ProtoOAGetAccountListByAccessTokenReq() gives "Trading account is not authorized"

Hi,

I hope you can help me with the below example to get it working:

from ctrader_open_api import Client, Protobuf, TcpProtocol, EndPoints
from ctrader_open_api.messages.OpenApiCommonMessages_pb2 import *
from ctrader_open_api.messages.OpenApiMessages_pb2 import *
from ctrader_open_api.messages.OpenApiModelMessages_pb2 import *
from twisted.internet import reactor

client = Client(EndPoints.PROTOBUF_LIVE_HOST, EndPoints.PROTOBUF_PORT, TcpProtocol)

def testResponseCallback(result):
    print("\nCallback received")
    test = Protobuf.extract(result)
    print(test)
    print("\nStopping reactor...")
    reactor.stop()

def applicationAuthResponseCallback(result):
    print("init ProtoOAGetAccountListByAccessTokenReq")
    request = ProtoOAGetAccountListByAccessTokenReq()
    request.accessToken = "TOP_SECRET"
    deferred = client.send(request)
    deferred.addCallbacks(testResponseCallback, onError)

def onError(client, failure):  # Call back for errors
    print("\nMessage Error: ", failure)

def disconnected(client, reason):  # Callback for client disconnection
    print("\nDisconnected: ", reason)

def onMessageReceived(client, message):  # Callback for receiving all messages
    print(message.payloadType)
    if message.payloadType in [ProtoOAGetAccountListByAccessTokenRes().payloadType, ]:
        return
    print("\nMessage received: \n", Protobuf.extract(message))

# Setting optional client callbacks
client.setConnectedCallback(applicationAuthResponseCallback)
client.setDisconnectedCallback(disconnected)
client.setMessageReceivedCallback(onMessageReceived)

# Starting the client service
client.startService()

# Run Twisted reactor, we imported it earlier
reactor.run()

Note: On the line request.accessToken = "TOP_SECRET" I have put the access_token from the authentication sequence documented here: https://spotware.github.io/open-api-docs/account-authentication. Also, I have used the access_token from the playground but both give an error.

After running this code it gives me the below output:

Message received: 
 errorCode: "UNSUPPORTED_MESSAGE"
description: "Trading account is not authorized"


Callback received
errorCode: "UNSUPPORTED_MESSAGE"
description: "Trading account is not authorized"


Stopping reactor...

Disconnected:  [Failure instance: Traceback: <class 'OpenSSL.SSL.Error'>: [('SSL routines', '', 'unexpected eof while reading')]
/usr/local/lib/python3.9/site-packages/twisted/python/context.py:83:callWithContext
/usr/local/lib/python3.9/site-packages/twisted/internet/tcp.py:507:connectionLost
/usr/local/lib/python3.9/site-packages/twisted/internet/tcp.py:325:connectionLost
/usr/local/lib/python3.9/site-packages/twisted/protocols/tls.py:389:connectionLost
--- <exception caught here> ---
/usr/local/lib/python3.9/site-packages/twisted/protocols/tls.py:269:_flushReceiveBIO
/usr/local/lib/python3.9/site-packages/OpenSSL/SSL.py:1865:recv
/usr/local/lib/python3.9/site-packages/OpenSSL/SSL.py:1700:_raise_ssl_error
/usr/local/lib/python3.9/site-packages/OpenSSL/_util.py:55:exception_from_error_queue]

The strange thing is, while running this GET command on this URL: https://api.spotware.com/connect/tradingaccounts?access_token=TOP_SECRET it gives me a nice JSON object, with the needed information.

Please let me know what I'am doing wrong here.

Many thanks!

ClientId or clientSecret is incorrect

When i'm trying to run the code, i'm having this output:
Connected
Message received:
errorCode: "CH_CLIENT_AUTH_FAILURE"
description: "clientId or clientSecret is incorrect"

Disconnected: [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionDone'>: Connection was closed cleanly.

I'm using Python3.11 and macOS

As request.clientId i'm using my account ID and for request.clientSecret my pass.

What wrong i'm doing?

Twisted NameError: name 'CertificateOptions' is not defined

Hello

I run the example ConsoleSample and jupyter and found this error.

(.venv) baotd@baotd-ThinkPad-T14-Gen-2i:~/Documents/bot-trader/collection-engine$ python testproto.py 
Host (Live/Demo): demo
Traceback (most recent call last):
  File "testproto.py", line 11, in <module>
    client = Client(host, EndPoints.PROTOBUF_PORT, TcpProtocol)
  File "/home/baotd/Documents/bot-trader/collection-engine/.venv/lib/python3.8/site-packages/ctrader_open_api/client.py", line 13, in __init__
    endpoint = clientFromString(self._runningReactor, f"ssl:{host}:{port}")
  File "/home/baotd/Documents/bot-trader/collection-engine/.venv/lib/python3.8/site-packages/twisted/internet/endpoints.py", line 2116, in clientFromString
    kwargs = _clientParsers[name](*args, **kwargs)
  File "/home/baotd/Documents/bot-trader/collection-engine/.venv/lib/python3.8/site-packages/twisted/internet/endpoints.py", line 2000, in _parseClientSSL
    return _parseClientSSLOptions(kwargs)
  File "/home/baotd/Documents/bot-trader/collection-engine/.venv/lib/python3.8/site-packages/twisted/internet/endpoints.py", line 1965, in _parseClientSSLOptions
    configuration = CertificateOptions(
NameError: name 'CertificateOptions' is not defined

Version:

  • python 3.8
  • ctrader-open-api = "^0.9.1"
  • protobuf = "3.20.1"
  • Twisted = "21.7.0"

I think the issue relate to Twisted.

  • Could you help me figure out this issue?
  • Could you please write unit test to make sure everything is fine?

Thank you

Cannot start ConsoleSample

I tried to run the ConsoleSample program, but unfortunately I can't jump over the error that pops up. I have tried using different versions of python (3.7, 3.8, 3.9), but they all produce the same result. Below is the text that python throws out:

Traceback (most recent call last):
File "/home/sample/test/main.py", line 44, in <module>
client = Client(EndPoints.PROTOBUF_LIVE_HOST if hostType.lower() == "live" else EndPoints.PROTOBUF_DEMO_HOST, EndPoints.PROTOBUF_PORT, TcpProtocol)
File "/home/rs/.local/lib/python3.9/site-packages/ctrader_open_api/client.py", line 13, in __init__
endpoint = clientFromString(self._runningReactor, f"ssl:{host}:port={port}")
File "/home/rs/.local/lib/python3.9/site-packages/twisted/internet/endpoints.py", line 2116, in clientFromString
kwargs = _clientParsers[name](*args, **kwargs)
File "/home/rs/.local/lib/python3.9/site-packages/twisted/internet/endpoints.py", line 2000, in _parseClientSSL
return _parseClientSSLOptions(kwargs)
File "/home/rs/.local/lib/python3.9/site-packages/twisted/internet/endpoints.py", line 1965, in _parseClientSSLOptions
configuration = CertificateOptions(
NameError: name 'CertificateOptions' is not defined

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.