Giter VIP home page Giter VIP logo

tarantula's Introduction

Tarantula

DESCRIPTION

Tarantula is a big fuzzy spider. It crawls your Rails 2.3 and 3.x applications, fuzzing data to see what breaks.

<img src=“https://secure.travis-ci.org/relevance/tarantula.png” />

Usage

Installation

The latest and greatest version is always available on GitHub. (See the rakefile for dependencies, or just let RubyGems handle it). Add it to your Gemfile as normal:

gem "tarantula"

Or for Rails 3 applications:

gem 'tarantula', :require => 'tarantula-rails3'

Crawling Your App

Use the included rake task to create a Rails integration test that will allow Tarantula to crawl your app.

$ rake tarantula:setup

Take a moment to familiarize yourself with the generated test. If parts of your application require login, update the test to make sure Tarantula can access those parts of your app.

require "relevance/tarantula"
require "test_helper"

class TarantulaTest < ActionController::IntegrationTest
  # Load enough test data to ensure that there's a link to every page in your
  # application. Doing so allows Tarantula to follow those links and crawl
  # every page.  For many applications, you can load a decent data set by
  # loading all fixtures.
  fixtures :all

  def test_tarantula
    # If your application requires users to log in before accessing certain
    # pages, uncomment the lines below and update them to allow this test to
    # log in to your application.  Doing so allows Tarantula to crawl the
    # pages that are only accessible to logged-in users.
    #
    #   post '/session', :login => 'quentin', :password => 'monkey'
    #   follow_redirect!

    tarantula_crawl(self)
  end
end

If you want to set custom options, you can get access to the crawler and set properties before running it. For example, this would turn on HTMLTidy.

def test_tarantula
  post '/session', :login => 'kilgore', :password => 'trout'
  assert_response :redirect
  assert_redirected_to '/'
  follow_redirect!

  t = tarantula_crawler(self)
  t.handlers << Relevance::Tarantula::TidyHandler.new
  t.crawl '/'
end

Now it’s time to turn Tarantula loose on your app. Assuming your project is at /work/project/:

$ cd /work/project
$ rake tarantula:test

Verbose Mode

If you run the test using the steps shown above, Tarantula will produce a report in tmp/tarantula. You can also set VERBOSE=true to see more detail as the test runs.

For more options, please see the test suite.

Allowed Errors

If, for example, a 404 is an appropriate response for some URLs, you can tell Tarantula to allow 404s for URLs matching a given regex:

t = tarantula_crawler(self)
t.allow_404_for %r{/users/\d+/}

Testing for Common Attacks

You can specify the attack strings that Tarantula throws at your application.

def test_tarantula
  t = tarantula_crawler(self)

  Relevance::Tarantula::FormSubmission.attacks << { 
    :name => :xss,
    :input => "<script>gotcha!</script>",
    :output => "<script>gotcha!</script>",
  }

  Relevance::Tarantula::FormSubmission.attacks << { 
    :name => :sql_injection,
    :input => "a'; DROP TABLE posts;",
  }

  t.handlers << Relevance::Tarantula::AttackHandler.new
  t.times_to_crawl = 2
  t.crawl "/posts"
end

This example adds custom attacks for both SQL injection and XSS. It also tells Tarantula to crawl the app 2 times. This is important for XSS attacks because the results won’t appear until the second time Tarantula performs the crawl.

Timeout

You can specify a timeout for each specific crawl that Tarantula runs. For example:

def test_tarantula
  t = tarantula_crawler(self)
  t.times_to_crawl = 2
  t.crawl_timeout = 5.minutes
  t.crawl "/"
end

The above will crawl your app twice, and each specific crawl will timeout if it takes longer then 5 minutes. You may need a timeout to keep the tarantula test time reasonable if your app is large or just happens to have a large amount of ‘never-ending’ links, such as with an any sort of “auto-admin” interface.

Bugs/Requests

Please submit your bug reports, patches, or feature requests in Github Issues.

License

Tarantula is released under the MIT license.

tarantula's People

Contributors

abedra avatar cldwalker avatar codez avatar gdagley avatar glv avatar jasonrudolph avatar ldenman avatar muness avatar nashby avatar rsanheim avatar spicycode avatar stuarthalloway avatar sumbach avatar szimek avatar

Stargazers

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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  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

tarantula's Issues

Don't know how to build task 'tarantula:setup'

Getting this error when running rake tarantula:setup --trace

