Git Product home page Git Product logo

net-xmpp's People

Contributors

dap avatar reatmon avatar szabgab avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

net-xmpp's Issues

XML/Stream.pm: Can't call method "can_read" on an undefined value

I get this when I try to install the module on Ubuntu 22.04 with cpanm:

Building and testing Net-XMPP-1.05
Building Net-XMPP
t/1_load.t ............... ok
t/2_client_jabberd1.4.t .. ok
t/3_client_jabberd2.t .... ok
Subroutine SASLAuth redefined at /usr/local/share/perl/5.34.0/XML/Stream.pm line 2184.
Can't call method "can_read" on an undefined value at /usr/local/share/perl/5.34.0/XML/Stream.pm line 1436.
# Looks like your test exited with 22 just after 6.
t/gtalk.t ................ 
Dubious, test returned 22 (wstat 5632, 0x1600)
Failed 26/32 subtests 
        (less 4 skipped subtests: 2 okay)
t/iq.t ................... ok
t/jid.t .................. ok
t/memory_cycle.t ......... skipped: Need Test::Memory::Cycle
t/memory_leak.t .......... skipped: Need Devel::LeakGuard::Object
t/message.t .............. ok
t/packet_iqauth.t ........ ok
t/packet_iqroster.t ...... ok
t/presence.t ............. ok
t/rawxml.t ............... ok
t/roster.t ............... ok
t/srv.t .................. ok

Test Summary Report
-------------------
t/gtalk.t              (Wstat: 5632 Tests: 6 Failed: 0)
  Non-zero exit status: 22
  Parse errors: Bad plan.  You planned 32 tests but ran 6.
Files=15, Tests=663,  6 wallclock secs ( 0.13 usr  0.02 sys +  3.07 cusr  0.41 csys =  3.63 CPU)
Result: FAIL
Failed 1/15 test programs. 0/663 subtests failed.
-> FAIL Installing Net::XMPP failed. See /root/.cpanm/work/1701656032.32541/build.log for details. Retry with --force to force install it.

Non-authorized error for jabber.ru and other servers using Digest-md5 sasl auth

SASL auth using method Digest-MD5 doesn't work because XML::Stream force to set "authname" field during SASL auth. For example on jabber.ru server, you will always get non-authorized error using standard examples/client.pl trying to connect to such server.

Here is the pull request which fixes the problem, without patching other modules: #19

ssl_params intermittently undefined

This is for perl-Net-XMPP-1.02-141.1.noarch on OpenSuSE 42.1, perl-5.18.2-5.1.x86_64.

For availability monitoring, I periodically have a test user log in to the XMPP server (Tigase) with 2 resources, and each runs the test client in the background, sends a message to the other, and checks if the expected message was received from the partner. About 10%-15% of the time the test fails. My workaround is to immediately repeat the test up to 10 times, and any success is scored as a non-failure.

I'm using a self-written test client, but closely related error messages are seen when I use sendxmpp. My client complains:
Use of uninitialized value $args{"file"} in lc at /usr/lib/perl5/vendor_perl/5.18.2/Net/XMPP/Debug.pm line 154.
Odd number of elements in anonymous hash at /usr/lib/perl5/vendor_perl/5.18.2/IO/Socket/SSL.pm line 1055, line 1.
Use of uninitialized value within @_ in anonymous hash ({}) at /usr/lib/perl5/vendor_perl/5.18.2/IO/Socket/SSL.pm line 1055, line 1.

