Git Product home page Git Product logo

clj-odbp's Introduction

This project is no longer maintained, because we are no longer interested in OrientDB.

7bridges clj-odbp

clj-odbp

A Clojure driver for OrientDB binary protocol.

Build Status Clojars Project

Installation

Add the necessary dependency to your project:

[eu.7bridges/clj-odbp "0.2.3"]

Usage

Driver configuration

clj-odbp comes with default settings with regard to OrientDB connection and logging.

user> (require '[clj-odbp.configure :as c])
user> @c/config
;; => {:log-level :fatal, :log-file "log/clj_odbp.log", :port 2424, :host "localhost", :log-rotation-frequency :daily}

To change the default settings, you need to use clj-odbp.configure/configure-driver.

user> (c/configure-driver {:host "my-orientdb-server" :log-level :debug})
user> @c/config
;; => {:log-level :debug, :log-file "log/clj_odbp.log", :port 2424, :host "my-orientdb-server", :log-rotation-frequency :daily}

Driver usage

Connect to an OrientDB server:

user> (require '[clj-odbp.core :as odbp])
user> (odbp/connect-server "<username>" "<password>")

Create a new database:

user> (let [connection (odbp/connect-server "<username>" "<password>")]
        (odbp/db-create connection "test-db"))

Check if a database exists:

user> (let [connection (odbp/connect-server "<username>" "<password>")]
        (odbp/db-exist connection "test-db"))

Connect to a database and create a vertex:

user> (let [connection (odbp/db-open "test-db" "<username>" "<password>")]
        (odbp/execute-command connection "create class Test extends V"))

Connect to a database and create a record:

user> (let [connection (odbp/db-open "test-db" "<username>" "<password>")]
        (odbp/record-create connection {:_class "Test" :text "test property"}))

For further details check API documentation.

Types

The following table shows how OrientDB types map to Clojure types and viceversa.

OrientDB Clojure
boolean true, false
integer (int 42)
short (short 42)
long 42
float (float 42.5)
double 42.5
decimal (bigdec 42.5)
string "foo"
binary {:_obinary [100 101]}
date not supported
datetime (java.util.Date.)
embedded {:_version 0 :_class "Test" :name "foo"}
embedded list [0 "foo" 1]
embedded set #{0 "foo" 1}
embedded map {:name "foo" :age 42}
link "#20:1"
link list ["#20:1" "#20:2"]
link set #{"#20:1" "#20:2"}
link map {"rid" "#20:1"}
ORidBag {:_oridbag {:bag []}}
ORidTree {:_oridtree {:changes []}}

License

Copyright © 2017 7bridges s.r.l.

Distributed under the Apache License 2.0.

clj-odbp's People

Contributors

manuel-uberti avatar mdallastella avatar stardiviner 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

Watchers

 avatar  avatar  avatar  avatar

clj-odbp's Issues

Avoid negative rids on query result

When we try to execute a select such as this one:

select @rid, name from Test

The result is something like the following:

{:_version 0 :_rid "#-2:0" :name "test"}

support several connections/db

It seems that the configuration is currently in an atom in clj-odbp.configure/c

Ideally the configuration would come from a configuration/connection object passed as parameter

Remove session cache for the moment

Session cache was intended as a feature in order to reduce the number of sockets opened by the driver, but it turns out it causes more troubles than benefits.
We decided to take a step back and reintroduce it on 0.3.0.

Update with numbers in text properties

There is bug when we try to update a text property of a vertex with a value that starts with a number. For instance:

update :rid set id = :id, username = :username, screen_name = :screen_name

If we use this query when clj-odbp.core/execute-command passing in the following parameters:

{:rid "#17:4", :id "4287438981", :username "7bridges.eu", :screen_name "7bridges_eu"}

We get this record in return:

{:_version 47, :_rid "#17:4", :_class "LoggedUser", :out_Sees nil, :id "4287438981", :username "7", :screen_name "7"}

Implementation of a SQL DSL

The goal is to have a set of composable functions that produce valid SQL statement for OrientDB.
Eg:

user> (create-vertex "Class" {:name "Luke" :age 30})

must return:

INSERT INTO Class CONTENT {"name": "Luke", "age": 30}

Get rid of Timbre

Even if Timbre is a wonderful library, it's an overkill for this simple driver and it has a lot of dependencies.
We should migrate to clojure.tool.logging.

Make clj-odbp release on Clojars "canonical"

As wrote in clojars wiki:

Each user automatically gets their own group named org.clojars.username. Personal groups are designed to hold things like throwaway alpha versions and forks of other projects. They’re long and ugly on purpose to encourage official releases to use canonical groups.

We should move to a canonical group:

A canonical group is for the main, official version of a project. Often, the group name is simply the same as the project or jar name. In Leingingen you can simply specify the project name foobar as a shorthand for canonical version of a project foobar/foobar.

require clj-odbp.core error

When I execute (require 'clj-odbp.core) I got following stack trace:

  Show: Project-Only All 
  Hide: Clojure Java REPL Tooling Duplicates  (43 frames hidden)

2. Unhandled clojure.lang.Compiler$CompilerException
   Error compiling clj_odbp/network/write.clj at (15:1)
   #:clojure.error{:phase :macro-syntax-check,
                   :line 15,
                   :column 1,
                   :source "clj_odbp/network/write.clj",
                   :symbol clojure.core/ns}

             Compiler.java: 6971  clojure.lang.Compiler/checkSpecs
             Compiler.java: 6987  clojure.lang.Compiler/macroexpand1
             Compiler.java: 7074  clojure.lang.Compiler/macroexpand
             Compiler.java: 7160  clojure.lang.Compiler/eval
             Compiler.java: 7635  clojure.lang.Compiler/load
                   RT.java:  381  clojure.lang.RT/loadResourceScript
                   RT.java:  372  clojure.lang.RT/loadResourceScript
                   RT.java:  463  clojure.lang.RT/load
                   RT.java:  428  clojure.lang.RT/load
                  core.clj: 6126  clojure.core/load/fn
                  core.clj: 6125  clojure.core/load
                  core.clj: 6109  clojure.core/load
               RestFn.java:  408  clojure.lang.RestFn/invoke
                  core.clj: 5908  clojure.core/load-one
                  core.clj: 5903  clojure.core/load-one
                  core.clj: 5948  clojure.core/load-lib/fn
                  core.clj: 5947  clojure.core/load-lib
                  core.clj: 5928  clojure.core/load-lib
               RestFn.java:  142  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 5985  clojure.core/load-libs
                  core.clj: 5969  clojure.core/load-libs
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 6007  clojure.core/require
                  core.clj: 6007  clojure.core/require
               RestFn.java:  421  clojure.lang.RestFn/invoke
               command.clj:   15  clj-odbp.operations.specs.command/eval14082/loading--auto--
               command.clj:   15  clj-odbp.operations.specs.command/eval14082
               command.clj:   15  clj-odbp.operations.specs.command/eval14082
             Compiler.java: 7176  clojure.lang.Compiler/eval
             Compiler.java: 7165  clojure.lang.Compiler/eval
             Compiler.java: 7635  clojure.lang.Compiler/load
                   RT.java:  381  clojure.lang.RT/loadResourceScript
                   RT.java:  372  clojure.lang.RT/loadResourceScript
                   RT.java:  463  clojure.lang.RT/load
                   RT.java:  428  clojure.lang.RT/load
                  core.clj: 6126  clojure.core/load/fn
                  core.clj: 6125  clojure.core/load
                  core.clj: 6109  clojure.core/load
               RestFn.java:  408  clojure.lang.RestFn/invoke
                  core.clj: 5908  clojure.core/load-one
                  core.clj: 5903  clojure.core/load-one
                  core.clj: 5948  clojure.core/load-lib/fn
                  core.clj: 5947  clojure.core/load-lib
                  core.clj: 5928  clojure.core/load-lib
               RestFn.java:  142  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 5985  clojure.core/load-libs
                  core.clj: 5969  clojure.core/load-libs
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 6007  clojure.core/require
                  core.clj: 6007  clojure.core/require
               RestFn.java:  482  clojure.lang.RestFn/invoke
               command.clj:   15  clj-odbp.operations.command/eval14076/loading--auto--
               command.clj:   15  clj-odbp.operations.command/eval14076
               command.clj:   15  clj-odbp.operations.command/eval14076
             Compiler.java: 7176  clojure.lang.Compiler/eval
             Compiler.java: 7165  clojure.lang.Compiler/eval
             Compiler.java: 7635  clojure.lang.Compiler/load
                   RT.java:  381  clojure.lang.RT/loadResourceScript
                   RT.java:  372  clojure.lang.RT/loadResourceScript
                   RT.java:  463  clojure.lang.RT/load
                   RT.java:  428  clojure.lang.RT/load
                  core.clj: 6126  clojure.core/load/fn
                  core.clj: 6125  clojure.core/load
                  core.clj: 6109  clojure.core/load
               RestFn.java:  408  clojure.lang.RestFn/invoke
                  core.clj: 5908  clojure.core/load-one
                  core.clj: 5903  clojure.core/load-one
                  core.clj: 5948  clojure.core/load-lib/fn
                  core.clj: 5947  clojure.core/load-lib
                  core.clj: 5928  clojure.core/load-lib
               RestFn.java:  142  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 5989  clojure.core/load-libs
                  core.clj: 5969  clojure.core/load-libs
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 6007  clojure.core/require
                  core.clj: 6007  clojure.core/require
               RestFn.java:  436  clojure.lang.RestFn/invoke
                  core.clj:   15  clj-odbp.core/eval14070/loading--auto--
                  core.clj:   15  clj-odbp.core/eval14070
                  core.clj:   15  clj-odbp.core/eval14070
             Compiler.java: 7176  clojure.lang.Compiler/eval
             Compiler.java: 7165  clojure.lang.Compiler/eval
             Compiler.java: 7635  clojure.lang.Compiler/load
                   RT.java:  381  clojure.lang.RT/loadResourceScript
                   RT.java:  372  clojure.lang.RT/loadResourceScript
                   RT.java:  463  clojure.lang.RT/load
                   RT.java:  428  clojure.lang.RT/load
                  core.clj: 6126  clojure.core/load/fn
                  core.clj: 6125  clojure.core/load
                  core.clj: 6109  clojure.core/load
               RestFn.java:  408  clojure.lang.RestFn/invoke
                  core.clj: 5908  clojure.core/load-one
                  core.clj: 5903  clojure.core/load-one
                  core.clj: 5948  clojure.core/load-lib/fn
                  core.clj: 5947  clojure.core/load-lib
                  core.clj: 5928  clojure.core/load-lib
               RestFn.java:  142  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 5985  clojure.core/load-libs
                  core.clj: 5969  clojure.core/load-libs
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 6007  clojure.core/require
                  core.clj: 6007  clojure.core/require
               RestFn.java:  408  clojure.lang.RestFn/invoke
                      REPL:    9  stardiviner.orientdb/eval14066
                      REPL:    9  stardiviner.orientdb/eval14066
             Compiler.java: 7176  clojure.lang.Compiler/eval
             Compiler.java: 7131  clojure.lang.Compiler/eval
                  core.clj: 3214  clojure.core/eval
                  core.clj: 3210  clojure.core/eval
                  main.clj:  414  clojure.main/repl/read-eval-print/fn
                  main.clj:  414  clojure.main/repl/read-eval-print
                  main.clj:  435  clojure.main/repl/fn
                  main.clj:  435  clojure.main/repl
                  main.clj:  345  clojure.main/repl
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  665  clojure.core/apply
                  core.clj:  660  clojure.core/apply
                regrow.clj:   18  refactor-nrepl.ns.slam.hound.regrow/wrap-clojure-repl/fn
               RestFn.java: 1523  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   93  nrepl.middleware.interruptible-eval/evaluate/fn
                  AFn.java:  152  clojure.lang.AFn/applyToHelper
                  AFn.java:  144  clojure.lang.AFn/applyTo
                  core.clj:  665  clojure.core/apply
                  core.clj: 1973  clojure.core/with-bindings*
                  core.clj: 1973  clojure.core/with-bindings*
               RestFn.java:  425  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   91  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:   60  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:  231  nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn
    interruptible_eval.clj:  199  nrepl.middleware.interruptible-eval/run-next/fn
                  AFn.java:   22  clojure.lang.AFn/run
   ThreadPoolExecutor.java: 1149  java.util.concurrent.ThreadPoolExecutor/runWorker
   ThreadPoolExecutor.java:  624  java.util.concurrent.ThreadPoolExecutor$Worker/run
               Thread.java:  748  java.lang.Thread/run

1. Caused by clojure.lang.ExceptionInfo
   Call to clojure.core/ns did not conform to spec.
   #:clojure.spec.alpha{:problems
                        [{:path [],
                          :reason "Extra input",
                          :pred
                          (clojure.spec.alpha/cat
                           :docstring
                           (clojure.spec.alpha/? clojure.core/string?)
                           :attr-map
                           (clojure.spec.alpha/? clojure.core/map?)
                           :ns-clauses
                           :clojure.core.specs.alpha/ns-clauses),
                          :val
                          ((import
                            [java.io
                             ByteArrayOutputStream
                             DataOutputStream])),
                          :via [:clojure.core.specs.alpha/ns-form],
                          :in [1]}],
                        :spec
                        #object[clojure.spec.alpha$regex_spec_impl$reify__2509 0x4f04b885 "clojure.spec.alpha$regex_spec_impl$reify__2509@4f04b885"],
                        :value
                        (clj-odbp.network.write
                         (import
                          [java.io
                           ByteArrayOutputStream
                           DataOutputStream])),
                        :args
                        (clj-odbp.network.write
                         (import
                          [java.io
                           ByteArrayOutputStream
                           DataOutputStream]))}

                 alpha.clj:  705  clojure.spec.alpha/macroexpand-check
                 alpha.clj:  697  clojure.spec.alpha/macroexpand-check
                  AFn.java:  156  clojure.lang.AFn/applyToHelper
                  AFn.java:  144  clojure.lang.AFn/applyTo
                  Var.java:  705  clojure.lang.Var/applyTo
             Compiler.java: 6969  clojure.lang.Compiler/checkSpecs
             Compiler.java: 6987  clojure.lang.Compiler/macroexpand1
             Compiler.java: 7074  clojure.lang.Compiler/macroexpand
             Compiler.java: 7160  clojure.lang.Compiler/eval
             Compiler.java: 7635  clojure.lang.Compiler/load
                   RT.java:  381  clojure.lang.RT/loadResourceScript
                   RT.java:  372  clojure.lang.RT/loadResourceScript
                   RT.java:  463  clojure.lang.RT/load
                   RT.java:  428  clojure.lang.RT/load
                  core.clj: 6126  clojure.core/load/fn
                  core.clj: 6125  clojure.core/load
                  core.clj: 6109  clojure.core/load
               RestFn.java:  408  clojure.lang.RestFn/invoke
                  core.clj: 5908  clojure.core/load-one
                  core.clj: 5903  clojure.core/load-one
                  core.clj: 5948  clojure.core/load-lib/fn
                  core.clj: 5947  clojure.core/load-lib
                  core.clj: 5928  clojure.core/load-lib
               RestFn.java:  142  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 5985  clojure.core/load-libs
                  core.clj: 5969  clojure.core/load-libs
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 6007  clojure.core/require
                  core.clj: 6007  clojure.core/require
               RestFn.java:  421  clojure.lang.RestFn/invoke
               command.clj:   15  clj-odbp.operations.specs.command/eval14082/loading--auto--
               command.clj:   15  clj-odbp.operations.specs.command/eval14082
               command.clj:   15  clj-odbp.operations.specs.command/eval14082
             Compiler.java: 7176  clojure.lang.Compiler/eval
             Compiler.java: 7165  clojure.lang.Compiler/eval
             Compiler.java: 7635  clojure.lang.Compiler/load
                   RT.java:  381  clojure.lang.RT/loadResourceScript
                   RT.java:  372  clojure.lang.RT/loadResourceScript
                   RT.java:  463  clojure.lang.RT/load
                   RT.java:  428  clojure.lang.RT/load
                  core.clj: 6126  clojure.core/load/fn
                  core.clj: 6125  clojure.core/load
                  core.clj: 6109  clojure.core/load
               RestFn.java:  408  clojure.lang.RestFn/invoke
                  core.clj: 5908  clojure.core/load-one
                  core.clj: 5903  clojure.core/load-one
                  core.clj: 5948  clojure.core/load-lib/fn
                  core.clj: 5947  clojure.core/load-lib
                  core.clj: 5928  clojure.core/load-lib
               RestFn.java:  142  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 5985  clojure.core/load-libs
                  core.clj: 5969  clojure.core/load-libs
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 6007  clojure.core/require
                  core.clj: 6007  clojure.core/require
               RestFn.java:  482  clojure.lang.RestFn/invoke
               command.clj:   15  clj-odbp.operations.command/eval14076/loading--auto--
               command.clj:   15  clj-odbp.operations.command/eval14076
               command.clj:   15  clj-odbp.operations.command/eval14076
             Compiler.java: 7176  clojure.lang.Compiler/eval
             Compiler.java: 7165  clojure.lang.Compiler/eval
             Compiler.java: 7635  clojure.lang.Compiler/load
                   RT.java:  381  clojure.lang.RT/loadResourceScript
                   RT.java:  372  clojure.lang.RT/loadResourceScript
                   RT.java:  463  clojure.lang.RT/load
                   RT.java:  428  clojure.lang.RT/load
                  core.clj: 6126  clojure.core/load/fn
                  core.clj: 6125  clojure.core/load
                  core.clj: 6109  clojure.core/load
               RestFn.java:  408  clojure.lang.RestFn/invoke
                  core.clj: 5908  clojure.core/load-one
                  core.clj: 5903  clojure.core/load-one
                  core.clj: 5948  clojure.core/load-lib/fn
                  core.clj: 5947  clojure.core/load-lib
                  core.clj: 5928  clojure.core/load-lib
               RestFn.java:  142  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 5989  clojure.core/load-libs
                  core.clj: 5969  clojure.core/load-libs
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 6007  clojure.core/require
                  core.clj: 6007  clojure.core/require
               RestFn.java:  436  clojure.lang.RestFn/invoke
                  core.clj:   15  clj-odbp.core/eval14070/loading--auto--
                  core.clj:   15  clj-odbp.core/eval14070
                  core.clj:   15  clj-odbp.core/eval14070
             Compiler.java: 7176  clojure.lang.Compiler/eval
             Compiler.java: 7165  clojure.lang.Compiler/eval
             Compiler.java: 7635  clojure.lang.Compiler/load
                   RT.java:  381  clojure.lang.RT/loadResourceScript
                   RT.java:  372  clojure.lang.RT/loadResourceScript
                   RT.java:  463  clojure.lang.RT/load
                   RT.java:  428  clojure.lang.RT/load
                  core.clj: 6126  clojure.core/load/fn
                  core.clj: 6125  clojure.core/load
                  core.clj: 6109  clojure.core/load
               RestFn.java:  408  clojure.lang.RestFn/invoke
                  core.clj: 5908  clojure.core/load-one
                  core.clj: 5903  clojure.core/load-one
                  core.clj: 5948  clojure.core/load-lib/fn
                  core.clj: 5947  clojure.core/load-lib
                  core.clj: 5928  clojure.core/load-lib
               RestFn.java:  142  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 5985  clojure.core/load-libs
                  core.clj: 5969  clojure.core/load-libs
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 6007  clojure.core/require
                  core.clj: 6007  clojure.core/require
               RestFn.java:  408  clojure.lang.RestFn/invoke
                      REPL:    9  stardiviner.orientdb/eval14066
                      REPL:    9  stardiviner.orientdb/eval14066
             Compiler.java: 7176  clojure.lang.Compiler/eval
             Compiler.java: 7131  clojure.lang.Compiler/eval
                  core.clj: 3214  clojure.core/eval
                  core.clj: 3210  clojure.core/eval
                  main.clj:  414  clojure.main/repl/read-eval-print/fn
                  main.clj:  414  clojure.main/repl/read-eval-print
                  main.clj:  435  clojure.main/repl/fn
                  main.clj:  435  clojure.main/repl
                  main.clj:  345  clojure.main/repl
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  665  clojure.core/apply
                  core.clj:  660  clojure.core/apply
                regrow.clj:   18  refactor-nrepl.ns.slam.hound.regrow/wrap-clojure-repl/fn
               RestFn.java: 1523  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   93  nrepl.middleware.interruptible-eval/evaluate/fn
                  AFn.java:  152  clojure.lang.AFn/applyToHelper
                  AFn.java:  144  clojure.lang.AFn/applyTo
                  core.clj:  665  clojure.core/apply
                  core.clj: 1973  clojure.core/with-bindings*
                  core.clj: 1973  clojure.core/with-bindings*
               RestFn.java:  425  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   91  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:   60  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:  231  nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn
    interruptible_eval.clj:  199  nrepl.middleware.interruptible-eval/run-next/fn
                  AFn.java:   22  clojure.lang.AFn/run
   ThreadPoolExecutor.java: 1149  java.util.concurrent.ThreadPoolExecutor/runWorker
   ThreadPoolExecutor.java:  624  java.util.concurrent.ThreadPoolExecutor$Worker/run
               Thread.java:  748  java.lang.Thread/run

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.