Comments (10)
from active-orient.
Thanks for the prompt response!
I am simply trying to use it as a gem in a standalone script. It used to be possible before (when I wrote the code) to do so. Is that no possible anymore? Do I necessarily need to clone the project, update the database connection info in the YAML file and add my scripts to the project?
By the way, I am trying to run the version 0.6.
from active-orient.
Not necessarily.
look to config/boot.rb
these are the essential steps
63 ActiveOrient.default_server= { user: connectyml[:user], password: connectyml[:pass] ,
64 server: 'localhost', port: 2480 }
65 ActiveOrient.database = @configDatabase.presence || databaseyml[env.to_sym]
66
67 ORD = ActiveOrient::OrientDB.new preallocate: @do_not_preallocate.present? ? false : true
68 if RUBY_PLATFORM == 'java'
69 DB = ActiveOrient::API.new preallocate: false
70 else
71 DB = ORD
72 end
73 # ActiveOrient::Init.vertex_and_edge_class
74
75 ORD.create_classes 'E', 'V'
76 E.ref_name = 'E'
77 V.ref_name = 'V'
78 # require model files after initializing the database
79 require "#{project_root}/lib/model/edge.rb"
80 require "#{project_root}/lib/model/vertex.rb"
The database is stored in »ActiveOrient.database«
It's opened via » ActiveOrient::OrientDB.new preallocate: true «
And please initiate «ActiveOrient.default_server» as well.
The edge- and vertex-model-file extensions are useful.
If you are familiar with rails, the approach to autoload model-files should comfort you.
please take a look at https://github.com/topofocus/orientdb_time_graph. If you clone it, it might act as a sample-project using the ActiveOrient gem.
from active-orient.
I found the problem. The current version does not accept the following (the help file says it should):
ActiveOrient::Init.define_namespace namespace: :object
On the other hand, it accepts the following:
ActiveOrient::Init.define_namespace :yml=>{:namespace=>:object}
This fixed most of the errors, but not all of them. I have a few classes in my database that use reserved words as names (e.g. File or Gem). Active Orient gives me an error while preallocating those classes, even if I use a prefix for the names.
For instance, the following code:
#!/usr/bin/env ruby
require 'bundler/setup'
require 'active-orient'
require 'logger'
require 'yaml'
logger = Logger.new '/dev/stdout'
ActiveOrient::Model.logger = logger
ActiveOrient::OrientDB.logger = logger
ActiveOrient.default_server = {server: 'localhost', user: 'root', password: 'xxx', database: 'gems', port: 2480}
ActiveOrient.database = :gems
ActiveOrient::Model.keep_models_without_file = true
ODB = Module.new
ActiveOrient::Init.define_namespace { ODB }
ORD = ActiveOrient::OrientDB.new preallocate: true
returns the following errors:
I, [2017-02-10T20:09:05.776978 #11099] INFO -- OrientDB#Connect: Connected to database gems
E, [2017-02-10T20:09:06.146365 #11099] ERROR -- ClassUtils#AllocateClassesInRuby: undefined method `abstract=' for File:Class
E, [2017-02-10T20:09:06.146477 #11099] ERROR -- ClassUtils#AllocateClassesInRuby: /usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/class_utils.rb:68:in `block in allocate_classes_in_ruby'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/class_utils.rb:99:in `block in allocate_classes_in_ruby'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/class_utils.rb:97:in `map'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/class_utils.rb:97:in `allocate_classes_in_ruby'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/class_utils.rb:101:in `block in allocate_classes_in_ruby'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/class_utils.rb:97:in `map'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/class_utils.rb:97:in `allocate_classes_in_ruby'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/class_utils.rb:101:in `block in allocate_classes_in_ruby'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/class_utils.rb:97:in `map'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/class_utils.rb:97:in `allocate_classes_in_ruby'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/database_utils.rb:94:in `preallocate_classes'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/rest/rest.rb:74:in `initialize'
(pry):14:in `new'
(pry):14:in `__pry__'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:355:in `eval'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:355:in `evaluate_ruby'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:323:in `handle_line'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:243:in `block (2 levels) in eval'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:242:in `catch'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:242:in `block in eval'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:241:in `catch'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:241:in `eval'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/repl.rb:77:in `block in repl'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/repl.rb:67:in `loop'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/repl.rb:67:in `repl'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/repl.rb:38:in `block in start'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/input_lock.rb:61:in `__with_ownership'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/input_lock.rb:79:in `with_ownership'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/repl.rb:38:in `start'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/repl.rb:15:in `start'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_class.rb:169:in `start'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/cli.rb:219:in `block in <top (required)>'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/cli.rb:83:in `block in parse_options'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/cli.rb:83:in `each'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/cli.rb:83:in `parse_options'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/bin/pry:16:in `<top (required)>'
/usr/local/bin/pry:22:in `load'
/usr/local/bin/pry:22:in `<main>'
E, [2017-02-10T20:09:06.159359 #11099] ERROR -- ClassUtils#AllocateClassesInRuby: undefined method `abstract=' for Gem:Module
E, [2017-02-10T20:09:06.159475 #11099] ERROR -- ClassUtils#AllocateClassesInRuby: /usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/class_utils.rb:68:in `block in allocate_classes_in_ruby'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/class_utils.rb:99:in `block in allocate_classes_in_ruby'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/class_utils.rb:97:in `map'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/class_utils.rb:97:in `allocate_classes_in_ruby'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/class_utils.rb:101:in `block in allocate_classes_in_ruby'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/class_utils.rb:97:in `map'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/class_utils.rb:97:in `allocate_classes_in_ruby'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/class_utils.rb:101:in `block in allocate_classes_in_ruby'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/class_utils.rb:97:in `map'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/class_utils.rb:97:in `allocate_classes_in_ruby'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/database_utils.rb:94:in `preallocate_classes'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/rest/rest.rb:74:in `initialize'
(pry):14:in `new'
(pry):14:in `__pry__'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:355:in `eval'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:355:in `evaluate_ruby'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:323:in `handle_line'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:243:in `block (2 levels) in eval'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:242:in `catch'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:242:in `block in eval'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:241:in `catch'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:241:in `eval'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/repl.rb:77:in `block in repl'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/repl.rb:67:in `loop'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/repl.rb:67:in `repl'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/repl.rb:38:in `block in start'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/input_lock.rb:61:in `__with_ownership'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/input_lock.rb:79:in `with_ownership'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/repl.rb:38:in `start'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/repl.rb:15:in `start'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_class.rb:169:in `start'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/cli.rb:219:in `block in <top (required)>'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/cli.rb:83:in `block in parse_options'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/cli.rb:83:in `each'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/cli.rb:83:in `parse_options'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/bin/pry:16:in `<top (required)>'
/usr/local/bin/pry:22:in `load'
/usr/local/bin/pry:22:in `<main>'
TypeError: no implicit conversion of nil into String
Working on E -> ActiveOrient::Model
Class_hierarchy: [["E", ["AppliedTo", "AuthorOf", "Authored", "CoForks", "CollaboratedOn", "Committed", "Comprises", "Contains", "ContributedTo", "DescendsFrom", "Duplicates", "Forks", "HostedAt", "Includes", "MemberOf", "Owns", "SameAs", "Uses", "VersionOf", "_e"]], ["ODocumentWrapper", [["OIdentity", ["ORole", "OUser"]]]], "ORIDs", "PostdatedCommit", ["V", ["Commit", "File", "Gem", ["GithubEntity", ["Repository", ["User", ["Developer", "Organization"]]]], "License", "Package", ["Person", ["Author", "Contributor", "Maintainer", "OldContributor"]], "Snippet", "Superson", "Suproject", "_v"]], "_orphan_gems"].
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/model/the_class.rb:135:in `exists?'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/model/the_class.rb:135:in `require_model_file'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/database_utils.rb:96:in `block in preallocate_classes'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/database_utils.rb:95:in `map'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/database_utils.rb:95:in `preallocate_classes'
/usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/rest/rest.rb:74:in `initialize'
(pry):14:in `new'
(pry):14:in `__pry__'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:355:in `eval'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:355:in `evaluate_ruby'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:323:in `handle_line'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:243:in `block (2 levels) in eval'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:242:in `catch'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:242:in `block in eval'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:241:in `catch'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_instance.rb:241:in `eval'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/repl.rb:77:in `block in repl'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/repl.rb:67:in `loop'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/repl.rb:67:in `repl'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/repl.rb:38:in `block in start'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/input_lock.rb:61:in `__with_ownership'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/input_lock.rb:79:in `with_ownership'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/repl.rb:38:in `start'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/repl.rb:15:in `start'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/pry_class.rb:169:in `start'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/cli.rb:219:in `block in <top (required)>'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/cli.rb:83:in `block in parse_options'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/cli.rb:83:in `each'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/lib/pry/cli.rb:83:in `parse_options'
/usr/local/lib/ruby/gems/2.4.0/gems/pry-0.10.4/bin/pry:16:in `<top (required)>'
/usr/local/bin/pry:22:in `load'
/usr/local/bin/pry:22:in `<main>'TypeError: no implicit conversion of nil into String
from /usr/local/lib/ruby/gems/2.4.0/gems/active-orient-0.6/lib/model/the_class.rb:135:in `exists?'
from active-orient.
Hi,
you are right, there was a Bug in Init.define_namspace.
I just updated it here.
Just call the method without a parameter, then no namespace is assigned.
The problem is ActiveOrient::Model.model_dir
I used your script and added
2.4.0 :020 > ActiveOrient::Model.model_dir = '.'
=> "."
the directory exists, but ActiveOrient cannot find an appropriate file.
2.4.0 :021 > ORD = ActiveOrient::OrientDB.new preallocate: true
I, [2017-02-10T23:00:14.911980 #5044] INFO -- OrientDB#Connect: Connected to database temp
I, [2017-02-10T23:00:14.972420 #5044] INFO -- ModelClass#RequireModelFile: model-file not present: ./odb/contract.rb
I, [2017-02-10T23:00:14.972542 #5044] INFO -- ModelClass#RequireModelFile: model-file not present: ./e.rb
I, [2017-02-10T23:00:14.972634 #5044] INFO -- ModelClass#RequireModelFile: model-file not present: ./v.rb
I, [2017-02-10T23:00:14.972741 #5044] INFO -- ModelClass#RequireModelFile: model-file not present: ./odb/contract_detail.rb
I, [2017-02-10T23:00:14.972837 #5044] INFO -- ModelClass#RequireModelFile: model-file not present: ./odb/exchange.rb
I, [2017-02-10T23:00:14.972938 #5044] INFO -- ModelClass#RequireModelFile: model-file not present: ./odb/industry.rb
I, [2017-02-10T23:00:14.973030 #5044] INFO -- ModelClass#RequireModelFile: model-file not present: ./odb/property.rb
=> #<ActiveOrient::OrientDB:0x00000002430d08 @res=#<RestClient::Resource:0x00000002430bc8 @url="http://localhost:2480", @block=nil, @options={:user=>"hctw", :password=>"hc"}>, @actual_class_hash=[{"name"=>"Contract", "superClass"=>""}, {"name"=>"E", "superClass"=>""}, {"name"=>"OFunction", "superClass"=>""}, {"name"=>"OIdentity", "superClass"=>""}, {"name"=>"ORestricted", "superClass"=>""}, {"name"=>"ORole", "superClass"=>"OIdentity"}, {"name"=>"OSchedule", "superClass"=>""}, {"name"=>"OSequence", "superClass"=>""}, {"name"=>"OTriggered", "superClass"=>""}, {"name"=>"OUser", "superClass"=>"OIdentity"}, {"name"=>"V", "superClass"=>""}, {"name"=>"_studio", "superClass"=>""}, {"name"=>"contract_detail", "superClass"=>""}, {"name"=>"exchange", "superClass"=>""}, {"name"=>"industry", "superClass"=>""}, {"name"=>"property", "superClass"=>""}]>
After that, you might call
puts ORD.class_hierarchy.to_yaml
and
puts ActiveOrient::show_classes
then your console acts almost as the customized one in the bin dir.
from active-orient.
I put minimal setup instructions to the project
from active-orient.
The first issue (failing to initialize with no namespace) was due to the bug you found, and now it is solved.
The second issue (failing to create corresponding Ruby classes for the database classes with reserved names) does not get solved by adding "." as model_dir. Again, this only occurs if you have classes in the database with names like "File" or "Gem", which are reserved to classes in the core library of Ruby and are loaded before the script starts running. As a consequence, ActiveOrient fails to initialize Ruby classes with those names if there is no namespace assigned, which is an expected behaviour. But then it also fails to initialize Ruby classes with those names, even when a prefix namespace is used to avoid conflicting class names. That's the part that I find strange.
from active-orient.
You are right.
Feature is caused in lib/ClassUtils#allocate_classes_in_ruby
fixed it by checking against a list of reserved words prior to the autoloading process.
If you synchronize your git, you should be able to load the database.
The conflicting classes are omitted.
from active-orient.
Improved the Behavior.
If a class is detected, which has a Ruby-Class - or -Method-Conflict,. it is now pushed into the Namespace ActiveOrient::Model
topo@gamma:~/activeorient/bin$ ./active-orient-console t
/home/topo/.rvm/gems/ruby-2.4.0/gems/activesupport-5.0.1/lib/active_support/xml_mini.rb:51: warning: constant ::Fixnum is deprecated
/home/topo/.rvm/gems/ruby-2.4.0/gems/activesupport-5.0.1/lib/active_support/xml_mini.rb:52: warning: constant ::Bignum is deprecated
Using test-environment
21.02.(20:40:25) INFO->Connected to database temp
21.02.(20:40:25) WARN->Unable to allocate class File in Namespace Object
21.02.(20:40:25) WARN->Allocation took place with namespace ActiveOrient::Model
21.02.(20:40:25) WARN->Unable to allocate class Gem in Namespace Object
21.02.(20:40:25) WARN->Allocation took place with namespace ActiveOrient::Model
(...)
Namespace for model-classes : No Prefix, just ClassName#CamelCase
Present Classes (Hierarchy)
---
- Contract
- E
- V
- file
- filed
- files
- filezt
- gem
- industry
- property
---------------------------------------------
Database Class -> ActiveOrient ClassName
---------------------------------------------
V -> V
E -> E
file -> ActiveOrient::Model::File
filed -> Filed
files -> Files
filezt -> Filezt
gem -> ActiveOrient::Model::Gem
industry -> Industry
property -> Property
---------------------------------------------
2.4.0 :001 >
from active-orient.
from active-orient.
Related Issues (16)
- Few thoughts after reading the README HOT 1
- rspec failed. HOT 5
- Queries with "like" and "matches" Operators don't work HOT 1
- RID-Cache needs Garbage Collection HOT 1
- Issues with JRuby HOT 2
- Uninitialized constant error on require "active-model" HOT 8
- Could not find a valid gem 'rest-client' HOT 7
- OO-Behavior of Edges HOT 1
- undefined method `default_server=' for ActiveOrient::OrientDB:Class HOT 2
- Failed to open TCP connection to localhost:2480 HOT 14
- Connect to OrientDB Distributed Architecture HOT 4
- Trying to use active-orient with Rails 6 HOT 4
- undefined method `progname=' for nil:NilClass (NoMethodError) HOT 4
- ActiveModel HOT 4
- Some questions HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from active-orient.