vpinna80 / vtl Goto Github PK
View Code? Open in Web Editor NEWVTL Engine and Editor
Home Page: https://vpinna80.github.io/VTL/
License: European Union Public License 1.2
VTL Engine and Editor
Home Page: https://vpinna80.github.io/VTL/
License: European Union Public License 1.2
Dear repository owners, ๐
As your repository is related to SDMX (Statistical Data and Metadata Exchange), please consider adding the sdmx topic to it. This will help other developers discover and engage with your project more easily.
To associate your repository with the sdmx topic, visit your repo's landing page and select 'manage topics'. Let's make SDMX-related projects more visible and accessible! ๐
Thank you for contributing to the community! ๐
For detailed instructions on how to add topics to your repository, refer to the GitHub documentation.
Happy coding! ๐๐ฉโ๐ป๐จโ๐ป
Exception thrown when a numeric measure exists in the dataset.
ds_rep:= replace(ds1,"lorem","LOREM");
java.lang.ClassCastException: it.bancaditalia.oss.vtl.impl.types.data.DoubleValue cannot be cast to it.bancaditalia.oss.vtl.impl.types.data.StringValue
dsr_3:= ds1[ calc Text_3:= Text_1||Text_2]; /* Text_1 and Text_2 are string measures */
Error:
The two datasets must have the same measures.
e.g.
a:=" test ";
b:="check";
c:=a||b;
In: https://vpinna80.github.io/VTL/documentation.html#examples_toc_r-code
the variable should be named rates:
# retrieve gbp and usd rates from the ECB SDMX web service
rates <- getTimeSeriesTable('ECB', 'EXR.A.USD+GBP.EUR.SP00.A')
# set needed metadata for VTL engine (identifiers and measures)
attr(rates , 'measures') <- 'OBS_VALUE'
attr(rates , 'identifiers') <- c('TIME_PERIOD', 'CURRENCY')
In version 1.0.4 the package DT is used but not listed in the 'imports' section.
Back slashes cause an error to be thrown, even double ones
NA Values in datasets coming from the R Environment should be mapped to VTL NULL values, but they are not managed correctly. This also prevents some operators to work correctly (e.g. comparisons and null specific functions like nvl and isnull)
Error:
Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl, : java.lang.ClassCastException: it.bancaditalia.oss.vtl.impl.types.data.NullValue cannot be cast to it.bancaditalia.oss.vtl.model.data.NumberValue
In page https://vpinna80.github.io/VTL/RVTL/documentation.html#get-started
the dependencies=TRUE
parameter does not work.
The documentation should be changed asking to install all prereq packages by hand:
install.packages('rJava')
install.packages('RJSDMX')
install.packages('igraph')
install.packages('networkD3')
install.packages('shiny')
install.packages('shinyAce')
install.packages('jdx')
install.packages('xtable')
install.packages('dplyr')
Currently the CSV Environment only supports DATE types for the time family (e.g. MYDATE_ID$=date[YYYY-MM-DD]).
TIME_PERIOD type should be supported as well.
Symptom:
ERROR it.bancaditalia.oss.vtl.util.Paginator - A deadlock may have happened in the cache mechanism. Caching for dataset ds_other never completed.
... to make it possible to process a VTL program from a terminal.
The R package jdx has been discontinued. The R VTL code has to be updated to remove any reference to the package.
VTLStudio unable to render datasets
It would be useful for referencing codelists (as sets) and structures (e.g. for the csv and R environments)
Add usage and setup documentation for VTL Engine Jupyter kernel
Using multiple arithmentic operatorsin the same calc, e.g.
ds[x:=calc round..., y:=calc round..., z:=calc round...]
results in a considerable decay in performance.
If the same operation is done in multiple calcs, e.g.
ds[x:=calc round...][y:=calc round...][z:=calc round...]
this does not happen.
Describe the bug
It throws an error at building
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for VTL 1.0.4-SNAPSHOT:
[INFO]
[INFO] VTL ................................................ SUCCESS [ 1.322 s]
[INFO] vtl-api ............................................ SUCCESS [ 11.705 s]
[INFO] vtl-types .......................................... SUCCESS [ 6.988 s]
[INFO] vtl-domains ........................................ SUCCESS [ 3.779 s]
[INFO] vtl-parser ......................................... SUCCESS [ 14.746 s]
[INFO] vtl-transform ...................................... SUCCESS [ 5.178 s]
[INFO] vtl-envs ........................................... FAILURE [ 2.270 s]
[INFO] vtl-session ........................................ SKIPPED
[INFO] vtl-transform ...................................... SKIPPED
[INFO] vtl-launcher ....................................... SKIPPED
[INFO] vtl-editor ......................................... SKIPPED
[INFO] RVTL ............................................... SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 47.678 s
[INFO] Finished at: 2020-06-09T09:58:35-03:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project vtl-envs: Could not resolve dependencies for project it.bancaditalia.oss.vtl:vtl-envs:jar:1.0.4-SNAPSHOT: Could not find artifact it.bancaditalia.oss:sdmx:jar:1.0.3 in central (https://repo.maven.apache.org/maven2) -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn <args> -rf :vtl-envs
To Reproduce
mvn -P with-r -Dsdmx.version=1.0.3 clean package
Expected behavior
A package build
Java complete Stack Trace
Please complete the following information:
Additional context
The search mechnism has a bug. If I use a dataset that either does not exist or is in the R environment, the search is not completed because an error is caught in the CSVPath Env:
java.lang.StringIndexOutOfBoundsException: String index out of range: -3
at java.lang.String.substring(Unknown Source)
at it.bancaditalia.oss.vtl.impl.environment.CSVPathEnvironment.mapper(CSVPathEnvironment.java:86)
UPDATE: it seems that this happens only if the searched dataset name is 3 chrs long or less.
a:=att
results in:
INFO 23/04/2021 09:59:23 [vtl.impl.session.VTLSessionImpl/main] - Resolving value of att java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.substring(Unknown Source) at it.bancaditalia.oss.vtl.impl.environment.CSVPathEnvironment.mapper(CSVPathEnvironment.java:86) at it.bancaditalia.oss.vtl.impl.environment.CSVPathEnvironment.getValueMetadata(CSVPathEnvironment.java:97) at it.bancaditalia.oss.vtl.impl.session.VTLSessionImpl.lambda$acquireValue$10(VTLSessionImpl.java:226) at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source) at java.util.ArrayList$ArrayListSpliterator.tryAdvance(Unknown Source) at java.util.stream.ReferencePipeline.forEachWithCancel(Unknown Source) at java.util.stream.AbstractPipeline.copyIntoWithCancel(Unknown Source) at java.util.stream.AbstractPipeline.copyInto(Unknown Source) at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) at java.util.stream.FindOps$FindOp.evaluateSequential(Unknown Source) at java.util.stream.AbstractPipeline.evaluate(Unknown Source) at java.util.stream.ReferencePipeline.findAny(Unknown Source) at it.bancaditalia.oss.vtl.impl.session.VTLSessionImpl.acquireValue(VTLSessionImpl.java:229) at it.bancaditalia.oss.vtl.impl.session.VTLSessionImpl.lambda$getMetadata$6(VTLSessionImpl.java:162) at it.bancaditalia.oss.vtl.impl.session.VTLSessionImpl.cacheHelper(VTLSessionImpl.java:203) at it.bancaditalia.oss.vtl.impl.session.VTLSessionImpl.getMetadata(VTLSessionImpl.java:162) at it.bancaditalia.oss.vtl.impl.transform.VarIDOperand.getMetadata(VarIDOperand.java:53) at it.bancaditalia.oss.vtl.impl.engine.statement.AssignStatement.getMetadata(AssignStatement.java:87) at it.bancaditalia.oss.vtl.impl.session.VTLSessionImpl.lambda$compile$12(VTLSessionImpl.java:268) at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source) at java.util.stream.AbstractPipeline.copyInto(Unknown Source) at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source) at java.util.stream.AbstractPipeline.evaluate(Unknown Source) at java.util.stream.ReferencePipeline.collect(Unknown Source) at it.bancaditalia.oss.vtl.impl.session.VTLSessionImpl.compile(VTLSessionImpl.java:269) at sun.reflect.GeneratedMethodAccessor15.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at RJavaTools.invokeMethod(RJavaTools.java:386)
while
a:=atti
in
INFO 23/04/2021 10:00:50 [vtl.impl.session.VTLSessionImpl/main] - Resolving value of atti it.bancaditalia.oss.vtl.exceptions.VTLNestedException: Error evaluating statement 'b := atti'. Error: Alias 'atti' is not bound to this transformation scheme. at it.bancaditalia.oss.vtl.impl.engine.statement.AssignStatement.getMetadata(AssignStatement.java:91) at it.bancaditalia.oss.vtl.impl.session.VTLSessionImpl.lambda$compile$12(VTLSessionImpl.java:268) at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source) at java.util.stream.AbstractPipeline.copyInto(Unknown Source) at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source) at java.util.stream.AbstractPipeline.evaluate(Unknown Source) at java.util.stream.ReferencePipeline.collect(Unknown Source) at it.bancaditalia.oss.vtl.impl.session.VTLSessionImpl.compile(VTLSessionImpl.java:269) at sun.reflect.GeneratedMethodAccessor15.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at RJavaTools.invokeMethod(RJavaTools.java:386) Caused by: it.bancaditalia.oss.vtl.exceptions.VTLUnboundNameException: Alias 'atti' is not bound to this transformation scheme. at it.bancaditalia.oss.vtl.impl.session.VTLSessionImpl.lambda$null$5(VTLSessionImpl.java:163) at java.util.Optional.orElseThrow(Unknown Source) at it.bancaditalia.oss.vtl.impl.session.VTLSessionImpl.lambda$getMetadata$6(VTLSessionImpl.java:163) at it.bancaditalia.oss.vtl.impl.session.VTLSessionImpl.cacheHelper(VTLSessionImpl.java:203) at it.bancaditalia.oss.vtl.impl.session.VTLSessionImpl.getMetadata(VTLSessionImpl.java:162) at it.bancaditalia.oss.vtl.impl.transform.VarIDOperand.getMetadata(VarIDOperand.java:53) at it.bancaditalia.oss.vtl.impl.engine.statement.AssignStatement.getMetadata(AssignStatement.java:87) ... 13 more INFO 23/04/2021 10:00:50 [vtl.impl.engine.mapping.OpsFactory/main] - Using VTL configuration file: jar:file:/D:/Dati/Profili/e922480/Documents/R/R-4.0.2/library/RVTL/java/vtl-transform-1.0.8-SNAPSHOT.jar!/it/bancaditalia/oss/vtl/impl/engine/mapping/OpsFactory.xml DEBUG 23/04/2021 10:00:50 [vtl.impl.engine.mapping.OpsFactory/168/main] - Loading mappings DEBUG 23/04/2021 10:00:50 [vtl.impl.engine.mapping.OpsFactory/177/main] - Loading tokensets DEBUG 23/04/2021 10:00:50 [vtl.impl.engine.mapping.OpsFactory/184/main] - Loading recursive context DEBUG 23/04/2021 10:00:50 [vtl.impl.engine.mapping.OpsFactory/192/main] - Parsing new context VarIdExprContext containing 'atti'. INFO 23/04/2021 10:00:50 [vtl.impl.session.VTLSessionImpl/main] - Resolving value of atti it.bancaditalia.oss.vtl.exceptions.VTLNestedException: Error evaluating statement 'b := atti'. Error: Alias 'atti' is not bound to this transformation scheme. at it.bancaditalia.oss.vtl.impl.engine.statement.AssignStatement.getMetadata(AssignStatement.java:91) at it.bancaditalia.oss.vtl.impl.session.VTLSessionImpl.lambda$compile$12(VTLSessionImpl.java:268) at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source) at java.util.stream.AbstractPipeline.copyInto(Unknown Source) at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source) at java.util.stream.AbstractPipeline.evaluate(Unknown Source) at java.util.stream.ReferencePipeline.collect(Unknown Source) at it.bancaditalia.oss.vtl.impl.session.VTLSessionImpl.compile(VTLSessionImpl.java:269) at sun.reflect.GeneratedMethodAccessor15.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at RJavaTools.invokeMethod(RJavaTools.java:386) Caused by: it.bancaditalia.oss.vtl.exceptions.VTLUnboundNameException: Alias 'atti' is not bound to this transformation scheme. at it.bancaditalia.oss.vtl.impl.session.VTLSessionImpl.lambda$null$5(VTLSessionImpl.java:163) at java.util.Optional.orElseThrow(Unknown Source) at it.bancaditalia.oss.vtl.impl.session.VTLSessionImpl.lambda$getMetadata$6(VTLSessionImpl.java:163) at it.bancaditalia.oss.vtl.impl.session.VTLSessionImpl.cacheHelper(VTLSessionImpl.java:203) at it.bancaditalia.oss.vtl.impl.session.VTLSessionImpl.getMetadata(VTLSessionImpl.java:162) at it.bancaditalia.oss.vtl.impl.transform.VarIDOperand.getMetadata(VarIDOperand.java:53) at it.bancaditalia.oss.vtl.impl.engine.statement.AssignStatement.getMetadata(AssignStatement.java:87) ... 13 more
Missing VTL Engine documentation
Expected documentation missing at VTL Engine documentation
Seems to me like the documentation was pointing to local files, rather than files in the repo. I would also then expect the relevant files to be at "vtl/vtl-bundles/vtl-rest/target/generated-snippets/compile/request-parameters.adoc", although these file does not exist in the repo.
A new environment should be developed, pointing to a local directory containing csv files having the same format specifed for the CSV Environment.
The Engine will use the file name to match datasets (without .csv extension), so there will not be any need of quotes and tags in the VTL code
This environment will be particularly useful for testing purposes
Error:
ERROR 28/04/2021 10:56:22 [vtl.util.Paginator/Thread-128] - Component m1 not found in [$id1[string], number_var[number]] it.bancaditalia.oss.vtl.exceptions.VTLMissingComponentsException: Component m1 not found in [$id1[string], number_var[number]] at it.bancaditalia.oss.vtl.impl.transform.number.ArithmeticTransformation.lambda$null$7(ArithmeticTransformation.java:125) ~[vtl-transform-1.0.8-SNAPSHOT.jar:?] at java.util.Optional.orElseThrow(Unknown Source) ~[?:1.8.0_192] at it.bancaditalia.oss.vtl.impl.transform.number.ArithmeticTransformation.lambda$null$8(ArithmeticTransformation.java:125) ~[vtl-transform-1.0.8-SNAPSHOT.jar:?] at java.util.stream.Collectors.lambda$toConcurrentMap$59(Unknown Source) ~[?:1.8.0_192] at java.util.stream.ReferencePipeline.lambda$collect$1(Unknown Source) ~[?:1.8.0_192] at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source) ~[?:1.8.0_192] at java.util.HashMap$KeySpliterator.forEachRemaining(Unknown Source) ~[?:1.8.0_192] at java.util.stream.AbstractPipeline.copyInto(Unknown Source) ~[?:1.8.0_192] at java.util.stream.ForEachOps$ForEachTask.compute(Unknown Source) ~[?:1.8.0_192] at java.util.concurrent.CountedCompleter.exec(Unknown Source) ~[?:1.8.0_192] at java.util.concurrent.ForkJoinTask.doExec(Unknown Source) ~[?:1.8.0_192] at java.util.concurrent.ForkJoinTask.doInvoke(Unknown Source) ~[?:1.8.0_192] at java.util.concurrent.ForkJoinTask.invoke(Unknown Source) ~[?:1.8.0_192] at java.util.stream.ForEachOps$ForEachOp.evaluateParallel(Unknown Source) ~[?:1.8.0_192] at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(Unknown Source) ~[?:1.8.0_192] at java.util.stream.AbstractPipeline.evaluate(Unknown Source) ~[?:1.8.0_192] at java.util.stream.ReferencePipeline.forEach(Unknown Source) ~[?:1.8.0_192] at java.util.stream.ReferencePipeline$Head.forEach(Unknown Source) ~[?:1.8.0_192] at java.util.stream.ReferencePipeline.collect(Unknown Source) ~[?:1.8.0_192] at it.bancaditalia.oss.vtl.impl.transform.number.ArithmeticTransformation.lambda$evalDatasetWithScalar$10(ArithmeticTransformation.java:123) ~[vtl-transform-1.0.8-SNAPSHOT.jar:?] at it.bancaditalia.oss.vtl.impl.types.dataset.AbstractDataSet.lambda$mapKeepingKeys$8(AbstractDataSet.java:162) ~[vtl-types-1.0.8-SNAPSHOT.jar:?] at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source) ~[?:1.8.0_192] at java.util.concurrent.ConcurrentHashMap$KeySpliterator.forEachRemaining(Unknown Source) ~[?:1.8.0_192] at java.util.stream.AbstractPipeline.copyInto(Unknown Source) ~[?:1.8.0_192] at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) ~[?:1.8.0_192] at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source) ~[?:1.8.0_192] at java.util.stream.AbstractPipeline.evaluate(Unknown Source) ~[?:1.8.0_192] at java.util.stream.ReferencePipeline.reduce(Unknown Source) ~[?:1.8.0_192] at it.bancaditalia.oss.vtl.impl.types.dataset.AbstractDataSet.lambda$filteredMappedJoinWithIndex$7(AbstractDataSet.java:145) ~[vtl-types-1.0.8-SNAPSHOT.jar:?] at it.bancaditalia.oss.vtl.impl.types.dataset.LightFDataSet.streamDataPoints(LightFDataSet.java:44) ~[vtl-types-1.0.8-SNAPSHOT.jar:?] at it.bancaditalia.oss.vtl.impl.types.dataset.AbstractDataSet.stream(AbstractDataSet.java:240) ~[vtl-types-1.0.8-SNAPSHOT.jar:?] at it.bancaditalia.oss.vtl.impl.session.CachedDataSet.createUnindexedCache(CachedDataSet.java:281) ~[vtl-session-1.0.8-SNAPSHOT.jar:?] at it.bancaditalia.oss.vtl.impl.session.CachedDataSet.streamDataPoints(CachedDataSet.java:234) ~[vtl-session-1.0.8-SNAPSHOT.jar:?] at it.bancaditalia.oss.vtl.impl.types.dataset.AbstractDataSet.stream(AbstractDataSet.java:240) ~[vtl-types-1.0.8-SNAPSHOT.jar:?] at it.bancaditalia.oss.vtl.util.Paginator.lambda$new$1(Paginator.java:60) ~[vtl-java2r-1.0.8-SNAPSHOT.jar:?] at java.lang.Thread.run(Unknown Source) [?:1.8.0_192]
It returns zero in most cases, otherwise differently wrong results
This code:
b:= ", world!";
ds_r2:= ds1[ calc Text_3:= Text_1||b];
should not pass compilation, but it does and then it fails at runtime. This is a bug.
An example on how to use the engine from within an R program or interactive session is missing in the docs
With daily data the fill_time_series shows some incorrect behaviours:
this applies to both single and all options
In a comparisn (e.g. a > b) NULL values in any operand should lead to a NULL result (at row level). The current implementation returns false and it is an error.
Null values in VTL boolean components are set as false in R. This is due to the jdx package:
Logical NA cannot be represented in primitive Java boolean types. Logical NA
will be coerced to FALSE to align with rJava. When logical NAs are coerced, a
warning is thrown. Java null values in java.lang.Boolean boxed types are also
coerced with a warning.
NA_ASSUMPTION_LOGICAL <- FALSE
https://github.com/floidgilbert/jdx/blob/master/R/jdx/R/Private.R
To be investigated:
This is very similar to #23
Today metadata repositories can be added from SDMX registries or local files, but local files cannot be used with the VTL Studio in shinyapps.
as for #23 it would be useful to add a fileInput button to let the user upload the csv metadata file explicitly from the configuration panel of vtl studio.
Users cannot load datasets outside of VTL code today. This creates some limitations with the VTL Studio in shinyapps because neither local csv files nor the R environment can be used in that situation (so, only SDMX datasets can be used).
To overcome this limitation, an explicit shiny control could be added to vtl studio, that allows users to upload a dataset in the csv environment. This could be a fileInput button that selects the file, and calls a java API that streams the files and puts it in the csv environment, ready to be used in vtl scripts.
Somethimes in VTLStudio the session switch will not refresh the vtl code, overriding the new session contents with the previous ones. It could be a race condition in the shiny reactive observers.
Currently date and time_period objects are not managed by the R environment. We should consider adding support for dates at least for dates:
from R to VTL: date classes in datatset components shoud be marshalled into VTL dates (YYYY-MM-DD) (this could be a bit tricky as JRI seems not to support dates natively, but it should be feasible anyway). Only date classes will be supported, so it will be up to the user to perform conversins before entering VTL.
from VTL to R: currently dates and time_period is cast to string because even jdx does not support dates. It should be possible to format everything to a standard R date format (YYYY-MM-DD) and set a flag somewhere that implies recasting once in R (as.Date should be sufficient). An example of flag could be an attribute (e.g. date_columns) that lists all the date components
Test Case:
Error:
[1] "Compilation error: it.bancaditalia.oss.vtl.model.data.UnknownValueMetadata$1 cannot be cast to it.bancaditalia.oss.vtl.model.data.ScalarValueMetadata"
It should be NULL
The same happens if the string 'NULL' is present
This gets a NullPointerException
d:= substr(a,10);
Add the possibility to quote strings in the source CSV file, according to excel conventions.
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.