weso / rdfshape-api Goto Github PK
View Code? Open in Web Editor NEWAPI for validating and transforming RDF, ShEx, SHACL and more.
Home Page: https://www.weso.es/rdfshape-api/
License: MIT License
API for validating and transforming RDF, ShEx, SHACL and more.
Home Page: https://www.weso.es/rdfshape-api/
License: MIT License
I have deployed play (2.3.1 and 2.3.3) and RDFShapes (Commit 96ad5c9) on my own machine.
The interface successfully runs. However, when I try to validate any documents, I get the following exception:
Error parsing RDF with syntax TURTLE: Exception :Illegal hexadecimal escape sequence near index 43
([a-zA-ZÀ-ÖØ-öø-˿Ͱ-ͽͿ--⁰-Ⰰ-、-豈-﷏ﷰ-�\x{10000}-\x{EFFFF}]((([a-zA-ZÀ-ÖØ-öø-˿Ͱ-ͽͿ--⁰-Ⰰ-、-豈-﷏ﷰ-�\x{10000}-\x{EFFFF}]|_|\-|[0-9]|·|[̀-ͯ]|[‿-⁀]|\.)*([a-zA-ZÀ-ÖØ-öø-˿Ͱ-ͽͿ--⁰-Ⰰ-、-豈-﷏ﷰ-�\x{10000}-\x{EFFFF}]|_|\-|[0-9]|·|[̀-ͯ]|[‿-⁀]))?))
^
Using the specific example of
prefix dctypes: <http://purl.org/dc/dcmitype/>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix : <http://example.org/>
prefix prov: <http://www.w3.org/ns/prov#>
:dataset a dctypes:Dataset, prov:Entity .
and the ShEx
<SummaryShape> {
rdf:type (dctypes:Dataset)
, rdf:type . *
}
this error corresponds with the first space character (URL encoded as +
).
Is there something up with the URL encoding/decoding?
Add support for RDF/XML syntax. It should not be difficult...in fact, it may only need to change the RDF reader...and to add options to the RDF pane
The extractor from HTML to RDF fails when it uses <dl>
.
The following example works:
<div itemscope
itemtype="https://vocab.example.net/book">
</div>
But if replacing <div>
by <dl>
fails.
In order to validate RDF you need the RDF, the Shex and the Shape maps. Right now the UI is designed such that only the RDF and the Shex is at first sight and you need to scroll in order to fix the mappings and to click the validate button.
That creates an unpleasant UX experience because of all the extra gimmicks you need to do in order to use the tool.
Maybe rearranging boxes in a single line and having the validate button at hand could help to alleviate this problem.
The parser does not ensure that the values assigned match their types.
For example the following is parsed as valid while "hello"
is clearly not an xsd:date
.
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
<example> dct:created "hello"^^xsd:date.
See http://goo.gl/fPAxug for a working example
Right now the permalinks generated by the client are to verbose to remember or share. We should:
1 - Connect the server back-end to a URL shortening service to give the client readable links.
2 - Improve the client's usability (like giving the users the ability to copy the permalinks to clipboard, etc.)
Given the following schema:
PREFIX : <http://example.org/>
:S { :p { :q . } }
and data:
@prefix : <http://example.org/> .
:a :p :b .
:b :q 1 , 2 .
The shapes map: :a@:S
should fail but it passes with the message:
Node <http://example.org/b> matched empty shape
Example: https://tinyurl.com/y2frpzyh
The new implementation of ShEx-s reports information about the position of the node that has failed in the JSON API information object.
This position can be used to display in the RDF editor the nodes that have failed.
It may require to adapt YaTE's code to allow this option although it could also be done from the external window that shows the editor highlighting the position.
A similar option will be added to ShEx so we could also point to the shapes that have failed so it would also be interesting to check if it is possible to add this option to YASHE tool.
Sometimes, the application crashes in Heroku and it is not reestarted. Check why...
Add support for JSON-LD syntax
Add more options to the RDF pane. For example: type of parser (Wesin vs Jena), syntax (RDF/XML, JSON-LD, Turtle, N-Triples,...)
Ok, next issue. When I try to access a TTL based RDF file via the uri:
http://operations.refdata.amgen.com/ontology/measurement.ttl
I get the following error:
Exception raised
getURI: cannot retrieve content from http://operations.refdata.amgen.com/ontology/measurement.ttl
Exception: Input length = 1
I can retrieve the TTL file with http://operations.refdata.amgen.com/ontology/measurement.ttl from the operations.refdata.amgen.com server using a web browser.
Add a timeout to schema validation to cancel validation after some period of time.
When the application is uploaded in Heroku, it gives an error:
Failure: URI scheme is not "file"
with the URI: https://raw.githubusercontent.com/chemaar/vaskos/master/trunk/vaskos/src/main/resources/skos/mountain-bike-simple.ttl
If the content is written in the input box, the message is:
Failure: Illegal hexadecimal escape sequence near index 43
(a-zA-ZÀ-ÖØ-öø-˿Ͱ-ͽͿ--⁰-Ⰰ-、-豈-﷏ﷰ-�\x{10000}-\x{EFFFF})
Change the server to support https.
I think we need to add HSTS middleware.
One doubt I have is how to automatically translate requests to http://rdfshape.weso.es
to https://rdfshape.weso.es
...is there a way to do automatically do that or should we do it by hand adding support for both?
Add some middleware that generates prometheus metrics. It seems there is already some metrics middleware in http4s for it.
This might not be applicable if the Heroku server is non-stable, however it appears that /validate
calls return 404 - Not Found
there.
Example with data:
curl 'http://shaclex.herokuapp.com/api/validate?data=%3Cgenid-c7a50d6e828f4595a195f9c67304f6d2-0AE87CB066C8D9CD43117E0C5A3090F0%3E%20a%20%3Chttp%3A%2F%2Fschema.org%2FDataset%3E%3B%0A%20%20%3Chttp%3A%2F%2Fschema.org%2Fdescription%3E%20%22The%20GeneChip%C2%AE%20Drosophila%20Genome%20Array%20is%20a%20microarray%20tool%20for%20studying%20expression%20of%20Drosophila%20melanogaster%20transcripts.%22%3B%0A%20%20%3Chttp%3A%2F%2Fschema.org%2Fidentifier%3E%20%22http%3A%2F%2Fwww.affymetrix.com%2Fproducts%2Farrays%2Fspecific%2Ffly.affx%22%3B%0A%20%20%3Chttp%3A%2F%2Fschema.org%2Fname%3E%20%22Affymetrix%20array%3A%20GeneChip%20Drosophila%20Genome%202.0%20Array%22%3B%0A%20%20%3Chttp%3A%2F%2Fschema.org%2Furl%3E%20%3Chttps%3A%2F%2Fwww.flymine.org%2Fflymine%2Fdataset%3E%20.%0A&dataFormat=turtle&schema=PREFIX%20schema%3A%20%3Chttp%3A%2F%2Fschema.org%2F%3E%20%0A%20%20%20%20PREFIX%20rdf%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2F1999%2F02%2F22-rdf-syntax-ns%23%3E%20%0A%20%20%20%20PREFIX%20rdfs%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23%3E%20%0A%20%20%20%20PREFIX%20xsd%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema%23%3E%20%0A%20%20%20%20%3CURL%3E%0A%20%20%20%20%20%20xsd%3Astring%20OR%20IRI%0A%0A%0Astart%20%3D%20%40%3CDatasetMinimum%3E%0A%20%20%20%0A%3CDatasetMinimum%3E%20%7B%0A%20%20rdf%3Atype%20%5Bschema%3ADataset%5D%20%3B%0A%20%20schema%3Adescription%20xsd%3Astring%20%20%3B%0A%20%20schema%3Aidentifier%20xsd%3Astring%20OR%20%40%3CURL%3E%20OR%20%7Ba%20%5Bschema%3APropertyValue%5D%7D%20OR%20IRI%20%2B%20%3B%0A%20%20schema%3Akeywords%20xsd%3Astring%20%2B%20%3B%0A%20%20schema%3Aname%20xsd%3Astring%20%20%3B%0A%20%20schema%3Aurl%20%40%3CURL%3E%20%20%3B%0A%7D%0A%0A%3CDatasetRecommended%3E%20%7B%0A%20%20rdf%3Atype%20%5Bschema%3ADataset%5D%20%3B%0A%20%20schema%3Acitation%20xsd%3Astring%20OR%20%7Ba%20%5Bschema%3ACreativeWork%5D%7D%20OR%20IRI%20%2A%20%3B%0A%20%20schema%3Acreator%20%20%40%3COrganizationOrPerson%3E%20OR%20IRI%20%2A%20%3B%0A%20%20schema%3Adistribution%20%20%7Ba%20%5Bschema%3ADataDownload%5D%7D%20OR%20IRI%20%3F%20%3B%0A%20%20schema%3AincludedInDataCatalog%20%20%7Ba%20%5Bschema%3ADataCatalog%5D%7D%20OR%20IRI%20%2A%20%3B%0A%20%20schema%3Alicense%20%40%3CURL%3E%20OR%20%7Ba%20%5Bschema%3ACreativeWork%5D%7D%20OR%20IRI%20%3F%20%3B%0A%20%20schema%3AmeasurementTechnique%20xsd%3Astring%20OR%20%40%3CURL%3E%20%2A%20%3B%0A%20%20schema%3AvariableMeasured%20xsd%3Astring%20OR%20%7Ba%20%5Bschema%3APropertyValue%5D%7D%20OR%20IRI%20%2A%20%3B%0A%20%20schema%3Aversion%20xsd%3Adouble%20OR%20xsd%3Astring%20%3F%20%3B%0A%7D%0A%0A%3CDatasetOptional%3E%20%7B%0A%20%20rdf%3Atype%20%5Bschema%3ADataset%5D%20%3B%0A%7D%0A%0A%3COrganizationOrPerson%3E%7B%0A%20%20rdf%3Atype%20%5B%20schema%3AOrganization%20schema%3APerson%5D%0A%7D&schemaFormat=ShExC&shape-map=%3Cgenid-c7a50d6e828f4595a195f9c67304f6d2-0AE87CB066C8D9CD43117E0C5A3090F0%3E%40%3CDatasetMinimum%3E&shapeMapFormat=compact' -X POST -H 'Connection: keep-alive' -H 'Content-Length: 0' -H 'Origin: http://localhost:3000' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36' -H 'Accept: */*' -H 'Referer: http://localhost:3000/' -H 'Accept-Language: en-GB,en-US;q=0.9,en;q=0.8' --compressed --insecure
The following attempt of validation (a Shanghai hospital) agains the entity schema of hospitals:
curl -i -X POST -H "Content-type:multipart/form-data" 'http://localhost:8080/api/wikidata/validate' \
--form-string 'item=<http://www.wikidata.org/entity/Q33121756>' \
--form-string 'entitySchema=E187'
gives a timeout because the entity schema E187
refers to country and the country is Chile (Q148
) which seems to take more time than expected to be retrieved and the whole result is a timeout.
Check how we can improve this situation by increasing the time the server waits or using some kind of streaming retrieval.
The API documentation has not been updated and there are several services that are not documented in swagger:
https://app.swaggerhub.com/apis-docs/labra/rdfshape/1.0.1
Notice that the client points to this documentation in the Help -> API Documentation
.
One problem is that the server is hidden in the 8080
port and now it uses https
instead of http
.
For example, instead of:
http://rdfshape.weso.es/api/schema/engines
it should point to:
https://rdfshape.weso.es:8080/api/schema/engines
When validating data with shacl
How to reproduce (I'd suggest testing this locally to avoid server errors):
Any ideas? @labra
Error trace:
[info] APIHelper: validate
[error] java.lang.NoSuchMethodError: 'scala.collection.immutable.Map es.weso.typing.Typing.getMap()'
[error] at es.weso.shacl.validator.ShapeTyping.toValidationReport(ShapeTyping.scala:39)
[error] at es.weso.schema.ShaclexSchema.$anonfun$cnvResult$2(ShaclexSchema.scala:50)
[error] at scala.util.Either.fold(Either.scala:191)
[error] at es.weso.schema.ShaclexSchema.cnvResult(ShaclexSchema.scala:49)
[error] at es.weso.schema.ShaclexSchema.$anonfun$validateTargetDecls$4(ShaclexSchema.scala:39)
[error] at cats.effect.internals.IORunLoop$.cats$effect$internals$IORunLoop$$loop(IORunLoop.scala:181)
[error] at cats.effect.internals.IORunLoop$RestartCallback.signal(IORunLoop.scala:455)
[error] at cats.effect.internals.IORunLoop$RestartCallback.run(IORunLoop.scala:466)
[error] at cats.effect.internals.Trampoline.cats$effect$internals$Trampoline$$immediateLoop(Trampoline.scala:67)
[error] at cats.effect.internals.Trampoline.startLoop(Trampoline.scala:35)
[error] at cats.effect.internals.TrampolineEC$JVMTrampoline.super$startLoop(TrampolineEC.scala:90)
[error] at cats.effect.internals.TrampolineEC$JVMTrampoline.$anonfun$startLoop$1(TrampolineEC.scala:90)
[error] at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
[error] at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:85)
[error] at cats.effect.internals.TrampolineEC$JVMTrampoline.startLoop(TrampolineEC.scala:90)
[error] at cats.effect.internals.Trampoline.execute(Trampoline.scala:43)
[error] at cats.effect.internals.TrampolineEC.execute(TrampolineEC.scala:42)
[error] at cats.effect.internals.IOBracket$.$anonfun$guaranteeCase$1(IOBracket.scala:116)
[error] at cats.effect.internals.IOBracket$.$anonfun$guaranteeCase$1$adapted(IOBracket.scala:114)
[error] at cats.effect.internals.IOAsync$.$anonfun$apply$1(IOAsync.scala:37)
[error] at cats.effect.internals.IOAsync$.$anonfun$apply$1$adapted(IOAsync.scala:37)
[error] at cats.effect.internals.IORunLoop$RestartCallback.start(IORunLoop.scala:439)
[error] at cats.effect.internals.IORunLoop$.cats$effect$internals$IORunLoop$$loop(IORunLoop.scala:155)
[error] at cats.effect.internals.IORunLoop$RestartCallback.signal(IORunLoop.scala:455)
[error] at cats.effect.internals.IORunLoop$RestartCallback.apply(IORunLoop.scala:476)
[error] at cats.effect.internals.IORunLoop$RestartCallback.apply(IORunLoop.scala:414)
[error] at cats.effect.internals.IOShift$Tick.run(IOShift.scala:36)
[error] at cats.effect.internals.PoolUtils$$anon$2$$anon$3.run(PoolUtils.scala:52)
[error] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
[error] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
[error] at java.base/java.lang.Thread.run(Thread.java:834)
[info] Closing RDF data
[error] Nonzero exit code returned from runner: 1
[error] (Compile / run) Nonzero exit code returned from runner: 1
When using a desktop computer with a wide screen it would be nice to be able to see the RDF data pane and the ShEx/SHACL/SPARQL pane side by side in parallel.
Add a list of examples to the options so the user can play with some examples...to avoid the cold start...
At this moment the API documentation is out-of-date.
It would be very useful to have some kind of URL shortener which would allow to copy/paste links to RDFShape examples easily.
An inspiration would be the buttom provided by the wikimedia query service. I think it uses a URL shortener service.
And the source code seems to be here.
I am also guessing that the URL shortener service uses a database to store the shortened URLs.
There is some background on URL shortening in stackoverflow which contains several implementations.
It would be great if a user could extend/decrease the size of the editor windows of RDF/ShEx/SHACL/etc.
Add a nice Logo
When there's an error in the server the system does not have the abillity to automatically recover from that error, for example kill the process and launch it again.
The easiest way to notice is that the fields on the forms appear empty since the front does not connect to the back, which is down.
This is interesting as the system goes down more often than we'd like.
Migrate to http4s 1.0.0
I have RDFShape working smoothly on http://localhost:9000/
How do I make it visible on my external ip address?
Thanks in advance!
When testing a shape that requires a large number of items to be validated, the validator returns 400 error.
Example: https://tinyurl.com/y4suejtd
There seems to be a problem in bootstrap when there are two panels.
The problem is shown when the browser is using a desktop. It seems the max-width
and margin-left/right
are fixed for the container
div.
Hello,
tried with Firefox and Chrome, but:
(And shouldn't there be a "Visualize SHACL schema" option?)
Thank you for your work!
Improve result reporting to show/hide RDF/ShEx strings on demand
Add support for Schema.org input syntax
Simple shape with one required type and one type that is negated.
prefix dctypes: <http://purl.org/dc/dcmitype/>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix void: <http://rdfs.org/ns/void#>
<SummaryShape> {
rdf:type (dctypes:Dataset),
!rdf:type (void:Dataset)
}
When tested with a document containing a dctypes:Dataset and void:Dataset, the result is still matching a summary shape.
prefix dctypes: <http://purl.org/dc/dcmitype/>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix : <http://example.org/>
prefix void: <http://rdfs.org/ns/void#>
:dataset a dctypes:Dataset, void:Dataset .
I believe that it should not match the summary shape.
You can try it out at
http://goo.gl/jnHafO
As a User of the rdfshape tool
I want to be able to generate java domain models from shape expressions
Because I don't want to code the shape expressions and the java domain models for my applications separately.
The WESO group has implemented a tool called ShEx-Lite. ShEx-Lite is capable of transforming Shape Expressions in compact syntax to domain models of Java, Python... The main idea behind this issue is to integrate this tool into the rdfshape system.
At this moment we visualize RDF graphs using viz.js option to render as SVG. The library provides also the option to generate PNG images which may be useful to save those images and reuse in presentations.
It would be great to allow a user to upload entity schemas created with YasHE to wikidata/wikibase.
It would require to use the wikidata's API and I am not sure about the details...any help would be appreciated.
This functionality could also be added to wikishape.
It appears that currently, when using the http://rdfshape.weso.es/api/
server for API calls, HTML documents are being received as answer one or more endpoints.
For Example:
curl -X GET "http://rdfshape.weso.es/api/data/formats" -H "accept: application/json"
returns
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="shortcut icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="RDFShape client"/><link rel="manifest" href="/manifest.json"/><title>RDFShape</title><link href="/static/css/2.4f4d5dfe.chunk.css" rel="stylesheet"><link href="/static/css/main.3b104fc2.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(i){function e(e){for(var r,t,n=e[0],o=e[1],u=e[2],l=0,f=[];l<n.length;l++)t=n[l],Object.prototype.hasOwnProperty.call(p,t)&&p[t]&&f.push(p[t][0]),p[t]=0;for(r in o)Object.prototype.hasOwnProperty.call(o,r)&&(i[r]=o[r]);for(s&&s(e);f.length;)f.shift()();return c.push.apply(c,u||[]),a()}function a(){for(var e,r=0;r<c.length;r++){for(var t=c[r],n=!0,o=1;o<t.length;o++){var u=t[o];0!==p[u]&&(n=!1)}n&&(c.splice(r--,1),e=l(l.s=t[0]))}return e}var t={},p={1:0},c=[];function l(e){if(t[e])return t[e].exports;var r=t[e]={i:e,l:!1,exports:{}};return i[e].call(r.exports,r,r.exports,l),r.l=!0,r.exports}l.m=i,l.c=t,l.d=function(e,r,t){l.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(r,e){if(1&e&&(r=l(r)),8&e)return r;if(4&e&&"object"==typeof r&&r&&r.__esModule)return r;var t=Object.create(null);if(l.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:r}),2&e&&"string"!=typeof r)for(var n in r)l.d(t,n,function(e){return r[e]}.bind(null,n));return t},l.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(r,"a",r),r},l.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},l.p="/";var r=window["webpackJsonprdfshape-client"]=window["webpackJsonprdfshape-client"]||[],n=r.push.bind(r);r.push=e,r=r.slice();for(var o=0;o<r.length;o++)e(r[o]);var s=n;a()}([])</script><script src="/static/js/2.5a3941e3.chunk.js"></script><script src="/static/js/main.77a91491.chunk.js"></script></body></html>
while
curl -X GET "http://shaclex.herokuapp.com/api/data/formats" -H "accept: application/json"
returns a JSON array, as expected:
["TURTLE","RDF/XML","JSON-LD","N-TRIPLES","RDF/JSON","TRIG","DOT"]
I've realised that the button validate in http://rdfshape.weso.es/shexValidate only works the first time the page loads.
Steps to reproduce:
; :age :unknown
Expected behaviour
Tested
When there's a white space between the object and the language label the validation fails.
I'll show you an example to be more specific:
<product> <label> "Blueberry Muffin" @en .
RDFShape says it's not valid.
<product> <label> "Blueberry Muffin"@en .
RDFShape says it's valid.
While in rdfcat
both of them are valid.
Add a list of Shape profiles...for example: Issues, Skos, WebIndex, etc....
In the case of SHACL, the output of the validation process if a SHACL validation report, which is an RDF graph. Shaclex already generates it, but it is not visualized yet.
A looong time ago, we did an automatic deployment pipeline to Heroku from github pushes.
It doesn't work at this moment, I think it would be a matter of looking what changes we need to do to deploy it there. Probably we would only need to deploy rdfshape-client to heroku and point to the rdfshape local server we already have.
It is a pity that it doesn't work, because some applications are still pointing to the heroku deployment...another possibility could be to just create a landing page redirecting from heroku to http://rdfshape.weso.es
It seems that some module has added coverage code that prevents the tests to be run in Travis. The error shown is:
[error] ## Exception when compiling 2 sources to /home/travis/build/weso/rdfshape/target/scala-2.13/classes
[error] java.lang.NoSuchMethodError: scala.tools.nsc.Global.reporter()Lscala/tools/nsc/reporters/Reporter;
[error] com.github.ghik.silencer.SilencerPlugin.reporter$lzycompute(SilencerPlugin.scala:27)
[error] com.github.ghik.silencer.SilencerPlugin.com$github$ghik$silencer$SilencerPlugin$$reporter(SilencerPlugin.scala:26)
[error] com.github.ghik.silencer.SilencerPlugin.processOptions(SilencerPlugin.scala:50)
. . .
Add a parameter to show only a given number of results. At this moment it shows only the first result.
At this moment, the Javascript code in RDFShape is a bit hidden in the folder modules/server/src/main/resources/staticviews
and it has been evolving from a small set of scripts to something that contains more logic about results visualization.
It would be better to refactor that code using ES6, Typescript or even ScalaJS.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.