➜  compliance_chimp git:(tarantula) ✗ rake tarantula:setup --trace
rake aborted!
Don't know how to build task 'tarantula:setup'
/Users/akshatpradhan/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib/rake/task_manager.rb:62:in `[]'
/Users/akshatpradhan/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib/rake/application.rb:149:in `invoke_task'
/Users/akshatpradhan/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib/rake/application.rb:106:in `block (2 levels) in top_level'
/Users/akshatpradhan/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib/rake/application.rb:106:in `each'
/Users/akshatpradhan/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib/rake/application.rb:106:in `block in top_level'
/Users/akshatpradhan/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib/rake/application.rb:115:in `run_with_threads'
/Users/akshatpradhan/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib/rake/application.rb:100:in `top_level'
/Users/akshatpradhan/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib/rake/application.rb:78:in `block in run'
/Users/akshatpradhan/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib/rake/application.rb:176:in `standard_exception_handling'
/Users/akshatpradhan/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rake-10.3.2/lib/rake/application.rb:75:in `run'
./bin/rake:4:in `<main>'

Could not run rake tarantula:setup

Could not use tarantula following the instructions in the github main page.

Here are the steps I followed. When trying to run rake tarantula:setup I get a rake aborted.

$ gem install tarantula
Fetching: htmlentities-4.3.1.gem (100%)
Fetching: hpricot-0.8.6.gem (100%)
Building native extensions. This could take a while...
Fetching: tarantula-0.4.1.gem (100%)
Successfully installed htmlentities-4.3.1
Successfully installed hpricot-0.8.6
Successfully installed tarantula-0.4.1
3 gems installed
Installing ri documentation for htmlentities-4.3.1...
Installing ri documentation for hpricot-0.8.6...
Installing ri documentation for tarantula-0.4.1...
Installing RDoc documentation for htmlentities-4.3.1...
Installing RDoc documentation for hpricot-0.8.6...
Installing RDoc documentation for tarantula-0.4.1...

$ #!sh

$ rake tarantula:setup --trace
rake aborted!
Don't know how to build task 'tarantula:setup'
/Users/sarah/.rvm/gems/ruby-1.9.2-p290@cw/gems/rake-0.9.2.2/lib/rake/task_manager.rb:49:in []' /Users/sarah/.rvm/gems/ruby-1.9.2-p290@cw/gems/rake-0.9.2.2/lib/rake/application.rb:115:ininvoke_task'
/Users/sarah/.rvm/gems/ruby-1.9.2-p290@cw/gems/rake-0.9.2.2/lib/rake/application.rb:94:in block (2 levels) in top_level' /Users/sarah/.rvm/gems/ruby-1.9.2-p290@cw/gems/rake-0.9.2.2/lib/rake/application.rb:94:ineach'
/Users/sarah/.rvm/gems/ruby-1.9.2-p290@cw/gems/rake-0.9.2.2/lib/rake/application.rb:94:in block in top_level' /Users/sarah/.rvm/gems/ruby-1.9.2-p290@cw/gems/rake-0.9.2.2/lib/rake/application.rb:133:instandard_exception_handling'
/Users/sarah/.rvm/gems/ruby-1.9.2-p290@cw/gems/rake-0.9.2.2/lib/rake/application.rb:88:in top_level' /Users/sarah/.rvm/gems/ruby-1.9.2-p290@cw/gems/rake-0.9.2.2/lib/rake/application.rb:66:inblock in run'
/Users/sarah/.rvm/gems/ruby-1.9.2-p290@cw/gems/rake-0.9.2.2/lib/rake/application.rb:133:in standard_exception_handling' /Users/sarah/.rvm/gems/ruby-1.9.2-p290@cw/gems/rake-0.9.2.2/lib/rake/application.rb:63:inrun'
/Users/sarah/.rvm/gems/ruby-1.9.2-p290@cw/gems/rake-0.9.2.2/bin/rake:33:in <top (required)>' /Users/sarah/.rvm/gems/ruby-1.9.2-p290@cw/bin/rake:19:inload'
/Users/sarah/.rvm/gems/ruby-1.9.2-p290@cw/bin/rake:19:in `

'

Tarantula - Redmine Integration

Is any way, to integrate tarantura with redmine in a "easy" mode without include too much coding?

Anybody did it?

In case false. How i can integrate tarantura with redmine? Where i must start reading?

Thanks!

Move rake tasks into gem lib directory

