Coder Social home page Coder Social logo

backstage's Introduction

No Longer Maintained

The TorqueBox project is no longer actively developed nor maintained. Do not use it for development or production usage unless you are willing and able to fix issues as they come up.

TorqueBox

This is TorqueBox 4 and represents a substantial change in direction from previous TorqueBox releases. We're moving to a lightweight, embedded model that runs without any Java application server, at the expense of a few of the more enterprisy features. For users that want to run in a Java application server or need those enterprisy features, we'll provide a way to take your TorqueBox application and run it unmodified on a stock WildFly installation.

Documentation

We have various guides available to help with installation, migration, usage, and deployment of TorqueBox 4.

Quickstart for running TorqueBox

Requirements

TorqueBox requires JRuby 1.7.x (in 1.9 or 2.0 mode) or JRuby 9.x.x running on Java 7+. The code has only been tested on JRuby 1.7.6 and higher but should work on earlier versions.

Installation

Read the Installation Guide for installation details.

Running directly

From inside your Rack application's root directory:

torquebox run

Rails

Ensure torquebox is in your Gemfile, then:

rails s torquebox

Rack

rackup -s torquebox

Motivation

We want a smaller, more modular TorqueBox that is easier to get started with, embeddable, and lets users bring in additional functionality as-needed. More details of our motivation and community feedback are expressed in an email thread from the torquebox-user mailing list.

Technology

TorqueBox runs on JRuby and sits on top of a new lightweight, pluggable, polyglot server codenamed WunderBoss (at least for now). All the new features of TorqueBox will be implemented in WunderBoss then exposed via a Ruby API in the TorqueBox project. This lets other projects, in other languages, reuse the same functionality by creating small language-specific API wrappers.

The web portion of WunderBoss uses JBoss Undertow, which is also the same web server used in WildFly (the successor to JBoss Application Server).

We aim to reuse the same underlying components as WildFly so that TorqueBox applications can run on top of WildFly in addition to running without it, to give users an option between a full-blown Java application server and a very lightweight, minimal server.

Current status

Right now TorqueBox 4 provides a high-performance Rack implementation for web applications and basic APIs for messaging, caching, and scheduled jobs. The Rack support is considered production-ready, but the messaging, caching, and scheduling implementations are still in a bit more flux.

Roadmap

We're developing TorqueBox 4 while also maintaining TorqueBox 3, and we expect it to take some time before TorqueBox 4 comes out of alpha and betas and into a final release.

Building TorqueBox

bundle install
rake build

Running specs

rake spec

Running integration tests

Make sure phantomjs is available on your $PATH - http://phantomjs.org/download.html.

The first time you run the integration tests may take longer as bundler gets invoked for each test application to install its dependencies. Subsequent runs with the same JRuby installation should be faster.

cd integration-tests
rake spec

Running a single integration test

cd integration-tests
SPEC=spec/basic_sinatra_spec.rb rake spec

Running specs with more verbose output

DEBUG=true rake spec

Running all integration test variants (disk, jar, wildfly)

There are several variants of integration tests. Each runs the same applications and same specs, but packaged in different ways. This takes quite a bit longer, but is what CI runs.

rake spec:all

Installing from source

rake install

Releasing

Preparation

TorqueBox 4 is released from the master branch of torquebox/torquebox-release.

Set up this repository as an additional remote for your workspace:

git remote add release [email protected]:torquebox/torquebox-release.git

Ensure that the master branch has the contents you wish to release. Using the -f flag to force is allowed in this case, since the torquebox-release repository is not a public-facing human-cloneable repository.

git push release master:master -f

Perform the build

Using the build system, select the torquebox4-release job, entering in the branch to release from (usually 'master'), the version to release, and the next version after release.

If something goes wrong in the release job and it needs to run again, be sure to reset the torquebox-release repository with the correct code first:

git push release master:master -f

Deploy RubyGems

After the job complete successfully, the generated RubyGems will need to be manually deployed. Download them from the job and push each using:

gem push <gem_name>.gem

You'll have to be an owner of the gems to do this. Bug bbrowning, bobmcw, or tcrawley if you are not.

Publish the release API documentation

The release API docs are built by the release job on CI. Download those and put them a _4x_docs//yardoc folder in the torquebox.org git repo.

Push changes from the release repository to the official repository

git fetch release --tags
git merge release/master
git push origin master
git push origin <release_tag>

Release the project in JIRA

Announce it

