Giter Club home page Giter Club logo

Comments (10)

topofocus avatar topofocus commented on June 3, 2024

from active-orient.

retrography avatar retrography commented on June 3, 2024

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.

topofocus avatar topofocus commented on June 3, 2024

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.

retrography avatar retrography commented on June 3, 2024

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.

topofocus avatar topofocus commented on June 3, 2024

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.

topofocus avatar topofocus commented on June 3, 2024

I put minimal setup instructions to the project

from active-orient.

retrography avatar retrography commented on June 3, 2024

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.

topofocus avatar topofocus commented on June 3, 2024

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.

topofocus avatar topofocus commented on June 3, 2024

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.

retrography avatar retrography commented on June 3, 2024

from active-orient.

Related Issues (16)

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.