Coder Social home page Coder Social logo

weso / shex-lite Goto Github PK

View Code? Open in Web Editor NEW
8.0 5.0 9.0 1.83 MB

Scala implementation of a compiler for a subset of the Shape Expressions Compact Syntax.

License: Other

Scala 71.14% Java 27.19% ANTLR 1.05% Shell 0.02% Python 0.18% Gherkin 0.18% Dockerfile 0.26%
shex shape-expressions shex-lite scala

shex-lite's Introduction

Shex-lite logo

Shape Expression Lite Language

Master
ShEx Lite CI ShEx-Lite CI
AWS CI Build Status
Code Coverage codecov.io

Welcome to ShEx Lite

ShEx Lite is a lightweight version of ShEx that has as an aim reduce the complexity of the syntax, improve the semactic analisis of the schemas and boost the performance of the validation process.

One of the restrictions of the language is that it represents a subset of ShEx. Therefore any source code developed in shex-lite format will be completly compatible with ShEx implementations. But although it is inspired in those ShEx implementations it is a complete independent language, it has its own syntax, semantics, features, compiler and validation process.

To learn more about ShEx-Lite, please see the paper presented at ISWC-2020 demos track.

Compiler Architecture

As a whole, the ShEx-Lite compiler is principally responsible for translating Shex-Lite source code into dofferent intermediate representations like Java, Python or HTML. However, the Shex-Lite compiler front-end is ready for integration with other tools like IDE and syntax coloring thanks to its API design inspired in modern compilers like Roslyn, SwiftC or RustC.

Mainly the compiler is build in 5 major stages: Shex-lite Arch

  1. The source code is translated in to a Syntax Tree, that is a tree that contains all the tokens generated by the lexer in a tree structure generated from the rules of the grammar.

  2. The Syntax Tre is parsed again to remove all unneed tokens like semicolons, braces and parenthesis. That way the Abstract Syntax Tree is formed.

  3. Fom the AST we apply the semantic analysis and transformations to transform the tree in to a graph that is called the Shex-lite Intermediate Language. This graph contains information like where a definition took place and adds all of those information to other nodes.

  4. Once we have the Intermediate Language we perform an analysis to validate that it is consistent. There is no missing references and things like that.

  5. Finally the compiler generates the code for the different intermediate representations.

To look deeper to the compiler the following picture illustrates perfectly the data-flow: Shex-lite Arch

Contributing to ShEx Lite

Contributions to ShEx Lite are welcomed and encouraged!

To be a truly great community, shex-lite needs to welcome developers from all walks of life, with different backgrounds, and with a wide range of experience. A diverse and friendly community will have more great ideas, more unique perspectives, and produce more great code. We will work diligently to make the ShEx Lite community welcoming to everyone.

To give clarity of what is expected of our members, ShEx Lite has adopted the code of conduct defined by the Contributor Covenant. This document is used across many open source communities, and we think it articulates our values well.

Proposals

If you want to contribute to ShEx-Lite the best and fastest way is to submit a proposal about a change that you would like to integrate with the project. For example: If you find that would be interesting to add a new SIL Generator for a language just submit a proposal with your idea and listen for the feedback of the core team and the comunity. We love to have proposals.

To submit your proposal we encourage you to use the GitHub issues system. You just have to click on create new issue and select the proposal template. And don't worry, if something is not up to the standards we will contact you in order to try to find a solution.

Roadmap

Shex-lite is a project that always maintains a minimum view of one year onwards, in this way we can anticipate different demands from users. Currently our roadmap is hold here [SLI-0090] 🚀 Long Term Roadmap (LTR).

Getting Started

These instructions give the most direct path to a working ShEx Lite development environment. To build from source you will need about 2Gb of disk space for sources. Depending on your machine, a clean build can take a few minutes. Naturally, incremental builds are much faster.

System Requirements

ShEx Lite is developed using scala PL and compiles against the JVM. Therefore all JVM supported systems are currently supported as host development operating system.

Scala

The compiler of ShEx Lite is build using scala language, that means that you will need to install Scala in order to be able to compile the sources.

Currently ShEx Lite uses scala 2.13.1.

IntelliJ IDEA