Post it on torquebox.org

Notify the torquebox-users@ list

Tweet it.

Set the /topic in #torquebox IRC channel using ChanServ (if you can).

backstage's People

Contributors

bbrowning avatar davidglassborow avatar freerobby avatar kml avatar lance avatar penumbra avatar tbeauvais avatar tobias avatar wollistik 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

Watchers

 avatar  avatar  avatar  avatar  avatar

backstage's Issues

Wire up sessions so mod_cluster can use them for session affinity

12:20 tcrawley: I noticed backstage doesn't use sessions - on purpose?
12:20 apparently mod_cluster can't do ip-based session affinity, only session-based session affinity
12:20 so since backstage doesn't use sessions requests basically get round-robin'ed
12:20 ah
12:21 it was 'on purpose' before since we weren't storing any session data
12:21 but it looks like it may be useful
12:21 that may be what is screwing the console
12:21 yeah I figured that screws up the console
12:21 but is useful for lanceball's testing otherwise I think

Warning when running bundler

$ jruby -S bundle install
The source :rubygems is deprecated because HTTP requests are insecure.
Please change your source to 'https://rubygems.org' if possible, or 'http://rubygems.org' if not.

I'll submit a pull request in a couple minutes.

Bond dependency requires compilation

It looks like a new dependency was introduced in Backstage 1.0.3 - Bond (0.4.1)

This new requirement requires compilation which means the RubyInstaller.org devkit needs to be installed and setup for windows users.

Worth mentioning in the README I think.

[EDIT] Just tried the new webconsole...awesome!

backstage deploy not working with gem version of torquebox

I installed torquebox 2.0.0.beta3 and backstage 1.0.0.beta2 as gems.
Because the gem version of torquebox does not set the environment variables, the deployment through "backstage deploy" does not work.

rvm use jruby-1.6.5.1@global

jruby -J-Xmx1024m -S gem install torquebox-server --pre

gem install torquebox-backstage --pre

backstage deploy
Exception: $TORQUEBOX_HOME must be set
check at .../.rvm/gems/jruby-1.6.5.1@global/gems/torquebox-backstage-1.0.0.beta2/bin/backstage:68
deploy at .../.rvm/gems/jruby-1.6.5.1@global/gems/torquebox-backstage-1.0.0.beta2/bin/backstage:28

Include message queue consumers on other servers

When running Torquebox in a clustered environment Backstage does not include consumers running on others servers in the consumer count on the queues or topics pages.

Is this by design? Or is it a limitation of JBoss and HornetQ? If not then I think it would be valuable to add it.

Fails on torquebox 2.3.0

Attempting to use Backstage on the newly released 2.3.0 version of torquebox results in the following error

exception

javax.servlet.ServletException: org.jruby.exceptions.RaiseException: (LoadError) no such file to load -- torquebox/webconsole
    org.torquebox.web.servlet.RackFilter.doRack(RackFilter.java:117)
    org.torquebox.web.servlet.RackFilter.doFilter(RackFilter.java:101)
    org.torquebox.web.servlet.RackFilter.doFilter(RackFilter.java:72)
    org.torquebox.web.servlet.SendfileFilter.doFilter(SendfileFilter.java:49)
    org.torquebox.web.servlet.SendfileFilter.doFilter(SendfileFilter.java:33)

root cause

org.jruby.exceptions.RaiseException: (LoadError) no such file to load -- torquebox/webconsole
    org.jruby.RubyKernel.require(org/jruby/RubyKernel.java:1027)
    RUBY.(root)(/home/jjones/.rvm/gems/jruby-1.7.1@testapp/gems/torquebox-backstage-1.0.7/backstage.rb:19)
    org.jruby.RubyKernel.require(org/jruby/RubyKernel.java:1027)
    RUBY.(root)(/home/jjones/.rvm/gems/jruby-1.7.1@testapp/gems/torquebox-backstage-1.0.7/config.ru:1)
    org.jruby.RubyBasicObject.instance_eval(org/jruby/RubyBasicObject.java:1691)
    RUBY.(root)(/home/jjones/.rvm/gems/jruby-1.7.1@testapp/gems/torquebox-backstage-1.0.7/config.ru:5)
    RUBY.initialize(/home/jjones/.rvm/gems/jruby-1.7.1@testapp/gems/rack-1.4.1/lib/rack/builder.rb:51)

torquebox-webconsole gem is definitely installed.

