Git Product home page Git Product logo

Comments (8)

chauvinSimon avatar chauvinSimon commented on July 23, 2024 1

To answer your question:

"In addition to installing the models, were you able to run PyTorch Live on Android or iOS from Ubuntu?"

I think I could not even install the models properly. And was not able to run it on any device.


I was not sure if I should use npx react-native init or npx torchlive-cli init to initialize a project based on react-native-template-pytorch-live.

Both commands seems successful.

I make sure my emulator is running.

Below are reporting the results of the two methods (both fail).

first version - with npx react-native run-android

error: package org.pytorch.rn.core.ml.processing does not exist

cd "/home/simonchauvin/drafts/live/MyFirstProject" && npx react-native run-android
info Running jetifier to migrate libraries to AndroidX. You can disable it using "--no-jetifier" flag.
Jetifier found 986 file(s) to forward-jetify. Using 12 workers...
info Starting JS server...
info Installing the app...

> Task :react-native-gesture-handler:compileDebugJavaWithJavac

> Task :react-native-safe-area-context:compileDebugJavaWithJavac

> Task :react-native-screens:compileDebugJavaWithJavac

> Task :app:compileDebugJavaWithJavac FAILED
94 actionable tasks: 94 executed
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Note: /home/simonchauvin/drafts/live/MyFirstProject/node_modules/react-native-safe-area-context/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaUtils.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:19: error: package org.pytorch.rn.core.ml.processing does not exist
import org.pytorch.rn.core.ml.processing.BaseIValuePacker;
                                        ^
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:20: error: package org.pytorch.rn.core.ml.processing does not exist
import org.pytorch.rn.core.ml.processing.BertTokenizer;
                                        ^
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:21: error: package org.pytorch.rn.core.ml.processing does not exist
import org.pytorch.rn.core.ml.processing.PackerContext;
                                        ^
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:22: error: package org.pytorch.rn.core.ml.processing does not exist
import org.pytorch.rn.core.ml.processing.PackerRegistry;
                                        ^
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:24: error: cannot find symbol
public class BertQAPacker extends BaseIValuePacker {
                                  ^
  symbol: class BaseIValuePacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:34: error: cannot find symbol
  protected void register(final PackerRegistry registry) {
                                ^
  symbol:   class PackerRegistry
  location: class BertQAPacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:45: error: cannot find symbol
  private BertTokenizer getBertTokenizer(PackerContext packerContext)
                                         ^
  symbol:   class PackerContext
  location: class BertQAPacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:45: error: cannot find symbol
  private BertTokenizer getBertTokenizer(PackerContext packerContext)
          ^
  symbol:   class BertTokenizer
  location: class BertQAPacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:68: error: cannot find symbol
  private IValue packString(final JSONObject jobject, final PackerContext packerContext)
                                                            ^
  symbol:   class PackerContext
  location: class BertQAPacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:86: error: cannot find symbol
  private String decodeBertQAAnswer(final IValue ivalue, final PackerContext packerContext)
                                                               ^
  symbol:   class PackerContext
  location: class BertQAPacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:33: error: method does not override or implement a method from a supertype
  @Override
  ^
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:35: error: cannot find symbol
    super.register(registry);
    ^
  symbol:   variable super
  location: class BertQAPacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:47: error: cannot find symbol
    BertTokenizer bertTokenizer = (BertTokenizer) registry.get("bert_tokenizer_custom");
    ^
  symbol:   class BertTokenizer
  location: class BertQAPacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:47: error: cannot find symbol
    BertTokenizer bertTokenizer = (BertTokenizer) registry.get("bert_tokenizer_custom");
                                   ^
  symbol:   class BertTokenizer
  location: class BertQAPacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:47: error: cannot find symbol
    BertTokenizer bertTokenizer = (BertTokenizer) registry.get("bert_tokenizer_custom");
                                                  ^
  symbol:   variable registry
  location: class BertQAPacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:49: error: cannot find symbol
      bertTokenizer = new BertTokenizer(packerContext.specSrcJson.getString("vocabulary_bert"));
                          ^
  symbol:   class BertTokenizer
  location: class BertQAPacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:50: error: cannot find symbol
      registry.store("bert_tokenizer_custom", bertTokenizer);
      ^
  symbol:   variable registry
  location: class BertQAPacker
Note: /home/simonchauvin/drafts/live/MyFirstProject/android/app/src/debug/java/org/pytorch/live/example/ReactNativeFlipper.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
17 errors

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 12s

error Failed to install the app. Make sure you have the Android development environment set up: https://reactnative.dev/docs/environment-setup.
Error: Command failed: ./gradlew app:installDebug -PreactNativeDevServerPort=8081
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Note: /home/simonchauvin/drafts/live/MyFirstProject/node_modules/react-native-safe-area-context/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaUtils.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:19: error: package org.pytorch.rn.core.ml.processing does not exist
import org.pytorch.rn.core.ml.processing.BaseIValuePacker;
                                        ^
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:20: error: package org.pytorch.rn.core.ml.processing does not exist
import org.pytorch.rn.core.ml.processing.BertTokenizer;
                                        ^
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:21: error: package org.pytorch.rn.core.ml.processing does not exist
import org.pytorch.rn.core.ml.processing.PackerContext;
                                        ^
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:22: error: package org.pytorch.rn.core.ml.processing does not exist
import org.pytorch.rn.core.ml.processing.PackerRegistry;
                                        ^
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:24: error: cannot find symbol
public class BertQAPacker extends BaseIValuePacker {
                                  ^
  symbol: class BaseIValuePacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:34: error: cannot find symbol
  protected void register(final PackerRegistry registry) {
                                ^
  symbol:   class PackerRegistry
  location: class BertQAPacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:45: error: cannot find symbol
  private BertTokenizer getBertTokenizer(PackerContext packerContext)
                                         ^
  symbol:   class PackerContext
  location: class BertQAPacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:45: error: cannot find symbol
  private BertTokenizer getBertTokenizer(PackerContext packerContext)
          ^
  symbol:   class BertTokenizer
  location: class BertQAPacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:68: error: cannot find symbol
  private IValue packString(final JSONObject jobject, final PackerContext packerContext)
                                                            ^
  symbol:   class PackerContext
  location: class BertQAPacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:86: error: cannot find symbol
  private String decodeBertQAAnswer(final IValue ivalue, final PackerContext packerContext)
                                                               ^
  symbol:   class PackerContext
  location: class BertQAPacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:33: error: method does not override or implement a method from a supertype
  @Override
  ^
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:35: error: cannot find symbol
    super.register(registry);
    ^
  symbol:   variable super
  location: class BertQAPacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:47: error: cannot find symbol
    BertTokenizer bertTokenizer = (BertTokenizer) registry.get("bert_tokenizer_custom");
    ^
  symbol:   class BertTokenizer
  location: class BertQAPacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:47: error: cannot find symbol
    BertTokenizer bertTokenizer = (BertTokenizer) registry.get("bert_tokenizer_custom");
                                   ^
  symbol:   class BertTokenizer
  location: class BertQAPacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:47: error: cannot find symbol
    BertTokenizer bertTokenizer = (BertTokenizer) registry.get("bert_tokenizer_custom");
                                                  ^
  symbol:   variable registry
  location: class BertQAPacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:49: error: cannot find symbol
      bertTokenizer = new BertTokenizer(packerContext.specSrcJson.getString("vocabulary_bert"));
                          ^
  symbol:   class BertTokenizer
  location: class BertQAPacker
/home/simonchauvin/drafts/live/MyFirstProject/android/app/src/main/java/org/pytorch/live/example/BertQAPacker.java:50: error: cannot find symbol
      registry.store("bert_tokenizer_custom", bertTokenizer);
      ^
  symbol:   variable registry
  location: class BertQAPacker
Note: /home/simonchauvin/drafts/live/MyFirstProject/android/app/src/debug/java/org/pytorch/live/example/ReactNativeFlipper.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
17 errors

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 12s

    at makeError (/home/simonchauvin/drafts/live/MyFirstProject/node_modules/execa/index.js:174:9)
    at /home/simonchauvin/drafts/live/MyFirstProject/node_modules/execa/index.js:278:16
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async runOnAllDevices (/home/simonchauvin/drafts/live/MyFirstProject/node_modules/@react-native-community/cli-platform-android/build/commands/runAndroid/runOnAllDevices.js:94:5)
    at async Command.handleAction (/home/simonchauvin/drafts/live/MyFirstProject/node_modules/@react-native-community/cli/build/index.js:186:9)
info Run CLI with --verbose flag for more details.

second version - with npx torchlive-cli run-android

cd MyFirstProjectCLI && npx torchlive-cli run-android

BUILD SUCCESSFUL in 22s
132 actionable tasks: 132 executed
info Connecting to the development server...
info Starting the app on "emulator-5554"...
Starting: Intent { cmp=org.pytorch.live.example/.MainActivity }
Done in 25.97s.

but the emulator shows a message in red:

"Unable to load script.Make sure you are either running a Metro server or that your bundle 'index.android.bundle' is packaged correctly for release."

I start metro:

npm start

> [email protected] start
> react-native start

                                                      
                        #######                       
                   ################                   
                #########     #########               
            #########             ##########          
        #########        ######        #########      
       ##########################################     
      #####      #####################       #####    
      #####          ##############          #####    
      #####    ###       ######       ###    #####    
      #####    #######            #######    #####    
      #####    ###########    ###########    #####    
      #####    ##########################    #####    
      #####    ##########################    #####    
      #####      ######################     ######    
       ######        #############        #######     
         #########        ####       #########        
              #########          #########            
                  ######### #########                 
                       #########                      
                                                      
                                                      
                    Welcome to Metro!
              Fast - Scalable - Integrated



To reload the app press "r"
To open developer menu press "d"

then again npx torchlive-cli run-android. It ends with BUILD SUCCESSFUL in 22s.

then in the metro terminal, it start bundling ./index.js` but fails with:

BUNDLE  ./index.js 

error: Error: Unable to resolve module ../../models/detr_resnet50.ptl from /home/simonchauvin/drafts/live/MyFirstProjectCLI/src/examples/ObjectDetectionExample.tsx: 

None of these files exist:
  * detr_resnet50.ptl
  * models/detr_resnet50.ptl/index(.native|.android.js|.native.js|.js|.android.json|.native.json|.json|.android.ts|.native.ts|.ts|.android.tsx|.native.tsx|.tsx)
  25 | const modelInfo: ModelInfo = {
  26 |   name: 'DETR',
> 27 |   model: require('../../models/detr_resnet50.ptl'),
     |                   ^
  28 | };
  29 |
  30 | const objectColors = [
    at ModuleResolver.resolveDependency (/home/simonchauvin/drafts/live/MyFirstProjectCLI/node_modules/metro/src/node-haste/DependencyGraph/ModuleResolution.js:211:15)
    at DependencyGraph.resolveDependency (/home/simonchauvin/drafts/live/MyFirstProjectCLI/node_modules/metro/src/node-haste/DependencyGraph.js:413:43)
    at Object.resolve (/home/simonchauvin/drafts/live/MyFirstProjectCLI/node_modules/metro/src/lib/transformHelpers.js:317:42)
    at resolve (/home/simonchauvin/drafts/live/MyFirstProjectCLI/node_modules/metro/src/DeltaBundler/traverseDependencies.js:629:33)
    at /home/simonchauvin/drafts/live/MyFirstProjectCLI/node_modules/metro/src/DeltaBundler/traverseDependencies.js:645:26
    at Array.reduce (<anonymous>)
    at resolveDependencies (/home/simonchauvin/drafts/live/MyFirstProjectCLI/node_modules/metro/src/DeltaBundler/traverseDependencies.js:644:33)
    at /home/simonchauvin/drafts/live/MyFirstProjectCLI/node_modules/metro/src/DeltaBundler/traverseDependencies.js:329:33
    at Generator.next (<anonymous>)
    at asyncGeneratorStep (/home/simonchauvin/drafts/live/MyFirstProjectCLI/node_modules/metro/src/DeltaBundler/traverseDependencies.js:137:24)

in MyFirstProjectCLI/models there are,

bert_qa.ptl.live.spec.json
detr_resnet50.ptl.live.spec.json
error.log
make_models.py
mnist.ptl.live.spec.json
mobilenet_v3_large.ptl.live.spec.json
mobilenet_v3_small.ptl.live.spec.json
requirements.txt
resnet18.ptl.live.spec.json
venv

if I touch detr_resnet50.ptl, then comes the next error Unable to resolve module ../../models/mnist.ptl.


By the way, npx torchlive-cli doctor gives:

  _                 _     _ _           
 | |_ ___  _ __ ___| |__ | (_)_   _____ 
 | __/ _ \| '__/ __| '_ \| | \ \ / / _ \
 | || (_) | | | (__| | | | | |\ V /  __/
  \__\___/|_|  \___|_| |_|_|_| \_/ \___|
                                        
torchlive version 0.1.1

Homebrew
  🚫 not installed

Python
  🚫 not installed

Watchman
  🚫 not installed

Node.js
  🚫 not installed

React Native should not be installed locally
  ✅ package does not exist.

Yarn
  🚫 not installed

Java Development Kit
  🚫 not installed

Android SDK Manager
  📍 path: /home/simonchauvin/Android/Sdk/tools/bin/sdkmanager
  🏁 min version: 26.1.1
/home/simonchauvin/.npm/_npx/e9a46805b0361e9c/node_modules/torchlive-cli/build/utils/CommandUtils.js:65
                throw new Error('not yet implemented');
                      ^

Error: not yet implemented
    at Object.execute (/home/simonchauvin/.npm/_npx/e9a46805b0361e9c/node_modules/torchlive-cli/build/utils/CommandUtils.js:65:23)
    at execute (/home/simonchauvin/.npm/_npx/e9a46805b0361e9c/node_modules/torchlive-cli/build/utils/CommandUtils.js:96:37)
    at Object.getVersion (/home/simonchauvin/.npm/_npx/e9a46805b0361e9c/node_modules/torchlive-cli/build/utils/CommandUtils.js:106:30)
    at HealthCheck.satisfies (/home/simonchauvin/.npm/_npx/e9a46805b0361e9c/node_modules/torchlive-cli/build/commands/HealthCheck.js:40:36)
    at runHealthCheck (/home/simonchauvin/.npm/_npx/e9a46805b0361e9c/node_modules/torchlive-cli/build/cli-commands/Doctor.js:136:57)
    at /home/simonchauvin/.npm/_npx/e9a46805b0361e9c/node_modules/torchlive-cli/build/cli-commands/Doctor.js:217:13
    at Array.forEach (<anonymous>)
    at /home/simonchauvin/.npm/_npx/e9a46805b0361e9c/node_modules/torchlive-cli/build/cli-commands/Doctor.js:216:22
    at step (/home/simonchauvin/.npm/_npx/e9a46805b0361e9c/node_modules/torchlive-cli/build/cli-commands/Doctor.js:41:23)
    at Object.next (/home/simonchauvin/.npm/_npx/e9a46805b0361e9c/node_modules/torchlive-cli/build/cli-commands/Doctor.js:22:53)

There is definitely something wrong with my installation.

I will stop my experiments here and wait for the linux support.

Thank you @aaronespasa for your help!

from playtorch.

aaronespasa avatar aaronespasa commented on July 23, 2024

Hi @chauvinSimon,

When building the script, see that the program is using the python3 with the version you have installed locally, which can lead to multiple errors at the time of looking for specific dependencies.

I published a solution to this error on the following Pull Request. However, the solution have not been tested with Ubuntu and you may need to make some changes on the script.js file to make it work on that OS:
#9

from playtorch.

chauvinSimon avatar chauvinSimon commented on July 23, 2024

Thank you @aaronespasa for your answer. And thank you a lot for your PR!
Indeed, I had to adapt script.js:

const makeModels = () => {
// Using '.' (dot command), which is supported by /bin/sh, instead of source (`bin/sh: 1: source: not found`)
  execSync('. venv/bin/activate && \
              python3 -m pip install --upgrade pip && \
              python3 -m pip install -r requirements.txt --no-cache-dir && \
              python3 -W ignore make_models.py');
}

and

  case 'linux':
    // issues with privileges when run from execSync(). Therefore, before running nxp, I run:
    // 'sudo apt-get install python3.9'
    // 'sudo apt-get install python3-pip'
    execSync('python3 -m pip install virtualenv');
    execSync('python3 -m venv venv');
    makeModels();
    break;

In addition, it required some yarn cache clean against .yarn-metadata.json: Unexpected end of JSON input.

I could eventually build with npx react-native init MyFirstProject --template [local path to my adapted react-native-template-pytorch-live] 😃 🎉

from playtorch.

aaronespasa avatar aaronespasa commented on July 23, 2024

Oh, I'm so glad to read that @chauvinSimon ! 🎉

In addition to installing the models, were you able to run PyTorch Live on Android or iOS from Ubuntu?

from playtorch.

chauvinSimon avatar chauvinSimon commented on July 23, 2024

I will test that tomorrow and let you know

from playtorch.

aaronespasa avatar aaronespasa commented on July 23, 2024

Cool!

from playtorch.

liuyinglao avatar liuyinglao commented on July 23, 2024

Hey @chauvinSimon Thanks for reporting the issue and would be happy to work with you on addressing this linux issue! looks like the models file is not generated correctly and you could also try to use the "python3 -W ignore make_models.py" to generate the models.

also the error.log files under the models/ dir may give some suggestion on what's going on there.

let us know if that's helpful

and really thanks @aaronespasa for helping with this -- we are testing through the PR you submitted (for the linux especially)!

from playtorch.

chauvinSimon avatar chauvinSimon commented on July 23, 2024

Thank you @liuyinglao
Indeed, python3 -W ignore make_models.py could create the missing models.

One issue I had was with which env to activate. At the end, what worked for me was to use the venv of my first version (manual set up) which was correct, and run python3 -W ignore make_models.py in the second project (with CLI).

A bit complicated.
But eventually, I could start the app, both on the device and in the emulator.

Again, thank you both for your help. The issue can be closed

from playtorch.

Related Issues (20)

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.