We also encourage you to use the IDE IntelliJ. ShEx Lite was developed using this IDE and already includes some directives in the sbt to ensure that the project is imported and set up correctly.

Getting Sources for ShEx Lite

First create a directory for all ShEx Lite sources:

mkdir shex-lite-sources
cd shex-lite-sources

Cloning the repository containing the sources:

git clone https://github.com/weso/shex-lite.git .

Building ShEx Lite

ShEx-Lite uses SBT and scala. So build the project is as easy as go to the root directory of the project and execute:

sbt assembly

Using the CLI tool

After building the .jar this tool can be used be means of the following instruction-set.

Usage

 shexlc [options] <files> ... : Compile and generate target domain model objects

Options

   -hw, --hide-warn  : If present will hide the warnings
   --java-pkg=STRING : If present will generate java domain object models with the given package
   --out-dir=STRING  : Sets the out directory where the sources will be generated

Arguments

   <files> : ShEx-Lite sources to compile

Testing ShEx Lite

We encourage you to add as much tests as possible and then run the previous existing ones with your new tests. As more tests we can do more confident about its behaviour that we will be. In the folder test you will find all resources that might be need.

In order to execute all tests locally you will need SBT. Again, testing is super easy and doesn't take too long. You just have to execute:

sbt test

Learning More

Be sure to look through the docs directory for more information about the compiler. In particular, the documents titled Debugging the ShEx Lite Compiler and Continuous Integration for ShEx Lite are very helpful to understand before submitting your first PR.

Building Documentation

To read the compiler documentation, start by installing the Bikeshed documentation generator tool by runing the command:

git clone https://github.com/tabatkins/bikeshed.git
pip install --editable $PWD/bikeshed
bikeshed update

Once complete, you can build the ShEx Lite documentation by changing directory into docs and typing ./scripts/build-doc.sh. This compiles the .bs files in the docs directory into HTML in the doc directory.

Many of the docs are out of date, but you can see some historical design documents in the doc directory.

Authors

  • Guillermo Facundo Colunga - Initial work - thewilly
  • Alejandro González Hevia - Core Team - alejgh
  • Jose Emilio Labra Gayo - Core Team - labra
  • Daniel Fernández Álvarez - Core Team - danifdezalvarez

See also the list of contributors who participated in this project.

Collaborations

The project is completely open source and therefore they accept collaborations from different projects from all over the world including:

Shex-lite logoShex-lite logo

The Hercules ASIO project focuses on creating an ontological infrastructure and a semantic architecture to manage the administration of research in the environment of Spanish research centers and universities.

The HERCULES-Semantics of University Research Data project has a budget of Five Million Four Hundred Sixty Two Thousand Six Hundred Euros with an ERDF co-financing of 80%, therefore the European Regional Development Fund (ERDF), through the then Ministry of Economy, Industry and Competitiveness (currently the Ministry of Science and Innovation) as the Intermediate Body of the ERDF Smart Growth Operational Program - POCint (now the Multi-regional Operational Program of Spain - POPE) makes a contribution of Four Million Three Hundred Seventy Thousand Eighty euros.

License

ShEx Lite is primarily distributed under the terms of both the MIT license and the GNU General Public License (Version 3.0), with portions covered by various licenses.

See LICENSE-MIT, LICENSE-GNU, and LICENSE for details.

Trademark

The ShEx Lite language is an open source, community project governed by a core team. It is also sponsored by the Web Semantics Oviedo Research Group at University of Oviedo ("WESO"), which owns and protects the ShEx Lite trademark and logo.

If you want to use these names or brands, please read the media guide.

Third-party logos may be subject to third-party copyrights and trademarks. See Licenses for details.

shex-lite's People

Contributors

alejgh avatar labra avatar mistermboy avatar othub avatar scala-steward avatar thewillyhuman avatar weso-bot avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

shex-lite's Issues

[SLI-0011] CLOSED Shapes.

Allow to declare shapes as CLOSED to have only the triples matching a given set of triple constraints and no others using the keyword CLOSED.

[SLI-0087] Change parentheses surrounding event type in error / warning messages by square brackets

Introduction

Currently, error and warning messages display the event code within parentheses. It is recommended to change the symbol of these brackets by brackets, so that in the CLI the errors are more readable.

Current Behavior