This error has occurred on Linux (jruby 1.7.1 and 1.7.2 tested) and Windows (1.7.3-dev tested) with 2.3.0. Works correctly with 2.2.0

Gem won't bundle with Rails 3.2 app

When I try to bundle with JRuby 1.7.8 and Rails 3.2.14, I get:

Bundler could not find compatible versions for gem "sass":
In Gemfile:
torquebox-backstage (>= 0) java depends on
sass (~> 3.1.2) java

zurb-foundation (~> 4.3.1) java depends on
  sass (3.2.12)

Can we bump the sass requirements? (Or am I messing something up?)

TB 2.3.0 dependency somewhere

Installing torquebox-backstage will always result in the installation of version 2.3.0 torquebox gems. even if the --conservative flag is used.

To test, install binary version of TB 2.2.0 then gem install torquebox-backstage, 2.3.0 versions of torquebox gems will be installed which then renders the server unable to start.

I have no idea why this is happening as I cannot see and hard dependencies on 2.3.0 in the Gemfile (or gemspecs of related gems for that matter)

2.x incremental gem file pointing to static incremental file

Currently the gem file in the 2.x version of backstage is pointing to incremental .345 (gem 'torque box', '> 2.x.incremental.345'. This is an old build that is not in the repository anymore. Might be better to change the gem file to gem 'torque box', '> 2.x.incremental') so it grabs the most recent version. @bobmcw on the torque box irc was kind enough to help me out with this.

Thanks for a great app. I'm planning to build my application around backstage.

Installed gems via 'bundle --deployment' are not picked up by TB

If the gem requirements for backstage are installed using bundle --deployment, so get all the gems put into a ./vendor directory, when deployed to TB, TB fails to find the gems.

This works fine for rails apps, so maybe an issue to do with plain rack apps onTB ?

Broken dependencies in torquebox-backstage-0.4.0 gem

Hi!

I have problems installing the troquebox-backstage-0.4.0 gem into a fresh
torquebox-1.0.1 server installation:

$ gem install torquebox-backstage
ERROR:  Error installing torquebox-backstage:
        torquebox-backstage requires tilt (= 1.3.0, runtime)
$ backstage
Gem::LoadError: can't activate tilt (= 1.3.0, runtime) for ["torquebox-backstage-0.4.0"], already activated tilt-1.3.2 for ["sinatra-1.2.6", "torquebox-backstage-0.4.0"]

I think removing this line will fix it:
https://github.com/torquebox/backstage/blob/v0.4.0/Gemfile#L13

Evaluate of String in the contexts of a Rails 4.x application fails

If you create a simple rails 4.x (4.2.0) application and use Backstage to evaluate against the application pool where the last line is a string (e.g. "test") no results will be displayed.

There looks to be a compatibility issue in the String from the target application's to_json (from ActiveSupport::JSON), and the JSON generator. Both are using json (1.8.2-java), but when the to_json is called on the resulting String the following exception is thrown. I debugged into the Java code a bit and it looks like RuntimeInfo Java class used by the Generator is not fully populate with all of its context information.

You can workaround this by adding the following to_json method to the String instance you are returning from your Evaluation script.

str = "foo"
def str.to_json(options = {})
    "\"#{self}\""
end

