Coder Social home page Coder Social logo

http-server-async's Introduction

Actions Status

NAME

HTTP::Server::Async - Asynchronous Base HTTP Server

SYNOPSIS

use HTTP::Server::Async;

my $s = HTTP::Server::Async.new;

$s.handler:  -> $request, $response {
    $response.headers<Content-Type> = 'text/plain';
    $response.status = 200;
    $response.write("Hello ");
    # keeps a promise in the response and ends the server handler processing
    $response.close("world!");
}

$s.listen(True);

DESCRIPTION

HTTP::Server::Async provides an implementation of an HTTP server, based on the roles provided by HTTP::Roles.

It currently handles:

  • Parsing Headers

  • Chunked Transfer

  • Hooks for middleware or route handling

  • Simple response handling

It does not handle:

CLASSES

HTTP::Server::Async

new

Takes these named arguments to return an instantiated object:

  • :port - port to listen on

  • :host - IP number to listen on

  • :buffered - whether responses should be buffered or not (Bool)

handler

Any Callable passed to this method is registered to be called on every incoming request in the order in which they were registered.

Any registered Callable should return True to continue processing. A False value will discontinue processing of the request. Alternatively a Promise can be returned: if the Promise is broken then the server will discontinue, if the promise is kept then processing will continue.

The Callable will receive two parameters from the server, an HTTP::Server::Async::Request and a HTTP::Server::Async::Response object. More about the Response and Request object below.

Note that the server will wait for the request body to be complete before calling Callable registered with handler.

middleware

The same as the handler except will NOT wait for a complete request body. The middleware can hijack the connection by explicitly returning False and continuing processing using $request.connection to gain control of the socket.

listen

Starts the server and does not block, unless called with a True value.

HTTP::Server::Async::Request

This handles the parsing of an incoming request.

Attributes

method

GET/PUT/POST/etc.

headers

hash with Key/value pair containing the header values.

uri

Requested resource.

version

HTTP/1.X (or whatever was in the request).

data

String containing the data included with the request.

HTTP::Server::Async::Response

Response object, handles writing and closing the socket.

Attributes

buffered

Whether or not the response object should buffer the response and write on close, or write directly to the socket.

status

Set the status of the response, uses HTTP status codes. See RFC2616 for more information. Defaults to 200.

headers

Hash with response headers to be sent, accessed directly. Modifying these after writing to the socket will have no effect on the response unless the buffered is set to True.

Methods

write

Write data to the socket, will call the appropriate method for the socket ($connection.write for Strs, anything else is $connection.send)

close

Close takes optional parameter of data to send out. Will call write if a parameter is provided. Closes the socket, writes headers if the response is buffered, etc.

CREDITS

Thanks to ugexe, btyler, jnthn, and timotimo for helping figure out bugs, answer a bunch of questions, etc.

AUTHOR

Tony O'Dell

COPYRIGHT AND LICENSE

Copyright 2014 - 2019 Tony O'Dell

Copyright 2020 - 2022 Raku Community

This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.

http-server-async's People

Contributors

alexdaniel avatar azawawi avatar bbkr avatar colomon avatar gfldex avatar jj avatar jonathanstowe avatar lizmat avatar llfourn avatar nicqrocks avatar retupmoca avatar samcv avatar scimon avatar timo avatar tony-o avatar ugexe avatar zoffixznet avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

http-server-async's Issues

Test failure on rakudo star 2014.12 (Windows 7)

t/06_responsetimeout.t ............ ok
use of uninitialized value of type Any in string context  in any !cursor_init at  gen\moar\stage2\QRegex.nqp:1069