Rather than have to vendor the gem to get access to the rake tasks, I wonder if you might follow a pattern I've seen with other gems (delayed_job and thinking_sphinx, specifically). They have the actual rake tasks inside of a directory underneath lib, so that they're available once the gem has been loaded. There is still a tasks file in the root of the gem directory, but that file simply loads the tasks definition from the lib directory. With the rake tasks loaded, our application can then "require" them, without having to separately load a file containing those tasks.

Something to consider. Vendoring the gem isn't ideal because it is so easy to update the gem but then not update the vendored version. The approach that delayed_job and thinking_sphinx took avoids that issue.

rake tarantula:setup fails, rails 3.1 application

Added gem "tarantula" to the development group in gem file and the gem has installed with bundle install.

Running rake tarantula:setup gives the error "Don't know how to build task 'tarantula:test'"

Unify FormSubmission and AttackFormSubmission

These two classes are an embarrassment of duplicated code. The default fuzzing strategy implemented in FormSubmission should be implemented as (say) BasicAttackHandler, and AttackFormSubmission should be renamed to FormSubmission with BasicAttachHandler included by default in the set of attacks.

(As part of this, the distinction between fuzzers and attacks can be eliminated in Crawler; a fuzzer is an attack, and the artificial distinction is confusing. Note that this will be an incompatible change, because the distinction is exposed in test cases. But it's still the right thing to do.)

Tarantula deletes records and then complains about 404s when trying to access those records

Tarantula is complaining about 404 errors in a vanilla application built using Rails scaffolding for a single ActiveRecord model. It appears that Tarantula is performing actions an incorrect order. It appears that Tarantula is first deleting a record and then attempting to access the ’show’ page for that record. The application correctly responds with a 404 error (since the record no longer exists), but Tarantula reports the 404 error as a test failure.

Compare this behavior to the way a user would interact with the app via a browser: Once a user deletes a record, the app redisplays the index page and does not show a link to the deleted record. Therefore, there’s no link that the user could follow to produce a 404 error.

How to Repeat

  1. Create a simple scaffolded Rails app (like the one attached to this ticket).
  2. Generate the default Tarantula test (using rake tarantula:setup)
  3. Run the Tarantula test
  4. Observe test failure

Test Output

  [store] rake tarantula:test VERBOSE=true
  Loaded suite /Users/jason/.gem/ruby/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader
  Started
  Response 200 for <Relevance::Tarantula::Link href=/, method=get>
  ...
  Response 302 for <Relevance::Tarantula::Link href=/products/996332877, method=delete>
  Response 404 for <Relevance::Tarantula::Link href=/products/996332877/edit, method=get>
  Response 404 for <Relevance::Tarantula::Link href=/products/996332877, method=get>
  Response 302 for <Relevance::Tarantula::Link href=/products/953125641, method=delete>
  Response 404 for <Relevance::Tarantula::Link href=/products/953125641/edit, method=get>
  Response 404 for <Relevance::Tarantula::Link href=/products/953125641, method=get>
  Response 302 for /products post {"commit"=>-2303, "product[price]"=>-3795, "product[name]"=>-4472}
  ...
  ****** FAILURES
  404: /products/996332877/edit
  404: /products/996332877
  404: /products/953125641/edit
  404: /products/953125641
  E
  Finished in 1.266037 seconds.

original LH ticket

This ticket has 1 attachment(s).

Removal of String.chars method

I ran into problems the other day where some of my tests began failing due to a missing String.chars method, which I ended up tracing back to lib/relevance/core_extensions/string_chars_fix.rb. From the comment in the file, I gather that there was some sort of bad interaction with rails 2.0.2, but I'm not sure what. Removing this file from the tarantula "requires" fixed my immediate problem and I didn't see any problems in the tarantula run, so I was curious what the actual problem was that it was supposed to fix. In any case, un-defining a core Ruby method seems like a pretty blunt way to fix a bug.

I'm running ruby 1.8.7 patch 249 with rails 2.3.8.

Crawler skip_uri_patterns is incomplete

I was using tarantula and noticed that it was trying to crawl a "tel:" link, ultimately failing because the path of the parsed URI was nil. I looked into it and saw that a simple fix would be to add tel to the skip_uri_patterns list in Crawler's initialize function. However, the crawler would have the same issue with other URI schemes that aren't listed in skip_uri_patterns, so it seems like a more general approach may be better. Do you think it would make more sense to skip URIs that start with any scheme name, or is there a reason you specifically chose to only skip the javascript, mailto, and http schemes?

The README is out of date

README refers to a lighthouse account which doesn't exist and a RunCodeRun page which doesn't exist.

While executing rake chores:tarantula:test,following errors throws

/home/dhibika/ruby/1.8/gems/activesupport-3.1.1/lib/active_support/dependencies.rb:240:in `require': no such file to load -- action_controller/integration (LoadError)
    from /home/dhibika/ruby/1.8/gems/activesupport-3.1.1/lib/active_support/dependencies.rb:240:in `require'
    from /home/dhibika/ruby/1.8/gems/activesupport-3.1.1/lib/active_support/dependencies.rb:225:in `load_dependency'
    from /home/dhibika/ruby/1.8/gems/activesupport-3.1.1/lib/active_support/dependencies.rb:240:in `require'
    from /home/dhibika/projects/rails3/chorepay/config/environment.rb:6
    from /home/dhibika/projects/rails3/chorepay/test/tarantula/../test_helper.rb:2:in `require'
    from /home/dhibika/projects/rails3/chorepay/test/tarantula/../test_helper.rb:2
    from /home/dhibika/projects/rails3/chorepay/test/tarantula/tarantula_test.rb:1:in `require'
    from /home/dhibika/projects/rails3/chorepay/test/tarantula/tarantula_test.rb:1
    from /home/dhibika/ruby/1.8/gems/rake-0.9.2.2/lib/rake/rake_test_loader.rb:10:in `require'
    from /home/dhibika/ruby/1.8/gems/rake-0.9.2.2/lib/rake/rake_test_loader.rb:10
    from /home/dhibika/ruby/1.8/gems/rake-0.9.2.2/lib/rake/rake_test_loader.rb:9:in `each'
    from /home/dhibika/ruby/1.8/gems/rake-0.9.2.2/lib/rake/rake_test_loader.rb:9
    from /home/dhibika/ruby/1.8/gems/rake-0.9.2.2/lib/rake/rake_test_loader.rb:4:in `select'
    from /home/dhibika/ruby/1.8/gems/rake-0.9.2.2/lib/rake/rake_test_loader.rb:4
rake aborted!
Command failed with status (1): [/usr/bin/ruby1.8 -I"lib:test" -I"/home/dhi...]

Tasks: TOP => tarantula_test
(See full trace by running task with --trace)

undefined method `fixtures' for TarantulaTest:Class

I am trying to setup Tarantula in a Rails 3.1.3 project. like this:

group :development, :test do
 ...
  gem 'tarantula', :require => 'tarantula-rails3'
end

Initially I found an error where the Tarantula rake file would not work due to a missing:

require 'rake/testtask'

... so I copied the contents of the rake file and made my own local rake task adding the require but now I get this error on the generated test, so I better ask!

tarantula_test.rb:9:in `<class:TarantulaTest>': undefined method `fixtures' for TarantulaTest:Class (NoMethodError)

Thanks,
Alex Escalante

Add support for favicon.ico

Retrieving /favicon.ico always yields a 404, even though the file exists in the public dir. The file (and all files with the .ico extension) should be supported in the same way as other image and text formats.

(I sent a pull request w/ a patch for this a few minutes ago).

Add basic support for detecting coverage regressions

We just encountered a case where a change to the app's code caused a lot of the app to be closed off to Tarantula; given the privileges with which it was logging in for the crawl, it suddenly could only see about 20% of the app. I happened to notice, but it would've been easy to miss. Tarantula needs to help detect that case.

The "right way" to do this is by integrating rcov and reporting the percentage of code covered by the crawl (and optionally failing the build when coverage is too low). But that would also slow down the crawl a lot, so a simpler alternative should also be provided. We should be able to tell Tarantula "expect to crawl at least n pages" and have Tarantula fail the build if fewer pages are found (and also prompt users to raise the threshold when the actual number is too far above that number).

need to do 'touch MIT-LICENSE'?

[komar@pavilion ~/src/tarantula]$ gem build tarantula.gemspec
WARNING: RDoc will not be generated (has_rdoc == false)
ERROR: While executing gem ... (Errno::ENOENT)
No such file or directory - MIT-LICENSE

Move link and form processing into Link and AttackFormSubmission classes

Many of the things we'd like to improve about Tarantula (including #3) would be easier if Tarantula's domain model were smarter. Link and AttackFormSubmission are currently dumb classes; Crawler is responsible for following links as well as doing all the fuzzing and submission of forms. Making Link and AttackFormSubmission smarter is the first step toward unifying links and forms into a single queue, which will make all kinds of fixes and enhancements easier.

rake tarantula:report does not open HTML report when a test fails

"rake tarantula:report" only opens the HTML report if all Tarantula tests pass. (When all tests pass, you don’t usually need to look at the report. You really want to see the report when tests are failing.)

"rake tarantula:report" should always show the HTML report, regardless of whether the Tarantula tests pass or fail.

original LH ticket

This ticket has 0 attachment(s).

Dependency issue starting with new rails project

After following the instructions on the the github page I could not get it to run on a new rails app.

here is what I tried

$ rails spider-app (i am using 2.3.2 for this)
$ gem install relevance-tarantula—source http://gems.github.com

added this to my test.rb at the bottom config.gem ‘relevance-tarantula’, :source => “http://gems.github.com”, :lib => ‘relevance/tarantula’

$ mkdir -p vendor/gems
$ cd vendor/gems
$ sudo gem unpack relevance-tarantula

added this to the bottom of the rake file load File.join(RAILS_ROOT, Dir[“vendor/gems/relevance-tarantula-/tasks/.rake”])

$ rake tarantula:setup
$ rake tarantula:test

then I get this error: ... /Users/Tony/.gem/ruby/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb:5:in `each’ /Users/Tony/.gem/ruby/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb:5 Missing these required gems: relevance-tarantula

You’re running: ruby 1.8.6.114 at /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby rubygems 1.3.1 at /Users/Tony/.gem/ruby/1.8, /Library/Ruby/Gems/1.8, /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8

Run rake gems:install to install the missing gems. rake aborted! Command failed with status (1): [/System/Library/Frameworks/Ruby.framework/...]

I can see the gem installed both in vendor and locally when I do a gem list -l tarantula.

original LH ticket

This ticket has 0 attachment(s).

configuration block for tarantula_crawl

would like to add a configuration block for this method...

def tarantula_crawl(integration_test, options = {}, &block) url = options[:url] || "/" t = tarantula_crawler(integration_test, options) yield(t) if block_given? t.crawl url end

support for rails4?

Hi, I was wondering if you were planning to support rails4. Also, I was wondering how this compares to the brakeman scanner.

ThreadError: thread tried to join itself, when running Tarantula test

The following test fails at 'follow_redirect!' with ThreadError (stack trace below)

def test_tarantula
post '/session', :login => 'aaron', :password => 'monkey'
assert_response :redirect
assert_redirected_to '/home'
follow_redirect!

tarantula_crawl(self)

end

ThreadError: thread 0xb77fc1ac tried to join itself
tarantula (0.3.3) [v] lib/relevance/tarantula/rails_integration_proxy.rb:33:in send' tarantula (0.3.3) [v] lib/relevance/tarantula/rails_integration_proxy.rb:33:inget'
tarantula (0.3.3) [v] lib/relevance/tarantula/crawler.rb:122:in send' tarantula (0.3.3) [v] lib/relevance/tarantula/crawler.rb:122:infollow'
tarantula (0.3.3) [v] lib/relevance/tarantula/link.rb:36:in crawl' tarantula (0.3.3) [v] lib/relevance/tarantula/crawler.rb:99:incrawl_the_queue'
tarantula (0.3.3) [v] lib/relevance/tarantula/crawler.rb:92:in do_crawl' tarantula (0.3.3) [v] lib/relevance/tarantula/crawler.rb:64:incrawl'
tarantula (0.3.3) [v] lib/relevance/tarantula/crawler.rb:60:in times' tarantula (0.3.3) [v] lib/relevance/tarantula/crawler.rb:60:incrawl'
tarantula (0.3.3) [v] lib/relevance/core_extensions/test_case.rb:8:in tarantula_crawl' /test/tarantula/tarantula_test.rb:17:intest_tarantula'

DSL-ify the tarantula API

The way tests configure the Tarantula crawler is way too Java-like. It should be more declarative and Rubyish. This will make Tarantula easier to use and document, and also easier to extend and enhance. (The fact that the refactoring described in #8 causes an incompatible change to the Tarantula API is due to the low level of abstraction of the current API.)

Problem with InvalidHtmlHandler

I keep getting invalid html errors on pages that are rendering successfully, in fact on EVERY path. Here's what the data result is on the report:

uninitialized constant HTML::Document

Sure enough is I head into invalid_html_handler.rb and comment out lines 8-13 it runs without issue. (And presumably without checking any html syntax.)

Couldn't find the reason why HTML::Document wasn't being loaded....ideas?

  • Mark McSpadden

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.