# last line of evaluate script
str
Java::JavaLang::NullPointerException - :
json.ext.Generator$6.generate(Generator.java:385)
json.ext.Generator$6.generate(Generator.java:371)
json.ext.Generator$Handler.generateNew(Generator.java:172)
json.ext.Generator.generateJson(Generator.java:36)
json.ext.GeneratorMethods$RbString.to_json(GeneratorMethods.java:106)
json.ext.GeneratorMethods$RbString$INVOKER$s$0$0$to_json.call(org.jruby.internal.runtime.methods.JavaMethod$JavaMethodN.call(JavaMethod.org.jruby.internal.runtime.methods.DynamicMethod.call(DynamicMethod.org.jruby.internal.runtime.methods.AliasMethod.call(AliasMethod.java:61)
org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:170)
org.jruby.ast.CallOneArgNode.interpret(CallOneArgNode.java:57)
org.jruby.ast.NewlineNode.interpret(NewlineNode.java:105)
org.jruby.ast.IfNode.interpret(IfNode.java:116)
org.jruby.ast.NewlineNode.interpret(NewlineNode.java:105)
org.jruby.evaluator.ASTInterpreter.INTERPRET_METHOD(ASTInterpreter.java:74)
org.jruby.internal.runtime.methods.InterpretedMethod.call(InterpretedMethod.org.jruby.internal.runtime.methods.InterpretedMethod.call(InterpretedMethod.org.jruby.internal.runtime.methods.DefaultMethod.call(DefaultMethod.org.jruby.internal.runtime.methods.AliasMethod.call(AliasMethod.java:76)
org.jruby.RubyClass.finvoke(RubyClass.java:718)
org.jruby.runtime.Helpers.invoke(Helpers.java:512)
org.jruby.RubyBasicObject.callMethod(RubyBasicObject.java:371)
json.ext.Generator$8.generateNew(Generator.java:431)
json.ext.Generator$8.generate(Generator.java:440)
json.ext.Generator$5$1.visit(Generator.java:357)
org.jruby.RubyHash.visitLimited(RubyHash.java:648)
org.jruby.RubyHash.visitAll(RubyHash.java:634)
json.ext.Generator$5.generate(Generator.java:336)
json.ext.Generator$5.generate(Generator.java:309)
json.ext.Generator$Handler.generateNew(Generator.java:172)
json.ext.Generator.generateJson(Generator.java:58)
json.ext.GeneratorState.generate(GeneratorState.java:210)
json.ext.GeneratorState$INVOKER$i$1$0$generate.call(org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:170)
org.jruby.ast.CallOneArgNode.interpret(CallOneArgNode.java:57)
org.jruby.ast.NewlineNode.interpret(NewlineNode.java:105)
org.jruby.ast.BlockNode.interpret(BlockNode.java:71)
org.jruby.evaluator.ASTInterpreter.INTERPRET_METHOD(ASTInterpreter.java:74)
org.jruby.internal.runtime.methods.InterpretedMethod.call(InterpretedMethod.

torquebox-backstage lost authentication after deploy/undeploy/deploy simple application

Hi.
under Windows
torquebox 3.1.2
torqueboxbackstage 1.1.1

My sequence is:
backstage deploy --secure=admin:admin123
torquebox run in other command windows
firefox to http://localhost:8080/backstage/. Requires authentication . Good. Enter user and password. Good. I am on page.
cd %myapp%
torquebox deploy
torquebox undeploy
torquebox deploy

firefox to http://localhost:8080/backstage/. Requires authentication . Good. Enter user and password. Again Requires authentication.

--------- from log --------------
roundable
16:55:59,480 INFO [org.quartz.impl.StdSchedulerFactory](MSC service thre) Quartz scheduler 'jboss.deployment.unit."hello-knob.yml".job_scheduler'
lized from an externally provided properties instance.
16:55:59,483 INFO [org.quartz.impl.StdSchedulerFactory](MSC service thre) Quartz scheduler version: 2.1.5
16:55:59,483 INFO [org.quartz.core.QuartzScheduler] (MSC service thread 1
bFactory set to: org.torquebox.jobs.JobScheduler@6b61032f
16:55:59,484 INFO [org.quartz.core.QuartzScheduler] (MSC service thread 1
heduler jboss.deployment.unit."hello-knob.yml".job_scheduler_$_NON_CLUSTER
rted.
16:56:00,997 INFO org.torquebox.core.runtime Created
untime (ruby_version: RUBY1_9, compile_mode: JIT, app: hello, context: web
.53s
16:56:00,999 INFO [org.jboss.web](ServerService Thread Pool -- 50) JBAS0
Register web context:
16:56:01,358 INFO [org.jboss.as.server.deployment](DeploymentScanner-thr

  1. JBAS018559: Deployed "hello-knob.yml" (runtime-name : "hello-knob.yml"
    127.0.0.1 - - [30/Apr/2015:16:56:02 +0500] "GET / " 200 135 0.0160
    127.0.0.1 - - [30/Apr/2015:16:56:07 +0500] "GET /hello " 404 467 0.0130
    127.0.0.1 - - [30/Apr/2015:16:57:58 +0500] "GET /hello " 404 467 0.0040
    ERROR: No authentication delegate found. Authentication not enabled.
    ERROR: No authentication delegate found. Authentication not enabled.
    ERROR: No authentication delegate found. Authentication not enabled.

Queues -> View Messages seems to be broken

While the overview shows that there are two messages within a queue created by a Rails app, "View Messages" shows no message.

I use Backstage v1.0.dev for TorqueBox v2.0.0-SNAPSHOT straight from the git

Unexpected file in Infinispan cache store

Running Torquebox 2.0.3 in standalone-ha mode with an installed backstage results in the following warning message being created.

09:24:01,818 WARN  [org.infinispan.loaders.file.FileCacheStore] (Scheduled-eviction-thread-0) ISPN000163: FileCacheStore ignored an unexpected file backstage in path C:\torquebox-current\jboss\standalone\data\web\default-host. The store path should be dedicated!

I checked and there is a backstage folder being put in that directory but it is always empty.

jmx gem dependency

I am trying to get my head around how backstage does things like see what queues currently exist.

In doing so I decided to have a look at the jmx gem (version 0.9).

The gem exists on rubygems.org but the actual github repo has disappeared.

It looks like it has been replaced with jmxjr. Assuming the old gem is no longer developed it may be a good idea for backstage to switch gems.

@enebo Has the jmx gem source code location changed?

Add support for infinispan stats

Is ultra important to have visibility to metrics like:

-cache object number
-get
-puts
-hit rate
-%mem used

It would be great to have something... i don't know if it is possible.

More dependency problems with torquebox-backstage-0.4.0 gem

This one is more tricky:
I deployed backstage in production mode via "backstage deploy" command.

torquebox server tries to load the development dependencies from

  • Gemfile
  • Gemfile.lock
    Both are included in the torquebox-backstage-0.4.0 gem
javax.servlet.ServletException: org.jruby.exceptions.RaiseException: (GemNotFound) Could not find diff-lcs-1.1.2 in any of the sources
javax.servlet.ServletException: org.jruby.exceptions.RaiseException: (GemNotFound) Could not find gem 'jeweler (>= 0, runtime)' in any of the gem sources listed in your Gemfile.

You should consider removing Gemfile, Gemfile.lock and bundler dependency from the gem because
all dependencies are fetched during the regular installation of the torquebox-backstage gem.

Gem issues

Installed backstage on a fresh torquebox 1.0.1 installation on a fresh windows 2008 R2 server.

As part of the gem install it also installed HAML 3.1.2 and SASS 3.1.3

However accessing the site resulted in errors. Looking at the Torquebox output it was looking for HAML 3.1.1 and SASS 3.1.2

Manually installed those gem versions resulted in a working site.

Cannot build gem on Windows 7 x64 machine (Encoding::InvalidByteSequenceError)

I am running Torquebox 2.x and following the instructions (https://github.com/torquebox/backstage), I got this error:

C:\dev\sinatra-projects\torquebox-backstage>jruby -S gem build torquebox-backstage.gemspec --debug
ERROR:  While executing gem ... (Encoding::InvalidByteSequenceError)

        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/package/tar_writer.rb:46:in `write'
        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/builder.rb:91:in `write_package'
        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/package/tar_writer.rb:147:in `add_file_simple'
        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/builder.rb:90:in `write_package'
        org/jruby/RubyArray.java:1612:in `each'
        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/builder.rb:82:in `write_package'
        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/package/tar_output.rb:73:in `add_gem_contents'
        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/package/tar_writer.rb:83:in `new'
        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/package/tar_output.rb:67:in `add_gem_contents'
        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/package/tar_output.rb:65:in `add_gem_contents'
        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/package/tar_writer.rb:113:in `add_file'
        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/package/tar_output.rb:63:in `add_gem_contents'
        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/package/tar_output.rb:31:in `open'
        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/package.rb:44:in `open'
        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/builder.rb:78:in `write_package'
        org/jruby/RubyIO.java:1115:in `open'
        org/jruby/RubyKernel.java:308:in `open'
        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/builder.rb:77:in `write_package'
        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/builder.rb:39:in `build'
        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/commands/build_command.rb:25:in `execute'
        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/command.rb:278:in `invoke'
        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/command_manager.rb:147:in `process_args'
        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/command_manager.rb:117:in `run'
        C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/gem_runner.rb:65:in `run'
        C:/dev/torquebox/torquebox-2.x/jruby/bin/gem:21:in `(root)'
Exception `Gem::SystemExitException' at C:/dev/torquebox/torquebox-2.x/jruby/lib/ruby/site_ruby/1.8/rubygems/user_interaction.rb:332 - Exiting RubyGems with exit_code 1

Thanks!

Version restrictions are very strict.

Backstage has many very strict dependencies in its gemfile, for example, backstage depends on thor 0.14.6 exactly. This makes it very difficult to use backstage with any reasonably sized app.

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.