# Failed test 'Test for chunked data echo'
# at t/07_chunkedrequestecho.t line 33
# Looks like you failed 1 tests of 1
t/07_chunkedrequestecho.t .........
Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/1 subtests
t/08_keepalive.t .................. ok
Test Summary Report
-------------------
t/07_chunkedrequestecho.t       (Wstat: 256 Tests: 1 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
Files=8, Tests=26, 37 wallclock secs ( 0.01 usr +  0.05 sys =  0.06 CPU)
Result: FAIL
test stage failed for HTTP::Server::Async: Tests failed
  in method install at C:\rakudo/languages/perl6/lib/Panda.pm:124
  in block  at C:\rakudo/languages/perl6/lib/Panda.pm:1
  in method resolve at C:\rakudo/languages/perl6/lib/Panda.pm:183
  in sub MAIN at C:\rakudo\bin\\panda:20
  in sub MAIN at C:\rakudo\bin\\panda:18
  in block <unit> at C:\rakudo\bin\\panda:69

Install fails on Centos with 2015.07.1-12-g174049f built on MoarVM version 2015.07

panda install HTTP::Server::Async
==> Fetching HTTP::Server::Async
==> Building HTTP::Server::Async
Compiling lib/HTTP/Server/Async/Response.pm6 to mbc
Compiling lib/HTTP/Server/Async/Request.pm6 to mbc
Compiling lib/HTTP/Server/Async.pm6 to mbc
==> Testing HTTP::Server::Async
Too many positionals passed; expected 1 argument but got 2
in block at t/01_request.t:42

Looks like you planned 12 tests, but ran 8

t/01_request.t ....................
Dubious, test returned 255 (wstat 65280, 0xff00)
Failed 4/12 subtests
Too many positionals passed; expected 1 argument but got 2
in block at t/02_plugins.t:24

t/01_request.t ....................
Dubious, test returned 255 (wstat 65280, 0xff00)
Failed 4/12 subtests Failed 2/2 subtests
Too many positionals passed; expected 1 argument but got 2
in block at t/03_statuscode.t:21

t/03_statuscode.t .................
Dubious, test returned 255 (wstat 65280, 0xff00)
Failed 1/1 subtests
Too many positionals passed; expected 1 argument but got 2
in block at t/04_unbuffered_laggy_response.t:26

t/04_unbuffered_laggy_response.t ..
Dubious, test returned 255 (wstat 65280, 0xff00)
Failed 3/3 subtests
Too many positionals passed; expected 1 argument but got 2
in block at t/05_laggyrequest.t:20

t/05_laggyrequest.t ...............
Dubious, test returned 255 (wstat 65280, 0xff00)
Failed 1/1 subtests
Too many positionals passed; expected 1 argument but got 2
in block at t/06_responsetimeout.t:20
t/06_responsetimeout.t ............
Dubious, test returned 255 (wstat 65280, 0xff00)
Failed 1/1 subtests
Too many positionals passed; expected 1 argument but got 2
in block at t/07_chunkedrequestecho.t:21

t/07_chunkedrequestecho.t .........
Dubious, test returned 255 (wstat 65280, 0xff00)
Failed 1/1 subtests
Too many positionals passed; expected 1 argument but got 2
in block at t/09_unbuffer.t:36

Looks like you planned 7 tests, but ran 3

t/09_unbuffer.t ...................
Dubious, test returned 255 (wstat 65280, 0xff00)
Failed 4/7 subtests

Test Summary Report

t/01_request.t (Wstat: 65280 Tests: 8 Failed: 0)
Non-zero exit status: 255
Parse errors: Bad plan. You planned 12 tests but ran 8.
t/02_plugins.t (Wstat: 65280 Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: Bad plan. You planned 2 tests but ran 0.
t/03_statuscode.t (Wstat: 65280 Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: Bad plan. You planned 1 tests but ran 0.
t/04_unbuffered_laggy_response.t (Wstat: 65280 Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: Bad plan. You planned 3 tests but ran 0.
t/05_laggyrequest.t (Wstat: 65280 Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: Bad plan. You planned 1 tests but ran 0.
t/06_responsetimeout.t (Wstat: 65280 Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: Bad plan. You planned 1 tests but ran 0.
t/07_chunkedrequestecho.t (Wstat: 65280 Tests: 0 Failed: 0)
Non-zero exit status: 255
Parse errors: Bad plan. You planned 1 tests but ran 0.
t/09_unbuffer.t (Wstat: 65280 Tests: 3 Failed: 0)
Non-zero exit status: 255
Parse errors: Bad plan. You planned 7 tests but ran 3.
Files=8, Tests=11, 19 wallclock secs ( 0.05 usr 0.02 sys + 17.31 cusr 0.99 csys = 18.37 CPU)
Result: FAIL
test stage failed for HTTP::Server::Async: Tests failed
in method throw at /home/mpapec/.rakudobrew/moar-nom/install/share/perl6/runtime/CORE.setting.moarvm:1
in method install at lib/Panda.pm:133
in method resolve at lib/Panda.pm:218
in sub MAIN at /home/mpapec/.rakudobrew/bin/../moar-nom/install/share/perl6/site/bin/panda:20
in block at /home/mpapec/.rakudobrew/bin/../moar-nom/install/share/perl6/site/bin/panda:87

Failure Summary

HTTP::Server::Async
*test stage failed for HTTP::Server::Async: Tests failed

zef install fails due to test failure in t/07_chunkedrequestecho.t

$ perl6 --version
This is Rakudo version 2017.07-60-g2fb8c7258 built on MoarVM version 2017.07-15-g0729f841
implementing Perl 6.c.
$  zef install HTTP::Server::Async
===> Searching for: HTTP::Server::Async
===> Searching for missing dependencies: HTTP::Server
===> Testing: HTTP::Server:ver('0.1.1'):auth('github:tony-o')
===> Testing [OK] for HTTP::Server:ver('0.1.1'):auth('github:tony-o')
===> Testing: HTTP::Server::Async:ver('0.1.7'):auth('github:tony-o')
Could not receive data from socket: Connection reset by peer
  in block <unit> at t/07_chunkedrequestecho.t line 29


===> Testing [FAIL]: HTTP::Server::Async:ver('0.1.7'):auth('github:tony-o')
Aborting due to test failure: HTTP::Server::Async:ver('0.1.7'):auth('github:tony-o') (use --force-test to override)
  in code  at /Users/emiller/Code/rakudo/install/share/perl6/site/sources/3393EDA469A9E8925A633FF7A533AB41141495DA (Zef::Client) line 373
  in method test at /Users/emiller/Code/rakudo/install/share/perl6/site/sources/3393EDA469A9E8925A633FF7A533AB41141495DA (Zef::Client) line 351
  in code  at /Users/emiller/Code/rakudo/install/share/perl6/site/sources/3393EDA469A9E8925A633FF7A533AB41141495DA (Zef::Client) line 528
  in sub  at /Users/emiller/Code/rakudo/install/share/perl6/site/sources/3393EDA469A9E8925A633FF7A533AB41141495DA (Zef::Client) line 525
  in method install at /Users/emiller/Code/rakudo/install/share/perl6/site/sources/3393EDA469A9E8925A633FF7A533AB41141495DA (Zef::Client) line 631
  in sub MAIN at /Users/emiller/Code/rakudo/install/share/perl6/site/sources/ED3033E8712BCF9F6DE53678B14A54705DF211A6 (Zef::CLI) line 152
  in block <unit> at /Users/emiller/Code/rakudo/install/share/perl6/site/resources/6182CA1C8C9C6ED5BBB3076B522103070B37DDA4 line 1
  in sub MAIN at /Users/emiller/Code/rakudo/install/share/perl6/site/bin/zef line 2
  in block <unit> at /Users/emiller/Code/rakudo/install/share/perl6/site/bin/zef line 2

Any ideas?

HTTP::Server::Async!parse does not handle all legal header configurations.

The parse() method at line 120 (as of this writing) does not support all possible header formats.

It fails for repeated/duplicate headers and also for headers whose values are split across multiple lines. See HTTP spec, section 4.2..

The code my %h = @lines.map({ .split(':', 2).map({.trim}) }); is used to unpack headers.

Any lines with leading spaces need to be trimmed and concatenated with the preceding line. This should be doable with a boring-ish for loop and indexes. There may be a sexier perl6y way to do the same, but I don't know it.

As for duplicated headers, there are a number of choices, keep using a hash and make your code append rather than overwrite duplicate values. Also, you could make a hash-like type that handles these multiple values cases.

Furthermore, thanks for writing this.

HTTP::Response is not composable

Hi!

I get the following error when trying to use HTTP::Server::Async:

PERL6LIB=lib prove -v -r --exec=perl6 t/
t/01_request.t .................... ===SORRY!=== Error while compiling /home/bduggan/git/clones/perl6-http-server-async/lib/HTTP/Server/Async/Response.pm6
HTTP::Response is not composable, so HTTP::Server::Async::Response cannot compose it
at /home/bduggan/git/clones/perl6-http-server-async/lib/HTTP/Server/Async/Response.pm6:3
===SORRY!=== Error while compiling /home/bduggan/git/clones/perl6-http-server-async/lib/HTTP/Server/Async/Response.pm6
HTTP::Response is not composable, so HTTP::Server::Async::Response cannot compose it
at /home/bduggan/git/clones/perl6-http-server-async/lib/HTTP/Server/Async/Response.pm6:3
^C

Here are the versions I am using:

$ perl6 --version
This is Rakudo version 2015.12 built on MoarVM version 2015.12
implementing Perl 6.c.
$ uname -a
Linux minty 3.19.0-32-generic #37~14.04.1-Ubuntu SMP Thu Oct 22 09:41:40 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
$ panda info HTTP::Server
HTTP::Server (version 0.1)
role for HTTP::Server so we can have start building out some servers with interchangeable backends
State: installed as a dependency
Source-url: git://github.com/tony-o/perl6-http-server.git
Provides: HTTP::Request lib/HTTP/Request.pm6
HTTP::Response  lib/HTTP/Response.pm6
HTTP::Server    lib/HTTP/Server.pm6

Any advice about fixing this would be appreciated. Thanks!

Brian

Problems with examples

This happens when I try to run connection_hijack:

perl6 -Ilib -I../lib connection_hijack.pl6 
Type check failed in binding to parameter '$sub'; expected Callable but got Str ("HTTP::Server::Async:...)
  in method middleware at /home/jmerelo/Code/forks/perl6/perl6-http-server-async/examples/../lib/HTTP/Server/Async.pm6 (HTTP::Server::Async) line 26
  in block <unit> at connection_hijack.pl6 line 8

Failure to install HTTP::Server::Async via panda

I could not install HTTP::Server::Async because Pluggable installation failed on my development linux vm box. Any idea how to solve it?

azawawi@azawawi-vm:~/$ panda install Pluggable
==> Fetching Pluggable
==> Building Pluggable
Compiling lib/Pluggable.pm6 to mbc
===SORRY!===
Cannot call method 'match' on a null object
build stage failed for Pluggable: Failed building lib/Pluggable.pm6
  in method throw at /home/azawawi/.rakudobrew/moar-nom/install/share/perl6/runtime/CORE.setting.moarvm:1
  in method install at lib/Panda.pm:128
  in method resolve at lib/Panda.pm:218
  in sub MAIN at /home/azawawi/.rakudobrew/bin/../moar-nom/install/share/perl6/site/bin/panda:20
  in block <unit> at /home/azawawi/.rakudobrew/bin/../moar-nom/install/share/perl6/site/bin/panda:87


Failure Summary
----------------
Pluggable
    *build stage failed for Pluggable: Failed building lib/Pluggable.pm6

Crashes a few seconds after a handling a request

A couple of seconds after handling a request the server crashes with "Unhandled exception: cannot close a closed socket". This only happens if there's a break with no further requests after the last one. As long as requests come in frequently (tested with 1s intervals) it keeps running, so I suppose the problem is somewhere in the timeout/connection cleanup method: https://github.com/tony-o/perl6-http-server-async/blob/master/lib/HTTP/Server/Async.pm6#L30

Strange error when using with 'siege'

When running the ab.pl6 script and hitting it with

siege -c 32 http://localhost:1666

It periodically comes up with the following

No such method 'message' for invocant of type 'Block'
  in sub  at /home/jonathan/.rakudobrew/moar-nom/install/share/perl6/runtime/CORE.setting.moarvm line 1
  in method reset-time at /home/jonathan/devel/perl6/3rdparty-modules/perl6-http-server-async/lib/HTTP/Server/Async.pm6 (HTTP::Server::Async) line 44
  in block  at /home/jonathan/devel/perl6/3rdparty-modules/perl6-http-server-async/lib/HTTP/Server/Async.pm6 (HTTP::Server::Async) line 68

Which is odd as the only reason I can see that it would want a message is if it were treating something as an Exception but there's nothing in that piece of code that does anything like that.

I'll try and have a look at this a bit later.

Deprecation Warnings/Failing Tests

This is my attempt to install the module with rakudo brewed today:

==> Fetching HTTP::Server::Async
Use of uninitialized value %ENV of type Any in string context
Any of .^name, .perl, .gist, or .say can stringify undefined things, if needed.  in sub git-fetch at /home/zoffix/.rakudobrew/moar-nom/install/share/perl6/site/sources/A36DB4DD6E30E31F0409D703B4392DA5E8CE3A4E:46
==> Building HTTP::Server::Async
==> Testing HTTP::Server::Async
Use of uninitialized value %ENV of type Any in string context
Any of .^name, .perl, .gist, or .say can stringify undefined things, if needed.  in block  at /home/zoffix/.rakudobrew/moar-nom/install/share/perl6/site/sources/56A2FE43AE962A734AE0B520B19C164B5E28FEA3:84
Saw 1 occurrence of deprecated code.
================================================================================
Method bytes-supply (from IO::Socket::Async) seen at:
  /home/zoffix/.panda-work/1449849811_2/lib/HTTP/Server/Async.pm6, line 66
Please use Supply(:bin) instead.
--------------------------------------------------------------------------------
Please contact the author to have these occurrences of deprecated code
adapted, so that this message will disappear!
t/01_request.t .................... ok
Saw 1 occurrence of deprecated code.
================================================================================
Method bytes-supply (from IO::Socket::Async) seen at:
  /home/zoffix/.panda-work/1449849811_2/lib/HTTP/Server/Async.pm6, line 66
Please use Supply(:bin) instead.
--------------------------------------------------------------------------------
Please contact the author to have these occurrences of deprecated code
adapted, so that this message will disappear!
t/02_plugins.t .................... ok
Saw 1 occurrence of deprecated code.
================================================================================
Method bytes-supply (from IO::Socket::Async) seen at:
  /home/zoffix/.panda-work/1449849811_2/lib/HTTP/Server/Async.pm6, line 66
Please use Supply(:bin) instead.
--------------------------------------------------------------------------------
Please contact the author to have these occurrences of deprecated code
adapted, so that this message will disappear!
t/03_statuscode.t ................. ok
Saw 1 occurrence of deprecated code.
================================================================================
Method bytes-supply (from IO::Socket::Async) seen at:
  /home/zoffix/.panda-work/1449849811_2/lib/HTTP/Server/Async.pm6, line 66
Please use Supply(:bin) instead.
--------------------------------------------------------------------------------
Please contact the author to have these occurrences of deprecated code
adapted, so that this message will disappear!
t/04_unbuffered_laggy_response.t .. ok
Saw 1 occurrence of deprecated code.
================================================================================
Method bytes-supply (from IO::Socket::Async) seen at:
  /home/zoffix/.panda-work/1449849811_2/lib/HTTP/Server/Async.pm6, line 66
Please use Supply(:bin) instead.
--------------------------------------------------------------------------------
Please contact the author to have these occurrences of deprecated code
adapted, so that this message will disappear!
t/05_laggyrequest.t ............... ok
Saw 1 occurrence of deprecated code.
================================================================================
Method bytes-supply (from IO::Socket::Async) seen at:
  /home/zoffix/.panda-work/1449849811_2/lib/HTTP/Server/Async.pm6, line 66
Please use Supply(:bin) instead.
--------------------------------------------------------------------------------
Please contact the author to have these occurrences of deprecated code
adapted, so that this message will disappear!
t/06_responsetimeout.t ............ ok
Use of uninitialized value of type Any in string context
Any of .^name, .perl, .gist, or .say can stringify undefined things, if needed.  in block <unit> at t/07_chunkedrequestecho.t:34

# Failed test 'Test for chunked data echo'
# at t/07_chunkedrequestecho.t line 34
# Looks like you failed 1 test of 1
Saw 1 occurrence of deprecated code.
================================================================================
Method bytes-supply (from IO::Socket::Async) seen at:
  /home/zoffix/.panda-work/1449849811_2/lib/HTTP/Server/Async.pm6, line 66
Please use Supply(:bin) instead.
--------------------------------------------------------------------------------
Please contact the author to have these occurrences of deprecated code
adapted, so that this message will disappear!
t/07_chunkedrequestecho.t ......... 
Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/1 subtests 
Saw 1 occurrence of deprecated code.
================================================================================
Method bytes-supply (from IO::Socket::Async) seen at:
  /home/zoffix/.panda-work/1449849811_2/lib/HTTP/Server/Async.pm6, line 66
Please use Supply(:bin) instead.
--------------------------------------------------------------------------------
Please contact the author to have these occurrences of deprecated code
adapted, so that this message will disappear!
t/09_unbuffer.t ................... ok

Test Summary Report
-------------------
t/07_chunkedrequestecho.t       (Wstat: 256 Tests: 1 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
Files=8, Tests=28, 63 wallclock secs ( 0.05 usr  0.04 sys + 19.71 cusr  2.64 csys = 22.44 CPU)
Result: FAIL
The spawned process exited unsuccessfully (exit code: 1)
  in sub run-and-gather-output at /home/zoffix/.rakudobrew/moar-nom/install/share/perl6/site/sources/56A2FE43AE962A734AE0B520B19C164B5E28FEA3:86
  in block  at /home/zoffix/.rakudobrew/moar-nom/install/share/perl6/site/sources/DEA36F240F9EB48E53E0245E7F52235BB3F2AE3C:24
  in sub indir at /home/zoffix/.rakudobrew/moar-nom/install/share/perl6/site/sources/56A2FE43AE962A734AE0B520B19C164B5E28FEA3:20
  in method test at /home/zoffix/.rakudobrew/moar-nom/install/share/perl6/site/sources/DEA36F240F9EB48E53E0245E7F52235BB3F2AE3C:5
  in method install at /home/zoffix/.rakudobrew/moar-nom/install/share/perl6/site/sources/9ED824C21FB0C2E03DC7569DAC076B4CAB3A5D22:141
  in method resolve at /home/zoffix/.rakudobrew/moar-nom/install/share/perl6/site/sources/9ED824C21FB0C2E03DC7569DAC076B4CAB3A5D22:219
  in sub MAIN at /home/zoffix/.rakudobrew/moar-nom/install/share/perl6/site/resources/B6AC726E2BAB974F909C5195BA10F292EB162E4A:18
  in block <unit> at /home/zoffix/.rakudobrew/moar-nom/install/share/perl6/site/resources/B6AC726E2BAB974F909C5195BA10F292EB162E4A:150

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.