Giter Club home page Giter Club logo

python-sonic-client's Introduction

python-sonic-client

Python client for sonic search backend.

Install

pip install sonic-client

Examples

Ingest

from sonic import IngestClient

with IngestClient("127.0.0.1", 1491, "password") as ingestcl:
    print(ingestcl.ping())
    print(ingestcl.protocol)
    print(ingestcl.bufsize)
    ingestcl.push("wiki", "articles", "article-1", "for the love of god hell")
    ingestcl.push("wiki", "articles", "article-2", "for the love of satan heaven")
    ingestcl.push("wiki", "articles", "article-3", "for the love of lorde hello")
    ingestcl.push("wiki", "articles", "article-4", "for the god of loaf helmet")

Search

from sonic import SearchClient

with SearchClient("127.0.0.1", 1491, "password") as querycl:
    print(querycl.ping())
    print(querycl.query("wiki", "articles", "for"))
    print(querycl.query("wiki", "articles", "love"))
    print(querycl.suggest("wiki", "articles", "hell"))

Control

from sonic import ControlClient

with ControlClient("127.0.0.1", 1491, "password") as controlcl:
    print(controlcl.ping())
    controlcl.trigger("consolidate")

API reference

API documentation can be found at docs/api and also Browsable

Difference from asonic

asonic uses asyncio and this client doesn't. It grew out of needing to use sonic within gevent context

python-sonic-client's People

Contributors

cfstras avatar fugangqiang avatar hellohyy avatar xmonader 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

Watchers

 avatar  avatar  avatar  avatar

python-sonic-client's Issues

SUGGEST returns a PENDING answer

Describe the bug

I'm having the same problem as previously reported in #13: when running a SearchClient.suggest() query, returns a PENDING string.

To Reproduce

Running the example code blocks from Readme:

>>> with IngestClient("127.0.0.1", 1491, "password") as ingestcl:
...     print(ingestcl.ping())
...     print(ingestcl.protocol)
...     print(ingestcl.bufsize)
...     ingestcl.push("wiki", "articles", "article-1", "for the love of god hell")
...     ingestcl.push("wiki", "articles", "article-2", "for the love of satan heaven")
...     ingestcl.push("wiki", "articles", "article-3", "for the love of lorde hello")
...     ingestcl.push("wiki", "articles", "article-4", "for the god of loaf helmet")
... 
True
1
0
True
True
True
True

>>> with SearchClient("127.0.0.1", 1491, "password") as querycl:
...     print(querycl.ping())
...     print(querycl.query("wiki", "articles", "for"))
...     print(querycl.query("wiki", "articles", "love"))
...     print(querycl.suggest("wiki", "articles", "hell"))
... 
True
[]
['article-3', 'article-2', 'article-1']
PENDING XjOQ6NLi

Expected behavior

Receiving a result on the last method call (queryctl.suggest). Is it expected to work like that?

** Versions (please complete the following information):**

  • OS: Debian (Docker)
  • Sonic version: v1.3.5
  • Sonic client version: v0.0.5

Close connection when exception is raised

Describe the bug
When server returns error, client doesn't close socket.

ResourceWarning: Enable tracemalloc to get the object allocation traceback
/usr/lib/python3.7/socket.py:660: ResourceWarning: unclosed <socket.socket fd=9, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=6, laddr=('172.27.0.3', 42192), raddr=('172.27.0.2', 1491)>
  self._sock = None

Expected behavior
connection is closed before raising the error.

Functional tests with sonic in docker

Is your feature request related to a problem? Please describe.
Client tests should done with a server.

Describe the solution you'd like
pytest for this client.

Describe alternatives you've considered
Some pytest collection against sonic server.

sonic closed connection

after certain time sonic server closes the connection which prevents the client from communicating with the server anyhow

crash

Describe the bug
After a while python crashes with this stacktrace:

#0  __libc_send (flags=<optimized out>, len=0x6, buf=0x55d6287fd840, fd=0x16) at ../sysdeps/unix/sysv/linux/send.c:28
#1  __libc_send (fd=0x16, buf=0x55d6287fd840, len=0x6, flags=0x0) at ../sysdeps/unix/sysv/linux/send.c:23
#2  0x00007efd6330a346 in sock_send_impl (s=<optimized out>, data=0x7ffd5d7d68f0) at ../Modules/socketmodule.c:4136
#3  0x00007efd63309b7a in sock_call_ex (s=s@entry=0x7efc197c8130, writing=writing@entry=0x1, sock_func=sock_func@entry=0x7efd6330a330 <sock_send_impl>, data=data@entry=0x7ffd5d7d68f0, connect=connect@entry=0x0, err=err@entry=0x0, timeout=0xdf8475800) at ../Modules/socketmodule.c:896
#4  0x00007efd63309be8 in sock_call (s=s@entry=0x7efc197c8130, writing=writing@entry=0x1, func=func@entry=0x7efd6330a330 <sock_send_impl>, data=data@entry=0x7ffd5d7d68f0) at ../Modules/socketmodule.c:948
#5  0x00007efd63309c54 in sock_send (s=0x7efc197c8130, args=<optimized out>) at ../Modules/socketmodule.c:4160
#6  0x00007efd6310a6fc in method_vectorcall_VARARGS (func=0x7efd6288d190, args=0x7efc19c64fd0, nargsf=<optimized out>, kwnames=<optimized out>) at ../Objects/descrobject.c:311
#7  0x00007efd631dbe07 in _PyObject_VectorcallTstate (tstate=0x55d626bfed50, callable=callable@entry=0x7efd6288d190, args=args@entry=0x7efc19c64fd0, nargsf=nargsf@entry=0x8000000000000002, kwnames=kwnames@entry=0x0) at ../Include/cpython/abstract.h:114
#8  0x00007efd631dbf68 in PyObject_Vectorcall (callable=0x7efd6288d190, args=0x7efc19c64fd0, nargsf=0x8000000000000002, kwnames=kwnames@entry=0x0) at ../Include/cpython/abstract.h:123
#9  0x00007efd631de2a5 in call_function (tstate=tstate@entry=0x55d626bfed50, trace_info=trace_info@entry=0x7ffd5d7d6b30, pp_stack=pp_stack@entry=0x7ffd5d7d6ae0, oparg=oparg@entry=0x2, kwnames=kwnames@entry=0x0) at ../Python/ceval.c:5891
#10 0x00007efd631e9c76 in _PyEval_EvalFrameDefault (tstate=0x55d626bfed50, f=0x7efc19c64e50, throwflag=<optimized out>) at ../Python/ceval.c:4198
#11 0x00007efd631ebbba in _PyEval_EvalFrame (throwflag=0x0, f=0x7efc19c64e50, tstate=0x55d626bfed50) at ../Include/internal/pycore_ceval.h:46
#12 _PyEval_Vector (tstate=0x55d626bfed50, con=0x7efd628a0480, locals=locals@entry=0x0, args=<optimized out>, argcount=<optimized out>, kwnames=<optimized out>) at ../Python/ceval.c:5065
#13 0x00007efd63100bc7 in _PyFunction_Vectorcall (func=<optimized out>, stack=<optimized out>, nargsf=<optimized out>, kwnames=<optimized out>) at ../Objects/call.c:342
#14 0x00007efd63100fd0 in _PyObject_VectorcallTstate (tstate=tstate@entry=0x55d626bfed50, callable=callable@entry=0x7efd628a0470, args=args@entry=0x7ffd5d7d6c60, nargsf=nargsf@entry=0x2, kwnames=kwnames@entry=0x0) at ../Include/cpython/abstract.h:114
#15 0x00007efd63101a73 in PyObject_VectorcallMethod (name=<optimized out>, args=args@entry=0x7ffd5d7d6c60, nargsf=0x2, nargsf@entry=0x8000000000000002, kwnames=kwnames@entry=0x0) at ../Objects/call.c:770
#16 0x00007efd632b20bb in PyObject_CallMethodOneArg (self=<optimized out>, name=<optimized out>, arg=arg@entry=0x7efc19c5f860) at ../Include/cpython/abstract.h:204
#17 0x00007efd632b38ad in _bufferedwriter_raw_write (self=self@entry=0x7efc19c7b590, start=<optimized out>, len=0x6) at ../Modules/_io/bufferedio.c:1833
#18 0x00007efd632b3a14 in _bufferedwriter_flush_unlocked (self=self@entry=0x7efc19c7b590) at ../Modules/_io/bufferedio.c:1878
#19 0x00007efd632b3ad1 in buffered_flush_and_rewind_unlocked (self=self@entry=0x7efc19c7b590) at ../Modules/_io/bufferedio.c:800
#20 0x00007efd632b411e in buffered_flush (self=0x7efc19c7b590, args=<optimized out>) at ../Modules/_io/bufferedio.c:827
#21 0x00007efd6310a4a6 in method_vectorcall_NOARGS (func=0x7efd62aba870, args=0x7ffd5d7d6e48, nargsf=<optimized out>, kwnames=<optimized out>) at ../Objects/descrobject.c:432
#22 0x00007efd63100fd0 in _PyObject_VectorcallTstate (tstate=tstate@entry=0x55d626bfed50, callable=callable@entry=0x7efd62aba870, args=args@entry=0x7ffd5d7d6e48, nargsf=nargsf@entry=0x1, kwnames=kwnames@entry=0x0) at ../Include/cpython/abstract.h:114
#23 0x00007efd63101a73 in PyObject_VectorcallMethod (name=<optimized out>, args=args@entry=0x7ffd5d7d6e48, nargsf=0x1, nargsf@entry=0x8000000000000001, kwnames=kwnames@entry=0x0) at ../Objects/call.c:770
#24 0x00007efd63315d12 in _PyObject_VectorcallMethodId (name=name@entry=0x7efd635ec560 <PyId_flush>, args=args@entry=0x7ffd5d7d6e48, nargsf=nargsf@entry=0x8000000000000001, kwnames=kwnames@entry=0x0) at ../Include/cpython/abstract.h:233
#25 0x00007efd633184f5 in _PyObject_CallMethodIdNoArgs (name=0x7efd635ec560 <PyId_flush>, self=<optimized out>) at ../Include/cpython/abstract.h:239
#26 _io_TextIOWrapper_flush_impl (self=0x7efc19c4e120) at ../Modules/_io/textio.c:3036
#27 0x00007efd633185d5 in _io_TextIOWrapper_flush (self=<optimized out>, _unused_ignored=<optimized out>) at ../Modules/_io/clinic/textio.c.h:655
#28 0x00007efd6310a4a6 in method_vectorcall_NOARGS (func=0x7efd62abc470, args=0x7efc19c44f00, nargsf=<optimized out>, kwnames=<optimized out>) at ../Objects/descrobject.c:432
#29 0x00007efd631dbe07 in _PyObject_VectorcallTstate (tstate=0x55d626bfed50, callable=callable@entry=0x7efd62abc470, args=args@entry=0x7efc19c44f00, nargsf=nargsf@entry=0x8000000000000001, kwnames=kwnames@entry=0x0) at ../Include/cpython/abstract.h:114
#30 0x00007efd631dbf68 in PyObject_Vectorcall (callable=0x7efd62abc470, args=0x7efc19c44f00, nargsf=0x8000000000000001, kwnames=kwnames@entry=0x0) at ../Include/cpython/abstract.h:123
#31 0x00007efd631de2a5 in call_function (tstate=tstate@entry=0x55d626bfed50, trace_info=trace_info@entry=0x7ffd5d7d7050, pp_stack=pp_stack@entry=0x7ffd5d7d7000, oparg=oparg@entry=0x1, kwnames=kwnames@entry=0x0) at ../Python/ceval.c:5891
#32 0x00007efd631e9c76 in _PyEval_EvalFrameDefault (tstate=0x55d626bfed50, f=0x7efc19c44d70, throwflag=<optimized out>) at ../Python/ceval.c:4198
#33 0x00007efd631ebbba in _PyEval_EvalFrame (throwflag=0x0, f=0x7efc19c44d70, tstate=0x55d626bfed50) at ../Include/internal/pycore_ceval.h:46
#34 _PyEval_Vector (tstate=0x55d626bfed50, con=0x7efc19c728f0, locals=locals@entry=0x0, args=<optimized out>, argcount=<optimized out>, kwnames=<optimized out>) at ../Python/ceval.c:5065
#35 0x00007efd63100bc7 in _PyFunction_Vectorcall (func=<optimized out>, stack=<optimized out>, nargsf=<optimized out>, kwnames=<optimized out>) at ../Objects/call.c:342
#36 0x00007efd631dbe07 in _PyObject_VectorcallTstate (tstate=0x55d626bfed50, callable=callable@entry=0x7efc19c728e0, args=args@entry=0x55d62872c848, nargsf=nargsf@entry=0x8000000000000002, kwnames=kwnames@entry=0x0) at ../Include/cpython/abstract.h:114
#37 0x00007efd631dbf68 in PyObject_Vectorcall (callable=0x7efc19c728e0, args=0x55d62872c848, nargsf=0x8000000000000002, kwnames=kwnames@entry=0x0) at ../Include/cpython/abstract.h:123
#38 0x00007efd631de2a5 in call_function (tstate=tstate@entry=0x55d626bfed50, trace_info=trace_info@entry=0x7ffd5d7d7290, pp_stack=pp_stack@entry=0x7ffd5d7d7240, oparg=oparg@entry=0x2, kwnames=kwnames@entry=0x0) at ../Python/ceval.c:5891
#39 0x00007efd631e9c76 in _PyEval_EvalFrameDefault (tstate=0x55d626bfed50, f=0x55d62872c6d0, throwflag=<optimized out>) at ../Python/ceval.c:4198
#40 0x00007efd631ebbba in _PyEval_EvalFrame (throwflag=0x0, f=0x55d62872c6d0, tstate=0x55d626bfed50) at ../Include/internal/pycore_ceval.h:46
#41 _PyEval_Vector (tstate=0x55d626bfed50, con=0x7efc19c72420, locals=locals@entry=0x0, args=<optimized out>, argcount=<optimized out>, kwnames=<optimized out>) at ../Python/ceval.c:5065
#42 0x00007efd63100bc7 in _PyFunction_Vectorcall (func=<optimized out>, stack=<optimized out>, nargsf=<optimized out>, kwnames=<optimized out>) at ../Objects/call.c:342
#43 0x00007efd631dbe07 in _PyObject_VectorcallTstate (tstate=0x55d626bfed50, callable=callable@entry=0x7efc19c72410, args=args@entry=0x55d6287ffd68, nargsf=nargsf@entry=0x8000000000000001, kwnames=kwnames@entry=0x0) at ../Include/cpython/abstract.h:114
#44 0x00007efd631dbf68 in PyObject_Vectorcall (callable=0x7efc19c72410, args=0x55d6287ffd68, nargsf=0x8000000000000001, kwnames=kwnames@entry=0x0) at ../Include/cpython/abstract.h:123
#45 0x00007efd631de2a5 in call_function (tstate=tstate@entry=0x55d626bfed50, trace_info=trace_info@entry=0x7ffd5d7d74d0, pp_stack=pp_stack@entry=0x7ffd5d7d7480, oparg=oparg@entry=0x1, kwnames=kwnames@entry=0x0) at ../Python/ceval.c:5891
#46 0x00007efd631e9c76 in _PyEval_EvalFrameDefault (tstate=0x55d626bfed50, f=0x55d6287ffbf0, throwflag=<optimized out>) at ../Python/ceval.c:4198
#47 0x00007efd631ebbba in _PyEval_EvalFrame (throwflag=0x0, f=0x55d6287ffbf0, tstate=0x55d626bfed50) at ../Include/internal/pycore_ceval.h:46
#48 _PyEval_Vector (tstate=0x55d626bfed50, con=0x7efc19c72bb0, locals=locals@entry=0x0, args=<optimized out>, argcount=<optimized out>, kwnames=<optimized out>) at ../Python/ceval.c:5065
#49 0x00007efd63100bc7 in _PyFunction_Vectorcall (func=<optimized out>, stack=<optimized out>, nargsf=<optimized out>, kwnames=<optimized out>) at ../Objects/call.c:342
#50 0x00007efd631dbe07 in _PyObject_VectorcallTstate (tstate=0x55d626bfed50, callable=callable@entry=0x7efc19c72ba0, args=args@entry=0x7efc19c65be0, nargsf=nargsf@entry=0x8000000000000002, kwnames=kwnames@entry=0x0) at ../Include/cpython/abstract.h:114
#51 0x00007efd631dbf68 in PyObject_Vectorcall (callable=0x7efc19c72ba0, args=0x7efc19c65be0, nargsf=0x8000000000000002, kwnames=kwnames@entry=0x0) at ../Include/cpython/abstract.h:123
#52 0x00007efd631de2a5 in call_function (tstate=tstate@entry=0x55d626bfed50, trace_info=trace_info@entry=0x7ffd5d7d7710, pp_stack=pp_stack@entry=0x7ffd5d7d76c0, oparg=oparg@entry=0x2, kwnames=kwnames@entry=0x0) at ../Python/ceval.c:5891
#53 0x00007efd631e9c76 in _PyEval_EvalFrameDefault (tstate=0x55d626bfed50, f=0x7efc19c65a50, throwflag=<optimized out>) at ../Python/ceval.c:4198
#54 0x00007efd631ebbba in _PyEval_EvalFrame (throwflag=0x0, f=0x7efc19c65a50, tstate=0x55d626bfed50) at ../Include/internal/pycore_ceval.h:46
#55 _PyEval_Vector (tstate=0x55d626bfed50, con=0x7efc19c731e0, locals=locals@entry=0x0, args=<optimized out>, argcount=<optimized out>, kwnames=<optimized out>) at ../Python/ceval.c:5065
#56 0x00007efd63100bc7 in _PyFunction_Vectorcall (func=<optimized out>, stack=<optimized out>, nargsf=<optimized out>, kwnames=<optimized out>) at ../Objects/call.c:342
#57 0x00007efd631dbe07 in _PyObject_VectorcallTstate (tstate=0x55d626bfed50, callable=callable@entry=0x7efc19c731d0, args=args@entry=0x55d62880d220, nargsf=nargsf@entry=0x8000000000000008, kwnames=kwnames@entry=0x0) at ../Include/cpython/abstract.h:114
#58 0x00007efd631dbf68 in PyObject_Vectorcall (callable=0x7efc19c731d0, args=0x55d62880d220, nargsf=0x8000000000000008, kwnames=kwnames@entry=0x0) at ../Include/cpython/abstract.h:123
#59 0x00007efd631de2a5 in call_function (tstate=tstate@entry=0x55d626bfed50, trace_info=trace_info@entry=0x7ffd5d7d7950, pp_stack=pp_stack@entry=0x7ffd5d7d7900, oparg=oparg@entry=0x8, kwnames=kwnames@entry=0x0) at ../Python/ceval.c:5891
#60 0x00007efd631e9c76 in _PyEval_EvalFrameDefault (tstate=0x55d626bfed50, f=0x55d62880d080, throwflag=<optimized out>) at ../Python/ceval.c:4198
#61 0x00007efd631ebbba in _PyEval_EvalFrame (throwflag=0x0, f=0x55d62880d080, tstate=0x55d626bfed50) at ../Include/internal/pycore_ceval.h:46
#62 _PyEval_Vector (tstate=0x55d626bfed50, con=0x7efc19c73ad0, locals=locals@entry=0x0, args=<optimized out>, argcount=<optimized out>, kwnames=<optimized out>) at ../Python/ceval.c:5065
#63 0x00007efd63100bc7 in _PyFunction_Vectorcall (func=<optimized out>, stack=<optimized out>, nargsf=<optimized out>, kwnames=<optimized out>) at ../Objects/call.c:342
#64 0x00007efd63103070 in _PyObject_VectorcallTstate (tstate=tstate@entry=0x55d626bfed50, callable=0x7efc19c73ac0, args=args@entry=0x7efc19816750, nargsf=nargsf@entry=0x4, kwnames=kwnames@entry=0x7efc197dc6e0) at ../Include/cpython/abstract.h:114
#65 0x00007efd6310321e in method_vectorcall (method=<optimized out>, args=0x7efc19816758, nargsf=<optimized out>, kwnames=0x7efc197dc6e0) at ../Objects/classobject.c:53
#66 0x00007efd6310098c in PyVectorcall_Call (callable=callable@entry=0x7efc197c1a30, tuple=tuple@entry=0x7efc19caf3b0, kwargs=kwargs@entry=0x7efc19884830) at ../Objects/call.c:267
#67 0x00007efd63100aed in _PyObject_Call (tstate=0x55d626bfed50, callable=callable@entry=0x7efc197c1a30, args=args@entry=0x7efc19caf3b0, kwargs=kwargs@entry=0x7efc19884830) at ../Objects/call.c:290
#68 0x00007efd63100b3f in PyObject_Call (callable=callable@entry=0x7efc197c1a30, args=args@entry=0x7efc19caf3b0, kwargs=kwargs@entry=0x7efc19884830) at ../Objects/call.c:317
#69 0x00007efd631de349 in do_call_core (tstate=tstate@entry=0x55d626bfed50, trace_info=trace_info@entry=0x7ffd5d7d7c90, func=func@entry=0x7efc197c1a30, callargs=callargs@entry=0x7efc19caf3b0, kwdict=kwdict@entry=0x7efc19884830) at ../Python/ceval.c:5943
#70 0x00007efd631ea225 in _PyEval_EvalFrameDefault (tstate=0x55d626bfed50, f=0x7efc19c65c50, throwflag=<optimized out>) at ../Python/ceval.c:4277
#71 0x00007efd631ebbba in _PyEval_EvalFrame (throwflag=0x0, f=0x7efc19c65c50, tstate=0x55d626bfed50) at ../Include/internal/pycore_ceval.h:46
#72 _PyEval_Vector (tstate=0x55d626bfed50, con=0x7efc19c71b30, locals=locals@entry=0x0, args=<optimized out>, argcount=<optimized out>, kwnames=<optimized out>) at ../Python/ceval.c:5065
#73 0x00007efd63100bc7 in _PyFunction_Vectorcall (func=<optimized out>, stack=<optimized out>, nargsf=<optimized out>, kwnames=<optimized out>) at ../Objects/call.c:342
#74 0x00007efd6310098c in PyVectorcall_Call (callable=callable@entry=0x7efc19c71b20, tuple=tuple@entry=0x7efc19859c10, kwargs=kwargs@entry=0x7efc198855b0) at ../Objects/call.c:267
#75 0x00007efd63100aed in _PyObject_Call (tstate=0x55d626bfed50, callable=0x7efc19c71b20, args=0x7efc19859c10, kwargs=0x7efc198855b0) at ../Objects/call.c:290
#76 0x00007efd63100b3f in PyObject_Call (callable=<optimized out>, args=<optimized out>, kwargs=<optimized out>) at ../Objects/call.c:317

Expected behavior
It should not crash

** Versions (please complete the following information):**

  • OS: Debian GNU/Linux bookworm/sid, Python 3.10.6
  • Sonic version sonic-server 1.3.5
  • Sonic client version 1cbae7e

Additional context
If I swap python-sonic-client with pysonic-channel from https://github.com/AlongWY/pysonic I don't get crashes, the queries are the same (minus the lang and limit args)

Timeout when including Chinese character on Windows

Describe the bug
Client's socket raise timout error when object or text (or bucket name? not tested.) containing Chinese character on Window platform, but it works expectedly on Linux.

To Reproduce
Steps to reproduce the behavior:

  1. Connect to sonic
  2. Push or query something in Chinese, like ingestcl.push('wiki', 'default', 'something', '今天天气不错')

Expected behavior
Normal return.

** Versions (please complete the following information):**

  • OS: Windows 10
  • Sonic version: 1.3.2
  • Sonic client version: 0.0.5

Additional context
I believe that sonic expects UTF-8 encoding, which is the default encoding in Python3 on Linux, but on Windows default would be GBK instead.

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.