Currently when any warning or error occurs the following type of messages are displayed.

warning(W002): base has been set but not used
--> test/assets/correct_schema_big_schema_2.shexl:10:5
	| 
10	| base <google.es>
	|      ^ the base `<google.es>` definition is set but not used

error(E003): attempt to override an already defined prefix
--> test/assets/incorrect_schema_using_prefix_redefinition_1.shexl:4:12
	| 
4	| PREFIX xsd: <http://overridingprefix.org/>
	|        ^ this prefix definition overrides the previous one (2:0) with value <http://schema.org/>

Expected Behavior

After the implementation of this proposal, the messages would be displayed as follows.

warning[W002]: base has been set but not used
--> test/assets/correct_schema_big_schema_2.shexl:10:5
	| 
10	| base <google.es>
	|      ^ the base `<google.es>` definition is set but not used

error[E003]: attempt to override an already defined prefix
--> test/assets/incorrect_schema_using_prefix_redefinition_1.shexl:4:12
	| 
4	| PREFIX xsd: <http://overridingprefix.org/>
	|        ^ this prefix definition overrides the previous one (2:0) with value <http://schema.org/>

Changing warning(W002) by warning[W002] and error(E003) by error[E003].

Early Design

To implement the current proposal, the following code modification is proposed:

Error Type Messages

override def getSuperType:String = Console.RED + s"error($getCode): $getDescription" + Console.RESET

To:

  override def getSuperType:String = Console.RED + s"error[$getCode]: $getDescription" + Console.RESET

Warning Type Messages

override def getSuperType:String = Console.YELLOW + s"warning($getCode): $getDescription" + Console.RESET

To:

  override def getSuperType:String = Console.YELLOW + s"warning[$getCode]: $getDescription" + Console.RESET

[SLI-0050] Travis CI is completly unstable for scala builds

Travis CI has been unstable during all day for scala builds, this is related to that sometimes it misses some libraries, sometimes it misses other libraries and then the same test executed twice fails first time and passes second time....

In my opinion we should be looking for another CI tool.

[SLI-0060] Readme build status badge still points to travis when travis is no longer used.

The readme build status badge still points to travis build status. Travis is no longer being used, instead now we're using GitHub actions. Therefore the actual readme badge needs to be changed to the following one. Also the information from the table that contains the badge will need to be updated too.

Badge:
ShEx-Lite CI