The first one is duplicated exactly when sendxmpp fails. It occurs because a call (didn't find it) to Net::XMPP::Debug::Init() lacks the File=>"stdout" parameter, which looks like it should be optional and is the default. I was sure that the order of evaluating the two pop(@_) instances was nondeterministic, but fixing that didn't fix the actual symptom; nonetheless I left the more prolix fix in place.

--- /usr/lib/perl5/vendor_perl/5.18.2/Net/XMPP/Debug.pm.orig 2015-09-30 04:03:54.000000000 -0700
+++ /usr/lib/perl5/vendor_perl/5.18.2/Net/XMPP/Debug.pm 2017-01-12 11:45:30.635916391 -0800
@@ -148,10 +148,12 @@
{
my $self = shift;

  • my %args;
  • while($#_ >= 0) { $args{ lc pop(@) } = pop(@); }
  • delete($args{file}) if (lc($args{file}) eq "stdout");
  • my (%args, $key, $val);

  • while($#_ >= 0) {

  •   ($key, $val) = splice(@_, -2);
    
  •   $args{ lc($key) } = $val;
    
  • }

  • delete($args{file}) if (exists($args{file}) && lc($args{file}) eq "stdout");

    $args{time} = 0 if !exists($args{time});
    $args{setdefault} = 0 if !exists($args{setdefault});

The other two messages occur because Net::XMPP::Stream::TLSClientProceed() passes $self->{SIDS}->{$sid}->{ssl_params} as its second argument, this hash ref is undef at the time, and things go downhill from there. The following patch provides an empty hash in that case, and that shuts up the error messages, but evidently some ssl_params are mandatory, likely CA_path at least, and the program just hangs until the test script times out and kills it. I have no idea why ssl_params is being destroyed (or maybe was never created, not likely). In quite a number of tests only one of the testers gets the failure and there are enough trials that double failures should have been seen if independent. Remember that two independent processes are running, and with the unlikely feature of a global TLS cache, one has to finish before the other, which would explain the symptom.

--- /usr/lib/perl5/vendor_perl/5.18.2/IO/Socket/SSL.pm.orig 2015-10-03 06:24:34.000000000 -0700
+++ /usr/lib/perl5/vendor_perl/5.18.2/IO/Socket/SSL.pm 2017-01-12 12:25:14.720858994 -0800
@@ -1052,7 +1052,7 @@
sub start_SSL {
my ($class,$socket) = (shift,shift);
return $class->error("Not a socket") unless(ref($socket));

  • my $arg_hash = (ref($[0]) eq 'HASH') ? $[0] : {@_};
  • my $arg_hash = (ref($[0]) eq 'HASH') ? $[0] : defined($[0]) ? {@} : { };
    my %to = exists $arg_hash->{Timeout} ? ( Timeout => delete $arg_hash->{Timeout} ) :();
    my $original_class = ref($socket);
    my $original_fileno = (UNIVERSAL::can($socket, "fileno"))

I'm attaching the test client, and the calling script (named tigase after the service being tested). The latter depends on a fair amount of infrastructure and common code, and I don't think it's going to be practical for the maintainer to duplicate that (where are you going to get the Wanted Services Report?) Probably the best strategy is to extract a minimal subset and use that to debug. Yuck, github won't accept arbitrary files, so I've renamed both of them to *.txt .

xmppclient.pl.txt
tigase.txt

I'm sure that nothing was ever wrong with Tigase, and it will fail equally with any kind of XMPP server, but I haven't proved that by testing.

t/gtalk.t fails tests under network-sandboxing

When t/gtalk.t can't connect to the internet, it fails.

The other tests gracefully handle themselves if online() returns false.

t/gtalk.t ................ 
1..32
Subroutine SASLAuth redefined at /usr/lib64/perl5/vendor_perl/5.22.1/XML/Stream.pm line 2184.
ok 1 - An object of class 'Net::XMPP::Client' isa 'Net::XMPP::Client'
ok 2 # skip Needs Test::Memory::Cycle
ok 3 # skip need GTALK0 = username:password
ok 4 - An object of class 'Net::XMPP::Client' isa 'Net::XMPP::Client'
ok 5 # skip Needs Test::Memory::Cycle
ok 6 # skip need GTALK1 = username:password
Can't call method "can_read" on an undefined value at /usr/lib64/perl5/vendor_perl/5.22.1/XML/Stream.pm line 1436.
# Looks like you planned 32 tests but ran 6.
# Looks like your test exited with 22 just after 6.
Dubious, test returned 22 (wstat 5632, 0x1600)
Failed 26/32 subtests 
    (less 4 skipped subtests: 2 okay)

The tests however pass if the network-killzone is lifted:

t/gtalk.t ................ 
1..32
Subroutine SASLAuth redefined at /usr/lib64/perl5/vendor_perl/5.22.1/XML/Stream.pm line 2184.
ok 1 - An object of class 'Net::XMPP::Client' isa 'Net::XMPP::Client'
ok 2 # skip Needs Test::Memory::Cycle
ok 3 # skip need GTALK0 = username:password
ok 4 - An object of class 'Net::XMPP::Client' isa 'Net::XMPP::Client'
ok 5 # skip Needs Test::Memory::Cycle
ok 6 # skip need GTALK1 = username:password
ok 7 - An object of class 'Net::XMPP::Client' isa 'Net::XMPP::Client'
ok 8 # skip Needs Test::Memory::Cycle
ok 9 # skip need GTALK0 = username:password
ok 10 - An object of class 'Net::XMPP::Client' isa 'Net::XMPP::Client'
ok 11 # skip Needs Test::Memory::Cycle
ok 12 # skip need GTALK1 = username:password
ok 13 - An object of class 'Net::XMPP::Client' isa 'Net::XMPP::Client'
ok 14 # skip Needs Test::Memory::Cycle
ok 15 # skip need GTALK0 = username:password
ok 16 - An object of class 'Net::XMPP::Client' isa 'Net::XMPP::Client'
ok 17 # skip Needs Test::Memory::Cycle
ok 18 # skip need GTALK1 = username:password
ok 19 - An object of class 'Net::XMPP::Client' isa 'Net::XMPP::Client'
ok 20 # skip Needs Test::Memory::Cycle
ok 21 # skip need GTALK0 = username:password
ok 22 - An object of class 'Net::XMPP::Client' isa 'Net::XMPP::Client'
ok 23 # skip Needs Test::Memory::Cycle
ok 24 # skip need GTALK1 = username:password
ok 25 - An object of class 'Net::XMPP::Client' isa 'Net::XMPP::Client'
ok 26 # skip Needs Test::Memory::Cycle
ok 27 # skip need GTALK0 = username:password
ok 28 - An object of class 'Net::XMPP::Client' isa 'Net::XMPP::Client'
ok 29 # skip Needs Test::Memory::Cycle
ok 30 # skip need GTALK1 = username:password
Use of uninitialized value $mem1 in subtraction (-) at t/gtalk.t line 119.
Use of uninitialized value $mem_last in subtraction (-) at t/gtalk.t line 119.
# Memory change: 0
ok 31 - expected 0 memory growth # TODO Memory leak or expectations being to high?
Use of uninitialized value $mem1 in addition (+) at t/gtalk.t line 124.
Use of uninitialized value $got in numeric lt (<) at (eval in cmp_ok) t/gtalk.t line 124.
ok 32 - does not leak much
ok

Example from examples/client.pl does not properly report connecntion to tls-only server

When I am trying to connect by examples/client.pl to tls-only server it does not print proper error text

my $status = $Connection->Connect(hostname=>$server,
port=>$port);

if (!(defined($status)))
{
print "ERROR: Jabber server is down or connection was not allowed.\n";
print " ($!)\n";
exit(0);
}

it sais

ERROR: Jabber server is down or connection was not allowed.
()

You should either change $! to $Connection-&gt;GetErrorCode() or change behavior of SetErrorCode so it also put error code to $!

$Roster = $Connection->Roster(); and RosterGet does not work properly together

I am trying to use Net::XMPP to get buddy list from a server and I have some
problems.

I wanted to get user list from my old jabber server, so I took an example
client.pl removed all unnecessary things and added

my $Roster = $Connection->Roster();

right after authorization. See the code at the end of thi report

Documentation says that thus Roster object will catch all incoming iq files and
I will get full roaster at the end.

But this is not what happened. I get only a few iq that came after I set my
presence. The main part of roster xml can be seen in a log but not processed
by $Roster object for some reason.

I've dug into problem and found out that if I replace RosterGet with
RosterRequest everything starts working well.

This happens because of the conflict of reply catcher. $Connection->Roster()
catches roster items via SetXPathCallBacks

But if I send roster request with RosterGet, it will send request with
specified ID, and reply catcher would be catching this reply.

And it would catch this reply before SetXPathCallBacks would be able to try to
catch it. So there would be no roster in $Roster, through we actually got
necessary data via net.

This was really confusing.

May be this is an expected behavior, I do not completely understand the
philosophy of Net::XMPP. But I doubt it.

May be something should be fixed on code or/and documentation. But I do not
understand in what direction this fix should go.

May be you have an Idea what to do with this.

#!/usr/bin/perl

use Net::XMPP;
use strict;

my $server = "irrc.ru";
my $port = 5222;
my $username = "shaplov";
my $password = "*********";
my $resource = "scrtipt2";


my $Connection = new Net::XMPP::Client(
 debuglevel=>1, debugfile=>"$0.debug.out", debuftime=>1
);

my $status = $Connection->Connect(
                                   tls =>1,
                                   hostname=>$server,
                                   port=>$port
                                  );

if ($status != 1)
{
    print "ERROR:  Jabber server is down or connection was not allowed.\n";
    print "        ($!)\n";
    print $Connection->GetErrorCode();
    exit(0);
}

my @result = $Connection->AuthSend(username=>$username,
                                   password=>$password,
                                   resource=>$resource);

if ($result[0] ne "ok")
{
    print "ERROR: Authorization failed: $result[0] - $result[1]\n";
    exit(0);
}

print "Logged in to $server:$port...\n";

my $Roster = $Connection->Roster();

###############################################
#
# FIXME if one change RosterRequest to RosterGet, script will not print compleat buddy list
#
################################################

#$Connection->RosterGet();
$Connection->RosterRequest();

$Connection->PresenceSend();

my $count = 0;
while(defined($Connection->Process(1)))
{
  print ".";
  $count ++;
  last if $count >20;
}
print "\n";

foreach my $JID ($Roster->jids())
{
  print $JID->GetJID("base"), "\n";
}

Tests fail - gtalk "does not leak much" - Mac, Perl 5.24.0, OS X 10.11.5

I'm getting the following error (even after applying my leak fix PR - #12

I'm at a loss as to the cause. I'm glad to do any debugging that you might suggestion.

#   Failed test 'does not leak much'
#   at t/gtalk.t line 119.
#     '29416'
#         <
#     '26096'
# Leak: 3480

Environment:

Summary of my perl5 (revision 5 version 24 subversion 0) configuration:

  Platform:
    osname=darwin, osvers=15.5.0, archname=darwin-2level
    uname='darwin jmaslakpro.local 15.5.0 darwin kernel version 15.5.0: tue apr 19 18:36:36 pdt 2016; root:xnu-3248.50.21~8release_x86_64 x86_64 '
    config_args='-de -Dprefix=/Users/jmaslak/perl5/perlbrew/perls/perl-5.24.0 -Aeval:scriptdir=/Users/jmaslak/perl5/perlbrew/perls/perl-5.24.0/bin'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=undef, usemultiplicity=undef
    use64bitint=define, use64bitall=define, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags ='-fno-common -DPERL_DARWIN -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include',
    optimize='-O3',
    cppflags='-fno-common -DPERL_DARWIN -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include'
    ccversion='', gccversion='4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)', gccosandvers=''
    intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678, doublekind=3
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16, longdblkind=3
    ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='env MACOSX_DEPLOYMENT_TARGET=10.3 cc', ldflags =' -fstack-protector-strong -L/usr/local/lib'
    libpth=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.3.0/lib /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/lib /usr/local/lib /usr/lib
    libs=-lpthread -ldbm -ldl -lm -lutil -lc
    perllibs=-lpthread -ldl -lm -lutil -lc
    libc=, so=dylib, useshrplib=false, libperl=libperl.a
    gnulibc_version=''
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=bundle, d_dlsymun=undef, ccdlflags=' '
    cccdlflags=' ', lddlflags=' -bundle -undefined dynamic_lookup -L/usr/local/lib -fstack-protector-strong'


Characteristics of this binary (from libperl):
  Compile-time options: HAS_TIMES PERLIO_LAYERS PERL_COPY_ON_WRITE
                        PERL_DONT_CREATE_GVSV
                        PERL_HASH_FUNC_ONE_AT_A_TIME_HARD PERL_MALLOC_WRAP
                        PERL_PRESERVE_IVUV USE_64_BIT_ALL USE_64_BIT_INT
                        USE_LARGE_FILES USE_LOCALE USE_LOCALE_COLLATE
                        USE_LOCALE_CTYPE USE_LOCALE_NUMERIC USE_LOCALE_TIME
                        USE_PERLIO USE_PERL_ATOF
  Locally applied patches:
        Devel::PatchPerl 1.38
  Built under darwin
  Compiled at Jun 16 2016 18:55:47
  %ENV:
    PERLBREW_BASHRC_VERSION="0.75"
    PERLBREW_HOME="/Users/jmaslak/.perlbrew"
    PERLBREW_MANPATH="/Users/jmaslak/perl5/perlbrew/perls/perl-5.24.0/man"
    PERLBREW_PATH="/Users/jmaslak/perl5/perlbrew/bin:/Users/jmaslak/perl5/perlbrew/perls/perl-5.24.0/bin"
    PERLBREW_PERL="perl-5.24.0"
    PERLBREW_ROOT="/Users/jmaslak/perl5/perlbrew"
    PERLBREW_VERSION="0.75"
  @INC:
    /Users/jmaslak/perl5/perlbrew/perls/perl-5.24.0/lib/site_perl/5.24.0/darwin-2level
    /Users/jmaslak/perl5/perlbrew/perls/perl-5.24.0/lib/site_perl/5.24.0
    /Users/jmaslak/perl5/perlbrew/perls/perl-5.24.0/lib/5.24.0/darwin-2level
    /Users/jmaslak/perl5/perlbrew/perls/perl-5.24.0/lib/5.24.0
    .

Use of uninitialized value in ...

Here I try to connect to server with self signed certificate.

HIXMPP::Conn: AuthIQAuth: old school auth
XMPP::Conn: SendAndReceiveWithID: object(Net::Jabber::IQ=HASH(0x2a01238))
XMPP::Conn: SendWithID: id(netjabber-0)
XMPP::Conn: SendWithID: in(<iq type='get'><query xmlns='jabber:iq:auth'><username>feelsafe</username></query></iq>)
XMPP::Conn: RegisterID: tag(iq) id(netjabber-0)
XMPP::Conn: SendWithID: out(<iq id='netjabber-0' type='get'><query xmlns='jabber:iq:auth'><username>feelsafe</username></query></iq>)
XMPP::Conn: SendXML: sent(<iq id='netjabber-0' type='get'><query xmlns='jabber:iq:auth'><username>feelsafe</username></query></iq>)
XML::Stream: IgnoreActivity: ignoreActivity(0)
Use of uninitialized value $sid in concatenation (.) or string at local/lib/perl5/XML/Stream.pm line 2735.
XML::Stream: IgnoreActivity: sid()
Use of uninitialized value $sid in hash element at local/lib/perl5/XML/Stream.pm line 2737.
XML::Stream: Send: (<iq id='netjabber-0' type='get'><query xmlns='jabber:iq:auth'><username>feelsafe</username></query></iq>)
Use of uninitialized value $sid in concatenation (.) or string at local/lib/perl5/XML/Stream.pm line 1668.
XML::Stream: Send: sid()
Use of uninitialized value $sid in hash element at local/lib/perl5/XML/Stream.pm line 1669.
Use of uninitialized value in concatenation (.) or string at local/lib/perl5/XML/Stream.pm line 1669.
XML::Stream: Send: status()
Use of uninitialized value $sid in hash element at local/lib/perl5/XML/Stream.pm line 1671.
Use of uninitialized value $sid in hash element at local/lib/perl5/XML/Stream.pm line 1673.
Use of uninitialized value in numeric eq (==) at local/lib/perl5/XML/Stream.pm line 1673.
Use of uninitialized value $sid in hash element at local/lib/perl5/XML/Stream.pm line 1675.
XML::Stream: Send: socket not defined
Use of uninitialized value $sid in hash element at local/lib/perl5/XML/Stream.pm line 1678.
Use of uninitialized value $sid in hash element at local/lib/perl5/XML/Stream.pm line 2615.
XML::Stream: IgnoreActivity: ignoreActivity(0)
Use of uninitialized value $sid in concatenation (.) or string at local/lib/perl5/XML/Stream.pm line 2735.
XML::Stream: IgnoreActivity: sid()
Use of uninitialized value $sid in hash element at local/lib/perl5/XML/Stream.pm line 2737.
XMPP::Conn: SendAndReceiveWithID: sent with id(netjabber-0)
XMPP::Conn: WaitForID: id(netjabber-0)
XMPP::Conn: ReceivedID: id(netjabber-0)
XMPP::Conn: ReceivedID: nope...
XMPP::Conn: WaitForID: haven't gotten it yet... let's wait for more packets
XMPP::Conn: Process: timeout(1)
XML::Stream: Process: timeout(1)
XML::Stream: Process: initialize sid(73poy71v96) status to 0
XML::Stream: Process: initialize sid() status to 0
XML::Stream: Process: let's wait for data
XML::Stream: Process: connection(IO::Socket::INET=GLOB(0x1c391e0))
XML::Stream: Process: sid(newconnection)
Use of uninitialized value in concatenation (.) or string at local/lib/perl5/XML/Stream.pm line 1440.
XML::Stream: Process: connection_status()
Use of uninitialized value in numeric eq (==) at local/lib/perl5/XML/Stream.pm line 1443.
XML::Stream: Process: timeout(1)
XML::Stream: Process: check for keepalives
Use of uninitialized value within %status in numeric eq (==) at local/lib/perl5/XML/Stream.pm line 1506.
Use of uninitialized value in subtraction (-) at local/lib/perl5/XML/Stream.pm line 1507.
XML::Stream: IgnoreActivity: ignoreActivity(1)
XML::Stream: IgnoreActivity: sid(newconnection)
XML::Stream: Send: ( )
XML::Stream: Send: sid(newconnection)
Use of uninitialized value in concatenation (.) or string at local/lib/perl5/XML/Stream.pm line 1669.
XML::Stream: Send: status()
Use of uninitialized value in numeric eq (==) at local/lib/perl5/XML/Stream.pm line 1673.
XML::Stream: Send: socket not defined
XML::Stream: Process: Keep-Alive failed.  What the hell happened?!?!
XML::Stream: Process: connection_status(-1)
XML::Stream: IgnoreActivity: ignoreActivity(0)
XML::Stream: IgnoreActivity: sid(newconnection)
XML::Stream: Process: check for timeouts
XML::Stream: Process: sid(73poy71v96) time( 1542731008 ) timeout(undef)
XML::Stream: Process: sid(newconnection) time( 1542731008 ) timeout(undef)
XML::Stream: Process: sid() time( 1542731008 ) timeout(undef)
XML::Stream: Process: sid(newconnection) is broken... let's tell someone and watch it hit the fan... =)
XML::Stream: Process: block(0)
Use of uninitialized value in hash element at local/lib/perl5/Net/XMPP/Connection.pm line 433.
Use of uninitialized value in hash element at local/lib/perl5/Net/XMPP/Connection.pm line 440.
XMPP::Conn: ReceivedID: id(netjabber-0)
XMPP::Conn: ReceivedID: nope...
XMPP::Conn: WaitForID: haven't gotten it yet... let's wait for more packets
XMPP::Conn: Process: timeout(1)

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.