Code:
![ShEx-Lite CI](https://github.com/weso/shex-lite/workflows/ShEx-Lite%20CI/badge.svg?branch=master)

[SLI-0074] The a keyword is not recognized

The keyword a is recognized by the grammar but when appears the parser throws a null pointer exception as that rule does not generate an ID and the parser expects an ID to call other methods.

[SLI-0004] Specify grammar/syntax for version 2

This issue is devoted to decide the features that shex-lite 2 will include. Up to now the following features are included:

ShEx-Lite 1:

  • Multiple prefixes definitions.
  • Single empty prefix definition.
  • Multiple shapes definitions.
  • Multiple triple constraints definitions.
  • Prefix reference check.
  • Shape reference check.

ShEx Lite 2:

  • Cardinality.
  • Define shape def/inv -> :ShapeName | <#ShapeName>.
  • Shape definition with no body and single constraint.
  • Support for optional ';' at the last triple constraint of a shape.
  • Grammar constraint for xsd types.

[SLI-0002] Triple expression cardinality

Up to now the language does not support cardinality in terms that a node can only relate to another by means of a triple-constraint with the default 1-1 cardinality. The idea is to support 1-1 and 1-N cardinalities.

Ex:

:Person {
  :name  xsd:string[|*|+|?|{min,max}]  ;
  :knows  @:Person[|*|+|?|{min,max}]
}

[SLI-0090] 🚀 Long Term Roadmap (LTR)

🚧 This is our roadmap 🚧

This issue (SLI-0090) tracks high-level plans for shex-lite. It gives entry points for release-level issues as well as broader goals that correspond to rough milestones over the next year. In practice, these goals are pretty hit-and-miss w.r.t. people actually doing the necessary work, but they are reported here as aspirations and for discussion.

Release plans

  • shex-lite 2.0 beta - detailed in SLI-0094 released 2020-04-22 (mail thread)
  • shex-lite 2.0 release candidate - detailed in SLI-0095 expected May 2020
  • shex-lite 2.0 stable release - detailed in SLI-0096 expected June 2020
  • shex-lite 3.0 beta - detailed in SLI-0104 expected August 2020
  • shex-lite 3.0 release candidate - detailed in SLI-0105 expected August 2020
  • shex-lite 3.0 stable release - detailed in SLI-0106 expected September 2020
    • shex-lite 3.5 LTS - yet to be drafted expected September 2020
  • shex-lite 4.0 beta - yet to be drafted expected November 2020
  • shex-lite 4.0 release candidate - yet to be drafted expected November 2020
  • shex-lite 4.0 stable release - yet to be drafted expected December 2020
  • shex-lite 5.0 beta - yet to be drafted expected February 2021
  • shex-lite 5.0 release candidate - yet to be drafted expected March 2021
  • shex-lite 5.0 stable release - yet to be drafted expected May 2021
    • shex-lite 5.5 LTS - yet to be drafted expected August 2021

Primary focus of each version

  • shex-lite 2.0: Shape expressions subset definition & Compiler design/development.
  • shex-lite 3.0: Automatic import shapes from tabular formats & Java domain model generation.
    • shex-lite 3.5 LTS: First production ready release with long term support 🎉.
  • shex-lite 4.0: Validation of simple graphs.
  • shex-lite 5.0: Compatibility with neo4j and other RDF based systems.
    • shex-lite 5.5 LTS: Second production ready release with long term support 🎉.

[SLI-0020] Allow special characters for shape labels

ShEx is more flexible when it comes to allowed characters in labels. For example, something like this will work:

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX sch-ema: <http://schema.org/>

<User> {
 sch-ema:1n-ame  xsd:string ;
 sch-ema:knows @<User>*
}

The same happens in ttl for example. I think it is worth following the already established conventions, but I would also like to receive your feedback on this topic.

Originally posted by @alejgh in #19

[SLI-0003] Add dynamic programming feature

Allow to create shape expressions on its little version dynamically by a third party program.

Ex:

ShapeExpressionsFile(
  List(
    new Prefix("foaf", new URL(Protocol.Http, "example.ex", "/foaf")),
    new Prefix("xsd", new URL(Protocol.Https, "foafdomain.org", "/types"))
  ),
  List(
    new ShapeExpression(
      "Person",
      List(
        new TripleConstraint(new Property(foafPrefix, "name"), new NodeConstraint(xsdPrefix, StringType), Cardinality.DefaultOne)
      )
    ),
    ...
  )
);

[SLI-0039] Study compatibility with gremlin virtual machine

Gremlin is a graph traversal language and virtual machine developed by Apache TinkerPop of the Apache Software Foundation. Gremlin works for both OLTP-based graph databases as well as OLAP-based graph processors. Gremlin's automata and functional language foundation enable Gremlin to naturally support imperative and declarative querying, host language agnosticism, user-defined domain specific languages, an extensible compiler/optimizer, single- and multi-machine execution models, hybrid depth- and breadth-first evaluation, as well as Turing Completeness.

For more info: wikipedia, official website.

[SLI-0008] Grammar constraint for xsd types.

Originally ShEx-Lite was design to only hold primitive xml schemma types. But with the current implementation it hold any type until the try-checking visitor is executed. The idea is to reduce the load of visitors by not recognizing any type outside xsd types.

[SLI-0088] The `a` keyword is not recognized by the grammar

Introduction

In turtle the keyword a was included as alias of rdf: type. The language of shapes expressions adopted it and therefore shex-lite should support it too.

Current Behavior

Currently for the scheme (input_correct_java_schema_user_car_1.shexl),

prefix : <example.org>
prefix xsd: <schema.org>
prefix foaf: <foaf.org>

:User {
    a		foaf:person ;
    :name       xsd:string  ;
    :surname    xsd:string  ;
    :age        xsd:integer ;
    :knows      @:User *
}

: Car {
    :plateNumber    xsd:string  ;
    :owner          @:User
}

If we execute java -jar shexlc-2.0-beta.jar input_correct_java_schema_user_car_1.shexl the compiler produces the following output:

Output:

line 6:7 extraneous input 'foaf' expecting ':'
line 6:19 extraneous input ';' expecting {':', 'iri', '.', 'nonliteral', '[', 'bnode', 'literal', '@', LABEL, IRI_LITERAL, REAL_LITERAL, STRING_LITERAL}
line 7:28 extraneous input ';' expecting {':', 'iri', '.', 'nonliteral', '[', 'bnode', 'literal', '@', LABEL, IRI_LITERAL, REAL_LITERAL, STRING_LITERAL}
line 8:28 extraneous input ';' expecting {':', 'iri', '.', 'nonliteral', '[', 'bnode', 'literal', '@', LABEL, IRI_LITERAL, REAL_LITERAL, STRING_LITERAL}
line 9:28 extraneous input ';' expecting {':', 'iri', '.', 'nonliteral', '[', 'bnode', 'literal', '@', LABEL, IRI_LITERAL, REAL_LITERAL, STRING_LITERAL}
line 10:16 extraneous input '@' expecting {':', '}', ';', LABEL, IRI_LITERAL}
line 10:23 mismatched input '*' expecting {':', 'iri', '.', 'nonliteral', '[', 'bnode', 'literal', '@', LABEL, IRI_LITERAL, REAL_LITERAL, STRING_LITERAL}
Exception in thread "main" java.lang.NullPointerException
        at es.weso.shexlc.syntactic.parser.ConstraintTripleExprPsr.getParseResult(ConstraintTripleExprPsr.scala:45)
        at es.weso.shexlc.syntactic.Syn01ASTBuilderVisitor.visitConstraint_triple_expr(Syn01ASTBuilderVisitor.scala:78)
        at es.weso.shexlc.syntactic.Syn01ASTBuilderVisitor.visitConstraint_triple_expr(Syn01ASTBuilderVisitor.scala:30)
        at es.weso.shexlc.syntactic.generated.Shexl2Parser$Constraint_triple_exprContext.accept(Shexl2Parser.java:1250)
        at es.weso.shexlc.syntactic.parser.ConstraintBlockTripleExprPsr.$anonfun$getParseResult$1(ConstraintBlockTripleExprPsr.scala:50)
        at scala.collection.Iterator$$anon$9.next(Iterator.scala:573)
        at scala.collection.mutable.Growable.addAll(Growable.scala:62)
        at scala.collection.mutable.Growable.addAll$(Growable.scala:59)
        at scala.collection.mutable.ArrayBuffer.addAll(ArrayBuffer.scala:147)
        at scala.collection.mutable.ArrayBuffer.addAll(ArrayBuffer.scala:40)
        at scala.collection.mutable.ArrayBuffer$.from(ArrayBuffer.scala:265)
        at scala.collection.mutable.ArrayBuffer$.from(ArrayBuffer.scala:253)
        at scala.collection.IterableOps.map(Iterable.scala:672)
        at scala.collection.IterableOps.map$(Iterable.scala:672)
        at scala.collection.AbstractIterable.map(Iterable.scala:921)
        at es.weso.shexlc.syntactic.parser.ConstraintBlockTripleExprPsr.getParseResult(ConstraintBlockTripleExprPsr.scala:50)
        at es.weso.shexlc.syntactic.Syn01ASTBuilderVisitor.visitConstraint_block_triple_expr(Syn01ASTBuilderVisitor.scala:74)
        at es.weso.shexlc.syntactic.Syn01ASTBuilderVisitor.visitConstraint_block_triple_expr(Syn01ASTBuilderVisitor.scala:30)
        at es.weso.shexlc.syntactic.generated.Shexl2Parser$Constraint_block_triple_exprContext.accept(Shexl2Parser.java:1170)
        at org.antlr.v4.runtime.tree.AbstractParseTreeVisitor.visitChildren(AbstractParseTreeVisitor.java:46)
        at es.weso.shexlc.syntactic.generated.Shexl2BaseVisitor.visitConstraint_expr(Shexl2BaseVisitor.java:118)
        at es.weso.shexlc.syntactic.generated.Shexl2Parser$Constraint_exprContext.accept(Shexl2Parser.java:983)
        at es.weso.shexlc.syntactic.parser.ShapeDefStmtPsr.getParseResult(ShapeDefStmtPsr.scala:47)
        at es.weso.shexlc.syntactic.Syn01ASTBuilderVisitor.visitShape_def_stmt(Syn01ASTBuilderVisitor.scala:53)
        at es.weso.shexlc.syntactic.Syn01ASTBuilderVisitor.visitShape_def_stmt(Syn01ASTBuilderVisitor.scala:30)
        at es.weso.shexlc.syntactic.generated.Shexl2Parser$Shape_def_stmtContext.accept(Shexl2Parser.java:557)
        at org.antlr.v4.runtime.tree.AbstractParseTreeVisitor.visitChildren(AbstractParseTreeVisitor.java:46)
        at es.weso.shexlc.syntactic.generated.Shexl2BaseVisitor.visitDefinition_stmt(Shexl2BaseVisitor.java:41)
        at es.weso.shexlc.syntactic.generated.Shexl2Parser$Definition_stmtContext.accept(Shexl2Parser.java:320)
        at org.antlr.v4.runtime.tree.AbstractParseTreeVisitor.visitChildren(AbstractParseTreeVisitor.java:46)
        at es.weso.shexlc.syntactic.generated.Shexl2BaseVisitor.visitStatement(Shexl2BaseVisitor.java:27)
        at es.weso.shexlc.syntactic.generated.Shexl2Parser$StatementContext.accept(Shexl2Parser.java:200)
        at es.weso.shexlc.syntactic.parser.SchemaPsr.$anonfun$getParseResult$1(SchemaPsr.scala:44)
        at scala.collection.Iterator$$anon$9.next(Iterator.scala:573)
        at scala.collection.mutable.Growable.addAll(Growable.scala:62)
        at scala.collection.mutable.Growable.addAll$(Growable.scala:59)
        at scala.collection.mutable.ArrayBuffer.addAll(ArrayBuffer.scala:147)
        at scala.collection.mutable.ArrayBuffer.addAll(ArrayBuffer.scala:40)
        at scala.collection.mutable.ArrayBuffer$.from(ArrayBuffer.scala:265)
        at scala.collection.mutable.ArrayBuffer$.from(ArrayBuffer.scala:253)
        at scala.collection.IterableOps.map(Iterable.scala:672)
        at scala.collection.IterableOps.map$(Iterable.scala:672)
        at scala.collection.AbstractIterable.map(Iterable.scala:921)
        at es.weso.shexlc.syntactic.parser.SchemaPsr.getParseResult(SchemaPsr.scala:44)
        at es.weso.shexlc.syntactic.Syn01ASTBuilderVisitor.visitSchema(Syn01ASTBuilderVisitor.scala:33)
        at es.weso.shexl.DefaultShExLCompiler.buildAST(DefaultShExLCompiler.scala:105)
        at es.weso.shexl.DefaultShExLCompiler.$anonfun$compile$1(DefaultShExLCompiler.scala:82)
        at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:553)
        at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:551)
        at scala.collection.AbstractIterable.foreach(Iterable.scala:921)
        at es.weso.shexl.DefaultShExLCompiler.compile(DefaultShExLCompiler.scala:75)
        at es.weso.shexl.cli.ShExLiteCLI$.run(ShExLiteCLI.scala:51)
        at es.weso.shexl.cli.ShExLiteCLI$.run(ShExLiteCLI.scala:29)
        at org.backuity.clist.CliMain.$anonfun$runWith$1(CliMain.scala:14)
        at org.backuity.clist.Parser.$anonfun$withCommand$1(Parser.scala:156)
        at org.backuity.clist.Parser.withParsingException(Parser.scala:199)
        at org.backuity.clist.Parser.withCommand(Parser.scala:154)
        at org.backuity.clist.CliMain.runWith(CliMain.scala:14)
        at org.backuity.clist.CliMain.main(CliMain.scala:6)
        at es.weso.shexl.cli.ShExLiteCLI.main(ShExLiteCLI.scala)

Expected Behavior

Typically, the grammar would accept this keyword and then be automatically replaced by the compiler with rdf: type.

[SLI-0010] START Shape Expression.

The directive start = @:Patient declares that the shape expression :Patient will be used by default is a shape is not explicitily provided in the shape map.

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.